@@ -46,7 +46,8 @@ class Observable:
46
46
47
47
Args:
48
48
observable : can be either a Hermitian matrix representing the
49
- observable or PauliString representing the observable.
49
+ observable, or PauliString representing the observable, or a list
50
+ of diagonal elements of the matrix when the observable is diagonal.
50
51
51
52
Raises:
52
53
ValueError: If the input matrix is not Hermitian or does not have a
@@ -70,14 +71,13 @@ class Observable:
70
71
71
72
"""
72
73
73
- def __init__ (self , observable : Matrix | list [Real ] | PauliString ):
74
+ def __init__ (self , observable : Matrix | PauliString | list [Real ]):
74
75
self ._matrix = None
75
76
self ._pauli_string = None
76
77
self ._is_diagonal = None
77
78
self ._diag_elements = None
78
79
79
80
if isinstance (observable , PauliString ):
80
- # TODO: add some checks, if all the coefficients of the pauli string are real ? (or obviously not necessary?)
81
81
self .nb_qubits = observable .nb_qubits
82
82
self ._pauli_string = observable .simplify ()
83
83
else :
@@ -179,6 +179,26 @@ def diagonal_elements(self, diag_elements: list[Real] | npt.NDArray[np.float64])
179
179
180
180
@property
181
181
def is_diagonal (self ) -> bool :
182
+ """Returns True if this observable is diagonal.
183
+
184
+ Examples:
185
+ >>> Observable(np.array([[3, 0], [0, 8]])).is_diagonal
186
+ True
187
+ >>> Observable(np.array([[3, -1], [-1, 8]])).is_diagonal
188
+ False
189
+ >>> Observable(np.diag([-1,8,4,5])).is_diagonal
190
+ True
191
+ >>> Observable([0, 5, 6, 9, 7, 4, 3, 6]).is_diagonal
192
+ True
193
+ >>> Observable(np.array([7, 4, 3, 6])).is_diagonal
194
+ True
195
+ >>> from mpqp.measures import I, X, Y, Z
196
+ >>> Observable(I @ Z - 3 * Z @ Z + 2* Z @ I).is_diagonal
197
+ True
198
+ >>> Observable(I @ X - 3* Z @ Z + 2 * Y @ I).is_diagonal
199
+ False
200
+
201
+ """
182
202
if self ._is_diagonal is None :
183
203
# We first check if the pauli string is already known, we use it for efficiency
184
204
if self ._pauli_string is not None :
0 commit comments