140140@op_alias " adag" " a†"
141141alias (:: OpName"a" ) = OpName " a†" ()'
142142@op_alias " A" " a"
143+
143144alias (:: 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+
145155alias (:: OpName"aa" ) = OpName (" a" ) ⊗ OpName (" a" )
146156alias (:: OpName"a†a" ) = OpName (" a†" ) ⊗ OpName (" a" )
147157alias (:: 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 "
185195alias (n:: OpName"Sx" ) = OpName " X" () / 2
186196@op_alias " Sˣ" " Sx"
187197@op_alias " Sₓ" " Sx"
188198alias (:: 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+
190204alias (:: 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 " Sʸ" " Sy"
207- alias (n:: OpName"iSy" ) = OpName ( " iY" ) / 2
221+ alias (n:: OpName"iSy" ) = OpName " iY" ( ) / 2
208222@op_alias " iSʸ" " iSy"
209223alias (:: 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+
211250function Base. AbstractArray (n:: OpName"σᶻ" , domain_size:: Tuple{Int} )
212251 d = only (domain_size)
213252 s = (d - 1 ) / 2
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" ()
224263alias (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 " S²" " S2"
236275alias (:: 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+
238281using LinearAlgebra: eigen
239282function 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]
243286end
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))
355424end
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.
362429using LinearAlgebra: ⋅
0 commit comments