# Operator must be unitary

**URL:** https://discuss.pennylane.ai/t/operator-must-be-unitary/953
**Category:** PennyLane Help
**Created:** [April 2, 2021, 7:57am UTC](https://discuss.pennylane.ai/t/operator-must-be-unitary/953 "2021-04-02T07:57:01Z")
**Posts on this page:** 7
**Page:** 1

<div class="post-metadata">

### Author: ![sassan\_moradi](https://yyz2.discourse-cdn.com/flex012/user_avatar/discuss.pennylane.ai/sassan_moradi/32/422_2.png) [@sassan\_moradi](https://discuss.pennylane.ai/u/sassan_moradi)
#### Post date: [April 2, 2021, 7:57am UTC](https://discuss.pennylane.ai/t/operator-must-be-unitary/953/1 "2021-04-02T07:57:01Z")

</div>

I was going to run your example about quantum kernel, but i encountered this error: `"ValueError: Operator must be unitary"`.

```python
@qml.qnode(dev_kernel)
def kernel(x1, x2):
    """The quantum kernel."""
    AngleEmbedding(x1, wires=range(n_qubits))
    qml.inv(AngleEmbedding(x2, wires=range(n_qubits)))
    return qml.expval(qml.Hermitian(projector, wires=range(n_qubits)))

print(kernel(X_train[0], X_train[0]))

```

---

<div class="post-metadata">

### Author: ![josh](https://yyz2.discourse-cdn.com/flex012/user_avatar/discuss.pennylane.ai/josh/32/100_2.png) [@josh](https://discuss.pennylane.ai/u/josh)
#### Post date: [April 4, 2021, 3:02pm UTC](https://discuss.pennylane.ai/t/operator-must-be-unitary/953/2 "2021-04-04T15:02:03Z")

</div>

Hi @sassan_moradi!

What is your `projector` variable in this case?

---

<div class="post-metadata">

### Author: ![sassan\_moradi](https://yyz2.discourse-cdn.com/flex012/user_avatar/discuss.pennylane.ai/sassan_moradi/32/422_2.png) [@sassan\_moradi](https://discuss.pennylane.ai/u/sassan_moradi)
#### Post date: [April 6, 2021, 6:32am UTC](https://discuss.pennylane.ai/t/operator-must-be-unitary/953/3 "2021-04-06T06:32:25Z")

</div>

Here is projector variable:  
projector = np.zeros((pow(2,n\_qubits), pow(2,n\_qubits)))  
projector[0, 0] = 1

---

<div class="post-metadata">

### Author: ![nathan](https://yyz2.discourse-cdn.com/flex012/user_avatar/discuss.pennylane.ai/nathan/32/85_2.png) [@nathan](https://discuss.pennylane.ai/u/nathan)
#### Post date: [April 6, 2021, 12:50pm UTC](https://discuss.pennylane.ai/t/operator-must-be-unitary/953/5 "2021-04-06T12:50:09Z")

</div>

Hi @sassan_moradi,

Perhaps you could share a complete (non-)working example of your code? I ran your code above (with some guesses about missing lines) and was not able to reproduce the error (it gave an output without error).

---

<div class="post-metadata">

### Author: ![sassan\_moradi](https://yyz2.discourse-cdn.com/flex012/user_avatar/discuss.pennylane.ai/sassan_moradi/32/422_2.png) [@sassan\_moradi](https://discuss.pennylane.ai/u/sassan_moradi)
#### Post date: [April 7, 2021, 6:58am UTC](https://discuss.pennylane.ai/t/operator-must-be-unitary/953/6 "2021-04-07T06:58:37Z")

</div>

The code is one of pennylane examples:

```auto
import numpy as np

from sklearn.svm import SVC
from sklearn.datasets import load_iris
from sklearn.preprocessing import StandardScaler
from sklearn.model_selection import train_test_split
from sklearn.metrics import accuracy_score

import pennylane as qml
from pennylane.templates import AngleEmbedding

X, y = load_iris(return_X_y=True) 

X = X[:100]
y = y[:100]

scaler = StandardScaler().fit(X)
X_scaled = scaler.transform(X)

y_scaled = 2 * (y - 0.5)

X_train, X_test, y_train, y_test = train_test_split(X_scaled, y_scaled)

######################################################################
# We use the `angle-embedding
# template <https://pennylane.readthedocs.io/en/stable/code/api/pennylane.templates.embeddings.AngleEmbedding.html>`__
# which needs as many qubits as there are features:
#

n_qubits = len(X_train[0])

dev_kernel = qml.device("default.qubit", wires=n_qubits)

projector = np.zeros((2 **n_qubits, 2** n_qubits))
projector[0, 0] = 1

@qml.qnode(dev_kernel)
def kernel(x1, x2):
    """The quantum kernel."""
    AngleEmbedding(x1, wires=range(n_qubits))
    qml.inv(AngleEmbedding(x2, wires=range(n_qubits)))
    return qml.expval(qml.Hermitian(projector, wires=range(n_qubits)))

kernel(X_train[0], X_train[0])

def kernel_matrix(A, B):
    """Compute the matrix whose entries are the kernel
       evaluated on pairwise data from sets A and B."""
    return np.array([[kernel(a, b) for b in B] for a in A])

svm = SVC(kernel=kernel_matrix).fit(X_train, y_train)

######################################################################
# Let’s compute the accuracy on the test set.
#

predictions = svm.predict(X_test)

```

---

<div class="post-metadata">

### Author: ![sassan\_moradi](https://yyz2.discourse-cdn.com/flex012/user_avatar/discuss.pennylane.ai/sassan_moradi/32/422_2.png) [@sassan\_moradi](https://discuss.pennylane.ai/u/sassan_moradi)
#### Post date: [April 7, 2021, 7:58am UTC](https://discuss.pennylane.ai/t/operator-must-be-unitary/953/7 "2021-04-07T07:58:05Z")

</div>

problem solved. After upgrading pennylane, i could run it without error.

---

<div class="post-metadata">

### Author: ![josh](https://yyz2.discourse-cdn.com/flex012/user_avatar/discuss.pennylane.ai/josh/32/100_2.png) [@josh](https://discuss.pennylane.ai/u/josh)
#### Post date: [April 7, 2021, 8:56am UTC](https://discuss.pennylane.ai/t/operator-must-be-unitary/953/8 "2021-04-07T08:56:03Z")

</div>

Glad you got it working @sassan_moradi 🙂
