Skip to content

Commit a08c549

Browse files
committed
Simplifications
1 parent d50c07c commit a08c549

File tree

15 files changed

+388
-661
lines changed

15 files changed

+388
-661
lines changed

src/ITensorQuantumOperatorDefinitions.jl

Lines changed: 0 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -2,22 +2,18 @@ module ITensorQuantumOperatorDefinitions
22

33
include("sitetype.jl")
44
include("space.jl")
5-
include("val.jl")
65
include("state.jl")
76
include("op.jl")
87
include("has_fermion_string.jl")
98

109
include("sitetypes/qubit.jl")
11-
include("sitetypes/spinhalf.jl")
1210
include("sitetypes/spinone.jl")
1311
include("sitetypes/fermion.jl")
1412
include("sitetypes/electron.jl")
1513
include("sitetypes/tj.jl")
1614
include("sitetypes/qudit.jl")
17-
include("sitetypes/boson.jl")
1815

1916
include("itensor/siteinds.jl")
20-
include("itensor/val.jl")
2117
include("itensor/state.jl")
2218
include("itensor/op.jl")
2319
include("itensor/has_fermion_string.jl")

src/itensor/val.jl

Lines changed: 0 additions & 20 deletions
This file was deleted.

src/op.jl

Lines changed: 76 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -140,8 +140,18 @@ end
140140
@op_alias "adag" "a†"
141141
alias(::OpName"a") = OpName"a†"()'
142142
@op_alias "A" "a"
143+
143144
alias(::OpName"n") = OpName"a†"() * OpName"a"()
144145
@op_alias "N" "n"
146+
147+
# `cis(x) = exp(im * x)`
148+
alias(n::OpName"Phase") = cis(n.θ * OpName"n"())
149+
@op_alias "PHASE" "Phase"
150+
@op_alias "P" "Phase"
151+
@op_alias "π/8" "Phase" θ = π / 4
152+
@op_alias "T" "π/8"
153+
@op_alias "S" "Phase" θ = π / 2
154+
145155
alias(::OpName"aa") = OpName("a") OpName("a")
146156
alias(::OpName"a†a") = OpName("a†") OpName("a")
147157
alias(::OpName"aa†") = OpName("a") OpName("a†")
@@ -179,14 +189,18 @@ alias(::OpName"X") = (OpName"σ⁺"() + OpName"σ⁻"()) / 2
179189
@op_alias "σ¹" "X"
180190
@op_alias "σ₁" "X"
181191
@op_alias "σy" "Y"
182-
@op_alias "iX" "im" op = OpName"X"()
183-
@op_alias "√X" "" op = OpName"X"()
184-
@op_alias "√NOT" "" op = OpName"X"()
192+
alias(::OpName"iX") = im * OpName"X"()
193+
alias(::OpName"√X") = OpName"X"()
194+
@op_alias "√NOT" "X"
185195
alias(n::OpName"Sx") = OpName"X"() / 2
186196
@op_alias "" "Sx"
187197
@op_alias "Sₓ" "Sx"
188198
alias(::OpName"Sx2") = OpName"Sx"()^2
189199

200+
# Rotation around X-axis
201+
# exp(-im * n.θ / 2 * X)
202+
alias(n::OpName"Rx") = cis(-(n.θ / 2) * OpName"X"())
203+
190204
alias(::OpName"Y") = -im * (OpName"σ⁺"() - OpName"σ⁻"()) / 2
191205
# TODO: No subsript `\_y` available
192206
# in unicode.
@@ -202,12 +216,37 @@ alias(::OpName"iY") = (OpName"σ⁺"() - OpName"σ⁻"()) / 2
202216
@op_alias "iσ2" "iY"
203217
@op_alias "iσ²" "iY"
204218
@op_alias "iσ₂" "iY"
205-
alias(n::OpName"Sy") = OpName("Y") / 2
219+
alias(n::OpName"Sy") = OpName"Y"() / 2
206220
@op_alias "" "Sy"
207-
alias(n::OpName"iSy") = OpName("iY") / 2
221+
alias(n::OpName"iSy") = OpName"iY"() / 2
208222
@op_alias "iSʸ" "iSy"
209223
alias(::OpName"Sy2") = -OpName"iSy"()^2
210224

