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
@@ -21,6 +21,7 @@ from daal4py.sklearn._utils import daal_check_version
21
21
  if daal_check_version((2024, "P", 100)):
22
22
  import numbers
23
23
  from math import sqrt
24
+ from warnings import warn
24
25
 
25
26
  import numpy as np
26
27
  from scipy.sparse import issparse
@@ -35,9 +36,13 @@ if daal_check_version((2024, "P", 100)):
35
36
  if sklearn_check_version("1.1") and not sklearn_check_version("1.2"):
36
37
  from sklearn.utils import check_scalar
37
38
 
39
+ if sklearn_check_version("1.2"):
40
+ from sklearn.utils._param_validation import StrOptions
41
+
38
42
  from sklearn.decomposition import PCA as sklearn_PCA
39
43
 
40
44
  from onedal.decomposition import PCA as onedal_PCA
45
+ from sklearnex.utils import get_namespace
41
46
 
42
47
  @control_n_jobs(decorated_methods=["fit", "transform", "fit_transform"])
43
48
  class PCA(sklearn_PCA):
@@ -45,6 +50,16 @@ if daal_check_version((2024, "P", 100)):
45
50
 
46
51
  if sklearn_check_version("1.2"):
47
52
  _parameter_constraints: dict = {**sklearn_PCA._parameter_constraints}
53
+ # "onedal_svd" solver uses oneDAL's PCA-SVD algorithm
54
+ # and required for testing purposes to fully enable it in future.
55
+ # "covariance_eigh" solver is added for ability to explicitly request
56
+ # oneDAL's PCA-Covariance algorithm using any sklearn version < 1.5.
57
+ _parameter_constraints["svd_solver"] = [
58
+ StrOptions(
59
+ _parameter_constraints["svd_solver"][0].options
60
+ | {"onedal_svd", "covariance_eigh"}
61
+ )
62
+ ]
48
63
 
49
64
  if sklearn_check_version("1.1"):
50
65
 
@@ -107,7 +122,7 @@ if daal_check_version((2024, "P", 100)):
107
122
  target_type=numbers.Integral,
108
123
  )
109
124
 
110
- U, S, Vt = dispatch(
125
+ return dispatch(
111
126
  self,
112
127
  "fit",
113
128
  {
@@ -116,7 +131,6 @@ if daal_check_version((2024, "P", 100)):
116
131
  },
117
132
  X,
118
133
  )
119
- return U, S, Vt
120
134
 
121
135
  def _onedal_fit(self, X, queue=None):
122
136
  X = self._validate_data(
@@ -129,7 +143,7 @@ if daal_check_version((2024, "P", 100)):
129
143
  onedal_params = {
130
144
  "n_components": self.n_components,
131
145
  "is_deterministic": True,
132
- "method": "cov",
146
+ "method": "svd" if self._fit_svd_solver == "onedal_svd" else "cov",
133
147
  "whiten": self.whiten,
134
148
  }
135
149
  self._onedal_estimator = onedal_PCA(**onedal_params)
@@ -140,7 +154,13 @@ if daal_check_version((2024, "P", 100)):
140
154
  S = self.singular_values_
141
155
  Vt = self.components_
142
156
 
143
- return U, S, Vt
157
+ if sklearn_check_version("1.5"):
158
+ xp, _ = get_namespace(X)
159
+ x_is_centered = not self.copy
160
+
161
+ return U, S, Vt, X, x_is_centered, xp
162
+ else:
163
+ return U, S, Vt
144
164
 
145
165
  @wrap_output_data
146
166
  def transform(self, X):
@@ -156,32 +176,39 @@ if daal_check_version((2024, "P", 100)):
156
176
 
157
177
  def _onedal_transform(self, X, queue=None):
158
178
  check_is_fitted(self)
179
+ if sklearn_check_version("1.0"):
180
+ self._check_feature_names(X, reset=False)
159
181
  X = self._validate_data(
160
182
  X,
161
183
  dtype=[np.float64, np.float32],
162
184
  reset=False,
163
185
  )
164
186
  self._validate_n_features_in_after_fitting(X)
165
- if sklearn_check_version("1.0"):
166
- self._check_feature_names(X, reset=False)
167
187
 
168
188
  return self._onedal_estimator.predict(X, queue=queue)
169
189
 
170
190
  def fit_transform(self, X, y=None):
171
- U, S, Vt = self._fit(X)
172
- if U is None:
191
+ if sklearn_check_version("1.5"):
192
+ U, S, Vt, X_fit, x_is_centered, xp = self._fit(X)
193
+ else:
194
+ U, S, Vt = self._fit(X)
195
+ X_fit = X
196
+ if hasattr(self, "_onedal_estimator"):
173
197
  # oneDAL PCA was fit
174
198
  return self.transform(X)
175
- else:
199
+ elif U is not None:
176
200
  # Scikit-learn PCA was fit
177
201
  U = U[:, : self.n_components_]
178
202
 
179
203
  if self.whiten:
180
- U *= sqrt(X.shape[0] - 1)
204
+ U *= sqrt(X_fit.shape[0] - 1)
181
205
  else:
182
206
  U *= S[: self.n_components_]
183
207
 
184
208
  return U
209
+ else:
210
+ # Scikit-learn PCA["covariance_eigh"] was fit
211
+ return self._transform(X_fit, xp, x_is_centered=x_is_centered)
185
212
 
186
213
  def _onedal_supported(self, method_name, X):
187
214
  class_name = self.__class__.__name__
@@ -199,7 +226,13 @@ if daal_check_version((2024, "P", 100)):
199
226
  ),
200
227
  (
201
228
  self._is_solver_compatible_with_onedal(shape_tuple),
202
- f"Only 'full' svd solver is supported.",
229
+ (
230
+ "Only 'covariance_eigh' and 'onedal_svd' "
231
+ "solvers are supported."
232
+ if sklearn_check_version("1.5")
233
+ else "Only 'full', 'covariance_eigh' and 'onedal_svd' "
234
+ "solvers are supported."
235
+ ),
203
236
  ),
204
237
  (not issparse(X), "oneDAL PCA does not support sparse data"),
205
238
  ]
@@ -254,7 +287,13 @@ if daal_check_version((2024, "P", 100)):
254
287
 
255
288
  if self._fit_svd_solver == "auto":
256
289
  if sklearn_check_version("1.1"):
257
- if max(shape_tuple) <= 500 or n_components == "mle":
290
+ if (
291
+ sklearn_check_version("1.5")
292
+ and shape_tuple[1] <= 1_000
293
+ and shape_tuple[0] >= 10 * shape_tuple[1]
294
+ ):
295
+ self._fit_svd_solver = "covariance_eigh"
296
+ elif max(shape_tuple) <= 500 or n_components == "mle":
258
297
  self._fit_svd_solver = "full"
259
298
  elif 1 <= n_components < 0.8 * n_sf_min:
260
299
  self._fit_svd_solver = "randomized"
@@ -288,7 +327,23 @@ if daal_check_version((2024, "P", 100)):
288
327
  else:
289
328
  self._fit_svd_solver = "full"
290
329
 
291
- if self._fit_svd_solver == "full":
330
+ # Use oneDAL in next cases:
331
+ # 1. oneDAL SVD solver is explicitly set
332
+ # 2. solver is set or dispatched to "covariance_eigh"
333
+ # 3. solver is set or dispatched to "full" and sklearn version < 1.5
334
+ # 4. solver is set to "auto" and dispatched to "full"
335
+ if self._fit_svd_solver in ["onedal_svd", "covariance_eigh"]:
336
+ return True
337
+ elif not sklearn_check_version("1.5") and self._fit_svd_solver == "full":
338
+ self._fit_svd_solver = "covariance_eigh"
339
+ return True
340
+ elif self.svd_solver == "auto" and self._fit_svd_solver == "full":
341
+ warn(
342
+ "Sklearnex always uses `covariance_eigh` solver instead of `full` "
343
+ "when `svd_solver` parameter is set to `auto` "
344
+ "for performance purposes."
345
+ )
346
+ self._fit_svd_solver = "covariance_eigh"
292
347
  return True
293
348
  else:
294
349
  return False
@@ -41,16 +41,18 @@ def test_sklearnex_import(dataframe, queue):
41
41
  [3.6053038, 0.04224385],
42
42
  ]
43
43
 
44
- pca = PCA(n_components=2, svd_solver="full")
44
+ pca = PCA(n_components=2, svd_solver="covariance_eigh")
45
45
  pca.fit(X)
46
46
  X_transformed = pca.transform(X)
