|
|
@ -4,12 +4,14 @@ Created on 6. okt. 2016
|
|
|
|
@author: pab
|
|
|
|
@author: pab
|
|
|
|
'''
|
|
|
|
'''
|
|
|
|
from __future__ import absolute_import, division
|
|
|
|
from __future__ import absolute_import, division
|
|
|
|
from numba import jit, float64, int64, int32, int8, void
|
|
|
|
from numba import guvectorize, jit, float64, int64, int32, int8, void
|
|
|
|
import numpy as np
|
|
|
|
import numpy as np
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
@jit(void(int64, int64, int64, int64[:], int8[:], int64, int64))
|
|
|
|
@guvectorize([(int64[:], int8[:], int64[:])], '(n),(n)->(3)')
|
|
|
|
def _find_first_cross(ix, start, dcross, ind, y, v, n):
|
|
|
|
def _find_first_cross(ind, y, out):
|
|
|
|
|
|
|
|
ix, dcross, start, v = 0, 0, 0, 0
|
|
|
|
|
|
|
|
n = len(y)
|
|
|
|
if y[0] < v:
|
|
|
|
if y[0] < v:
|
|
|
|
dcross = -1 # first is a up-crossing
|
|
|
|
dcross = -1 # first is a up-crossing
|
|
|
|
elif y[0] > v:
|
|
|
|
elif y[0] > v:
|
|
|
@ -28,14 +30,16 @@ def _find_first_cross(ix, start, dcross, ind, y, v, n):
|
|
|
|
ix += 1
|
|
|
|
ix += 1
|
|
|
|
dcross = 1 # The next crossing is a down-crossing
|
|
|
|
dcross = 1 # The next crossing is a down-crossing
|
|
|
|
break
|
|
|
|
break
|
|
|
|
|
|
|
|
out[0] = ix
|
|
|
|
|
|
|
|
out[1] = dcross
|
|
|
|
|
|
|
|
out[2] = start
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
@jit(int64(int64[:], int8[:]))
|
|
|
|
@jit(int64(int64[:], int8[:]))
|
|
|
|
def _findcross(ind, y):
|
|
|
|
def _findcross(ind, y):
|
|
|
|
ix, dcross, start, v = 0, 0, 0, 0
|
|
|
|
v = 0
|
|
|
|
|
|
|
|
ix, dcross, start = _find_first_cross(ind, y)
|
|
|
|
n = len(y)
|
|
|
|
n = len(y)
|
|
|
|
_find_first_cross(ix, start, dcross, ind, y, v, n)
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
for i in range(start, n - 1):
|
|
|
|
for i in range(start, n - 1):
|
|
|
|
if ((dcross == -1 and y[i] <= v and v < y[i + 1]) or
|
|
|
|
if ((dcross == -1 and y[i] <= v and v < y[i + 1]) or
|
|
|
|
(dcross == 1 and v <= y[i] and y[i + 1] < v)):
|
|
|
|
(dcross == 1 and v <= y[i] and y[i + 1] < v)):
|
|
|
|