scikit-learn-intelex 2025.4.0__py313-none-manylinux_2_28_x86_64.whl

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.

Potentially problematic release.


This version of scikit-learn-intelex might be problematic. Click here for more details.

Files changed (282) hide show
  1. daal4py/__init__.py +73 -0
  2. daal4py/__main__.py +58 -0
  3. daal4py/_daal4py.cpython-313-x86_64-linux-gnu.so +0 -0
  4. daal4py/doc/third-party-programs.txt +424 -0
  5. daal4py/mb/__init__.py +19 -0
  6. daal4py/mb/model_builders.py +377 -0
  7. daal4py/mpi_transceiver.cpython-313-x86_64-linux-gnu.so +0 -0
  8. daal4py/sklearn/__init__.py +40 -0
  9. daal4py/sklearn/_n_jobs_support.py +248 -0
  10. daal4py/sklearn/_utils.py +245 -0
  11. daal4py/sklearn/cluster/__init__.py +20 -0
  12. daal4py/sklearn/cluster/dbscan.py +165 -0
  13. daal4py/sklearn/cluster/k_means.py +597 -0
  14. daal4py/sklearn/cluster/tests/test_dbscan.py +109 -0
  15. daal4py/sklearn/decomposition/__init__.py +19 -0
  16. daal4py/sklearn/decomposition/_pca.py +524 -0
  17. daal4py/sklearn/ensemble/AdaBoostClassifier.py +196 -0
  18. daal4py/sklearn/ensemble/GBTDAAL.py +337 -0
  19. daal4py/sklearn/ensemble/__init__.py +27 -0
  20. daal4py/sklearn/ensemble/_forest.py +1397 -0
  21. daal4py/sklearn/ensemble/tests/test_decision_forest.py +206 -0
  22. daal4py/sklearn/linear_model/__init__.py +29 -0
  23. daal4py/sklearn/linear_model/_coordinate_descent.py +848 -0
  24. daal4py/sklearn/linear_model/_linear.py +272 -0
  25. daal4py/sklearn/linear_model/_ridge.py +325 -0
  26. daal4py/sklearn/linear_model/coordinate_descent.py +17 -0
  27. daal4py/sklearn/linear_model/linear.py +17 -0
  28. daal4py/sklearn/linear_model/logistic_loss.py +195 -0
  29. daal4py/sklearn/linear_model/logistic_path.py +1026 -0
  30. daal4py/sklearn/linear_model/ridge.py +17 -0
  31. daal4py/sklearn/linear_model/tests/test_linear.py +208 -0
  32. daal4py/sklearn/linear_model/tests/test_ridge.py +69 -0
  33. daal4py/sklearn/manifold/__init__.py +19 -0
  34. daal4py/sklearn/manifold/_t_sne.py +405 -0
  35. daal4py/sklearn/metrics/__init__.py +20 -0
  36. daal4py/sklearn/metrics/_pairwise.py +236 -0
  37. daal4py/sklearn/metrics/_ranking.py +210 -0
  38. daal4py/sklearn/model_selection/__init__.py +19 -0
  39. daal4py/sklearn/model_selection/_split.py +309 -0
  40. daal4py/sklearn/model_selection/tests/test_split.py +56 -0
  41. daal4py/sklearn/monkeypatch/__init__.py +0 -0
  42. daal4py/sklearn/monkeypatch/dispatcher.py +232 -0
  43. daal4py/sklearn/monkeypatch/tests/_models_info.py +161 -0
  44. daal4py/sklearn/monkeypatch/tests/test_monkeypatch.py +71 -0
  45. daal4py/sklearn/monkeypatch/tests/test_patching.py +90 -0
  46. daal4py/sklearn/monkeypatch/tests/utils/_launch_algorithms.py +117 -0
  47. daal4py/sklearn/neighbors/__init__.py +21 -0
  48. daal4py/sklearn/neighbors/_base.py +503 -0
  49. daal4py/sklearn/neighbors/_classification.py +139 -0
  50. daal4py/sklearn/neighbors/_regression.py +74 -0
  51. daal4py/sklearn/neighbors/_unsupervised.py +55 -0
  52. daal4py/sklearn/neighbors/tests/test_kneighbors.py +113 -0
  53. daal4py/sklearn/svm/__init__.py +19 -0
  54. daal4py/sklearn/svm/svm.py +734 -0
  55. daal4py/sklearn/utils/__init__.py +21 -0
  56. daal4py/sklearn/utils/base.py +75 -0
  57. daal4py/sklearn/utils/tests/test_utils.py +51 -0
  58. daal4py/sklearn/utils/validation.py +696 -0
  59. onedal/__init__.py +83 -0
  60. onedal/_config.py +54 -0
  61. onedal/_device_offload.py +204 -0
  62. onedal/_onedal_py_dpc.cpython-313-x86_64-linux-gnu.so +0 -0
  63. onedal/_onedal_py_host.cpython-313-x86_64-linux-gnu.so +0 -0
  64. onedal/_onedal_py_spmd_dpc.cpython-313-x86_64-linux-gnu.so +0 -0
  65. onedal/basic_statistics/__init__.py +20 -0
  66. onedal/basic_statistics/basic_statistics.py +107 -0
  67. onedal/basic_statistics/incremental_basic_statistics.py +175 -0
  68. onedal/basic_statistics/tests/test_basic_statistics.py +242 -0
  69. onedal/basic_statistics/tests/test_incremental_basic_statistics.py +279 -0
  70. onedal/basic_statistics/tests/utils.py +50 -0
  71. onedal/cluster/__init__.py +27 -0
  72. onedal/cluster/dbscan.py +105 -0
  73. onedal/cluster/kmeans.py +557 -0
  74. onedal/cluster/kmeans_init.py +112 -0
  75. onedal/cluster/tests/test_dbscan.py +125 -0
  76. onedal/cluster/tests/test_kmeans.py +88 -0
  77. onedal/cluster/tests/test_kmeans_init.py +93 -0
  78. onedal/common/_base.py +38 -0
  79. onedal/common/_estimator_checks.py +47 -0
  80. onedal/common/_mixin.py +62 -0
  81. onedal/common/_policy.py +55 -0
  82. onedal/common/_spmd_policy.py +30 -0
  83. onedal/common/hyperparameters.py +125 -0
  84. onedal/common/tests/test_policy.py +76 -0
  85. onedal/common/tests/test_sycl.py +128 -0
  86. onedal/covariance/__init__.py +20 -0
  87. onedal/covariance/covariance.py +122 -0
  88. onedal/covariance/incremental_covariance.py +161 -0
  89. onedal/covariance/tests/test_covariance.py +50 -0
  90. onedal/covariance/tests/test_incremental_covariance.py +190 -0
  91. onedal/datatypes/__init__.py +19 -0
  92. onedal/datatypes/_data_conversion.py +121 -0
  93. onedal/datatypes/tests/common.py +126 -0
  94. onedal/datatypes/tests/test_data.py +475 -0
  95. onedal/decomposition/__init__.py +20 -0
  96. onedal/decomposition/incremental_pca.py +214 -0
  97. onedal/decomposition/pca.py +186 -0
  98. onedal/decomposition/tests/test_incremental_pca.py +285 -0
  99. onedal/ensemble/__init__.py +29 -0
  100. onedal/ensemble/forest.py +736 -0
  101. onedal/ensemble/tests/test_random_forest.py +97 -0
  102. onedal/linear_model/__init__.py +27 -0
  103. onedal/linear_model/incremental_linear_model.py +292 -0
  104. onedal/linear_model/linear_model.py +325 -0
  105. onedal/linear_model/logistic_regression.py +247 -0
  106. onedal/linear_model/tests/test_incremental_linear_regression.py +213 -0
  107. onedal/linear_model/tests/test_incremental_ridge_regression.py +171 -0
  108. onedal/linear_model/tests/test_linear_regression.py +259 -0
  109. onedal/linear_model/tests/test_logistic_regression.py +95 -0
  110. onedal/linear_model/tests/test_ridge.py +95 -0
  111. onedal/neighbors/__init__.py +19 -0
  112. onedal/neighbors/neighbors.py +763 -0
  113. onedal/neighbors/tests/test_knn_classification.py +49 -0
  114. onedal/primitives/__init__.py +27 -0
  115. onedal/primitives/get_tree.py +25 -0
  116. onedal/primitives/kernel_functions.py +152 -0
  117. onedal/primitives/tests/test_kernel_functions.py +159 -0
  118. onedal/spmd/__init__.py +25 -0
  119. onedal/spmd/_base.py +30 -0
  120. onedal/spmd/basic_statistics/__init__.py +20 -0
  121. onedal/spmd/basic_statistics/basic_statistics.py +30 -0
  122. onedal/spmd/basic_statistics/incremental_basic_statistics.py +71 -0
  123. onedal/spmd/cluster/__init__.py +28 -0
  124. onedal/spmd/cluster/dbscan.py +23 -0
  125. onedal/spmd/cluster/kmeans.py +56 -0
  126. onedal/spmd/covariance/__init__.py +20 -0
  127. onedal/spmd/covariance/covariance.py +26 -0
  128. onedal/spmd/covariance/incremental_covariance.py +83 -0
  129. onedal/spmd/decomposition/__init__.py +20 -0
  130. onedal/spmd/decomposition/incremental_pca.py +124 -0
  131. onedal/spmd/decomposition/pca.py +26 -0
  132. onedal/spmd/ensemble/__init__.py +19 -0
  133. onedal/spmd/ensemble/forest.py +28 -0
  134. onedal/spmd/linear_model/__init__.py +21 -0
  135. onedal/spmd/linear_model/incremental_linear_model.py +101 -0
  136. onedal/spmd/linear_model/linear_model.py +30 -0
  137. onedal/spmd/linear_model/logistic_regression.py +38 -0
  138. onedal/spmd/neighbors/__init__.py +19 -0
  139. onedal/spmd/neighbors/neighbors.py +75 -0
  140. onedal/svm/__init__.py +19 -0
  141. onedal/svm/svm.py +556 -0
  142. onedal/svm/tests/test_csr_svm.py +351 -0
  143. onedal/svm/tests/test_nusvc.py +204 -0
  144. onedal/svm/tests/test_nusvr.py +210 -0
  145. onedal/svm/tests/test_svc.py +176 -0
  146. onedal/svm/tests/test_svr.py +243 -0
  147. onedal/tests/test_common.py +57 -0
  148. onedal/tests/utils/_dataframes_support.py +162 -0
  149. onedal/tests/utils/_device_selection.py +102 -0
  150. onedal/utils/__init__.py +49 -0
  151. onedal/utils/_array_api.py +81 -0
  152. onedal/utils/_dpep_helpers.py +56 -0
  153. onedal/utils/tests/test_validation.py +142 -0
  154. onedal/utils/validation.py +464 -0
  155. scikit_learn_intelex-2025.4.0.dist-info/LICENSE.txt +202 -0
  156. scikit_learn_intelex-2025.4.0.dist-info/METADATA +190 -0
  157. scikit_learn_intelex-2025.4.0.dist-info/RECORD +282 -0
  158. scikit_learn_intelex-2025.4.0.dist-info/WHEEL +5 -0
  159. scikit_learn_intelex-2025.4.0.dist-info/top_level.txt +3 -0
  160. sklearnex/__init__.py +66 -0
  161. sklearnex/__main__.py +58 -0
  162. sklearnex/_config.py +116 -0
  163. sklearnex/_device_offload.py +126 -0
  164. sklearnex/_utils.py +177 -0
  165. sklearnex/basic_statistics/__init__.py +20 -0
  166. sklearnex/basic_statistics/basic_statistics.py +261 -0
  167. sklearnex/basic_statistics/incremental_basic_statistics.py +352 -0
  168. sklearnex/basic_statistics/tests/test_basic_statistics.py +405 -0
  169. sklearnex/basic_statistics/tests/test_incremental_basic_statistics.py +455 -0
  170. sklearnex/cluster/__init__.py +20 -0
  171. sklearnex/cluster/dbscan.py +197 -0
  172. sklearnex/cluster/k_means.py +397 -0
  173. sklearnex/cluster/tests/test_dbscan.py +38 -0
  174. sklearnex/cluster/tests/test_kmeans.py +157 -0
  175. sklearnex/conftest.py +82 -0
  176. sklearnex/covariance/__init__.py +19 -0
  177. sklearnex/covariance/incremental_covariance.py +405 -0
  178. sklearnex/covariance/tests/test_incremental_covariance.py +287 -0
  179. sklearnex/decomposition/__init__.py +19 -0
  180. sklearnex/decomposition/pca.py +427 -0
  181. sklearnex/decomposition/tests/test_pca.py +58 -0
  182. sklearnex/dispatcher.py +534 -0
  183. sklearnex/doc/third-party-programs.txt +424 -0
  184. sklearnex/ensemble/__init__.py +29 -0
  185. sklearnex/ensemble/_forest.py +2029 -0
  186. sklearnex/ensemble/tests/test_forest.py +140 -0
  187. sklearnex/glob/__main__.py +72 -0
  188. sklearnex/glob/dispatcher.py +101 -0
  189. sklearnex/linear_model/__init__.py +32 -0
  190. sklearnex/linear_model/coordinate_descent.py +30 -0
  191. sklearnex/linear_model/incremental_linear.py +495 -0
  192. sklearnex/linear_model/incremental_ridge.py +432 -0
  193. sklearnex/linear_model/linear.py +346 -0
  194. sklearnex/linear_model/logistic_regression.py +415 -0
  195. sklearnex/linear_model/ridge.py +390 -0
  196. sklearnex/linear_model/tests/test_incremental_linear.py +267 -0
  197. sklearnex/linear_model/tests/test_incremental_ridge.py +214 -0
  198. sklearnex/linear_model/tests/test_linear.py +142 -0
  199. sklearnex/linear_model/tests/test_logreg.py +134 -0
  200. sklearnex/linear_model/tests/test_ridge.py +256 -0
  201. sklearnex/manifold/__init__.py +19 -0
  202. sklearnex/manifold/t_sne.py +26 -0
  203. sklearnex/manifold/tests/test_tsne.py +250 -0
  204. sklearnex/metrics/__init__.py +23 -0
  205. sklearnex/metrics/pairwise.py +22 -0
  206. sklearnex/metrics/ranking.py +20 -0
  207. sklearnex/metrics/tests/test_metrics.py +39 -0
  208. sklearnex/model_selection/__init__.py +21 -0
  209. sklearnex/model_selection/split.py +22 -0
  210. sklearnex/model_selection/tests/test_model_selection.py +34 -0
  211. sklearnex/neighbors/__init__.py +27 -0
  212. sklearnex/neighbors/_lof.py +236 -0
  213. sklearnex/neighbors/common.py +310 -0
  214. sklearnex/neighbors/knn_classification.py +231 -0
  215. sklearnex/neighbors/knn_regression.py +207 -0
  216. sklearnex/neighbors/knn_unsupervised.py +178 -0
  217. sklearnex/neighbors/tests/test_neighbors.py +82 -0
  218. sklearnex/preview/__init__.py +17 -0
  219. sklearnex/preview/covariance/__init__.py +19 -0
  220. sklearnex/preview/covariance/covariance.py +142 -0
  221. sklearnex/preview/covariance/tests/test_covariance.py +66 -0
  222. sklearnex/preview/decomposition/__init__.py +19 -0
  223. sklearnex/preview/decomposition/incremental_pca.py +244 -0
  224. sklearnex/preview/decomposition/tests/test_incremental_pca.py +336 -0
  225. sklearnex/spmd/__init__.py +25 -0
  226. sklearnex/spmd/basic_statistics/__init__.py +20 -0
  227. sklearnex/spmd/basic_statistics/basic_statistics.py +21 -0
  228. sklearnex/spmd/basic_statistics/incremental_basic_statistics.py +30 -0
  229. sklearnex/spmd/basic_statistics/tests/test_basic_statistics_spmd.py +107 -0
  230. sklearnex/spmd/basic_statistics/tests/test_incremental_basic_statistics_spmd.py +306 -0
  231. sklearnex/spmd/cluster/__init__.py +30 -0
  232. sklearnex/spmd/cluster/dbscan.py +50 -0
  233. sklearnex/spmd/cluster/kmeans.py +21 -0
  234. sklearnex/spmd/cluster/tests/test_dbscan_spmd.py +97 -0
  235. sklearnex/spmd/cluster/tests/test_kmeans_spmd.py +173 -0
  236. sklearnex/spmd/covariance/__init__.py +20 -0
  237. sklearnex/spmd/covariance/covariance.py +21 -0
  238. sklearnex/spmd/covariance/incremental_covariance.py +37 -0
  239. sklearnex/spmd/covariance/tests/test_covariance_spmd.py +107 -0
  240. sklearnex/spmd/covariance/tests/test_incremental_covariance_spmd.py +184 -0
  241. sklearnex/spmd/decomposition/__init__.py +20 -0
  242. sklearnex/spmd/decomposition/incremental_pca.py +30 -0
  243. sklearnex/spmd/decomposition/pca.py +21 -0
  244. sklearnex/spmd/decomposition/tests/test_incremental_pca_spmd.py +269 -0
  245. sklearnex/spmd/decomposition/tests/test_pca_spmd.py +128 -0
  246. sklearnex/spmd/ensemble/__init__.py +19 -0
  247. sklearnex/spmd/ensemble/forest.py +71 -0
  248. sklearnex/spmd/ensemble/tests/test_forest_spmd.py +265 -0
  249. sklearnex/spmd/linear_model/__init__.py +21 -0
  250. sklearnex/spmd/linear_model/incremental_linear_model.py +35 -0
  251. sklearnex/spmd/linear_model/linear_model.py +21 -0
  252. sklearnex/spmd/linear_model/logistic_regression.py +21 -0
  253. sklearnex/spmd/linear_model/tests/test_incremental_linear_spmd.py +331 -0
  254. sklearnex/spmd/linear_model/tests/test_linear_regression_spmd.py +145 -0
  255. sklearnex/spmd/linear_model/tests/test_logistic_regression_spmd.py +162 -0
  256. sklearnex/spmd/neighbors/__init__.py +19 -0
  257. sklearnex/spmd/neighbors/neighbors.py +25 -0
  258. sklearnex/spmd/neighbors/tests/test_neighbors_spmd.py +288 -0
  259. sklearnex/svm/__init__.py +29 -0
  260. sklearnex/svm/_common.py +339 -0
  261. sklearnex/svm/nusvc.py +371 -0
  262. sklearnex/svm/nusvr.py +170 -0
  263. sklearnex/svm/svc.py +399 -0
  264. sklearnex/svm/svr.py +167 -0
  265. sklearnex/svm/tests/test_svm.py +93 -0
  266. sklearnex/tests/test_common.py +491 -0
  267. sklearnex/tests/test_config.py +123 -0
  268. sklearnex/tests/test_hyperparameters.py +43 -0
  269. sklearnex/tests/test_memory_usage.py +347 -0
  270. sklearnex/tests/test_monkeypatch.py +269 -0
  271. sklearnex/tests/test_n_jobs_support.py +108 -0
  272. sklearnex/tests/test_parallel.py +48 -0
  273. sklearnex/tests/test_patching.py +377 -0
  274. sklearnex/tests/test_run_to_run_stability.py +326 -0
  275. sklearnex/tests/utils/__init__.py +48 -0
  276. sklearnex/tests/utils/base.py +436 -0
  277. sklearnex/tests/utils/spmd.py +198 -0
  278. sklearnex/utils/__init__.py +19 -0
  279. sklearnex/utils/_array_api.py +82 -0
  280. sklearnex/utils/parallel.py +59 -0
  281. sklearnex/utils/tests/test_validation.py +238 -0
  282. sklearnex/utils/validation.py +208 -0
