@@ -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
262285end
263286
264287function 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
336378end
337379
338380
0 commit comments