@@ -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