Skip to content

Commit 0ccad07

Browse files
committed
Fix tJ definitions and other state definitions
1 parent 443e5f0 commit 0ccad07

File tree

7 files changed

+98
-238
lines changed

7 files changed

+98
-238
lines changed

src/op.jl

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -173,7 +173,8 @@ for nametype in (:StateName, :OpName)
173173
summed = :($(nametype){:summed})
174174
@eval begin
175175
function nsites(n::$(summed))
176-
@assert allequal(nsites, n.args)
176+
# TODO: Use `allequal(nsites, n.args)` once we drop Julia 1.10 support.
177+
@assert allequal(nsites.(n.args))
177178
return nsites(first(n.args))
178179
end
179180
function (n::$(summed))(domain...)
@@ -231,7 +232,8 @@ end
231232
Base.:^(n::OpName, exponent) = OpName"exponentiated"(; arg=n, exponent)
232233

233234
function nsites(n::OpName"producted")
234-
@assert allequal(nsites, n.args)
235+
# TODO: Use `allequal(nsites, n.args)` once we drop Julia 1.10 support.
236+
@assert allequal(nsites.(n.args))
235237
return nsites(first(n.args))
236238
end
237239
function (n::OpName"producted")(domain...)

src/sitetypes/electron.jl

Lines changed: 17 additions & 25 deletions
Original file line numberDiff line numberDiff line change
@@ -1,35 +1,27 @@
11
Base.length(::SiteType"Electron") = 4
22

3-
# TODO: Write these in terms of Kronecker products of Qubit states.
4-
Base.AbstractArray(::StateName"Emp", ::Tuple{SiteType"Electron"}) = [1.0, 0, 0, 0]
5-
Base.AbstractArray(::StateName"Up", ::Tuple{SiteType"Electron"}) = [0.0, 1, 0, 0]
6-
Base.AbstractArray(::StateName"Dn", ::Tuple{SiteType"Electron"}) = [0.0, 0, 1, 0]
7-
Base.AbstractArray(::StateName"UpDn", ::Tuple{SiteType"Electron"}) = [0.0, 0, 0, 1]
8-
# TODO: Use aliasing.
9-
function Base.AbstractArray(::StateName"0", st::Tuple{SiteType"Electron"})
10-
return AbstractArray(StateName("Emp"), st)
11-
end
12-
function Base.AbstractArray(::StateName"↑", st::Tuple{SiteType"Electron"})
13-
return AbstractArray(StateName("Up"), st)
14-
end
15-
function Base.AbstractArray(::StateName"↓", st::Tuple{SiteType"Electron"})
16-
return AbstractArray(StateName("Dn"), st)
17-
end
18-
function Base.AbstractArray(::StateName"↑↓", st::Tuple{SiteType"Electron"})
19-
return AbstractArray(StateName("UpDn"), st)
20-
end
3+
(::StateName"Emp")(domain::SiteType"Electron") = StateName"0"()(domain)
4+
5+
(::StateName"↑")(::SiteType"Electron") = (StateName"0"() StateName"1"())(2, 2)
6+
(::StateName"Up")(domain::SiteType"Electron") = StateName""()(domain)
7+
8+
(::StateName"↓")(domain::SiteType"Electron") = (StateName"1"() StateName"0"())(2, 2)
9+
(::StateName"Dn")(domain::SiteType"Electron") = StateName""()(domain)
10+
11+
(::StateName"↑↓")(domain::SiteType"Electron") = (StateName"1"() StateName"1"())(2, 2)
12+
(::StateName"UpDn")(domain::SiteType"Electron") = StateName"↑↓"()(domain)
2113

2214
# I ⊗ n
23-
(::OpName"Nup")(::SiteType"Electron") = (OpName"I"() OpName"n"())(2, 2)
24-
@op_alias "n↑" "Nup"
15+
(::OpName"n↑")(::SiteType"Electron") = (OpName"I"() OpName"n"())(2, 2)
16+
@op_alias "Nup" "n↑"
2517

2618
# n ⊗ I
27-
(::OpName"Ndn")(::SiteType"Electron") = (OpName"n"() OpName"I"())(2, 2)
28-
@op_alias "n↓" "Ndn"
19+
(::OpName"n↓")(::SiteType"Electron") = (OpName"n"() OpName"I"())(2, 2)
20+
@op_alias "Ndn" "n↓"
2921

3022
# n ⊗ n
31-
(::OpName"Nupdn")(::SiteType"Electron") = (OpName"n"() OpName"n"())(2, 2)
32-
@op_alias "n↑↓" "Nupdn"
23+
(::OpName"n↑↓")(::SiteType"Electron") = (OpName"n"() OpName"n"())(2, 2)
24+
@op_alias "Nupdn" "n↑↓"
3325

3426
# I ⊗ n + n ⊗ I = n↑ + n↓
3527
alias(::OpName"ntot") = OpName"n↑"() + OpName"n↓"()
@@ -102,5 +94,5 @@ end
10294

10395
has_fermion_string(::OpName"c↑", ::SiteType"Electron") = true
10496
has_fermion_string(::OpName"c†↑", ::SiteType"Electron") = true
105-
has_fermion_string(::OpName"c↓", ::Tuple{SiteType"Electron"}) = true
97+
has_fermion_string(::OpName"c↓", ::SiteType"Electron") = true
10698
has_fermion_string(::OpName"c†↓", ::SiteType"Electron") = true

src/sitetypes/fermion.jl

Lines changed: 3 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -1,14 +1,7 @@
1-
Base.length(::SiteType"Fermion") = 2
1+
# TODO: Make an alias of `"Qubit"` to inherit
2+
# more operator and state definitions?
23

3-
# TODO: Update these, using aliasing to minimize definitions.
4-
Base.AbstractArray(::StateName"Emp", ::SiteType"Fermion") = [1.0 0.0]
5-
Base.AbstractArray(::StateName"Occ", ::SiteType"Fermion") = [0.0 1.0]
6-
function Base.AbstractArray(::StateName"0", st::SiteType"Fermion")
7-
return AbstractArray(StateName("Emp"), st)
8-
end
9-
function Base.AbstractArray(::StateName"1", st::SiteType"Fermion")
10-
return AbstractArray(StateName("Occ"), st)
11-
end
4+
Base.length(::SiteType"Fermion") = 2
125

136
(::OpName"F")(::SiteType"Fermion") = Diagonal([1, -1])
147

src/sitetypes/qubit.jl

Lines changed: 10 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -6,15 +6,17 @@ alias(::SiteType"SpinHalf=1/2") = SiteType"Qubit"()
66

77
Base.length(::SiteType"Qubit") = 2
88

9-
@state_alias "Up" "0"
10-
@state_alias "" "0"
11-
@state_alias "Z+" "0"
12-
@state_alias "Zp" "0"
9+
(::StateName"↑")(::SiteType"Qubit") = StateName"0"()(2)
10+
(::StateName"Up")(::SiteType"Qubit") = StateName"0"()(2)
11+
(::StateName"Z+")(::SiteType"Qubit") = StateName"0"()(2)
12+
(::StateName"Zp")(::SiteType"Qubit") = StateName"0"()(2)
13+
(::StateName"Emp")(::SiteType"Qubit") = StateName"0"()(2)
1314

14-
@state_alias "" "1"
15-
@state_alias "Dn" "1"
16-
@state_alias "Z-" "1"
17-
@state_alias "Zm" "1"
15+
(::StateName"↓")(::SiteType"Qubit") = StateName"1"()(2)
16+
(::StateName"Dn")(::SiteType"Qubit") = StateName"1"()(2)
17+
(::StateName"Z-")(::SiteType"Qubit") = StateName"1"()(2)
18+
(::StateName"Zm")(::SiteType"Qubit") = StateName"1"()(2)
19+
(::StateName"Occ")(::SiteType"Qubit") = StateName"1"()(2)
1820