47
- X_fit_transformed = PCA(n_components=2, svd_solver="full").fit_transform(X)
47
+ X_fit_transformed = PCA(n_components=2, svd_solver="covariance_eigh").fit_transform(X)
48
48
 
49
49
  if daal_check_version((2024, "P", 100)):
50
50
  assert "sklearnex" in pca.__module__
51
51
  assert hasattr(pca, "_onedal_estimator")
52
52
  else:
53
53
  assert "daal4py" in pca.__module__
54
+
55
+ tol = 1e-5 if _as_numpy(X_transformed).dtype == np.float32 else 1e-7
54
56
  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))
57
+ assert_allclose(X_transformed_expected, _as_numpy(X_transformed), rtol=tol)
58
+ assert_allclose(X_transformed_expected, _as_numpy(X_fit_transformed), rtol=tol)
@@ -45,12 +45,14 @@ def get_patch_map_core(preview=False):
45
45
 
46
46
  if _is_new_patching_available():
47
47
  import sklearn.covariance as covariance_module
48
+ import sklearn.decomposition as decomposition_module
48
49
 
49
50
  # Preview classes for patching
50
51
  from .preview.cluster import KMeans as KMeans_sklearnex
51
52
  from .preview.covariance import (
52
53
  EmpiricalCovariance as EmpiricalCovariance_sklearnex,
53
54
  )
55
+ from .preview.decomposition import IncrementalPCA as IncrementalPCA_sklearnex
54
56
 
55
57
  # Since the state of the lru_cache without preview cannot be
56
58
  # guaranteed to not have already enabled sklearnex algorithms
@@ -62,7 +64,7 @@ def get_patch_map_core(preview=False):
62
64
  sklearn_obj = mapping["kmeans"][0][1]
63
65
  mapping.pop("kmeans")
64
66
  mapping["kmeans"] = [
65
- [(cluster_module, "kmeans", KMeans_sklearnex), sklearn_obj]
67
+ [(cluster_module, "KMeans", KMeans_sklearnex), sklearn_obj]
66
68
  ]
67
69
 
68
70
  # Covariance
@@ -76,6 +78,18 @@ def get_patch_map_core(preview=False):
76
78
  None,
77
79
  ]
78
80
  ]
81
+
82
+ # IncrementalPCA
83
+ mapping["incrementalpca"] = [
84
+ [
85
+ (
86
+ decomposition_module,
87
+ "IncrementalPCA",
88
+ IncrementalPCA_sklearnex,
89
+ ),
90
+ None,
91
+ ]
92
+ ]
79
93
  return mapping
80
94
 
81
95
  from daal4py.sklearn.monkeypatch.dispatcher import _get_map_of_algorithms
@@ -93,6 +107,7 @@ def get_patch_map_core(preview=False):
93
107
  # Scikit-learn* modules
94
108
  import sklearn as base_module
95
109
  import sklearn.cluster as cluster_module
110
+ import sklearn.covariance as covariance_module
96
111
  import sklearn.decomposition as decomposition_module
97
112
  import sklearn.ensemble as ensemble_module
98
113
  import sklearn.linear_model as linear_model_module
@@ -115,11 +130,17 @@ def get_patch_map_core(preview=False):
115
130
  from .utils.parallel import _FuncWrapperOld as _FuncWrapper_sklearnex
116
131
 
117
132
  from .cluster import DBSCAN as DBSCAN_sklearnex
133
+ from .covariance import (
134
+ IncrementalEmpiricalCovariance as IncrementalEmpiricalCovariance_sklearnex,
135
+ )
118
136
  from .decomposition import PCA as PCA_sklearnex
119
137
  from .ensemble import ExtraTreesClassifier as ExtraTreesClassifier_sklearnex
120
138
  from .ensemble import ExtraTreesRegressor as ExtraTreesRegressor_sklearnex
121
139
  from .ensemble import RandomForestClassifier as RandomForestClassifier_sklearnex
122
140
  from .ensemble import RandomForestRegressor as RandomForestRegressor_sklearnex
141
+ from .linear_model import (
142
+ IncrementalLinearRegression as IncrementalLinearRegression_sklearnex,
143
+ )
123
144
  from .linear_model import LinearRegression as LinearRegression_sklearnex
124
145
  from .linear_model import LogisticRegression as LogisticRegression_sklearnex
125
146
  from .neighbors import KNeighborsClassifier as KNeighborsClassifier_sklearnex
