@@ -57,3 +57,49 @@ Base.similar(v::SectorVector, V::ElementarySpace) = SectorVector(undef, V)
5757blocksectors (v:: SectorVector ) = keys (v)
5858blocks (v:: SectorVector ) = pairs (v)
5959block (v:: SectorVector{T, I, A} , c:: I ) where {T, I, A} = Base. getindex (v, c)
60+
61+ # VectorInterface and LinearAlgebra interface
62+ # ----------------------------------------------
63+ VectorInterface. zerovector (v:: SectorVector , :: Type{T} ) where {T} =
64+ SectorVector (zerovector (parent (v), T), v. structure)
65+ VectorInterface. zerovector! (v:: SectorVector ) = (zerovector! (parent (v)); return v)
66+ VectorInterface. zerovector!! (v:: SectorVector ) = (zerovector!! (parent (v)); return v)
67+
68+ VectorInterface. scale (v:: SectorVector , α) = SectorVector (scale (parent (v), α), v. structure)
69+ VectorInterface. scale! (v:: SectorVector , α) = (scale! (parent (v), α); return v)
70+ VectorInterface. scale!! (v:: SectorVector , α) = (scale!! (parent (v), α); return v)
71+
72+ function VectorInterface. add (v1:: SectorVector , v2:: SectorVector , α = One (), β = One ())
73+ SectorVector (add (parent (v1), parent (v2), α, β), v1. structure)
74+ end
75+ function VectorInterface. add! (v1:: SectorVector , v2:: SectorVector , α = One (), β = One ())
76+ add! (parent (v1), parent (v2), α, β)
77+ return v1
78+ end
79+ function VectorInterface. add!! (v1:: SectorVector , v2:: SectorVector , α = One (), β = One ())
80+ add!! (parent (v1), parent (v2), α, β)
81+ return v1
82+ end
83+
84+ function VectorInterface. inner (v1:: SectorVector , v2:: SectorVector )
85+ v1. structure == v2. structure || throw (SpaceMismatch (" Sector structures do not match" ))
86+ I = sectortype (v1)
87+ if FusionStyle (I) isa UniqueFusion # all quantum dimensions are one
88+ return inner (parent (v1), parent (v2))
89+ else
90+ T = VectorInterface. promote_inner (v1, v2)
91+ s = zero (T)
92+ for c in blocksectors (v1)
93+ b1 = block (v1, c)
94+ b2 = block (v2, c)
95+ s += convert (T, dim (c)) * inner (b1, b2)
96+ end
97+ end
98+ return s
99+ end
100+
101+ LinearAlgebra. dot (v1:: SectorVector , v2:: SectorVector ) = inner (v1, v2)
102+
103+ function LinearAlgebra. norm (v:: SectorVector , p:: Real = 2 )
104+ return _norm (blocks (v), p, float (zero (real (scalartype (v)))))
105+ end
0 commit comments