@@ -254,8 +254,26 @@ dot(a, b) = materialize(Dot(a, b))
254
254
@inline LinearAlgebra. dot (a:: LayoutArray , b:: SubArray{<:Any,N,<:LayoutArray} ) where N = dot (a,b)
255
255
@inline LinearAlgebra. dot (a:: SubArray{<:Any,N,<:LayoutArray} , b:: SubArray{<:Any,N,<:LayoutArray} ) where N = dot (a,b)
256
256
257
- # Temporary until layout 3-arg dot is added.
257
+ # Temporary until layout 3-arg dot is added.
258
258
# We go to generic fallback as layout-arrays are structured
259
259
dot (x, A, y) = dot (x, mul (A, y))
260
260
LinearAlgebra. dot (x:: AbstractVector , A:: LayoutMatrix , y:: AbstractVector ) = dot (x, A, y)
261
261
LinearAlgebra. 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