scikit-learn-intelex 2024.4.0__py39-none-win_amd64.whl → 2024.6.0__py39-none-win_amd64.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 (113) hide show
  1. {scikit_learn_intelex-2024.4.0.data → scikit_learn_intelex-2024.6.0.data}/data/Lib/site-packages/sklearnex/_device_offload.py +8 -1
  2. {scikit_learn_intelex-2024.4.0.data → scikit_learn_intelex-2024.6.0.data}/data/Lib/site-packages/sklearnex/basic_statistics/tests/test_incremental_basic_statistics.py +2 -4
  3. {scikit_learn_intelex-2024.4.0.data → scikit_learn_intelex-2024.6.0.data}/data/Lib/site-packages/sklearnex/cluster/dbscan.py +3 -0
  4. {scikit_learn_intelex-2024.4.0.data → scikit_learn_intelex-2024.6.0.data}/data/Lib/site-packages/sklearnex/cluster/tests/test_dbscan.py +8 -6
  5. {scikit_learn_intelex-2024.4.0.data → scikit_learn_intelex-2024.6.0.data}/data/Lib/site-packages/sklearnex/conftest.py +11 -1
  6. scikit_learn_intelex-2024.6.0.data/data/Lib/site-packages/sklearnex/covariance/incremental_covariance.py +317 -0
  7. {scikit_learn_intelex-2024.4.0.data → scikit_learn_intelex-2024.6.0.data}/data/Lib/site-packages/sklearnex/covariance/tests/test_incremental_covariance.py +54 -17
  8. {scikit_learn_intelex-2024.4.0.data → scikit_learn_intelex-2024.6.0.data}/data/Lib/site-packages/sklearnex/decomposition/pca.py +68 -13
  9. {scikit_learn_intelex-2024.4.0.data → scikit_learn_intelex-2024.6.0.data}/data/Lib/site-packages/sklearnex/decomposition/tests/test_pca.py +6 -4
  10. {scikit_learn_intelex-2024.4.0.data → scikit_learn_intelex-2024.6.0.data}/data/Lib/site-packages/sklearnex/dispatcher.py +46 -1
  11. {scikit_learn_intelex-2024.4.0.data → scikit_learn_intelex-2024.6.0.data}/data/Lib/site-packages/sklearnex/ensemble/_forest.py +114 -22
  12. {scikit_learn_intelex-2024.4.0.data → scikit_learn_intelex-2024.6.0.data}/data/Lib/site-packages/sklearnex/ensemble/tests/test_forest.py +13 -3
  13. {scikit_learn_intelex-2024.4.0.data → scikit_learn_intelex-2024.6.0.data}/data/Lib/site-packages/sklearnex/glob/dispatcher.py +16 -2
  14. {scikit_learn_intelex-2024.4.0.data → scikit_learn_intelex-2024.6.0.data}/data/Lib/site-packages/sklearnex/linear_model/__init__.py +5 -3
  15. scikit_learn_intelex-2024.6.0.data/data/Lib/site-packages/sklearnex/linear_model/incremental_linear.py +464 -0
  16. {scikit_learn_intelex-2024.4.0.data → scikit_learn_intelex-2024.6.0.data}/data/Lib/site-packages/sklearnex/linear_model/linear.py +27 -9
  17. {scikit_learn_intelex-2024.4.0.data → scikit_learn_intelex-2024.6.0.data}/data/Lib/site-packages/sklearnex/linear_model/logistic_regression.py +13 -15
  18. scikit_learn_intelex-2024.6.0.data/data/Lib/site-packages/sklearnex/linear_model/tests/test_incremental_linear.py +200 -0
  19. {scikit_learn_intelex-2024.4.0.data → scikit_learn_intelex-2024.6.0.data}/data/Lib/site-packages/sklearnex/linear_model/tests/test_linear.py +2 -2
  20. {scikit_learn_intelex-2024.4.0.data → scikit_learn_intelex-2024.6.0.data}/data/Lib/site-packages/sklearnex/neighbors/knn_regression.py +24 -0
  21. {scikit_learn_intelex-2024.4.0.data → scikit_learn_intelex-2024.6.0.data}/data/Lib/site-packages/sklearnex/neighbors/tests/test_neighbors.py +2 -2
  22. {scikit_learn_intelex-2024.4.0.data → scikit_learn_intelex-2024.6.0.data}/data/Lib/site-packages/sklearnex/preview/__init__.py +1 -1
  23. scikit_learn_intelex-2024.6.0.data/data/Lib/site-packages/sklearnex/preview/decomposition/__init__.py +19 -0
  24. scikit_learn_intelex-2024.6.0.data/data/Lib/site-packages/sklearnex/preview/decomposition/incremental_pca.py +228 -0
  25. scikit_learn_intelex-2024.6.0.data/data/Lib/site-packages/sklearnex/preview/decomposition/tests/test_incremental_pca.py +266 -0
  26. scikit_learn_intelex-2024.6.0.data/data/Lib/site-packages/sklearnex/svm/_common.py +330 -0
  27. {scikit_learn_intelex-2024.4.0.data → scikit_learn_intelex-2024.6.0.data}/data/Lib/site-packages/sklearnex/svm/nusvc.py +40 -4
  28. {scikit_learn_intelex-2024.4.0.data → scikit_learn_intelex-2024.6.0.data}/data/Lib/site-packages/sklearnex/svm/nusvr.py +31 -2
  29. {scikit_learn_intelex-2024.4.0.data → scikit_learn_intelex-2024.6.0.data}/data/Lib/site-packages/sklearnex/svm/svc.py +40 -4
  30. {scikit_learn_intelex-2024.4.0.data → scikit_learn_intelex-2024.6.0.data}/data/Lib/site-packages/sklearnex/svm/svr.py +31 -2
  31. {scikit_learn_intelex-2024.4.0.data → scikit_learn_intelex-2024.6.0.data}/data/Lib/site-packages/sklearnex/tests/_utils.py +70 -29
  32. scikit_learn_intelex-2024.6.0.data/data/Lib/site-packages/sklearnex/tests/test_common.py +54 -0
  33. scikit_learn_intelex-2024.6.0.data/data/Lib/site-packages/sklearnex/tests/test_memory_usage.py +290 -0
  34. {scikit_learn_intelex-2024.4.0.data → scikit_learn_intelex-2024.6.0.data}/data/Lib/site-packages/sklearnex/tests/test_n_jobs_support.py +4 -0
  35. {scikit_learn_intelex-2024.4.0.data → scikit_learn_intelex-2024.6.0.data}/data/Lib/site-packages/sklearnex/tests/test_patching.py +22 -10
  36. scikit_learn_intelex-2024.6.0.data/data/Lib/site-packages/sklearnex/tests/test_run_to_run_stability.py +283 -0
  37. {scikit_learn_intelex-2024.4.0.data → scikit_learn_intelex-2024.6.0.data}/data/Lib/site-packages/sklearnex/utils/_namespace.py +1 -1
  38. scikit_learn_intelex-2024.6.0.data/data/Lib/site-packages/sklearnex/utils/tests/test_finite.py +89 -0
  39. {scikit_learn_intelex-2024.4.0.dist-info → scikit_learn_intelex-2024.6.0.dist-info}/METADATA +230 -230
  40. scikit_learn_intelex-2024.6.0.dist-info/RECORD +108 -0
  41. {scikit_learn_intelex-2024.4.0.dist-info → scikit_learn_intelex-2024.6.0.dist-info}/WHEEL +1 -1
  42. scikit_learn_intelex-2024.4.0.data/data/Lib/site-packages/sklearnex/covariance/incremental_covariance.py +0 -130
  43. scikit_learn_intelex-2024.4.0.data/data/Lib/site-packages/sklearnex/svm/_common.py +0 -185
  44. scikit_learn_intelex-2024.4.0.data/data/Lib/site-packages/sklearnex/tests/test_memory_usage.py +0 -227
  45. scikit_learn_intelex-2024.4.0.data/data/Lib/site-packages/sklearnex/tests/test_run_to_run_stability_tests.py +0 -428
  46. scikit_learn_intelex-2024.4.0.dist-info/RECORD +0 -101
  47. {scikit_learn_intelex-2024.4.0.data → scikit_learn_intelex-2024.6.0.data}/data/Lib/site-packages/sklearnex/__init__.py +0 -0
  48. {scikit_learn_intelex-2024.4.0.data → scikit_learn_intelex-2024.6.0.data}/data/Lib/site-packages/sklearnex/__main__.py +0 -0
  49. {scikit_learn_intelex-2024.4.0.data → scikit_learn_intelex-2024.6.0.data}/data/Lib/site-packages/sklearnex/_config.py +0 -0
  50. {scikit_learn_intelex-2024.4.0.data → scikit_learn_intelex-2024.6.0.data}/data/Lib/site-packages/sklearnex/_utils.py +0 -0
  51. {scikit_learn_intelex-2024.4.0.data → scikit_learn_intelex-2024.6.0.data}/data/Lib/site-packages/sklearnex/basic_statistics/__init__.py +0 -0
  52. {scikit_learn_intelex-2024.4.0.data → scikit_learn_intelex-2024.6.0.data}/data/Lib/site-packages/sklearnex/basic_statistics/basic_statistics.py +0 -0
  53. {scikit_learn_intelex-2024.4.0.data → scikit_learn_intelex-2024.6.0.data}/data/Lib/site-packages/sklearnex/basic_statistics/incremental_basic_statistics.py +0 -0
  54. {scikit_learn_intelex-2024.4.0.data → scikit_learn_intelex-2024.6.0.data}/data/Lib/site-packages/sklearnex/cluster/__init__.py +0 -0
  55. {scikit_learn_intelex-2024.4.0.data → scikit_learn_intelex-2024.6.0.data}/data/Lib/site-packages/sklearnex/cluster/k_means.py +0 -0
  56. {scikit_learn_intelex-2024.4.0.data → scikit_learn_intelex-2024.6.0.data}/data/Lib/site-packages/sklearnex/cluster/tests/test_kmeans.py +0 -0
  57. {scikit_learn_intelex-2024.4.0.data → scikit_learn_intelex-2024.6.0.data}/data/Lib/site-packages/sklearnex/covariance/__init__.py +0 -0
  58. {scikit_learn_intelex-2024.4.0.data → scikit_learn_intelex-2024.6.0.data}/data/Lib/site-packages/sklearnex/decomposition/__init__.py +0 -0
  59. {scikit_learn_intelex-2024.4.0.data → scikit_learn_intelex-2024.6.0.data}/data/Lib/site-packages/sklearnex/doc/third-party-programs.txt +0 -0
  60. {scikit_learn_intelex-2024.4.0.data → scikit_learn_intelex-2024.6.0.data}/data/Lib/site-packages/sklearnex/ensemble/__init__.py +0 -0
  61. {scikit_learn_intelex-2024.4.0.data → scikit_learn_intelex-2024.6.0.data}/data/Lib/site-packages/sklearnex/glob/__main__.py +0 -0
  62. {scikit_learn_intelex-2024.4.0.data → scikit_learn_intelex-2024.6.0.data}/data/Lib/site-packages/sklearnex/linear_model/coordinate_descent.py +0 -0
  63. {scikit_learn_intelex-2024.4.0.data → scikit_learn_intelex-2024.6.0.data}/data/Lib/site-packages/sklearnex/linear_model/logistic_path.py +0 -0
  64. {scikit_learn_intelex-2024.4.0.data → scikit_learn_intelex-2024.6.0.data}/data/Lib/site-packages/sklearnex/linear_model/ridge.py +0 -0
  65. {scikit_learn_intelex-2024.4.0.data → scikit_learn_intelex-2024.6.0.data}/data/Lib/site-packages/sklearnex/linear_model/tests/test_logreg.py +0 -0
  66. {scikit_learn_intelex-2024.4.0.data → scikit_learn_intelex-2024.6.0.data}/data/Lib/site-packages/sklearnex/manifold/__init__.py +0 -0
  67. {scikit_learn_intelex-2024.4.0.data → scikit_learn_intelex-2024.6.0.data}/data/Lib/site-packages/sklearnex/manifold/t_sne.py +0 -0
  68. {scikit_learn_intelex-2024.4.0.data → scikit_learn_intelex-2024.6.0.data}/data/Lib/site-packages/sklearnex/manifold/tests/test_tsne.py +0 -0
  69. {scikit_learn_intelex-2024.4.0.data → scikit_learn_intelex-2024.6.0.data}/data/Lib/site-packages/sklearnex/metrics/__init__.py +0 -0
  70. {scikit_learn_intelex-2024.4.0.data → scikit_learn_intelex-2024.6.0.data}/data/Lib/site-packages/sklearnex/metrics/pairwise.py +0 -0
  71. {scikit_learn_intelex-2024.4.0.data → scikit_learn_intelex-2024.6.0.data}/data/Lib/site-packages/sklearnex/metrics/ranking.py +0 -0
  72. {scikit_learn_intelex-2024.4.0.data → scikit_learn_intelex-2024.6.0.data}/data/Lib/site-packages/sklearnex/metrics/tests/test_metrics.py +0 -0
  73. {scikit_learn_intelex-2024.4.0.data → scikit_learn_intelex-2024.6.0.data}/data/Lib/site-packages/sklearnex/model_selection/__init__.py +0 -0
  74. {scikit_learn_intelex-2024.4.0.data → scikit_learn_intelex-2024.6.0.data}/data/Lib/site-packages/sklearnex/model_selection/split.py +0 -0
  75. {scikit_learn_intelex-2024.4.0.data → scikit_learn_intelex-2024.6.0.data}/data/Lib/site-packages/sklearnex/model_selection/tests/test_model_selection.py +0 -0
  76. {scikit_learn_intelex-2024.4.0.data → scikit_learn_intelex-2024.6.0.data}/data/Lib/site-packages/sklearnex/neighbors/__init__.py +0 -0
  77. {scikit_learn_intelex-2024.4.0.data → scikit_learn_intelex-2024.6.0.data}/data/Lib/site-packages/sklearnex/neighbors/_lof.py +0 -0
  78. {scikit_learn_intelex-2024.4.0.data → scikit_learn_intelex-2024.6.0.data}/data/Lib/site-packages/sklearnex/neighbors/common.py +0 -0
  79. {scikit_learn_intelex-2024.4.0.data → scikit_learn_intelex-2024.6.0.data}/data/Lib/site-packages/sklearnex/neighbors/knn_classification.py +0 -0
  80. {scikit_learn_intelex-2024.4.0.data → scikit_learn_intelex-2024.6.0.data}/data/Lib/site-packages/sklearnex/neighbors/knn_unsupervised.py +0 -0
  81. {scikit_learn_intelex-2024.4.0.data → scikit_learn_intelex-2024.6.0.data}/data/Lib/site-packages/sklearnex/preview/cluster/__init__.py +0 -0
  82. {scikit_learn_intelex-2024.4.0.data → scikit_learn_intelex-2024.6.0.data}/data/Lib/site-packages/sklearnex/preview/cluster/_common.py +0 -0
  83. {scikit_learn_intelex-2024.4.0.data → scikit_learn_intelex-2024.6.0.data}/data/Lib/site-packages/sklearnex/preview/cluster/k_means.py +0 -0
  84. {scikit_learn_intelex-2024.4.0.data → scikit_learn_intelex-2024.6.0.data}/data/Lib/site-packages/sklearnex/preview/covariance/__init__.py +0 -0
  85. {scikit_learn_intelex-2024.4.0.data → scikit_learn_intelex-2024.6.0.data}/data/Lib/site-packages/sklearnex/preview/covariance/covariance.py +0 -0
  86. {scikit_learn_intelex-2024.4.0.data → scikit_learn_intelex-2024.6.0.data}/data/Lib/site-packages/sklearnex/preview/covariance/tests/test_covariance.py +0 -0
  87. {scikit_learn_intelex-2024.4.0.data → scikit_learn_intelex-2024.6.0.data}/data/Lib/site-packages/sklearnex/spmd/__init__.py +0 -0
  88. {scikit_learn_intelex-2024.4.0.data → scikit_learn_intelex-2024.6.0.data}/data/Lib/site-packages/sklearnex/spmd/basic_statistics/__init__.py +0 -0
  89. {scikit_learn_intelex-2024.4.0.data → scikit_learn_intelex-2024.6.0.data}/data/Lib/site-packages/sklearnex/spmd/basic_statistics/basic_statistics.py +0 -0
  90. {scikit_learn_intelex-2024.4.0.data → scikit_learn_intelex-2024.6.0.data}/data/Lib/site-packages/sklearnex/spmd/cluster/__init__.py +0 -0
  91. {scikit_learn_intelex-2024.4.0.data → scikit_learn_intelex-2024.6.0.data}/data/Lib/site-packages/sklearnex/spmd/cluster/dbscan.py +0 -0
  92. {scikit_learn_intelex-2024.4.0.data → scikit_learn_intelex-2024.6.0.data}/data/Lib/site-packages/sklearnex/spmd/cluster/kmeans.py +0 -0
  93. {scikit_learn_intelex-2024.4.0.data → scikit_learn_intelex-2024.6.0.data}/data/Lib/site-packages/sklearnex/spmd/covariance/__init__.py +0 -0
  94. {scikit_learn_intelex-2024.4.0.data → scikit_learn_intelex-2024.6.0.data}/data/Lib/site-packages/sklearnex/spmd/covariance/covariance.py +0 -0
  95. {scikit_learn_intelex-2024.4.0.data → scikit_learn_intelex-2024.6.0.data}/data/Lib/site-packages/sklearnex/spmd/decomposition/__init__.py +0 -0
  96. {scikit_learn_intelex-2024.4.0.data → scikit_learn_intelex-2024.6.0.data}/data/Lib/site-packages/sklearnex/spmd/decomposition/pca.py +0 -0
  97. {scikit_learn_intelex-2024.4.0.data → scikit_learn_intelex-2024.6.0.data}/data/Lib/site-packages/sklearnex/spmd/ensemble/__init__.py +0 -0
  98. {scikit_learn_intelex-2024.4.0.data → scikit_learn_intelex-2024.6.0.data}/data/Lib/site-packages/sklearnex/spmd/ensemble/forest.py +0 -0
  99. {scikit_learn_intelex-2024.4.0.data → scikit_learn_intelex-2024.6.0.data}/data/Lib/site-packages/sklearnex/spmd/linear_model/__init__.py +0 -0
  100. {scikit_learn_intelex-2024.4.0.data → scikit_learn_intelex-2024.6.0.data}/data/Lib/site-packages/sklearnex/spmd/linear_model/linear_model.py +0 -0
  101. {scikit_learn_intelex-2024.4.0.data → scikit_learn_intelex-2024.6.0.data}/data/Lib/site-packages/sklearnex/spmd/linear_model/logistic_regression.py +0 -0
  102. {scikit_learn_intelex-2024.4.0.data → scikit_learn_intelex-2024.6.0.data}/data/Lib/site-packages/sklearnex/spmd/neighbors/__init__.py +0 -0
  103. {scikit_learn_intelex-2024.4.0.data → scikit_learn_intelex-2024.6.0.data}/data/Lib/site-packages/sklearnex/spmd/neighbors/neighbors.py +0 -0
  104. {scikit_learn_intelex-2024.4.0.data → scikit_learn_intelex-2024.6.0.data}/data/Lib/site-packages/sklearnex/svm/__init__.py +0 -0
  105. {scikit_learn_intelex-2024.4.0.data → scikit_learn_intelex-2024.6.0.data}/data/Lib/site-packages/sklearnex/svm/tests/test_svm.py +0 -0
  106. {scikit_learn_intelex-2024.4.0.data → scikit_learn_intelex-2024.6.0.data}/data/Lib/site-packages/sklearnex/tests/test_config.py +0 -0
  107. {scikit_learn_intelex-2024.4.0.data → scikit_learn_intelex-2024.6.0.data}/data/Lib/site-packages/sklearnex/tests/test_monkeypatch.py +0 -0
  108. {scikit_learn_intelex-2024.4.0.data → scikit_learn_intelex-2024.6.0.data}/data/Lib/site-packages/sklearnex/tests/test_parallel.py +0 -0
  109. {scikit_learn_intelex-2024.4.0.data → scikit_learn_intelex-2024.6.0.data}/data/Lib/site-packages/sklearnex/utils/__init__.py +0 -0
  110. {scikit_learn_intelex-2024.4.0.data → scikit_learn_intelex-2024.6.0.data}/data/Lib/site-packages/sklearnex/utils/parallel.py +0 -0
  111. {scikit_learn_intelex-2024.4.0.data → scikit_learn_intelex-2024.6.0.data}/data/Lib/site-packages/sklearnex/utils/validation.py +0 -0
  112. {scikit_learn_intelex-2024.4.0.dist-info → scikit_learn_intelex-2024.6.0.dist-info}/LICENSE.txt +0 -0
  113. {scikit_learn_intelex-2024.4.0.dist-info → scikit_learn_intelex-2024.6.0.dist-info}/top_level.txt +0 -0