@@ -0,0 +1,475 @@
1
+ # ==============================================================================
2
+ # Copyright 2021 Intel Corporation
3
+ #
4
+ # Licensed under the Apache License, Version 2.0 (the "License");
5
+ # you may not use this file except in compliance with the License.
6
+ # You may obtain a copy of the License at
7
+ #
8
+ # http://www.apache.org/licenses/LICENSE-2.0
9
+ #
10
+ # Unless required by applicable law or agreed to in writing, software
11
+ # distributed under the License is distributed on an "AS IS" BASIS,
12
+ # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13
+ # See the License for the specific language governing permissions and
14
+ # limitations under the License.
15
+ # ==============================================================================
16
+
17
+ import numpy as np
18
+ import pytest
19
+ import scipy.sparse as sp
20
+ from numpy.testing import assert_allclose
21
+
22
+ from onedal import _backend, _is_dpc_backend
23
+ from onedal.datatypes import from_table, to_table
24
+ from onedal.utils._dpep_helpers import dpctl_available
25
+
26
+ if dpctl_available:
27
+ from onedal.datatypes.tests.common import (
28
+ _assert_sua_iface_fields,
29
+ _assert_tensor_attr,
30
+ )
31
+
32
+ from onedal.primitives import linear_kernel
33
+ from onedal.tests.utils._dataframes_support import (
34
+ _convert_to_dataframe,
35
+ get_dataframes_and_queues,
36
+ )
37
+ from onedal.tests.utils._device_selection import get_queues
38
+ from onedal.utils._array_api import _get_sycl_namespace
39
+
40
+ data_shapes = [
41
+ pytest.param((1000, 100), id="(1000, 100)"), # 2-D array
42
+ pytest.param((2000, 50), id="(2000, 50)"), # 2-D array
43
+ pytest.param((50, 1), id="(50, 1)"), # 2-D array
44
+ pytest.param((1, 50), id="(1, 50)"), # 2-D array
45
+ pytest.param((50,), id="(50,)"), # 1-D array
46
+ ]
47
+
48
+ unsupported_data_shapes = [
49
+ pytest.param((2, 3, 4), id="(2, 3, 4)"),
50
+ pytest.param((2, 3, 4, 5), id="(2, 3, 4, 5)"),
51
+ ]
52
+
53
+ ORDER_DICT = {"F": np.asfortranarray, "C": np.ascontiguousarray}
54
+
55
+
56
+ if _is_dpc_backend:
57
+ from daal4py.sklearn._utils import get_dtype
58
+ from onedal.cluster.dbscan import BaseDBSCAN
59
+ from onedal.common._policy import _get_policy
60
+
61
+ class DummyEstimatorWithTableConversions:
62
+
63
+ def fit(self, X, y=None):
64
+ sua_iface, xp, _ = _get_sycl_namespace(X)
65
+ policy = _get_policy(X.sycl_queue, None)
66
+ bs_DBSCAN = BaseDBSCAN()
67
+ types = [xp.float32, xp.float64]
68
+ if get_dtype(X) not in types:
69
+ X = xp.astype(X, dtype=xp.float64)
70
+ dtype = get_dtype(X)
71
+ params = bs_DBSCAN._get_onedal_params(dtype)
72
+ X_table = to_table(X)
73
+ # TODO:
74
+ # check other candidates for the dummy base oneDAL func.
75
+ # oneDAL backend func is needed to check result table checks.
76
+ result = _backend.dbscan.clustering.compute(
77
+ policy, params, X_table, to_table(None)
78
+ )
79
+ result_responses_table = result.responses
80
+ result_responses_df = from_table(
81
+ result_responses_table,
82
+ sua_iface=sua_iface,
83
+ sycl_queue=X.sycl_queue,
84
+ xp=xp,
85
+ )
86
+ return X_table, result_responses_table, result_responses_df
87
+
88
+ else:
89
+
90
+ class DummyEstimatorWithTableConversions:
91
+ pass
92
+
93
+
94
+ def _test_input_format_c_contiguous_numpy(queue, dtype):
95
+ rng = np.random.RandomState(0)
96
+ x_default = np.array(5 * rng.random_sample((10, 4)), dtype=dtype)
97
+
98
+ x_numpy = np.asanyarray(x_default, dtype=dtype, order="C")
99
+ assert x_numpy.flags.c_contiguous
100
+ assert not x_numpy.flags.f_contiguous
101
+ assert not x_numpy.flags.fnc
102
+
103
+ expected = linear_kernel(x_default, queue=queue)
104
+ result = linear_kernel(x_numpy, queue=queue)
105
+ assert_allclose(expected, result)
106
+
107
+
108
+ @pytest.mark.parametrize("queue", get_queues())
109
+ @pytest.mark.parametrize("dtype", [np.float32, np.float64])
110
+ def test_input_format_c_contiguous_numpy(queue, dtype):
111
+ _test_input_format_c_contiguous_numpy(queue, dtype)
112
+
113
+
114
+ def _test_input_format_f_contiguous_numpy(queue, dtype):
115
+ rng = np.random.RandomState(0)
116
+ x_default = np.array(5 * rng.random_sample((10, 4)), dtype=dtype)
117
+
118
+ x_numpy = np.asanyarray(x_default, dtype=dtype, order="F")
119
+ assert not x_numpy.flags.c_contiguous
120
+ assert x_numpy.flags.f_contiguous
121
+ assert x_numpy.flags.fnc
122
+
123
+ expected = linear_kernel(x_default, queue=queue)
124
+ result = linear_kernel(x_numpy, queue=queue)
125
+ assert_allclose(expected, result)
126
+
127
+
128
+ @pytest.mark.parametrize("queue", get_queues())
129
+ @pytest.mark.parametrize("dtype", [np.float32, np.float64])
130
+ def test_input_format_f_contiguous_numpy(queue, dtype):
131
+ _test_input_format_f_contiguous_numpy(queue, dtype)
132
+
133
+
134
+ def _test_input_format_c_not_contiguous_numpy(queue, dtype):
135
+ rng = np.random.RandomState(0)
136
+ x_default = np.array(5 * rng.random_sample((10, 4)), dtype=dtype)
137
+
138
+ dummy_data = np.insert(x_default, range(1, x_default.shape[1]), 8, axis=1)
139
+ x_numpy = dummy_data[:, ::2]
140
+
141
+ assert_allclose(x_numpy, x_default)
142
+
143
+ assert not x_numpy.flags.c_contiguous
144
+ assert not x_numpy.flags.f_contiguous
145
+ assert not x_numpy.flags.fnc
146
+
147
+ expected = linear_kernel(x_default, queue=queue)
148
+ result = linear_kernel(x_numpy, queue=queue)
149
+ assert_allclose(expected, result)
150
+
151
+
152
+ @pytest.mark.parametrize("queue", get_queues())
153
+ @pytest.mark.parametrize("dtype", [np.float32, np.float64])
154
+ def test_input_format_c_not_contiguous_numpy(queue, dtype):
155
+ _test_input_format_c_not_contiguous_numpy(queue, dtype)
156
+
157
+
158
+ def _test_input_format_c_contiguous_pandas(queue, dtype):
159
+ pd = pytest.importorskip("pandas")
160
+ rng = np.random.RandomState(0)
161
+ x_default = np.array(5 * rng.random_sample((10, 4)), dtype=dtype)
162
+
163
+ x_numpy = np.asanyarray(x_default, dtype=dtype, order="C")
164
+ assert x_numpy.flags.c_contiguous
165
+ assert not x_numpy.flags.f_contiguous
166
+ assert not x_numpy.flags.fnc
167
+ x_df = pd.DataFrame(x_numpy)
168
+
169
+ expected = linear_kernel(x_df, queue=queue)
170
+ result = linear_kernel(x_numpy, queue=queue)
171
+ assert_allclose(expected, result)
172
+
173
+
174
+ @pytest.mark.parametrize("queue", get_queues())
175
+ @pytest.mark.parametrize("dtype", [np.float32, np.float64])
176
+ def test_input_format_c_contiguous_pandas(queue, dtype):
177
+ _test_input_format_c_contiguous_pandas(queue, dtype)
178
+
179
+
180
+ def _test_input_format_f_contiguous_pandas(queue, dtype):
181
+ pd = pytest.importorskip("pandas")
182
+ rng = np.random.RandomState(0)
183
+ x_default = np.array(5 * rng.random_sample((10, 4)), dtype=dtype)
184
+
185
+ x_numpy = np.asanyarray(x_default, dtype=dtype, order="F")
186
+ assert not x_numpy.flags.c_contiguous
187
+ assert x_numpy.flags.f_contiguous
188
+ assert x_numpy.flags.fnc
189
+ x_df = pd.DataFrame(x_numpy)
190
+
191
+ expected = linear_kernel(x_df, queue=queue)
192
+ result = linear_kernel(x_numpy, queue=queue)
193
+ assert_allclose(expected, result)
194
+
195
+
196
+ @pytest.mark.parametrize("queue", get_queues())
197
+ @pytest.mark.parametrize("dtype", [np.float32, np.float64])
198
+ def test_input_format_f_contiguous_pandas(queue, dtype):
199
+ _test_input_format_f_contiguous_pandas(queue, dtype)
200
+
201
+
202
+ def _test_conversion_to_table(dtype):
203
+ np.random.seed()
204
+ if dtype in [np.int32, np.int64]:
205
+ x = np.random.randint(0, 10, (15, 3), dtype=dtype)
206
+ else:
207
+ x = np.random.uniform(-2, 2, (18, 6)).astype(dtype)
208
+ x_table = to_table(x)
209
+ x2 = from_table(x_table)
210
+ assert x.dtype == x2.dtype
211
+ assert np.array_equal(x, x2)
212
+
213
+
214
+ @pytest.mark.parametrize("dtype", [np.int32, np.int64, np.float32, np.float64])
215
+ def test_conversion_to_table(dtype):
216
+ _test_conversion_to_table(dtype)
217
+
218
+
219
+ @pytest.mark.skipif(
220
+ not dpctl_available,
221
+ reason="dpctl is required for checks.",
222
+ )
223
+ @pytest.mark.skipif(
224
+ not _is_dpc_backend,
225
+ reason="__sycl_usm_array_interface__ support requires DPC backend.",
226
+ )
227
+ @pytest.mark.parametrize(
228
+ "dataframe,queue", get_dataframes_and_queues("dpctl,dpnp", "cpu,gpu")
229
+ )
230
+ @pytest.mark.parametrize("order", ["C", "F"])
231
+ @pytest.mark.parametrize("dtype", [np.float32, np.float64, np.int32, np.int64])
232
+ def test_input_sua_iface_zero_copy(dataframe, queue, order, dtype):
233
+ """Checking that values ​​representing USM allocations `__sycl_usm_array_interface__`
234
+ are preserved during conversion to onedal table.
235
+ """
236
+ rng = np.random.RandomState(0)
237
+ X_np = np.array(5 * rng.random_sample((10, 59)), dtype=dtype)
238
+
239
+ X_np = np.asanyarray(X_np, dtype=dtype, order=order)
240
+
241
+ X_dp = _convert_to_dataframe(X_np, sycl_queue=queue, target_df=dataframe)
242
+
243
+ sua_iface, X_dp_namespace, _ = _get_sycl_namespace(X_dp)
244
+
245
+ X_table = to_table(X_dp)
246
+ _assert_sua_iface_fields(X_dp, X_table)
247
+
248
+ X_dp_from_table = from_table(
249
+ X_table, sycl_queue=queue, sua_iface=sua_iface, xp=X_dp_namespace
250
+ )
251
+ _assert_sua_iface_fields(X_table, X_dp_from_table)
252
+ _assert_tensor_attr(X_dp, X_dp_from_table, order)
253
+
254
+
255
+ @pytest.mark.skipif(
256
+ not dpctl_available,
257
+ reason="dpctl is required for checks.",
258
+ )
259
+ @pytest.mark.skipif(
260
+ not _is_dpc_backend,
261
+ reason="__sycl_usm_array_interface__ support requires DPC backend.",
262
+ )
263
+ @pytest.mark.parametrize(
264
+ "dataframe,queue", get_dataframes_and_queues("dpctl,dpnp", "cpu,gpu")
265
+ )
266
+ @pytest.mark.parametrize("order", ["F", "C"])
267
+ @pytest.mark.parametrize("data_shape", data_shapes)
268
+ @pytest.mark.parametrize("dtype", [np.float32, np.float64])
269
+ def test_table_conversions(dataframe, queue, order, data_shape, dtype):
270
+ """Checking that values ​​representing USM allocations `__sycl_usm_array_interface__`
271
+ are preserved during conversion to onedal table and from onedal table to
272
+ sycl usm array dataformat.
273
+ """
274
+ rng = np.random.RandomState(0)
275
+ X = np.array(5 * rng.random_sample(data_shape), dtype=dtype)
276
+
277
+ X = ORDER_DICT[order](X)
278
+
279
+ X = _convert_to_dataframe(X, sycl_queue=queue, target_df=dataframe)
280
+ alg = DummyEstimatorWithTableConversions()
281
+ X_table, result_responses_table, result_responses_df = alg.fit(X)
282
+
283
+ for obj in [X_table, result_responses_table, result_responses_df, X]:
284
+ assert hasattr(obj, "__sycl_usm_array_interface__"), f"{obj} has no SUA interface"
285
+ _assert_sua_iface_fields(X, X_table)
286
+
287
+ # Work around for saving compute-follows-data execution
288
+ # for CPU sycl context requires cause additional memory
289
+ # allocation using the same queue.
290
+ skip_data_0 = True if queue.sycl_device.is_cpu else False
291
+ # Onedal return table's syclobj is empty for CPU inputs.
292
+ skip_syclobj = True if queue.sycl_device.is_cpu else False
293
+ # TODO:
294
+ # investigate why __sycl_usm_array_interface__["data"][1] is changed
295
+ # after conversion from onedal table to sua array.
296
+ # Test is not turned off because of this. Only check is skipped.
297
+ skip_data_1 = True
298
+ _assert_sua_iface_fields(
299
+ result_responses_df,
300
+ result_responses_table,
301
+ skip_data_0=skip_data_0,
302
+ skip_data_1=skip_data_1,
303
+ skip_syclobj=skip_syclobj,
304
+ )
305
+ assert X.sycl_queue == result_responses_df.sycl_queue
306
+ if order == "F":
307
+ assert X.flags.f_contiguous == result_responses_df.flags.f_contiguous
308
+ else:
309
+ assert X.flags.c_contiguous == result_responses_df.flags.c_contiguous
310
+ # 1D output expected to have the same c_contiguous and f_contiguous flag values.
311
+ assert (
312
+ result_responses_df.flags.c_contiguous == result_responses_df.flags.f_contiguous
313
+ )
314
+
315
+
316
+ @pytest.mark.skipif(
317
+ not _is_dpc_backend,
318
+ reason="__sycl_usm_array_interface__ support requires DPC backend.",
319
+ )
320
+ @pytest.mark.parametrize(
321
+ "dataframe,queue", get_dataframes_and_queues("dpctl,dpnp", "cpu,gpu")
322
+ )
323
+ @pytest.mark.parametrize("data_shape", unsupported_data_shapes)
324
+ def test_sua_iface_interop_invalid_shape(dataframe, queue, data_shape):
325
+ X = np.zeros(data_shape)
326
+ X = _convert_to_dataframe(X, sycl_queue=queue, target_df=dataframe)
327
+ sua_iface, _, _ = _get_sycl_namespace(X)
328
+
329
+ expected_err_msg = (
330
+ "Unable to convert from SUA interface: only 1D & 2D tensors are allowed"
331
+ )
332
+ with pytest.raises(ValueError, match=expected_err_msg):
333
+ to_table(X)
334
+
335
+
336
+ @pytest.mark.skipif(
337
+ not _is_dpc_backend,
338
+ reason="__sycl_usm_array_interface__ support requires DPC backend.",
339
+ )
340
+ @pytest.mark.parametrize(
341
+ "dataframe,queue", get_dataframes_and_queues("dpctl,dpnp", "cpu,gpu")
342
+ )
343
+ @pytest.mark.parametrize(
344
+ "dtype",
345
+ [
346
+ pytest.param(np.uint16, id=np.dtype(np.uint16).name),
347
+ pytest.param(np.uint32, id=np.dtype(np.uint32).name),
348
+ pytest.param(np.uint64, id=np.dtype(np.uint64).name),
349
+ ],
350
+ )
351
+ def test_sua_iface_interop_unsupported_dtypes(dataframe, queue, dtype):
352
+ # sua iface interobility supported only for oneDAL supported dtypes
353
+ # for input data: int32, int64, float32, float64.
354
+ # Checking some common dtypes supported by dpctl, dpnp for exception
355
+ # raise.
356
+ X = np.zeros((10, 20), dtype=dtype)
357
+ X = _convert_to_dataframe(X, sycl_queue=queue, target_df=dataframe)
358
+ sua_iface, _, _ = _get_sycl_namespace(X)
359
+
360
+ expected_err_msg = "Unable to convert from SUA interface: unknown data type"
361
+ with pytest.raises(ValueError, match=expected_err_msg):
362
+ to_table(X)
363
+
364
+
365
+ @pytest.mark.parametrize(
366
+ "dataframe,queue", get_dataframes_and_queues("numpy,dpctl,dpnp", "cpu,gpu")
367
+ )
368
+ def test_to_table_non_contiguous_input(dataframe, queue):
369
+ if dataframe in "dpnp,dpctl" and not _is_dpc_backend:
370
+ pytest.skip("__sycl_usm_array_interface__ support requires DPC backend.")
371
+ X, _ = np.mgrid[:10, :10]
372
+ X = _convert_to_dataframe(X, sycl_queue=queue, target_df=dataframe)
373
+ X = X[:, :3]
374
+ sua_iface, _, _ = _get_sycl_namespace(X)
375
+ # X expected to be non-contiguous.
376
+ assert not X.flags.c_contiguous and not X.flags.f_contiguous
377
+ X_t = to_table(X)
378
+ assert X_t and X_t.shape == (10, 3) and X_t.has_data
379
+
380
+
381
+ @pytest.mark.skipif(
382
+ _is_dpc_backend,
383
+ reason="Required check should be done if no DPC backend.",
384
+ )
385
+ @pytest.mark.parametrize(
386
+ "dataframe,queue", get_dataframes_and_queues("dpctl,dpnp", "cpu,gpu")
387
+ )
388
+ @pytest.mark.parametrize("dtype", [np.float32, np.float64])
389
+ def test_sua_iface_interop_if_no_dpc_backend(dataframe, queue, dtype):
390
+ X = np.zeros((10, 20), dtype=dtype)
391
+ X = _convert_to_dataframe(X, sycl_queue=queue, target_df=dataframe)
392
+ sua_iface, _, _ = _get_sycl_namespace(X)
393
+
394
+ expected_err_msg = "SYCL usm array conversion to table requires the DPC backend"
395
+ with pytest.raises(RuntimeError, match=expected_err_msg):
396
+ to_table(X)
397
+
398
+
399
+ @pytest.mark.skipif(
400
+ not _is_dpc_backend, reason="Requires DPC backend for dtype conversion"
401
+ )
402
+ @pytest.mark.parametrize("dtype", [np.float32, np.float64])
403
+ @pytest.mark.parametrize("sparse", [True, False])
404
+ def test_low_precision_gpu_conversion(dtype, sparse):
405
+ # Use a dummy queue as fp32 hardware is not in public testing
406
+
407
+ class DummySyclQueue:
408
+ """This class is designed to act like dpctl.SyclQueue
409
+ to force dtype conversion"""
410
+
411
+ class DummySyclDevice:
412
+ has_aspect_fp64 = False
413
+
414
+ sycl_device = DummySyclDevice()
415
+
416
+ queue = DummySyclQueue()
417
+
418
+ if sparse:
419
+ X = sp.random(100, 100, format="csr", dtype=dtype)
420
+ else:
421
+ X = np.random.rand(100, 100).astype(dtype)
422
+
423
+ if dtype == np.float64:
424
+ with pytest.warns(
425
+ RuntimeWarning,
426
+ match="Data will be converted into float32 from float64 because device does not support it",
427
+ ):
428
+ X_table = to_table(X, queue=queue)
429
+ else:
430
+ X_table = to_table(X, queue=queue)
431
+
432
+ assert X_table.dtype == np.float32
433
+ if dtype == np.float32 and not sparse:
434
+ assert_allclose(X, from_table(X_table))
435
+
436
+
437
+ @pytest.mark.parametrize("X", [None, 5, "test", True, [], np.pi, lambda: None])
438
+ @pytest.mark.parametrize("queue", get_queues())
439
+ def test_non_array(X, queue):
440
+ # Verify that to and from table doesn't raise errors
441
+ # no guarantee is made about type or content
442
+ err_str = ""
443
+
444
+ if np.isscalar(X):
445
+ if np.atleast_2d(X).dtype not in [np.float64, np.float32, np.int64, np.int32]:
446
+ err_str = "Found unsupported array type"
447
+ elif not (X is None or isinstance(X, np.ndarray)):
448
+ err_str = r"\[convert_to_table\] Not available input format for convert Python object to onedal table."
449
+
450
+ if err_str:
451
+ with pytest.raises(ValueError, match=err_str):
452
+ to_table(X)
453
+ else:
454
+ X_table = to_table(X, queue=queue)
455
+ from_table(X_table)
456
+
457
+
458
+ @pytest.mark.skipif(
459
+ not _is_dpc_backend, reason="Requires DPC backend for dtype conversion"
460
+ )
461
+ @pytest.mark.parametrize("X", [None, 5, "test", True, [], np.pi, lambda: None])
462
+ def test_low_precision_non_array(X):
463
+ # Use a dummy queue as fp32 hardware is not in public testing
464
+
465
+ class DummySyclQueue:
466
+ """This class is designed to act like dpctl.SyclQueue
467
+ to force dtype conversion"""
468
+
469
+ class DummySyclDevice:
470
+ has_aspect_fp64 = False
471
+
472
+ sycl_device = DummySyclDevice()
473
+
474
+ queue = DummySyclQueue()
475
+ test_non_array(X, queue)
@@ -0,0 +1,20 @@
1
+ # ==============================================================================
2
+ # Copyright 2023 Intel Corporation
3
+ #
4
+ # Licensed under the Apache License, Version 2.0 (the "License");
5
+ # you may not use this file except in compliance with the License.
6
+ # You may obtain a copy of the License at
7
+ #
8
+ # http://www.apache.org/licenses/LICENSE-2.0
9
+ #
10
+ # Unless required by applicable law or agreed to in writing, software
11
+ # distributed under the License is distributed on an "AS IS" BASIS,
12
+ # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13
+ # See the License for the specific language governing permissions and
14
+ # limitations under the License.
15
+ # ==============================================================================
16
+
17
+ from .incremental_pca import IncrementalPCA
18
+ from .pca import PCA
19
+
20
+ __all__ = ["IncrementalPCA", "PCA"]