225+
# Rotation around Y-axis
226+
# exp(-im * n.θ / 2 * Y)
227+
alias(n::OpName"Ry") = exp(-(n.θ / 2) * OpName"iY"())
228+
229+
# Ising (XX) coupling gate
230+
# exp(-im * θ/2 * X ⊗ X)
231+
alias(n::OpName"Rxx") = exp(-im * (n.θ / 2) * OpName"X"() OpName"X"())
232+
@op_alias "RXX" "Rxx"
233+
234+
# Ising (YY) coupling gate
235+
# exp(-im * θ/2 * Y ⊗ Y)
236+
alias(n::OpName"Ryy") = exp(-im * (n.θ / 2) * OpName"Y"() OpName"Y"())
237+
@op_alias "RYY" "Ryy"
238+
239+
# Ising (ZZ) coupling gate
240+
# exp(-im * θ/2 * Z ⊗ Z)
241+
alias(n::OpName"Rzz") = exp(-im * (n.θ / 2) * OpName"Z"() OpName"Z"())
242+
@op_alias "RZZ" "Rzz"
243+
244+
## TODO: Check this definition and see if it is worth defining this.
245+
## # Ising (XY) coupling gate
246+
## # exp(-im * θ/2 * X ⊗ Y)
247+
## alias(n::OpName"Rxy") = exp(-im * (n.θ / 2) * OpName"X"() ⊗ OpName"Y"())
248+
## @op_alias "RXY" "Rxy"
249+
211250
function Base.AbstractArray(n::OpName"σᶻ", domain_size::Tuple{Int})
212251
d = only(domain_size)
213252
s = (d - 1) / 2
@@ -220,7 +259,7 @@ end
220259
@op_alias "σ³" "Z"
221260
@op_alias "σ₃" "Z"
222261
@op_alias "σz" "Z"
223-
@op_alias "iZ" "im" op = OpName"Z"()
262+
alias(::OpName"iZ") = im * OpName"Z"()
224263
alias(n::OpName"Sz") = OpName"Z"() / 2
225264
@op_alias "Sᶻ" "Sz"
226265
# TODO: Make sure it ends up real, using `S⁺` and `S⁻`,
@@ -235,13 +274,42 @@ alias(n::OpName"S2") = OpName"Sx2"() + OpName"Sy2"() + OpName"Sz2"()
235274
@op_alias "" "S2"
236275
alias(::OpName"Sz2") = OpName"Sz"()^2
237276

277+
# Rotation around Z-axis
278+
# exp(-im * n.θ / 2 * Z)
279+
alias(n::OpName"Rz") = exp(-im * (n.θ / 2) * OpName"Z"())
280+
238281
using LinearAlgebra: eigen
239282
function Base.AbstractArray(n::OpName"H", domain_size::Tuple{Int})
240283
Λ, H = eigen(AbstractArray(OpName("X"), domain_size))
241284
p = sortperm(Λ; rev=true)
242285
return H[:, p]
243286
end
244287

288+
using LinearAlgebra: Diagonal
289+
nsites(::OpName"SWAP") = 2
290+
function Base.AbstractArray(::OpName"SWAP", domain_size::Tuple{Int,Int})
291+
I_matrix = Diagonal(trues(prod(domain_size)))
292+
I_array = reshape(I_matrix, (domain_size..., domain_size...))
293+
SWAP_array = permutedims(I_array, (2, 1, 3, 4))
294+
SWAP_matrix = reshape(SWAP_array, (prod(domain_size), prod(domain_size)))
295+
return SWAP_matrix
296+
end
297+
@op_alias "Swap" "SWAP"
298+
alias(::OpName"√SWAP") = (OpName"SWAP"())
299+
@op_alias "√Swap" "√SWAP"
300+
301+
using LinearAlgebra: diagind
302+
nsites(::OpName"iSWAP") = 2
303+
function Base.AbstractArray(::OpName"iSWAP", domain_size::Tuple{Int,Int})
304+
swap = AbstractArray(OpName"SWAP"(), domain_size)
305+
iswap = im * swap
306+
iswap[diagind(iswap)] .*= -im
307+
return iswap
308+
end
309+
@op_alias "iSwap" "iSWAP"
310+
alias(::OpName"√iSWAP") = (OpName"iSWAP"())
311+
@op_alias "√iSwap" "√iSWAP"
312+
245313
## TODO: Bring back these definitions.
246314
## function default_random_matrix(eltype::Type, s::Index...)
247315
## n = prod(dim.(s))
@@ -284,6 +352,7 @@ for f in (
284352
:(Base.imag),
285353
:(Base.complex),
286354
:(Base.exp),
355+
:(Base.cis),
287356
:(Base.cos),
288357
:(Base.sin),
289358
:(Base.adjoint),
@@ -354,9 +423,7 @@ function Base.:/(n::OpName"scaled", c::Number)
354423
return OpName"scaled"(; op=n.op, c=(n.c / c))
355424
end
356425

357-
alias(n::OpName"im") = OpName"scaled"(; op=n.op, c=im)
358-
359-
controlled(n::OpName; ncontrol=1) = OpName"Control"(; ncontrol, op=n)
426+
controlled(n::OpName; ncontrol=1) = OpName"Controlled"(; ncontrol, op=n)
360427

361428
# Expand the operator in a new basis.
362429
using LinearAlgebra:

src/sitetypes/boson.jl

Lines changed: 0 additions & 31 deletions
This file was deleted.

0 commit comments

Comments
 (0)