@@ -37,124 +37,48 @@ julia> Pkg.add("ITensorQuantumOperatorDefinitions")
3737
3838# ## Examples
3939
40- using ITensorQuantumOperatorDefinitions: ITensorQuantumOperatorDefinitions as Ops
41-
42- using ITensorBase: ITensor, Index, tags
4340using ITensorQuantumOperatorDefinitions:
44- OpName, SiteType, StateName, ⊗ , controlled, expand, op, siteind, siteinds , state
41+ OpName, SiteType, StateName, ⊗ , controlled, op , state
4542using LinearAlgebra: Diagonal
43+ using SparseArrays: SparseMatrixCSC, SparseVector
4644using Test: @test
4745
48- @test length (SiteType (" Qubit" )) == 2
49- @test size (SiteType (" Qubit" )) == (2 ,)
50- @test size (SiteType (" Qubit" ), 1 ) == 2
51- @test axes (SiteType (" Qubit" )) == (Base. OneTo (2 ),)
52- @test axes (SiteType (" Qubit" ), 1 ) == Base. OneTo (2 )
53-
54- # TODO : Delete.
55- # # @test Integer(StateName("0"), SiteType("Qubit")) === 1
56- # # @test Integer(StateName("0")) == 1
57- # # @test Integer(StateName("1"), SiteType("Qubit")) === 2
58- # # @test Integer(StateName("1")) == 2
59- # # @test Int(StateName("0"), SiteType("Qubit")) === 1
60- # # @test Int(StateName("1"), SiteType("Qubit")) === 2
61- # # @test Int32(StateName("0"), SiteType("Qubit")) === Int32(1)
62- # # @test Int32(StateName("1"), SiteType("Qubit")) === Int32(2)
63- # #
64- # # @test Integer(StateName("Up"), SiteType("Qubit")) === 1
65- # # @test Integer(StateName("Dn"), SiteType("Qubit")) === 2
66- # # @test Int(StateName("Up"), SiteType("Qubit")) === 1
67- # # @test Int(StateName("Dn"), SiteType("Qubit")) === 2
68- # # @test Int32(StateName("Up"), SiteType("Qubit")) === Int32(1)
69- # # @test Int32(StateName("Dn"), SiteType("Qubit")) === Int32(2)
70-
71- @test AbstractArray (StateName (" 0" ), SiteType (" Qubit" )) == [1 , 0 ]
72- @test AbstractArray (StateName (" 1" ), SiteType (" Qubit" )) == [0 , 1 ]
73- @test AbstractArray {Float32} (StateName (" 0" ), SiteType (" Qubit" )) == Float32[1 , 0 ]
74- @test AbstractArray {Float32} (StateName (" 1" ), SiteType (" Qubit" )) == Float32[0 , 1 ]
75- @test Vector {Float32} (StateName (" 0" ), SiteType (" Qubit" )) == Float32[1 , 0 ]
76- @test Vector {Float32} (StateName (" 1" ), SiteType (" Qubit" )) == Float32[0 , 1 ]
77-
78- # # TODO : Add this back.
79- # # @test AbstractArray(StateName("Up"), SiteType("Qubit")) == [1, 0]
80- # # @test AbstractArray(StateName("Dn"), SiteType("Qubit")) == [0, 1]
81-
82- @test Matrix (OpName (" X" ), SiteType (" Qubit" )) == [0 1 ; 1 0 ]
83- @test Matrix (OpName (" σx" ), SiteType (" Qubit" )) == [0 1 ; 1 0 ]
84- @test Matrix (OpName (" σ1" ), SiteType (" Qubit" )) == [0 1 ; 1 0 ]
85- @test Matrix (OpName (" Z" ), SiteType (" Qubit" )) == [1 0 ; 0 - 1 ]
86-
87- @test Matrix (OpName (" Rx" ; θ= π), SiteType (" Qubit" )) ≈ [0 - im; - im 0 ]
88-
89- # # TODO : Delete.
90- # #@test Matrix(OpName("Rx"; θ=π)) ≈ [0 -im; -im 0]
91-
92- @test Array {<:Any,4} (OpName (" CNOT" ), (SiteType (" Qubit" ), SiteType (" Qubit" ))) ==
93- [1 ; 0 ;; 0 ; 0 ;;; 0 ; 1 ;; 0 ; 0 ;;;; 0 ; 0 ;; 0 ; 1 ;;; 0 ; 0 ;; 1 ; 0 ]
94-
95- # TODO : Support:
96- # `AbstractArray(OpName("CNOT"), (2, 2))`?
97-
98- @test Array (OpName (" CNOT" ), (SiteType (" Qubit" ), SiteType (" Qubit" ))) ==
99- [1 0 0 0 ; 0 1 0 0 ; 0 0 0 1 ; 0 0 1 0 ]
100-
101- # TODO : Should we allow this?
102- # @test Array(OpName("CNOT"), (SiteType("Qubit"), SiteType("Qudit"; length=2))) == [1 0 0 0; 0 1 0 0; 0 0 0 1; 0 0 1 0]
103-
104- @test AbstractArray (OpName (" I" ), SiteType (" Qudit" ; length= 4 )) == Diagonal (trues (4 ))
105- @test AbstractArray (OpName (" Id" ), SiteType (" Qudit" ; length= 4 )) == Diagonal (trues (4 ))
106-
107- @test Matrix (exp (- im * π / 4 * kron (OpName (" X" ), OpName (" X" )))) ≈
108- Matrix (OpName (" RXX" ; θ= π / 2 ))
109- @test Matrix (exp (- im * π / 4 * kron (OpName (" Y" ), OpName (" Y" )))) ≈
110- Matrix (OpName (" RYY" ; θ= π / 2 ))
111- @test Matrix (exp (- im * π / 4 * kron (OpName (" Z" ), OpName (" Z" )))) ≈
112- Matrix (OpName (" RZZ" ; θ= π / 2 ))
113-
114- # TODO : This is broken, investigate.
115- # @test Matrix(exp(-im * π/4 * kron(OpName("X"), OpName("Y")))) ≈ Matrix(OpName("RXY"; θ=π/2))
116-
117- @test siteind (" Qubit" ) isa Index
118- @test Int (length (siteind (" Qubit" ))) == 2
119- @test " Qubit" in tags (siteind (" Qubit" ))
120- @test siteinds (" Qubit" , 4 ) isa Vector{<: Index }
121- @test length (siteinds (" Qubit" , 4 )) == 4
122- @test all (s -> " Qubit" in tags (s), siteinds (" Qubit" , 4 ))
123-
124- I, X, Y, Z = OpName .((" I" , " X" , " Y" , " Z" ))
125- paulis = (I, X, Y, Z)
126-
127- M = randn (ComplexF64, (2 , 2 ))
128- c = expand (M, Matrix .(paulis))
129- M′ = Matrix (sum (c .* paulis))
130- @test M ≈ M′
131-
132- paulis2 = vec (splat (kron).(Iterators. product (paulis, paulis)))
133- M2 = randn (ComplexF64, (4 , 4 ))
134- c2 = expand (M2, Matrix .(paulis2))
135- M2′ = Matrix (sum (c2 .* paulis2))
136- @test M2 ≈ M2′
137-
138- @test AbstractArray (I, (SiteType (" Qubit" ), SiteType (" Qudit" ; length= 3 ))) ==
139- Diagonal (trues (6 ))
140- @test AbstractArray {<:Any,4} (I, (SiteType (" Qubit" ), SiteType (" Qudit" ; length= 3 ))) ==
141- reshape (Diagonal (trues (6 )), (2 , 3 , 2 , 3 ))
142-
143- s1, s2 = Index .((2 , 2 ), " Qubit" )
144- # TODO : Define.
145- # # @test ITensor(OpName("Rx"; θ=π), s1) ≈ ITensor([0 -im; -im 0], (s1', s1))
146- # Specify just the domain.
147- # # ITensor(OpName("CNOT"), (s1, s2))
148- # TODO : Allow specifying codomain and domain.
149- # ITensor(OpName("CNOT"), (s1', s2'), dag.((s1, s2)))
150- # TODO : Allow specifying the array type.
151- # ITensor(Array{Float32}, OpName("CNOT"), (s1', s2'), dag.((s1, s2)))
152- # TODO : Allow specifying the eltype.
153- # ITensor(Float32, OpName("CNOT"), (s1', s2'), dag.((s1, s2)))
154-
155- # # @test val(s, "Up") == 1
156- # # @test val(s, "Dn") == 2
157- # # @test state("Up", s) == ITensor([1, 0], (s,))
158- # # @test state("Dn", s) == ITensor([0, 1], (s,))
159- # # @test op("X", s) == ITensor([0 1; 1 0], (s', s))
160- # # @test op("Z", s) == ITensor([1 0; 0 -1], (s', s))
46+ @test state (" 0" ) == [1 , 0 ]
47+ @test state (" 1" ) == [0 , 1 ]
48+
49+ @test state (Float32, " 0" ) == [1 , 0 ]
50+ @test eltype (state (Float32, " 1" )) === Float32
51+
52+ @test Vector (StateName (" 0" )) == [1 , 0 ]
53+ @test Vector (StateName (" 1" )) == [0 , 1 ]
54+
55+ @test Vector {Float32} (StateName (" 0" )) == [1 , 0 ]
56+ @test eltype (Vector {Float32} (StateName (" 0" ))) === Float32
57+
58+ @test state (SparseVector, " 0" ) == [1 , 0 ]
59+ @test state (SparseVector, " 0" ) isa SparseVector
60+
61+ @test state (" 0" , 3 ) == [1 , 0 , 0 ]
62+ @test state (" 1" , 3 ) == [0 , 1 , 0 ]
63+ @test state (" 2" , 3 ) == [0 , 0 , 1 ]
64+
65+ @test Vector (StateName (" 0" ), 3 ) == [1 , 0 , 0 ]
66+ @test Vector (StateName (" 1" ), 3 ) == [0 , 1 , 0 ]
67+ @test Vector (StateName (" 2" ), 3 ) == [0 , 0 , 1 ]
68+
69+ @test op (" X" ) == [0 1 ; 1 0 ]
70+ @test op (" Y" ) == [0 - im; im 0 ]
71+ @test op (" Z" ) == [1 0 ; 0 - 1 ]
72+
73+ @test op (" Z" ) isa Diagonal
74+
75+ @test op (Float32, " X" ) == [0 1 ; 1 0 ]
76+ @test eltype (op (Float32, " X" )) === Float32
77+ @test op (SparseMatrixCSC, " X" ) == [0 1 ; 1 0 ]
78+ @test op (SparseMatrixCSC, " X" ) isa SparseMatrixCSC
79+
80+ @test Matrix (OpName (" X" )) == [0 1 ; 1 0 ]
81+ @test Matrix (OpName (" Y" )) == [0 - im; im 0 ]
82+ @test Matrix (OpName (" Z" )) == [1 0 ; 0 - 1 ]
83+
84+ @test Matrix (OpName (" Rx" ; θ= π / 3 )) ≈ [sin (π / 3 ) - cos (π / 3 )* im; - cos (π / 3 )* im sin (π / 3 )]
0 commit comments