Skip to content

Commit da1dc17

Browse files
fixup recurrence for tridiag-block-tridiag Y
1 parent 04135c5 commit da1dc17

File tree

1 file changed

+61
-19
lines changed

1 file changed

+61
-19
lines changed

src/BivariateGramMatrix.jl

Lines changed: 61 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -167,6 +167,7 @@ function BivariateGramMatrix(μ::BlockedVector{T, <: PaddedVector{T}}, X::XT, Y:
167167
end
168168
for n in 3:n
169169
for m in n:min(N-n+1, b+n)
170+
#println("m = $m, n = $n")
170171
recurse!(W, X, Y, m, n)
171172
end
172173
symmetrize_block!(view(W, Block(n, n)))
@@ -214,7 +215,7 @@ function recurse!(W, X, Y, m)
214215
Wa = view(W, Block(m-1, 1))
215216
Wb = view(W, Block(m, 1))
216217
Wc = view(W, Block(m+1, 1))
217-
We = view(viewblock(W, Block(m, 2)), 1:m, 1:1)
218+
We = viewblock(W, Block(m, 2))
218219

219220
Xa = view(X.data, Block(1, m))
220221
Xb = view(X.data, Block(2, m))
@@ -250,15 +251,37 @@ function recurse!(W, X, Y, m)
250251
Yb = viewblock(Y, Block(m, m))
251252
Yc = viewblock(Y, Block(m+1, m))
252253
Yd = viewblock(Y, Block(1, 1))
253-
254-
We = view(viewblock(W, Block(m, 2)), 1:m, 2)
255-
mul!(We, Ya', view(Wa, :, 1))
256-
mul!(We, Yb', view(Wb, :, 1), 1, 1)
257-
mul!(We, Yc', view(Wc, :, 1), 1, 1)
258-
mul!(We, Wb, view(Yd, :, 1), -1, 1)
259254
Yn = viewblock(Y, Block(2, 1))
260-
We .-= Yn[1, 1].*view(viewblock(W, Block(m, 2)), 1:m, 1)
261-
rdiv!(We, Yn[2, 1])
255+
for j in colrange(We, 2)
256+
if j == 1
257+
if j == size(Ya, 2)-1
258+
We[j, 2] = Ya[j, j]*Wa[j, 1]
259+
else
260+
We[j, 2] = Ya[j, j]*Wa[j, 1] + Ya[j+1, j]*Wa[j+1, 1]
261+
end
262+
elseif j == size(Ya, 2)
263+
We[j, 2] = Ya[j-1, j]*Wa[j-1, 1]
264+
elseif j == size(Ya, 2)-1
265+
We[j, 2] = Ya[j-1, j]*Wa[j-1, 1] + Ya[j, j]*Wa[j, 1]
266+
else
267+
We[j, 2] = Ya[j-1, j]*Wa[j-1, 1] + Ya[j, j]*Wa[j, 1] + Ya[j+1, j]*Wa[j+1, 1]
268+
end
269+
if j == 1
270+
We[j, 2] += Yb[j, j]*Wb[j, 1] + Yb[j+1, j]*Wb[j+1, 1]
271+
elseif j == size(Yb, 2)
272+
We[j, 2] += Yb[j-1, j]*Wb[j-1, 1] + Yb[j, j]*Wb[j, 1]
273+
else
274+
We[j, 2] += Yb[j-1, j]*Wb[j-1, 1] + Yb[j, j]*Wb[j, 1] + Yb[j+1, j]*Wb[j+1, 1]
275+
end
276+
if j == 1
277+
We[j, 2] += Yc[j, j]*Wc[j, 1] + Yc[j+1, j]*Wc[j+1, 1]
278+
else
279+
We[j, 2] += Yc[j-1, j]*Wc[j-1, 1] + Yc[j, j]*Wc[j, 1] + Yc[j+1, j]*Wc[j+1, 1]
280+
end
281+
We[j, 2] -= Wb[j, 1]*Yd[1, 1]
282+
We[j, 2] -= Yn[1, 1]*We[j, 1]
283+
We[j, 2] /= Yn[2, 1]
284+
end
262285
end
263286

264287
function recurse!(W, X, Y, m, n)
@@ -270,7 +293,7 @@ function recurse!(W, X, Y, m, n)
270293
Wb = view(W, Block(m, n-1))
271294
Wc = view(W, Block(m+1, n-1))
272295
Wd = view(W, Block(m, n-2))
273-
We = view(viewblock(W, Block(m, n)), 1:m, 1:n-1)
296+
We = viewblock(W, Block(m, n))
274297

275298
Xa = view(X.data, Block(1, m))
276299
Xb = view(X.data, Block(2, m))
@@ -323,16 +346,35 @@ function recurse!(W, X, Y, m, n)
323346
Yc = viewblock(Y, Block(m+1, m))
324347
Yd = viewblock(Y, Block(n-1, n-1))
325348
Ye = viewblock(Y, Block(n-2, n-1))
326-
327-
We = view(viewblock(W, Block(m, n)), 1:m, n)
328-
mul!(We, Ya', view(Wa, :, n-1))
329-
mul!(We, Yb', view(Wb, :, n-1), 1, 1)
330-
mul!(We, Yc', view(Wc, :, n-1), 1, 1)
331-
mul!(We, Wb, view(Yd, :, n-1), -1, 1)
332-
mul!(We, Wd, view(Ye, :, n-1), -1, 1)
333349
Yn = viewblock(Y, Block(n, n-1))
334-
We .-= Yn[n-2, n-1].*view(viewblock(W, Block(m, n)), 1:m, n-2) .+ Yn[n-1, n-1].*view(viewblock(W, Block(m, n)), 1:m, n-1)
335-
rdiv!(We, Yn[n, n-1])
350+
351+
for j in colrange(We, n)
352+
if j == 1
353+
We[j, n] = Ya[j, j]*Wa[j, n-1] + Ya[j+1, j]*Wa[j+1, n-1]
354+
elseif j == size(Ya, 2)
355+
We[j, n] = Ya[j-1, j]*Wa[j-1, n-1]
356+
elseif j == size(Ya, 2)-1
357+
We[j, n] = Ya[j-1, j]*Wa[j-1, n-1] + Ya[j, j]*Wa[j, n-1]
358+
else
359+
We[j, n] = Ya[j-1, j]*Wa[j-1, n-1] + Ya[j, j]*Wa[j, n-1] + Ya[j+1, j]*Wa[j+1, n-1]
360+
end
361+
if j == 1
362+
We[j, n] += Yb[j, j]*Wb[j, n-1] + Yb[j+1, j]*Wb[j+1, n-1]
363+
elseif j == size(Yb, 2)
364+
We[j, n] += Yb[j-1, j]*Wb[j-1, n-1] + Yb[j, j]*Wb[j, n-1]
365+
else
366+
We[j, n] += Yb[j-1, j]*Wb[j-1, n-1] + Yb[j, j]*Wb[j, n-1] + Yb[j+1, j]*Wb[j+1, n-1]
367+
end
368+
if j == 1
369+
We[j, n] += Yc[j, j]*Wc[j, n-1] + Yc[j+1, j]*Wc[j+1, n-1]
370+
else
371+
We[j, n] += Yc[j-1, j]*Wc[j-1, n-1] + Yc[j, j]*Wc[j, n-1] + Yc[j+1, j]*Wc[j+1, n-1]
372+
end
373+
We[j, n] -= Wb[j, n-2]*Yd[n-2, n-1] + Wb[j, n-1]*Yd[n-1, n-1]
374+
We[j, n] -= Wd[j, n-2]*Ye[n-2, n-1]
375+
We[j, n] -= Yn[n-2, n-1]*We[j, n-2] + Yn[n-1, n-1]*We[j, n-1]
376+
We[j, n] /= Yn[n, n-1]
377+
end
336378
end
337379

338380

0 commit comments

Comments
 (0)