Deprecate `PauliList` estimator observables (#11055)

* Deprecate PauliList estimator observables

Deprecates using a `PauliList` as an observable that is implicitly converted to a `SparsePauliOp` with coefficients 1 when calling `Estimator.run`. Users should instead explicitly convert the argument using `SparsePauliOp(pauli_list)` first.

* Revert algorithms_test_case.py

* Update test/python/algorithms/algorithms_test_case.py

Co-authored-by: Takashi Imamichi <31178928+t-imamichi@users.noreply.github.com>

* Update test/python/primitives/test_estimator.py

---------

Co-authored-by: Takashi Imamichi <31178928+t-imamichi@users.noreply.github.com>
Co-authored-by: ikkoham <ikkoham@users.noreply.github.com>
This commit is contained in:
Christopher J. Wood 2023-11-02 01:08:20 -04:00 committed by GitHub
parent 5a948c2eb3
commit 34773f348f
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
3 changed files with 31 additions and 6 deletions

View File

@ -14,6 +14,7 @@ Utility functions for primitives
"""
from __future__ import annotations
import warnings
import sys
import typing
from collections.abc import Iterable
@ -23,7 +24,7 @@ import numpy as np
from qiskit.circuit import Instruction, ParameterExpression, QuantumCircuit
from qiskit.circuit.bit import Bit
from qiskit.circuit.library.data_preparation import Initialize
from qiskit.quantum_info import SparsePauliOp, Statevector
from qiskit.quantum_info import SparsePauliOp, Statevector, PauliList
from qiskit.quantum_info.operators.base_operator import BaseOperator
from qiskit.quantum_info.operators.symplectic.base_pauli import BasePauli
@ -82,6 +83,15 @@ def init_observable(observable: BaseOperator | PauliSumOp | str) -> SparsePauliO
elif isinstance(observable, BaseOperator) and not isinstance(observable, BasePauli):
return SparsePauliOp.from_operator(observable)
else:
if isinstance(observable, PauliList):
warnings.warn(
"Implicit conversion from a PauliList to a SparsePauliOp with coeffs=1 in"
" estimator observable arguments is deprecated as of Qiskit 0.46 and will be"
" in Qiskit 1.0. You should explicitly convert to a SparsePauli op using"
" SparsePauliOp(pauli_list) to avoid this warning.",
DeprecationWarning,
stacklevel=2,
)
return SparsePauliOp(observable)

View File

@ -0,0 +1,7 @@
---
deprecations:
- |
Deprecates using a :class:`~.PauliList` as an observable that is implicitly
converted to a :class:`~.SparsePauliOp` with coefficients 1 when calling
:meth:`.Estimator.run`. Users should instead explicitly convert the argument
using ``SparsePauliOp(pauli_list)`` first.

View File

@ -349,7 +349,6 @@ class TestObservableValidation(QiskitTestCase):
@data(
("IXYZ", (SparsePauliOp("IXYZ"),)),
(Pauli("IXYZ"), (SparsePauliOp("IXYZ"),)),
(PauliList("IXYZ"), (SparsePauliOp("IXYZ"),)),
(SparsePauliOp("IXYZ"), (SparsePauliOp("IXYZ"),)),
(PauliSumOp(SparsePauliOp("IXYZ")), (SparsePauliOp("IXYZ"),)),
(
@ -360,10 +359,6 @@ class TestObservableValidation(QiskitTestCase):
[Pauli("IXYZ"), Pauli("ZYXI")],
(SparsePauliOp("IXYZ"), SparsePauliOp("ZYXI")),
),
(
[PauliList("IXYZ"), PauliList("ZYXI")],
(SparsePauliOp("IXYZ"), SparsePauliOp("ZYXI")),
),
(
[SparsePauliOp("IXYZ"), SparsePauliOp("ZYXI")],
(SparsePauliOp("IXYZ"), SparsePauliOp("ZYXI")),
@ -378,6 +373,19 @@ class TestObservableValidation(QiskitTestCase):
"""Test obsevables standardization."""
self.assertEqual(validation._validate_observables(obsevables), expected)
@data(
(PauliList("IXYZ"), (SparsePauliOp("IXYZ"),)),
(
[PauliList("IXYZ"), PauliList("ZYXI")],
(SparsePauliOp("IXYZ"), SparsePauliOp("ZYXI")),
),
)
@unpack
def test_validate_observables_deprecated(self, obsevables, expected):
"""Test obsevables standardization."""
with self.assertRaises(DeprecationWarning):
self.assertEqual(validation._validate_observables(obsevables), expected)
@data(None, "ERROR")
def test_qiskit_error(self, observables):
"""Test qiskit error if invalid input."""