-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathpennylane_circuit.py
39 lines (28 loc) · 1.1 KB
/
pennylane_circuit.py
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
import pennylane as qml
NUMBER_OF_WIRES = None # value comes from pennylane tester
# ADAPT THE CIRCUIT IN PENNYLANE
def layer(x, params, wires, i0=0, inc=1):
"""Building block of the embedding ansatz"""
i = i0
for j, wire in enumerate(wires):
qml.Hadamard(wires=[wire])
qml.RZ(x[i % len(x)], wires=[wire])
i += inc
qml.RY(params[0, j], wires=[wire])
qml.broadcast(unitary=qml.CRZ, pattern="ring", wires=wires, parameters=params[1])
def ansatz(x, params, wires):
"""The embedding ansatz"""
for j, layer_params in enumerate(params):
layer(x, layer_params, wires, i0=j * len(wires))
adjoint_ansatz = qml.adjoint(ansatz)
def init_circuit():
dev = qml.device("default.qubit", wires=NUMBER_OF_WIRES, shots=None)
wires = dev.wires.tolist()
@qml.qnode(dev, interface="autograd")
def kernel_circuit(x1, x2, params):
ansatz(x1, params, wires=wires)
adjoint_ansatz(x2, params, wires=wires)
return qml.probs(wires=wires)
return kernel_circuit
def kernel(x1, x2, params):
return init_circuit()(x1, x2, params)[0]