Aluode/PerceptionLabPortable
0
1# Authors: The scikit-learn developers
2# SPDX-License-Identifier: BSD-3-Clause
3
4from libc.math cimport isnan, isinf
5from cython cimport floating
6
7
8cpdef enum FiniteStatus:
9 all_finite = 0
10 has_nan = 1
11 has_infinite = 2
12
13
14def cy_isfinite(floating[::1] a, bint allow_nan=False):
15 cdef FiniteStatus result
16 with nogil:
17 result = _isfinite(a, allow_nan)
18 return result
19
20
21cdef inline FiniteStatus _isfinite(floating[::1] a, bint allow_nan) noexcept nogil:
22 cdef floating* a_ptr = &a[0]
23 cdef Py_ssize_t length = len(a)
24 if allow_nan:
25 return _isfinite_allow_nan(a_ptr, length)
26 else:
27 return _isfinite_disable_nan(a_ptr, length)
28
29
30cdef inline FiniteStatus _isfinite_allow_nan(floating* a_ptr,
31 Py_ssize_t length) noexcept nogil:
32 cdef Py_ssize_t i
33 cdef floating v
34 for i in range(length):
35 v = a_ptr[i]
36 if isinf(v):
37 return FiniteStatus.has_infinite
38 return FiniteStatus.all_finite
39
40
41cdef inline FiniteStatus _isfinite_disable_nan(floating* a_ptr,
42 Py_ssize_t length) noexcept nogil:
43 cdef Py_ssize_t i
44 cdef floating v
45 for i in range(length):
46 v = a_ptr[i]
47 if isnan(v):
48 return FiniteStatus.has_nan
49 elif isinf(v):
50 return FiniteStatus.has_infinite
51 return FiniteStatus.all_finite
52 