Skip to content

Commit 952d4b9

Browse files
added higher order Ising circuit
1 parent e0f9994 commit 952d4b9

File tree

1 file changed

+35
-27
lines changed

1 file changed

+35
-27
lines changed

src/yaqs/core/libraries/circuit_library.py

Lines changed: 35 additions & 27 deletions
Original file line numberDiff line numberDiff line change
@@ -1,38 +1,46 @@
11
from qiskit.circuit import QuantumCircuit
22

33

4-
def create_Ising_circuit(model, dt, timesteps):
4+
def create_Ising_circuit(model, dt, timesteps, order=1):
55
'H = J ZZ + g X'
66

77
assert model['name'] == 'Ising'
8+
L = model['L']
9+
circ = QuantumCircuit(L)
810

9-
# Angle on X rotation
10-
alpha = -2*dt*model['g']
11-
# Angle on ZZ rotation
12-
beta = -2*dt*model['J']
13-
14-
circ = QuantumCircuit(model['L'])
1511
for _ in range(timesteps):
16-
for site in range(model['L']):
17-
circ.rx(theta=alpha, qubit=site)
18-
19-
for site in range(model['L'] // 2):
20-
circ.rzz(beta, qubit1=2*site, qubit2=2*site+1)
21-
# circ.cx(control_qubit=2*site, target_qubit=2*site+1)
22-
# circ.rz(phi=beta, qubit=2*site+1)
23-
# circ.cx(control_qubit=2*site, target_qubit=2*site+1)
24-
25-
for site in range(1, model['L'] // 2):
26-
circ.rzz(beta, qubit1=2*site-1, qubit2=2*site)
27-
# circ.cx(control_qubit=2*site-1, target_qubit=2*site)
28-
# circ.rz(phi=beta, qubit=2*site)
29-
# circ.cx(control_qubit=2*site-1, target_qubit=2*site)
30-
31-
if model['L'] % 2 != 0 and model['L'] != 1:
32-
circ.rzz(beta, qubit1=model['L']-2, qubit2=model['L']-1)
33-
# circ.cx(control_qubit=model['L']-2, target_qubit=model['L']-1)
34-
# circ.rz(phi=beta, qubit=model['L']-1)
35-
# circ.cx(control_qubit=model['L']-2, target_qubit=model['L']-1)
12+
if order == 1:
13+
# First-order Trotterization: full X rotation then ZZ interactions.
14+
for site in range(L):
15+
circ.rx(theta=-2*dt*model['g'], qubit=site)
16+
# Even bonds:
17+
for site in range(L//2):
18+
circ.rzz(-2*dt*model['J'], qubit1=2*site, qubit2=2*site+1)
19+
# Odd bonds:
20+
for site in range(1, L//2):
21+
circ.rzz(-2*dt*model['J'], qubit1=2*site-1, qubit2=2*site)
22+
if L % 2 != 0 and L != 1:
23+
circ.rzz(-2*dt*model['J'], qubit1=L-2, qubit2=L-1)
24+
25+
elif order == 2:
26+
# Second-order Trotterization: half-step X, then full ZZ, then half-step X.
27+
half_alpha = -2*dt/2*model['g']
28+
# First half-step for X rotations:
29+
for site in range(L):
30+
circ.rx(theta=half_alpha, qubit=site)
31+
# Full-step ZZ interactions (same as before):
32+
for site in range(L//2):
33+
circ.rzz(-2*dt*model['J'], qubit1=2*site, qubit2=2*site+1)
34+
for site in range(1, L//2):
35+
circ.rzz(-2*dt*model['J'], qubit1=2*site - 1, qubit2=2*site)
36+
if L % 2 != 0 and L != 1:
37+
circ.rzz(-2*dt*model['J'], qubit1=L-2, qubit2=L-1)
38+
# Second half-step for X rotations:
39+
for site in range(L):
40+
circ.rx(theta=half_alpha, qubit=site)
41+
42+
else:
43+
raise ValueError("Unsupported Trotterization order. Choose 1 or 2.")
3644

3745
return circ
3846

0 commit comments

Comments
 (0)