@@ -144,47 +144,47 @@ end
144
144
145
145
for op in (:- , :+ )
146
146
@eval begin
147
- function $op (A:: SymTriPertToeplitz{T} , λ:: UniformScaling ) where T
147
+ function $op (A:: SymTriPertToeplitz{T} , λ:: UniformScaling ) where T
148
148
TV = promote_type (T,eltype (λ))
149
149
dv = Vcat (convert .(AbstractVector{TV}, A. dv. args)... )
150
150
ev = Vcat (convert .(AbstractVector{TV}, A. ev. args)... )
151
151
SymTridiagonal (broadcast ($ op, dv, Ref (λ. λ)), ev)
152
152
end
153
153
function $op (λ:: UniformScaling , A:: SymTriPertToeplitz{V} ) where V
154
154
TV = promote_type (eltype (λ),V)
155
- SymTridiagonal (convert (AbstractVector{TV}, broadcast ($ op, Ref (λ. λ), A. dv)),
155
+ SymTridiagonal (convert (AbstractVector{TV}, broadcast ($ op, Ref (λ. λ), A. dv)),
156
156
convert (AbstractVector{TV}, broadcast ($ op, A. ev)))
157
157
end
158
- function $op (A:: SymTridiagonal{T,<:AbstractFill} , λ:: UniformScaling ) where T
158
+ function $op (A:: SymTridiagonal{T,<:AbstractFill} , λ:: UniformScaling ) where T
159
159
TV = promote_type (T,eltype (λ))
160
160
SymTridiagonal (convert (AbstractVector{TV}, broadcast ($ op, A. dv, Ref (λ. λ))),
161
161
convert (AbstractVector{TV}, A. ev))
162
162
end
163
163
164
- function $op (A:: TriPertToeplitz{T} , λ:: UniformScaling ) where T
164
+ function $op (A:: TriPertToeplitz{T} , λ:: UniformScaling ) where T
165
165
TV = promote_type (T,eltype (λ))
166
- Tridiagonal (Vcat (convert .(AbstractVector{TV}, A. dl. args)... ),
167
- Vcat (convert .(AbstractVector{TV}, broadcast ($ op, A. d, λ. λ). args)... ),
166
+ Tridiagonal (Vcat (convert .(AbstractVector{TV}, A. dl. args)... ),
167
+ Vcat (convert .(AbstractVector{TV}, broadcast ($ op, A. d, λ. λ). args)... ),
168
168
Vcat (convert .(AbstractVector{TV}, A. du. args)... ))
169
169
end
170
170
function $op (λ:: UniformScaling , A:: TriPertToeplitz{V} ) where V
171
171
TV = promote_type (eltype (λ),V)
172
- Tridiagonal (Vcat (convert .(AbstractVector{TV}, broadcast ($ op, A. dl. args))... ),
173
- Vcat (convert .(AbstractVector{TV}, broadcast ($ op, λ. λ, A. d). args)... ),
172
+ Tridiagonal (Vcat (convert .(AbstractVector{TV}, broadcast ($ op, A. dl. args))... ),
173
+ Vcat (convert .(AbstractVector{TV}, broadcast ($ op, λ. λ, A. d). args)... ),
174
174
Vcat (convert .(AbstractVector{TV}, broadcast ($ op, A. du. args))... ))
175
175
end
176
- function $op (adjA:: AdjTriPertToeplitz{T} , λ:: UniformScaling ) where T
176
+ function $op (adjA:: AdjTriPertToeplitz{T} , λ:: UniformScaling ) where T
177
177
A = parent (adjA)
178
178
TV = promote_type (T,eltype (λ))
179
- Tridiagonal (Vcat (convert .(AbstractVector{TV}, A. du. args)... ),
180
- Vcat (convert .(AbstractVector{TV}, broadcast ($ op, A. d, λ. λ). args)... ),
179
+ Tridiagonal (Vcat (convert .(AbstractVector{TV}, A. du. args)... ),
180
+ Vcat (convert .(AbstractVector{TV}, broadcast ($ op, A. d, λ. λ). args)... ),
181
181
Vcat (convert .(AbstractVector{TV}, A. dl. args)... ))
182
182
end
183
183
function $op (λ:: UniformScaling , adjA:: AdjTriPertToeplitz{V} ) where V
184
184
A = parent (adjA)
185
185
TV = promote_type (eltype (λ),V)
186
- Tridiagonal (Vcat (convert .(AbstractVector{TV}, broadcast ($ op, A. du. args))... ),
187
- Vcat (convert .(AbstractVector{TV}, broadcast ($ op, λ. λ, A. d). args)... ),
186
+ Tridiagonal (Vcat (convert .(AbstractVector{TV}, broadcast ($ op, A. du. args))... ),
187
+ Vcat (convert .(AbstractVector{TV}, broadcast ($ op, λ. λ, A. d). args)... ),
188
188
Vcat (convert .(AbstractVector{TV}, broadcast ($ op, A. dl. args))... ))
189
189
end
190
190
231
231
232
232
# ###
233
233
# Conversions to BandedMatrix
234
- # ###
234
+ # ###
235
235
236
236
function BandedMatrix (A:: PertToeplitz{T} , (l,u):: Tuple{Int,Int} ) where T
237
237
@assert A. u == u # Not implemented
@@ -323,7 +323,7 @@ _constrows(A::PertConstRowMatrix) = _constrows(A.args[2])
323
323
_constrows (A:: SubArray ) = _constrows (parent (A))[parentindices (A)[1 ]]
324
324
325
325
ConstRowMatrix (A:: AbstractMatrix{T} ) where T = ApplyMatrix (* , A[:,1 ], Ones {T} (1 ,size (A,2 )))
326
- PertConstRowMatrix (A:: AbstractMatrix{T} ) where T =
326
+ PertConstRowMatrix (A:: AbstractMatrix{T} ) where T =
327
327
Hcat (_pertdata (A), ApplyMatrix (* , _constrows (A), Ones {T} (1 ,size (A,2 ))))
328
328
329
329
struct ConstRows <: MemoryLayout end
@@ -342,40 +342,40 @@ for Typ in (:ConstRows, :PertConstRows)
342
342
end
343
343
end
344
344
345
- const TridiagonalToeplitzLayout = Union{SymTridiagonalLayout{FillLayout},TridiagonalLayout{FillLayout}}
345
+ struct TridiagonalToeplitzLayout <: AbstractLazyBandedLayout end
346
346
const BandedToeplitzLayout = BandedColumns{ConstRows}
347
347
const PertToeplitzLayout = BandedColumns{PertConstRows}
348
348
const PertTriangularToeplitzLayout{UPLO,UNIT} = TriangularLayout{UPLO,UNIT,BandedColumns{PertConstRows}}
349
349
350
350
351
- _BandedMatrix (:: BandedToeplitzLayout , A:: AbstractMatrix ) =
351
+ _BandedMatrix (:: BandedToeplitzLayout , A:: AbstractMatrix ) =
352
352
_BandedMatrix (ConstRowMatrix (bandeddata (A)), size (A,1 ), bandwidths (A)... )
353
- _BandedMatrix (:: PertToeplitzLayout , A:: AbstractMatrix ) =
354
- _BandedMatrix (PertConstRowMatrix (bandeddata (A)), size (A,1 ), bandwidths (A)... )
353
+ _BandedMatrix (:: PertToeplitzLayout , A:: AbstractMatrix ) =
354
+ _BandedMatrix (PertConstRowMatrix (bandeddata (A)), size (A,1 ), bandwidths (A)... )
355
355
356
356
# for Lay in (:BandedToeplitzLayout, :PertToeplitzLayout)
357
- # @eval begin
357
+ # @eval begin
358
358
# sublayout(::$Lay, ::Type{<:Tuple{AbstractInfUnitRange{Int},AbstractInfUnitRange{Int}}}) = $Lay()
359
359
# sublayout(::$Lay, ::Type{<:Tuple{Slice,AbstractInfUnitRange{Int}}}) = $Lay()
360
360
# sublayout(::$Lay, ::Type{<:Tuple{AbstractInfUnitRange{Int},Slice}}) = $Lay()
361
361
# sublayout(::$Lay, ::Type{<:Tuple{Slice,Slice}}) = $Lay()
362
362
363
- # sub_materialize(::$Lay, V) = BandedMatrix(V)
363
+ # sub_materialize(::$Lay, V) = BandedMatrix(V)
364
364
# end
365
365
# end
366
366
367
367
368
368
@inline sub_materialize (:: ApplyBandedLayout{typeof(*)} , V, :: Tuple{InfAxes,InfAxes} ) = V
369
369
@inline sub_materialize (:: BroadcastBandedLayout , V, :: Tuple{InfAxes,InfAxes} ) = V
370
- @inline sub_materialize (:: AbstractBandedLayout , V, :: Tuple{InfAxes,InfAxes} ) = BandedMatrix (V)
370
+ @inline sub_materialize (:: AbstractBandedLayout , V, :: Tuple{InfAxes,InfAxes} ) = V
371
371
@inline sub_materialize (:: BandedColumns , V, :: Tuple{InfAxes,InfAxes} ) = BandedMatrix (V)
372
372
373
373
374
374
# #
375
375
# UniformScaling
376
376
# #
377
377
378
- # for op in (:+, :-), Typ in (:(BandedMatrix{<:Any,<:Any,OneToInf{Int}}),
378
+ # for op in (:+, :-), Typ in (:(BandedMatrix{<:Any,<:Any,OneToInf{Int}}),
379
379
# :(Adjoint{<:Any,<:BandedMatrix{<:Any,<:Any,OneToInf{Int}}}),
380
380
# :(Transpose{<:Any,<:BandedMatrix{<:Any,<:Any,OneToInf{Int}}}))
381
381
# @eval begin
@@ -395,7 +395,7 @@ _default_banded_broadcast(bc::Broadcasted, ::Tuple{<:OneToInf,<:Any}) = copy(Bro
395
395
# Banded * Banded
396
396
# ##
397
397
398
- BandedMatrix {T} (:: UndefInitializer , axes:: Tuple{OneToInf{Int},OneTo{Int}} , lu:: NTuple{2,Integer} ) where T =
398
+ BandedMatrix {T} (:: UndefInitializer , axes:: Tuple{OneToInf{Int},OneTo{Int}} , lu:: NTuple{2,Integer} ) where T =
399
399
BandedMatrix {T} (undef, map (length,axes), lu)
400
400
401
401
similar (M:: MulAdd{<:AbstractBandedLayout,<:AbstractBandedLayout} , :: Type{T} , axes:: Tuple{OneTo{Int},OneToInf{Int}} ) where T =
@@ -471,3 +471,34 @@ function _bidiag_forwardsub!(M::Ldiv{<:Any,<:PaddedLayout})
471
471
b_in
472
472
end
473
473
474
+ # ##
475
+ # Inf-Toeplitz layout
476
+ # this could possibly be avoided via an InfFillLayout
477
+ # ##
478
+
479
+ const InfFill = AbstractFill{<: Any ,1 ,<: Tuple{OneToInf} }
480
+
481
+ for Typ in (:(LinearAlgebra. Tridiagonal{<: Any ,<: InfFill }),
482
+ :(LinearAlgebra. SymTridiagonal{<: Any ,<: InfFill }),
483
+ :(LazyBandedMatrices. Tridiagonal{<: Any ,<: InfFill ,<: InfFill ,<: InfFill }),
484
+ :(LazyBandedMatrices. SymTridiagonal{<: Any ,<: InfFill ,<: InfFill }))
485
+ @eval begin
486
+ MemoryLayout (:: Type{<:$Typ} ) = TridiagonalToeplitzLayout ()
487
+ Base. BroadcastStyle (:: Type{<:$Typ} ) = LazyArrayStyle {2} ()
488
+ end
489
+ end
490
+
491
+ struct BidiagonalToeplitzLayout <: AbstractLazyBandedLayout end
492
+
493
+ for Typ in (:(LinearAlgebra. Bidiagonal{<: Any ,<: InfFill }),
494
+ :(LazyBandedMatrices. Bidiagonal{<: Any ,<: InfFill ,<: InfFill }))
495
+ @eval begin
496
+ MemoryLayout (:: Type{<:$Typ} ) = BidiagonalToeplitzLayout ()
497
+ Base. BroadcastStyle (:: Type{<:$Typ} ) = LazyArrayStyle {2} ()
498
+ end
499
+ end
500
+
501
+ # fall back for Ldiv
502
+ triangularlayout (:: Type{<:TriangularLayout{UPLO,'N'}} , :: TridiagonalToeplitzLayout ) where UPLO = BidiagonalToeplitzLayout ()
503
+ materialize! (L:: MatLdivVec{BidiagonalToeplitzLayout,Lay} ) where Lay = materialize! (Ldiv {BidiagonalLayout{FillLayout,FillLayout},Lay} (L. A, L. B))
504
+ copyto! (dest:: AbstractArray , L:: Ldiv{BidiagonalToeplitzLayout,Lay} ) where Lay = copyto! (dest, Ldiv {BidiagonalLayout{FillLayout,FillLayout},Lay} (L. A, L. B))
0 commit comments