CoolFace
Apppublic

Aluode/PerceptionLabPortable

sourceHugging Faceupdated 9mo agoView on Hugging Face
0likes
_isfinite.pyx52 linesDownload Raw Back to utils
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 
Aluode/PerceptionLabPortable · CoolFace