Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 1 addition & 1 deletion Project.toml
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
name = "InfiniteArrays"
uuid = "4858937d-0d70-526a-a4dd-2d5cb5dd786c"
version = "0.15.0"
version = "0.15.0-dev"

[deps]
ArrayLayouts = "4c555306-a7a7-4459-81d9-ec55ddd5c99a"
Expand Down
110 changes: 7 additions & 103 deletions ext/InfiniteArraysBandedMatricesExt.jl
Original file line number Diff line number Diff line change
Expand Up @@ -4,7 +4,7 @@

import Base: BroadcastStyle, size, getindex, similar, copy, *, +, -, /, \, materialize!, copyto!, OneTo
import Base.Broadcast: Broadcasted
import InfiniteArrays: InfIndexRanges, Infinity, PosInfinity, OneToInf, InfAxes, AbstractInfUnitRange, InfRanges
import InfiniteArrays: InfIndexRanges, Infinity, PosInfinity, OneToInf, InfAxes, AbstractInfUnitRange, InfRanges, InfBaseToeplitzLayouts, ConstRowMatrix, PertConstRowMatrix, SymTriPertToeplitz, TriPertToeplitz, ConstRows, PertConstRows
import ArrayLayouts: sub_materialize, MemoryLayout, sublayout, mulreduce, triangularlayout, MatLdivVec, subdiagonaldata, diagonaldata, supdiagonaldata
import LazyArrays: applybroadcaststyle, applylayout, islazy, islazy_layout, simplifiable, AbstractLazyLayout, PaddedColumns, LazyArrayStyle, ApplyLayout, AbstractLazyBandedLayout, ApplyBandedLayout, BroadcastBandedLayout
import BandedMatrices: _BandedMatrix, AbstractBandedMatrix, banded_similar, BandedMatrix, bandedcolumns, BandedColumns, bandeddata
Expand Down Expand Up @@ -51,17 +51,10 @@




const TriToeplitz{T} = Tridiagonal{T,Fill{T,1,Tuple{OneToInf{Int}}}}
const ConstRowMatrix{T} = ApplyMatrix{T,typeof(*),<:Tuple{<:AbstractVector,<:AbstractFillMatrix{<:Any,Tuple{OneTo{Int},OneToInf{Int}}}}}
const PertConstRowMatrix{T} = Hcat{T,<:Tuple{Array{T},<:ConstRowMatrix{T}}}
const InfToeplitz{T} = BandedMatrix{T,<:ConstRowMatrix{T},OneToInf{Int}}
const PertToeplitz{T} = BandedMatrix{T,<:PertConstRowMatrix{T},OneToInf{Int}}

const SymTriPertToeplitz{T} = SymTridiagonal{T,Vcat{T,1,Tuple{Vector{T},Fill{T,1,Tuple{OneToInf{Int}}}}}}
const TriPertToeplitz{T} = Tridiagonal{T,Vcat{T,1,Tuple{Vector{T},Fill{T,1,Tuple{OneToInf{Int}}}}}}
const AdjTriPertToeplitz{T} = Adjoint{T,Tridiagonal{T,Vcat{T,1,Tuple{Vector{T},Fill{T,1,Tuple{OneToInf{Int}}}}}}}
const InfBandedMatrix{T,V<:AbstractMatrix{T}} = BandedMatrix{T,V,OneToInf{Int}}
const InfToeplitz{T} = InfBandedMatrix{T,<:ConstRowMatrix{T}}
const PertToeplitz{T} = InfBandedMatrix{T,<:PertConstRowMatrix{T}}


_prepad(p, a) = Vcat(Zeros{eltype(a)}(max(p,0)), a)
_prepad(p, a::Zeros{T,1}) where T = Zeros{T}(length(a)+p)
Expand Down Expand Up @@ -157,50 +150,6 @@

