Skip to content

Commit 4f1224c

Browse files
authored
views in promotespaces for Matrix (#298)
* views in promotespaces for Matrix * view in InterlaceOperator rangespace * more views * convert vector with promotetypes
1 parent 6fee35d commit 4f1224c

File tree

3 files changed

+17
-23
lines changed

3 files changed

+17
-23
lines changed

src/ApproxFunBase.jl

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -115,6 +115,13 @@ convert_vector(t::Tuple) = [t...]
115115
convert_vector_or_svector(v::AbstractVector) = convert(Vector, v)
116116
convert_vector_or_svector(t::Tuple) = SVector(t)
117117

118+
convert_vector_or_svector_promotetypes(v::AbstractVector) = convert_vector(v)
119+
_uniontypes_svector(t) = SVector{length(t), mapfoldl(typeof, (x,y)->Union{x,y}, t)}(t)
120+
convert_vector_or_svector_promotetypes(t::NTuple{2,Any}) = _uniontypes_svector(t)
121+
convert_vector_or_svector_promotetypes(t::NTuple{3,Any}) = _uniontypes_svector(t)
122+
convert_vector_or_svector_promotetypes(t::NTuple{4,Any}) = _uniontypes_svector(t)
123+
convert_vector_or_svector_promotetypes(t::Tuple) = SVector{length(t), mapreduce(typeof, typejoin, t)}(t)
124+
118125
promote_eltypeof(As...) = promote_eltypeof(As)
119126
# Avoid mapreduce for common cases, as it often suffers from poor type inference
120127
promote_eltypeof(As::Tuple{Any}) = eltype(As[1])

src/Operators/general/InterlaceOperator.jl

Lines changed: 8 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,3 @@
1-
2-
3-
4-
51
##interlace block operators
62
function isboundaryrow(A,k)
73
for j=1:size(A,2)
@@ -19,12 +15,12 @@ domainscompatible(A::AbstractMatrix{T}) where {T<:Operator} = domainscompatible(
1915

2016
function spacescompatible(A::AbstractMatrix{T}) where T<:Operator
2117
for k=1:size(A,1)
22-
if !spacescompatible(map(rangespace,A[k,:]))
18+
if !spacescompatible(map(rangespace, @view A[k,:]))
2319
return false
2420
end
2521
end
2622
for k=1:size(A,2)
27-
if !spacescompatible(map(domainspace,A[:,k]))
23+
if !spacescompatible(map(domainspace, @view A[:,k]))
2824
return false
2925
end
3026
end
@@ -38,7 +34,7 @@ function domainspace(A::AbstractMatrix{T}) where T<:Operator
3834
error("Cannot construct domainspace for $A as spaces are not compatible")
3935
end
4036

41-
spl=map(domainspace,A[1,:])
37+
spl=map(domainspace, @view A[1,:])
4238
Space(spl)
4339
end
4440

@@ -47,7 +43,7 @@ function rangespace(A::VectorOrTupleOfOp)
4743
error("Cannot construct rangespace for $A as domain spaces are not compatible")
4844
end
4945
spl=map(rangespace, A)
50-
ArraySpace(_convert_vector_promotetypes(spl), first(spl))
46+
ArraySpace(convert_vector_or_svector_promotetypes(spl), first(spl))
5147
end
5248

5349
promotespaces(A::AbstractMatrix{<:Operator}) = promotespaces(Matrix(A))
@@ -56,16 +52,16 @@ function promotespaces(A::Matrix{<:Operator})
5652
isempty(A) && return A
5753
ret = similar(A) #TODO: promote might have different Array type
5854
for j=1:size(A,2)
59-
ret[:,j] = promotedomainspace(A[:,j])
55+
ret[:,j] = promotedomainspace(@view A[:,j])
6056
end
6157
for k=1:size(A,1)
62-
ret[k,:] = promoterangespace(ret[k,:])
58+
ret[k,:] = promoterangespace(@view ret[k,:])
6359
end
6460

6561
# do a second loop as spaces might have been inferred
6662
# during range space
6763
for j=1:size(A,2)
68-
ret[:,j] = promotedomainspace(ret[:,j])
64+
ret[:,j] = promotedomainspace(@view ret[:,j])
6965
end
7066
ret
7167
end
@@ -152,7 +148,7 @@ end
152148
function InterlaceOperator(opsin::AbstractMatrix{<:Operator},::Type{DS},::Type{RS}) where {DS<:Space,RS<:Space}
153149
isempty(opsin) && throw(ArgumentError("Cannot create InterlaceOperator from empty Matrix"))
154150
ops=promotespaces(opsin)
155-
InterlaceOperator(ops,DS(components(domainspace(ops))),RS(rangespace(ops[:,1]).spaces))
151+
InterlaceOperator(ops,DS(components(domainspace(ops))),RS(rangespace(@view ops[:,1]).spaces))
156152
end
157153

158154

@@ -178,13 +174,6 @@ InterlaceOperator(opsin::AbstractMatrix{<:Operator},::Type{DS}) where {DS<:Space
178174
InterlaceOperator(opsin::AbstractMatrix,S...) =
179175
InterlaceOperator(Matrix{Operator{promote_eltypeof(opsin)}}(promotespaces(opsin)),S...)
180176

181-
_convert_vector_promotetypes(v::AbstractVector) = convert_vector(v)
182-
_uniontypes_svector(t) = SVector{length(t), mapfoldl(typeof, (x,y)->Union{x,y}, t)}(t)
183-
_convert_vector_promotetypes(t::NTuple{2,Any}) = _uniontypes_svector(t)
184-
_convert_vector_promotetypes(t::NTuple{3,Any}) = _uniontypes_svector(t)
185-
_convert_vector_promotetypes(t::NTuple{4,Any}) = _uniontypes_svector(t)
186-
_convert_vector_promotetypes(t::Tuple) = SVector{length(t), mapreduce(typeof, typejoin, t)}(t)
187-
188177
function InterlaceOperator(opsin::AbstractVector{<:Operator})
189178
ops = convert_vector(promotedomainspace(opsin))
190179
InterlaceOperator(ops, domainspace(first(ops)), rangespace(ops))

src/Operators/spacepromotion.jl

Lines changed: 2 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -86,10 +86,8 @@ promotedomainspace(P::Operator,sp::Space,cursp::Space) =
8686

8787

8888

89-
__maybetypedmap(f, k, ops) = map(op->f(op,k), ops)
90-
_maybetypedmap(f, k, O, ops::AbstractVector) =
91-
strictconvert(Vector{O}, __maybetypedmap(f, k, ops))
92-
_maybetypedmap(f, k, O, ops) = __maybetypedmap(f, k, ops)
89+
_maybetypedmap(f, k, O, ops::AbstractVector) = O[f(op,k) for op in ops]
90+
_maybetypedmap(f, k, O, ops) = map(op->f(op,k), ops)
9391

9492
function promoterangespace(ops::VectorOrTupleOfOp{O}) where O<:Operator
9593
isempty(ops) && return strictconvert(Vector{Operator{eltype(O)}}, ops)

0 commit comments

Comments
 (0)