Open emamars95 opened 1 month ago
qiskit_algorithms
is a separate package (and sadly doesn't have much maintainer activity anymore) - there's nothing we can do about it from this repository. The right repository is https://github.com/qiskit-community/qiskit-algorithms, but I should warn you that there's not much activity, since it's no longer supported by the core Qiskit team.
Yes, I actually wanted to post the issue in qiskit-algorithms. I noticed I chose in the wrong repo only after posting the issues (never do this kind of things at the end day 😂).
I see. I will open a pull request there and see if someone can moderate the request with me. I will ask the community there if they need another pair of eyes to help them out. Thanks for the heads up anyway!
Environment
What is happening?
Since the release of the version Qiskit 1.2 the class
Sampler
is deprecated. With this choice we require that all implementations of theBaseSamplerV1
interface have been deprecated in favour of their V2 counterparts. The V2 alternative for theSampler
class isStatevectorSampler
.The class
HamiltonianPhaseEstimation
has not be modified to accommodate this modification and still uses theBaseSamplerV1
Sampler class. At the moment, the code is still working with the exception of printing a DeprecationWarning. However, once theSampler
class will be removed it will generate an error.At the moment
StatevectorSampler
CANNOT be used as sampler for theHamiltonianPhaseEstimation
. This is due to the implementation of the functionestimate_from_pe_circuit
in the moduleqiskit_algorithms/phase_estimators/phase_estimation.py
.How can we reproduce the issue?
Import required modules
Use the
Sampler
class to run theHamiltonianPhaseEstimation
/tmp/ipykernel_1033530/360718787.py:1: DeprecationWarning: The class
qiskit.primitives.sampler.Sampler
is deprecated ...Use the
StatevectorSampler
leads to an error:--> 6 qpe_result = qpe.estimate(hamiltonian=SparsePauliOp('XZ'),
File ~/qiskit_algorithms/phase_estimators/hamiltonian_phase_estimation.py:173, in HamiltonianPhaseEstimation.estimate(self, hamiltonian, state_preparation, evolution, bound)
--> 173 phase_estimation_result = self._phase_estimation.estimate( 174 unitary=unitary, state_preparation=state_preparation)
File ~/qiskit_algorithms/phase_estimators/phase_estimation.py:230, in PhaseEstimation.estimate(self, unitary, state_preparation)
--> 230 return self.estimate_from_pe_circuit(pe_circuit)
File ~/qiskit_algorithms/phase_estimators/phase_estimation.py:199, in PhaseEstimation.estimate_from_pe_circuit(self, pe_circuit)
--> 199 phases = circuit_result.quasi_dists[0]
AttributeError: 'PrimitiveResult' object has no attribute 'quasi_dists'
The reason of the error arise because the
BaseSamplerV1
provides a result that is a quasi distribution, whileBaseSamplerV2
return a primitive unified blocs (PUB) results which is inconsistent with the actual implementation.What should happen?
The
estimate_from_pe_circuit
function in phase_estimation.py should check which Sampler is passed on and allow back-compatibility, in case it is passed theBaseSamplerV1
, and also allow the usage of the suggestedBaseSamplerV2
Any suggestions?
I am happy to open a pull request to modify the code from the current implementation
To my suggested implementation:
Further modification is the annotation of the classes as
sampler: BaseSampler | BaseSamplerV2 | None = None
. I am open to discuss wheatear the check of the Sampler type is more appropriate in the initialization of thePhaseEstimation
object.