for op in (:-, :+)
@eval begin
function $op(A::SymTriPertToeplitz{T}, λ::UniformScaling) where T
TV = promote_type(T,eltype(λ))
dv = Vcat(convert.(AbstractVector{TV}, A.dv.args)...)
ev = Vcat(convert.(AbstractVector{TV}, A.ev.args)...)
SymTridiagonal(broadcast($op, dv, Ref(λ.λ)), ev)
end
function $op(λ::UniformScaling, A::SymTriPertToeplitz{V}) where V
TV = promote_type(eltype(λ),V)
SymTridiagonal(convert(AbstractVector{TV}, broadcast($op, Ref(λ.λ), A.dv)),
convert(AbstractVector{TV}, broadcast($op, A.ev)))
end
function $op(A::SymTridiagonal{T,<:AbstractFill}, λ::UniformScaling) where T
TV = promote_type(T,eltype(λ))
SymTridiagonal(convert(AbstractVector{TV}, broadcast($op, A.dv, Ref(λ.λ))),
convert(AbstractVector{TV}, A.ev))
end

function $op(A::TriPertToeplitz{T}, λ::UniformScaling) where T
TV = promote_type(T,eltype(λ))
Tridiagonal(Vcat(convert.(AbstractVector{TV}, A.dl.args)...),
Vcat(convert.(AbstractVector{TV}, broadcast($op, A.d, λ.λ).args)...),
Vcat(convert.(AbstractVector{TV}, A.du.args)...))
end
function $op(λ::UniformScaling, A::TriPertToeplitz{V}) where V
TV = promote_type(eltype(λ),V)
Tridiagonal(Vcat(convert.(AbstractVector{TV}, broadcast($op, A.dl.args))...),
Vcat(convert.(AbstractVector{TV}, broadcast($op, λ.λ, A.d).args)...),
Vcat(convert.(AbstractVector{TV}, broadcast($op, A.du.args))...))
end
function $op(adjA::AdjTriPertToeplitz{T}, λ::UniformScaling) where T
A = parent(adjA)
TV = promote_type(T,eltype(λ))
Tridiagonal(Vcat(convert.(AbstractVector{TV}, A.du.args)...),
Vcat(convert.(AbstractVector{TV}, broadcast($op, A.d, λ.λ).args)...),
Vcat(convert.(AbstractVector{TV}, A.dl.args)...))
end
function $op(λ::UniformScaling, adjA::AdjTriPertToeplitz{V}) where V
A = parent(adjA)
TV = promote_type(eltype(λ),V)
Tridiagonal(Vcat(convert.(AbstractVector{TV}, broadcast($op, A.du.args))...),
Vcat(convert.(AbstractVector{TV}, broadcast($op, λ.λ, A.d).args)...),
Vcat(convert.(AbstractVector{TV}, broadcast($op, A.dl.args))...))
end

function $op(λ::UniformScaling, A::InfToeplitz{V}) where V
l,u = bandwidths(A)
TV = promote_type(eltype(λ),V)
Expand Down Expand Up @@ -339,10 +288,6 @@
PertConstRowMatrix(A::AbstractMatrix{T}) where T =
Hcat(_pertdata(A), ApplyMatrix(*, _constrows(A), Ones{T}(1,size(A,2))))

struct ConstRows <: AbstractLazyLayout end
struct PertConstRows <: AbstractLazyLayout end
MemoryLayout(::Type{<:ConstRowMatrix}) = ConstRows()
MemoryLayout(::Type{<:PertConstRowMatrix}) = PertConstRows()
bandedcolumns(::ConstRows) = BandedToeplitzLayout()
bandedcolumns(::PertConstRows) = PertToeplitzLayout()
sublayout(::ConstRows, inds...) = sublayout(ApplyLayout{typeof(*)}(), inds...)
Expand All @@ -355,29 +300,17 @@
end
end

"""
TridiagonalToeplitzLayout

represents a matrix which is tridiagonal and toeplitz. Must support
`subdiagonalconstant`, `diagonalconstant`, `supdiagonalconstant`.
"""
struct TridiagonalToeplitzLayout <: AbstractLazyBandedLayout end
const BandedToeplitzLayout = BandedColumns{ConstRows}
const PertToeplitzLayout = BandedColumns{PertConstRows}
const PertTriangularToeplitzLayout{UPLO,UNIT} = TriangularLayout{UPLO,UNIT,BandedColumns{PertConstRows}}
struct BidiagonalToeplitzLayout <: AbstractLazyBandedLayout end
struct PertBidiagonalToeplitzLayout <: AbstractLazyBandedLayout end
struct PertTridiagonalToeplitzLayout <: AbstractLazyBandedLayout end

