@@ -167,6 +167,7 @@ function BivariateGramMatrix(μ::BlockedVector{T, <: PaddedVector{T}}, X::XT, Y:
167
167
end
168
168
for n in 3 : n
169
169
for m in n: min (N- n+ 1 , b+ n)
170
+ # println("m = $m, n = $n")
170
171
recurse! (W, X, Y, m, n)
171
172
end
172
173
symmetrize_block! (view (W, Block (n, n)))
@@ -214,7 +215,7 @@ function recurse!(W, X, Y, m)
214
215
Wa = view (W, Block (m- 1 , 1 ))
215
216
Wb = view (W, Block (m, 1 ))
216
217
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 ))
218
219
219
220
Xa = view (X. data, Block (1 , m))
220
221
Xb = view (X. data, Block (2 , m))
@@ -250,15 +251,37 @@ function recurse!(W, X, Y, m)
250
251
Yb = viewblock (Y, Block (m, m))
251
252
Yc = viewblock (Y, Block (m+ 1 , m))
252
253
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 )
259
254
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
262
285
end
263
286
264
287
function recurse! (W, X, Y, m, n)
@@ -270,7 +293,7 @@ function recurse!(W, X, Y, m, n)
270
293
Wb = view (W, Block (m, n- 1 ))
271
294
Wc = view (W, Block (m+ 1 , n- 1 ))
272
295
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))
274
297
275
298
Xa = view (X. data, Block (1 , m))
276
299
Xb = view (X. data, Block (2 , m))
@@ -323,16 +346,35 @@ function recurse!(W, X, Y, m, n)
323
346
Yc = viewblock (Y, Block (m+ 1 , m))
324
347
Yd = viewblock (Y, Block (n- 1 , n- 1 ))
325
348
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 )
333
349
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
336
378
end
337
379
338
380
0 commit comments