@@ -36,20 +36,28 @@ function cov(k::Kernel, X1::AbstractMatrix, X2::AbstractMatrix, data::KernelData
3636 cov! (cK, k, X1, X2, data)
3737end
3838
39+ function _cov_row! (cK, k, X:: AbstractMatrix , data, j, dim)
40+ cK[j,j] = cov_ij (k, X, X, data, j, j, dim)
41+ @inbounds for i in 1 : j- 1
42+ cK[i,j] = cov_ij (k, X, X, data, i, j, dim)
43+ cK[j,i] = cK[i,j]
44+ end
45+ end
3946function cov! (cK:: AbstractMatrix , k:: Kernel , X:: AbstractMatrix , data:: KernelData = EmptyData ())
4047 dim, nobs = size (X)
4148 (nobs,nobs) == size (cK) || throw (ArgumentError (" cK has size $(size (cK)) and X has size $(size (X)) " ))
4249 kcopies = [deepcopy (k) for _ in 1 : Threads. nthreads ()] # in case k is not threadsafe (e.g. ADkernel)
4350 @inbounds Threads. @threads for j in 1 : nobs
4451 kthread = kcopies[Threads. threadid ()]
45- cK[j,j] = cov_ij (kthread, X, X, data, j, j, dim)
46- for i in 1 : j- 1
47- cK[i,j] = cov_ij (kthread, X, X, data, i, j, dim)
48- cK[j,i] = cK[i,j]
49- end
52+ _cov_row! (cK, k, X, data, j, dim)
5053 end
5154 return cK
5255end
56+ function _cov_row! (cK, k, X1:: AbstractMatrix , X2:: AbstractMatrix , data, i, dim, nobs2)
57+ @inbounds for j in 1 : nobs2
58+ cK[i,j] = cov_ij (k, X1, X2, data, i, j, dim)
59+ end
60+ end
5361"""
5462 cov!(cK::AbstractMatrix, k::Kernel, X1::AbstractMatrix, X2::AbstractMatrix, data::KernelData=EmptyData())
5563
@@ -67,9 +75,7 @@ function cov!(cK::AbstractMatrix, k::Kernel, X1::AbstractMatrix, X2::AbstractMat
6775 kcopies = [deepcopy (k) for _ in 1 : Threads. nthreads ()]
6876 @inbounds Threads. @threads for i in 1 : nobs1
6977 kthread = kcopies[Threads. threadid ()]
70- for j in 1 : nobs2
71- cK[i,j] = cov_ij (kthread, X1, X2, data, i, j, dim)
72- end
78+ _cov_row! (cK, kthread, X1, X2, data, i, dim, nobs2)
7379 end
7480 return cK
7581end
@@ -97,20 +103,28 @@ cov(k::Kernel, X::AbstractMatrix, data::KernelData=EmptyData()) = cov(k, X, X, d
97103 end
98104end
99105
106+ function _grad_slice_row! (dK, k, X:: AbstractMatrix , data, j, p, dim)
107+ dK[j,j] = dKij_dθp (k,X,X,data,j,j,p,dim)
108+ @inbounds @simd for i in 1 : (j- 1 )
109+ dK[i,j] = dKij_dθp (k,X,X,data,i,j,p,dim)
110+ dK[j,i] = dK[i,j]
111+ end
112+ end
100113function grad_slice! (dK:: AbstractMatrix , k:: Kernel , X:: AbstractMatrix , data:: KernelData , p:: Int )
101114 dim, nobs = size (X)
102115 (nobs,nobs) == size (dK) || throw (ArgumentError (" dK has size $(size (dK)) and X has size $(size (X)) " ))
103116 kcopies = [deepcopy (k) for _ in 1 : Threads. nthreads ()]
104117 @inbounds Threads. @threads for j in 1 : nobs
105118 kthread = kcopies[Threads. threadid ()]
106- dK[j,j] = dKij_dθp (kthread,X,X,data,j,j,p,dim)
107- @simd for i in 1 : (j- 1 )
108- dK[i,j] = dKij_dθp (kthread,X,X,data,i,j,p,dim)
109- dK[j,i] = dK[i,j]
110- end
119+ _grad_slice_row! (dK, kthread, X, data, j, p, dim)
111120 end
112121 return dK
113122end
123+ function _grad_slice_row! (dK, k, X1:: AbstractMatrix , X2:: AbstractMatrix , data, i, p, dim, nobs2)
124+ @inbounds @simd for j in 1 : nobs2
125+ dK[i,j] = dKij_dθp (k,X1,X2,data,i,j,p,dim)
126+ end
127+ end
114128function grad_slice! (dK:: AbstractMatrix , k:: Kernel , X1:: AbstractMatrix , X2:: AbstractMatrix , data:: KernelData , p:: Int )
115129 if X1 === X2
116130 return grad_slice! (dK, k, X1, data, p)
@@ -123,9 +137,7 @@ function grad_slice!(dK::AbstractMatrix, k::Kernel, X1::AbstractMatrix, X2::Abst
123137 kcopies = [deepcopy (k) for _ in 1 : Threads. nthreads ()]
124138 @inbounds Threads. @threads for i in 1 : nobs1
125139 kthread = kcopies[Threads. threadid ()]
126- @simd for j in 1 : nobs2
127- dK[i,j] = dKij_dθp (kthread,X1,X2,data,i,j,p,dim)
128- end
140+ _grad_slice_row! (dK, kthread, X1, X2, data, i, p, dim, nobs2)
129141 end
130142 return dK
131143end
0 commit comments