@@ -0,0 +1,200 @@
1
+ # ===============================================================================
2
+ # Copyright 2024 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
+ from numpy.testing import assert_allclose
20
+
21
+ from onedal.tests.utils._dataframes_support import (
22
+ _as_numpy,
23
+ _convert_to_dataframe,
24
+ get_dataframes_and_queues,
25
+ )
26
+ from sklearnex.linear_model import IncrementalLinearRegression
27
+
28
+
29
+ @pytest.mark.parametrize("dataframe,queue", get_dataframes_and_queues())
30
+ @pytest.mark.parametrize("fit_intercept", [True, False])
31
+ @pytest.mark.parametrize("macro_block", [None, 1024])
32
+ @pytest.mark.parametrize("dtype", [np.float32, np.float64])
33
+ def test_sklearnex_fit_on_gold_data(dataframe, queue, fit_intercept, macro_block, dtype):
34
+ X = np.array([[1], [2]])
35
+ X = X.astype(dtype=dtype)
36
+ X_df = _convert_to_dataframe(X, sycl_queue=queue, target_df=dataframe)
37
+ y = np.array([1, 2])
38
+ y = y.astype(dtype=dtype)
39
+ y_df = _convert_to_dataframe(y, sycl_queue=queue, target_df=dataframe)
40
+
41
+ inclin = IncrementalLinearRegression(fit_intercept=fit_intercept)
42
+ if macro_block is not None:
43
+ hparams = inclin.get_hyperparameters("fit")
44
+ hparams.cpu_macro_block = macro_block
45
+ hparams.gpu_macro_block = macro_block
46
+ inclin.fit(X_df, y_df)
47
+
48
+ y_pred = inclin.predict(X_df)
49
+
50
+ tol = 2e-6 if y_pred.dtype == np.float32 else 1e-7
51
+ assert_allclose(inclin.coef_, [1], atol=tol)
52
+ if fit_intercept:
53
+ assert_allclose(inclin.intercept_, [0], atol=tol)
54
+ assert_allclose(_as_numpy(y_pred), y, atol=tol)
55
+
56
+
57
+ @pytest.mark.parametrize("dataframe,queue", get_dataframes_and_queues())
58
+ @pytest.mark.parametrize("fit_intercept", [True, False])
59
+ @pytest.mark.parametrize("macro_block", [None, 1024])
60
+ @pytest.mark.parametrize("dtype", [np.float32, np.float64])
61
+ def test_sklearnex_partial_fit_on_gold_data(
62
+ dataframe, queue, fit_intercept, macro_block, dtype
63
+ ):
64
+ X = np.array([[1], [2], [3], [4]])
65
+ X = X.astype(dtype=dtype)
66
+ y = X + 3
67
+ y = y.astype(dtype=dtype)
68
+ X_split = np.array_split(X, 2)
69
+ y_split = np.array_split(y, 2)
70
+
71
+ inclin = IncrementalLinearRegression()
72
+ if macro_block is not None:
73
+ hparams = inclin.get_hyperparameters("fit")
74
+ hparams.cpu_macro_block = macro_block
75
+ hparams.gpu_macro_block = macro_block
76
+ for i in range(2):
77
+ X_split_df = _convert_to_dataframe(
78
+ X_split[i], sycl_queue=queue, target_df=dataframe
79
+ )
80
+ y_split_df = _convert_to_dataframe(
81
+ y_split[i], sycl_queue=queue, target_df=dataframe
82
+ )
83
+ inclin.partial_fit(X_split_df, y_split_df)
84
+
85
+ X_df = _convert_to_dataframe(X, sycl_queue=queue, target_df=dataframe)
86
+ y_pred = inclin.predict(X_df)
87
+
88
+ assert inclin.n_features_in_ == 1
89
+ tol = 2e-6 if y_pred.dtype == np.float32 else 1e-7
90
+ assert_allclose(inclin.coef_, [[1]], atol=tol)
91
+ if fit_intercept:
92
+ assert_allclose(inclin.intercept_, 3, atol=tol)
93
+
94
+ assert_allclose(_as_numpy(y_pred), y, atol=tol)
95
+
96
+
97
+ @pytest.mark.parametrize("dataframe,queue", get_dataframes_and_queues())
98
+ @pytest.mark.parametrize("fit_intercept", [True, False])
99
+ @pytest.mark.parametrize("macro_block", [None, 1024])
100
+ @pytest.mark.parametrize("dtype", [np.float32, np.float64])
101
+ def test_sklearnex_partial_fit_multitarget_on_gold_data(
102
+ dataframe, queue, fit_intercept, macro_block, dtype
103
+ ):
104
+ X = np.array([[1, 1], [1, 2], [2, 2], [2, 3]])
105
+ X = X.astype(dtype=dtype)
106
+ y = np.dot(X, [1, 2]) + 3
107
+ y = y.astype(dtype=dtype)
108
+ X_split = np.array_split(X, 2)
109
+ y_split = np.array_split(y, 2)
110
+
111
+ inclin = IncrementalLinearRegression()
112
+ if macro_block is not None:
113
+ hparams = inclin.get_hyperparameters("fit")
114
+ hparams.cpu_macro_block = macro_block
115
+ hparams.gpu_macro_block = macro_block
116
+ for i in range(2):
117
+ X_split_df = _convert_to_dataframe(
118
+ X_split[i], sycl_queue=queue, target_df=dataframe
119
+ )
120
+ y_split_df = _convert_to_dataframe(
121
+ y_split[i], sycl_queue=queue, target_df=dataframe
122
+ )
123
+ inclin.partial_fit(X_split_df, y_split_df)
124
+
125
+ X_df = _convert_to_dataframe(X, sycl_queue=queue, target_df=dataframe)
126
+ y_pred = inclin.predict(X_df)
127
+
128
+ assert inclin.n_features_in_ == 2
129
+ tol = 7e-6 if y_pred.dtype == np.float32 else 1e-7
130
+ assert_allclose(inclin.coef_, [1.0, 2.0], atol=tol)
131
+ if fit_intercept:
132
+ assert_allclose(inclin.intercept_, 3.0, atol=tol)
133
+
134
+ assert_allclose(_as_numpy(y_pred), y, atol=tol)
135
+
136
+
137
+ @pytest.mark.parametrize("dataframe,queue", get_dataframes_and_queues())
138
+ @pytest.mark.parametrize("fit_intercept", [True, False])
139
+ @pytest.mark.parametrize("num_samples", [100, 1000])
140
+ @pytest.mark.parametrize("num_features", [5, 10])
141
+ @pytest.mark.parametrize("num_targets", [1, 2])
142
+ @pytest.mark.parametrize("num_blocks", [1, 10])
143
+ @pytest.mark.parametrize("macro_block", [None, 1024])
144
+ @pytest.mark.parametrize("dtype", [np.float32, np.float64])
145
+ def test_sklearnex_partial_fit_on_random_data(
146
+ dataframe,
147
+ queue,
148
+ fit_intercept,
149
+ num_samples,
150
+ num_features,
151
+ num_targets,
152
+ num_blocks,
153
+ macro_block,
154
+ dtype,
155
+ ):
156
+ seed = 42
157
+ gen = np.random.default_rng(seed)
158
+ intercept = gen.random(size=num_targets, dtype=dtype)
159
+ coef = gen.random(size=(num_targets, num_features), dtype=dtype).T
160
+
161
+ X = gen.random(size=(num_samples, num_features), dtype=dtype)
162
+ if fit_intercept:
163
+ y = X @ coef + intercept[np.newaxis, :]
164
+ else:
165
+ y = X @ coef
166
+
167
+ X_split = np.array_split(X, num_blocks)
168
+ y_split = np.array_split(y, num_blocks)
169
+
170
+ inclin = IncrementalLinearRegression(fit_intercept=fit_intercept)
171
+ if macro_block is not None:
172
+ hparams = inclin.get_hyperparameters("fit")
173
+ hparams.cpu_macro_block = macro_block
174
+ hparams.gpu_macro_block = macro_block
175
+ for i in range(num_blocks):
176
+ X_split_df = _convert_to_dataframe(
177
+ X_split[i], sycl_queue=queue, target_df=dataframe
178
+ )
179
+ y_split_df = _convert_to_dataframe(
180
+ y_split[i], sycl_queue=queue, target_df=dataframe
181
+ )
182
+ inclin.partial_fit(X_split_df, y_split_df)
183
+
184
+ tol = 1e-4 if inclin.coef_.dtype == np.float32 else 1e-7
185
+ assert_allclose(coef, inclin.coef_.T, atol=tol)
186
+
187
+ if fit_intercept:
188
+ assert_allclose(intercept, inclin.intercept_, atol=tol)
189
+
190
+ X_test = gen.random(size=(num_samples, num_features), dtype=dtype)
191
+ if fit_intercept:
192
+ expected_y_pred = X_test @ coef + intercept[np.newaxis, :]
193
+ else:
194
+ expected_y_pred = X_test @ coef
195
+
196
+ X_test_df = _convert_to_dataframe(X_test, sycl_queue=queue, target_df=dataframe)
197
+
198
+ y_pred = inclin.predict(X_test_df)
199
+
200
+ assert_allclose(expected_y_pred, _as_numpy(y_pred), atol=tol)
@@ -52,7 +52,7 @@ def test_sklearnex_import_linear(dataframe, queue, dtype, macro_block):
52
52
  assert "sklearnex" in linreg.__module__
