@@ -254,8 +254,26 @@ dot(a, b) = materialize(Dot(a, b))
254254@inline LinearAlgebra. dot (a:: LayoutArray , b:: SubArray{<:Any,N,<:LayoutArray} ) where N = dot (a,b)
255255@inline LinearAlgebra. dot (a:: SubArray{<:Any,N,<:LayoutArray} , b:: SubArray{<:Any,N,<:LayoutArray} ) where N = dot (a,b)
256256
257- # Temporary until layout 3-arg dot is added.
257+ # Temporary until layout 3-arg dot is added.
258258# We go to generic fallback as layout-arrays are structured
259259dot (x, A, y) = dot (x, mul (A, y))
260260LinearAlgebra. dot (x:: AbstractVector , A:: LayoutMatrix , y:: AbstractVector ) = dot (x, A, y)
261261LinearAlgebra. dot (x:: AbstractVector , A:: Symmetric{<:Real,<:LayoutMatrix} , y:: AbstractVector ) = dot (x, A, y)
262+
263+
264+
265+ # allow overloading for infinite or lazy case
266+ @inline _power_by_squaring (_, _, A, p) = Base. invoke (Base. power_by_squaring, Tuple{AbstractMatrix,Integer}, A, p)
267+ @inline _apply (_, _, op, A:: AbstractMatrix , Λ:: UniformScaling ) = Base. invoke (op, Tuple{AbstractMatrix,UniformScaling}, A, Λ)
268+ @inline _apply (_, _, op, Λ:: UniformScaling , A:: AbstractMatrix ) = Base. invoke (op, Tuple{UniformScaling,AbstractMatrix}, Λ, A)
269+
270+ for Typ in (:LayoutMatrix , :(Symmetric{<: Any ,<: LayoutMatrix }), :(Hermitian{<: Any ,<: LayoutMatrix }),
271+ :(Adjoint{<: Any ,<: LayoutMatrix }), :(Transpose{<: Any ,<: LayoutMatrix }))
272+ @eval begin
273+ @inline Base. power_by_squaring (A:: $Typ , p:: Integer ) = _power_by_squaring (MemoryLayout (A), size (A), A, p)
274+ @inline + (A:: $Typ , Λ:: UniformScaling ) = _apply (MemoryLayout (A), size (A), + , A, Λ)
275+ @inline + (Λ:: UniformScaling , A:: $Typ ) = _apply (MemoryLayout (A), size (A), + , Λ, A)
276+ @inline - (A:: $Typ , Λ:: UniformScaling ) = _apply (MemoryLayout (A), size (A), - , A, Λ)
277+ @inline - (Λ:: UniformScaling , A:: $Typ ) = _apply (MemoryLayout (A), size (A), - , Λ, A)
278+ end
279+ end
0 commit comments