const InfToeplitzLayouts = Union{TridiagonalToeplitzLayout, BandedToeplitzLayout, BidiagonalToeplitzLayout,
PertToeplitzLayout, PertTriangularToeplitzLayout, PertBidiagonalToeplitzLayout, PertTridiagonalToeplitzLayout}
const InfBandedToeplitzLayouts = Union{BandedToeplitzLayout, PertToeplitzLayout, PertTriangularToeplitzLayout}
const InfToeplitzLayouts = Union{InfBaseToeplitzLayouts, InfBandedToeplitzLayouts}

subdiagonalconstant(A) = getindex_value(subdiagonaldata(A))
diagonalconstant(A) = getindex_value(diagonaldata(A))
supdiagonalconstant(A) = getindex_value(supdiagonaldata(A))


islazy_layout(::InfToeplitzLayouts) = Val(true)
islazy_layout(::InfBandedToeplitzLayouts) = Val(true)

Check warning on line 313 in ext/InfiniteArraysBandedMatricesExt.jl

View check run for this annotation

Codecov / codecov/patch

ext/InfiniteArraysBandedMatricesExt.jl#L313

Added line #L313 was not covered by tests
islazy(::BandedMatrix{<:Any,<:Any,OneToInf{Int}}) = Val(true)


Expand All @@ -399,8 +332,6 @@
# end


@inline sub_materialize(::ApplyBandedLayout{typeof(*)}, V, ::Tuple{InfAxes,InfAxes}) = V
@inline sub_materialize(::BroadcastBandedLayout, V, ::Tuple{InfAxes,InfAxes}) = V
@inline sub_materialize(::BandedColumns, V, ::Tuple{InfAxes,InfAxes}) = BandedMatrix(V)
@inline sub_materialize(::BandedColumns, V, ::Tuple{InfAxes,OneTo{Int}}) = BandedMatrix(V)

Expand Down Expand Up @@ -473,33 +404,6 @@



###
# Inf-Toeplitz layout
# this could possibly be avoided via an InfFillLayout
###

const InfFill = AbstractFill{<:Any,1,<:Tuple{OneToInf}}

for Typ in (:(Tridiagonal{<:Any,<:InfFill}),
:(SymTridiagonal{<:Any,<:InfFill}))
@eval begin
MemoryLayout(::Type{<:$Typ}) = TridiagonalToeplitzLayout()
BroadcastStyle(::Type{<:$Typ}) = LazyArrayStyle{2}()
end
end

MemoryLayout(::Type{<:Bidiagonal{<:Any,<:InfFill}}) = BidiagonalToeplitzLayout()
BroadcastStyle(::Type{<:Bidiagonal{<:Any,<:InfFill}}) = LazyArrayStyle{2}()

*(A::Bidiagonal{<:Any,<:InfFill}, B::Bidiagonal{<:Any,<:InfFill}) =
mul(A, B)

# fall back for Ldiv
triangularlayout(::Type{<:TriangularLayout{UPLO,'N'}}, ::TridiagonalToeplitzLayout) where UPLO = BidiagonalToeplitzLayout()
materialize!(L::MatLdivVec{BidiagonalToeplitzLayout,Lay}) where Lay = materialize!(Ldiv{BidiagonalLayout{FillLayout,FillLayout},Lay}(L.A, L.B))
copyto!(dest::AbstractArray, L::Ldiv{BidiagonalToeplitzLayout,Lay}) where Lay = copyto!(dest, Ldiv{BidiagonalLayout{FillLayout,FillLayout},Lay}(L.A, L.B))


# copy for AdjOrTrans
copy(A::Adjoint{T,<:BandedMatrix{T,<:Any,OneToInf{Int}}}) where T = copy(parent(A))'
copy(A::Transpose{T,<:BandedMatrix{T,<:Any,OneToInf{Int}}}) where T = transpose(copy(parent(A)))
Expand Down
17 changes: 9 additions & 8 deletions src/InfiniteArrays.jl
Original file line number Diff line number Diff line change
Expand Up @@ -14,10 +14,7 @@ import Base: *, +, -, /, <, ==, >, \, ≤, ≥, (:), @propagate_inbounds,
searchsortedfirst, searchsortedlast, setindex!, show, show_circular, show_delim_array, sign,
signbit, similar, size, sort, sort!, step, sum, tail,
to_shape, transpose, unaliascopy, union, unitrange_last, unsafe_convert, unsafe_indices, unsafe_length,
vcat, zeros