53
53
  assert linreg.n_features_in_ == 2
54
54
 
55
- tol = 1e-5 if X.dtype == np.float32 else 1e-7
55
+ tol = 1e-5 if _as_numpy(linreg.coef_).dtype == np.float32 else 1e-7
56
56
  assert_allclose(_as_numpy(linreg.intercept_), 3.0, rtol=tol)
57
57
  assert_allclose(_as_numpy(linreg.coef_), [1.0, 2.0], rtol=tol)
58
58
 
@@ -113,5 +113,5 @@ def test_sklearnex_reconstruct_model(dataframe, queue, dtype):
113
113
 
114
114
  y_pred = linreg.predict(X)
115
115
 
116
- tol = 1e-5 if X.dtype == np.float32 else 1e-7
116
+ tol = 1e-5 if _as_numpy(y_pred).dtype == np.float32 else 1e-7
117
117
  assert_allclose(gtr, _as_numpy(y_pred), rtol=tol)
@@ -14,6 +14,7 @@
14
14
  # limitations under the License.
15
15
  # ==============================================================================
16
16
 
17
+ from sklearn.metrics import r2_score
17
18
  from sklearn.neighbors._regression import (
18
19
  KNeighborsRegressor as sklearn_KNeighborsRegressor,
19
20
  )
@@ -117,6 +118,23 @@ class KNeighborsRegressor(sklearn_KNeighborsRegressor, KNeighborsDispatchingBase
117
118
  X,
118
119
  )
119
120
 
121
+ @wrap_output_data
122
+ def score(self, X, y, sample_weight=None):
123
+ check_is_fitted(self)
124
+ if sklearn_check_version("1.0"):
125
+ self._check_feature_names(X, reset=False)
126
+ return dispatch(
127
+ self,
128
+ "score",
129
+ {
130
+ "onedal": self.__class__._onedal_score,
131
+ "sklearn": sklearn_KNeighborsRegressor.score,
132
+ },
133
+ X,
134
+ y,
135
+ sample_weight=sample_weight,
136
+ )
137
+
120
138
  @wrap_output_data
121
139
  def kneighbors(self, X=None, n_neighbors=None, return_distance=True):
122
140
  check_is_fitted(self)
@@ -184,6 +202,11 @@ class KNeighborsRegressor(sklearn_KNeighborsRegressor, KNeighborsDispatchingBase
184
202
  X, n_neighbors, return_distance, queue=queue
185
203
  )
186
204
 
205
+ def _onedal_score(self, X, y, sample_weight=None, queue=None):
206
+ return r2_score(
207
+ y, self._onedal_predict(X, queue=queue), sample_weight=sample_weight
208
+ )
209
+
187
210
  def _save_attributes(self):
188
211
  self.n_features_in_ = self._onedal_estimator.n_features_in_
189
212
  self.n_samples_fit_ = self._onedal_estimator.n_samples_fit_
@@ -196,3 +219,4 @@ class KNeighborsRegressor(sklearn_KNeighborsRegressor, KNeighborsDispatchingBase
196
219
  predict.__doc__ = sklearn_KNeighborsRegressor.predict.__doc__
197
220
  kneighbors.__doc__ = sklearn_KNeighborsRegressor.kneighbors.__doc__
198
221
  radius_neighbors.__doc__ = sklearn_NearestNeighbors.radius_neighbors.__doc__
222
+ score.__doc__ = sklearn_KNeighborsRegressor.score.__doc__
@@ -47,9 +47,9 @@ def test_sklearnex_import_knn_regression(dataframe, queue):
47
47
  y = _convert_to_dataframe([0, 0, 1, 1], sycl_queue=queue, target_df=dataframe)
48
48
  neigh = KNeighborsRegressor(n_neighbors=2).fit(X, y)
49
49
  y_test = _convert_to_dataframe([[1.5]], sycl_queue=queue, target_df=dataframe)
50
- pred = _as_numpy(neigh.predict(y_test))
50
+ pred = _as_numpy(neigh.predict(y_test)).squeeze()
51
51
  assert "sklearnex" in neigh.__module__
52
- assert_allclose(pred, [0.5])
52
+ assert_allclose(pred, 0.5)
53
53
 
54
54
 
55
55
  @pytest.mark.parametrize("dataframe,queue", get_dataframes_and_queues())
@@ -14,4 +14,4 @@
14
14
  # limitations under the License.
15
15
  # ==============================================================================
16
16
 
17
- __all__ = ["cluster", "covariance"]
17
+ __all__ = ["cluster", "covariance", "decomposition"]
@@ -0,0 +1,19 @@
1
+ # ===============================================================================
2
+ # Copyright 2024 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
+
19
+ __all__ = ["IncrementalPCA"]
@@ -0,0 +1,228 @@
1
+ # ===============================================================================
2
+ # Copyright 2024 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
+ from sklearn.decomposition import IncrementalPCA as sklearn_IncrementalPCA
19
+ from sklearn.utils import check_array, gen_batches
20
+
21
+ from daal4py.sklearn._n_jobs_support import control_n_jobs
22
+ from daal4py.sklearn._utils import sklearn_check_version
23
+ from onedal.decomposition import IncrementalPCA as onedal_IncrementalPCA
24
+
25
+ from ..._device_offload import dispatch, wrap_output_data
26
+ from ..._utils import PatchingConditionsChain
27
+
28
+
29
+ @control_n_jobs(
30
+ decorated_methods=["fit", "partial_fit", "transform", "_onedal_finalize_fit"]
31
+ )
32
+ class IncrementalPCA(sklearn_IncrementalPCA):
33
+
34
+ def __init__(self, n_components=None, *, whiten=False, copy=True, batch_size=None):
35
+ super().__init__(
36
+ n_components=n_components, whiten=whiten, copy=copy, batch_size=batch_size
37
+ )
38
+ self._need_to_finalize = False
39
+ self._need_to_finalize_attrs = {
40
+ "mean_",
41
+ "explained_variance_",
42
+ "explained_variance_ratio_",
43
+ "n_components_",
44
+ "components_",
45
+ "noise_variance_",
46
+ "singular_values_",
47
+ "var_",
48
+ }
49
+
50
+ _onedal_incremental_pca = staticmethod(onedal_IncrementalPCA)
51
+
52
+ def _onedal_transform(self, X, queue=None):
53
+ assert hasattr(self, "_onedal_estimator")
54
+ if self._need_to_finalize:
55
+ self._onedal_finalize_fit()
56
+ X = check_array(X, dtype=[np.float64, np.float32])
57
+ return self._onedal_estimator.predict(X, queue)
58
+
59
+ def _onedal_fit_transform(self, X, queue=None):
60
+ self._onedal_fit(X, queue)
61
+ return self._onedal_transform(X, queue)
62
+
63
+ def _onedal_partial_fit(self, X, check_input=True, queue=None):
64
+ first_pass = not hasattr(self, "components_")
65
+
66
+ if check_input:
67
+ if sklearn_check_version("1.0"):
68
+ X = self._validate_data(
69
+ X, dtype=[np.float64, np.float32], reset=first_pass
70
+ )
71
+ else:
72
+ X = check_array(
73
+ X,
74
+ dtype=[np.float64, np.float32],
75
+ copy=self.copy,
76
+ )
77
+
78
+ n_samples, n_features = X.shape
79
+
80
+ if self.n_components is None:
81
+ if not hasattr(self, "components_"):
82
+ self.n_components_ = min(n_samples, n_features)
83
+ else:
84
+ self.n_components_ = self.components_.shape[0]
85
+ elif not self.n_components <= n_features:
86
+ raise ValueError(
87
+ "n_components=%r invalid for n_features=%d, need "
88
+ "more rows than columns for IncrementalPCA "
89
+ "processing" % (self.n_components, n_features)
90
+ )
91
+ elif not self.n_components <= n_samples:
92
+ raise ValueError(
93
+ "n_components=%r must be less or equal to "
94
+ "the batch number of samples "
95
+ "%d." % (self.n_components, n_samples)
96
+ )
97
+ else:
98
+ self.n_components_ = self.n_components
99
+
100
+ if not hasattr(self, "n_samples_seen_"):
101
+ self.n_samples_seen_ = n_samples
102
+ else:
103
+ self.n_samples_seen_ += n_samples
104
+
105
+ onedal_params = {"n_components": self.n_components_, "whiten": self.whiten}
106
+
107
+ if not hasattr(self, "_onedal_estimator"):
108
+ self._onedal_estimator = self._onedal_incremental_pca(**onedal_params)
109
+ self._onedal_estimator.partial_fit(X, queue)
110
+ self._need_to_finalize = True
111
+
112
+ def _onedal_finalize_fit(self):
113
+ assert hasattr(self, "_onedal_estimator")
114
+ self._onedal_estimator.finalize_fit()
115
+ self._need_to_finalize = False
116
+
117
+ def _onedal_fit(self, X, queue=None):
118
+ if sklearn_check_version("1.2"):
119
+ self._validate_params()
120
+
121
+ if sklearn_check_version("1.0"):
122
+ X = self._validate_data(X, dtype=[np.float64, np.float32], copy=self.copy)
123
+ else:
124
+ X = check_array(
125
+ X,
126
+ dtype=[np.float64, np.float32],
127
+ copy=self.copy,
128
+ )
129
+
130
+ n_samples, n_features = X.shape
131
+
132
+ if self.batch_size is None:
133
+ self.batch_size_ = 5 * n_features
134
+ else:
135
+ self.batch_size_ = self.batch_size
136
+
137
+ self.n_samples_seen_ = 0
138
+ if hasattr(self, "_onedal_estimator"):
139
+ self._onedal_estimator._reset()
140
+
141
+ for batch in gen_batches(n_samples, self.batch_size_):
142
+ X_batch = X[batch]
143
+ self._onedal_partial_fit(X_batch, queue=queue)
144
+
145
+ self._onedal_finalize_fit()
146
+
147
+ return self
148
+
149
+ def _onedal_supported(self, method_name, *data):
150
+ patching_status = PatchingConditionsChain(
151
+ f"sklearn.decomposition.{self.__class__.__name__}.{method_name}"
152
+ )
153
+ return patching_status
154
+
155
+ _onedal_cpu_supported = _onedal_supported
156
+ _onedal_gpu_supported = _onedal_supported
157
+
158
+ def __getattr__(self, attr):
159
+ if attr in self._need_to_finalize_attrs:
160
+ if hasattr(self, "_onedal_estimator"):
161
+ if self._need_to_finalize:
162
+ self._onedal_finalize_fit()
163
+ return getattr(self._onedal_estimator, attr)
164
+ else:
165
+ raise AttributeError(
166
+ f"'{self.__class__.__name__}' object has no attribute '{attr}'"
167
+ )
168
+ if attr in self.__dict__:
169
+ return self.__dict__[attr]
170
+
171
+ raise AttributeError(
172
+ f"'{self.__class__.__name__}' object has no attribute '{attr}'"
173
+ )
174
+
175
+ def partial_fit(self, X, y=None, check_input=True):
176
+ dispatch(
177
+ self,
178
+ "partial_fit",
179
+ {
180
+ "onedal": self.__class__._onedal_partial_fit,
181
+ "sklearn": sklearn_IncrementalPCA.partial_fit,
182
+ },
183
+ X,
184
+ check_input=check_input,
185
+ )
186
+ return self
187
+
188
+ def fit(self, X, y=None):
189
+ dispatch(
190
+ self,
191
+ "fit",
192
+ {
193
+ "onedal": self.__class__._onedal_fit,
194
+ "sklearn": sklearn_IncrementalPCA.fit,
195
+ },
196
+ X,
197
+ )
198
+ return self
199
+
200
+ @wrap_output_data
201
+ def transform(self, X):
202
+ return dispatch(
203
+ self,
204
+ "transform",
205
+ {
206
+ "onedal": self.__class__._onedal_transform,
207
+ "sklearn": sklearn_IncrementalPCA.transform,
208
+ },
209
+ X,
210
+ )
211
+
212
+ @wrap_output_data
213
+ def fit_transform(self, X, y=None, **fit_params):
214
+ return dispatch(
215
+ self,
216
+ "fit_transform",
217
+ {
218
+ "onedal": self.__class__._onedal_fit_transform,
219
+ "sklearn": sklearn_IncrementalPCA.fit_transform,
220
+ },
221
+ X,
222
+ )
223
+
224
+ __doc__ = sklearn_IncrementalPCA.__doc__
225
+ fit.__doc__ = sklearn_IncrementalPCA.fit.__doc__
226
+ fit_transform.__doc__ = sklearn_IncrementalPCA.fit_transform.__doc__
227
+ transform.__doc__ = sklearn_IncrementalPCA.transform.__doc__
228
+ partial_fit.__doc__ = sklearn_IncrementalPCA.partial_fit.__doc__