qiskit 1.4.2__cp39-abi3-macosx_11_0_arm64.whl → 2.0.0__cp39-abi3-macosx_11_0_arm64.whl
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- qiskit/VERSION.txt +1 -1
- qiskit/__init__.py +3 -9
- qiskit/_accelerate.abi3.so +0 -0
- qiskit/circuit/__init__.py +35 -10
- qiskit/circuit/{add_control.py → _add_control.py} +32 -12
- qiskit/circuit/_classical_resource_map.py +5 -3
- qiskit/circuit/barrier.py +3 -7
- qiskit/circuit/classical/expr/__init__.py +31 -3
- qiskit/circuit/classical/expr/constructors.py +236 -28
- qiskit/circuit/classical/expr/expr.py +104 -3
- qiskit/circuit/classical/expr/visitors.py +75 -0
- qiskit/circuit/classical/types/__init__.py +12 -8
- qiskit/circuit/classical/types/ordering.py +14 -7
- qiskit/circuit/classical/types/types.py +36 -0
- qiskit/circuit/commutation_checker.py +34 -7
- qiskit/circuit/controlflow/__init__.py +32 -1
- qiskit/circuit/controlflow/_builder_utils.py +9 -5
- qiskit/circuit/controlflow/box.py +163 -0
- qiskit/circuit/controlflow/break_loop.py +1 -1
- qiskit/circuit/controlflow/builder.py +139 -39
- qiskit/circuit/controlflow/continue_loop.py +1 -3
- qiskit/circuit/controlflow/control_flow.py +10 -0
- qiskit/circuit/controlflow/for_loop.py +2 -1
- qiskit/circuit/controlflow/if_else.py +3 -16
- qiskit/circuit/controlflow/switch_case.py +2 -8
- qiskit/circuit/controlflow/while_loop.py +2 -7
- qiskit/circuit/controlledgate.py +2 -4
- qiskit/circuit/delay.py +40 -11
- qiskit/circuit/duration.py +0 -15
- qiskit/circuit/gate.py +2 -4
- qiskit/circuit/instruction.py +2 -141
- qiskit/circuit/instructionset.py +7 -54
- qiskit/circuit/library/__init__.py +469 -154
- qiskit/circuit/library/arithmetic/__init__.py +16 -10
- qiskit/circuit/library/arithmetic/adders/cdkm_ripple_carry_adder.py +1 -1
- qiskit/circuit/library/arithmetic/adders/draper_qft_adder.py +2 -2
- qiskit/circuit/library/arithmetic/adders/vbe_ripple_carry_adder.py +1 -1
- qiskit/circuit/library/arithmetic/exact_reciprocal.py +64 -21
- qiskit/circuit/library/arithmetic/integer_comparator.py +37 -80
- qiskit/circuit/library/arithmetic/linear_amplitude_function.py +169 -2
- qiskit/circuit/library/arithmetic/linear_pauli_rotations.py +59 -5
- qiskit/circuit/library/arithmetic/piecewise_chebyshev.py +154 -6
- qiskit/circuit/library/arithmetic/piecewise_linear_pauli_rotations.py +114 -4
- qiskit/circuit/library/arithmetic/piecewise_polynomial_pauli_rotations.py +191 -15
- qiskit/circuit/library/arithmetic/polynomial_pauli_rotations.py +93 -39
- qiskit/circuit/library/arithmetic/quadratic_form.py +168 -2
- qiskit/circuit/library/arithmetic/weighted_adder.py +73 -1
- qiskit/circuit/library/bit_flip_oracle.py +130 -0
- qiskit/circuit/library/blueprintcircuit.py +52 -16
- qiskit/circuit/library/data_preparation/initializer.py +1 -1
- qiskit/circuit/library/data_preparation/pauli_feature_map.py +4 -4
- qiskit/circuit/library/data_preparation/state_preparation.py +1 -1
- qiskit/circuit/library/generalized_gates/gms.py +1 -1
- qiskit/circuit/library/generalized_gates/isometry.py +1 -1
- qiskit/circuit/library/generalized_gates/pauli.py +1 -2
- qiskit/circuit/library/generalized_gates/uc.py +97 -7
- qiskit/circuit/library/generalized_gates/uc_pauli_rot.py +1 -1
- qiskit/circuit/library/generalized_gates/unitary.py +4 -2
- qiskit/circuit/library/graph_state.py +1 -0
- qiskit/circuit/library/hamiltonian_gate.py +1 -1
- qiskit/circuit/library/n_local/evolved_operator_ansatz.py +1 -1
- qiskit/circuit/library/n_local/n_local.py +1 -1
- qiskit/circuit/library/n_local/qaoa_ansatz.py +1 -1
- qiskit/circuit/library/overlap.py +2 -2
- qiskit/circuit/library/pauli_evolution.py +39 -24
- qiskit/circuit/library/phase_oracle.py +130 -51
- qiskit/circuit/library/standard_gates/__init__.py +0 -1
- qiskit/circuit/library/standard_gates/dcx.py +3 -4
- qiskit/circuit/library/standard_gates/ecr.py +3 -4
- qiskit/circuit/library/standard_gates/global_phase.py +5 -6
- qiskit/circuit/library/standard_gates/h.py +4 -9
- qiskit/circuit/library/standard_gates/i.py +2 -2
- qiskit/circuit/library/standard_gates/iswap.py +3 -4
- qiskit/circuit/library/standard_gates/p.py +15 -34
- qiskit/circuit/library/standard_gates/r.py +7 -10
- qiskit/circuit/library/standard_gates/rx.py +5 -15
- qiskit/circuit/library/standard_gates/rxx.py +3 -6
- qiskit/circuit/library/standard_gates/ry.py +5 -17
- qiskit/circuit/library/standard_gates/ryy.py +3 -6
- qiskit/circuit/library/standard_gates/rz.py +5 -17
- qiskit/circuit/library/standard_gates/rzx.py +3 -6
- qiskit/circuit/library/standard_gates/rzz.py +3 -6
- qiskit/circuit/library/standard_gates/s.py +6 -15
- qiskit/circuit/library/standard_gates/swap.py +4 -11
- qiskit/circuit/library/standard_gates/sx.py +7 -12
- qiskit/circuit/library/standard_gates/t.py +6 -7
- qiskit/circuit/library/standard_gates/u.py +2 -10
- qiskit/circuit/library/standard_gates/u1.py +5 -16
- qiskit/circuit/library/standard_gates/u2.py +2 -6
- qiskit/circuit/library/standard_gates/u3.py +3 -11
- qiskit/circuit/library/standard_gates/x.py +14 -62
- qiskit/circuit/library/standard_gates/xx_minus_yy.py +2 -5
- qiskit/circuit/library/standard_gates/xx_plus_yy.py +2 -5
- qiskit/circuit/library/standard_gates/y.py +4 -9
- qiskit/circuit/library/standard_gates/z.py +5 -15
- qiskit/circuit/measure.py +11 -2
- qiskit/circuit/parameterexpression.py +7 -1
- qiskit/circuit/quantumcircuit.py +890 -564
- qiskit/circuit/random/utils.py +12 -6
- qiskit/circuit/reset.py +5 -2
- qiskit/circuit/singleton.py +5 -11
- qiskit/circuit/store.py +0 -8
- qiskit/compiler/__init__.py +1 -7
- qiskit/compiler/transpiler.py +38 -196
- qiskit/converters/circuit_to_dag.py +6 -4
- qiskit/converters/circuit_to_dagdependency.py +0 -2
- qiskit/converters/circuit_to_dagdependency_v2.py +0 -1
- qiskit/converters/circuit_to_gate.py +1 -1
- qiskit/converters/circuit_to_instruction.py +16 -29
- qiskit/converters/dag_to_circuit.py +7 -8
- qiskit/converters/dag_to_dagdependency.py +0 -1
- qiskit/converters/dag_to_dagdependency_v2.py +0 -1
- qiskit/converters/dagdependency_to_circuit.py +0 -6
- qiskit/converters/dagdependency_to_dag.py +0 -6
- qiskit/dagcircuit/collect_blocks.py +32 -20
- qiskit/dagcircuit/dagdependency.py +3 -37
- qiskit/dagcircuit/dagdependency_v2.py +5 -82
- qiskit/dagcircuit/dagnode.py +14 -2
- qiskit/passmanager/__init__.py +24 -6
- qiskit/passmanager/passmanager.py +26 -24
- qiskit/primitives/__init__.py +44 -35
- qiskit/primitives/backend_estimator_v2.py +102 -23
- qiskit/primitives/backend_sampler_v2.py +5 -20
- qiskit/primitives/base/__init__.py +4 -4
- qiskit/primitives/base/base_estimator.py +77 -82
- qiskit/primitives/base/base_primitive_job.py +2 -2
- qiskit/primitives/base/{base_primitive.py → base_primitive_v1.py} +1 -1
- qiskit/primitives/base/{base_result.py → base_result_v1.py} +1 -1
- qiskit/primitives/base/base_sampler.py +52 -60
- qiskit/primitives/base/{estimator_result.py → estimator_result_v1.py} +2 -2
- qiskit/primitives/base/{sampler_result.py → sampler_result_v1.py} +2 -2
- qiskit/primitives/base/{validation.py → validation_v1.py} +34 -15
- qiskit/primitives/containers/bindings_array.py +3 -1
- qiskit/primitives/containers/bit_array.py +23 -0
- qiskit/primitives/containers/data_bin.py +3 -1
- qiskit/primitives/containers/observables_array.py +19 -2
- qiskit/primitives/statevector_sampler.py +6 -8
- qiskit/primitives/utils.py +14 -189
- qiskit/providers/__init__.py +4 -130
- qiskit/providers/backend.py +11 -314
- qiskit/providers/basic_provider/__init__.py +3 -1
- qiskit/providers/basic_provider/basic_provider.py +29 -9
- qiskit/providers/basic_provider/basic_simulator.py +158 -298
- qiskit/providers/exceptions.py +0 -33
- qiskit/providers/fake_provider/__init__.py +0 -37
- qiskit/providers/fake_provider/generic_backend_v2.py +32 -693
- qiskit/qasm2/__init__.py +21 -6
- qiskit/qasm2/export.py +2 -10
- qiskit/qasm2/parse.py +11 -25
- qiskit/qasm3/__init__.py +5 -1
- qiskit/qasm3/ast.py +44 -0
- qiskit/qasm3/exporter.py +65 -27
- qiskit/qasm3/printer.py +35 -4
- qiskit/qpy/__init__.py +162 -19
- qiskit/qpy/binary_io/__init__.py +0 -1
- qiskit/qpy/binary_io/circuits.py +98 -130
- qiskit/qpy/binary_io/schedules.py +69 -439
- qiskit/qpy/binary_io/value.py +154 -31
- qiskit/qpy/common.py +10 -7
- qiskit/qpy/formats.py +41 -0
- qiskit/qpy/interface.py +34 -81
- qiskit/qpy/type_keys.py +58 -221
- qiskit/quantum_info/analysis/distance.py +3 -1
- qiskit/quantum_info/operators/dihedral/dihedral.py +3 -1
- qiskit/quantum_info/operators/operator.py +6 -2
- qiskit/quantum_info/operators/symplectic/clifford.py +3 -1
- qiskit/quantum_info/operators/symplectic/pauli.py +4 -2
- qiskit/quantum_info/operators/symplectic/pauli_list.py +17 -5
- qiskit/quantum_info/operators/symplectic/sparse_pauli_op.py +40 -6
- qiskit/quantum_info/states/densitymatrix.py +16 -6
- qiskit/quantum_info/states/stabilizerstate.py +35 -4
- qiskit/quantum_info/states/statevector.py +16 -6
- qiskit/result/__init__.py +5 -17
- qiskit/result/models.py +18 -11
- qiskit/result/result.py +38 -134
- qiskit/result/sampled_expval.py +1 -2
- qiskit/result/utils.py +3 -4
- qiskit/synthesis/__init__.py +21 -1
- qiskit/synthesis/arithmetic/__init__.py +3 -1
- qiskit/synthesis/arithmetic/adders/cdkm_ripple_carry_adder.py +1 -1
- qiskit/synthesis/arithmetic/adders/draper_qft_adder.py +1 -1
- qiskit/synthesis/arithmetic/adders/vbe_ripple_carry_adder.py +2 -2
- qiskit/{providers/fake_provider/backends_v1/fake_20q → synthesis/arithmetic/comparators}/__init__.py +4 -6
- qiskit/synthesis/arithmetic/comparators/compare_2s.py +112 -0
- qiskit/synthesis/arithmetic/comparators/compare_greedy.py +66 -0
- qiskit/synthesis/arithmetic/multipliers/hrs_cumulative_multiplier.py +1 -1
- qiskit/synthesis/arithmetic/multipliers/rg_qft_multiplier.py +1 -1
- qiskit/synthesis/arithmetic/weighted_sum.py +155 -0
- qiskit/{result/mitigation → synthesis/boolean}/__init__.py +2 -2
- qiskit/synthesis/boolean/boolean_expression.py +231 -0
- qiskit/synthesis/boolean/boolean_expression_synth.py +124 -0
- qiskit/synthesis/boolean/boolean_expression_visitor.py +96 -0
- qiskit/synthesis/evolution/lie_trotter.py +10 -7
- qiskit/synthesis/evolution/product_formula.py +44 -35
- qiskit/synthesis/evolution/qdrift.py +17 -24
- qiskit/synthesis/evolution/suzuki_trotter.py +20 -27
- qiskit/synthesis/linear/linear_depth_lnn.py +6 -221
- qiskit/synthesis/linear_phase/cx_cz_depth_lnn.py +4 -205
- qiskit/synthesis/multi_controlled/__init__.py +1 -0
- qiskit/synthesis/multi_controlled/mcx_synthesis.py +5 -2
- qiskit/synthesis/multi_controlled/multi_control_rotation_gates.py +206 -0
- qiskit/synthesis/one_qubit/one_qubit_decompose.py +1 -1
- qiskit/synthesis/two_qubit/__init__.py +1 -0
- qiskit/synthesis/two_qubit/two_qubit_decompose.py +28 -145
- qiskit/transpiler/__init__.py +32 -232
- qiskit/transpiler/basepasses.py +20 -51
- qiskit/transpiler/layout.py +1 -1
- qiskit/transpiler/passes/__init__.py +4 -40
- qiskit/transpiler/passes/basis/basis_translator.py +5 -4
- qiskit/transpiler/passes/basis/decompose.py +1 -15
- qiskit/transpiler/passes/basis/unroll_3q_or_more.py +1 -5
- qiskit/transpiler/passes/basis/unroll_custom_definitions.py +3 -2
- qiskit/transpiler/passes/layout/apply_layout.py +4 -0
- qiskit/transpiler/passes/layout/dense_layout.py +2 -39
- qiskit/transpiler/passes/layout/full_ancilla_allocation.py +3 -4
- qiskit/transpiler/passes/layout/sabre_layout.py +7 -3
- qiskit/transpiler/passes/layout/vf2_layout.py +2 -20
- qiskit/transpiler/passes/layout/vf2_post_layout.py +60 -125
- qiskit/transpiler/passes/layout/vf2_utils.py +2 -26
- qiskit/transpiler/passes/optimization/__init__.py +2 -3
- qiskit/transpiler/passes/optimization/collect_and_collapse.py +2 -0
- qiskit/transpiler/passes/optimization/collect_cliffords.py +5 -0
- qiskit/transpiler/passes/optimization/collect_linear_functions.py +5 -0
- qiskit/transpiler/passes/optimization/collect_multiqubit_blocks.py +16 -1
- qiskit/transpiler/passes/optimization/commutation_analysis.py +3 -3
- qiskit/transpiler/passes/optimization/consolidate_blocks.py +41 -19
- qiskit/transpiler/passes/optimization/contract_idle_wires_in_control_flow.py +104 -0
- qiskit/transpiler/passes/optimization/light_cone.py +135 -0
- qiskit/transpiler/passes/optimization/optimize_1q_commutation.py +0 -1
- qiskit/transpiler/passes/optimization/optimize_1q_decomposition.py +18 -22
- qiskit/transpiler/passes/optimization/optimize_annotated.py +3 -2
- qiskit/transpiler/passes/optimization/remove_identity_equiv.py +6 -4
- qiskit/transpiler/passes/optimization/reset_after_measure_simplification.py +5 -2
- qiskit/transpiler/passes/optimization/split_2q_unitaries.py +26 -3
- qiskit/transpiler/passes/optimization/template_matching/template_substitution.py +1 -0
- qiskit/transpiler/passes/routing/__init__.py +0 -1
- qiskit/transpiler/passes/routing/commuting_2q_gate_routing/commuting_2q_gate_router.py +3 -1
- qiskit/transpiler/passes/routing/sabre_swap.py +14 -6
- qiskit/transpiler/passes/routing/star_prerouting.py +1 -1
- qiskit/transpiler/passes/scheduling/__init__.py +1 -7
- qiskit/transpiler/passes/scheduling/alignments/__init__.py +2 -4
- qiskit/transpiler/passes/scheduling/alignments/check_durations.py +1 -9
- qiskit/transpiler/passes/scheduling/alignments/reschedule.py +17 -16
- qiskit/transpiler/passes/scheduling/padding/base_padding.py +32 -4
- qiskit/transpiler/passes/scheduling/padding/dynamical_decoupling.py +25 -63
- qiskit/transpiler/passes/scheduling/padding/pad_delay.py +12 -4
- qiskit/transpiler/passes/scheduling/scheduling/alap.py +5 -39
- qiskit/transpiler/passes/scheduling/scheduling/asap.py +4 -35
- qiskit/transpiler/passes/scheduling/scheduling/base_scheduler.py +10 -16
- qiskit/transpiler/passes/scheduling/time_unit_conversion.py +134 -62
- qiskit/transpiler/passes/synthesis/default_unitary_synth_plugin.py +653 -0
- qiskit/transpiler/passes/synthesis/high_level_synthesis.py +176 -601
- qiskit/transpiler/passes/synthesis/hls_plugins.py +294 -1
- qiskit/transpiler/passes/synthesis/plugin.py +4 -0
- qiskit/transpiler/passes/synthesis/solovay_kitaev_synthesis.py +16 -10
- qiskit/transpiler/passes/synthesis/unitary_synthesis.py +34 -697
- qiskit/transpiler/passes/utils/__init__.py +0 -1
- qiskit/transpiler/passes/utils/check_gate_direction.py +13 -5
- qiskit/transpiler/passes/utils/control_flow.py +2 -6
- qiskit/transpiler/passes/utils/gate_direction.py +7 -0
- qiskit/transpiler/passes/utils/remove_final_measurements.py +40 -33
- qiskit/transpiler/passmanager.py +13 -0
- qiskit/transpiler/passmanager_config.py +5 -81
- qiskit/transpiler/preset_passmanagers/builtin_plugins.py +225 -344
- qiskit/transpiler/preset_passmanagers/common.py +140 -167
- qiskit/transpiler/preset_passmanagers/generate_preset_pass_manager.py +107 -322
- qiskit/transpiler/preset_passmanagers/level0.py +2 -11
- qiskit/transpiler/preset_passmanagers/level1.py +2 -14
- qiskit/transpiler/preset_passmanagers/level2.py +2 -12
- qiskit/transpiler/preset_passmanagers/level3.py +2 -11
- qiskit/transpiler/preset_passmanagers/plugin.py +5 -3
- qiskit/transpiler/target.py +78 -524
- qiskit/user_config.py +8 -4
- qiskit/utils/__init__.py +13 -12
- qiskit/utils/deprecation.py +4 -112
- qiskit/utils/optionals.py +11 -4
- qiskit/utils/parallel.py +214 -87
- qiskit/utils/units.py +4 -1
- qiskit/visualization/__init__.py +3 -7
- qiskit/visualization/array.py +4 -1
- qiskit/visualization/bloch.py +1 -1
- qiskit/visualization/circuit/_utils.py +19 -19
- qiskit/visualization/circuit/circuit_visualization.py +11 -4
- qiskit/visualization/circuit/matplotlib.py +13 -23
- qiskit/visualization/circuit/text.py +7 -3
- qiskit/visualization/counts_visualization.py +4 -0
- qiskit/visualization/dag_visualization.py +2 -1
- qiskit/visualization/gate_map.py +39 -154
- qiskit/visualization/library.py +4 -1
- qiskit/visualization/pass_manager_visualization.py +6 -2
- qiskit/visualization/state_visualization.py +19 -2
- qiskit/visualization/timeline/core.py +19 -13
- qiskit/visualization/timeline/interface.py +19 -18
- qiskit/visualization/timeline/plotters/matplotlib.py +4 -1
- {qiskit-1.4.2.dist-info → qiskit-2.0.0.dist-info}/METADATA +4 -3
- {qiskit-1.4.2.dist-info → qiskit-2.0.0.dist-info}/RECORD +300 -447
- {qiskit-1.4.2.dist-info → qiskit-2.0.0.dist-info}/WHEEL +2 -1
- {qiskit-1.4.2.dist-info → qiskit-2.0.0.dist-info}/entry_points.txt +8 -2
- qiskit/assembler/__init__.py +0 -42
- qiskit/assembler/assemble_circuits.py +0 -451
- qiskit/assembler/assemble_schedules.py +0 -367
- qiskit/assembler/disassemble.py +0 -310
- qiskit/assembler/run_config.py +0 -77
- qiskit/circuit/bit.py +0 -106
- qiskit/circuit/classicalfunction/__init__.py +0 -152
- qiskit/circuit/classicalfunction/boolean_expression.py +0 -138
- qiskit/circuit/classicalfunction/classical_element.py +0 -54
- qiskit/circuit/classicalfunction/classical_function_visitor.py +0 -155
- qiskit/circuit/classicalfunction/classicalfunction.py +0 -182
- qiskit/circuit/classicalfunction/exceptions.py +0 -41
- qiskit/circuit/classicalfunction/types.py +0 -18
- qiskit/circuit/classicalfunction/utils.py +0 -91
- qiskit/circuit/classicalregister.py +0 -57
- qiskit/circuit/library/standard_gates/multi_control_rotation_gates.py +0 -405
- qiskit/circuit/quantumregister.py +0 -75
- qiskit/circuit/register.py +0 -246
- qiskit/compiler/assembler.py +0 -689
- qiskit/compiler/scheduler.py +0 -109
- qiskit/compiler/sequencer.py +0 -71
- qiskit/primitives/backend_estimator.py +0 -486
- qiskit/primitives/backend_sampler.py +0 -222
- qiskit/primitives/estimator.py +0 -172
- qiskit/primitives/sampler.py +0 -162
- qiskit/providers/backend_compat.py +0 -507
- qiskit/providers/fake_provider/backends_v1/__init__.py +0 -22
- qiskit/providers/fake_provider/backends_v1/fake_127q_pulse/__init__.py +0 -18
- qiskit/providers/fake_provider/backends_v1/fake_127q_pulse/conf_washington.json +0 -1
- qiskit/providers/fake_provider/backends_v1/fake_127q_pulse/defs_washington.json +0 -1
- qiskit/providers/fake_provider/backends_v1/fake_127q_pulse/fake_127q_pulse_v1.py +0 -37
- qiskit/providers/fake_provider/backends_v1/fake_127q_pulse/props_washington.json +0 -1
- qiskit/providers/fake_provider/backends_v1/fake_20q/conf_singapore.json +0 -1
- qiskit/providers/fake_provider/backends_v1/fake_20q/fake_20q.py +0 -43
- qiskit/providers/fake_provider/backends_v1/fake_20q/props_singapore.json +0 -1
- qiskit/providers/fake_provider/backends_v1/fake_27q_pulse/__init__.py +0 -18
- qiskit/providers/fake_provider/backends_v1/fake_27q_pulse/conf_hanoi.json +0 -1
- qiskit/providers/fake_provider/backends_v1/fake_27q_pulse/defs_hanoi.json +0 -1
- qiskit/providers/fake_provider/backends_v1/fake_27q_pulse/fake_27q_pulse_v1.py +0 -50
- qiskit/providers/fake_provider/backends_v1/fake_27q_pulse/props_hanoi.json +0 -1
- qiskit/providers/fake_provider/backends_v1/fake_5q/__init__.py +0 -18
- qiskit/providers/fake_provider/backends_v1/fake_5q/conf_yorktown.json +0 -1
- qiskit/providers/fake_provider/backends_v1/fake_5q/fake_5q_v1.py +0 -41
- qiskit/providers/fake_provider/backends_v1/fake_5q/props_yorktown.json +0 -1
- qiskit/providers/fake_provider/backends_v1/fake_7q_pulse/__init__.py +0 -18
- qiskit/providers/fake_provider/backends_v1/fake_7q_pulse/conf_nairobi.json +0 -1
- qiskit/providers/fake_provider/backends_v1/fake_7q_pulse/defs_nairobi.json +0 -1
- qiskit/providers/fake_provider/backends_v1/fake_7q_pulse/fake_7q_pulse_v1.py +0 -44
- qiskit/providers/fake_provider/backends_v1/fake_7q_pulse/props_nairobi.json +0 -1
- qiskit/providers/fake_provider/fake_1q.py +0 -91
- qiskit/providers/fake_provider/fake_backend.py +0 -165
- qiskit/providers/fake_provider/fake_openpulse_2q.py +0 -391
- qiskit/providers/fake_provider/fake_openpulse_3q.py +0 -340
- qiskit/providers/fake_provider/fake_pulse_backend.py +0 -49
- qiskit/providers/fake_provider/fake_qasm_backend.py +0 -77
- qiskit/providers/fake_provider/utils/backend_converter.py +0 -150
- qiskit/providers/fake_provider/utils/json_decoder.py +0 -109
- qiskit/providers/models/__init__.py +0 -89
- qiskit/providers/models/backendconfiguration.py +0 -1040
- qiskit/providers/models/backendproperties.py +0 -535
- qiskit/providers/models/backendstatus.py +0 -104
- qiskit/providers/models/jobstatus.py +0 -77
- qiskit/providers/models/pulsedefaults.py +0 -305
- qiskit/providers/provider.py +0 -95
- qiskit/pulse/__init__.py +0 -158
- qiskit/pulse/builder.py +0 -2262
- qiskit/pulse/calibration_entries.py +0 -381
- qiskit/pulse/channels.py +0 -227
- qiskit/pulse/configuration.py +0 -245
- qiskit/pulse/exceptions.py +0 -45
- qiskit/pulse/filters.py +0 -309
- qiskit/pulse/instruction_schedule_map.py +0 -424
- qiskit/pulse/instructions/__init__.py +0 -67
- qiskit/pulse/instructions/acquire.py +0 -150
- qiskit/pulse/instructions/delay.py +0 -71
- qiskit/pulse/instructions/directives.py +0 -154
- qiskit/pulse/instructions/frequency.py +0 -135
- qiskit/pulse/instructions/instruction.py +0 -270
- qiskit/pulse/instructions/phase.py +0 -152
- qiskit/pulse/instructions/play.py +0 -99
- qiskit/pulse/instructions/reference.py +0 -100
- qiskit/pulse/instructions/snapshot.py +0 -82
- qiskit/pulse/library/__init__.py +0 -97
- qiskit/pulse/library/continuous.py +0 -430
- qiskit/pulse/library/pulse.py +0 -148
- qiskit/pulse/library/samplers/__init__.py +0 -15
- qiskit/pulse/library/samplers/decorators.py +0 -295
- qiskit/pulse/library/samplers/strategies.py +0 -71
- qiskit/pulse/library/symbolic_pulses.py +0 -1989
- qiskit/pulse/library/waveform.py +0 -136
- qiskit/pulse/macros.py +0 -262
- qiskit/pulse/parameter_manager.py +0 -445
- qiskit/pulse/parser.py +0 -314
- qiskit/pulse/reference_manager.py +0 -58
- qiskit/pulse/schedule.py +0 -1854
- qiskit/pulse/transforms/__init__.py +0 -106
- qiskit/pulse/transforms/alignments.py +0 -406
- qiskit/pulse/transforms/base_transforms.py +0 -71
- qiskit/pulse/transforms/canonicalization.py +0 -498
- qiskit/pulse/transforms/dag.py +0 -122
- qiskit/pulse/utils.py +0 -149
- qiskit/qobj/__init__.py +0 -75
- qiskit/qobj/common.py +0 -81
- qiskit/qobj/converters/__init__.py +0 -18
- qiskit/qobj/converters/lo_config.py +0 -177
- qiskit/qobj/converters/pulse_instruction.py +0 -897
- qiskit/qobj/pulse_qobj.py +0 -709
- qiskit/qobj/qasm_qobj.py +0 -708
- qiskit/qobj/utils.py +0 -46
- qiskit/result/mitigation/base_readout_mitigator.py +0 -79
- qiskit/result/mitigation/correlated_readout_mitigator.py +0 -277
- qiskit/result/mitigation/local_readout_mitigator.py +0 -328
- qiskit/result/mitigation/utils.py +0 -217
- qiskit/scheduler/__init__.py +0 -40
- qiskit/scheduler/config.py +0 -37
- qiskit/scheduler/lowering.py +0 -187
- qiskit/scheduler/methods/__init__.py +0 -15
- qiskit/scheduler/methods/basic.py +0 -140
- qiskit/scheduler/schedule_circuit.py +0 -69
- qiskit/scheduler/sequence.py +0 -104
- qiskit/transpiler/passes/calibration/__init__.py +0 -17
- qiskit/transpiler/passes/calibration/base_builder.py +0 -79
- qiskit/transpiler/passes/calibration/builders.py +0 -20
- qiskit/transpiler/passes/calibration/exceptions.py +0 -22
- qiskit/transpiler/passes/calibration/pulse_gate.py +0 -100
- qiskit/transpiler/passes/calibration/rx_builder.py +0 -164
- qiskit/transpiler/passes/calibration/rzx_builder.py +0 -411
- qiskit/transpiler/passes/calibration/rzx_templates.py +0 -58
- qiskit/transpiler/passes/optimization/cx_cancellation.py +0 -65
- qiskit/transpiler/passes/optimization/echo_rzx_weyl_decomposition.py +0 -162
- qiskit/transpiler/passes/optimization/normalize_rx_angle.py +0 -157
- qiskit/transpiler/passes/routing/stochastic_swap.py +0 -532
- qiskit/transpiler/passes/scheduling/alap.py +0 -153
- qiskit/transpiler/passes/scheduling/alignments/align_measures.py +0 -255
- qiskit/transpiler/passes/scheduling/alignments/pulse_gate_validation.py +0 -107
- qiskit/transpiler/passes/scheduling/asap.py +0 -175
- qiskit/transpiler/passes/scheduling/base_scheduler.py +0 -310
- qiskit/transpiler/passes/scheduling/dynamical_decoupling.py +0 -313
- qiskit/transpiler/passes/utils/convert_conditions_to_if_ops.py +0 -93
- qiskit/utils/deprecate_pulse.py +0 -119
- qiskit/utils/multiprocessing.py +0 -56
- qiskit/visualization/pulse_v2/__init__.py +0 -21
- qiskit/visualization/pulse_v2/core.py +0 -901
- qiskit/visualization/pulse_v2/device_info.py +0 -173
- qiskit/visualization/pulse_v2/drawings.py +0 -253
- qiskit/visualization/pulse_v2/events.py +0 -254
- qiskit/visualization/pulse_v2/generators/__init__.py +0 -40
- qiskit/visualization/pulse_v2/generators/barrier.py +0 -76
- qiskit/visualization/pulse_v2/generators/chart.py +0 -208
- qiskit/visualization/pulse_v2/generators/frame.py +0 -436
- qiskit/visualization/pulse_v2/generators/snapshot.py +0 -133
- qiskit/visualization/pulse_v2/generators/waveform.py +0 -645
- qiskit/visualization/pulse_v2/interface.py +0 -459
- qiskit/visualization/pulse_v2/layouts.py +0 -387
- qiskit/visualization/pulse_v2/plotters/__init__.py +0 -17
- qiskit/visualization/pulse_v2/plotters/base_plotter.py +0 -53
- qiskit/visualization/pulse_v2/plotters/matplotlib.py +0 -201
- qiskit/visualization/pulse_v2/stylesheet.py +0 -312
- qiskit/visualization/pulse_v2/types.py +0 -242
- {qiskit-1.4.2.dist-info → qiskit-2.0.0.dist-info/licenses}/LICENSE.txt +0 -0
- {qiskit-1.4.2.dist-info → qiskit-2.0.0.dist-info}/top_level.txt +0 -0
qiskit/primitives/__init__.py
CHANGED
@@ -27,9 +27,15 @@ accepting quantum circuits (or sweeps of values over parameterized circuits) and
|
|
27
27
|
classical output registers. Estimators accept combinations of circuits and observables (or sweeps
|
28
28
|
thereof) to estimate expectation values of the observables.
|
29
29
|
|
30
|
-
Qiskit
|
31
|
-
:class:`~.StatevectorSampler` and :class:`~.StatevectorEstimator
|
30
|
+
Qiskit offers a reference implementation for each of these abstractions in the
|
31
|
+
:class:`~.StatevectorSampler` and :class:`~.StatevectorEstimator` classes.
|
32
32
|
|
33
|
+
The earlier versions of the sampler and estimator abstractions are defined by :class:`~.BaseSamplerV1`
|
34
|
+
and :class:`~.BaseEstimatorV1`. These interfaces follow a different and less flexible input-output
|
35
|
+
format for the ``run`` method and have been largely replaced in practice by :class:`~.BaseSamplerV2` and
|
36
|
+
:class:`~.BaseEstimatorV2`. However, the original abstract interface definitions have been
|
37
|
+
retained for backward compatibility. Check the migration section of this page to see further details
|
38
|
+
on the difference between V1 and V2.
|
33
39
|
|
34
40
|
Overview of EstimatorV2
|
35
41
|
=======================
|
@@ -66,7 +72,9 @@ is in general array-valued as well. For more information, please check
|
|
66
72
|
|
67
73
|
Here is an example of how an estimator is used.
|
68
74
|
|
69
|
-
..
|
75
|
+
.. plot::
|
76
|
+
:include-source:
|
77
|
+
:nofigs:
|
70
78
|
|
71
79
|
from qiskit.primitives import StatevectorEstimator as Estimator
|
72
80
|
from qiskit.circuit.library import RealAmplitudes
|
@@ -126,7 +134,9 @@ for each pub.
|
|
126
134
|
Here is an example of how a sampler is used.
|
127
135
|
|
128
136
|
|
129
|
-
..
|
137
|
+
.. plot::
|
138
|
+
:include-source:
|
139
|
+
:nofigs:
|
130
140
|
|
131
141
|
from qiskit.primitives import StatevectorSampler as Sampler
|
132
142
|
from qiskit import QuantumCircuit
|
@@ -164,12 +174,12 @@ Here is an example of how a sampler is used.
|
|
164
174
|
Overview of EstimatorV1
|
165
175
|
=======================
|
166
176
|
|
167
|
-
|
177
|
+
There are currently no implementations of the legacy ``EstimatorV1`` interface in Qiskit.
|
178
|
+
However, the abstract interface definition from :class:`~BaseEstimatorV1` is still part
|
179
|
+
of the package to provide backwards compatibility for external implementations.
|
168
180
|
|
169
|
-
An
|
170
|
-
|
171
|
-
:meth:`qiskit.primitives.Estimator.run()` method. This method is called
|
172
|
-
with the following parameters
|
181
|
+
An ``EstimatorV1`` implementation is initialized with an empty parameter set.
|
182
|
+
:class:`~BaseEstimatorV1` can be called via the ``.run()`` method with the following parameters:
|
173
183
|
|
174
184
|
* quantum circuits (:math:`\psi_i(\theta)`): list of (parameterized) quantum circuits
|
175
185
|
(a list of :class:`~qiskit.circuit.QuantumCircuit` objects).
|
@@ -181,7 +191,7 @@ with the following parameters
|
|
181
191
|
to be bound to the parameters of the quantum circuits
|
182
192
|
(list of list of float).
|
183
193
|
|
184
|
-
The method
|
194
|
+
The method should return a :class:`~qiskit.providers.JobV1` object. Calling
|
185
195
|
:meth:`qiskit.providers.JobV1.result()` yields the
|
186
196
|
a list of expectation values plus optional metadata like confidence intervals for
|
187
197
|
the estimation.
|
@@ -190,11 +200,15 @@ the estimation.
|
|
190
200
|
|
191
201
|
\langle\psi_i(\theta_k)|H_j|\psi_i(\theta_k)\rangle
|
192
202
|
|
193
|
-
Here is an example of how
|
203
|
+
Here is an example of how an ``EstimatorV1`` implementation would be used.
|
204
|
+
Note that there are currently no implementations of the legacy ``EstimatorV1``
|
205
|
+
interface in Qiskit.
|
194
206
|
|
195
207
|
.. code-block:: python
|
196
208
|
|
197
|
-
|
209
|
+
# This is a fictional import path.
|
210
|
+
# There are currently no EstimatorV1 implementations in Qiskit.
|
211
|
+
from estimator_v1_location import EstimatorV1
|
198
212
|
from qiskit.circuit.library import RealAmplitudes
|
199
213
|
from qiskit.quantum_info import SparsePauliOp
|
200
214
|
|
@@ -209,7 +223,7 @@ Here is an example of how the estimator is used.
|
|
209
223
|
theta2 = [0, 1, 1, 2, 3, 5, 8, 13]
|
210
224
|
theta3 = [1, 2, 3, 4, 5, 6]
|
211
225
|
|
212
|
-
estimator =
|
226
|
+
estimator = EstimatorV1()
|
213
227
|
|
214
228
|
# calculate [ <psi1(theta1)|H1|psi1(theta1)> ]
|
215
229
|
job = estimator.run([psi1], [H1], [theta1])
|
@@ -231,11 +245,14 @@ Here is an example of how the estimator is used.
|
|
231
245
|
Overview of SamplerV1
|
232
246
|
=====================
|
233
247
|
|
234
|
-
|
248
|
+
There are currently no implementations of the legacy ``SamplerV1`` interface in Qiskit.
|
249
|
+
However, the abstract interface definition from :class:`~BaseSamplerV1` is still part
|
250
|
+
of the package to provide backward compatibility for external implementations.
|
235
251
|
|
236
|
-
|
237
|
-
|
238
|
-
|
252
|
+
Sampler classes calculate probabilities or quasi-probabilities of bitstrings from quantum circuits.
|
253
|
+
|
254
|
+
A ``SamplerV1`` is initialized with an empty parameter set. :class:`~BaseSamplerV1` implementations can
|
255
|
+
be called via the ``.run()`` method with the following parameters:
|
239
256
|
|
240
257
|
* quantum circuits (:math:`\psi_i(\theta)`): list of (parameterized) quantum circuits.
|
241
258
|
(a list of :class:`~qiskit.circuit.QuantumCircuit` objects)
|
@@ -244,16 +261,20 @@ method. This method is called with the following parameters
|
|
244
261
|
to be bound to the parameters of the quantum circuits.
|
245
262
|
(list of list of float)
|
246
263
|
|
247
|
-
|
264
|
+
``.run()`` will return a :class:`~qiskit.providers.JobV1` object. Calling
|
248
265
|
:meth:`qiskit.providers.JobV1.result()` yields a :class:`~qiskit.primitives.SamplerResult`
|
249
266
|
object, which contains probabilities or quasi-probabilities of bitstrings,
|
250
267
|
plus optional metadata like error bars in the samples.
|
251
268
|
|
252
|
-
Here is an example of how
|
269
|
+
Here is an example of how a ``SamplerV1`` implementation would be used.
|
270
|
+
Note that there are currently no implementations of the legacy ``SamplerV1``
|
271
|
+
interface in Qiskit.
|
253
272
|
|
254
273
|
.. code-block:: python
|
255
274
|
|
256
|
-
|
275
|
+
# This is a fictional import path.
|
276
|
+
# There are currently no SamplerV1 implementations in Qiskit.
|
277
|
+
from sampler_v1_location import Sampler
|
257
278
|
from qiskit import QuantumCircuit
|
258
279
|
from qiskit.circuit.library import RealAmplitudes
|
259
280
|
|
@@ -273,7 +294,7 @@ Here is an example of how sampler is used.
|
|
273
294
|
theta2 = [0, 1, 2, 3, 4, 5, 6, 7]
|
274
295
|
|
275
296
|
# initialization of the sampler
|
276
|
-
sampler =
|
297
|
+
sampler = SamplerV1()
|
277
298
|
|
278
299
|
# Sampler runs a job on the Bell circuit
|
279
300
|
job = sampler.run(
|
@@ -427,10 +448,7 @@ Estimator V1
|
|
427
448
|
.. autosummary::
|
428
449
|
:toctree: ../stubs/
|
429
450
|
|
430
|
-
BaseEstimator
|
431
451
|
BaseEstimatorV1
|
432
|
-
Estimator
|
433
|
-
BackendEstimator
|
434
452
|
EstimatorResult
|
435
453
|
|
436
454
|
|
@@ -440,26 +458,19 @@ Sampler V1
|
|
440
458
|
.. autosummary::
|
441
459
|
:toctree: ../stubs/
|
442
460
|
|
443
|
-
BaseSampler
|
444
461
|
BaseSamplerV1
|
445
|
-
Sampler
|
446
|
-
BackendSampler
|
447
462
|
SamplerResult
|
448
463
|
|
449
464
|
"""
|
450
465
|
|
451
|
-
from .backend_estimator import BackendEstimator
|
452
|
-
from .backend_sampler import BackendSampler
|
453
466
|
from .base import (
|
454
|
-
BaseEstimator,
|
455
467
|
BaseEstimatorV1,
|
456
468
|
BaseEstimatorV2,
|
457
|
-
BaseSampler,
|
458
469
|
BaseSamplerV1,
|
459
470
|
BaseSamplerV2,
|
460
471
|
)
|
461
|
-
from .base.
|
462
|
-
from .base.
|
472
|
+
from .base.estimator_result_v1 import EstimatorResult
|
473
|
+
from .base.sampler_result_v1 import SamplerResult
|
463
474
|
from .containers import (
|
464
475
|
BitArray,
|
465
476
|
DataBin,
|
@@ -472,9 +483,7 @@ from .containers import (
|
|
472
483
|
ObservableLike,
|
473
484
|
ObservablesArrayLike,
|
474
485
|
)
|
475
|
-
from .estimator import Estimator
|
476
486
|
from .primitive_job import BasePrimitiveJob, PrimitiveJob
|
477
|
-
from .sampler import Sampler
|
478
487
|
from .statevector_estimator import StatevectorEstimator
|
479
488
|
from .statevector_sampler import StatevectorSampler
|
480
489
|
from .backend_estimator_v2 import BackendEstimatorV2
|
@@ -15,7 +15,6 @@
|
|
15
15
|
from __future__ import annotations
|
16
16
|
|
17
17
|
import math
|
18
|
-
import warnings
|
19
18
|
from collections import defaultdict
|
20
19
|
from collections.abc import Iterable
|
21
20
|
from dataclasses import dataclass
|
@@ -24,13 +23,12 @@ import numpy as np
|
|
24
23
|
|
25
24
|
from qiskit.circuit import ClassicalRegister, QuantumCircuit, QuantumRegister
|
26
25
|
from qiskit.exceptions import QiskitError
|
27
|
-
from qiskit.providers import
|
26
|
+
from qiskit.providers import BackendV2
|
28
27
|
from qiskit.quantum_info import Pauli, PauliList
|
29
|
-
from qiskit.result import Counts
|
28
|
+
from qiskit.result import Counts, Result
|
30
29
|
from qiskit.transpiler import PassManager, PassManagerConfig
|
31
30
|
from qiskit.transpiler.passes import Optimize1qGatesDecomposition
|
32
31
|
|
33
|
-
from .backend_estimator import _pauli_expval_with_variance, _prepare_counts, _run_circuits
|
34
32
|
from .base import BaseEstimatorV2
|
35
33
|
from .containers import DataBin, EstimatorPubLike, PrimitiveResult, PubResult
|
36
34
|
from .containers.bindings_array import BindingsArray
|
@@ -38,6 +36,103 @@ from .containers.estimator_pub import EstimatorPub
|
|
38
36
|
from .primitive_job import PrimitiveJob
|
39
37
|
|
40
38
|
|
39
|
+
def _run_circuits(
|
40
|
+
circuits: QuantumCircuit | list[QuantumCircuit],
|
41
|
+
backend: BackendV2,
|
42
|
+
clear_metadata: bool = True,
|
43
|
+
**run_options,
|
44
|
+
) -> tuple[list[Result], list[dict]]:
|
45
|
+
"""Remove metadata of circuits and run the circuits on a backend.
|
46
|
+
Args:
|
47
|
+
circuits: The circuits
|
48
|
+
backend: The backend
|
49
|
+
clear_metadata: Clear circuit metadata before passing to backend.run if
|
50
|
+
True.
|
51
|
+
**run_options: run_options
|
52
|
+
Returns:
|
53
|
+
The result and the metadata of the circuits
|
54
|
+
"""
|
55
|
+
if isinstance(circuits, QuantumCircuit):
|
56
|
+
circuits = [circuits]
|
57
|
+
metadata = []
|
58
|
+
for circ in circuits:
|
59
|
+
metadata.append(circ.metadata)
|
60
|
+
if clear_metadata:
|
61
|
+
circ.metadata = {}
|
62
|
+
if isinstance(backend, BackendV2):
|
63
|
+
max_circuits = backend.max_circuits
|
64
|
+
else:
|
65
|
+
raise RuntimeError("Backend version not supported")
|
66
|
+
if max_circuits:
|
67
|
+
jobs = [
|
68
|
+
backend.run(circuits[pos : pos + max_circuits], **run_options)
|
69
|
+
for pos in range(0, len(circuits), max_circuits)
|
70
|
+
]
|
71
|
+
result = [x.result() for x in jobs]
|
72
|
+
else:
|
73
|
+
result = [backend.run(circuits, **run_options).result()]
|
74
|
+
return result, metadata
|
75
|
+
|
76
|
+
|
77
|
+
def _prepare_counts(results: list[Result]):
|
78
|
+
counts = []
|
79
|
+
for res in results:
|
80
|
+
count = res.get_counts()
|
81
|
+
if not isinstance(count, list):
|
82
|
+
count = [count]
|
83
|
+
counts.extend(count)
|
84
|
+
return counts
|
85
|
+
|
86
|
+
|
87
|
+
def _pauli_expval_with_variance(counts: Counts, paulis: PauliList) -> tuple[np.ndarray, np.ndarray]:
|
88
|
+
"""Return array of expval and variance pairs for input Paulis.
|
89
|
+
Note: All non-identity Pauli's are treated as Z-paulis, assuming
|
90
|
+
that basis rotations have been applied to convert them to the
|
91
|
+
diagonal basis.
|
92
|
+
"""
|
93
|
+
# Diag indices
|
94
|
+
size = len(paulis)
|
95
|
+
diag_inds = _paulis2inds(paulis)
|
96
|
+
|
97
|
+
expvals = np.zeros(size, dtype=float)
|
98
|
+
denom = 0 # Total shots for counts dict
|
99
|
+
for bin_outcome, freq in counts.items():
|
100
|
+
split_outcome = bin_outcome.split(" ", 1)[0] if " " in bin_outcome else bin_outcome
|
101
|
+
outcome = int(split_outcome, 2)
|
102
|
+
denom += freq
|
103
|
+
for k in range(size):
|
104
|
+
coeff = (-1) ** _parity(diag_inds[k] & outcome)
|
105
|
+
expvals[k] += freq * coeff
|
106
|
+
|
107
|
+
# Divide by total shots
|
108
|
+
expvals /= denom
|
109
|
+
|
110
|
+
# Compute variance
|
111
|
+
variances = 1 - expvals**2
|
112
|
+
return expvals, variances
|
113
|
+
|
114
|
+
|
115
|
+
def _paulis2inds(paulis: PauliList) -> list[int]:
|
116
|
+
"""Convert PauliList to diagonal integers.
|
117
|
+
These are integer representations of the binary string with a
|
118
|
+
1 where there are Paulis, and 0 where there are identities.
|
119
|
+
"""
|
120
|
+
# Treat Z, X, Y the same
|
121
|
+
nonid = paulis.z | paulis.x
|
122
|
+
|
123
|
+
# bits are packed into uint8 in little endian
|
124
|
+
# e.g., i-th bit corresponds to coefficient 2^i
|
125
|
+
packed_vals = np.packbits(nonid, axis=1, bitorder="little")
|
126
|
+
power_uint8 = 1 << (8 * np.arange(packed_vals.shape[1], dtype=object))
|
127
|
+
inds = packed_vals @ power_uint8
|
128
|
+
return inds.tolist()
|
129
|
+
|
130
|
+
|
131
|
+
def _parity(integer: int) -> int:
|
132
|
+
"""Return the parity of an integer"""
|
133
|
+
return bin(integer).count("1") % 2
|
134
|
+
|
135
|
+
|
41
136
|
@dataclass
|
42
137
|
class Options:
|
43
138
|
"""Options for :class:`~.BackendEstimatorV2`."""
|
@@ -77,7 +172,7 @@ class BackendEstimatorV2(BaseEstimatorV2):
|
|
77
172
|
|
78
173
|
The :class:`~.BackendEstimatorV2` class is a generic implementation of the
|
79
174
|
:class:`~.BaseEstimatorV2` interface that is used to wrap a :class:`~.BackendV2`
|
80
|
-
|
175
|
+
object in the :class:`~.BaseEstimatorV2` API. It
|
81
176
|
facilitates using backends that do not provide a native
|
82
177
|
:class:`~.BaseEstimatorV2` implementation in places that work with
|
83
178
|
:class:`~.BaseEstimatorV2`. However,
|
@@ -128,32 +223,16 @@ class BackendEstimatorV2(BaseEstimatorV2):
|
|
128
223
|
def __init__(
|
129
224
|
self,
|
130
225
|
*,
|
131
|
-
backend:
|
226
|
+
backend: BackendV2,
|
132
227
|
options: dict | None = None,
|
133
228
|
):
|
134
229
|
"""
|
135
|
-
.. deprecated:: 1.4
|
136
|
-
The method ``BackendEstimatorV2.__init__`` will stop supporting inputs of type
|
137
|
-
:class:`.BackendV1` in the `backend` parameter in a future release no
|
138
|
-
earlier than 2.0. :class:`.BackendV1` is deprecated and implementations should
|
139
|
-
move to :class:`.BackendV2`.
|
140
|
-
|
141
230
|
Args:
|
142
231
|
backend: The backend to run the primitive on.
|
143
232
|
options: The options to control the default precision (``default_precision``),
|
144
233
|
the operator grouping (``abelian_grouping``), and
|
145
234
|
the random seed for the simulator (``seed_simulator``).
|
146
235
|
"""
|
147
|
-
|
148
|
-
if not isinstance(backend, BackendV2):
|
149
|
-
warnings.warn(
|
150
|
-
"The method `BackendEstimatorV2.__init__` will stop supporting inputs of "
|
151
|
-
f"type `BackendV1` ( {backend} ) in the `backend` parameter in a future "
|
152
|
-
"release no earlier than 2.0. `BackendV1` is deprecated and implementations "
|
153
|
-
"should move to `BackendV2`.",
|
154
|
-
category=DeprecationWarning,
|
155
|
-
stacklevel=2,
|
156
|
-
)
|
157
236
|
self._backend = backend
|
158
237
|
self._options = Options(**options) if options else Options()
|
159
238
|
|
@@ -170,7 +249,7 @@ class BackendEstimatorV2(BaseEstimatorV2):
|
|
170
249
|
return self._options
|
171
250
|
|
172
251
|
@property
|
173
|
-
def backend(self) ->
|
252
|
+
def backend(self) -> BackendV2:
|
174
253
|
"""Returns the backend which this sampler object based on."""
|
175
254
|
return self._backend
|
176
255
|
|
@@ -24,7 +24,7 @@ from numpy.typing import NDArray
|
|
24
24
|
|
25
25
|
from qiskit.circuit import QuantumCircuit
|
26
26
|
from qiskit.exceptions import QiskitError
|
27
|
-
from qiskit.primitives.
|
27
|
+
from qiskit.primitives.backend_estimator_v2 import _run_circuits
|
28
28
|
from qiskit.primitives.base import BaseSamplerV2
|
29
29
|
from qiskit.primitives.containers import (
|
30
30
|
BitArray,
|
@@ -36,7 +36,7 @@ from qiskit.primitives.containers import (
|
|
36
36
|
from qiskit.primitives.containers.bit_array import _min_num_bytes
|
37
37
|
from qiskit.primitives.containers.sampler_pub import SamplerPub
|
38
38
|
from qiskit.primitives.primitive_job import PrimitiveJob
|
39
|
-
from qiskit.providers.backend import
|
39
|
+
from qiskit.providers.backend import BackendV2
|
40
40
|
from qiskit.result import Result
|
41
41
|
|
42
42
|
|
@@ -83,7 +83,7 @@ class BackendSamplerV2(BaseSamplerV2):
|
|
83
83
|
|
84
84
|
The :class:`~.BackendSamplerV2` class is a generic implementation of the
|
85
85
|
:class:`~.BaseSamplerV2` interface that is used to wrap a :class:`~.BackendV2`
|
86
|
-
|
86
|
+
object in the class :class:`~.BaseSamplerV2` API. It
|
87
87
|
facilitates using backends that do not provide a native
|
88
88
|
:class:`~.BaseSamplerV2` implementation in places that work with
|
89
89
|
:class:`~.BaseSamplerV2`. However,
|
@@ -119,35 +119,20 @@ class BackendSamplerV2(BaseSamplerV2):
|
|
119
119
|
def __init__(
|
120
120
|
self,
|
121
121
|
*,
|
122
|
-
backend:
|
122
|
+
backend: BackendV2,
|
123
123
|
options: dict | None = None,
|
124
124
|
):
|
125
125
|
"""
|
126
|
-
.. deprecated:: 1.4
|
127
|
-
The method ``BackendSamplerV2.__init__`` will stop supporting inputs of type
|
128
|
-
:class:`.BackendV1` in the `backend` parameter in a future release no
|
129
|
-
earlier than 2.0. :class:`.BackendV1` is deprecated and implementations should
|
130
|
-
move to :class:`.BackendV2`.
|
131
|
-
|
132
126
|
Args:
|
133
127
|
backend: The backend to run the primitive on.
|
134
128
|
options: The options to control the default shots (``default_shots``) and
|
135
129
|
the random seed for the simulator (``seed_simulator``).
|
136
130
|
"""
|
137
|
-
if not isinstance(backend, BackendV2):
|
138
|
-
warnings.warn(
|
139
|
-
"The method `BackendSamplerV2.__init__` will stop supporting inputs of "
|
140
|
-
f"type `BackendV1` ( {backend} ) in the `backend` parameter in a future "
|
141
|
-
"release no earlier than 2.0. `BackendV1` is deprecated and implementations "
|
142
|
-
"should move to `BackendV2`.",
|
143
|
-
category=DeprecationWarning,
|
144
|
-
stacklevel=2,
|
145
|
-
)
|
146
131
|
self._backend = backend
|
147
132
|
self._options = Options(**options) if options else Options()
|
148
133
|
|
149
134
|
@property
|
150
|
-
def backend(self) ->
|
135
|
+
def backend(self) -> BackendV2:
|
151
136
|
"""Returns the backend which this sampler object based on."""
|
152
137
|
return self._backend
|
153
138
|
|
@@ -14,7 +14,7 @@
|
|
14
14
|
Abstract base classes for primitives module.
|
15
15
|
"""
|
16
16
|
|
17
|
-
from .base_sampler import
|
18
|
-
from .base_estimator import
|
19
|
-
from .
|
20
|
-
from .
|
17
|
+
from .base_sampler import BaseSamplerV1, BaseSamplerV2
|
18
|
+
from .base_estimator import BaseEstimatorV1, BaseEstimatorV2
|
19
|
+
from .estimator_result_v1 import EstimatorResult
|
20
|
+
from .sampler_result_v1 import SamplerResult
|
@@ -23,7 +23,6 @@ from qiskit.circuit import QuantumCircuit
|
|
23
23
|
from qiskit.providers import JobV1 as Job
|
24
24
|
from qiskit.quantum_info.operators import SparsePauliOp
|
25
25
|
from qiskit.quantum_info.operators.base_operator import BaseOperator
|
26
|
-
from qiskit.utils.deprecation import deprecate_func
|
27
26
|
|
28
27
|
from ..containers import (
|
29
28
|
DataBin,
|
@@ -32,22 +31,81 @@ from ..containers import (
|
|
32
31
|
PubResult,
|
33
32
|
)
|
34
33
|
from ..containers.estimator_pub import EstimatorPub
|
35
|
-
from . import
|
36
|
-
from .
|
34
|
+
from .validation_v1 import _validate_estimator_args
|
35
|
+
from .base_primitive_v1 import BasePrimitiveV1
|
37
36
|
from .base_primitive_job import BasePrimitiveJob
|
38
37
|
|
39
38
|
T = TypeVar("T", bound=Job)
|
40
39
|
|
41
40
|
|
42
|
-
class
|
43
|
-
r"""
|
41
|
+
class BaseEstimatorV2(ABC):
|
42
|
+
r"""Base class for ``EstimatorV2`` implementations.
|
43
|
+
|
44
|
+
An estimator calculates expectation values for provided quantum circuit and
|
45
|
+
observable combinations. Implementations of this :class:`.BaseEstimatorV2`
|
46
|
+
interface must define their own :meth:`.run` method, which is designed to
|
47
|
+
take the following inputs:
|
48
|
+
|
49
|
+
* pubs: list of pubs (Primitive Unified Blocs). An estimator pub is a list
|
50
|
+
or tuple of two to four elements that define the unit of work for the
|
51
|
+
estimator. These are:
|
52
|
+
|
53
|
+
* A single :class:`~qiskit.circuit.QuantumCircuit`, possibly parametrized,
|
54
|
+
whose final state we define as :math:`\psi(\theta)`.
|
55
|
+
|
56
|
+
* One or more observables (specified as any :class:`~.ObservablesArrayLike`, including
|
57
|
+
:class:`~.Pauli`, :class:`~.SparsePauliOp`, ``str``) that specify which expectation
|
58
|
+
values to estimate, denoted :math:`H_j`.
|
59
|
+
|
60
|
+
* A collection parameter value sets to bind the circuit against, :math:`\theta_k`
|
44
61
|
|
45
|
-
|
62
|
+
* Optionally, the estimation precision.
|
46
63
|
|
47
|
-
|
48
|
-
|
49
|
-
|
50
|
-
|
64
|
+
* precision: the estimation precision. This specification is optional and will be overriden by
|
65
|
+
the pub-wise shots if provided.
|
66
|
+
|
67
|
+
All estimator implementations must implement default value for the ``precision`` in the
|
68
|
+
:meth:`.run` method. This default value will be used any time ``precision=None`` is specified, which
|
69
|
+
can take place in the :meth:`.run` kwargs or at the pub level.
|
70
|
+
"""
|
71
|
+
|
72
|
+
@staticmethod
|
73
|
+
def _make_data_bin(_: EstimatorPub) -> type[DataBin]:
|
74
|
+
# this method is present for backwards compat. new primitive implementations
|
75
|
+
# should avoid it.
|
76
|
+
return DataBin
|
77
|
+
|
78
|
+
@abstractmethod
|
79
|
+
def run(
|
80
|
+
self, pubs: Iterable[EstimatorPubLike], *, precision: float | None = None
|
81
|
+
) -> BasePrimitiveJob[PrimitiveResult[PubResult]]:
|
82
|
+
"""Estimate expectation values for each provided pub (Primitive Unified Bloc).
|
83
|
+
|
84
|
+
Args:
|
85
|
+
pubs: An iterable of pub-like objects, such as tuples ``(circuit, observables)``
|
86
|
+
or ``(circuit, observables, parameter_values)``.
|
87
|
+
precision: The target precision for expectation value estimates of each
|
88
|
+
run Estimator Pub that does not specify its own precision. If None
|
89
|
+
the estimator's default precision value will be used.
|
90
|
+
|
91
|
+
Returns:
|
92
|
+
A job object that contains results.
|
93
|
+
"""
|
94
|
+
|
95
|
+
|
96
|
+
class BaseEstimatorV1(BasePrimitiveV1, Generic[T]):
|
97
|
+
r"""Base class for ``EstimatorV1`` implementations.
|
98
|
+
|
99
|
+
Note that the reference estimator in Qiskit follows the ``EstimatorV2``
|
100
|
+
interface specifications instead.
|
101
|
+
|
102
|
+
An estimator calculates expectation values for provided quantum circuit and
|
103
|
+
observable combinations.
|
104
|
+
|
105
|
+
Implementations of :class:`.BaseEstimatorV1` should define their own
|
106
|
+
:meth:`.BaseEstimatorV1._run` method
|
107
|
+
that will be called by the public-facing :meth:`qiskit.primitives.BaseEstimatorV1.run`,
|
108
|
+
which takes the following inputs:
|
51
109
|
|
52
110
|
* quantum circuits (:math:`\psi_i(\theta)`): list of (parameterized) quantum circuits
|
53
111
|
(a list of :class:`~qiskit.circuit.QuantumCircuit` objects).
|
@@ -59,7 +117,7 @@ class BaseEstimatorV1(BasePrimitive, Generic[T]):
|
|
59
117
|
to be bound to the parameters of the quantum circuits
|
60
118
|
(list of list of float).
|
61
119
|
|
62
|
-
The method returns a :class:`~qiskit.providers.JobV1` object
|
120
|
+
The method returns a :class:`~qiskit.providers.JobV1` object. Calling
|
63
121
|
:meth:`qiskit.providers.JobV1.result()` yields the
|
64
122
|
a list of expectation values plus optional metadata like confidence intervals for
|
65
123
|
the estimation.
|
@@ -68,11 +126,13 @@ class BaseEstimatorV1(BasePrimitive, Generic[T]):
|
|
68
126
|
|
69
127
|
\langle\psi_i(\theta_k)|H_j|\psi_i(\theta_k)\rangle
|
70
128
|
|
71
|
-
Here is an example of how
|
129
|
+
Here is an example of how a :class:`.BaseEstimatorV1` would be used:
|
72
130
|
|
73
131
|
.. code-block:: python
|
74
132
|
|
75
|
-
|
133
|
+
# This is a fictional import path.
|
134
|
+
# There are currently no EstimatorV1 implementations in Qiskit.
|
135
|
+
from estimator_v1_location import EstimatorV1
|
76
136
|
from qiskit.circuit.library import RealAmplitudes
|
77
137
|
from qiskit.quantum_info import SparsePauliOp
|
78
138
|
|
@@ -87,7 +147,7 @@ class BaseEstimatorV1(BasePrimitive, Generic[T]):
|
|
87
147
|
theta2 = [0, 1, 1, 2, 3, 5, 8, 13]
|
88
148
|
theta3 = [1, 2, 3, 4, 5, 6]
|
89
149
|
|
90
|
-
estimator =
|
150
|
+
estimator = EstimatorV1()
|
91
151
|
|
92
152
|
# calculate [ <psi1(theta1)|H1|psi1(theta1)> ]
|
93
153
|
job = estimator.run([psi1], [H1], [theta1])
|
@@ -110,8 +170,7 @@ class BaseEstimatorV1(BasePrimitive, Generic[T]):
|
|
110
170
|
options: dict | None = None,
|
111
171
|
):
|
112
172
|
"""
|
113
|
-
|
114
|
-
holds resources until the instance is ``close()`` ed or the context is exited.
|
173
|
+
Initialize ``EstimatorV1``.
|
115
174
|
|
116
175
|
Args:
|
117
176
|
options: Default options.
|
@@ -162,7 +221,7 @@ class BaseEstimatorV1(BasePrimitive, Generic[T]):
|
|
162
221
|
ValueError: Invalid argument values given.
|
163
222
|
"""
|
164
223
|
# Validation
|
165
|
-
circuits, observables, parameter_values =
|
224
|
+
circuits, observables, parameter_values = _validate_estimator_args(
|
166
225
|
circuits, observables, parameter_values
|
167
226
|
)
|
168
227
|
|
@@ -185,68 +244,4 @@ class BaseEstimatorV1(BasePrimitive, Generic[T]):
|
|
185
244
|
parameter_values: tuple[tuple[float, ...], ...],
|
186
245
|
**run_options,
|
187
246
|
) -> T:
|
188
|
-
raise NotImplementedError("The subclass of
|
189
|
-
|
190
|
-
|
191
|
-
class BaseEstimator(BaseEstimatorV1[T]):
|
192
|
-
"""DEPRECATED. Type alias for Estimator V1 base class.
|
193
|
-
|
194
|
-
See :class:`.BaseEstimatorV1` for details.
|
195
|
-
"""
|
196
|
-
|
197
|
-
@deprecate_func(
|
198
|
-
since="1.2",
|
199
|
-
additional_msg="The `BaseEstimator` class is a type alias for the `BaseEstimatorV1` "
|
200
|
-
"interface that has been deprecated in favor of explicitly versioned interface classes. "
|
201
|
-
"It is recommended to migrate all implementations to use `BaseEstimatorV2`. "
|
202
|
-
"However, for implementations incompatible with `BaseEstimatorV2`, `BaseEstimator` can "
|
203
|
-
"be replaced with the explicitly versioned `BaseEstimatorV1` class.",
|
204
|
-
)
|
205
|
-
def __init__(
|
206
|
-
self,
|
207
|
-
*,
|
208
|
-
options: dict | None = None,
|
209
|
-
):
|
210
|
-
"""
|
211
|
-
Creating an instance of an Estimator, or using one in a ``with`` context opens a session that
|
212
|
-
holds resources until the instance is ``close()`` ed or the context is exited.
|
213
|
-
|
214
|
-
Args:
|
215
|
-
options: Default options.
|
216
|
-
"""
|
217
|
-
super().__init__(options=options)
|
218
|
-
|
219
|
-
|
220
|
-
class BaseEstimatorV2(ABC):
|
221
|
-
r"""Estimator V2 base class.
|
222
|
-
|
223
|
-
An estimator estimates expectation values for provided quantum circuit and
|
224
|
-
observable combinations.
|
225
|
-
|
226
|
-
An Estimator implementation must treat the :meth:`.run` method ``precision=None``
|
227
|
-
kwarg as using a default ``precision`` value. The default value and methods to
|
228
|
-
set it can be determined by the Estimator implementor.
|
229
|
-
"""
|
230
|
-
|
231
|
-
@staticmethod
|
232
|
-
def _make_data_bin(_: EstimatorPub) -> type[DataBin]:
|
233
|
-
# this method is present for backwards compat. new primitive implementations
|
234
|
-
# should avoid it.
|
235
|
-
return DataBin
|
236
|
-
|
237
|
-
@abstractmethod
|
238
|
-
def run(
|
239
|
-
self, pubs: Iterable[EstimatorPubLike], *, precision: float | None = None
|
240
|
-
) -> BasePrimitiveJob[PrimitiveResult[PubResult]]:
|
241
|
-
"""Estimate expectation values for each provided pub (Primitive Unified Bloc).
|
242
|
-
|
243
|
-
Args:
|
244
|
-
pubs: An iterable of pub-like objects, such as tuples ``(circuit, observables)``
|
245
|
-
or ``(circuit, observables, parameter_values)``.
|
246
|
-
precision: The target precision for expectation value estimates of each
|
247
|
-
run Estimator Pub that does not specify its own precision. If None
|
248
|
-
the estimator's default precision value will be used.
|
249
|
-
|
250
|
-
Returns:
|
251
|
-
A job object that contains results.
|
252
|
-
"""
|
247
|
+
raise NotImplementedError("The subclass of BaseEstimatorV1 must implement `_run` method.")
|
@@ -17,9 +17,9 @@ from abc import ABC, abstractmethod
|
|
17
17
|
from typing import Generic, TypeVar, Union
|
18
18
|
|
19
19
|
from ..containers import PrimitiveResult
|
20
|
-
from .
|
20
|
+
from .base_result_v1 import _BasePrimitiveResultV1
|
21
21
|
|
22
|
-
ResultT = TypeVar("ResultT", bound=Union[
|
22
|
+
ResultT = TypeVar("ResultT", bound=Union[_BasePrimitiveResultV1, PrimitiveResult])
|
23
23
|
StatusT = TypeVar("StatusT")
|
24
24
|
|
25
25
|
|