1+
2+ mutable struct AdaptiveCholeskyFactors{T,DM<: AbstractMatrix{T} ,M<: AbstractMatrix{T} } <: LayoutMatrix{T}
3+ data:: CachedMatrix{T,DM,M}
4+ ncols:: Int
5+ end
6+
7+ size (U:: AdaptiveCholeskyFactors ) = size (U. data. array)
8+ bandwidths (A:: AdaptiveCholeskyFactors ) = (0 ,bandwidth (A. data,2 ))
9+ AdaptiveCholeskyFactors (A:: Symmetric ) = AdaptiveCholeskyFactors (cache (parent (A)),0 )
10+ MemoryLayout (:: Type{AdaptiveCholeskyFactors{T,DM,M}} ) where {T,DM,M} = AdaptiveLayout {typeof(MemoryLayout(DM))} ()
11+
12+
13+ function partialcholesky! (F:: AdaptiveCholeskyFactors{T,<:BandedMatrix} , n:: Int ) where T
14+ if n > F. ncols
15+ _,u = bandwidths (F. data. array)
16+ resizedata! (F. data,n+ u,n+ u);
17+ ncols = F. ncols
18+ kr = ncols+ 1 : n
19+ factors = view (F. data. data,kr,kr)
20+ banded_chol! (factors, UpperTriangular)
21+ # multiply remaining columns
22+ U1 = UpperTriangular (view (F. data. data,n- u+ 1 : n,n- u+ 1 : n))
23+ B = view (F. data. data,n- u+ 1 : n,n+ 1 : n+ u)
24+ ldiv! (U1' ,B)
25+ muladd! (- one (T),B' ,B,one (T),view (F. data. data,n+ 1 : n+ u,n+ 1 : n+ u))
26+ F. ncols = n
27+ end
28+ F
29+ end
30+
31+ function getindex (F:: AdaptiveCholeskyFactors , k:: Int , j:: Int )
32+ partialcholesky! (F, max (k,j))
33+ F. data. data[k,j]
34+ end
35+
36+
37+ adaptivecholesky (A) = Cholesky (AdaptiveCholeskyFactors (A), :U , 0 )
38+
39+
40+ ArrayLayouts. _cholesky (:: SymmetricLayout{<:AbstractBandedLayout} , :: NTuple{2,OneToInf{Int}} , A) = adaptivecholesky (A)
41+
42+ function colsupport (F:: AdaptiveCholeskyFactors , j)
43+ partialcholesky! (F, maximum (j)+ bandwidth (F,2 ))
44+ colsupport (F. data. data, j)
45+ end
46+
47+ function rowsupport (F:: AdaptiveCholeskyFactors , j)
48+ partialcholesky! (F, maximum (j)+ bandwidth (F,2 ))
49+ rowsupport (F. data. data, j)
50+ end
51+
52+ colsupport (F:: AdjOrTrans{<:Any,<:AdaptiveCholeskyFactors} , j) = rowsupport (parent (F), j)
53+ rowsupport (F:: AdjOrTrans{<:Any,<:AdaptiveCholeskyFactors} , j) = colsupport (parent (F), j)
54+
55+ function materialize! (M:: MatLdivVec{<:TriangularLayout{'L','N',<:AdaptiveLayout},<:PaddedLayout} )
56+ A,B = M. A,M. B
57+ T = eltype (M)
58+ COLGROWTH = 1000 # rate to grow columns
59+ tol = floatmin (real (T))
60+
61+ require_one_based_indexing (B)
62+ mA, nA = size (A)
63+ mB = length (B)
64+ if mA != mB
65+ throw (DimensionMismatch (" matrix A has dimensions ($mA ,$nA ) but B has dimensions ($mB , $nB )" ))
66+ end
67+ sB = B. datasize[1 ]
68+ l,_ = bandwidths (A)
69+
70+ jr = 1 : min (COLGROWTH,nA)
71+
72+ P = parent (parent (A))
73+
74+ @inbounds begin
75+ while first (jr) < nA
76+ j = first (jr)
77+ cs = colsupport (A, last (jr))
78+ cs_max = maximum (cs)
79+ kr = j: cs_max
80+ resizedata! (B, min (cs_max,mB))
81+ if (j > sB && maximum (abs,view (B. data,j: last (colsupport (P,j)))) ≤ tol)
82+ break
83+ end
84+ partialcholesky! (P, min (cs_max,nA))
85+ U_N = UpperTriangular (view (P. data. data, jr, jr))
86+ ldiv! (U_N' , view (B. data, jr))
87+ jr1 = last (jr)- l+ 1 : last (jr)
88+ jr2 = last (jr)+ 1 : last (jr)+ l
89+ muladd! (- one (T), view (P. data. data, jr1,jr2)' , view (B. data,jr1), one (T), view (B. data,jr2))
90+ jr = last (jr)+ 1 : min (last (jr)+ COLGROWTH,nA)
91+ end
92+ end
93+ B
94+ end
95+
96+ function ldiv! (R:: UpperTriangular{<:Any,<:AdaptiveCholeskyFactors} , B:: CachedVector{<:Any,<:Any,<:Zeros{<:Any,1}} )
97+ n = B. datasize[1 ]
98+ partialcholesky! (parent (R), n)
99+ ldiv! (UpperTriangular (view (parent (R). data. data,oneto (n),oneto (n))), view (B. data,oneto (n)))
100+ B
101+ end
0 commit comments