@@ -273,6 +294,30 @@ def get_patch_map_core(preview=False):
273
294
  ]
274
295
  mapping["localoutlierfactor"] = mapping["lof"]
275
296
 
297
+ # IncrementalEmpiricalCovariance
298
+ mapping["incrementalempiricalcovariance"] = [
299
+ [
300
+ (
301
+ covariance_module,
302
+ "IncrementalEmpiricalCovariance",
303
+ IncrementalEmpiricalCovariance_sklearnex,
304
+ ),
305
+ None,
306
+ ]
307
+ ]
308
+
309
+ # IncrementalLinearRegression
310
+ mapping["incrementallinearregression"] = [
311
+ [
312
+ (
313
+ linear_model_module,
314
+ "IncrementalLinearRegression",
315
+ IncrementalLinearRegression_sklearnex,
316
+ ),
317
+ None,
318
+ ]
319
+ ]
320
+
276
321
  # Configs
277
322
  mapping["set_config"] = [
278
323
  [(base_module, "set_config", set_config_sklearnex), None]
@@ -29,7 +29,7 @@ from sklearn.ensemble._forest import ForestClassifier as sklearn_ForestClassifie
29
29
  from sklearn.ensemble._forest import ForestRegressor as sklearn_ForestRegressor
30
30
  from sklearn.ensemble._forest import _get_n_samples_bootstrap
31
31
  from sklearn.exceptions import DataConversionWarning
32
- from sklearn.metrics import accuracy_score
32
+ from sklearn.metrics import accuracy_score, r2_score
33
33
  from sklearn.tree import (
34
34
  DecisionTreeClassifier,
35
35
  DecisionTreeRegressor,
@@ -38,7 +38,7 @@ from sklearn.tree import (
38
38
  )
39
39
  from sklearn.tree._tree import Tree
40
40
  from sklearn.utils import check_random_state, deprecated
41
- from sklearn.utils.validation import check_array, check_is_fitted
41
+ from sklearn.utils.validation import check_array, check_is_fitted, check_X_y
42
42
 
43
43
  from daal4py.sklearn._n_jobs_support import control_n_jobs
44
44
  from daal4py.sklearn._utils import (
@@ -74,6 +74,7 @@ class BaseForest(ABC):
74
74
  accept_sparse=False,
75
75
  dtype=[np.float64, np.float32],
76
76
  force_all_finite=False,
77
+ ensure_2d=True,
77
78
  )
78
79
 
79
80
  if sample_weight is not None:
@@ -97,8 +98,6 @@ class BaseForest(ABC):
97
98
 
98
99
  y, expanded_class_weight = self._validate_y_class_weight(y)
99
100
 
100
- self.n_features_in_ = X.shape[1]
101
-
102
101
  if expanded_class_weight is not None:
103
102
  if sample_weight is not None:
104
103
  sample_weight = sample_weight * expanded_class_weight
@@ -114,7 +113,9 @@ class BaseForest(ABC):
114
113
  "min_samples_split": self.min_samples_split,
115
114
  "min_samples_leaf": self.min_samples_leaf,
116
115
  "min_weight_fraction_leaf": self.min_weight_fraction_leaf,
117
- "max_features": self.max_features,
116
+ "max_features": self._to_absolute_max_features(
117
+ self.max_features, self.n_features_in_
118
+ ),
118
119
  "max_leaf_nodes": self.max_leaf_nodes,
119
120
  "min_impurity_decrease": self.min_impurity_decrease,
120
121
  "bootstrap": self.bootstrap,
@@ -174,6 +175,45 @@ class BaseForest(ABC):
174
175
  self._validate_estimator()
175
176
  return self
176
177
 
178
+ def _to_absolute_max_features(self, max_features, n_features):
179
+ if max_features is None:
180
+ return n_features
181
+ if isinstance(max_features, str):
182
+ if max_features == "auto":
183
+ if not sklearn_check_version("1.3"):
184
+ if sklearn_check_version("1.1"):
185
+ warnings.warn(
186
+ "`max_features='auto'` has been deprecated in 1.1 "
187
+ "and will be removed in 1.3. To keep the past behaviour, "
188
+ "explicitly set `max_features=1.0` or remove this "
189
+ "parameter as it is also the default value for "
190
+ "RandomForestRegressors and ExtraTreesRegressors.",
191
+ FutureWarning,
192
+ )
193
+ return (
194
+ max(1, int(np.sqrt(n_features)))
195
+ if isinstance(self, ForestClassifier)
196
+ else n_features
197
+ )
198
+ if max_features == "sqrt":
199
+ return max(1, int(np.sqrt(n_features)))
200
+ if max_features == "log2":
201
+ return max(1, int(np.log2(n_features)))
202
+ allowed_string_values = (
203
+ '"sqrt" or "log2"'
204
+ if sklearn_check_version("1.3")
205
+ else '"auto", "sqrt" or "log2"'
206
+ )
207
+ raise ValueError(
208
+ "Invalid value for max_features. Allowed string "
209
+ f"values are {allowed_string_values}."
210
+ )
211
+ if isinstance(max_features, (numbers.Integral, np.integer)):
212
+ return max_features
213
+ if max_features > 0.0:
214
+ return max(1, int(max_features * n_features))
215
+ return 0
216
+
177
217
  def _check_parameters(self):
178
218
  if isinstance(self.min_samples_leaf, numbers.Integral):
179
219
  if not 1 <= self.min_samples_leaf:
@@ -518,7 +558,7 @@ class ForestClassifier(sklearn_ForestClassifier, BaseForest):
518
558
  )
519
559
 
520
560
  if patching_status.get_status():
521
- X, y = self._validate_data(
561
+ X, y = check_X_y(
522
562
  X,
523
563
  y,
524
564
  multi_output=True,
@@ -738,6 +778,10 @@ class ForestClassifier(sklearn_ForestClassifier, BaseForest):
738
778
  or self.estimator.__class__ == DecisionTreeClassifier,
739
779
  "ExtraTrees only supported starting from oneDAL version 2023.1",
740
780
  ),
781
+ (
782
+ not self.oob_score,
783
+ "oob_scores using r2 or accuracy not implemented.",
784
+ ),
741
785
  (sample_weight is None, "sample_weight is not supported."),
742
786
  ]
743
787
  )
@@ -777,26 +821,46 @@ class ForestClassifier(sklearn_ForestClassifier, BaseForest):
777
821
  return patching_status
778
822
 
779
823
  def _onedal_predict(self, X, queue=None):
780
- X = check_array(
781
- X,
782
- dtype=[np.float64, np.float32],
783
- force_all_finite=False,
784
- ) # Warning, order of dtype matters
785
824
  check_is_fitted(self, "_onedal_estimator")
786
825
 
787
826
  if sklearn_check_version("1.0"):
788
- self._check_feature_names(X, reset=False)
827
+ X = self._validate_data(
828
+ X,
829
+ dtype=[np.float64, np.float32],
830
+ force_all_finite=False,
831
+ reset=False,
832
+ ensure_2d=True,
833
+ )
834
+ else:
835
+ X = check_array(
836
+ X,
837
+ dtype=[np.float64, np.float32],
838
+ force_all_finite=False,
839
+ ) # Warning, order of dtype matters
840
+ self._check_n_features(X, reset=False)
789
841
 
790
842
  res = self._onedal_estimator.predict(X, queue=queue)
791
843
  return np.take(self.classes_, res.ravel().astype(np.int64, casting="unsafe"))
792
844
 
793
845
  def _onedal_predict_proba(self, X, queue=None):
794
- X = check_array(X, dtype=[np.float64, np.float32], force_all_finite=False)
795
846
  check_is_fitted(self, "_onedal_estimator")
796
847
 
797
- self._check_n_features(X, reset=False)
798
848
  if sklearn_check_version("1.0"):
799
- self._check_feature_names(X, reset=False)
849
+ X = self._validate_data(
850
+ X,
851
+ dtype=[np.float64, np.float32],
852
+ force_all_finite=False,
853
+ reset=False,
854
+ ensure_2d=True,
855
+ )
856
+ else:
857
+ X = check_array(
858
+ X,
859
+ dtype=[np.float64, np.float32],
860
+ force_all_finite=False,
861
+ ) # Warning, order of dtype matters
862
+ self._check_n_features(X, reset=False)
863
+
800
864
  return self._onedal_estimator.predict_proba(X, queue=queue)
801
865
 
802
866
  def _onedal_score(self, X, y, sample_weight=None, queue=None):
@@ -913,7 +977,7 @@ class ForestRegressor(sklearn_ForestRegressor, BaseForest):
913
977
  )
