-
Notifications
You must be signed in to change notification settings - Fork 0
/
transpile_to_sx_rz.py
114 lines (91 loc) · 6.18 KB
/
transpile_to_sx_rz.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
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
import math
from qat.core import Circuit
from qat.core.util import get_syntax
from qat.lang.AQASM import RZ, RX, RY, AbstractGate
import numpy as np
from qat.core.variables import ArithExpression
ws_mixer_angles = """
+ - angle * + * sin / UMINUS \\theta 2 UMINUS sin / \\theta 2 * cos / UMINUS \\theta 2 * exp * 1j * -2 \\beta cos / \\theta 2 ** - * + * cos / UMINUS \\theta 2 cos / \\theta 2 * UMINUS sin / UMINUS \\theta 2 * exp * 1j * -2 \\beta sin / \\theta 2 + * sin / UMINUS \\theta 2 UMINUS sin / \\theta 2 * cos / UMINUS \\theta 2 * exp * 1j * -2 \\beta cos / \\theta 2 * + * cos / UMINUS \\theta 2 UMINUS sin / \\theta 2 * UMINUS sin / UMINUS \\theta 2 * exp * 1j * -2 \\beta cos / \\theta 2 + * sin / UMINUS \\theta 2 cos / \\theta 2 * cos / UMINUS \\theta 2 * exp * 1j * -2 \\beta sin / \\theta 2 -0.5 angle * + * sin / UMINUS \\theta 2 cos / \\theta 2 * cos / UMINUS \\theta 2 * exp * 1j * -2 \\beta sin / \\theta 2 ** - * + * cos / UMINUS \\theta 2 cos / \\theta 2 * UMINUS sin / UMINUS \\theta 2 * exp * 1j * -2 \\beta sin / \\theta 2 + * sin / UMINUS \\theta 2 UMINUS sin / \\theta 2 * cos / UMINUS \\theta 2 * exp * 1j * -2 \\beta cos / \\theta 2 * + * cos / UMINUS \\theta 2 UMINUS sin / \\theta 2 * UMINUS sin / UMINUS \\theta 2 * exp * 1j * -2 \\beta cos / \\theta 2 + * sin / UMINUS \\theta 2 cos / \\theta 2 * cos / UMINUS \\theta 2 * exp * 1j * -2 \\beta sin / \\theta 2 -0.5 3.141592653589793
+ UMINUS * 2 atan2 abs * + * sin / UMINUS \\theta 2 cos / \\theta 2 * cos / UMINUS \\theta 2 * exp * 1j * -2 \\beta sin / \\theta 2 ** - * + * cos / UMINUS \\theta 2 cos / \\theta 2 * UMINUS sin / UMINUS \\theta 2 * exp * 1j * -2 \\beta sin / \\theta 2 + * sin / UMINUS \\theta 2 UMINUS sin / \\theta 2 * cos / UMINUS \\theta 2 * exp * 1j * -2 \\beta cos / \\theta 2 * + * cos / UMINUS \\theta 2 UMINUS sin / \\theta 2 * UMINUS sin / UMINUS \\theta 2 * exp * 1j * -2 \\beta cos / \\theta 2 + * sin / UMINUS \\theta 2 cos / \\theta 2 * cos / UMINUS \\theta 2 * exp * 1j * -2 \\beta sin / \\theta 2 -0.5 abs * + * cos / UMINUS \\theta 2 cos / \\theta 2 * UMINUS sin / UMINUS \\theta 2 * exp * 1j * -2 \\beta sin / \\theta 2 ** - * + * cos / UMINUS \\theta 2 cos / \\theta 2 * UMINUS sin / UMINUS \\theta 2 * exp * 1j * -2 \\beta sin / \\theta 2 + * sin / UMINUS \\theta 2 UMINUS sin / \\theta 2 * cos / UMINUS \\theta 2 * exp * 1j * -2 \\beta cos / \\theta 2 * + * cos / UMINUS \\theta 2 UMINUS sin / \\theta 2 * UMINUS sin / UMINUS \\theta 2 * exp * 1j * -2 \\beta cos / \\theta 2 + * sin / UMINUS \\theta 2 cos / \\theta 2 * cos / UMINUS \\theta 2 * exp * 1j * -2 \\beta sin / \\theta 2 -0.5 3.141592653589793
+ angle * + * sin / UMINUS \\theta 2 UMINUS sin / \\theta 2 * cos / UMINUS \\theta 2 * exp * 1j * -2 \\beta cos / \\theta 2 ** - * + * cos / UMINUS \\theta 2 cos / \\theta 2 * UMINUS sin / UMINUS \\theta 2 * exp * 1j * -2 \\beta sin / \\theta 2 + * sin / UMINUS \\theta 2 UMINUS sin / \\theta 2 * cos / UMINUS \\theta 2 * exp * 1j * -2 \\beta cos / \\theta 2 * + * cos / UMINUS \\theta 2 UMINUS sin / \\theta 2 * UMINUS sin / UMINUS \\theta 2 * exp * 1j * -2 \\beta cos / \\theta 2 + * sin / UMINUS \\theta 2 cos / \\theta 2 * cos / UMINUS \\theta 2 * exp * 1j * -2 \\beta sin / \\theta 2 -0.5 angle * + * sin / UMINUS \\theta 2 cos / \\theta 2 * cos / UMINUS \\theta 2 * exp * 1j * -2 \\beta sin / \\theta 2 ** - * + * cos / UMINUS \\theta 2 cos / \\theta 2 * UMINUS sin / UMINUS \\theta 2 * exp * 1j * -2 \\beta sin / \\theta 2 + * sin / UMINUS \\theta 2 UMINUS sin / \\theta 2 * cos / UMINUS \\theta 2 * exp * 1j * -2 \\beta cos / \\theta 2 * + * cos / UMINUS \\theta 2 UMINUS sin / \\theta 2 * UMINUS sin / UMINUS \\theta 2 * exp * 1j * -2 \\beta cos / \\theta 2 + * sin / UMINUS \\theta 2 cos / \\theta 2 * cos / UMINUS \\theta 2 * exp * 1j * -2 \\beta sin / \\theta 2 -0.5
""".strip().split(
"\n"
)
def wsqaoa_mixer(theta: float, beta: float) -> np.ndarray:
return (
RY.matrix_generator(-theta)
@ RZ.matrix_generator(-2 * beta)
@ RY.matrix_generator(theta)
)
def sqrt_x() -> np.ndarray:
return RX.matrix_generator(math.pi / 2)
WM = AbstractGate("WM", [float, float], arity=1, matrix_generator=wsqaoa_mixer)
SX = AbstractGate("SX", [], arity=1, matrix_generator=sqrt_x)
def hadardmard() -> list[np.ndarray]:
return [SX(), RZ(math.pi / 2), SX()]
def rx(angle) -> list[np.ndarray]:
return [RZ(-math.pi / 2), SX(), RZ(math.pi - angle), SX(), RZ(-math.pi / 2)]
def u(theta: float, phi: float, gamma: float) -> list[np.ndarray]:
return [
RZ(gamma - math.pi / 2),
SX(),
RZ(math.pi - theta),
SX(),
RZ(phi - math.pi / 2),
]
def ry(angle: float) -> list[np.ndarray]:
return [
RZ(-math.pi),
SX(),
RZ(math.pi - angle),
SX(),
RZ(0),
]
def wm(theta: float, beta: float) -> list[np.ndarray]:
arith_expressions = []
for expr in ws_mixer_angles:
expr = expr.replace("\\theta", str(theta))
expr = expr.replace("\\beta", str(beta))
arith_expression = ArithExpression.from_string(expr)
arith_expressions.append(arith_expression)
# arith_expression.pretty_print()
return [
RZ(arith_expressions[0]),
SX(),
RZ(arith_expressions[1]),
SX(),
RZ(arith_expressions[2]),
]
def wm_oj(theta: float, beta: float) -> list[np.ndarray]:
return [
RY(theta),
RZ(-2 * beta),
RY(-theta),
]
def transpile(circuit: Circuit):
ops = circuit.ops
index = 0
def replace_gate(new_gates):
nonlocal index
ops.pop(index)
for i, gate in enumerate(new_gates):
circuit.insert_gate(index + i, gate, qubits)
index += len(gates) - 1
while index < len(ops):
name, variables, qubits = get_syntax(circuit, index)
if name == "H":
gates = hadardmard()
replace_gate(gates)
if name == "RX":
angle = variables[0]
gates = rx(angle)
replace_gate(gates)
if name == "RY":
angle = variables[0]
gates = ry(angle)
replace_gate(gates)
if name == "WM":
theta, beta = variables
gates = wm(theta, beta)
replace_gate(gates)
index += 1