Skip to content

Commit 333b297

Browse files
ioannisPApapadopoulosioannisPApapadopoulos
andauthored
Finish implementations of vectorized 1D & 2D plans (#80)
* implement _inv_perm_blockvec for vectorized 1D plan * vectorized 2D transform * add return for CodeCov * missed 2 * fix axes --------- Co-authored-by: ioannisPApapadopoulos <john.papadopoulos0@gmail.com>
1 parent 003decb commit 333b297

File tree

5 files changed

+73
-19
lines changed

5 files changed

+73
-19
lines changed

src/arrowhead.jl

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -206,7 +206,7 @@ function materialize!(M::MatMulVecAdd{<:ArrowheadLayouts,<:AbstractStridedLayout
206206
for k = 1:d
207207
mul!(view(y, m+k:d:size(y,1)), A.D[k], view(x, n+k:d:size(x,1)), α, one(α))
208208
end
209-
y_in
209+
return y_in
210210
end
211211

212212
function materialize!(M::MatMulMatAdd{<:ArrowheadLayouts,<:AbstractColumnMajor,<:AbstractColumnMajor})
@@ -229,7 +229,7 @@ function materialize!(M::MatMulMatAdd{<:ArrowheadLayouts,<:AbstractColumnMajor,<
229229
for k = 1:d
230230
mul!(view(Y, m+k:d:size(Y,1), :), A.D[k], view(X, n+k:d:size(Y,1), :), α, one(α))
231231
end
232-
Y_in
232+
return Y_in
233233
end
234234

235235
function materialize!(M::MatMulMatAdd{<:AbstractColumnMajor,<:ArrowheadLayouts,<:AbstractColumnMajor})
@@ -252,7 +252,7 @@ function materialize!(M::MatMulMatAdd{<:AbstractColumnMajor,<:ArrowheadLayouts,<
252252
for k = 1:d
253253
mul!(view(Y, :, n+k:d:size(Y,2)), view(X, :, m+k:d:size(Y,2)), A.D[k], α, one(α))
254254
end
255-
Y_in
255+
return Y_in
256256
end
257257

258258

@@ -450,7 +450,7 @@ for (UNIT, Tri) in (('U',UnitUpperTriangular), ('N', UpperTriangular))
450450

451451
ArrayLayouts.ldiv!($Tri(A), b̃_1)
452452

453-
dest
453+
return dest
454454
end
455455
end
456456
for (UNIT, Tri) in (('U',UnitLowerTriangular), ('N', LowerTriangular))
@@ -479,7 +479,7 @@ for (UNIT, Tri) in (('U',UnitLowerTriangular), ('N', LowerTriangular))
479479
ArrayLayouts.ldiv!($Tri(D[k]), view(dest, n+k:m:length(dest)))
480480
end
481481

482-
dest
482+
return dest
483483
end
484484
end
485485

src/continuouspolynomial.jl

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -123,7 +123,7 @@ function *(Pl::ContinuousPolynomialTransform{T,<:Any,<:Any,Int}, X::AbstractMatr
123123
end
124124
end
125125
cfs[Block.(2:M-1)] .= vec(dat[3:end,:]')
126-
cfs
126+
return cfs
127127
end
128128

129129
function \(Pl::ContinuousPolynomialTransform{T,<:Any,<:Any,Int}, cfs::AbstractVector{T}) where T
@@ -165,7 +165,7 @@ function *(Pl::ContinuousPolynomialTransform{T}, X::AbstractArray{T,4}) where T
165165
for k = 1:M, j = 1:N, l = 1:O, m = 1:P
166166
cfs[_contpolyinds2blocks(k,j), _contpolyinds2blocks(l,m)] = dat[k,j,l,m]
167167
end
168-
cfs
168+
return cfs
169169
end
170170

171171
function \(Pl::ContinuousPolynomialTransform{T}, cfs::AbstractMatrix{T}) where T

src/dirichlet.jl

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -91,7 +91,7 @@ function *(Pl::DirichletPolynomialTransform{T,<:Any,<:Any,Int}, X::AbstractMatri
9191
end
9292
end
9393
cfs[Block.(2:M-1)] .= vec(dat[3:end,:]')
94-
cfs
94+
return cfs
9595
end
9696

9797
function \(Pl::DirichletPolynomialTransform{T,<:Any,<:Any,Int}, cfs::AbstractVector{T}) where T
@@ -137,7 +137,7 @@ function *(Pl::DirichletPolynomialTransform{T}, X::AbstractArray{T,4}) where T
137137
l == 2 && m == P && continue
138138
cfs[_dirichletpolyinds2blocks(k,j), _dirichletpolyinds2blocks(l,m)] = dat[k,j,l,m]
139139
end
140-
cfs
140+
return cfs
141141
end
142142

143143
function \(Pl::DirichletPolynomialTransform{T}, cfs::AbstractMatrix{T}) where T

src/piecewisepolynomial.jl

Lines changed: 45 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -22,7 +22,7 @@ function repeatgrid(ax, g, pts)
2222
for j in axes(ret, 2)
2323
ret[:, j] = affine(ax, pts[j] .. pts[j+1])[g]
2424
end
25-
ret
25+
return ret
2626
end
2727

2828

@@ -83,12 +83,10 @@ function _perm_blockvec(X::AbstractArray{T,3}, dims=1) where T
8383
for k = 2:size(X,3)
8484
ret[:,k] = _perm_blockvec(X[:,:,k])
8585
end
86-
ret
86+
return ret
8787
end
8888

8989

90-
91-
9290
function _perm_blockvec(X::AbstractArray{T,4}, dims=(1,2)) where T
9391
@assert dims == 1:2 || dims == (1,2)
9492
X1 = _perm_blockvec(X[:,:,1,1])
@@ -97,18 +95,48 @@ function _perm_blockvec(X::AbstractArray{T,4}, dims=(1,2)) where T
9795
for k = axes(X,1), j = axes(X,2), l = axes(X,3), m = axes(X,4)
9896
ret[Block(k)[j], Block(l)[m]] = X[k,j,l,m]
9997
end
100-
ret
98+
return ret
10199
end
102100

103101
function _inv_perm_blockvec(X::AbstractMatrix{T}, dims=(1,2)) where T
104-
@assert dims == 1:2 || dims == (1,2)
102+
@assert dims == 1:2 || dims == (1,2) || dims == 1
105103
M,N = blocksize(X)
106104
m,n = size(X)
107-
ret = Array{T}(undef, M, m ÷ M, N, n ÷ N)
108-
for k = axes(ret,1), j = axes(ret,2), l = axes(ret,3), m = axes(ret,4)
109-
ret[k,j,l,m] = X[Block(k)[j], Block(l)[m]]
105+
if dims == 1:2 || dims == (1,2)
106+
ret = Array{T}(undef, M, m ÷ M, N, n ÷ N)
107+
for k = axes(ret,1), j = axes(ret,2), l = axes(ret,3), m = axes(ret,4)
108+
ret[k,j,l,m] = X[Block(k)[j], Block(l)[m]]
109+
end
110+
elseif dims == 1
111+
ret = Array{T}(undef, M, m ÷ M, n ÷ N)
112+
for k = axes(ret,1), j = axes(ret,2), l = axes(ret,3)
113+
ret[k,j,l] = X[Block(k)[j], Block(1)[l]]
114+
end
115+
end
116+
return ret
117+
end
118+
119+
function _perm_blockvec(X::AbstractArray{T,5}, dims=(1,2)) where T
120+
@assert dims == 1:2 || dims == (1,2)
121+
X1 = _perm_blockvec(X[:,:,:,:,1])
122+
ret = BlockedArray{T}(undef, (axes(X1,1), axes(X1,2), axes(X,5)))
123+
ret[:, :, 1] = X1
124+
for k = 2:lastindex(ret,3)
125+
ret[:, :, k] = _perm_blockvec(X[:,:,:,:,k])
110126
end
111-
ret
127+
return ret
128+
end
129+
130+
function _inv_perm_blockvec(X::AbstractArray{T,3}, dims=(1,2)) where T
131+
@assert dims == 1:2 || dims == (1,2)
132+
M,N,L = blocksize(X)
133+
m,n,ℓ = size(X)
134+
135+
ret = Array{T}(undef, M, m ÷ M, N, n ÷ N, ℓ÷L)
136+
for k = axes(ret,5)
137+
ret[:,:,:,:,k] = _inv_perm_blockvec(X[:,:,k])
138+
end
139+
return ret
112140
end
113141

114142
\(F::ApplyPlan{<:Any,typeof(_perm_blockvec)}, X::AbstractArray) = F.F \ _inv_perm_blockvec(X, F.args...)
@@ -137,6 +165,13 @@ function plan_transform(P::PiecewisePolynomial, (M,n)::Tuple{Block{1},Int}, dims
137165
ApplyPlan(_perm_blockvec, F, (dims,))
138166
end
139167

168+
function plan_transform(P::PiecewisePolynomial, (N,M,n)::Tuple{Block{1},Block{1},Int}, dims=ntuple(identity,Val(2)))
169+
@assert dims == 1:2 || dims == ntuple(identity,Val(2))
170+
Ns = (N,M)
171+
F = plan_transform(P.basis, (_interlace_const(length(P.points)-1, Int.(Ns)...)..., n), _doubledims(dims...))
172+
ApplyPlan(_perm_blockvec, F, (dims,))
173+
end
174+
140175
function factorize(V::SubQuasiArray{<:Any,2,<:PiecewisePolynomial,<:Tuple{Inclusion,BlockSlice}}, dims...)
141176
P = parent(V)
142177
_,JR = parentindices(V)

test/test_piecewisepolynomial.jl

Lines changed: 19 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -31,6 +31,7 @@ using LazyBandedMatrices: BlockVec
3131
x,F = plan_grid_transform(P, (Block(10),2), 1)
3232
KR = Block.(1:10)
3333
@test F * [exp.(x) ;;; cos.(x)] [transform(P,exp)[KR] transform(P,cos)[KR]]
34+
@test F \ (F * [exp.(x) ;;; cos.(x)]) [exp.(x) ;;; cos.(x)]
3435

3536
t = axes(P,1)
3637
@test (P \ [cos.(t) sin.(t)])[KR,:] [(P\cos.(t))[KR,:] (P\sin.(t))[KR,:]]
@@ -64,4 +65,22 @@ using LazyBandedMatrices: BlockVec
6465
@test pl\(pl*X) X
6566
end
6667
end
68+
69+
@testset "tensor transform" begin
70+
for P in (PiecewisePolynomial(Chebyshev(), range(0,1; length=3)), PiecewisePolynomial(Legendre(), range(0,1; length=3)))
71+
xy, pl = plan_grid_transform(P, (Block(10),Block(11), 3), (1,2))
72+
@test size(pl) == (10, 2, 11, 2, 3)
73+
x,y=first(xy),last(xy)
74+
y = reshape(y,1,1,size(y)...)
75+
76+
X = [exp.(x .+ cos.(y)) ;;;;; exp.(y .+ sin.(x)) ;;;;; cos.(x .+ sin.(y))]
77+
C = pl*X
78+
79+
@test P[0.1, Block.(1:10)]' * C[:,:,1] * P[0.2, Block.(1:11)] exp(0.1 + cos(0.2))
80+
@test P[0.1, Block.(1:10)]' * C[:,:,2] * P[0.2, Block.(1:11)] exp(0.2 + sin(0.1))
81+
@test P[0.1, Block.(1:10)]' * C[:,:,3] * P[0.2, Block.(1:11)] cos(0.1 + sin(0.2))
82+
83+
@test pl\C X
84+
end
85+
end
6786
end

0 commit comments

Comments
 (0)