scikit-learn-intelex 2024.2.0__py311-none-win_amd64.whl → 2024.4.0__py311-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 (112) hide show
  1. {scikit_learn_intelex-2024.2.0.data → scikit_learn_intelex-2024.4.0.data}/data/Lib/site-packages/sklearnex/__init__.py +9 -7
  2. {scikit_learn_intelex-2024.2.0.data → scikit_learn_intelex-2024.4.0.data}/data/Lib/site-packages/sklearnex/_device_offload.py +31 -4
  3. {scikit_learn_intelex-2024.2.0.data/data/Lib/site-packages/sklearnex/spmd → scikit_learn_intelex-2024.4.0.data/data/Lib/site-packages/sklearnex}/basic_statistics/__init__.py +2 -1
  4. scikit_learn_intelex-2024.4.0.data/data/Lib/site-packages/sklearnex/basic_statistics/incremental_basic_statistics.py +288 -0
  5. scikit_learn_intelex-2024.4.0.data/data/Lib/site-packages/sklearnex/basic_statistics/tests/test_incremental_basic_statistics.py +386 -0
  6. {scikit_learn_intelex-2024.2.0.data → scikit_learn_intelex-2024.4.0.data}/data/Lib/site-packages/sklearnex/cluster/dbscan.py +3 -1
  7. scikit_learn_intelex-2024.4.0.data/data/Lib/site-packages/sklearnex/conftest.py +63 -0
  8. scikit_learn_intelex-2024.4.0.data/data/Lib/site-packages/sklearnex/decomposition/pca.py +335 -0
  9. scikit_learn_intelex-2024.2.0.data/data/Lib/site-packages/sklearnex/preview/decomposition/tests/test_preview_pca.py → scikit_learn_intelex-2024.4.0.data/data/Lib/site-packages/sklearnex/decomposition/tests/test_pca.py +22 -8
  10. {scikit_learn_intelex-2024.2.0.data → scikit_learn_intelex-2024.4.0.data}/data/Lib/site-packages/sklearnex/dispatcher.py +74 -43
  11. {scikit_learn_intelex-2024.2.0.data → scikit_learn_intelex-2024.4.0.data}/data/Lib/site-packages/sklearnex/ensemble/_forest.py +78 -89
  12. {scikit_learn_intelex-2024.2.0.data → scikit_learn_intelex-2024.4.0.data}/data/Lib/site-packages/sklearnex/ensemble/tests/test_forest.py +15 -19
  13. scikit_learn_intelex-2024.4.0.data/data/Lib/site-packages/sklearnex/linear_model/linear.py +316 -0
  14. {scikit_learn_intelex-2024.2.0.data → scikit_learn_intelex-2024.4.0.data}/data/Lib/site-packages/sklearnex/linear_model/logistic_regression.py +63 -11
  15. {scikit_learn_intelex-2024.2.0.data → scikit_learn_intelex-2024.4.0.data}/data/Lib/site-packages/sklearnex/linear_model/tests/test_linear.py +40 -5
  16. {scikit_learn_intelex-2024.2.0.data → scikit_learn_intelex-2024.4.0.data}/data/Lib/site-packages/sklearnex/linear_model/tests/test_logreg.py +0 -2
  17. {scikit_learn_intelex-2024.2.0.data → scikit_learn_intelex-2024.4.0.data}/data/Lib/site-packages/sklearnex/neighbors/_lof.py +74 -20
  18. {scikit_learn_intelex-2024.2.0.data → scikit_learn_intelex-2024.4.0.data}/data/Lib/site-packages/sklearnex/neighbors/common.py +4 -1
  19. {scikit_learn_intelex-2024.2.0.data → scikit_learn_intelex-2024.4.0.data}/data/Lib/site-packages/sklearnex/neighbors/knn_classification.py +44 -131
  20. scikit_learn_intelex-2024.2.0.data/data/Lib/site-packages/sklearnex/neighbors/knn_unsupervised.py → scikit_learn_intelex-2024.4.0.data/data/Lib/site-packages/sklearnex/neighbors/knn_regression.py +198 -221
  21. scikit_learn_intelex-2024.4.0.data/data/Lib/site-packages/sklearnex/neighbors/knn_unsupervised.py +146 -0
  22. {scikit_learn_intelex-2024.2.0.data → scikit_learn_intelex-2024.4.0.data}/data/Lib/site-packages/sklearnex/neighbors/tests/test_neighbors.py +0 -5
  23. {scikit_learn_intelex-2024.2.0.data → scikit_learn_intelex-2024.4.0.data}/data/Lib/site-packages/sklearnex/preview/__init__.py +1 -1
  24. {scikit_learn_intelex-2024.2.0.data → scikit_learn_intelex-2024.4.0.data}/data/Lib/site-packages/sklearnex/preview/cluster/k_means.py +5 -73
  25. {scikit_learn_intelex-2024.2.0.data → scikit_learn_intelex-2024.4.0.data}/data/Lib/site-packages/sklearnex/preview/covariance/covariance.py +6 -5
  26. {scikit_learn_intelex-2024.2.0.data → scikit_learn_intelex-2024.4.0.data}/data/Lib/site-packages/sklearnex/preview/covariance/tests/test_covariance.py +18 -5
  27. {scikit_learn_intelex-2024.2.0.data → scikit_learn_intelex-2024.4.0.data}/data/Lib/site-packages/sklearnex/spmd/ensemble/forest.py +4 -12
  28. {scikit_learn_intelex-2024.2.0.data → scikit_learn_intelex-2024.4.0.data}/data/Lib/site-packages/sklearnex/svm/_common.py +4 -7
  29. {scikit_learn_intelex-2024.2.0.data → scikit_learn_intelex-2024.4.0.data}/data/Lib/site-packages/sklearnex/svm/nusvc.py +70 -50
  30. {scikit_learn_intelex-2024.2.0.data → scikit_learn_intelex-2024.4.0.data}/data/Lib/site-packages/sklearnex/svm/nusvr.py +6 -52
  31. {scikit_learn_intelex-2024.2.0.data → scikit_learn_intelex-2024.4.0.data}/data/Lib/site-packages/sklearnex/svm/svc.py +70 -51
  32. {scikit_learn_intelex-2024.2.0.data → scikit_learn_intelex-2024.4.0.data}/data/Lib/site-packages/sklearnex/svm/svr.py +3 -49
  33. scikit_learn_intelex-2024.4.0.data/data/Lib/site-packages/sklearnex/tests/_utils.py +164 -0
  34. {scikit_learn_intelex-2024.2.0.data → scikit_learn_intelex-2024.4.0.data}/data/Lib/site-packages/sklearnex/tests/test_memory_usage.py +8 -3
  35. scikit_learn_intelex-2024.4.0.data/data/Lib/site-packages/sklearnex/tests/test_monkeypatch.py +268 -0
  36. {scikit_learn_intelex-2024.2.0.data → scikit_learn_intelex-2024.4.0.data}/data/Lib/site-packages/sklearnex/tests/test_n_jobs_support.py +8 -2
  37. {scikit_learn_intelex-2024.2.0.data → scikit_learn_intelex-2024.4.0.data}/data/Lib/site-packages/sklearnex/tests/test_parallel.py +6 -8
  38. scikit_learn_intelex-2024.4.0.data/data/Lib/site-packages/sklearnex/tests/test_patching.py +371 -0
  39. {scikit_learn_intelex-2024.2.0.data → scikit_learn_intelex-2024.4.0.data}/data/Lib/site-packages/sklearnex/utils/__init__.py +2 -1
  40. scikit_learn_intelex-2024.4.0.data/data/Lib/site-packages/sklearnex/utils/_namespace.py +97 -0
  41. {scikit_learn_intelex-2024.2.0.dist-info → scikit_learn_intelex-2024.4.0.dist-info}/METADATA +2 -2
  42. scikit_learn_intelex-2024.4.0.dist-info/RECORD +101 -0
  43. scikit_learn_intelex-2024.2.0.data/data/Lib/site-packages/sklearnex/decomposition/pca.py +0 -17
  44. scikit_learn_intelex-2024.2.0.data/data/Lib/site-packages/sklearnex/decomposition/tests/test_pca.py +0 -27
  45. scikit_learn_intelex-2024.2.0.data/data/Lib/site-packages/sklearnex/linear_model/linear.py +0 -381
  46. scikit_learn_intelex-2024.2.0.data/data/Lib/site-packages/sklearnex/neighbors/knn_regression.py +0 -308
  47. scikit_learn_intelex-2024.2.0.data/data/Lib/site-packages/sklearnex/preview/decomposition/__init__.py +0 -19
  48. scikit_learn_intelex-2024.2.0.data/data/Lib/site-packages/sklearnex/preview/decomposition/pca.py +0 -374
  49. scikit_learn_intelex-2024.2.0.data/data/Lib/site-packages/sklearnex/tests/_models_info.py +0 -170
  50. scikit_learn_intelex-2024.2.0.data/data/Lib/site-packages/sklearnex/tests/test_monkeypatch.py +0 -240
  51. scikit_learn_intelex-2024.2.0.data/data/Lib/site-packages/sklearnex/tests/test_patching.py +0 -136
  52. scikit_learn_intelex-2024.2.0.data/data/Lib/site-packages/sklearnex/tests/utils/_launch_algorithms.py +0 -118
  53. scikit_learn_intelex-2024.2.0.dist-info/RECORD +0 -101
  54. {scikit_learn_intelex-2024.2.0.data → scikit_learn_intelex-2024.4.0.data}/data/Lib/site-packages/sklearnex/__main__.py +0 -0
  55. {scikit_learn_intelex-2024.2.0.data → scikit_learn_intelex-2024.4.0.data}/data/Lib/site-packages/sklearnex/_config.py +0 -0
  56. {scikit_learn_intelex-2024.2.0.data → scikit_learn_intelex-2024.4.0.data}/data/Lib/site-packages/sklearnex/_utils.py +0 -0
  57. {scikit_learn_intelex-2024.2.0.data → scikit_learn_intelex-2024.4.0.data}/data/Lib/site-packages/sklearnex/basic_statistics/basic_statistics.py +0 -0
  58. {scikit_learn_intelex-2024.2.0.data → scikit_learn_intelex-2024.4.0.data}/data/Lib/site-packages/sklearnex/cluster/__init__.py +0 -0
  59. {scikit_learn_intelex-2024.2.0.data → scikit_learn_intelex-2024.4.0.data}/data/Lib/site-packages/sklearnex/cluster/k_means.py +0 -0
  60. {scikit_learn_intelex-2024.2.0.data → scikit_learn_intelex-2024.4.0.data}/data/Lib/site-packages/sklearnex/cluster/tests/test_dbscan.py +0 -0
  61. {scikit_learn_intelex-2024.2.0.data → scikit_learn_intelex-2024.4.0.data}/data/Lib/site-packages/sklearnex/cluster/tests/test_kmeans.py +0 -0
  62. {scikit_learn_intelex-2024.2.0.data → scikit_learn_intelex-2024.4.0.data}/data/Lib/site-packages/sklearnex/covariance/__init__.py +0 -0
  63. {scikit_learn_intelex-2024.2.0.data → scikit_learn_intelex-2024.4.0.data}/data/Lib/site-packages/sklearnex/covariance/incremental_covariance.py +0 -0
  64. {scikit_learn_intelex-2024.2.0.data → scikit_learn_intelex-2024.4.0.data}/data/Lib/site-packages/sklearnex/covariance/tests/test_incremental_covariance.py +0 -0
  65. {scikit_learn_intelex-2024.2.0.data → scikit_learn_intelex-2024.4.0.data}/data/Lib/site-packages/sklearnex/decomposition/__init__.py +0 -0
  66. {scikit_learn_intelex-2024.2.0.data → scikit_learn_intelex-2024.4.0.data}/data/Lib/site-packages/sklearnex/doc/third-party-programs.txt +0 -0
  67. {scikit_learn_intelex-2024.2.0.data → scikit_learn_intelex-2024.4.0.data}/data/Lib/site-packages/sklearnex/ensemble/__init__.py +0 -0
  68. {scikit_learn_intelex-2024.2.0.data → scikit_learn_intelex-2024.4.0.data}/data/Lib/site-packages/sklearnex/glob/__main__.py +0 -0
  69. {scikit_learn_intelex-2024.2.0.data → scikit_learn_intelex-2024.4.0.data}/data/Lib/site-packages/sklearnex/glob/dispatcher.py +0 -0
  70. {scikit_learn_intelex-2024.2.0.data → scikit_learn_intelex-2024.4.0.data}/data/Lib/site-packages/sklearnex/linear_model/__init__.py +0 -0
  71. {scikit_learn_intelex-2024.2.0.data → scikit_learn_intelex-2024.4.0.data}/data/Lib/site-packages/sklearnex/linear_model/coordinate_descent.py +0 -0
  72. {scikit_learn_intelex-2024.2.0.data → scikit_learn_intelex-2024.4.0.data}/data/Lib/site-packages/sklearnex/linear_model/logistic_path.py +0 -0
  73. {scikit_learn_intelex-2024.2.0.data → scikit_learn_intelex-2024.4.0.data}/data/Lib/site-packages/sklearnex/linear_model/ridge.py +0 -0
  74. {scikit_learn_intelex-2024.2.0.data → scikit_learn_intelex-2024.4.0.data}/data/Lib/site-packages/sklearnex/manifold/__init__.py +0 -0
  75. {scikit_learn_intelex-2024.2.0.data → scikit_learn_intelex-2024.4.0.data}/data/Lib/site-packages/sklearnex/manifold/t_sne.py +0 -0
  76. {scikit_learn_intelex-2024.2.0.data → scikit_learn_intelex-2024.4.0.data}/data/Lib/site-packages/sklearnex/manifold/tests/test_tsne.py +0 -0
  77. {scikit_learn_intelex-2024.2.0.data → scikit_learn_intelex-2024.4.0.data}/data/Lib/site-packages/sklearnex/metrics/__init__.py +0 -0
  78. {scikit_learn_intelex-2024.2.0.data → scikit_learn_intelex-2024.4.0.data}/data/Lib/site-packages/sklearnex/metrics/pairwise.py +0 -0
  79. {scikit_learn_intelex-2024.2.0.data → scikit_learn_intelex-2024.4.0.data}/data/Lib/site-packages/sklearnex/metrics/ranking.py +0 -0
  80. {scikit_learn_intelex-2024.2.0.data → scikit_learn_intelex-2024.4.0.data}/data/Lib/site-packages/sklearnex/metrics/tests/test_metrics.py +0 -0
  81. {scikit_learn_intelex-2024.2.0.data → scikit_learn_intelex-2024.4.0.data}/data/Lib/site-packages/sklearnex/model_selection/__init__.py +0 -0
  82. {scikit_learn_intelex-2024.2.0.data → scikit_learn_intelex-2024.4.0.data}/data/Lib/site-packages/sklearnex/model_selection/split.py +0 -0
  83. {scikit_learn_intelex-2024.2.0.data → scikit_learn_intelex-2024.4.0.data}/data/Lib/site-packages/sklearnex/model_selection/tests/test_model_selection.py +0 -0
  84. {scikit_learn_intelex-2024.2.0.data → scikit_learn_intelex-2024.4.0.data}/data/Lib/site-packages/sklearnex/neighbors/__init__.py +0 -0
  85. {scikit_learn_intelex-2024.2.0.data → scikit_learn_intelex-2024.4.0.data}/data/Lib/site-packages/sklearnex/preview/cluster/__init__.py +0 -0
  86. {scikit_learn_intelex-2024.2.0.data → scikit_learn_intelex-2024.4.0.data}/data/Lib/site-packages/sklearnex/preview/cluster/_common.py +0 -0
  87. {scikit_learn_intelex-2024.2.0.data → scikit_learn_intelex-2024.4.0.data}/data/Lib/site-packages/sklearnex/preview/covariance/__init__.py +0 -0
  88. {scikit_learn_intelex-2024.2.0.data → scikit_learn_intelex-2024.4.0.data}/data/Lib/site-packages/sklearnex/spmd/__init__.py +0 -0
  89. {scikit_learn_intelex-2024.2.0.data/data/Lib/site-packages/sklearnex → scikit_learn_intelex-2024.4.0.data/data/Lib/site-packages/sklearnex/spmd}/basic_statistics/__init__.py +0 -0
  90. {scikit_learn_intelex-2024.2.0.data → scikit_learn_intelex-2024.4.0.data}/data/Lib/site-packages/sklearnex/spmd/basic_statistics/basic_statistics.py +0 -0
  91. {scikit_learn_intelex-2024.2.0.data → scikit_learn_intelex-2024.4.0.data}/data/Lib/site-packages/sklearnex/spmd/cluster/__init__.py +0 -0
  92. {scikit_learn_intelex-2024.2.0.data → scikit_learn_intelex-2024.4.0.data}/data/Lib/site-packages/sklearnex/spmd/cluster/dbscan.py +0 -0
  93. {scikit_learn_intelex-2024.2.0.data → scikit_learn_intelex-2024.4.0.data}/data/Lib/site-packages/sklearnex/spmd/cluster/kmeans.py +0 -0
  94. {scikit_learn_intelex-2024.2.0.data → scikit_learn_intelex-2024.4.0.data}/data/Lib/site-packages/sklearnex/spmd/covariance/__init__.py +0 -0
  95. {scikit_learn_intelex-2024.2.0.data → scikit_learn_intelex-2024.4.0.data}/data/Lib/site-packages/sklearnex/spmd/covariance/covariance.py +0 -0
  96. {scikit_learn_intelex-2024.2.0.data → scikit_learn_intelex-2024.4.0.data}/data/Lib/site-packages/sklearnex/spmd/decomposition/__init__.py +0 -0
  97. {scikit_learn_intelex-2024.2.0.data → scikit_learn_intelex-2024.4.0.data}/data/Lib/site-packages/sklearnex/spmd/decomposition/pca.py +0 -0
  98. {scikit_learn_intelex-2024.2.0.data → scikit_learn_intelex-2024.4.0.data}/data/Lib/site-packages/sklearnex/spmd/ensemble/__init__.py +0 -0
  99. {scikit_learn_intelex-2024.2.0.data → scikit_learn_intelex-2024.4.0.data}/data/Lib/site-packages/sklearnex/spmd/linear_model/__init__.py +0 -0
  100. {scikit_learn_intelex-2024.2.0.data → scikit_learn_intelex-2024.4.0.data}/data/Lib/site-packages/sklearnex/spmd/linear_model/linear_model.py +0 -0
  101. {scikit_learn_intelex-2024.2.0.data → scikit_learn_intelex-2024.4.0.data}/data/Lib/site-packages/sklearnex/spmd/linear_model/logistic_regression.py +0 -0
  102. {scikit_learn_intelex-2024.2.0.data → scikit_learn_intelex-2024.4.0.data}/data/Lib/site-packages/sklearnex/spmd/neighbors/__init__.py +0 -0
  103. {scikit_learn_intelex-2024.2.0.data → scikit_learn_intelex-2024.4.0.data}/data/Lib/site-packages/sklearnex/spmd/neighbors/neighbors.py +0 -0
  104. {scikit_learn_intelex-2024.2.0.data → scikit_learn_intelex-2024.4.0.data}/data/Lib/site-packages/sklearnex/svm/__init__.py +0 -0
  105. {scikit_learn_intelex-2024.2.0.data → scikit_learn_intelex-2024.4.0.data}/data/Lib/site-packages/sklearnex/svm/tests/test_svm.py +0 -0
  106. {scikit_learn_intelex-2024.2.0.data → scikit_learn_intelex-2024.4.0.data}/data/Lib/site-packages/sklearnex/tests/test_config.py +0 -0
  107. {scikit_learn_intelex-2024.2.0.data → scikit_learn_intelex-2024.4.0.data}/data/Lib/site-packages/sklearnex/tests/test_run_to_run_stability_tests.py +0 -0
  108. {scikit_learn_intelex-2024.2.0.data → scikit_learn_intelex-2024.4.0.data}/data/Lib/site-packages/sklearnex/utils/parallel.py +0 -0
  109. {scikit_learn_intelex-2024.2.0.data → scikit_learn_intelex-2024.4.0.data}/data/Lib/site-packages/sklearnex/utils/validation.py +0 -0
  110. {scikit_learn_intelex-2024.2.0.dist-info → scikit_learn_intelex-2024.4.0.dist-info}/LICENSE.txt +0 -0
  111. {scikit_learn_intelex-2024.2.0.dist-info → scikit_learn_intelex-2024.4.0.dist-info}/WHEEL +0 -0
  112. {scikit_learn_intelex-2024.2.0.dist-info → scikit_learn_intelex-2024.4.0.dist-info}/top_level.txt +0 -0
@@ -0,0 +1,335 @@
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 logging
18
+
19
+ from daal4py.sklearn._utils import daal_check_version
20
+
21
+ if daal_check_version((2024, "P", 100)):
22
+ import numbers
23
+ from math import sqrt
24
+
25
+ import numpy as np
26
+ from scipy.sparse import issparse
27
+ from sklearn.utils.validation import check_is_fitted
28
+
29
+ from daal4py.sklearn._n_jobs_support import control_n_jobs
30
+ from daal4py.sklearn._utils import sklearn_check_version
31
+
32
+ from .._device_offload import dispatch, wrap_output_data
33
+ from .._utils import PatchingConditionsChain
34
+
35
+ if sklearn_check_version("1.1") and not sklearn_check_version("1.2"):
36
+ from sklearn.utils import check_scalar
37
+
38
+ from sklearn.decomposition import PCA as sklearn_PCA
39
+
40
+ from onedal.decomposition import PCA as onedal_PCA
41
+
42
+ @control_n_jobs(decorated_methods=["fit", "transform", "fit_transform"])
43
+ class PCA(sklearn_PCA):
44
+ __doc__ = sklearn_PCA.__doc__
45
+
46
+ if sklearn_check_version("1.2"):
47
+ _parameter_constraints: dict = {**sklearn_PCA._parameter_constraints}
48
+
49
+ if sklearn_check_version("1.1"):
50
+
51
+ def __init__(
52
+ self,
53
+ n_components=None,
54
+ *,
55
+ copy=True,
56
+ whiten=False,
57
+ svd_solver="auto",
58
+ tol=0.0,
59
+ iterated_power="auto",
60
+ n_oversamples=10,
61
+ power_iteration_normalizer="auto",
62
+ random_state=None,
63
+ ):
64
+ self.n_components = n_components
65
+ self.copy = copy
66
+ self.whiten = whiten
67
+ self.svd_solver = svd_solver
68
+ self.tol = tol
69
+ self.iterated_power = iterated_power
70
+ self.n_oversamples = n_oversamples
71
+ self.power_iteration_normalizer = power_iteration_normalizer
72
+ self.random_state = random_state
73
+
74
+ else:
75
+
76
+ def __init__(
77
+ self,
78
+ n_components=None,
79
+ copy=True,
80
+ whiten=False,
81
+ svd_solver="auto",
82
+ tol=0.0,
83
+ iterated_power="auto",
84
+ random_state=None,
85
+ ):
86
+ self.n_components = n_components
87
+ self.copy = copy
88
+ self.whiten = whiten
89
+ self.svd_solver = svd_solver
90
+ self.tol = tol
91
+ self.iterated_power = iterated_power
92
+ self.random_state = random_state
93
+
94
+ def fit(self, X, y=None):
95
+ self._fit(X)
96
+ return self
97
+
98
+ @wrap_output_data
99
+ def _fit(self, X):
100
+ if sklearn_check_version("1.2"):
101
+ self._validate_params()
102
+ elif sklearn_check_version("1.1"):
103
+ check_scalar(
104
+ self.n_oversamples,
105
+ "n_oversamples",
106
+ min_val=1,
107
+ target_type=numbers.Integral,
108
+ )
109
+
110
+ U, S, Vt = dispatch(
111
+ self,
112
+ "fit",
113
+ {
114
+ "onedal": self.__class__._onedal_fit,
115
+ "sklearn": sklearn_PCA._fit,
116
+ },
117
+ X,
118
+ )
119
+ return U, S, Vt
120
+
121
+ def _onedal_fit(self, X, queue=None):
122
+ X = self._validate_data(
123
+ X,
124
+ dtype=[np.float64, np.float32],
125
+ ensure_2d=True,
126
+ copy=self.copy,
127
+ )
128
+
129
+ onedal_params = {
130
+ "n_components": self.n_components,
131
+ "is_deterministic": True,
132
+ "method": "cov",
133
+ "whiten": self.whiten,
134
+ }
135
+ self._onedal_estimator = onedal_PCA(**onedal_params)
136
+ self._onedal_estimator.fit(X, queue=queue)
137
+ self._save_attributes()
138
+
139
+ U = None
140
+ S = self.singular_values_
141
+ Vt = self.components_
142
+
143
+ return U, S, Vt
144
+
145
+ @wrap_output_data
146
+ def transform(self, X):
147
+ return dispatch(
148
+ self,
149
+ "transform",
150
+ {
151
+ "onedal": self.__class__._onedal_transform,
152
+ "sklearn": sklearn_PCA.transform,
153
+ },
154
+ X,
155
+ )
156
+
157
+ def _onedal_transform(self, X, queue=None):
158
+ check_is_fitted(self)
159
+ X = self._validate_data(
160
+ X,
161
+ dtype=[np.float64, np.float32],
162
+ reset=False,
163
+ )
164
+ self._validate_n_features_in_after_fitting(X)
165
+ if sklearn_check_version("1.0"):
166
+ self._check_feature_names(X, reset=False)
167
+
168
+ return self._onedal_estimator.predict(X, queue=queue)
169
+
170
+ def fit_transform(self, X, y=None):
171
+ U, S, Vt = self._fit(X)
172
+ if U is None:
173
+ # oneDAL PCA was fit
174
+ return self.transform(X)
175
+ else:
176
+ # Scikit-learn PCA was fit
177
+ U = U[:, : self.n_components_]
178
+
179
+ if self.whiten:
180
+ U *= sqrt(X.shape[0] - 1)
181
+ else:
182
+ U *= S[: self.n_components_]
183
+
184
+ return U
185
+
186
+ def _onedal_supported(self, method_name, X):
187
+ class_name = self.__class__.__name__
188
+ patching_status = PatchingConditionsChain(
189
+ f"sklearn.decomposition.{class_name}.{method_name}"
190
+ )
191
+
192
+ if method_name == "fit":
193
+ shape_tuple, _is_shape_compatible = self._get_shape_compatibility(X)
194
+ patching_status.and_conditions(
195
+ [
196
+ (
197
+ _is_shape_compatible,
198
+ "Data shape is not compatible.",
199
+ ),
200
+ (
201
+ self._is_solver_compatible_with_onedal(shape_tuple),
202
+ f"Only 'full' svd solver is supported.",
203
+ ),
204
+ (not issparse(X), "oneDAL PCA does not support sparse data"),
205
+ ]
206
+ )
207
+ return patching_status
208
+
209
+ if method_name == "transform":
210
+ patching_status.and_conditions(
211
+ [
212
+ (
213
+ hasattr(self, "_onedal_estimator"),
214
+ "oneDAL model was not trained",
215
+ ),
216
+ ]
217
+ )
218
+ return patching_status
219
+
220
+ raise RuntimeError(
221
+ f"Unknown method {method_name} in {self.__class__.__name__}"
222
+ )
223
+
224
+ def _onedal_cpu_supported(self, method_name, *data):
225
+ return self._onedal_supported(method_name, *data)
226
+
227
+ def _onedal_gpu_supported(self, method_name, *data):
228
+ return self._onedal_supported(method_name, *data)
229
+
230
+ def _get_shape_compatibility(self, X):
231
+ _is_shape_compatible = False
232
+ _empty_shape = (0, 0)
233
+ if hasattr(X, "shape"):
234
+ shape_tuple = X.shape
235
+ if len(shape_tuple) == 1:
236
+ shape_tuple = (1, shape_tuple[0])
237
+ elif isinstance(X, list):
238
+ if np.ndim(X) == 1:
239
+ shape_tuple = (1, len(X))
240
+ elif np.ndim(X) == 2:
241
+ shape_tuple = (len(X), len(X[0]))
242
+ else:
243
+ return _empty_shape, _is_shape_compatible
244
+
245
+ if shape_tuple[0] > 0 and shape_tuple[1] > 0 and len(shape_tuple) == 2:
246
+ _is_shape_compatible = shape_tuple[1] / shape_tuple[0] < 2
247
+
248
+ return shape_tuple, _is_shape_compatible
249
+
250
+ def _is_solver_compatible_with_onedal(self, shape_tuple):
251
+ self._fit_svd_solver = self.svd_solver
252
+ n_sf_min = min(shape_tuple)
253
+ n_components = n_sf_min if self.n_components is None else self.n_components
254
+
255
+ if self._fit_svd_solver == "auto":
256
+ if sklearn_check_version("1.1"):
257
+ if max(shape_tuple) <= 500 or n_components == "mle":
258
+ self._fit_svd_solver = "full"
259
+ elif 1 <= n_components < 0.8 * n_sf_min:
260
+ self._fit_svd_solver = "randomized"
261
+ else:
262
+ self._fit_svd_solver = "full"
263
+ else:
264
+ if n_components == "mle":
265
+ self._fit_svd_solver = "full"
266
+ else:
267
+ # check if sklearnex is faster than randomized sklearn
268
+ # Refer to daal4py
269
+ regression_coefs = np.array(
270
+ [
271
+ [
272
+ 9.779873e-11,
273
+ shape_tuple[0] * shape_tuple[1] * n_components,
274
+ ],
275
+ [
276
+ -1.122062e-11,
277
+ shape_tuple[0] * shape_tuple[1] * shape_tuple[1],
278
+ ],
279
+ [1.127905e-09, shape_tuple[0] ** 2],
280
+ ]
281
+ )
282
+ if (
283
+ n_components >= 1
284
+ and np.dot(regression_coefs[:, 0], regression_coefs[:, 1])
285
+ <= 0
286
+ ):
287
+ self._fit_svd_solver = "randomized"
288
+ else:
289
+ self._fit_svd_solver = "full"
290
+
291
+ if self._fit_svd_solver == "full":
292
+ return True
293
+ else:
294
+ return False
295
+
296
+ def _save_attributes(self):
297
+ self.n_samples_ = self._onedal_estimator.n_samples_
298
+ if sklearn_check_version("1.2"):
299
+ self.n_features_in_ = self._onedal_estimator.n_features_
300
+ else:
301
+ self.n_features_ = self._onedal_estimator.n_features_
302
+ self.n_features_in_ = self._onedal_estimator.n_features_
303
+ self.n_components_ = self._onedal_estimator.n_components_
304
+ self.components_ = self._onedal_estimator.components_
305
+ self.mean_ = self._onedal_estimator.mean_
306
+ self.singular_values_ = self._onedal_estimator.singular_values_
307
+ self.explained_variance_ = self._onedal_estimator.explained_variance_.ravel()
308
+ self.explained_variance_ratio_ = (
309
+ self._onedal_estimator.explained_variance_ratio_
310
+ )
311
+ self.noise_variance_ = self._onedal_estimator.noise_variance_
312
+
313
+ def _validate_n_features_in_after_fitting(self, X):
314
+ if sklearn_check_version("1.2"):
315
+ expected_n_features = self.n_features_in_
316
+ else:
317
+ expected_n_features = self.n_features_
318
+ if X.shape[1] != expected_n_features:
319
+ raise ValueError(
320
+ (
321
+ f"X has {X.shape[1]} features, "
322
+ f"but PCA is expecting {expected_n_features} features as input"
323
+ )
324
+ )
325
+
326
+ fit.__doc__ = sklearn_PCA.fit.__doc__
327
+ transform.__doc__ = sklearn_PCA.transform.__doc__
328
+ fit_transform.__doc__ = sklearn_PCA.fit_transform.__doc__
329
+
330
+ else:
331
+ from daal4py.sklearn.decomposition import PCA
332
+
333
+ logging.warning(
334
+ "Sklearnex PCA requires oneDAL version >= 2024.1.0 but it was not found"
335
+ )
@@ -27,16 +27,30 @@ from onedal.tests.utils._dataframes_support import (
27
27
 
28
28
 
29
29
  @pytest.mark.parametrize("dataframe,queue", get_dataframes_and_queues())
30
- @pytest.mark.parametrize("macro_block", [None, 1024])
31
- def test_sklearnex_import(dataframe, queue, macro_block):
32
- from sklearnex.preview.decomposition import PCA
30
+ def test_sklearnex_import(dataframe, queue):
31
+ from sklearnex.decomposition import PCA
33
32
 
34
33
  X = [[-1, -1], [-2, -1], [-3, -2], [1, 1], [2, 1], [3, 2]]
35
34
  X = _convert_to_dataframe(X, sycl_queue=queue, target_df=dataframe)
35
+ X_transformed_expected = [
36
+ [-1.38340578, -0.2935787],
37
+ [-2.22189802, 0.25133484],
38
+ [-3.6053038, -0.04224385],
39
+ [1.38340578, 0.2935787],
40
+ [2.22189802, -0.25133484],
41
+ [3.6053038, 0.04224385],
42
+ ]
43
+
36
44
  pca = PCA(n_components=2, svd_solver="full")
37
- if daal_check_version((2024, "P", 0)) and macro_block is not None:
38
- pca.get_hyperparameters("fit").cpu_macro_block = macro_block
39
45
  pca.fit(X)
40
- assert "sklearnex" in pca.__module__
41
- assert hasattr(pca, "_onedal_estimator")
42
- assert_allclose(_as_numpy(pca.singular_values_), [6.30061232, 0.54980396])
46
+ X_transformed = pca.transform(X)
47
+ X_fit_transformed = PCA(n_components=2, svd_solver="full").fit_transform(X)
48
+
49
+ if daal_check_version((2024, "P", 100)):
50
+ assert "sklearnex" in pca.__module__
51
+ assert hasattr(pca, "_onedal_estimator")
52
+ else:
53
+ assert "daal4py" in pca.__module__
54
+ assert_allclose([6.30061232, 0.54980396], _as_numpy(pca.singular_values_))
55
+ assert_allclose(X_transformed_expected, _as_numpy(X_transformed))
56
+ assert_allclose(X_transformed_expected, _as_numpy(X_fit_transformed))
@@ -1,5 +1,6 @@
1
1
  # ==============================================================================
2
2
  # Copyright 2021 Intel Corporation
3
+ # Copyright 2024 Fujitsu Limited
3
4
  #
4
5
  # Licensed under the Apache License, Version 2.0 (the "License");
5
6
  # you may not use this file except in compliance with the License.
@@ -22,7 +23,7 @@ from daal4py.sklearn._utils import daal_check_version, sklearn_check_version
22
23
 
23
24
 
24
25
  def _is_new_patching_available():
25
- return os.environ.get("OFF_ONEDAL_IFACE") is None and daal_check_version(
26
+ return os.environ.get("OFF_ONEDAL_IFACE", "0") == "0" and daal_check_version(
26
27
  (2021, "P", 300)
27
28
  )
28
29
 
@@ -32,16 +33,66 @@ def _is_preview_enabled():
32
33
 
33
34
 
34
35
  @lru_cache(maxsize=None)
35
- def get_patch_map():
36
+ def get_patch_map_core(preview=False):
37
+ if preview:
38
+ # use recursion to guarantee that state of preview
39
+ # and non-preview maps are done at the same time.
40
+ # The two lru_cache dicts are actually one underneath.
41
+ # Preview is always secondary. Both sklearnex patch
42
+ # maps are referring to the daal4py dict unless the
43
+ # key has been replaced. Use with caution.
44
+ mapping = get_patch_map_core().copy()
45
+
46
+ if _is_new_patching_available():
47
+ import sklearn.covariance as covariance_module
48
+
49
+ # Preview classes for patching
50
+ from .preview.cluster import KMeans as KMeans_sklearnex
51
+ from .preview.covariance import (
52
+ EmpiricalCovariance as EmpiricalCovariance_sklearnex,
53
+ )
54
+
55
+ # Since the state of the lru_cache without preview cannot be
56
+ # guaranteed to not have already enabled sklearnex algorithms
57
+ # when preview is used, setting the mapping element[1] to None
58
+ # should NOT be done. This may lose track of the unpatched
59
+ # sklearn estimator or function.
60
+ # KMeans
61
+ cluster_module, _, _ = mapping["kmeans"][0][0]
62
+ sklearn_obj = mapping["kmeans"][0][1]
63
+ mapping.pop("kmeans")
64
+ mapping["kmeans"] = [
65
+ [(cluster_module, "kmeans", KMeans_sklearnex), sklearn_obj]
66
+ ]
67
+
68
+ # Covariance
69
+ mapping["empiricalcovariance"] = [
70
+ [
71
+ (
72
+ covariance_module,
73
+ "EmpiricalCovariance",
74
+ EmpiricalCovariance_sklearnex,
75
+ ),
76
+ None,
77
+ ]
78
+ ]
79
+ return mapping
80
+
36
81
  from daal4py.sklearn.monkeypatch.dispatcher import _get_map_of_algorithms
37
82
 
83
+ # NOTE: this is a shallow copy of a dict, modification is dangerous
38
84
  mapping = _get_map_of_algorithms().copy()
39
85
 
86
+ # NOTE: Use of daal4py _get_map_of_algorithms and
87
+ # get_patch_map/get_patch_map_core should not be used concurrently.
88
+ # The setting of elements to None below may cause loss of state
89
+ # when interacting with sklearn. A dictionary key must not be
90
+ # modified but totally replaced, otherwise it will cause chaos.
91
+ # Hence why pop is being used.
40
92
  if _is_new_patching_available():
41
93
  # Scikit-learn* modules
42
94
  import sklearn as base_module
43
95
  import sklearn.cluster as cluster_module
44
- import sklearn.covariance as covariance_module
45
96
  import sklearn.decomposition as decomposition_module
46
97
  import sklearn.ensemble as ensemble_module
47
98
  import sklearn.linear_model as linear_model_module
@@ -64,6 +115,7 @@ def get_patch_map():
64
115
  from .utils.parallel import _FuncWrapperOld as _FuncWrapper_sklearnex
65
116
 
66
117
  from .cluster import DBSCAN as DBSCAN_sklearnex
118
+ from .decomposition import PCA as PCA_sklearnex
67
119
  from .ensemble import ExtraTreesClassifier as ExtraTreesClassifier_sklearnex
68
120
  from .ensemble import ExtraTreesRegressor as ExtraTreesRegressor_sklearnex
69
121
  from .ensemble import RandomForestClassifier as RandomForestClassifier_sklearnex
@@ -74,53 +126,19 @@ def get_patch_map():
74
126
  from .neighbors import KNeighborsRegressor as KNeighborsRegressor_sklearnex
75
127
  from .neighbors import LocalOutlierFactor as LocalOutlierFactor_sklearnex
76
128
  from .neighbors import NearestNeighbors as NearestNeighbors_sklearnex
77
-
78
- # Preview classes for patching
79
- from .preview.cluster import KMeans as KMeans_sklearnex
80
- from .preview.covariance import (
81
- EmpiricalCovariance as EmpiricalCovariance_sklearnex,
82
- )
83
- from .preview.decomposition import PCA as PCA_sklearnex
84
129
  from .svm import SVC as SVC_sklearnex
85
130
  from .svm import SVR as SVR_sklearnex
86
131
  from .svm import NuSVC as NuSVC_sklearnex
87
132
  from .svm import NuSVR as NuSVR_sklearnex
88
133
 
89
- # Patch for mapping
90
- if _is_preview_enabled():
91
- # PCA
92
- mapping.pop("pca")
93
- mapping["pca"] = [[(decomposition_module, "PCA", PCA_sklearnex), None]]
94
-
95
- # KMeans
96
- mapping.pop("kmeans")
97
- mapping["kmeans"] = [
98
- [
99
- (
100
- cluster_module,
101
- "KMeans",
102
- KMeans_sklearnex,
103
- ),
104
- None,
105
- ]
106
- ]
107
-
108
- # Covariance
109
- mapping["empiricalcovariance"] = [
110
- [
111
- (
112
- covariance_module,
113
- "EmpiricalCovariance",
114
- EmpiricalCovariance_sklearnex,
115
- ),
116
- None,
117
- ]
118
- ]
119
-
120
134
  # DBSCAN
121
135
  mapping.pop("dbscan")
122
136
  mapping["dbscan"] = [[(cluster_module, "DBSCAN", DBSCAN_sklearnex), None]]
123
137
 
138
+ # PCA
139
+ mapping.pop("pca")
140
+ mapping["pca"] = [[(decomposition_module, "PCA", PCA_sklearnex), None]]
141
+
124
142
  # SVM
125
143
  mapping.pop("svm")
126
144
  mapping.pop("svc")
@@ -276,6 +294,19 @@ def get_patch_map():
276
294
  return mapping
277
295
 
278
296
 
297
+ # This is necessary to properly cache the patch_map when
298
+ # using preview.
299
+ def get_patch_map():
300
+ preview = _is_preview_enabled()
301
+ return get_patch_map_core(preview=preview)
302
+
303
+
304
+ get_patch_map.cache_clear = get_patch_map_core.cache_clear
305
+
306
+
307
+ get_patch_map.cache_info = get_patch_map_core.cache_info
308
+
309
+
279
310
  def get_patch_names():
280
311
  return list(get_patch_map().keys())
281
312
 
@@ -283,10 +314,10 @@ def get_patch_names():
283
314
  def patch_sklearn(name=None, verbose=True, global_patch=False, preview=False):
284
315
  if preview:
285
316
  os.environ["SKLEARNEX_PREVIEW"] = "enabled_via_patch_sklearn"
286
- if not sklearn_check_version("0.22"):
317
+ if not sklearn_check_version("0.24"):
287
318
  raise NotImplementedError(
288
319
  "Intel(R) Extension for Scikit-learn* patches apply "
289
- "for scikit-learn >= 0.22 only ..."
320
+ "for scikit-learn >= 0.24 only ..."
290
321
  )
291
322
 
292
323
  if global_patch: