@@ -6,35 +6,39 @@ alias(::SiteType"SpinHalf=1/2") = SiteType"Qubit"()
66
77Base. length (:: SiteType"Qubit" ) = 2
88
9- ( :: StateName"↑" )( :: SiteType"Qubit" ) = StateName " 0 " ()( 2 )
10- ( :: StateName"Up" )( :: SiteType"Qubit" ) = StateName " 0 " ()( 2 )
9+ # Avoid aliases since these aren't generic
10+ # to Qudits/higher spin.
1111(:: StateName"Z+" )(:: SiteType"Qubit" ) = StateName " 0" ()(2 )
12- (:: StateName"Zp" )(:: SiteType"Qubit" ) = StateName " 0" ()(2 )
13- (:: StateName"Emp" )(:: SiteType"Qubit" ) = StateName " 0" ()(2 )
12+ (:: StateName"Zp" )(domain:: SiteType"Qubit" ) = StateName " Z+" ()(domain)
13+ (:: StateName"↑" )(domain:: SiteType"Qubit" ) = StateName " Z+" ()(domain)
14+ (:: StateName"Up" )(domain:: SiteType"Qubit" ) = StateName " Z+" ()(domain)
15+ (:: StateName"Emp" )(domain:: SiteType"Qubit" ) = StateName " Z+" ()(domain)
1416
15- ( :: StateName"↓" )( :: SiteType"Qubit" ) = StateName " 1 " ()( 2 )
16- ( :: StateName"Dn" )( :: SiteType"Qubit" ) = StateName " 1 " ()( 2 )
17+ # Avoid aliases since these aren't generic
18+ # to Qudits/higher spin.
1719(:: StateName"Z-" )(:: SiteType"Qubit" ) = StateName " 1" ()(2 )
18- (:: StateName"Zm" )(:: SiteType"Qubit" ) = StateName " 1" ()(2 )
19- (:: StateName"Occ" )(:: SiteType"Qubit" ) = StateName " 1" ()(2 )
20+ (:: StateName"Zm" )(domain:: SiteType"Qubit" ) = StateName " Z-" ()(domain)
21+ (:: StateName"↓" )(domain:: SiteType"Qubit" ) = StateName " Z-" ()(domain)
22+ (:: StateName"Dn" )(domain:: SiteType"Qubit" ) = StateName " Z-" ()(domain)
23+ (:: StateName"Occ" )(domain:: SiteType"Qubit" ) = StateName " Z-" ()(domain)
2024
2125# `eigvecs(X)`
22- alias (:: StateName"+" ) = (StateName " 0" () + StateName " 1" ()) / √ 2
23- @state_alias " X+ " " + "
24- @state_alias " Xp " " + "
26+ (:: StateName"X +" )( :: SiteType"Qubit" ) = (( StateName " 0" () + StateName " 1" ()) / √ 2 )( 2 )
27+ ( :: StateName"Xp" )(domain :: SiteType"Qubit" ) = StateName " X+ " ()(domain)
28+ ( :: StateName"+" )(domain :: SiteType"Qubit" ) = StateName " X+ " ()(domain)
2529
26- alias (:: StateName"-" ) = (StateName " 0" () - StateName " 1" ()) / √ 2
27- @state_alias " X- " " - "
28- @state_alias " Xm " " - "
30+ (:: StateName"X -" )( :: SiteType"Qubit" ) = (( StateName " 0" () - StateName " 1" ()) / √ 2 )( 2 )
31+ ( :: StateName"Xm" )(domain :: SiteType"Qubit" ) = StateName " X- " ()(domain)
32+ ( :: StateName"-" )(domain :: SiteType"Qubit" ) = StateName " X- " ()(domain)
2933
3034# `eigvecs(Y)`
31- alias (:: StateName"i" ) = (StateName " 0" () + im * StateName " 1" ()) / √ 2
32- @state_alias " Y+" " i "
33- @state_alias " Yp " " i "
35+ (:: StateName"Y+" )( :: SiteType"Qubit" ) = (( StateName " 0" () + im * StateName " 1" ()) / √ 2 )( 2 )
36+ ( :: StateName"Yp" )(domain :: SiteType"Qubit" ) = StateName " Y+" ()(domain)
37+ ( :: StateName"i" )(domain :: SiteType"Qubit" ) = StateName " Y+ " ()(domain)
3438
35- alias (:: StateName"-i" ) = (StateName " 0" () - im * StateName " 1" ()) / √ 2
36- @state_alias " Y- " " -i "
37- @state_alias " Ym " " -i "
39+ (:: StateName"Y-" )( :: SiteType"Qubit" ) = (( StateName " 0" () - im * StateName " 1" ()) / √ 2 )( 2 )
40+ ( :: StateName"Ym" )(domain :: SiteType"Qubit" ) = StateName " Y- " ()(domain)
41+ ( :: StateName"-i" )(domain :: SiteType"Qubit" ) = StateName " Y- " ()(domain)
3842
3943# SIC-POVMs
4044(:: StateName"Tetra0" )(:: SiteType"Qubit" ) = [
@@ -55,48 +59,51 @@ alias(::StateName"-i") = (StateName"0"() - im * StateName"1"()) / √2
5559]
5660
5761# TODO : Define as `(I + σᶻ) / 2`?
58- alias (:: OpName"ProjUp" ) = OpName " Proj" (; index= 1 )
59- @op_alias " projUp" " ProjUp"
60- @op_alias " Proj↑" " ProjUp"
61- @op_alias " proj↑" " ProjUp"
62- @op_alias " Proj0" " ProjUp"
63- @op_alias " proj0" " ProjUp"
62+ (:: OpName"ProjUp" )( :: SiteType"Qubit" ) = OpName " Proj" (; index= 1 )( 2 )
63+ ( :: OpName "projUp")(domain :: SiteType"Qubit" ) = OpName " ProjUp" ()(domain)
64+ ( :: OpName "Proj↑")(domain :: SiteType"Qubit" ) = OpName " ProjUp" ()(domain)
65+ ( :: OpName "proj↑")(domain :: SiteType"Qubit" ) = OpName " ProjUp" ()(domain)
66+ ( :: OpName "Proj0")(domain :: SiteType"Qubit" ) = OpName " ProjUp" ()(domain)
67+ ( :: OpName "proj0")(domain :: SiteType"Qubit" ) = OpName " ProjUp" ()(domain)
6468
6569# TODO : Define as `σ⁺ * σ⁻`?
6670# TODO : Define as `(I - σᶻ) / 2`?
67- alias (:: OpName"ProjDn" ) = OpName " Proj" (; index= 2 )
68- @op_alias " projDn" " ProjDn"
69- @op_alias " Proj↓" " ProjDn"
70- @op_alias " proj↓" " ProjDn"
71- @op_alias " Proj1" " ProjDn"
72- @op_alias " proj1" " ProjDn"
71+ (:: OpName"ProjDn" )( :: SiteType"Qubit" ) = OpName " Proj" (; index= 2 )( 2 )
72+ ( :: OpName "projDn")(domain :: SiteType"Qubit" ) = OpName " ProjDn" ()(domain)
73+ ( :: OpName "Proj↓")(domain :: SiteType"Qubit" ) = OpName " ProjDn" ()(domain)
74+ ( :: OpName "proj↓")(domain :: SiteType"Qubit" ) = OpName " ProjDn" ()(domain)
75+ ( :: OpName "Proj1")(domain :: SiteType"Qubit" ) = OpName " ProjDn" ()(domain)
76+ ( :: OpName "proj1")(domain :: SiteType"Qubit" ) = OpName " ProjDn" ()(domain)
7377
74- # Rotation around generic axis n̂
75- # exp(-im * n.θ / 2 * n̂ ⋅ σ⃗)
76- #=
77- TODO : Define R-gate when `λ == -ϕ`, i.e.:
78- ```julia
79- function Base.AbstractArray(n::OpName"R", ::Tuple{SiteType"Qubit"})
80- return [
81- cos(n.θ / 2) -exp(-im * n.ϕ)*sin(n.θ / 2)
82- exp(im * n.ϕ)*sin(n.θ / 2) cos(n.θ / 2)
83- ]
84- end
85- ```
86- or:
87- ```julia
88- alias(n::OpName"R") = OpName"Rn"(; θ=n.θ, ϕ=n.ϕ, λ=-n.ϕ)
89- =#
90- # https://docs.quantum.ibm.com/api/qiskit/qiskit.circuit.library.UGate
91- # TODO : Generalize to `"Qudit"`, see:
92- # https://quantumcomputing.stackexchange.com/questions/16251/how-does-a-general-rotation-r-hatn-theta-related-to-u-3-gate
93- # https://quantumcomputing.stackexchange.com/questions/4249/decomposition-of-an-arbitrary-1-qubit-gate-into-a-specific-gateset
94- # https://en.wikipedia.org/wiki/List_of_quantum_logic_gates#Other_named_gates
95- # https://en.wikipedia.org/wiki/Spin_(physics)#Higher_spins
96- function (n:: OpName"Rn" )(:: SiteType"Qubit" )
97- return [
98- cos (n. θ / 2 ) - exp (im * n. λ)* sin (n. θ / 2 )
99- exp (im * n. ϕ)* sin (n. θ / 2 ) exp (im * (n. ϕ + n. λ))* cos (n. θ / 2 )
100- ]
101- end
102- @op_alias " Rn̂" " Rn"
78+ # # TODO : Bring this back, decide on names and angle conventions.
79+ # # # Related to rotation `"Rn"` around generic axis n̂:
80+ # # # exp(-im * n.θ / 2 * n̂ ⋅ σ⃗)
81+ # # #=
82+ # # TODO : Define R-gate when `λ == -ϕ`, i.e.:
83+ # # ```julia
84+ # # function Base.AbstractArray(n::OpName"R", ::Tuple{SiteType"Qubit"})
85+ # # return [
86+ # # cos(n.θ / 2) -exp(-im * n.ϕ)*sin(n.θ / 2)
87+ # # exp(im * n.ϕ)*sin(n.θ / 2) cos(n.θ / 2)
88+ # # ]
89+ # # end
90+ # # ```
91+ # # or:
92+ # # ```julia
93+ # # alias(n::OpName"R") = OpName"Rn"(; θ=n.θ, ϕ=n.ϕ, λ=-n.ϕ)
94+ # # =#
95+ # # # https://docs.quantum.ibm.com/api/qiskit/qiskit.circuit.library.UGate
96+ # # # TODO : Generalize to `"Qudit"`, see:
97+ # # # https://quantumcomputing.stackexchange.com/questions/16251/how-does-a-general-rotation-r-hatn-theta-related-to-u-3-gate
98+ # # # https://quantumcomputing.stackexchange.com/questions/4249/decomposition-of-an-arbitrary-1-qubit-gate-into-a-specific-gateset
99+ # # # https://en.wikipedia.org/wiki/List_of_quantum_logic_gates#Other_named_gates
100+ # # # https://en.wikipedia.org/wiki/Spin_(physics)#Higher_spins
101+ # # # https://qudev.phys.ethz.ch/static/content/courses/QSIT07/presentations/Schmassmann.pdf
102+ # # # http://theory.caltech.edu/~preskill/ph219/chap5_15.pdf
103+ # # # https://almuhammadi.com/sultan/books_2020/Nielsen_Chuang.pdf (Chapter 4)
104+ # # function (n::OpName"GeneralRotation")(::SiteType"Qubit")
105+ # # return [
106+ # # cos(n.θ / 2) -exp(im * n.λ)*sin(n.θ / 2)
107+ # # exp(im * n.ϕ)*sin(n.θ / 2) exp(im * (n.ϕ + n.λ))*cos(n.θ / 2)
108+ # # ]
109+ # # end
0 commit comments