1921
# `eigvecs(X)`
2022
alias(::StateName"+") = (StateName"0"() + StateName"1"()) / 2

src/sitetypes/spinone.jl

Lines changed: 21 additions & 21 deletions
Original file line numberDiff line numberDiff line change
@@ -2,27 +2,27 @@ Base.length(::SiteType"S=1") = 3
22

33
alias(::SiteType"SpinOne") = SiteType"S=1"()
44

5-
# TODO: Decide on these names, use `alias`.
6-
# TODO: Make a more general `SiteType"Spin`/`SiteType"S"`
7-
# with a `spin` field that can be set to a rational number
8-
# `1//2, `2//2`, `3//2`, etc. that maps to `Qudit`
9-
# of length `2 * spin + 1`.
10-
Base.AbstractArray(::StateName"Up", ::SiteType"S=1") = [1, 0, 0]
11-
Base.AbstractArray(::StateName"Z0", ::SiteType"S=1") = [0, 1, 0]
12-
Base.AbstractArray(::StateName"Dn", ::SiteType"S=1") = [0, 0, 1]
5+
# TODO: Make these more general, define as something like:
6+
# `(n::StateName"Z")(::SiteType"S=1") = eigvecs(OpName"Z"())[n.eigval]`
7+
(::StateName"Z+")(::SiteType"S=1") = [1, 0, 0]
8+
(::StateName"Z0")(::SiteType"S=1") = [0, 1, 0]
9+
(::StateName"Z-")(::SiteType"S=1") = [0, 0, 1]
1310

14-
Base.AbstractArray(::StateName"↑", st::SiteType"S=1") = [1, 0, 0]
15-
Base.AbstractArray(::StateName"0", st::SiteType"S=1") = [0, 1, 0]
16-
Base.AbstractArray(::StateName"↓", st::SiteType"S=1") = [0, 0, 1]
11+
## TODO: Decide on these aliases.
12+
(::StateName"↑")(::SiteType"S=1") = StateName"Z+"()(domain)
13+
(::StateName"Up")(::SiteType"S=1") = StateName"Z+"()(domain)
14+
(::StateName"0")(::SiteType"S=1") = StateName"Z0"()(domain)
15+
(::StateName"↓")(::SiteType"S=1") = StateName"Z-"()(domain)
16+
(::StateName"Dn")(::SiteType"S=1") = StateName"Z-"()(domain)
1717

18-
Base.AbstractArray(::StateName"Z+", st::SiteType"S=1") = [1.0, 0.0, 0.0]
19-
# -- Z0 is already defined above --
20-
Base.AbstractArray(::StateName"Z-", st::SiteType"S=1") = [0.0, 0.0, 1.0]
18+
# TODO: Make these more general, define as something like:
19+
# `(n::StateName"X")(::SiteType"S=1") = eigvecs(OpName"X"())[n.eigval]`
20+
(::StateName"X+")(::SiteType"S=1") = [1 / 2, 1 / sqrt(2), 1 / 2]
21+
(::StateName"X0")(::SiteType"S=1") = [-1 / sqrt(2), 0, 1 / sqrt(2)]
22+
(::StateName"X-")(::SiteType"S=1") = [1 / 2, -1 / sqrt(2), 1 / 2]
2123

