@@ -5,7 +5,7 @@ from libcpp.vector cimport vector
5
5
6
6
from ...utils._cython_blas cimport _dot
7
7
from ...utils._openmp_helpers cimport omp_get_thread_num
8
- from ...utils._typedefs cimport intp_t, float32_t, float64_t
8
+ from ...utils._typedefs cimport intp_t, float32_t, float64_t, int32_t
9
9
10
10
import numpy as np
11
11
@@ -14,7 +14,6 @@ from numbers import Integral
14
14
from sklearn import get_config
15
15
from sklearn.utils import check_scalar
16
16
from ...utils._openmp_helpers import _openmp_effective_n_threads
17
- from ...utils.sparsefuncs_fast import _sqeuclidean_row_norms_sparse
18
17
19
18
#####################
20
19
@@ -84,6 +83,23 @@ cdef float64_t[::1] _sqeuclidean_row_norms32_dense(
84
83
return squared_row_norms
85
84
86
85
86
+ cdef float64_t[::1] _sqeuclidean_row_norms64_sparse(
87
+ const float64_t[:] X_data,
88
+ const int32_t[:] X_indptr,
89
+ intp_t num_threads,
90
+ ):
91
+ cdef:
92
+ intp_t n = X_indptr.shape[0] - 1
93
+ int32_t X_i_ptr, idx = 0
94
+ float64_t[::1] squared_row_norms = np.zeros(n, dtype=np.float64)
95
+
96
+ for idx in prange(n, schedule='static', nogil=True, num_threads=num_threads):
97
+ for X_i_ptr in range(X_indptr[idx], X_indptr[idx+1]):
98
+ squared_row_norms[idx] += X_data[X_i_ptr] * X_data[X_i_ptr]
99
+
100
+ return squared_row_norms
101
+
102
+
87
103
{{for name_suffix in ["64", "32"]}}
88
104
89
105
from ._datasets_pair cimport DatasetsPair{{name_suffix}}
@@ -98,7 +114,7 @@ cpdef float64_t[::1] _sqeuclidean_row_norms{{name_suffix}}(
98
114
# by moving squared row norms computations in MiddleTermComputer.
99
115
X_data = np.asarray(X.data, dtype=np.float64)
100
116
X_indptr = np.asarray(X.indptr, dtype=np.int32)
101
- return _sqeuclidean_row_norms_sparse (X_data, X_indptr, num_threads)
117
+ return _sqeuclidean_row_norms64_sparse (X_data, X_indptr, num_threads)
102
118
else:
103
119
return _sqeuclidean_row_norms{{name_suffix}}_dense(X, num_threads)
104
120
0 commit comments