forked from mit-han-lab/torchquantum
-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathtest_rotgate.py
56 lines (45 loc) · 1.97 KB
/
test_rotgate.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
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
import numpy as np
from qiskit import transpile
from qiskit.circuit.library import GR, GRX, GRY, GRZ
from qiskit_aer import AerSimulator
import torchquantum as tq
from torchquantum.util import find_global_phase, switch_little_big_endian_matrix
all_pairs = [
{"qiskit": GR, "tq": tq.layer.GlobalR, "params": 2},
{"qiskit": GRX, "tq": tq.layer.GlobalRX, "params": 1},
{"qiskit": GRY, "tq": tq.layer.GlobalRY, "params": 1},
{"qiskit": GRZ, "tq": tq.layer.GlobalRZ, "params": 1},
]
ITERATIONS = 2
def test_rotgates():
# test each pair
for pair in all_pairs:
# test 2-5 wires
for num_wires in range(2, 5):
# try multiple random parameters
for _ in range(ITERATIONS):
# generate random parameters
params = [
np.random.uniform(-2 * np.pi, 2 * np.pi)
for _ in range(pair["params"])
]
# create the qiskit circuit
qiskit_circuit = pair["qiskit"](num_wires, *params)
# get the unitary from qiskit
backend = AerSimulator(method="unitary")
qiskit_circuit = transpile(qiskit_circuit, backend)
qiskit_circuit.save_unitary()
result = backend.run(qiskit_circuit).result()
unitary_qiskit = result.get_unitary(qiskit_circuit)
# create tq circuit
qdev = tq.QuantumDevice(num_wires)
tq_circuit = pair["tq"](num_wires, *params)
tq_circuit(qdev)
# get the unitary from tq
unitary_tq = tq_circuit.get_unitary(qdev)
unitary_tq = switch_little_big_endian_matrix(unitary_tq.data.numpy())
# phase?
phase = find_global_phase(unitary_tq, unitary_qiskit, 1e-4)
assert np.allclose(
unitary_tq * phase, unitary_qiskit, atol=1e-6
), f"{pair} not equal with {params=}!"