Skip to content

Commit 83421e6

Browse files
authored
Minor memory optimization for Zernike jacobi matrices (#122)
* Remove unnecessary stored 0s due to symmetry * adapt size test for smaller data * increase coverage
1 parent e065da9 commit 83421e6

File tree

2 files changed

+10
-14
lines changed

2 files changed

+10
-14
lines changed

src/disk.jl

Lines changed: 4 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -224,11 +224,7 @@ function zernikejacobibandsX(Z::Zernike)
224224
du = sqrt.( (dufirst .+ dueven .+ duodd ) ./ quotient)
225225
dl = sqrt.( (dleven .+ dlodd .+ dlspecial) ./ quotient)
226226

227-
return BlockHcat(
228-
BlockBroadcastArray(hcat, du, Zeros((axes(n,1),)), dl),
229-
Zeros((axes(n,1),Base.OneTo(3))),
230-
Zeros((axes(n,1),Base.OneTo(3)))
231-
)
227+
return BlockBroadcastArray(hcat, du, Zeros((axes(n,1),)), dl)
232228
end
233229

234230
function zernikejacobibandsY(Z::Zernike)
@@ -264,12 +260,8 @@ function zernikejacobibandsY(Z::Zernike)
264260
dl = (-1) .* (nodd .* kodd .+ neven .* keven) .* Vcat(0 , d)
265261
du = (-1) .* (nodd .* keven .+ neven .* kodd) .* d[2:end]
266262

267-
# zero blocks for banded blockarray structure
268-
z = Zeros((axes(n,1),))
269-
z5 = Zeros((axes(n,1),Base.OneTo(5)))
270-
271263
# generate and return bands
272-
return dat = BlockHcat(BlockBroadcastArray(hcat, dl, z, d, z, du), z5, z5)
264+
return dat = BlockBroadcastArray(hcat, dl, Zeros((axes(n,1),)), d, Zeros((axes(n,1),)), du)
273265
end
274266

275267
function getindex(b::ZernikeJacobimatrixBandsX{T},i,j) where T
@@ -282,15 +274,15 @@ end
282274
function jacobimatrix(::Val{1}, Z::Zernike{T}) where T
283275
if iszero(Z.a)
284276
dat = ZernikeJacobimatrixBandsX{T}(Z)
285-
return Symmetric(BlockBandedMatrices._BandedBlockBandedMatrix(dat', axes(dat,1), (1,1), (1,1)))
277+
return Symmetric(BlockBandedMatrices._BandedBlockBandedMatrix(dat', axes(dat,1), (-1,1), (1,1)))
286278
else
287279
error("Implement for non-zero first basis parameter.")
288280
end
289281
end
290282
function jacobimatrix(::Val{2}, Z::Zernike{T}) where T
291283
if iszero(Z.a)
292284
dat = ZernikeJacobimatrixBandsY{T}(Z)
293-
return Symmetric(BlockBandedMatrices._BandedBlockBandedMatrix(dat', axes(dat,1), (1,1), (2,2)))
285+
return Symmetric(BlockBandedMatrices._BandedBlockBandedMatrix(dat', axes(dat,1), (-1,1), (2,2)))
294286
else
295287
error("Implement for non-zero first basis parameter.")
296288
end

test/test_disk.jl

Lines changed: 6 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -103,8 +103,12 @@ import ForwardDiff: hessian
103103
yf = Z \ (y.*sin.(x.*y) .+ y .* x.^2 .- y.^2)
104104
@test Y[Block.(1:20),Block.(1:20)]*f[Block.(1:20)] yf[Block.(1:20)]
105105
# data size tests
106-
@test size((X.data).data) == (9, ℵ₀)
107-
@test size((Y.data).data) == (15, ℵ₀)
106+
@test size((X.data).data) == (3, ℵ₀)
107+
@test size((Y.data).data) == (5, ℵ₀)
108+
109+
# for now, reject non-zero first parameter options
110+
@test_throws ErrorException("Implement for non-zero first basis parameter.") jacobimatrix(Val(1),Zernike(1,1))
111+
@test_throws ErrorException("Implement for non-zero first basis parameter.") jacobimatrix(Val(2),Zernike(1,1))
108112
end
109113

110114
@testset "Transform" begin

0 commit comments

Comments
 (0)