import Base: range_start_step_length
vcat, zeros, copyto!, range_start_step_length

if VERSION ≥ v"1.11.0-DEV.21"
using LinearAlgebra: UpperOrLowerTriangular
Expand All @@ -31,16 +28,18 @@ end

using Base.Broadcast
import ArrayLayouts: AbstractBandedLayout, LayoutMatrix, LayoutVecOrMat, LayoutVecOrMats, LayoutVector, MemoryLayout,
RangeCumsum, UnknownLayout, reshapedlayout, sub_materialize, sublayout
RangeCumsum, UnknownLayout, reshapedlayout, sub_materialize, materialize!, sublayout, MatLdivVec,
subdiagonaldata, diagonaldata, supdiagonaldata, triangularlayout

import Base.Broadcast: BroadcastStyle, Broadcasted, DefaultArrayStyle, axistype, broadcasted

import FillArrays: AbstractFill, Eye, Fill, Ones, RectDiagonal, Zeros, fill_reshape, getindex_value
import FillArrays: AbstractFill, Eye, Fill, Ones, RectDiagonal, Zeros, fill_reshape, getindex_value, AbstractFillMatrix

import Infinities: InfiniteCardinal, Infinity, ∞

import LazyArrays: AbstractCachedVector, ApplyLayout, CachedArray, CachedVector, InvColumnLayout,
LazyArrayStyle, LazyLayout, LazyMatrix, PaddedColumns, _padded_sub_materialize, sub_paddeddata
import LazyArrays: AbstractLazyLayout, AbstractCachedVector, ApplyLayout, CachedArray, CachedVector, InvColumnLayout, AbstractLazyBandedLayout,
LazyArrayStyle, LazyLayout, LazyMatrix, PaddedColumns, _padded_sub_materialize, sub_paddeddata,
ApplyBandedLayout, BroadcastBandedLayout, islazy_layout

import LinearAlgebra: AdjOrTrans, HermOrSym, diag, norm, norm1, norm2, normp

