mirror of
https://github.com/SheffieldML/GPy.git
synced 2026-05-06 02:24:17 +02:00
some cython improvments for stationary kerns
This commit is contained in:
parent
601efa7525
commit
406b8de9a2
2 changed files with 14475 additions and 322 deletions
File diff suppressed because it is too large
Load diff
|
|
@ -1,7 +1,9 @@
|
||||||
#cython: boundscheck=False
|
#cython: boundscheck=False
|
||||||
|
#cython: nonecheck=False
|
||||||
#cython: wraparound=False
|
#cython: wraparound=False
|
||||||
import numpy as np
|
import numpy as np
|
||||||
cimport numpy as np
|
cimport numpy as np
|
||||||
|
from cython.parallel import prange
|
||||||
|
|
||||||
ctypedef np.float64_t DTYPE_t
|
ctypedef np.float64_t DTYPE_t
|
||||||
|
|
||||||
|
|
@ -22,7 +24,18 @@ def grad_X(int N, int D, int M,
|
||||||
cdef double *grad = <double*> _grad.data
|
cdef double *grad = <double*> _grad.data
|
||||||
_grad_X(N, D, M, X, X2, tmp, grad) # return nothing, work in place.
|
_grad_X(N, D, M, X, X2, tmp, grad) # return nothing, work in place.
|
||||||
|
|
||||||
def lengthscale_grads(int N, int M, int Q,
|
def grad_X_cython(int N, int D, int M, double[:,:] X, double[:,:] X2, double[:,:] tmp, double[:,:] grad):
|
||||||
|
cdef int n,d,nd,m
|
||||||
|
for nd in prange(N*D, nogil=True):
|
||||||
|
n = nd/D
|
||||||
|
d = nd%D
|
||||||
|
grad[n,d] = 0.0
|
||||||
|
for m in range(M):
|
||||||
|
grad[n,d] += tmp[n,m]*(X[n,d]-X2[m,d])
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
def lengthscale_grads_in_c(int N, int M, int Q,
|
||||||
np.ndarray[DTYPE_t, ndim=2] _tmp,
|
np.ndarray[DTYPE_t, ndim=2] _tmp,
|
||||||
np.ndarray[DTYPE_t, ndim=2] _X,
|
np.ndarray[DTYPE_t, ndim=2] _X,
|
||||||
np.ndarray[DTYPE_t, ndim=2] _X2,
|
np.ndarray[DTYPE_t, ndim=2] _X2,
|
||||||
|
|
@ -33,4 +46,14 @@ def lengthscale_grads(int N, int M, int Q,
|
||||||
cdef double *grad = <double*> _grad.data
|
cdef double *grad = <double*> _grad.data
|
||||||
_lengthscale_grads(N, M, Q, tmp, X, X2, grad) # return nothing, work in place.
|
_lengthscale_grads(N, M, Q, tmp, X, X2, grad) # return nothing, work in place.
|
||||||
|
|
||||||
|
def lengthscale_grads(int N, int M, int Q, double[:,:] tmp, double[:,:] X, double[:,:] X2, double[:] grad):
|
||||||
|
cdef int q, n, m
|
||||||
|
cdef double gradq, dist
|
||||||
|
for q in range(Q):
|
||||||
|
grad[q] = 0.0
|
||||||
|
for n in range(N):
|
||||||
|
for m in range(M):
|
||||||
|
dist = X[n,q] - X2[m,q]
|
||||||
|
grad[q] += tmp[n,m]*dist*dist
|
||||||
|
|
||||||
|
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue