qiskit 1.1.2__cp38-abi3-macosx_10_9_universal2.whl → 1.2.0__cp38-abi3-macosx_10_9_universal2.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 +27 -24
- qiskit/_accelerate.abi3.so +0 -0
- qiskit/_numpy_compat.py +1 -1
- qiskit/assembler/assemble_circuits.py +107 -64
- qiskit/assembler/assemble_schedules.py +5 -12
- qiskit/assembler/disassemble.py +10 -1
- qiskit/circuit/__init__.py +6 -3
- qiskit/circuit/_classical_resource_map.py +5 -5
- qiskit/circuit/_utils.py +0 -13
- qiskit/circuit/add_control.py +1 -1
- qiskit/circuit/annotated_operation.py +23 -1
- qiskit/circuit/classical/expr/expr.py +4 -4
- qiskit/circuit/classical/expr/visitors.py +1 -1
- qiskit/circuit/classical/types/__init__.py +1 -1
- qiskit/circuit/classical/types/types.py +2 -2
- qiskit/circuit/classicalfunction/boolean_expression.py +1 -1
- qiskit/circuit/classicalfunction/classical_function_visitor.py +5 -5
- qiskit/circuit/classicalfunction/utils.py +1 -1
- qiskit/circuit/classicalregister.py +1 -1
- qiskit/circuit/commutation_checker.py +83 -35
- qiskit/circuit/controlflow/_builder_utils.py +1 -1
- qiskit/circuit/controlflow/builder.py +10 -6
- qiskit/circuit/controlflow/if_else.py +2 -2
- qiskit/circuit/controlflow/switch_case.py +1 -1
- qiskit/circuit/delay.py +1 -1
- qiskit/circuit/duration.py +2 -2
- qiskit/circuit/equivalence.py +5 -7
- qiskit/circuit/gate.py +11 -8
- qiskit/circuit/instruction.py +31 -13
- qiskit/circuit/instructionset.py +2 -5
- qiskit/circuit/library/__init__.py +2 -1
- qiskit/circuit/library/arithmetic/linear_amplitude_function.py +1 -1
- qiskit/circuit/library/arithmetic/linear_pauli_rotations.py +1 -1
- qiskit/circuit/library/arithmetic/piecewise_chebyshev.py +1 -1
- qiskit/circuit/library/arithmetic/piecewise_linear_pauli_rotations.py +1 -1
- qiskit/circuit/library/arithmetic/piecewise_polynomial_pauli_rotations.py +3 -3
- qiskit/circuit/library/arithmetic/polynomial_pauli_rotations.py +1 -1
- qiskit/circuit/library/basis_change/__init__.py +1 -1
- qiskit/circuit/library/basis_change/qft.py +40 -6
- qiskit/circuit/library/blueprintcircuit.py +3 -5
- qiskit/circuit/library/data_preparation/__init__.py +9 -2
- qiskit/circuit/library/data_preparation/initializer.py +8 -0
- qiskit/circuit/library/data_preparation/state_preparation.py +98 -178
- qiskit/circuit/library/generalized_gates/isometry.py +8 -8
- qiskit/circuit/library/generalized_gates/linear_function.py +3 -2
- qiskit/circuit/library/generalized_gates/mcg_up_to_diagonal.py +4 -4
- qiskit/circuit/library/generalized_gates/permutation.py +8 -9
- qiskit/circuit/library/generalized_gates/uc.py +3 -3
- qiskit/circuit/library/generalized_gates/uc_pauli_rot.py +2 -2
- qiskit/circuit/library/generalized_gates/unitary.py +13 -11
- qiskit/circuit/library/graph_state.py +1 -1
- qiskit/circuit/library/hamiltonian_gate.py +1 -2
- qiskit/circuit/library/hidden_linear_function.py +1 -1
- qiskit/circuit/library/n_local/evolved_operator_ansatz.py +3 -2
- qiskit/circuit/library/n_local/n_local.py +4 -5
- qiskit/circuit/library/n_local/pauli_two_design.py +1 -1
- qiskit/circuit/library/n_local/qaoa_ansatz.py +6 -8
- qiskit/circuit/library/n_local/two_local.py +1 -1
- qiskit/circuit/library/overlap.py +11 -5
- qiskit/circuit/library/pauli_evolution.py +7 -3
- qiskit/circuit/library/standard_gates/dcx.py +3 -0
- qiskit/circuit/library/standard_gates/ecr.py +3 -0
- qiskit/circuit/library/standard_gates/global_phase.py +3 -0
- qiskit/circuit/library/standard_gates/h.py +13 -5
- qiskit/circuit/library/standard_gates/i.py +3 -0
- qiskit/circuit/library/standard_gates/iswap.py +3 -0
- qiskit/circuit/library/standard_gates/multi_control_rotation_gates.py +19 -10
- qiskit/circuit/library/standard_gates/p.py +14 -9
- qiskit/circuit/library/standard_gates/r.py +3 -0
- qiskit/circuit/library/standard_gates/rx.py +21 -6
- qiskit/circuit/library/standard_gates/rxx.py +40 -1
- qiskit/circuit/library/standard_gates/ry.py +21 -6
- qiskit/circuit/library/standard_gates/ryy.py +40 -1
- qiskit/circuit/library/standard_gates/rz.py +22 -6
- qiskit/circuit/library/standard_gates/rzx.py +40 -1
- qiskit/circuit/library/standard_gates/rzz.py +41 -2
- qiskit/circuit/library/standard_gates/s.py +77 -0
- qiskit/circuit/library/standard_gates/swap.py +12 -5
- qiskit/circuit/library/standard_gates/sx.py +14 -5
- qiskit/circuit/library/standard_gates/t.py +5 -0
- qiskit/circuit/library/standard_gates/u.py +22 -7
- qiskit/circuit/library/standard_gates/u1.py +8 -3
- qiskit/circuit/library/standard_gates/u2.py +3 -0
- qiskit/circuit/library/standard_gates/u3.py +22 -7
- qiskit/circuit/library/standard_gates/x.py +156 -92
- qiskit/circuit/library/standard_gates/xx_minus_yy.py +40 -1
- qiskit/circuit/library/standard_gates/xx_plus_yy.py +52 -11
- qiskit/circuit/library/standard_gates/y.py +6 -1
- qiskit/circuit/library/standard_gates/z.py +8 -1
- qiskit/circuit/operation.py +1 -1
- qiskit/circuit/parameter.py +9 -10
- qiskit/circuit/parameterexpression.py +16 -13
- qiskit/circuit/parametertable.py +1 -190
- qiskit/circuit/parametervector.py +1 -1
- qiskit/circuit/quantumcircuit.py +395 -387
- qiskit/circuit/quantumcircuitdata.py +3 -5
- qiskit/circuit/quantumregister.py +1 -1
- qiskit/circuit/random/__init__.py +1 -1
- qiskit/circuit/random/utils.py +175 -26
- qiskit/circuit/register.py +5 -7
- qiskit/circuit/singleton.py +3 -3
- qiskit/circuit/tools/pi_check.py +4 -4
- qiskit/compiler/assembler.py +95 -24
- qiskit/compiler/scheduler.py +2 -2
- qiskit/compiler/transpiler.py +42 -128
- qiskit/converters/circuit_to_dag.py +4 -6
- qiskit/converters/circuit_to_gate.py +4 -8
- qiskit/converters/circuit_to_instruction.py +5 -17
- qiskit/converters/dag_to_circuit.py +2 -6
- qiskit/dagcircuit/collect_blocks.py +2 -2
- qiskit/dagcircuit/dagcircuit.py +190 -187
- qiskit/dagcircuit/dagdependency.py +4 -4
- qiskit/dagcircuit/dagdependency_v2.py +4 -4
- qiskit/dagcircuit/dagdepnode.py +1 -1
- qiskit/dagcircuit/dagnode.py +66 -157
- qiskit/passmanager/flow_controllers.py +1 -1
- qiskit/passmanager/passmanager.py +3 -3
- qiskit/primitives/__init__.py +1 -5
- qiskit/primitives/backend_estimator.py +25 -15
- qiskit/primitives/backend_estimator_v2.py +31 -7
- qiskit/primitives/backend_sampler.py +21 -12
- qiskit/primitives/backend_sampler_v2.py +12 -3
- qiskit/primitives/base/base_estimator.py +31 -4
- qiskit/primitives/base/base_primitive.py +2 -2
- qiskit/primitives/base/base_result.py +2 -2
- qiskit/primitives/base/base_sampler.py +26 -2
- qiskit/primitives/base/estimator_result.py +2 -2
- qiskit/primitives/base/sampler_result.py +2 -2
- qiskit/primitives/containers/__init__.py +0 -1
- qiskit/primitives/containers/bindings_array.py +2 -2
- qiskit/primitives/containers/bit_array.py +108 -10
- qiskit/primitives/containers/shape.py +3 -3
- qiskit/primitives/estimator.py +9 -2
- qiskit/primitives/primitive_job.py +1 -1
- qiskit/primitives/sampler.py +10 -3
- qiskit/primitives/statevector_estimator.py +5 -3
- qiskit/primitives/statevector_sampler.py +11 -5
- qiskit/primitives/utils.py +16 -0
- qiskit/providers/backend.py +15 -6
- qiskit/providers/backend_compat.py +7 -4
- qiskit/providers/basic_provider/basic_provider_tools.py +1 -1
- qiskit/providers/basic_provider/basic_simulator.py +33 -25
- qiskit/providers/fake_provider/fake_backend.py +10 -3
- qiskit/providers/fake_provider/fake_openpulse_2q.py +157 -149
- qiskit/providers/fake_provider/fake_openpulse_3q.py +228 -220
- qiskit/providers/fake_provider/fake_pulse_backend.py +2 -1
- qiskit/providers/fake_provider/fake_qasm_backend.py +7 -2
- qiskit/providers/fake_provider/generic_backend_v2.py +514 -68
- qiskit/providers/models/__init__.py +48 -11
- qiskit/providers/models/backendconfiguration.py +50 -4
- qiskit/providers/models/backendproperties.py +13 -2
- qiskit/providers/models/pulsedefaults.py +10 -11
- qiskit/providers/options.py +13 -13
- qiskit/providers/providerutils.py +3 -1
- qiskit/pulse/configuration.py +8 -12
- qiskit/pulse/instruction_schedule_map.py +3 -5
- qiskit/pulse/instructions/acquire.py +7 -8
- qiskit/pulse/instructions/instruction.py +2 -3
- qiskit/pulse/library/samplers/decorators.py +5 -9
- qiskit/pulse/library/symbolic_pulses.py +4 -7
- qiskit/pulse/library/waveform.py +2 -5
- qiskit/pulse/macros.py +11 -6
- qiskit/pulse/parser.py +8 -10
- qiskit/pulse/schedule.py +9 -17
- qiskit/pulse/transforms/alignments.py +1 -3
- qiskit/pulse/utils.py +1 -2
- qiskit/qasm/libs/stdgates.inc +35 -28
- qiskit/qasm2/__init__.py +7 -7
- qiskit/qasm2/export.py +5 -9
- qiskit/qasm2/parse.py +1 -1
- qiskit/qasm3/ast.py +9 -25
- qiskit/qasm3/exporter.py +582 -479
- qiskit/qasm3/printer.py +7 -16
- qiskit/qobj/common.py +10 -0
- qiskit/qobj/converters/lo_config.py +9 -0
- qiskit/qobj/converters/pulse_instruction.py +13 -6
- qiskit/qobj/pulse_qobj.py +69 -15
- qiskit/qobj/qasm_qobj.py +72 -20
- qiskit/qobj/utils.py +9 -0
- qiskit/qpy/__init__.py +1 -1
- qiskit/qpy/binary_io/circuits.py +8 -5
- qiskit/qpy/binary_io/schedules.py +1 -1
- qiskit/qpy/binary_io/value.py +3 -3
- qiskit/qpy/interface.py +3 -2
- qiskit/qpy/type_keys.py +2 -2
- qiskit/quantum_info/operators/channel/quantum_channel.py +3 -6
- qiskit/quantum_info/operators/channel/superop.py +2 -2
- qiskit/quantum_info/operators/channel/transformations.py +1 -1
- qiskit/quantum_info/operators/dihedral/dihedral.py +3 -4
- qiskit/quantum_info/operators/dihedral/dihedral_circuits.py +1 -3
- qiskit/quantum_info/operators/dihedral/random.py +6 -3
- qiskit/quantum_info/operators/measures.py +2 -2
- qiskit/quantum_info/operators/op_shape.py +12 -20
- qiskit/quantum_info/operators/operator.py +14 -21
- qiskit/quantum_info/operators/predicates.py +1 -0
- qiskit/quantum_info/operators/symplectic/base_pauli.py +7 -11
- qiskit/quantum_info/operators/symplectic/clifford.py +1 -1
- qiskit/quantum_info/operators/symplectic/pauli.py +3 -3
- qiskit/quantum_info/operators/symplectic/pauli_list.py +9 -10
- qiskit/quantum_info/operators/symplectic/random.py +1 -1
- qiskit/quantum_info/operators/symplectic/sparse_pauli_op.py +15 -17
- qiskit/quantum_info/quaternion.py +1 -1
- qiskit/quantum_info/states/densitymatrix.py +5 -8
- qiskit/quantum_info/states/stabilizerstate.py +128 -37
- qiskit/quantum_info/states/statevector.py +4 -8
- qiskit/result/counts.py +2 -2
- qiskit/result/mitigation/correlated_readout_mitigator.py +2 -2
- qiskit/result/mitigation/local_readout_mitigator.py +2 -2
- qiskit/result/mitigation/utils.py +1 -3
- qiskit/result/models.py +17 -16
- qiskit/result/result.py +15 -20
- qiskit/scheduler/lowering.py +2 -2
- qiskit/synthesis/__init__.py +2 -1
- qiskit/synthesis/clifford/__init__.py +1 -1
- qiskit/synthesis/clifford/clifford_decompose_ag.py +2 -2
- qiskit/synthesis/clifford/clifford_decompose_bm.py +10 -240
- qiskit/synthesis/clifford/clifford_decompose_greedy.py +9 -303
- qiskit/synthesis/clifford/clifford_decompose_layers.py +25 -23
- qiskit/synthesis/cnotdihedral/cnotdihedral_decompose_full.py +1 -1
- qiskit/synthesis/cnotdihedral/cnotdihedral_decompose_general.py +1 -1
- qiskit/synthesis/discrete_basis/generate_basis_approximations.py +1 -1
- qiskit/synthesis/discrete_basis/solovay_kitaev.py +2 -2
- qiskit/synthesis/evolution/evolution_synthesis.py +4 -2
- qiskit/synthesis/evolution/lie_trotter.py +46 -19
- qiskit/synthesis/evolution/product_formula.py +111 -55
- qiskit/synthesis/evolution/qdrift.py +40 -10
- qiskit/synthesis/evolution/suzuki_trotter.py +43 -33
- qiskit/synthesis/linear/__init__.py +1 -0
- qiskit/synthesis/linear/cnot_synth.py +22 -96
- qiskit/synthesis/linear/linear_depth_lnn.py +8 -8
- qiskit/synthesis/linear/linear_matrix_utils.py +13 -161
- qiskit/synthesis/linear_phase/cnot_phase_synth.py +1 -1
- qiskit/synthesis/linear_phase/cx_cz_depth_lnn.py +3 -3
- qiskit/synthesis/linear_phase/cz_depth_lnn.py +1 -1
- qiskit/synthesis/one_qubit/one_qubit_decompose.py +29 -29
- qiskit/synthesis/permutation/permutation_full.py +5 -29
- qiskit/synthesis/permutation/permutation_lnn.py +2 -24
- qiskit/synthesis/permutation/permutation_utils.py +2 -59
- qiskit/synthesis/qft/__init__.py +1 -0
- qiskit/synthesis/qft/qft_decompose_full.py +79 -0
- qiskit/synthesis/qft/qft_decompose_lnn.py +17 -9
- qiskit/synthesis/stabilizer/stabilizer_circuit.py +6 -6
- qiskit/synthesis/stabilizer/stabilizer_decompose.py +2 -2
- qiskit/synthesis/two_qubit/local_invariance.py +8 -38
- qiskit/synthesis/two_qubit/two_qubit_decompose.py +48 -129
- qiskit/synthesis/unitary/aqc/cnot_structures.py +1 -1
- qiskit/synthesis/unitary/qsd.py +5 -3
- qiskit/transpiler/__init__.py +1 -0
- qiskit/transpiler/basepasses.py +1 -1
- qiskit/transpiler/coupling.py +3 -3
- qiskit/transpiler/instruction_durations.py +1 -2
- qiskit/transpiler/layout.py +3 -3
- qiskit/transpiler/passes/__init__.py +2 -0
- qiskit/transpiler/passes/basis/basis_translator.py +84 -64
- qiskit/transpiler/passes/basis/translate_parameterized.py +3 -5
- qiskit/transpiler/passes/basis/unroll_3q_or_more.py +1 -1
- qiskit/transpiler/passes/basis/unroll_custom_definitions.py +10 -10
- qiskit/transpiler/passes/calibration/rx_builder.py +3 -3
- qiskit/transpiler/passes/calibration/rzx_builder.py +3 -3
- qiskit/transpiler/passes/layout/apply_layout.py +13 -3
- qiskit/transpiler/passes/layout/sabre_layout.py +10 -8
- qiskit/transpiler/passes/layout/sabre_pre_layout.py +4 -1
- qiskit/transpiler/passes/layout/set_layout.py +2 -2
- qiskit/transpiler/passes/layout/vf2_layout.py +1 -1
- qiskit/transpiler/passes/layout/vf2_utils.py +3 -3
- qiskit/transpiler/passes/optimization/__init__.py +1 -0
- qiskit/transpiler/passes/optimization/collect_multiqubit_blocks.py +2 -2
- qiskit/transpiler/passes/optimization/commutation_analysis.py +7 -10
- qiskit/transpiler/passes/optimization/commutative_cancellation.py +35 -19
- qiskit/transpiler/passes/optimization/consolidate_blocks.py +17 -8
- qiskit/transpiler/passes/optimization/inverse_cancellation.py +6 -6
- qiskit/transpiler/passes/optimization/optimize_1q_decomposition.py +64 -41
- qiskit/transpiler/passes/optimization/optimize_1q_gates.py +1 -1
- qiskit/transpiler/passes/optimization/split_2q_unitaries.py +83 -0
- qiskit/transpiler/passes/optimization/template_matching/backward_match.py +1 -1
- qiskit/transpiler/passes/optimization/template_matching/forward_match.py +2 -2
- qiskit/transpiler/passes/optimization/template_matching/template_substitution.py +1 -1
- qiskit/transpiler/passes/routing/commuting_2q_gate_routing/commuting_2q_gate_router.py +3 -2
- qiskit/transpiler/passes/routing/commuting_2q_gate_routing/swap_strategy.py +1 -1
- qiskit/transpiler/passes/routing/layout_transformation.py +2 -1
- qiskit/transpiler/passes/routing/sabre_swap.py +35 -26
- qiskit/transpiler/passes/routing/star_prerouting.py +80 -105
- qiskit/transpiler/passes/routing/stochastic_swap.py +1 -3
- qiskit/transpiler/passes/scheduling/alap.py +1 -2
- qiskit/transpiler/passes/scheduling/alignments/__init__.py +2 -2
- qiskit/transpiler/passes/scheduling/alignments/check_durations.py +1 -1
- qiskit/transpiler/passes/scheduling/alignments/pulse_gate_validation.py +2 -2
- qiskit/transpiler/passes/scheduling/alignments/reschedule.py +1 -1
- qiskit/transpiler/passes/scheduling/asap.py +1 -2
- qiskit/transpiler/passes/scheduling/base_scheduler.py +5 -5
- qiskit/transpiler/passes/scheduling/dynamical_decoupling.py +3 -3
- qiskit/transpiler/passes/scheduling/padding/base_padding.py +1 -1
- qiskit/transpiler/passes/scheduling/padding/dynamical_decoupling.py +20 -14
- qiskit/transpiler/passes/scheduling/scheduling/base_scheduler.py +7 -6
- qiskit/transpiler/passes/scheduling/time_unit_conversion.py +4 -3
- qiskit/transpiler/passes/synthesis/high_level_synthesis.py +211 -36
- qiskit/transpiler/passes/synthesis/plugin.py +2 -2
- qiskit/transpiler/passes/synthesis/unitary_synthesis.py +80 -40
- qiskit/transpiler/passes/utils/__init__.py +0 -1
- qiskit/transpiler/passes/utils/check_gate_direction.py +4 -4
- qiskit/transpiler/passes/utils/check_map.py +3 -6
- qiskit/transpiler/passes/utils/convert_conditions_to_if_ops.py +3 -4
- qiskit/transpiler/passes/utils/error.py +2 -2
- qiskit/transpiler/passes/utils/fixed_point.py +3 -3
- qiskit/transpiler/passes/utils/gate_direction.py +1 -1
- qiskit/transpiler/passes/utils/gates_basis.py +1 -2
- qiskit/transpiler/passmanager.py +7 -6
- qiskit/transpiler/preset_passmanagers/__init__.py +4 -228
- qiskit/transpiler/preset_passmanagers/builtin_plugins.py +73 -18
- qiskit/transpiler/preset_passmanagers/common.py +3 -6
- qiskit/transpiler/preset_passmanagers/generate_preset_pass_manager.py +518 -0
- qiskit/transpiler/preset_passmanagers/level0.py +1 -1
- qiskit/transpiler/target.py +27 -8
- qiskit/user_config.py +29 -6
- qiskit/utils/classtools.py +3 -3
- qiskit/utils/deprecation.py +3 -2
- qiskit/utils/lazy_tester.py +2 -2
- qiskit/utils/optionals.py +8 -8
- qiskit/visualization/bloch.py +18 -23
- qiskit/visualization/circuit/_utils.py +34 -10
- qiskit/visualization/circuit/circuit_visualization.py +23 -16
- qiskit/visualization/circuit/latex.py +29 -27
- qiskit/visualization/circuit/matplotlib.py +4 -2
- qiskit/visualization/circuit/qcstyle.py +2 -2
- qiskit/visualization/circuit/text.py +9 -15
- qiskit/visualization/dag_visualization.py +2 -2
- qiskit/visualization/pulse_v2/core.py +1 -1
- qiskit/visualization/pulse_v2/events.py +1 -1
- qiskit/visualization/pulse_v2/generators/frame.py +3 -4
- qiskit/visualization/pulse_v2/generators/waveform.py +5 -9
- qiskit/visualization/pulse_v2/layouts.py +1 -5
- qiskit/visualization/pulse_v2/plotters/matplotlib.py +1 -2
- qiskit/visualization/state_visualization.py +5 -6
- qiskit/visualization/timeline/plotters/matplotlib.py +1 -2
- qiskit/visualization/transition_visualization.py +7 -2
- {qiskit-1.1.2.dist-info → qiskit-1.2.0.dist-info}/METADATA +12 -12
- {qiskit-1.1.2.dist-info → qiskit-1.2.0.dist-info}/RECORD +342 -340
- {qiskit-1.1.2.dist-info → qiskit-1.2.0.dist-info}/entry_points.txt +3 -0
- qiskit/transpiler/passes/utils/block_to_matrix.py +0 -47
- {qiskit-1.1.2.dist-info → qiskit-1.2.0.dist-info}/LICENSE.txt +0 -0
- {qiskit-1.1.2.dist-info → qiskit-1.2.0.dist-info}/WHEEL +0 -0
- {qiskit-1.1.2.dist-info → qiskit-1.2.0.dist-info}/top_level.txt +0 -0
@@ -155,7 +155,7 @@ class BackendSamplerV2(BaseSamplerV2):
|
|
155
155
|
# reconstruct the result of pubs
|
156
156
|
for i, pub_result in zip(lst, pub_results):
|
157
157
|
results[i] = pub_result
|
158
|
-
return PrimitiveResult(results)
|
158
|
+
return PrimitiveResult(results, metadata={"version": 2})
|
159
159
|
|
160
160
|
def _run_pubs(self, pubs: list[SamplerPub], shots: int) -> list[SamplerPubResult]:
|
161
161
|
"""Compute results for pubs that all require the same value of ``shots``."""
|
@@ -183,7 +183,12 @@ class BackendSamplerV2(BaseSamplerV2):
|
|
183
183
|
end = start + bound.size
|
184
184
|
results.append(
|
185
185
|
self._postprocess_pub(
|
186
|
-
result_memory[start:end],
|
186
|
+
result_memory[start:end],
|
187
|
+
shots,
|
188
|
+
bound.shape,
|
189
|
+
meas_info,
|
190
|
+
max_num_bytes,
|
191
|
+
pub.circuit.metadata,
|
187
192
|
)
|
188
193
|
)
|
189
194
|
start = end
|
@@ -197,6 +202,7 @@ class BackendSamplerV2(BaseSamplerV2):
|
|
197
202
|
shape: tuple[int, ...],
|
198
203
|
meas_info: list[_MeasureInfo],
|
199
204
|
max_num_bytes: int,
|
205
|
+
circuit_metadata: dict,
|
200
206
|
) -> SamplerPubResult:
|
201
207
|
"""Converts the memory data into an array of bit arrays with the shape of the pub."""
|
202
208
|
arrays = {
|
@@ -213,7 +219,10 @@ class BackendSamplerV2(BaseSamplerV2):
|
|
213
219
|
meas = {
|
214
220
|
item.creg_name: BitArray(arrays[item.creg_name], item.num_bits) for item in meas_info
|
215
221
|
}
|
216
|
-
return SamplerPubResult(
|
222
|
+
return SamplerPubResult(
|
223
|
+
DataBin(**meas, shape=shape),
|
224
|
+
metadata={"shots": shots, "circuit_metadata": circuit_metadata},
|
225
|
+
)
|
217
226
|
|
218
227
|
|
219
228
|
def _analyze_circuit(circuit: QuantumCircuit) -> tuple[list[_MeasureInfo], int]:
|
@@ -10,7 +10,7 @@
|
|
10
10
|
# copyright notice, and modified files need to carry a notice indicating
|
11
11
|
# that they have been altered from the originals.
|
12
12
|
|
13
|
-
|
13
|
+
"""Base Estimator V1 and V2 classes"""
|
14
14
|
|
15
15
|
from __future__ import annotations
|
16
16
|
|
@@ -23,6 +23,7 @@ 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
|
26
27
|
|
27
28
|
from ..containers import (
|
28
29
|
DataBin,
|
@@ -109,7 +110,7 @@ class BaseEstimatorV1(BasePrimitive, Generic[T]):
|
|
109
110
|
options: dict | None = None,
|
110
111
|
):
|
111
112
|
"""
|
112
|
-
Creating an instance of an Estimator, or using one in a ``with`` context opens a session that
|
113
|
+
Creating an instance of an Estimator V1, or using one in a ``with`` context opens a session that
|
113
114
|
holds resources until the instance is ``close()`` ed or the context is exited.
|
114
115
|
|
115
116
|
Args:
|
@@ -187,7 +188,33 @@ class BaseEstimatorV1(BasePrimitive, Generic[T]):
|
|
187
188
|
raise NotImplementedError("The subclass of BaseEstimator must implement `_run` method.")
|
188
189
|
|
189
190
|
|
190
|
-
BaseEstimator
|
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)
|
191
218
|
|
192
219
|
|
193
220
|
class BaseEstimatorV2(ABC):
|
@@ -203,7 +230,7 @@ class BaseEstimatorV2(ABC):
|
|
203
230
|
|
204
231
|
@staticmethod
|
205
232
|
def _make_data_bin(_: EstimatorPub) -> type[DataBin]:
|
206
|
-
# this method is present for backwards compat. new primitive
|
233
|
+
# this method is present for backwards compat. new primitive implementations
|
207
234
|
# should avoid it.
|
208
235
|
return DataBin
|
209
236
|
|
@@ -10,7 +10,7 @@
|
|
10
10
|
# copyright notice, and modified files need to carry a notice indicating
|
11
11
|
# that they have been altered from the originals.
|
12
12
|
|
13
|
-
"""Primitive abstract base class."""
|
13
|
+
"""Primitive V1 abstract base class."""
|
14
14
|
|
15
15
|
from __future__ import annotations
|
16
16
|
|
@@ -20,7 +20,7 @@ from qiskit.providers import Options
|
|
20
20
|
|
21
21
|
|
22
22
|
class BasePrimitive(ABC):
|
23
|
-
"""Primitive abstract base class."""
|
23
|
+
"""Primitive V1 abstract base class."""
|
24
24
|
|
25
25
|
def __init__(self, options: dict | None = None):
|
26
26
|
self._run_options = Options()
|
@@ -10,7 +10,7 @@
|
|
10
10
|
# copyright notice, and modified files need to carry a notice indicating
|
11
11
|
# that they have been altered from the originals.
|
12
12
|
"""
|
13
|
-
Primitive result abstract base class
|
13
|
+
Primitive V1 result abstract base class
|
14
14
|
"""
|
15
15
|
|
16
16
|
from __future__ import annotations
|
@@ -27,7 +27,7 @@ ExperimentData = Dict[str, Any]
|
|
27
27
|
|
28
28
|
class _BasePrimitiveResult(ABC):
|
29
29
|
"""
|
30
|
-
Base class for deprecated Primitive result methods.
|
30
|
+
Base class for deprecated Primitive V1 result methods.
|
31
31
|
"""
|
32
32
|
|
33
33
|
def __post_init__(self) -> None:
|
@@ -10,7 +10,7 @@
|
|
10
10
|
# copyright notice, and modified files need to carry a notice indicating
|
11
11
|
# that they have been altered from the originals.
|
12
12
|
|
13
|
-
"""Base Sampler
|
13
|
+
"""Base Sampler V1 and V2 classes"""
|
14
14
|
|
15
15
|
from __future__ import annotations
|
16
16
|
|
@@ -21,6 +21,7 @@ from typing import Generic, TypeVar
|
|
21
21
|
|
22
22
|
from qiskit.circuit import QuantumCircuit
|
23
23
|
from qiskit.providers import JobV1 as Job
|
24
|
+
from qiskit.utils.deprecation import deprecate_func
|
24
25
|
|
25
26
|
from ..containers.primitive_result import PrimitiveResult
|
26
27
|
from ..containers.sampler_pub import SamplerPubLike
|
@@ -150,7 +151,30 @@ class BaseSamplerV1(BasePrimitive, Generic[T]):
|
|
150
151
|
raise NotImplementedError("The subclass of BaseSampler must implement `_run` method.")
|
151
152
|
|
152
153
|
|
153
|
-
BaseSampler
|
154
|
+
class BaseSampler(BaseSamplerV1[T]):
|
155
|
+
"""DEPRECATED. Type alias for Sampler V1 base class
|
156
|
+
|
157
|
+
See :class:`.BaseSamplerV1` for details.
|
158
|
+
"""
|
159
|
+
|
160
|
+
@deprecate_func(
|
161
|
+
since="1.2",
|
162
|
+
additional_msg="The `BaseSampler` class is a type alias for the `BaseSamplerV1` "
|
163
|
+
"interface that has been deprecated in favor of explicitly versioned interface classes. "
|
164
|
+
"It is recommended to migrate all implementations to use `BaseSamplerV2`. "
|
165
|
+
"However, for implementations incompatible with `BaseSamplerV2`, `BaseSampler` can "
|
166
|
+
"be replaced with the explicitly versioned `BaseSamplerV1` class.",
|
167
|
+
)
|
168
|
+
def __init__(
|
169
|
+
self,
|
170
|
+
*,
|
171
|
+
options: dict | None = None,
|
172
|
+
):
|
173
|
+
"""
|
174
|
+
Args:
|
175
|
+
options: Default options.
|
176
|
+
"""
|
177
|
+
super().__init__(options=options)
|
154
178
|
|
155
179
|
|
156
180
|
class BaseSamplerV2(ABC):
|
@@ -10,7 +10,7 @@
|
|
10
10
|
# copyright notice, and modified files need to carry a notice indicating
|
11
11
|
# that they have been altered from the originals.
|
12
12
|
"""
|
13
|
-
Estimator result class
|
13
|
+
Estimator V1 result class
|
14
14
|
"""
|
15
15
|
|
16
16
|
from __future__ import annotations
|
@@ -26,7 +26,7 @@ if TYPE_CHECKING:
|
|
26
26
|
|
27
27
|
@dataclass(frozen=True)
|
28
28
|
class EstimatorResult(_BasePrimitiveResult):
|
29
|
-
"""Result of Estimator.
|
29
|
+
"""Result of Estimator V1.
|
30
30
|
|
31
31
|
.. code-block:: python
|
32
32
|
|
@@ -10,7 +10,7 @@
|
|
10
10
|
# copyright notice, and modified files need to carry a notice indicating
|
11
11
|
# that they have been altered from the originals.
|
12
12
|
"""
|
13
|
-
Sampler result class
|
13
|
+
Sampler V1 result class
|
14
14
|
"""
|
15
15
|
|
16
16
|
from __future__ import annotations
|
@@ -25,7 +25,7 @@ from .base_result import _BasePrimitiveResult
|
|
25
25
|
|
26
26
|
@dataclass(frozen=True)
|
27
27
|
class SamplerResult(_BasePrimitiveResult):
|
28
|
-
"""Result of Sampler.
|
28
|
+
"""Result of Sampler V1.
|
29
29
|
|
30
30
|
.. code-block:: python
|
31
31
|
|
@@ -95,7 +95,7 @@ class BindingsArray(ShapedMixin):
|
|
95
95
|
be inferred from the provided arrays. Ambiguity arises whenever the key of an entry of
|
96
96
|
``data`` contains only one parameter and the corresponding array's shape ends in a one.
|
97
97
|
In this case, it can't be decided whether that one is an index over parameters, or whether
|
98
|
-
it should be
|
98
|
+
it should be incorporated in :attr:`~shape`.
|
99
99
|
|
100
100
|
Since :class:`~.Parameter` objects are only allowed to represent float values, this
|
101
101
|
class casts all given values to float. If an incompatible dtype is given, such as complex
|
@@ -131,7 +131,7 @@ class BindingsArray(ShapedMixin):
|
|
131
131
|
|
132
132
|
def __getitem__(self, args) -> BindingsArray:
|
133
133
|
# because the parameters live on the last axis, we don't need to do anything special to
|
134
|
-
#
|
134
|
+
# accommodate them because there will always be an implicit slice(None, None, None)
|
135
135
|
# on all unspecified trailing dimensions
|
136
136
|
# separately, we choose to not disallow args which touch the last dimension, even though it
|
137
137
|
# would not be a particularly friendly way to chop parameters
|
@@ -130,11 +130,15 @@ class BitArray(ShapedMixin):
|
|
130
130
|
return f"BitArray({desc})"
|
131
131
|
|
132
132
|
def __getitem__(self, indices):
|
133
|
-
|
134
|
-
|
135
|
-
|
136
|
-
|
137
|
-
|
133
|
+
if isinstance(indices, tuple):
|
134
|
+
if len(indices) == self.ndim + 1:
|
135
|
+
raise IndexError(
|
136
|
+
"BitArray cannot be sliced along the shots axis, use slice_shots() instead."
|
137
|
+
)
|
138
|
+
if len(indices) >= self.ndim + 2:
|
139
|
+
raise IndexError(
|
140
|
+
"BitArray cannot be sliced along the bits axis, use slice_bits() instead."
|
141
|
+
)
|
138
142
|
return BitArray(self._array[indices], self.num_bits)
|
139
143
|
|
140
144
|
@property
|
@@ -208,7 +212,10 @@ class BitArray(ShapedMixin):
|
|
208
212
|
if order == "little":
|
209
213
|
# np.unpackbits assumes "big"
|
210
214
|
array = array[..., ::-1]
|
211
|
-
|
215
|
+
elif order != "big":
|
216
|
+
raise ValueError(
|
217
|
+
f"unknown value for order: '{order}'. Valid values are 'big' and 'little'."
|
218
|
+
)
|
212
219
|
num_bits = array.shape[-1]
|
213
220
|
if remainder := (-num_bits) % 8:
|
214
221
|
# unpackbits pads with zeros on the wrong side with respect to what we want, so
|
@@ -428,13 +435,13 @@ class BitArray(ShapedMixin):
|
|
428
435
|
A bit array sliced along the bit axis.
|
429
436
|
|
430
437
|
Raises:
|
431
|
-
|
438
|
+
IndexError: If there are any invalid indices of the bit axis.
|
432
439
|
"""
|
433
440
|
if isinstance(indices, int):
|
434
441
|
indices = (indices,)
|
435
442
|
for index in indices:
|
436
443
|
if index < 0 or index >= self.num_bits:
|
437
|
-
raise
|
444
|
+
raise IndexError(
|
438
445
|
f"index {index} is out of bounds for the number of bits {self.num_bits}."
|
439
446
|
)
|
440
447
|
# This implementation introduces a temporary 8x memory overhead due to bit
|
@@ -455,19 +462,110 @@ class BitArray(ShapedMixin):
|
|
455
462
|
A bit array sliced along the shots axis.
|
456
463
|
|
457
464
|
Raises:
|
458
|
-
|
465
|
+
IndexError: If there are any invalid indices of the shots axis.
|
459
466
|
"""
|
460
467
|
if isinstance(indices, int):
|
461
468
|
indices = (indices,)
|
462
469
|
for index in indices:
|
463
470
|
if index < 0 or index >= self.num_shots:
|
464
|
-
raise
|
471
|
+
raise IndexError(
|
465
472
|
f"index {index} is out of bounds for the number of shots {self.num_shots}."
|
466
473
|
)
|
467
474
|
arr = self._array
|
468
475
|
arr = arr[..., indices, :]
|
469
476
|
return BitArray(arr, self.num_bits)
|
470
477
|
|
478
|
+
def postselect(
|
479
|
+
self,
|
480
|
+
indices: Sequence[int] | int,
|
481
|
+
selection: Sequence[bool | int] | bool | int,
|
482
|
+
) -> BitArray:
|
483
|
+
"""Post-select this bit array based on sliced equality with a given bitstring.
|
484
|
+
|
485
|
+
.. note::
|
486
|
+
If this bit array contains any shape axes, it is first flattened into a long list of shots
|
487
|
+
before applying post-selection. This is done because :class:`~BitArray` cannot handle
|
488
|
+
ragged numbers of shots across axes.
|
489
|
+
|
490
|
+
Args:
|
491
|
+
indices: A list of the indices of the cbits on which to postselect.
|
492
|
+
If this bit array was produced by a sampler, then an index ``i`` corresponds to the
|
493
|
+
:class:`~.ClassicalRegister` location ``creg[i]`` (as in :meth:`~slice_bits`).
|
494
|
+
Negative indices are allowed.
|
495
|
+
|
496
|
+
selection: A list of binary values (will be cast to ``bool``) of length matching
|
497
|
+
``indices``, with ``indices[i]`` corresponding to ``selection[i]``. Shots will be
|
498
|
+
discarded unless all cbits specified by ``indices`` have the values given by
|
499
|
+
``selection``.
|
500
|
+
|
501
|
+
Returns:
|
502
|
+
A new bit array with ``shape=(), num_bits=data.num_bits, num_shots<=data.num_shots``.
|
503
|
+
|
504
|
+
Raises:
|
505
|
+
IndexError: If ``max(indices)`` is greater than or equal to :attr:`num_bits`.
|
506
|
+
IndexError: If ``min(indices)`` is less than negative :attr:`num_bits`.
|
507
|
+
ValueError: If the lengths of ``selection`` and ``indices`` do not match.
|
508
|
+
"""
|
509
|
+
if isinstance(indices, int):
|
510
|
+
indices = (indices,)
|
511
|
+
if isinstance(selection, (bool, int)):
|
512
|
+
selection = (selection,)
|
513
|
+
selection = np.asarray(selection, dtype=bool)
|
514
|
+
|
515
|
+
num_indices = len(indices)
|
516
|
+
|
517
|
+
if len(selection) != num_indices:
|
518
|
+
raise ValueError("Lengths of indices and selection do not match.")
|
519
|
+
|
520
|
+
num_bytes = self._array.shape[-1]
|
521
|
+
indices = np.asarray(indices)
|
522
|
+
|
523
|
+
if num_indices > 0:
|
524
|
+
if indices.max() >= self.num_bits:
|
525
|
+
raise IndexError(
|
526
|
+
f"index {int(indices.max())} out of bounds for the number of bits {self.num_bits}."
|
527
|
+
)
|
528
|
+
if indices.min() < -self.num_bits:
|
529
|
+
raise IndexError(
|
530
|
+
f"index {int(indices.min())} out of bounds for the number of bits {self.num_bits}."
|
531
|
+
)
|
532
|
+
|
533
|
+
flattened = self.reshape((), self.size * self.num_shots)
|
534
|
+
|
535
|
+
# If no conditions, keep all data, but flatten as promised:
|
536
|
+
if num_indices == 0:
|
537
|
+
return flattened
|
538
|
+
|
539
|
+
# Make negative bit indices positive:
|
540
|
+
indices %= self.num_bits
|
541
|
+
|
542
|
+
# Handle special-case of contradictory conditions:
|
543
|
+
if np.intersect1d(indices[selection], indices[np.logical_not(selection)]).size > 0:
|
544
|
+
return BitArray(np.empty((0, num_bytes), dtype=np.uint8), num_bits=self.num_bits)
|
545
|
+
|
546
|
+
# Recall that creg[0] is the LSb:
|
547
|
+
byte_significance, bit_significance = np.divmod(indices, 8)
|
548
|
+
# least-significant byte is at last position:
|
549
|
+
byte_idx = (num_bytes - 1) - byte_significance
|
550
|
+
# least-significant bit is at position 0:
|
551
|
+
bit_offset = bit_significance.astype(np.uint8)
|
552
|
+
|
553
|
+
# Get bitpacked representation of `indices` (bitmask):
|
554
|
+
bitmask = np.zeros(num_bytes, dtype=np.uint8)
|
555
|
+
np.bitwise_or.at(bitmask, byte_idx, np.uint8(1) << bit_offset)
|
556
|
+
|
557
|
+
# Get bitpacked representation of `selection` (desired bitstring):
|
558
|
+
selection_bytes = np.zeros(num_bytes, dtype=np.uint8)
|
559
|
+
## This assumes no contradictions present, since those were already checked for:
|
560
|
+
np.bitwise_or.at(
|
561
|
+
selection_bytes, byte_idx, np.asarray(selection, dtype=np.uint8) << bit_offset
|
562
|
+
)
|
563
|
+
|
564
|
+
return BitArray(
|
565
|
+
flattened._array[((flattened._array & bitmask) == selection_bytes).all(axis=-1)],
|
566
|
+
num_bits=self.num_bits,
|
567
|
+
)
|
568
|
+
|
471
569
|
def expectation_values(self, observables: ObservablesArrayLike) -> NDArray[np.float64]:
|
472
570
|
"""Compute the expectation values of the provided observables, broadcasted against
|
473
571
|
this bit array.
|
@@ -59,15 +59,15 @@ class ShapedMixin(Shaped):
|
|
59
59
|
return f"{type(self).__name__}(<{self.shape}>)"
|
60
60
|
|
61
61
|
@property
|
62
|
-
def shape(self)
|
62
|
+
def shape(self):
|
63
63
|
return self._shape
|
64
64
|
|
65
65
|
@property
|
66
|
-
def ndim(self)
|
66
|
+
def ndim(self):
|
67
67
|
return len(self._shape)
|
68
68
|
|
69
69
|
@property
|
70
|
-
def size(self)
|
70
|
+
def size(self):
|
71
71
|
return int(np.prod(self._shape, dtype=int))
|
72
72
|
|
73
73
|
|
qiskit/primitives/estimator.py
CHANGED
@@ -10,7 +10,7 @@
|
|
10
10
|
# copyright notice, and modified files need to carry a notice indicating
|
11
11
|
# that they have been altered from the originals.
|
12
12
|
"""
|
13
|
-
Estimator
|
13
|
+
Estimator V1 reference implementation
|
14
14
|
"""
|
15
15
|
|
16
16
|
from __future__ import annotations
|
@@ -24,6 +24,7 @@ from qiskit.circuit import QuantumCircuit
|
|
24
24
|
from qiskit.exceptions import QiskitError
|
25
25
|
from qiskit.quantum_info import Statevector
|
26
26
|
from qiskit.quantum_info.operators.base_operator import BaseOperator
|
27
|
+
from qiskit.utils.deprecation import deprecate_func
|
27
28
|
|
28
29
|
from .base import BaseEstimator, EstimatorResult
|
29
30
|
from .primitive_job import PrimitiveJob
|
@@ -37,7 +38,7 @@ from .utils import (
|
|
37
38
|
|
38
39
|
class Estimator(BaseEstimator[PrimitiveJob[EstimatorResult]]):
|
39
40
|
"""
|
40
|
-
Reference implementation of :class:`BaseEstimator
|
41
|
+
Reference implementation of :class:`BaseEstimator` (V1).
|
41
42
|
|
42
43
|
:Run Options:
|
43
44
|
|
@@ -51,6 +52,12 @@ class Estimator(BaseEstimator[PrimitiveJob[EstimatorResult]]):
|
|
51
52
|
this option is ignored.
|
52
53
|
"""
|
53
54
|
|
55
|
+
@deprecate_func(
|
56
|
+
since="1.2",
|
57
|
+
additional_msg="All implementations of the `BaseEstimatorV1` interface "
|
58
|
+
"have been deprecated in favor of their V2 counterparts. "
|
59
|
+
"The V2 alternative for the `Estimator` class is `StatevectorEstimator`.",
|
60
|
+
)
|
54
61
|
def __init__(self, *, options: dict | None = None):
|
55
62
|
"""
|
56
63
|
Args:
|
@@ -10,7 +10,7 @@
|
|
10
10
|
# copyright notice, and modified files need to carry a notice indicating
|
11
11
|
# that they have been altered from the originals.
|
12
12
|
"""
|
13
|
-
Job
|
13
|
+
Job for the reference implementations of Primitives V1 and V2.
|
14
14
|
"""
|
15
15
|
|
16
16
|
import uuid
|
qiskit/primitives/sampler.py
CHANGED
@@ -10,7 +10,7 @@
|
|
10
10
|
# copyright notice, and modified files need to carry a notice indicating
|
11
11
|
# that they have been altered from the originals.
|
12
12
|
"""
|
13
|
-
Sampler
|
13
|
+
Sampler V1 reference implementation
|
14
14
|
"""
|
15
15
|
|
16
16
|
from __future__ import annotations
|
@@ -24,6 +24,7 @@ from qiskit.circuit import QuantumCircuit
|
|
24
24
|
from qiskit.exceptions import QiskitError
|
25
25
|
from qiskit.quantum_info import Statevector
|
26
26
|
from qiskit.result import QuasiDistribution
|
27
|
+
from qiskit.utils.deprecation import deprecate_func
|
27
28
|
|
28
29
|
from .base import BaseSampler, SamplerResult
|
29
30
|
from .primitive_job import PrimitiveJob
|
@@ -37,9 +38,9 @@ from .utils import (
|
|
37
38
|
|
38
39
|
class Sampler(BaseSampler[PrimitiveJob[SamplerResult]]):
|
39
40
|
"""
|
40
|
-
Sampler class.
|
41
|
+
Sampler V1 class.
|
41
42
|
|
42
|
-
:class:`~Sampler` is a reference implementation of :class:`~BaseSampler
|
43
|
+
:class:`~Sampler` is a reference implementation of :class:`~BaseSampler` (V1).
|
43
44
|
|
44
45
|
:Run Options:
|
45
46
|
|
@@ -52,6 +53,12 @@ class Sampler(BaseSampler[PrimitiveJob[SamplerResult]]):
|
|
52
53
|
option is ignored.
|
53
54
|
"""
|
54
55
|
|
56
|
+
@deprecate_func(
|
57
|
+
since="1.2",
|
58
|
+
additional_msg="All implementations of the `BaseSamplerV1` interface "
|
59
|
+
"have been deprecated in favor of their V2 counterparts. "
|
60
|
+
"The V2 alternative for the `Sampler` class is `StatevectorSampler`.",
|
61
|
+
)
|
55
62
|
def __init__(self, *, options: dict | None = None):
|
56
63
|
"""
|
57
64
|
Args:
|
@@ -10,7 +10,7 @@
|
|
10
10
|
# copyright notice, and modified files need to carry a notice indicating
|
11
11
|
# that they have been altered from the originals.
|
12
12
|
"""
|
13
|
-
Estimator class
|
13
|
+
Statevector Estimator V2 class
|
14
14
|
"""
|
15
15
|
|
16
16
|
from __future__ import annotations
|
@@ -136,7 +136,7 @@ class StatevectorEstimator(BaseEstimatorV2):
|
|
136
136
|
return job
|
137
137
|
|
138
138
|
def _run(self, pubs: list[EstimatorPub]) -> PrimitiveResult[PubResult]:
|
139
|
-
return PrimitiveResult([self._run_pub(pub) for pub in pubs])
|
139
|
+
return PrimitiveResult([self._run_pub(pub) for pub in pubs], metadata={"version": 2})
|
140
140
|
|
141
141
|
def _run_pub(self, pub: EstimatorPub) -> PubResult:
|
142
142
|
rng = np.random.default_rng(self._seed)
|
@@ -162,4 +162,6 @@ class StatevectorEstimator(BaseEstimatorV2):
|
|
162
162
|
evs[index] = expectation_value
|
163
163
|
|
164
164
|
data = DataBin(evs=evs, stds=stds, shape=evs.shape)
|
165
|
-
return PubResult(
|
165
|
+
return PubResult(
|
166
|
+
data, metadata={"target_precision": precision, "circuit_metadata": pub.circuit.metadata}
|
167
|
+
)
|
@@ -10,7 +10,7 @@
|
|
10
10
|
# copyright notice, and modified files need to carry a notice indicating
|
11
11
|
# that they have been altered from the originals.
|
12
12
|
"""
|
13
|
-
Statevector Sampler class
|
13
|
+
Statevector Sampler V2 class
|
14
14
|
"""
|
15
15
|
|
16
16
|
from __future__ import annotations
|
@@ -171,7 +171,7 @@ class StatevectorSampler(BaseSamplerV2):
|
|
171
171
|
|
172
172
|
def _run(self, pubs: Iterable[SamplerPub]) -> PrimitiveResult[SamplerPubResult]:
|
173
173
|
results = [self._run_pub(pub) for pub in pubs]
|
174
|
-
return PrimitiveResult(results)
|
174
|
+
return PrimitiveResult(results, metadata={"version": 2})
|
175
175
|
|
176
176
|
def _run_pub(self, pub: SamplerPub) -> SamplerPubResult:
|
177
177
|
circuit, qargs, meas_info = _preprocess_circuit(pub.circuit)
|
@@ -197,7 +197,10 @@ class StatevectorSampler(BaseSamplerV2):
|
|
197
197
|
meas = {
|
198
198
|
item.creg_name: BitArray(arrays[item.creg_name], item.num_bits) for item in meas_info
|
199
199
|
}
|
200
|
-
return SamplerPubResult(
|
200
|
+
return SamplerPubResult(
|
201
|
+
DataBin(**meas, shape=pub.shape),
|
202
|
+
metadata={"shots": pub.shots, "circuit_metadata": pub.circuit.metadata},
|
203
|
+
)
|
201
204
|
|
202
205
|
|
203
206
|
def _preprocess_circuit(circuit: QuantumCircuit):
|
@@ -207,7 +210,7 @@ def _preprocess_circuit(circuit: QuantumCircuit):
|
|
207
210
|
qargs_index = {v: k for k, v in enumerate(qargs)}
|
208
211
|
circuit = circuit.remove_final_measurements(inplace=False)
|
209
212
|
if _has_control_flow(circuit):
|
210
|
-
raise QiskitError("StatevectorSampler cannot handle ControlFlowOp")
|
213
|
+
raise QiskitError("StatevectorSampler cannot handle ControlFlowOp and c_if")
|
211
214
|
if _has_measure(circuit):
|
212
215
|
raise QiskitError("StatevectorSampler cannot handle mid-circuit measurements")
|
213
216
|
# num_qubits is used as sentinel to fill 0 in _samples_to_packed_array
|
@@ -283,4 +286,7 @@ def _final_measurement_mapping(circuit: QuantumCircuit) -> dict[tuple[ClassicalR
|
|
283
286
|
|
284
287
|
|
285
288
|
def _has_control_flow(circuit: QuantumCircuit) -> bool:
|
286
|
-
return any(
|
289
|
+
return any(
|
290
|
+
isinstance((op := instruction.operation), ControlFlowOp) or op.condition
|
291
|
+
for instruction in circuit
|
292
|
+
)
|
qiskit/primitives/utils.py
CHANGED
@@ -25,8 +25,14 @@ from qiskit.exceptions import QiskitError
|
|
25
25
|
from qiskit.quantum_info import PauliList, SparsePauliOp, Statevector
|
26
26
|
from qiskit.quantum_info.operators.base_operator import BaseOperator
|
27
27
|
from qiskit.quantum_info.operators.symplectic.base_pauli import BasePauli
|
28
|
+
from qiskit.utils.deprecation import deprecate_func
|
28
29
|
|
29
30
|
|
31
|
+
@deprecate_func(
|
32
|
+
since="1.2",
|
33
|
+
additional_msg="To initialize a circuit from a ``Statevector`` instance, "
|
34
|
+
+ "use ``QuantumCircuit.initialize`` instead.",
|
35
|
+
)
|
30
36
|
def init_circuit(state: QuantumCircuit | Statevector) -> QuantumCircuit:
|
31
37
|
"""Initialize state by converting the input to a quantum circuit.
|
32
38
|
|
@@ -45,6 +51,10 @@ def init_circuit(state: QuantumCircuit | Statevector) -> QuantumCircuit:
|
|
45
51
|
return qc
|
46
52
|
|
47
53
|
|
54
|
+
@deprecate_func(
|
55
|
+
since="1.2",
|
56
|
+
additional_msg="Use the constructor of ``SparsePauliOp`` instead.",
|
57
|
+
)
|
48
58
|
def init_observable(observable: BaseOperator | str) -> SparsePauliOp:
|
49
59
|
"""Initialize observable by converting the input to a :class:`~qiskit.quantum_info.SparsePauliOp`.
|
50
60
|
|
@@ -68,6 +78,12 @@ def init_observable(observable: BaseOperator | str) -> SparsePauliOp:
|
|
68
78
|
return SparsePauliOp(observable)
|
69
79
|
|
70
80
|
|
81
|
+
@deprecate_func(
|
82
|
+
since="1.2",
|
83
|
+
additional_msg="Use ``QuantumCircuit.layout`` and ``SparsePauliOp.apply_layout`` "
|
84
|
+
+ "to adjust an operator for a layout. Otherwise, use ``mthree.utils.final_measurement_mapping``. "
|
85
|
+
+ "See https://qiskit-extensions.github.io/mthree/apidocs/utils.html for details.",
|
86
|
+
)
|
71
87
|
def final_measurement_mapping(circuit: QuantumCircuit) -> dict[int, int]:
|
72
88
|
"""Return the final measurement mapping for the circuit.
|
73
89
|
|