Expand Down Expand Up @@ -221,5 +220,7 @@ function ArrayLayouts._power_by_squaring(_, ::NTuple{2,InfiniteCardinal{0}}, A::
end
end

include("inftoeplitz.jl")


end # module
116 changes: 116 additions & 0 deletions src/inftoeplitz.jl
Original file line number Diff line number Diff line change
@@ -0,0 +1,116 @@
const ConstRowMatrix{T} = ApplyMatrix{T,typeof(*),<:Tuple{<:AbstractVector,<:AbstractFillMatrix{<:Any,Tuple{OneTo{Int},OneToInf{Int}}}}}
const PertConstRowMatrix{T} = Hcat{T,<:Tuple{Array{T},<:ConstRowMatrix{T}}}

struct ConstRows <: AbstractLazyLayout end
struct PertConstRows <: AbstractLazyLayout end
MemoryLayout(::Type{<:ConstRowMatrix}) = ConstRows()
MemoryLayout(::Type{<:PertConstRowMatrix}) = PertConstRows()

Check warning on line 7 in src/inftoeplitz.jl

View check run for this annotation

Codecov / codecov/patch

src/inftoeplitz.jl#L6-L7

Added lines #L6 - L7 were not covered by tests


const TriToeplitz{T} = Tridiagonal{T,Fill{T,1,Tuple{OneToInf{Int}}}}

const SymTriPertToeplitz{T} = SymTridiagonal{T,Vcat{T,1,Tuple{Vector{T},Fill{T,1,Tuple{OneToInf{Int}}}}}}
const TriPertToeplitz{T} = Tridiagonal{T,Vcat{T,1,Tuple{Vector{T},Fill{T,1,Tuple{OneToInf{Int}}}}}}
const AdjTriPertToeplitz{T} = Adjoint{T,Tridiagonal{T,Vcat{T,1,Tuple{Vector{T},Fill{T,1,Tuple{OneToInf{Int}}}}}}}


"""
TridiagonalToeplitzLayout

represents a matrix which is tridiagonal and toeplitz. Must support
`subdiagonalconstant`, `diagonalconstant`, `supdiagonalconstant`.
"""
struct TridiagonalToeplitzLayout <: AbstractLazyBandedLayout end

struct BidiagonalToeplitzLayout <: AbstractLazyBandedLayout end
struct PertBidiagonalToeplitzLayout <: AbstractLazyBandedLayout end
struct PertTridiagonalToeplitzLayout <: AbstractLazyBandedLayout end

const InfBaseToeplitzLayouts = Union{TridiagonalToeplitzLayout, BidiagonalToeplitzLayout, PertBidiagonalToeplitzLayout, PertTridiagonalToeplitzLayout}


subdiagonalconstant(A) = getindex_value(subdiagonaldata(A))
diagonalconstant(A) = getindex_value(diagonaldata(A))
supdiagonalconstant(A) = getindex_value(supdiagonaldata(A))

Check warning on line 34 in src/inftoeplitz.jl

View check run for this annotation

Codecov / codecov/patch

src/inftoeplitz.jl#L32-L34

Added lines #L32 - L34 were not covered by tests

islazy_layout(::InfBaseToeplitzLayouts) = Val(true)

Check warning on line 36 in src/inftoeplitz.jl

View check run for this annotation

Codecov / codecov/patch

src/inftoeplitz.jl#L36

Added line #L36 was not covered by tests

@inline sub_materialize(::ApplyBandedLayout{typeof(*)}, V, ::Tuple{InfAxes,InfAxes}) = V
@inline sub_materialize(::BroadcastBandedLayout, V, ::Tuple{InfAxes,InfAxes}) = V

Check warning on line 39 in src/inftoeplitz.jl

View check run for this annotation

Codecov / codecov/patch

src/inftoeplitz.jl#L38-L39

Added lines #L38 - L39 were not covered by tests


###
# Inf-Toeplitz layout
# this could possibly be avoided via an InfFillLayout
###

const InfFill = AbstractFill{<:Any,1,<:Tuple{OneToInf}}

for Typ in (:(Tridiagonal{<:Any,<:InfFill}),
:(SymTridiagonal{<:Any,<:InfFill}))
@eval begin
MemoryLayout(::Type{<:$Typ}) = TridiagonalToeplitzLayout()
BroadcastStyle(::Type{<:$Typ}) = LazyArrayStyle{2}()

Check warning on line 53 in src/inftoeplitz.jl

View check run for this annotation

Codecov / codecov/patch

src/inftoeplitz.jl#L52-L53

Added lines #L52 - L53 were not covered by tests
end
end

MemoryLayout(::Type{<:Bidiagonal{<:Any,<:InfFill}}) = BidiagonalToeplitzLayout()
BroadcastStyle(::Type{<:Bidiagonal{<:Any,<:InfFill}}) = LazyArrayStyle{2}()

Check warning on line 58 in src/inftoeplitz.jl

View check run for this annotation

Codecov / codecov/patch

src/inftoeplitz.jl#L57-L58

Added lines #L57 - L58 were not covered by tests

*(A::Bidiagonal{<:Any,<:InfFill}, B::Bidiagonal{<:Any,<:InfFill}) =

Check warning on line 60 in src/inftoeplitz.jl

View check run for this annotation

Codecov / codecov/patch

src/inftoeplitz.jl#L60

Added line #L60 was not covered by tests
mul(A, B)

# fall back for Ldiv
triangularlayout(::Type{<:TriangularLayout{UPLO,'N'}}, ::TridiagonalToeplitzLayout) where UPLO = BidiagonalToeplitzLayout()
materialize!(L::MatLdivVec{BidiagonalToeplitzLayout,Lay}) where Lay = materialize!(Ldiv{BidiagonalLayout{FillLayout,FillLayout},Lay}(L.A, L.B))
copyto!(dest::AbstractArray, L::Ldiv{BidiagonalToeplitzLayout,Lay}) where Lay = copyto!(dest, Ldiv{BidiagonalLayout{FillLayout,FillLayout},Lay}(L.A, L.B))

Check warning on line 66 in src/inftoeplitz.jl

View check run for this annotation

Codecov / codecov/patch

src/inftoeplitz.jl#L64-L66

Added lines #L64 - L66 were not covered by tests



for op in (:-, :+)
@eval begin
function $op(A::SymTriPertToeplitz{T}, λ::UniformScaling) where T
TV = promote_type(T,eltype(λ))
dv = Vcat(convert.(AbstractVector{TV}, A.dv.args)...)
ev = Vcat(convert.(AbstractVector{TV}, A.ev.args)...)
SymTridiagonal(broadcast($op, dv, Ref(λ.λ)), ev)

Check warning on line 76 in src/inftoeplitz.jl

View check run for this annotation

Codecov / codecov/patch

src/inftoeplitz.jl#L72-L76

Added lines #L72 - L76 were not covered by tests
end
function $op(λ::UniformScaling, A::SymTriPertToeplitz{V}) where V
TV = promote_type(eltype(λ),V)
SymTridiagonal(convert(AbstractVector{TV}, broadcast($op, Ref(λ.λ), A.dv)),

Check warning on line 80 in src/inftoeplitz.jl

View check run for this annotation

Codecov / codecov/patch

src/inftoeplitz.jl#L78-L80

Added lines #L78 - L80 were not covered by tests
convert(AbstractVector{TV}, broadcast($op, A.ev)))
end
function $op(A::SymTridiagonal{T,<:AbstractFill}, λ::UniformScaling) where T
TV = promote_type(T,eltype(λ))
SymTridiagonal(convert(AbstractVector{TV}, broadcast($op, A.dv, Ref(λ.λ))),

Check warning on line 85 in src/inftoeplitz.jl

View check run for this annotation

Codecov / codecov/patch

src/inftoeplitz.jl#L83-L85

Added lines #L83 - L85 were not covered by tests
convert(AbstractVector{TV}, A.ev))
end

function $op(A::TriPertToeplitz{T}, λ::UniformScaling) where T
TV = promote_type(T,eltype(λ))
Tridiagonal(Vcat(convert.(AbstractVector{TV}, A.dl.args)...),

Check warning on line 91 in src/inftoeplitz.jl

View check run for this annotation

Codecov / codecov/patch

src/inftoeplitz.jl#L89-L91

Added lines #L89 - L91 were not covered by tests
Vcat(convert.(AbstractVector{TV}, broadcast($op, A.d, λ.λ).args)...),
Vcat(convert.(AbstractVector{TV}, A.du.args)...))
end
function $op(λ::UniformScaling, A::TriPertToeplitz{V}) where V
TV = promote_type(eltype(λ),V)
Tridiagonal(Vcat(convert.(AbstractVector{TV}, broadcast($op, A.dl.args))...),

Check warning on line 97 in src/inftoeplitz.jl

View check run for this annotation

Codecov / codecov/patch

src/inftoeplitz.jl#L95-L97

Added lines #L95 - L97 were not covered by tests
Vcat(convert.(AbstractVector{TV}, broadcast($op, λ.λ, A.d).args)...),
Vcat(convert.(AbstractVector{TV}, broadcast($op, A.du.args))...))
end
function $op(adjA::AdjTriPertToeplitz{T}, λ::UniformScaling) where T
A = parent(adjA)
TV = promote_type(T,eltype(λ))
Tridiagonal(Vcat(convert.(AbstractVector{TV}, A.du.args)...),

Check warning on line 104 in src/inftoeplitz.jl

View check run for this annotation

Codecov / codecov/patch

src/inftoeplitz.jl#L101-L104

Added lines #L101 - L104 were not covered by tests
Vcat(convert.(AbstractVector{TV}, broadcast($op, A.d, λ.λ).args)...),
Vcat(convert.(AbstractVector{TV}, A.dl.args)...))
end
function $op(λ::UniformScaling, adjA::AdjTriPertToeplitz{V}) where V
A = parent(adjA)
TV = promote_type(eltype(λ),V)
Tridiagonal(Vcat(convert.(AbstractVector{TV}, broadcast($op, A.du.args))...),

Check warning on line 111 in src/inftoeplitz.jl

View check run for this annotation

Codecov / codecov/patch

src/inftoeplitz.jl#L108-L111

Added lines #L108 - L111 were not covered by tests
Vcat(convert.(AbstractVector{TV}, broadcast($op, λ.λ, A.d).args)...),
Vcat(convert.(AbstractVector{TV}, broadcast($op, A.dl.args))...))
end
end
end
Loading
Loading