22-
Base.AbstractArray(::StateName"X+", ::SiteType"S=1") = [1 / 2, 1 / sqrt(2), 1 / 2]
23-
Base.AbstractArray(::StateName"X0", ::SiteType"S=1") = [-1 / sqrt(2), 0, 1 / sqrt(2)]
24-
Base.AbstractArray(::StateName"X-", ::SiteType"S=1") = [1 / 2, -1 / sqrt(2), 1 / 2]
25-
26-
Base.AbstractArray(::StateName"Y+", ::SiteType"S=1") = [-1 / 2, -im / sqrt(2), 1 / 2]
27-
Base.AbstractArray(::StateName"Y0", ::SiteType"S=1") = [1 / sqrt(2), 0, 1 / sqrt(2)]
28-
Base.AbstractArray(::StateName"Y-", ::SiteType"S=1") = [-1 / 2, im / sqrt(2), 1 / 2]
24+
# TODO: Make these more general, define as something like:
25+
# `(n::StateName"Y")(::SiteType"S=1") = eigvecs(OpName"Y"())[n.eigval]`
26+
(::StateName"Y+")(::SiteType"S=1") = [-1 / 2, -im / sqrt(2), 1 / 2]
27+
(::StateName"Y0")(::SiteType"S=1") = [1 / sqrt(2), 0, 1 / sqrt(2)]
28+
(::StateName"Y-")(::SiteType"S=1") = [-1 / 2, im / sqrt(2), 1 / 2]

src/sitetypes/tj.jl

Lines changed: 10 additions & 172 deletions
Original file line numberDiff line numberDiff line change
@@ -1,176 +1,14 @@
11
Base.length(::SiteType"tJ") = 3
22

3-
# TODO: Define in terms of `"Electron"` with slicing.
4-
5-
Base.AbstractArray(::StateName"Emp", ::SiteType"tJ") = [1.0, 0, 0]
6-
Base.AbstractArray(::StateName"Up", ::SiteType"tJ") = [0.0, 1, 0]
7-
Base.AbstractArray(::StateName"Dn", ::SiteType"tJ") = [0.0, 0, 1]
8-
Base.AbstractArray(::StateName"0", st::SiteType"tJ") = AbstractArray(StateName("Emp"), st)
9-
Base.AbstractArray(::StateName"↑", st::SiteType"tJ") = AbstractArray(StateName("Up"), st)
10-
Base.AbstractArray(::StateName"↓", st::SiteType"tJ") = AbstractArray(StateName("Dn"), st)
11-
12-
# TODO: Update these to the latest syntax.
13-
## function op!(Op::ITensor, ::OpName"Nup", ::SiteType"tJ", s::Index)
14-
## return Op[s' => 2, s => 2] = 1.0
15-
## end
16-
## function op!(Op::ITensor, on::OpName"n↑", st::SiteType"tJ", s::Index)
17-
## return op!(Op, alias(on), st, s)
18-
## end
19-
##
20-
## function op!(Op::ITensor, ::OpName"Ndn", ::SiteType"tJ", s::Index)
21-
## return Op[s' => 3, s => 3] = 1.0
22-
## end
23-
## function op!(Op::ITensor, on::OpName"n↓", st::SiteType"tJ", s::Index)
24-
## return op!(Op, alias(on), st, s)
25-
## end
26-
##
27-
## function op!(Op::ITensor, ::OpName"Ntot", ::SiteType"tJ", s::Index)
28-
## Op[s' => 2, s => 2] = 1.0
29-
## return Op[s' => 3, s => 3] = 1.0
30-
## end
31-
## function op!(Op::ITensor, on::OpName"ntot", st::SiteType"tJ", s::Index)
32-
## return op!(Op, alias(on), st, s)
33-
## end
34-
##
35-
## function op!(Op::ITensor, ::OpName"Cup", ::SiteType"tJ", s::Index)
36-
## return Op[s' => 1, s => 2] = 1.0
37-
## end
38-
## function op!(Op::ITensor, on::OpName"c↑", st::SiteType"tJ", s::Index)
39-
## return op!(Op, alias(on), st, s)
40-
## end
41-
##
42-
## function op!(Op::ITensor, ::OpName"Cdagup", ::SiteType"tJ", s::Index)
43-
## return Op[s' => 2, s => 1] = 1.0
44-
## end
45-
## function op!(Op::ITensor, on::OpName"c†↑", st::SiteType"tJ", s::Index)
46-
## return op!(Op, alias(on), st, s)
47-
## end
48-
##
49-
## function op!(Op::ITensor, ::OpName"Cdn", ::SiteType"tJ", s::Index)
50-
## return Op[s' => 1, s => 3] = 1.0
51-
## end
52-
## function op!(Op::ITensor, on::OpName"c↓", st::SiteType"tJ", s::Index)
53-
## return op!(Op, alias(on), st, s)
54-
## end
55-
##
56-
## function op!(Op::ITensor, ::OpName"Cdagdn", ::SiteType"tJ", s::Index)
57-
## return Op[s' => 3, s => 1] = 1.0
58-
## end
59-
## function op!(Op::ITensor, on::OpName"c†↓", st::SiteType"tJ", s::Index)
60-
## return op!(Op, alias(on), st, s)
61-
## end
62-
##
63-
## function op!(Op::ITensor, ::OpName"Aup", ::SiteType"tJ", s::Index)
64-
## return Op[s' => 1, s => 2] = 1.0
65-
## end
66-
## function op!(Op::ITensor, on::OpName"a↑", st::SiteType"tJ", s::Index)
67-
## return op!(Op, alias(on), st, s)
68-
## end
69-
##
70-
## function op!(Op::ITensor, ::OpName"Adagup", ::SiteType"tJ", s::Index)
71-
## return Op[s' => 2, s => 1] = 1.0
72-
## end
73-
## function op!(Op::ITensor, on::OpName"a†↑", st::SiteType"tJ", s::Index)
74-
## return op!(Op, alias(on), st, s)
75-
## end
76-
##
77-
## function op!(Op::ITensor, ::OpName"Adn", ::SiteType"tJ", s::Index)
78-
## return Op[s' => 1, s => 3] = 1.0
79-
## end
80-
## function op!(Op::ITensor, on::OpName"a↓", st::SiteType"tJ", s::Index)
81-
## return op!(Op, alias(on), st, s)
82-
## end
83-
##
84-
## function op!(Op::ITensor, ::OpName"Adagdn", ::SiteType"tJ", s::Index)
85-
## return Op[s' => 3, s => 1] = 1.0
86-
## end
87-
## function op!(Op::ITensor, on::OpName"a†↓", st::SiteType"tJ", s::Index)
88-
## return op!(Op, alias(on), st, s)
89-
## end
90-
##
91-
## function op!(Op::ITensor, ::OpName"F", ::SiteType"tJ", s::Index)
92-
## Op[s' => 1, s => 1] = +1.0
93-
## Op[s' => 2, s => 2] = -1.0
94-
## return Op[s' => 3, s => 3] = -1.0
95-
## end
96-
##
97-
## function op!(Op::ITensor, ::OpName"Fup", ::SiteType"tJ", s::Index)
98-
## Op[s' => 1, s => 1] = +1.0
99-
## Op[s' => 2, s => 2] = -1.0
100-
## return Op[s' => 3, s => 3] = +1.0
101-
## end
102-
## function op!(Op::ITensor, on::OpName"F↑", st::SiteType"tJ", s::Index)
103-
## return op!(Op, alias(on), st, s)
104-
## end
105-
##
106-
## function op!(Op::ITensor, ::OpName"Fdn", ::SiteType"tJ", s::Index)
107-
## Op[s' => 1, s => 1] = +1.0
108-
## Op[s' => 2, s => 2] = +1.0
109-
## return Op[s' => 3, s => 3] = -1.0
110-
## end
111-
## function op!(Op::ITensor, on::OpName"F↓", st::SiteType"tJ", s::Index)
112-
## return op!(Op, alias(on), st, s)
113-
## end
114-
##
115-
## function op!(Op::ITensor, ::OpName"Sz", ::SiteType"tJ", s::Index)
116-
## Op[s' => 2, s => 2] = +0.5
117-
## return Op[s' => 3, s => 3] = -0.5
118-
## end
119-
##
120-
## function op!(Op::ITensor, ::OpName"Sᶻ", st::SiteType"tJ", s::Index)
121-
## return op!(Op, OpName("Sz"), st, s)
122-
## end
123-
##
124-
## function op!(Op::ITensor, ::OpName"Sx", ::SiteType"tJ", s::Index)
125-
## Op[s' => 2, s => 3] = 0.5
126-
## return Op[s' => 3, s => 2] = 0.5
127-
## end
128-
##
129-
## function op!(Op::ITensor, ::OpName"Sˣ", st::SiteType"tJ", s::Index)
130-
## return op!(Op, OpName("Sx"), st, s)
131-
## end
132-
##
133-
## function op!(Op::ITensor, ::OpName"S+", ::SiteType"tJ", s::Index)
134-
## return Op[s' => 2, s => 3] = 1.0
135-
## end
136-
##
137-
## function op!(Op::ITensor, ::OpName"S⁺", st::SiteType"tJ", s::Index)
138-
## return op!(Op, OpName("S+"), st, s)
139-
## end
140-
## function op!(Op::ITensor, ::OpName"Sp", st::SiteType"tJ", s::Index)
141-
## return op!(Op, OpName("S+"), st, s)
142-
## end
143-
## function op!(Op::ITensor, ::OpName"Splus", st::SiteType"tJ", s::Index)
144-
## return op!(Op, OpName("S+"), st, s)
145-
## end
146-
##
147-
## function op!(Op::ITensor, ::OpName"S-", ::SiteType"tJ", s::Index)
148-
## return Op[s' => 3, s => 2] = 1.0
149-
## end
150-
##
151-
## function op!(Op::ITensor, ::OpName"S⁻", st::SiteType"tJ", s::Index)
152-
## return op!(Op, OpName("S-"), st, s)
153-
## end
154-
## function op!(Op::ITensor, ::OpName"Sm", st::SiteType"tJ", s::Index)
155-
## return op!(Op, OpName("S-"), st, s)
156-
## end
157-
## function op!(Op::ITensor, ::OpName"Sminus", st::SiteType"tJ", s::Index)
158-
## return op!(Op, OpName("S-"), st, s)
159-
## end
160-
161-
has_fermion_string(::OpName"Cup", ::SiteType"tJ") = true
162-
function has_fermion_string(on::OpName"c↑", st::SiteType"tJ")
163-
return has_fermion_string(alias(on), st)
164-
end
165-
has_fermion_string(::OpName"Cdagup", ::SiteType"tJ") = true
166-
function has_fermion_string(on::OpName"c†↑", st::SiteType"tJ")
167-
return has_fermion_string(alias(on), st)
3+
function (n::StateName)(domain::SiteType"tJ")
4+
return n(SiteType"Electron"())[1:length(domain)]
1685
end
169-
has_fermion_string(::OpName"Cdn", ::SiteType"tJ") = true
170-
function has_fermion_string(on::OpName"c↓", st::SiteType"tJ")
171-
return has_fermion_string(alias(on), st)
172-
end
173-
has_fermion_string(::OpName"Cdagdn", ::SiteType"tJ") = true
174-
function has_fermion_string(on::OpName"c†↓", st::SiteType"tJ")
175-
return has_fermion_string(alias(on), st)
6+
7+
function (n::OpName)(domain::SiteType"tJ")
8+
return n(SiteType"Electron"())[1:length(domain), 1:length(domain)]
1769
end
10+
11+
has_fermion_string(::OpName"c↑", ::SiteType"tJ") = true
12+
has_fermion_string(::OpName"c†↑", ::SiteType"tJ") = true
13+
has_fermion_string(::OpName"c↓", ::SiteType"tJ") = true
14+
has_fermion_string(::OpName"c†↓", ::SiteType"tJ") = true

0 commit comments

Comments
 (0)