qiskit 1.4.1__cp39-abi3-macosx_11_0_arm64.whl → 2.0.0__cp39-abi3-macosx_11_0_arm64.whl
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- qiskit/VERSION.txt +1 -1
- qiskit/__init__.py +3 -9
- qiskit/_accelerate.abi3.so +0 -0
- qiskit/circuit/__init__.py +35 -10
- qiskit/circuit/{add_control.py → _add_control.py} +32 -12
- qiskit/circuit/_classical_resource_map.py +5 -3
- qiskit/circuit/barrier.py +3 -7
- qiskit/circuit/classical/expr/__init__.py +31 -3
- qiskit/circuit/classical/expr/constructors.py +236 -28
- qiskit/circuit/classical/expr/expr.py +104 -3
- qiskit/circuit/classical/expr/visitors.py +75 -0
- qiskit/circuit/classical/types/__init__.py +12 -8
- qiskit/circuit/classical/types/ordering.py +14 -7
- qiskit/circuit/classical/types/types.py +36 -0
- qiskit/circuit/commutation_checker.py +34 -7
- qiskit/circuit/controlflow/__init__.py +32 -1
- qiskit/circuit/controlflow/_builder_utils.py +9 -5
- qiskit/circuit/controlflow/box.py +163 -0
- qiskit/circuit/controlflow/break_loop.py +1 -1
- qiskit/circuit/controlflow/builder.py +139 -39
- qiskit/circuit/controlflow/continue_loop.py +1 -3
- qiskit/circuit/controlflow/control_flow.py +10 -0
- qiskit/circuit/controlflow/for_loop.py +2 -1
- qiskit/circuit/controlflow/if_else.py +3 -16
- qiskit/circuit/controlflow/switch_case.py +2 -8
- qiskit/circuit/controlflow/while_loop.py +2 -7
- qiskit/circuit/controlledgate.py +2 -4
- qiskit/circuit/delay.py +40 -11
- qiskit/circuit/duration.py +0 -15
- qiskit/circuit/gate.py +2 -4
- qiskit/circuit/instruction.py +2 -141
- qiskit/circuit/instructionset.py +7 -54
- qiskit/circuit/library/__init__.py +469 -154
- qiskit/circuit/library/arithmetic/__init__.py +16 -10
- qiskit/circuit/library/arithmetic/adders/cdkm_ripple_carry_adder.py +1 -1
- qiskit/circuit/library/arithmetic/adders/draper_qft_adder.py +2 -2
- qiskit/circuit/library/arithmetic/adders/vbe_ripple_carry_adder.py +1 -1
- qiskit/circuit/library/arithmetic/exact_reciprocal.py +64 -21
- qiskit/circuit/library/arithmetic/integer_comparator.py +37 -80
- qiskit/circuit/library/arithmetic/linear_amplitude_function.py +169 -2
- qiskit/circuit/library/arithmetic/linear_pauli_rotations.py +59 -5
- qiskit/circuit/library/arithmetic/piecewise_chebyshev.py +154 -6
- qiskit/circuit/library/arithmetic/piecewise_linear_pauli_rotations.py +114 -4
- qiskit/circuit/library/arithmetic/piecewise_polynomial_pauli_rotations.py +191 -15
- qiskit/circuit/library/arithmetic/polynomial_pauli_rotations.py +93 -39
- qiskit/circuit/library/arithmetic/quadratic_form.py +168 -2
- qiskit/circuit/library/arithmetic/weighted_adder.py +73 -1
- qiskit/circuit/library/bit_flip_oracle.py +130 -0
- qiskit/circuit/library/blueprintcircuit.py +52 -16
- qiskit/circuit/library/data_preparation/initializer.py +1 -1
- qiskit/circuit/library/data_preparation/pauli_feature_map.py +4 -4
- qiskit/circuit/library/data_preparation/state_preparation.py +1 -1
- qiskit/circuit/library/generalized_gates/gms.py +1 -1
- qiskit/circuit/library/generalized_gates/isometry.py +1 -1
- qiskit/circuit/library/generalized_gates/pauli.py +1 -2
- qiskit/circuit/library/generalized_gates/uc.py +97 -7
- qiskit/circuit/library/generalized_gates/uc_pauli_rot.py +1 -1
- qiskit/circuit/library/generalized_gates/unitary.py +4 -2
- qiskit/circuit/library/graph_state.py +1 -0
- qiskit/circuit/library/hamiltonian_gate.py +1 -1
- qiskit/circuit/library/n_local/evolved_operator_ansatz.py +1 -1
- qiskit/circuit/library/n_local/n_local.py +1 -1
- qiskit/circuit/library/n_local/qaoa_ansatz.py +1 -1
- qiskit/circuit/library/overlap.py +2 -2
- qiskit/circuit/library/pauli_evolution.py +39 -24
- qiskit/circuit/library/phase_oracle.py +130 -51
- qiskit/circuit/library/standard_gates/__init__.py +0 -1
- qiskit/circuit/library/standard_gates/dcx.py +3 -4
- qiskit/circuit/library/standard_gates/ecr.py +3 -4
- qiskit/circuit/library/standard_gates/global_phase.py +5 -6
- qiskit/circuit/library/standard_gates/h.py +4 -9
- qiskit/circuit/library/standard_gates/i.py +2 -2
- qiskit/circuit/library/standard_gates/iswap.py +3 -4
- qiskit/circuit/library/standard_gates/p.py +15 -34
- qiskit/circuit/library/standard_gates/r.py +7 -10
- qiskit/circuit/library/standard_gates/rx.py +5 -15
- qiskit/circuit/library/standard_gates/rxx.py +3 -6
- qiskit/circuit/library/standard_gates/ry.py +5 -17
- qiskit/circuit/library/standard_gates/ryy.py +3 -6
- qiskit/circuit/library/standard_gates/rz.py +5 -17
- qiskit/circuit/library/standard_gates/rzx.py +3 -6
- qiskit/circuit/library/standard_gates/rzz.py +3 -6
- qiskit/circuit/library/standard_gates/s.py +6 -15
- qiskit/circuit/library/standard_gates/swap.py +4 -11
- qiskit/circuit/library/standard_gates/sx.py +7 -12
- qiskit/circuit/library/standard_gates/t.py +6 -7
- qiskit/circuit/library/standard_gates/u.py +2 -10
- qiskit/circuit/library/standard_gates/u1.py +5 -16
- qiskit/circuit/library/standard_gates/u2.py +2 -6
- qiskit/circuit/library/standard_gates/u3.py +3 -11
- qiskit/circuit/library/standard_gates/x.py +14 -62
- qiskit/circuit/library/standard_gates/xx_minus_yy.py +2 -5
- qiskit/circuit/library/standard_gates/xx_plus_yy.py +2 -5
- qiskit/circuit/library/standard_gates/y.py +4 -9
- qiskit/circuit/library/standard_gates/z.py +5 -15
- qiskit/circuit/measure.py +11 -2
- qiskit/circuit/parameterexpression.py +11 -0
- qiskit/circuit/quantumcircuit.py +890 -564
- qiskit/circuit/random/utils.py +12 -6
- qiskit/circuit/reset.py +5 -2
- qiskit/circuit/singleton.py +5 -11
- qiskit/circuit/store.py +0 -8
- qiskit/circuit/tools/pi_check.py +3 -0
- qiskit/compiler/__init__.py +1 -7
- qiskit/compiler/transpiler.py +38 -196
- qiskit/converters/circuit_to_dag.py +6 -4
- qiskit/converters/circuit_to_dagdependency.py +0 -2
- qiskit/converters/circuit_to_dagdependency_v2.py +0 -1
- qiskit/converters/circuit_to_gate.py +1 -1
- qiskit/converters/circuit_to_instruction.py +16 -29
- qiskit/converters/dag_to_circuit.py +7 -8
- qiskit/converters/dag_to_dagdependency.py +0 -1
- qiskit/converters/dag_to_dagdependency_v2.py +0 -1
- qiskit/converters/dagdependency_to_circuit.py +0 -6
- qiskit/converters/dagdependency_to_dag.py +0 -6
- qiskit/dagcircuit/collect_blocks.py +32 -20
- qiskit/dagcircuit/dagdependency.py +3 -37
- qiskit/dagcircuit/dagdependency_v2.py +5 -82
- qiskit/dagcircuit/dagnode.py +14 -2
- qiskit/passmanager/__init__.py +24 -6
- qiskit/passmanager/passmanager.py +26 -24
- qiskit/primitives/__init__.py +44 -35
- qiskit/primitives/backend_estimator_v2.py +102 -23
- qiskit/primitives/backend_sampler_v2.py +5 -20
- qiskit/primitives/base/__init__.py +4 -4
- qiskit/primitives/base/base_estimator.py +77 -82
- qiskit/primitives/base/base_primitive_job.py +2 -2
- qiskit/primitives/base/{base_primitive.py → base_primitive_v1.py} +1 -1
- qiskit/primitives/base/{base_result.py → base_result_v1.py} +1 -1
- qiskit/primitives/base/base_sampler.py +52 -60
- qiskit/primitives/base/{estimator_result.py → estimator_result_v1.py} +2 -2
- qiskit/primitives/base/{sampler_result.py → sampler_result_v1.py} +2 -2
- qiskit/primitives/base/{validation.py → validation_v1.py} +34 -15
- qiskit/primitives/containers/bindings_array.py +3 -1
- qiskit/primitives/containers/bit_array.py +23 -0
- qiskit/primitives/containers/data_bin.py +3 -1
- qiskit/primitives/containers/observables_array.py +19 -2
- qiskit/primitives/statevector_sampler.py +6 -8
- qiskit/primitives/utils.py +14 -189
- qiskit/providers/__init__.py +4 -130
- qiskit/providers/backend.py +11 -314
- qiskit/providers/basic_provider/__init__.py +3 -1
- qiskit/providers/basic_provider/basic_provider.py +29 -9
- qiskit/providers/basic_provider/basic_simulator.py +158 -298
- qiskit/providers/exceptions.py +0 -33
- qiskit/providers/fake_provider/__init__.py +0 -37
- qiskit/providers/fake_provider/generic_backend_v2.py +32 -693
- qiskit/qasm2/__init__.py +21 -6
- qiskit/qasm2/export.py +2 -10
- qiskit/qasm2/parse.py +11 -25
- qiskit/qasm3/__init__.py +5 -1
- qiskit/qasm3/ast.py +44 -0
- qiskit/qasm3/exporter.py +65 -27
- qiskit/qasm3/printer.py +35 -4
- qiskit/qpy/__init__.py +162 -19
- qiskit/qpy/binary_io/__init__.py +0 -1
- qiskit/qpy/binary_io/circuits.py +96 -116
- qiskit/qpy/binary_io/parse_sympy_repr.py +121 -0
- qiskit/qpy/binary_io/schedules.py +61 -388
- qiskit/qpy/binary_io/value.py +159 -33
- qiskit/qpy/common.py +10 -7
- qiskit/qpy/formats.py +41 -0
- qiskit/qpy/interface.py +29 -62
- qiskit/qpy/type_keys.py +58 -221
- qiskit/quantum_info/analysis/distance.py +3 -1
- qiskit/quantum_info/operators/dihedral/dihedral.py +3 -1
- qiskit/quantum_info/operators/operator.py +6 -2
- qiskit/quantum_info/operators/symplectic/clifford.py +3 -1
- qiskit/quantum_info/operators/symplectic/pauli.py +4 -2
- qiskit/quantum_info/operators/symplectic/pauli_list.py +17 -5
- qiskit/quantum_info/operators/symplectic/sparse_pauli_op.py +40 -6
- qiskit/quantum_info/states/densitymatrix.py +16 -6
- qiskit/quantum_info/states/stabilizerstate.py +35 -4
- qiskit/quantum_info/states/statevector.py +16 -6
- qiskit/result/__init__.py +5 -17
- qiskit/result/models.py +18 -11
- qiskit/result/result.py +38 -134
- qiskit/result/sampled_expval.py +1 -2
- qiskit/result/utils.py +3 -4
- qiskit/synthesis/__init__.py +21 -1
- qiskit/synthesis/arithmetic/__init__.py +3 -1
- qiskit/synthesis/arithmetic/adders/cdkm_ripple_carry_adder.py +1 -1
- qiskit/synthesis/arithmetic/adders/draper_qft_adder.py +1 -1
- qiskit/synthesis/arithmetic/adders/vbe_ripple_carry_adder.py +2 -2
- qiskit/{providers/fake_provider/backends_v1/fake_20q → synthesis/arithmetic/comparators}/__init__.py +4 -6
- qiskit/synthesis/arithmetic/comparators/compare_2s.py +112 -0
- qiskit/synthesis/arithmetic/comparators/compare_greedy.py +66 -0
- qiskit/synthesis/arithmetic/multipliers/hrs_cumulative_multiplier.py +1 -1
- qiskit/synthesis/arithmetic/multipliers/rg_qft_multiplier.py +1 -1
- qiskit/synthesis/arithmetic/weighted_sum.py +155 -0
- qiskit/{result/mitigation → synthesis/boolean}/__init__.py +2 -2
- qiskit/synthesis/boolean/boolean_expression.py +231 -0
- qiskit/synthesis/boolean/boolean_expression_synth.py +124 -0
- qiskit/synthesis/boolean/boolean_expression_visitor.py +96 -0
- qiskit/synthesis/discrete_basis/generate_basis_approximations.py +2 -0
- qiskit/synthesis/evolution/lie_trotter.py +10 -7
- qiskit/synthesis/evolution/product_formula.py +44 -35
- qiskit/synthesis/evolution/qdrift.py +17 -24
- qiskit/synthesis/evolution/suzuki_trotter.py +20 -27
- qiskit/synthesis/linear/linear_depth_lnn.py +6 -221
- qiskit/synthesis/linear_phase/cx_cz_depth_lnn.py +4 -205
- qiskit/synthesis/multi_controlled/__init__.py +1 -0
- qiskit/synthesis/multi_controlled/mcx_synthesis.py +5 -2
- qiskit/synthesis/multi_controlled/multi_control_rotation_gates.py +206 -0
- qiskit/synthesis/one_qubit/one_qubit_decompose.py +1 -1
- qiskit/synthesis/two_qubit/__init__.py +1 -0
- qiskit/synthesis/two_qubit/two_qubit_decompose.py +28 -145
- qiskit/transpiler/__init__.py +32 -232
- qiskit/transpiler/basepasses.py +20 -51
- qiskit/transpiler/layout.py +1 -1
- qiskit/transpiler/passes/__init__.py +4 -40
- qiskit/transpiler/passes/basis/basis_translator.py +5 -4
- qiskit/transpiler/passes/basis/decompose.py +1 -15
- qiskit/transpiler/passes/basis/unroll_3q_or_more.py +1 -5
- qiskit/transpiler/passes/basis/unroll_custom_definitions.py +3 -2
- qiskit/transpiler/passes/layout/apply_layout.py +4 -0
- qiskit/transpiler/passes/layout/dense_layout.py +2 -39
- qiskit/transpiler/passes/layout/full_ancilla_allocation.py +3 -4
- qiskit/transpiler/passes/layout/sabre_layout.py +7 -3
- qiskit/transpiler/passes/layout/vf2_layout.py +2 -20
- qiskit/transpiler/passes/layout/vf2_post_layout.py +60 -125
- qiskit/transpiler/passes/layout/vf2_utils.py +2 -26
- qiskit/transpiler/passes/optimization/__init__.py +2 -3
- qiskit/transpiler/passes/optimization/collect_and_collapse.py +2 -0
- qiskit/transpiler/passes/optimization/collect_cliffords.py +5 -0
- qiskit/transpiler/passes/optimization/collect_linear_functions.py +5 -0
- qiskit/transpiler/passes/optimization/collect_multiqubit_blocks.py +16 -1
- qiskit/transpiler/passes/optimization/commutation_analysis.py +3 -3
- qiskit/transpiler/passes/optimization/consolidate_blocks.py +41 -19
- qiskit/transpiler/passes/optimization/contract_idle_wires_in_control_flow.py +104 -0
- qiskit/transpiler/passes/optimization/light_cone.py +135 -0
- qiskit/transpiler/passes/optimization/optimize_1q_commutation.py +0 -1
- qiskit/transpiler/passes/optimization/optimize_1q_decomposition.py +18 -22
- qiskit/transpiler/passes/optimization/optimize_annotated.py +3 -2
- qiskit/transpiler/passes/optimization/remove_identity_equiv.py +6 -4
- qiskit/transpiler/passes/optimization/reset_after_measure_simplification.py +5 -2
- qiskit/transpiler/passes/optimization/split_2q_unitaries.py +26 -3
- qiskit/transpiler/passes/optimization/template_matching/template_substitution.py +3 -2
- qiskit/transpiler/passes/routing/__init__.py +0 -1
- qiskit/transpiler/passes/routing/commuting_2q_gate_routing/commuting_2q_gate_router.py +3 -1
- qiskit/transpiler/passes/routing/sabre_swap.py +14 -6
- qiskit/transpiler/passes/routing/star_prerouting.py +1 -1
- qiskit/transpiler/passes/scheduling/__init__.py +1 -7
- qiskit/transpiler/passes/scheduling/alignments/__init__.py +2 -4
- qiskit/transpiler/passes/scheduling/alignments/check_durations.py +1 -9
- qiskit/transpiler/passes/scheduling/alignments/reschedule.py +17 -16
- qiskit/transpiler/passes/scheduling/padding/base_padding.py +32 -4
- qiskit/transpiler/passes/scheduling/padding/dynamical_decoupling.py +25 -63
- qiskit/transpiler/passes/scheduling/padding/pad_delay.py +12 -4
- qiskit/transpiler/passes/scheduling/scheduling/alap.py +5 -39
- qiskit/transpiler/passes/scheduling/scheduling/asap.py +4 -35
- qiskit/transpiler/passes/scheduling/scheduling/base_scheduler.py +10 -16
- qiskit/transpiler/passes/scheduling/time_unit_conversion.py +134 -62
- qiskit/transpiler/passes/synthesis/default_unitary_synth_plugin.py +653 -0
- qiskit/transpiler/passes/synthesis/high_level_synthesis.py +176 -601
- qiskit/transpiler/passes/synthesis/hls_plugins.py +294 -1
- qiskit/transpiler/passes/synthesis/plugin.py +4 -0
- qiskit/transpiler/passes/synthesis/solovay_kitaev_synthesis.py +16 -10
- qiskit/transpiler/passes/synthesis/unitary_synthesis.py +34 -697
- qiskit/transpiler/passes/utils/__init__.py +0 -1
- qiskit/transpiler/passes/utils/check_gate_direction.py +13 -5
- qiskit/transpiler/passes/utils/control_flow.py +2 -6
- qiskit/transpiler/passes/utils/gate_direction.py +7 -0
- qiskit/transpiler/passes/utils/remove_final_measurements.py +40 -33
- qiskit/transpiler/passmanager.py +13 -0
- qiskit/transpiler/passmanager_config.py +5 -81
- qiskit/transpiler/preset_passmanagers/builtin_plugins.py +225 -344
- qiskit/transpiler/preset_passmanagers/common.py +140 -167
- qiskit/transpiler/preset_passmanagers/generate_preset_pass_manager.py +107 -322
- qiskit/transpiler/preset_passmanagers/level0.py +2 -11
- qiskit/transpiler/preset_passmanagers/level1.py +2 -14
- qiskit/transpiler/preset_passmanagers/level2.py +2 -12
- qiskit/transpiler/preset_passmanagers/level3.py +2 -11
- qiskit/transpiler/preset_passmanagers/plugin.py +5 -3
- qiskit/transpiler/target.py +78 -524
- qiskit/user_config.py +8 -4
- qiskit/utils/__init__.py +13 -12
- qiskit/utils/deprecation.py +4 -112
- qiskit/utils/optionals.py +11 -4
- qiskit/utils/parallel.py +214 -87
- qiskit/utils/units.py +4 -1
- qiskit/visualization/__init__.py +3 -7
- qiskit/visualization/array.py +4 -1
- qiskit/visualization/bloch.py +1 -1
- qiskit/visualization/circuit/_utils.py +19 -19
- qiskit/visualization/circuit/circuit_visualization.py +11 -4
- qiskit/visualization/circuit/matplotlib.py +13 -23
- qiskit/visualization/circuit/text.py +7 -3
- qiskit/visualization/counts_visualization.py +4 -0
- qiskit/visualization/dag_visualization.py +2 -1
- qiskit/visualization/gate_map.py +39 -154
- qiskit/visualization/library.py +4 -1
- qiskit/visualization/pass_manager_visualization.py +6 -2
- qiskit/visualization/state_visualization.py +19 -2
- qiskit/visualization/timeline/core.py +19 -13
- qiskit/visualization/timeline/interface.py +19 -18
- qiskit/visualization/timeline/plotters/matplotlib.py +4 -1
- {qiskit-1.4.1.dist-info → qiskit-2.0.0.dist-info}/METADATA +4 -3
- {qiskit-1.4.1.dist-info → qiskit-2.0.0.dist-info}/RECORD +303 -449
- {qiskit-1.4.1.dist-info → qiskit-2.0.0.dist-info}/WHEEL +2 -1
- {qiskit-1.4.1.dist-info → qiskit-2.0.0.dist-info}/entry_points.txt +8 -2
- qiskit/assembler/__init__.py +0 -42
- qiskit/assembler/assemble_circuits.py +0 -451
- qiskit/assembler/assemble_schedules.py +0 -367
- qiskit/assembler/disassemble.py +0 -310
- qiskit/assembler/run_config.py +0 -77
- qiskit/circuit/bit.py +0 -106
- qiskit/circuit/classicalfunction/__init__.py +0 -152
- qiskit/circuit/classicalfunction/boolean_expression.py +0 -138
- qiskit/circuit/classicalfunction/classical_element.py +0 -54
- qiskit/circuit/classicalfunction/classical_function_visitor.py +0 -155
- qiskit/circuit/classicalfunction/classicalfunction.py +0 -182
- qiskit/circuit/classicalfunction/exceptions.py +0 -41
- qiskit/circuit/classicalfunction/types.py +0 -18
- qiskit/circuit/classicalfunction/utils.py +0 -91
- qiskit/circuit/classicalregister.py +0 -57
- qiskit/circuit/library/standard_gates/multi_control_rotation_gates.py +0 -405
- qiskit/circuit/quantumregister.py +0 -75
- qiskit/circuit/register.py +0 -246
- qiskit/compiler/assembler.py +0 -689
- qiskit/compiler/scheduler.py +0 -109
- qiskit/compiler/sequencer.py +0 -71
- qiskit/primitives/backend_estimator.py +0 -486
- qiskit/primitives/backend_sampler.py +0 -222
- qiskit/primitives/estimator.py +0 -172
- qiskit/primitives/sampler.py +0 -162
- qiskit/providers/backend_compat.py +0 -507
- qiskit/providers/fake_provider/backends_v1/__init__.py +0 -22
- qiskit/providers/fake_provider/backends_v1/fake_127q_pulse/__init__.py +0 -18
- qiskit/providers/fake_provider/backends_v1/fake_127q_pulse/conf_washington.json +0 -1
- qiskit/providers/fake_provider/backends_v1/fake_127q_pulse/defs_washington.json +0 -1
- qiskit/providers/fake_provider/backends_v1/fake_127q_pulse/fake_127q_pulse_v1.py +0 -37
- qiskit/providers/fake_provider/backends_v1/fake_127q_pulse/props_washington.json +0 -1
- qiskit/providers/fake_provider/backends_v1/fake_20q/conf_singapore.json +0 -1
- qiskit/providers/fake_provider/backends_v1/fake_20q/fake_20q.py +0 -43
- qiskit/providers/fake_provider/backends_v1/fake_20q/props_singapore.json +0 -1
- qiskit/providers/fake_provider/backends_v1/fake_27q_pulse/__init__.py +0 -18
- qiskit/providers/fake_provider/backends_v1/fake_27q_pulse/conf_hanoi.json +0 -1
- qiskit/providers/fake_provider/backends_v1/fake_27q_pulse/defs_hanoi.json +0 -1
- qiskit/providers/fake_provider/backends_v1/fake_27q_pulse/fake_27q_pulse_v1.py +0 -50
- qiskit/providers/fake_provider/backends_v1/fake_27q_pulse/props_hanoi.json +0 -1
- qiskit/providers/fake_provider/backends_v1/fake_5q/__init__.py +0 -18
- qiskit/providers/fake_provider/backends_v1/fake_5q/conf_yorktown.json +0 -1
- qiskit/providers/fake_provider/backends_v1/fake_5q/fake_5q_v1.py +0 -41
- qiskit/providers/fake_provider/backends_v1/fake_5q/props_yorktown.json +0 -1
- qiskit/providers/fake_provider/backends_v1/fake_7q_pulse/__init__.py +0 -18
- qiskit/providers/fake_provider/backends_v1/fake_7q_pulse/conf_nairobi.json +0 -1
- qiskit/providers/fake_provider/backends_v1/fake_7q_pulse/defs_nairobi.json +0 -1
- qiskit/providers/fake_provider/backends_v1/fake_7q_pulse/fake_7q_pulse_v1.py +0 -44
- qiskit/providers/fake_provider/backends_v1/fake_7q_pulse/props_nairobi.json +0 -1
- qiskit/providers/fake_provider/fake_1q.py +0 -91
- qiskit/providers/fake_provider/fake_backend.py +0 -165
- qiskit/providers/fake_provider/fake_openpulse_2q.py +0 -391
- qiskit/providers/fake_provider/fake_openpulse_3q.py +0 -340
- qiskit/providers/fake_provider/fake_pulse_backend.py +0 -49
- qiskit/providers/fake_provider/fake_qasm_backend.py +0 -77
- qiskit/providers/fake_provider/utils/backend_converter.py +0 -150
- qiskit/providers/fake_provider/utils/json_decoder.py +0 -109
- qiskit/providers/models/__init__.py +0 -89
- qiskit/providers/models/backendconfiguration.py +0 -1040
- qiskit/providers/models/backendproperties.py +0 -535
- qiskit/providers/models/backendstatus.py +0 -104
- qiskit/providers/models/jobstatus.py +0 -77
- qiskit/providers/models/pulsedefaults.py +0 -305
- qiskit/providers/provider.py +0 -95
- qiskit/pulse/__init__.py +0 -158
- qiskit/pulse/builder.py +0 -2262
- qiskit/pulse/calibration_entries.py +0 -381
- qiskit/pulse/channels.py +0 -227
- qiskit/pulse/configuration.py +0 -245
- qiskit/pulse/exceptions.py +0 -45
- qiskit/pulse/filters.py +0 -309
- qiskit/pulse/instruction_schedule_map.py +0 -424
- qiskit/pulse/instructions/__init__.py +0 -67
- qiskit/pulse/instructions/acquire.py +0 -150
- qiskit/pulse/instructions/delay.py +0 -71
- qiskit/pulse/instructions/directives.py +0 -154
- qiskit/pulse/instructions/frequency.py +0 -135
- qiskit/pulse/instructions/instruction.py +0 -270
- qiskit/pulse/instructions/phase.py +0 -152
- qiskit/pulse/instructions/play.py +0 -99
- qiskit/pulse/instructions/reference.py +0 -100
- qiskit/pulse/instructions/snapshot.py +0 -82
- qiskit/pulse/library/__init__.py +0 -97
- qiskit/pulse/library/continuous.py +0 -430
- qiskit/pulse/library/pulse.py +0 -148
- qiskit/pulse/library/samplers/__init__.py +0 -15
- qiskit/pulse/library/samplers/decorators.py +0 -295
- qiskit/pulse/library/samplers/strategies.py +0 -71
- qiskit/pulse/library/symbolic_pulses.py +0 -1989
- qiskit/pulse/library/waveform.py +0 -136
- qiskit/pulse/macros.py +0 -262
- qiskit/pulse/parameter_manager.py +0 -445
- qiskit/pulse/parser.py +0 -314
- qiskit/pulse/reference_manager.py +0 -58
- qiskit/pulse/schedule.py +0 -1854
- qiskit/pulse/transforms/__init__.py +0 -106
- qiskit/pulse/transforms/alignments.py +0 -406
- qiskit/pulse/transforms/base_transforms.py +0 -71
- qiskit/pulse/transforms/canonicalization.py +0 -498
- qiskit/pulse/transforms/dag.py +0 -122
- qiskit/pulse/utils.py +0 -149
- qiskit/qobj/__init__.py +0 -75
- qiskit/qobj/common.py +0 -81
- qiskit/qobj/converters/__init__.py +0 -18
- qiskit/qobj/converters/lo_config.py +0 -177
- qiskit/qobj/converters/pulse_instruction.py +0 -897
- qiskit/qobj/pulse_qobj.py +0 -709
- qiskit/qobj/qasm_qobj.py +0 -708
- qiskit/qobj/utils.py +0 -46
- qiskit/result/mitigation/base_readout_mitigator.py +0 -79
- qiskit/result/mitigation/correlated_readout_mitigator.py +0 -277
- qiskit/result/mitigation/local_readout_mitigator.py +0 -328
- qiskit/result/mitigation/utils.py +0 -217
- qiskit/scheduler/__init__.py +0 -40
- qiskit/scheduler/config.py +0 -37
- qiskit/scheduler/lowering.py +0 -187
- qiskit/scheduler/methods/__init__.py +0 -15
- qiskit/scheduler/methods/basic.py +0 -140
- qiskit/scheduler/schedule_circuit.py +0 -69
- qiskit/scheduler/sequence.py +0 -104
- qiskit/transpiler/passes/calibration/__init__.py +0 -17
- qiskit/transpiler/passes/calibration/base_builder.py +0 -79
- qiskit/transpiler/passes/calibration/builders.py +0 -20
- qiskit/transpiler/passes/calibration/exceptions.py +0 -22
- qiskit/transpiler/passes/calibration/pulse_gate.py +0 -100
- qiskit/transpiler/passes/calibration/rx_builder.py +0 -164
- qiskit/transpiler/passes/calibration/rzx_builder.py +0 -411
- qiskit/transpiler/passes/calibration/rzx_templates.py +0 -58
- qiskit/transpiler/passes/optimization/cx_cancellation.py +0 -65
- qiskit/transpiler/passes/optimization/echo_rzx_weyl_decomposition.py +0 -162
- qiskit/transpiler/passes/optimization/normalize_rx_angle.py +0 -157
- qiskit/transpiler/passes/routing/stochastic_swap.py +0 -532
- qiskit/transpiler/passes/scheduling/alap.py +0 -153
- qiskit/transpiler/passes/scheduling/alignments/align_measures.py +0 -255
- qiskit/transpiler/passes/scheduling/alignments/pulse_gate_validation.py +0 -107
- qiskit/transpiler/passes/scheduling/asap.py +0 -175
- qiskit/transpiler/passes/scheduling/base_scheduler.py +0 -310
- qiskit/transpiler/passes/scheduling/dynamical_decoupling.py +0 -313
- qiskit/transpiler/passes/utils/convert_conditions_to_if_ops.py +0 -93
- qiskit/utils/deprecate_pulse.py +0 -119
- qiskit/utils/multiprocessing.py +0 -56
- qiskit/visualization/pulse_v2/__init__.py +0 -21
- qiskit/visualization/pulse_v2/core.py +0 -901
- qiskit/visualization/pulse_v2/device_info.py +0 -173
- qiskit/visualization/pulse_v2/drawings.py +0 -253
- qiskit/visualization/pulse_v2/events.py +0 -254
- qiskit/visualization/pulse_v2/generators/__init__.py +0 -40
- qiskit/visualization/pulse_v2/generators/barrier.py +0 -76
- qiskit/visualization/pulse_v2/generators/chart.py +0 -208
- qiskit/visualization/pulse_v2/generators/frame.py +0 -436
- qiskit/visualization/pulse_v2/generators/snapshot.py +0 -133
- qiskit/visualization/pulse_v2/generators/waveform.py +0 -645
- qiskit/visualization/pulse_v2/interface.py +0 -459
- qiskit/visualization/pulse_v2/layouts.py +0 -387
- qiskit/visualization/pulse_v2/plotters/__init__.py +0 -17
- qiskit/visualization/pulse_v2/plotters/base_plotter.py +0 -53
- qiskit/visualization/pulse_v2/plotters/matplotlib.py +0 -201
- qiskit/visualization/pulse_v2/stylesheet.py +0 -312
- qiskit/visualization/pulse_v2/types.py +0 -242
- {qiskit-1.4.1.dist-info → qiskit-2.0.0.dist-info/licenses}/LICENSE.txt +0 -0
- {qiskit-1.4.1.dist-info → qiskit-2.0.0.dist-info}/top_level.txt +0 -0
qiskit/qpy/__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
|
|
@@ -159,6 +194,27 @@ of QPY in qiskit-terra 0.18.0.
|
|
159
194
|
* - Qiskit (qiskit-terra for < 1.0.0) version
|
160
195
|
- :func:`.dump` format(s) output versions
|
161
196
|
- :func:`.load` maximum supported version (older format versions can always be read)
|
197
|
+
* - 2.0.0
|
198
|
+
- 13, 14
|
199
|
+
- 14
|
200
|
+
* - 1.4.2
|
201
|
+
- 10, 11, 12, 13
|
202
|
+
- 13
|
203
|
+
* - 1.4.1
|
204
|
+
- 10, 11, 12, 13
|
205
|
+
- 13
|
206
|
+
* - 1.4.0
|
207
|
+
- 10, 11, 12, 13
|
208
|
+
- 13
|
209
|
+
* - 1.3.3
|
210
|
+
- 10, 11, 12, 13
|
211
|
+
- 13
|
212
|
+
* - 1.3.2
|
213
|
+
- 10, 11, 12, 13
|
214
|
+
- 13
|
215
|
+
* - 1.3.1
|
216
|
+
- 10, 11, 12, 13
|
217
|
+
- 13
|
162
218
|
* - 1.3.0
|
163
219
|
- 10, 11, 12, 13
|
164
220
|
- 13
|
@@ -342,6 +398,93 @@ There is a circuit payload for each circuit (where the total number is dictated
|
|
342
398
|
by ``num_circuits`` in the file header). There is no padding between the
|
343
399
|
circuits in the data.
|
344
400
|
|
401
|
+
.. _qpy_version_14:
|
402
|
+
|
403
|
+
Version 14
|
404
|
+
----------
|
405
|
+
|
406
|
+
Version 14 adds a new core DURATION type, support for additional :class:`~.types.Type`
|
407
|
+
classes :class:`~.types.Float` and :class:`~.types.Duration`, and a new expression
|
408
|
+
node type :class:`~.expr.Stretch`.
|
409
|
+
|
410
|
+
DURATION
|
411
|
+
~~~~~~~~
|
412
|
+
|
413
|
+
A :class:`~.circuit.Duration` is encoded by a single-byte ASCII ``char`` that encodes the kind of
|
414
|
+
type, followed by a payload that varies depending on the type. The defined codes are:
|
415
|
+
|
416
|
+
============================== ========= =========================================================
|
417
|
+
Qiskit class Type code Payload
|
418
|
+
============================== ========= =========================================================
|
419
|
+
:class:`~.circuit.Duration.dt` ``t`` One ``unsigned long long value``.
|
420
|
+
|
421
|
+
:class:`~.circuit.Duration.ns` ``n`` One ``double value``.
|
422
|
+
|
423
|
+
:class:`~.circuit.Duration.us` ``u`` One ``double value``.
|
424
|
+
|
425
|
+
:class:`~.circuit.Duration.ms` ``m`` One ``double value``.
|
426
|
+
|
427
|
+
:class:`~.circuit.Duration.s` ``s`` One ``double value``.
|
428
|
+
|
429
|
+
============================== ========= =========================================================
|
430
|
+
|
431
|
+
Changes to EXPR_VAR_DECLARATION
|
432
|
+
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
|
433
|
+
|
434
|
+
The ``EXPR_VAR_DECLARATION`` type is now used to represent both :class:`~.expr.Var` standalone
|
435
|
+
variables and :class:`~.expr.Stretch` identifiers. To support this change, the usage type code has
|
436
|
+
two new possible entries, in addition to the existing ones:
|
437
|
+
|
438
|
+
========= =========================================================================================
|
439
|
+
Type code Meaning
|
440
|
+
========= =========================================================================================
|
441
|
+
``A`` A ``capture`` stretch to the circuit.
|
442
|
+
|
443
|
+
``O`` A locally declared stretch to the circuit.
|
444
|
+
|
445
|
+
========= =========================================================================================
|
446
|
+
|
447
|
+
Changes to EXPRESSION
|
448
|
+
---------------------
|
449
|
+
|
450
|
+
The EXPRESSION type code has a new possible entry, ``s``, corresponding to :class:`.expr.Stretch`
|
451
|
+
nodes.
|
452
|
+
|
453
|
+
======================= ========= ====================================================== ========
|
454
|
+
Qiskit class Type code Payload Children
|
455
|
+
======================= ========= ====================================================== ========
|
456
|
+
:class:`~.expr.Stretch` ``s`` One ``unsigned short var_index`` 0
|
457
|
+
======================= ========= ====================================================== ========
|
458
|
+
|
459
|
+
Changes to EXPR_TYPE
|
460
|
+
~~~~~~~~~~~~~~~~~~~~
|
461
|
+
|
462
|
+
The following table shows the new type classes added in the version:
|
463
|
+
|
464
|
+
========================= ========= ==============================================================
|
465
|
+
Qiskit class Type code Payload
|
466
|
+
========================= ========= ==============================================================
|
467
|
+
:class:`~.types.Float` ``f`` None.
|
468
|
+
|
469
|
+
:class:`~.types.Duration` ``d`` None.
|
470
|
+
|
471
|
+
========================= ========= ==============================================================
|
472
|
+
|
473
|
+
Changes to EXPR_VALUE
|
474
|
+
~~~~~~~~~~~~~~~~~~~~~
|
475
|
+
|
476
|
+
The classical expression's type system now supports new encoding types for value literals, in
|
477
|
+
addition to the existing encodings for int and bool. The new value type encodings are below:
|
478
|
+
|
479
|
+
=========================== ========= ============================================================
|
480
|
+
Python type Type code Payload
|
481
|
+
=========================== ========= ============================================================
|
482
|
+
``float`` ``f`` One ``double value``.
|
483
|
+
|
484
|
+
:class:`~.circuit.Duration` ``t`` One ``DURATION``.
|
485
|
+
|
486
|
+
=========================== ========= ============================================================
|
487
|
+
|
345
488
|
.. _qpy_version_13:
|
346
489
|
|
347
490
|
Version 13
|
@@ -874,7 +1017,7 @@ Version 7
|
|
874
1017
|
---------
|
875
1018
|
|
876
1019
|
Version 7 adds support for :class:`.~Reference` instruction and serialization of
|
877
|
-
a
|
1020
|
+
a ``ScheduleBlock`` program while keeping its reference to subroutines::
|
878
1021
|
|
879
1022
|
from qiskit import pulse
|
880
1023
|
from qiskit import qpy
|
@@ -946,12 +1089,12 @@ identical to :ref:`qpy_version_5`.
|
|
946
1089
|
Version 5
|
947
1090
|
---------
|
948
1091
|
|
949
|
-
Version 5 changes from :ref:`qpy_version_4` by adding support for
|
1092
|
+
Version 5 changes from :ref:`qpy_version_4` by adding support for ``ScheduleBlock``
|
950
1093
|
and changing two payloads the INSTRUCTION metadata payload and the CUSTOM_INSTRUCTION block.
|
951
1094
|
These now have new fields to better account for :class:`~.ControlledGate` objects in a circuit.
|
952
1095
|
In addition, new payload MAP_ITEM is defined to implement the :ref:`qpy_mapping` block.
|
953
1096
|
|
954
|
-
With the support of
|
1097
|
+
With the support of ``ScheduleBlock``, now :class:`~.QuantumCircuit` can be
|
955
1098
|
serialized together with :attr:`~.QuantumCircuit.calibrations`, or
|
956
1099
|
`Pulse Gates <https://docs.quantum.ibm.com/guides/pulse>`_.
|
957
1100
|
In QPY version 5 and above, :ref:`qpy_circuit_calibrations` payload is
|
@@ -968,7 +1111,7 @@ In QPY version 5 and above,
|
|
968
1111
|
immediately follows the file header block to represent the program type stored in the file.
|
969
1112
|
|
970
1113
|
- When ``type==c``, :class:`~.QuantumCircuit` payload follows
|
971
|
-
- When ``type==s``,
|
1114
|
+
- When ``type==s``, ``ScheduleBlock`` payload follows
|
972
1115
|
|
973
1116
|
.. note::
|
974
1117
|
|
@@ -981,7 +1124,7 @@ immediately follows the file header block to represent the program type stored i
|
|
981
1124
|
SCHEDULE_BLOCK
|
982
1125
|
~~~~~~~~~~~~~~
|
983
1126
|
|
984
|
-
|
1127
|
+
``ScheduleBlock`` is first supported in QPY Version 5. This allows
|
985
1128
|
users to save pulse programs in the QPY binary format as follows:
|
986
1129
|
|
987
1130
|
.. code-block:: python
|
@@ -992,10 +1135,10 @@ users to save pulse programs in the QPY binary format as follows:
|
|
992
1135
|
pulse.play(pulse.Gaussian(160, 0.1, 40), pulse.DriveChannel(0))
|
993
1136
|
|
994
1137
|
with open('schedule.qpy', 'wb') as fd:
|
995
|
-
qpy.dump(
|
1138
|
+
qpy.dump(schedule, fd)
|
996
1139
|
|
997
1140
|
with open('schedule.qpy', 'rb') as fd:
|
998
|
-
|
1141
|
+
new_schedule = qpy.load(fd)[0]
|
999
1142
|
|
1000
1143
|
Note that circuit and schedule block are serialized and deserialized through
|
1001
1144
|
the same QPY interface. Input data type is implicitly analyzed and
|
@@ -1006,7 +1149,7 @@ no extra option is required to save the schedule block.
|
|
1006
1149
|
SCHEDULE_BLOCK_HEADER
|
1007
1150
|
~~~~~~~~~~~~~~~~~~~~~
|
1008
1151
|
|
1009
|
-
|
1152
|
+
``ScheduleBlock`` block starts with the following header:
|
1010
1153
|
|
1011
1154
|
.. code-block:: c
|
1012
1155
|
|
@@ -1206,8 +1349,8 @@ the gate name, ``num_qubits`` length of integers representing a sequence of qubi
|
|
1206
1349
|
and ``num_params`` length of INSTRUCTION_PARAM payload for parameters
|
1207
1350
|
associated to the custom instruction.
|
1208
1351
|
The ``type`` indicates the class of pulse program which is either, in principle,
|
1209
|
-
|
1210
|
-
only
|
1352
|
+
``ScheduleBlock`` or :class:`~.Schedule`. As of QPY Version 5,
|
1353
|
+
only ``ScheduleBlock`` payload is supported.
|
1211
1354
|
Finally, :ref:`qpy_schedule_block` payload is packed for each CALIBRATION_DEF entry.
|
1212
1355
|
|
1213
1356
|
.. _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
|
-
else:
|
664
|
-
calibrations[name][(qubits, params)] = schedule
|
670
|
+
for _ in range(defheader.num_qubits): # read qubits info
|
671
|
+
file_obj.read(struct.calcsize("!q"))
|
665
672
|
|
666
|
-
|
673
|
+
for _ in range(defheader.num_params): # read params info
|
674
|
+
value.read_value(file_obj, version, vectors)
|
675
|
+
|
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
|
@@ -771,6 +783,11 @@ def _write_instruction(
|
|
771
783
|
custom_operations[gate_class_name] = instruction.operation
|
772
784
|
custom_operations_list.append(gate_class_name)
|
773
785
|
|
786
|
+
elif isinstance(instruction.operation, library.MCMTGate):
|
787
|
+
gate_class_name = instruction.operation.name + "_" + str(uuid.uuid4())
|
788
|
+
custom_operations[gate_class_name] = instruction.operation
|
789
|
+
custom_operations_list.append(gate_class_name)
|
790
|
+
|
774
791
|
condition_type = type_keys.Condition.NONE
|
775
792
|
condition_register = b""
|
776
793
|
condition_value = 0
|
@@ -796,6 +813,12 @@ def _write_instruction(
|
|
796
813
|
instruction.operation.target,
|
797
814
|
tuple(instruction.operation.cases_specifier()),
|
798
815
|
]
|
816
|
+
elif isinstance(instruction.operation, controlflow.BoxOp):
|
817
|
+
instruction_params = [
|
818
|
+
instruction.operation.blocks[0],
|
819
|
+
instruction.operation.duration,
|
820
|
+
instruction.operation.unit,
|
821
|
+
]
|
799
822
|
elif isinstance(instruction.operation, Clifford):
|
800
823
|
instruction_params = [instruction.operation.tableau]
|
801
824
|
elif isinstance(instruction.operation, AnnotatedOperation):
|
@@ -994,34 +1017,6 @@ def _write_custom_operation(
|
|
994
1017
|
return new_custom_instruction
|
995
1018
|
|
996
1019
|
|
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
1020
|
def _write_registers(file_obj, in_circ_regs, full_bits):
|
1026
1021
|
bitmap = {bit: index for index, bit in enumerate(full_bits)}
|
1027
1022
|
|
@@ -1032,7 +1027,9 @@ def _write_registers(file_obj, in_circ_regs, full_bits):
|
|
1032
1027
|
|
1033
1028
|
for regs, is_in_circuit in [(in_circ_regs, True), (out_circ_regs, False)]:
|
1034
1029
|
for reg in regs:
|
1035
|
-
standalone = all(
|
1030
|
+
standalone = all(
|
1031
|
+
bit._register == reg and bit._index == index for index, bit in enumerate(reg)
|
1032
|
+
)
|
1036
1033
|
reg_name = reg.name.encode(common.ENCODE)
|
1037
1034
|
reg_type = reg.prefix.encode(common.ENCODE)
|
1038
1035
|
file_obj.write(
|
@@ -1238,48 +1235,25 @@ def write_circuit(
|
|
1238
1235
|
num_registers = num_qregs + num_cregs
|
1239
1236
|
|
1240
1237
|
# 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 = {}
|
1238
|
+
header_raw = formats.CIRCUIT_HEADER_V12(
|
1239
|
+
name_size=len(circuit_name),
|
1240
|
+
global_phase_type=global_phase_type,
|
1241
|
+
global_phase_size=len(global_phase_data),
|
1242
|
+
num_qubits=circuit.num_qubits,
|
1243
|
+
num_clbits=circuit.num_clbits,
|
1244
|
+
metadata_size=metadata_size,
|
1245
|
+
num_registers=num_registers,
|
1246
|
+
num_instructions=num_instructions,
|
1247
|
+
num_vars=circuit.num_identifiers,
|
1248
|
+
)
|
1249
|
+
header = struct.pack(formats.CIRCUIT_HEADER_V12_PACK, *header_raw)
|
1250
|
+
file_obj.write(header)
|
1251
|
+
file_obj.write(circuit_name)
|
1252
|
+
file_obj.write(global_phase_data)
|
1253
|
+
file_obj.write(metadata_raw)
|
1254
|
+
# Write header payload
|
1255
|
+
file_obj.write(registers_raw)
|
1256
|
+
standalone_var_indices = value.write_standalone_vars(file_obj, circuit, version)
|
1283
1257
|
|
1284
1258
|
instruction_buffer = io.BytesIO()
|
1285
1259
|
custom_operations = {}
|
@@ -1322,8 +1296,11 @@ def write_circuit(
|
|
1322
1296
|
file_obj.write(instruction_buffer.getvalue())
|
1323
1297
|
instruction_buffer.close()
|
1324
1298
|
|
1325
|
-
#
|
1326
|
-
|
1299
|
+
# Pulse has been removed in Qiskit 2.0. As long as we keep QPY at version 13,
|
1300
|
+
# we need to write an empty calibrations header since read_circuit expects it
|
1301
|
+
header = struct.pack(formats.CALIBRATION_PACK, 0)
|
1302
|
+
file_obj.write(header)
|
1303
|
+
|
1327
1304
|
_write_layout(file_obj, circuit)
|
1328
1305
|
|
1329
1306
|
|
@@ -1368,7 +1345,7 @@ def read_circuit(file_obj, version, metadata_deserializer=None, use_symengine=Fa
|
|
1368
1345
|
num_clbits = header["num_clbits"]
|
1369
1346
|
num_registers = header["num_registers"]
|
1370
1347
|
num_instructions = header["num_instructions"]
|
1371
|
-
|
1348
|
+
num_identifiers = header.get("num_vars", 0)
|
1372
1349
|
# `out_registers` is two "name: register" maps segregated by type for the rest of QPY, and
|
1373
1350
|
# `all_registers` is the complete ordered list used to construct the `QuantumCircuit`.
|
1374
1351
|
out_registers = {"q": {}, "c": {}}
|
@@ -1425,7 +1402,7 @@ def read_circuit(file_obj, version, metadata_deserializer=None, use_symengine=Fa
|
|
1425
1402
|
"q": [Qubit() for _ in out_bits["q"]],
|
1426
1403
|
"c": [Clbit() for _ in out_bits["c"]],
|
1427
1404
|
}
|
1428
|
-
var_segments, standalone_var_indices = value.read_standalone_vars(file_obj,
|
1405
|
+
var_segments, standalone_var_indices = value.read_standalone_vars(file_obj, num_identifiers)
|
1429
1406
|
circ = QuantumCircuit(
|
1430
1407
|
out_bits["q"],
|
1431
1408
|
out_bits["c"],
|
@@ -1434,10 +1411,15 @@ def read_circuit(file_obj, version, metadata_deserializer=None, use_symengine=Fa
|
|
1434
1411
|
global_phase=global_phase,
|
1435
1412
|
metadata=metadata,
|
1436
1413
|
inputs=var_segments[type_keys.ExprVarDeclaration.INPUT],
|
1437
|
-
captures=
|
1414
|
+
captures=itertools.chain(
|
1415
|
+
var_segments[type_keys.ExprVarDeclaration.CAPTURE],
|
1416
|
+
var_segments[type_keys.ExprVarDeclaration.STRETCH_CAPTURE],
|
1417
|
+
),
|
1438
1418
|
)
|
1439
1419
|
for declaration in var_segments[type_keys.ExprVarDeclaration.LOCAL]:
|
1440
1420
|
circ.add_uninitialized_var(declaration)
|
1421
|
+
for stretch in var_segments[type_keys.ExprVarDeclaration.STRETCH_LOCAL]:
|
1422
|
+
circ.add_stretch(stretch)
|
1441
1423
|
custom_operations = _read_custom_operations(file_obj, version, vectors)
|
1442
1424
|
for _instruction in range(num_instructions):
|
1443
1425
|
_read_instruction(
|
@@ -1451,11 +1433,9 @@ def read_circuit(file_obj, version, metadata_deserializer=None, use_symengine=Fa
|
|
1451
1433
|
standalone_var_indices,
|
1452
1434
|
)
|
1453
1435
|
|
1454
|
-
#
|
1436
|
+
# Consume calibrations, but don't use them since pulse gates are not supported as of Qiskit 2.0
|
1455
1437
|
if version >= 5:
|
1456
|
-
|
1457
|
-
file_obj, version, vectors, metadata_deserializer
|
1458
|
-
)
|
1438
|
+
_read_calibrations(file_obj, version, vectors, metadata_deserializer)
|
1459
1439
|
|
1460
1440
|
for vec_name, (vector, initialized_params) in vectors.items():
|
1461
1441
|
if len(initialized_params) != len(vector):
|