44 lines
1.1 KiB
Cython
44 lines
1.1 KiB
Cython
#cython: boundscheck=False
|
|
#cython: cdivision=True
|
|
#cython: wraparound=False
|
|
#cython: nonecheck=False
|
|
#cython: language_level=3
|
|
#
|
|
# This is the Cython translation of the diffinv function R source code
|
|
#
|
|
# Author: Charles Drotar
|
|
|
|
import numpy as np
|
|
cimport numpy as np
|
|
cimport cython
|
|
|
|
ctypedef np.npy_intp INTP
|
|
|
|
cdef fused floating1d:
|
|
float[::1]
|
|
double[::1]
|
|
|
|
np.import_array()
|
|
|
|
|
|
@cython.boundscheck(False)
|
|
@cython.wraparound(False)
|
|
cpdef double[:] C_intgrt_vec(floating1d x,
|
|
floating1d xi,
|
|
INTP lag):
|
|
"""Inverse diff
|
|
|
|
References
|
|
----------
|
|
.. [1] https://github.com/wch/r-source/blob/trunk/src/library/stats/R/diffinv.R#L39
|
|
.. [2] https://github.com/mirror/r/blob/65a0e33a4b0a119703586fcd1f9742654738ae54/src/library/stats/src/PPsum.c#L46
|
|
"""
|
|
cdef INTP i, n = x.shape[0]
|
|
cdef np.ndarray[double, ndim=1, mode='c'] ans = \
|
|
np.zeros(n + lag, dtype=np.float64, order='c')
|
|
|
|
with nogil:
|
|
for i in range(lag, lag + n):
|
|
ans[i] = x[i - lag] + ans[i - lag]
|
|
return ans
|