914
978
 
915
979
  if patching_status.get_status():
916
- X, y = self._validate_data(
980
+ X, y = check_X_y(
917
981
  X,
918
982
  y,
919
983
  multi_output=True,
@@ -995,7 +1059,7 @@ class ForestRegressor(sklearn_ForestRegressor, BaseForest):
995
1059
  ]
996
1060
  )
997
1061
 
998
- elif method_name == "predict":
1062
+ elif method_name in ["predict", "score"]:
999
1063
  X = data[0]
1000
1064
 
1001
1065
  patching_status.and_conditions(
@@ -1045,11 +1109,12 @@ class ForestRegressor(sklearn_ForestRegressor, BaseForest):
1045
1109
  or self.estimator.__class__ == DecisionTreeClassifier,
1046
1110
  "ExtraTrees only supported starting from oneDAL version 2023.1",
1047
1111
  ),
1112
+ (not self.oob_score, "oob_score value is not sklearn conformant."),
1048
1113
  (sample_weight is None, "sample_weight is not supported."),
1049
1114
  ]
1050
1115
  )
1051
1116
 
1052
- elif method_name == "predict":
1117
+ elif method_name in ["predict", "score"]:
1053
1118
  X = data[0]
1054
1119
 
1055
1120
  patching_status.and_conditions(
@@ -1082,16 +1147,28 @@ class ForestRegressor(sklearn_ForestRegressor, BaseForest):
1082
1147
  return patching_status
1083
1148
 
1084
1149
  def _onedal_predict(self, X, queue=None):
1085
- X = check_array(
1086
- X, dtype=[np.float64, np.float32], force_all_finite=False
1087
- ) # Warning, order of dtype matters
1088
1150
  check_is_fitted(self, "_onedal_estimator")
1089
1151
 
1090
1152
  if sklearn_check_version("1.0"):
1091
- self._check_feature_names(X, reset=False)
1153
+ X = self._validate_data(
1154
+ X,
1155
+ dtype=[np.float64, np.float32],
1156
+ force_all_finite=False,
1157
+ reset=False,
1158
+ ensure_2d=True,
1159
+ ) # Warning, order of dtype matters
1160
+ else:
1161
+ X = check_array(
1162
+ X, dtype=[np.float64, np.float32], force_all_finite=False
1163
+ ) # Warning, order of dtype matters
1092
1164
 
1093
1165
  return self._onedal_estimator.predict(X, queue=queue)
1094
1166
 
1167
+ def _onedal_score(self, X, y, sample_weight=None, queue=None):
1168
+ return r2_score(
1169
+ y, self._onedal_predict(X, queue=queue), sample_weight=sample_weight
1170
+ )
1171
+
1095
1172
  def fit(self, X, y, sample_weight=None):
1096
1173
  dispatch(
1097
1174
  self,
@@ -1118,8 +1195,23 @@ class ForestRegressor(sklearn_ForestRegressor, BaseForest):
1118
1195
  X,
1119
1196
  )
1120
1197
 
1198
+ @wrap_output_data
1199
+ def score(self, X, y, sample_weight=None):
1200
+ return dispatch(
1201
+ self,
1202
+ "score",
1203
+ {
1204
+ "onedal": self.__class__._onedal_score,
1205
+ "sklearn": sklearn_ForestRegressor.score,
1206
+ },
1207
+ X,
1208
+ y,
1209
+ sample_weight=sample_weight,
1210
+ )
1211
+
1121
1212
  fit.__doc__ = sklearn_ForestRegressor.fit.__doc__
1122
1213
  predict.__doc__ = sklearn_ForestRegressor.predict.__doc__
1214
+ score.__doc__ = sklearn_ForestRegressor.score.__doc__
1123
1215
 
1124
1216
 
1125
1217
  @control_n_jobs(decorated_methods=["fit", "predict", "predict_proba", "score"])
@@ -14,6 +14,7 @@
14
14
  # limitations under the License.
15
15
  # ===============================================================================
16
16
 
17
+ import numpy as np
17
18
  import pytest
18
19
  from numpy.testing import assert_allclose
19
20
  from sklearn.datasets import make_classification, make_regression
@@ -45,7 +46,10 @@ def test_sklearnex_import_rf_classifier(dataframe, queue):
45
46
  assert_allclose([1], _as_numpy(rf.predict([[0, 0, 0, 0]])))
46
47
 
47
48
 
48
- @pytest.mark.parametrize("dataframe,queue", get_dataframes_and_queues())
49
+ # TODO: fix RF regressor predict for the GPU sycl_queue.
50
+ @pytest.mark.parametrize(
51
+ "dataframe,queue", get_dataframes_and_queues(device_filter_="cpu")
52
+ )
49
53
  def test_sklearnex_import_rf_regression(dataframe, queue):
50
54
  from sklearnex.ensemble import RandomForestRegressor
51
55
 
@@ -65,7 +69,10 @@ def test_sklearnex_import_rf_regression(dataframe, queue):
65
69
  assert_allclose([-6.839], pred, atol=1e-2)
66
70
 
67
71
 
68
- @pytest.mark.parametrize("dataframe,queue", get_dataframes_and_queues())
72
+ # TODO: fix ET classifier predict for the GPU sycl_queue.
73
+ @pytest.mark.parametrize(
74
+ "dataframe,queue", get_dataframes_and_queues(device_filter_="cpu")
75
+ )
69
76
  def test_sklearnex_import_et_classifier(dataframe, queue):
70
77
  from sklearnex.ensemble import ExtraTreesClassifier
71
78
 
@@ -86,7 +93,10 @@ def test_sklearnex_import_et_classifier(dataframe, queue):
86
93
  assert_allclose([1], _as_numpy(rf.predict([[0, 0, 0, 0]])))
87
94
 
88
95
 
89
- @pytest.mark.parametrize("dataframe,queue", get_dataframes_and_queues())
96
+ # TODO: fix ET regressor predict for the GPU sycl_queue.
97
+ @pytest.mark.parametrize(
98
+ "dataframe,queue", get_dataframes_and_queues(device_filter_="cpu")
99
+ )
90
100
  def test_sklearnex_import_et_regression(dataframe, queue):
91
101
  from sklearnex.ensemble import ExtraTreesRegressor
92
102
 
@@ -17,18 +17,32 @@
17
17
 
18
18
  def get_patch_str(name=None, verbose=True):
19
19
  return f"""try:
20
+ # TEMP. FIX: sklearnex.patch_sklearn imports sklearn beforehand
21
+ # when it didn't initialized _threadpool_controller required for
22
+ # pairwise distances dispatching during imports.
23
+ # Manually setting and deleting _threadpool_controller during patch fixes it.
24
+ import sklearn
25
+ from threadpoolctl import ThreadpoolController
26
+ sklearn._threadpool_controller = ThreadpoolController()
20
27
  from sklearnex import patch_sklearn
21
28
  patch_sklearn(name={str(name)}, verbose={str(verbose)})
22
- del patch_sklearn
29
+ del patch_sklearn, sklearn._threadpool_controller
23
30
  except ImportError:
24
31
  pass"""
25
32
 
26
33
 
27
34
  def get_patch_str_re():
28
35
  return r"""\ntry:
36
+ \# TEMP. FIX: sklearnex.patch_sklearn imports sklearn beforehand
37
+ \# when it didn't initialized _threadpool_controller required for
38
+ \# pairwise distances dispatching during imports.
39
+ \# Manually setting and deleting _threadpool_controller during patch fixes it.
40
+ import sklearn
41
+ from threadpoolctl import ThreadpoolController
42
+ sklearn._threadpool_controller = ThreadpoolController\(\)
29
43
  from sklearnex import patch_sklearn
30
44
  patch_sklearn\(name=.*, verbose=.*\)
31
- del patch_sklearn
45
+ del patch_sklearn, sklearn._threadpool_controller
32
46
  except ImportError:
33
47
  pass\n"""
34
48
 
@@ -15,14 +15,16 @@
15
15
  # ===============================================================================
16
16
 
17
17
  from .coordinate_descent import ElasticNet, Lasso
18
+ from .incremental_linear import IncrementalLinearRegression
18
19
  from .linear import LinearRegression
19
20
  from .logistic_regression import LogisticRegression
20
21
  from .ridge import Ridge
21
22
 
22
23
  __all__ = [
23
- "Ridge",
24
- "LinearRegression",
25
- "LogisticRegression",
26
24
  "ElasticNet",
25
+ "IncrementalLinearRegression",
27
26
  "Lasso",
27
+ "LinearRegression",
28
+ "LogisticRegression",
29
+ "Ridge",
28
30
  ]