|
1 | | -using ChainRulesCore: @non_differentiable |
2 | | - |
3 | | -alias(t::SiteType"Qudit") = t |
4 | 1 | Base.length(t::SiteType"Qudit") = t.length |
5 | 2 |
|
6 | | -""" |
7 | | - space(::SiteType"Qudit") |
8 | | -
|
9 | | -Create the Hilbert space for a site of type "Qudit". |
10 | | -
|
11 | | -Optionally specify the conserved symmetries and their quantum number labels. |
12 | | -""" |
13 | | -function space(::SiteType"Qudit"; dim=2) |
14 | | - return dim |
15 | | -end |
16 | | - |
17 | | -function val(::ValName{N}, ::SiteType"Qudit") where {N} |
18 | | - return parse(Int, String(N)) + 1 |
19 | | -end |
| 3 | +# TODO: Add this. |
| 4 | +## function Base.Integer(::StateName{N}) where {N} |
| 5 | +## return parse(Int, String(N)) |
| 6 | +## end |
20 | 7 |
|
21 | | -function state(::StateName{N}, ::SiteType"Qudit") where {N} |
| 8 | +function Base.AbstractArray(n::StateName{N}, ::Tuple{SiteType"Qudit"}) where {N} |
| 9 | + # TODO: Use `Integer(n)`. |
22 | 10 | n = parse(Int, String(N)) |
23 | | - st = zeros(dim(s)) |
24 | | - st[n + 1] = 1.0 |
25 | | - return st |
26 | | -end |
27 | | - |
28 | | -# one-body operators |
29 | | -function op(::OpName"Id", ::SiteType"Qudit", ds::Int...) |
30 | | - d = prod(ds) |
31 | | - return Matrix(1.0I, d, d) |
32 | | -end |
33 | | -op(on::OpName"I", st::SiteType"Qudit", ds::Int...) = op(alias(on), st, ds...) |
34 | | -op(on::OpName"F", st::SiteType"Qudit", ds::Int...) = op(OpName"Id"(), st, ds...) |
35 | | - |
36 | | -function op(::OpName"Adag", ::SiteType"Qudit", d::Int) |
37 | | - mat = zeros(d, d) |
38 | | - for k in 1:(d - 1) |
39 | | - mat[k + 1, k] = √k |
40 | | - end |
41 | | - return mat |
| 11 | + a = falses(dim(s)) |
| 12 | + a[n + 1] = one(Bool) |
| 13 | + return a |
42 | 14 | end |
43 | | -op(on::OpName"adag", st::SiteType"Qudit", d::Int) = op(alias(on), st, d) |
44 | | -op(on::OpName"a†", st::SiteType"Qudit", d::Int) = op(alias(on), st, d) |
45 | 15 |
|
46 | | -function op(::OpName"A", ::SiteType"Qudit", d::Int) |
47 | | - mat = zeros(d, d) |
| 16 | +function Base.AbstractArray(n::OpName"a†", t::Tuple{SiteType"Qudit"}) |
| 17 | + d = length(t) |
| 18 | + a = zeros(d, d) |
48 | 19 | for k in 1:(d - 1) |
49 | | - mat[k, k + 1] = √k |
| 20 | + a[k + 1, k] = √k |
50 | 21 | end |
51 | | - return mat |
| 22 | + return a |
52 | 23 | end |
53 | | -op(on::OpName"a", st::SiteType"Qudit", d::Int) = op(alias(on), st, d) |
| 24 | +@op_alias "Adag" "a†" |
| 25 | +@op_alias "adag" "a†" |
54 | 26 |
|
55 | | -function op(::OpName"N", ::SiteType"Qudit", d::Int) |
56 | | - mat = zeros(d, d) |
57 | | - for k in 1:d |
58 | | - mat[k, k] = k - 1 |
59 | | - end |
60 | | - return mat |
61 | | -end |
62 | | -op(on::OpName"n", st::SiteType"Qudit", d::Int) = op(alias(on), st, d) |
63 | | - |
64 | | -# two-body operators |
65 | | -function op(::OpName"ab", st::SiteType"Qudit", d1::Int, d2::Int) |
66 | | - return kron(op(OpName("a"), st, d1), op(OpName("a"), st, d2)) |
67 | | -end |
| 27 | +alias(::OpName"a") = OpName"a†"()' |
| 28 | +@op_alias "A" "a" |
68 | 29 |
|
69 | | -function op(::OpName"a†b", st::SiteType"Qudit", d1::Int, d2::Int) |
70 | | - return kron(op(OpName("a†"), st, d1), op(OpName("a"), st, d2)) |
71 | | -end |
72 | | - |
73 | | -function op(::OpName"ab†", st::SiteType"Qudit", d1::Int, d2::Int) |
74 | | - return kron(op(OpName("a"), st, d1), op(OpName("a†"), st, d2)) |
75 | | -end |
76 | | - |
77 | | -function op(::OpName"a†b†", st::SiteType"Qudit", d1::Int, d2::Int) |
78 | | - return kron(op(OpName("a†"), st, d1), op(OpName("a†"), st, d2)) |
79 | | -end |
80 | | - |
81 | | -## TODO: Make this logic more general. |
82 | | -## # interface |
83 | | -## function op(on::OpName, st::SiteType"Qudit", s1::Index, s_tail::Index...; kwargs...) |
84 | | -## rs = reverse((s1, s_tail...)) |
85 | | -## ds = dim.(rs) |
86 | | -## opmat = op(on, st, ds...; kwargs...) |
87 | | -## return itensor(opmat, prime.(rs)..., dag.(rs)...) |
88 | | -## end |
89 | | - |
90 | | -function op(on::OpName, st::SiteType"Qudit"; kwargs...) |
91 | | - return error("`op` can't be called without indices or dimensions.") |
92 | | -end |
| 30 | +alias(::OpName"n") = OpName"a†"() * OpName"a"() |
| 31 | +@op_alias "N" "n" |
93 | 32 |
|
94 | | -# Zygote |
95 | | -@non_differentiable op(::OpName"ab", ::SiteType"Qudit", ::Int, ::Int) |
96 | | -@non_differentiable op(::OpName"a†b", ::SiteType"Qudit", ::Int, ::Int) |
97 | | -@non_differentiable op(::OpName"ab†", ::SiteType"Qudit", ::Int, ::Int) |
98 | | -@non_differentiable op(::OpName"a†b†", ::SiteType"Qudit", ::Int, ::Int) |
99 | | -@non_differentiable op(::OpName"a", ::SiteType"Qudit", ::Int) |
100 | | -@non_differentiable op(::OpName"a†", ::SiteType"Qudit", ::Int) |
101 | | -@non_differentiable op(::OpName"N", ::SiteType"Qudit", ::Int) |
| 33 | +alias(::OpName"aa") = OpName("a") ⊗ OpName("a") |
| 34 | +alias(::OpName"a†a") = OpName("a†") ⊗ OpName("a") |
| 35 | +alias(::OpName"aa†") = OpName("a") ⊗ OpName("a†") |
| 36 | +alias(::OpName"a†a†") = OpName("a†") ⊗ OpName("a†") |
0 commit comments