scikit-learn-intelex 2024.3.0__py312-none-win_amd64.whl → 2024.5.0__py312-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 (107) hide show
  1. {scikit_learn_intelex-2024.3.0.data → scikit_learn_intelex-2024.5.0.data}/data/Lib/site-packages/sklearnex/_device_offload.py +39 -5
  2. {scikit_learn_intelex-2024.3.0.data/data/Lib/site-packages/sklearnex/spmd → scikit_learn_intelex-2024.5.0.data/data/Lib/site-packages/sklearnex}/basic_statistics/__init__.py +2 -1
  3. scikit_learn_intelex-2024.5.0.data/data/Lib/site-packages/sklearnex/basic_statistics/incremental_basic_statistics.py +288 -0
  4. scikit_learn_intelex-2024.5.0.data/data/Lib/site-packages/sklearnex/basic_statistics/tests/test_incremental_basic_statistics.py +384 -0
  5. scikit_learn_intelex-2024.5.0.data/data/Lib/site-packages/sklearnex/covariance/incremental_covariance.py +317 -0
  6. {scikit_learn_intelex-2024.3.0.data → scikit_learn_intelex-2024.5.0.data}/data/Lib/site-packages/sklearnex/covariance/tests/test_incremental_covariance.py +54 -17
  7. {scikit_learn_intelex-2024.3.0.data → scikit_learn_intelex-2024.5.0.data}/data/Lib/site-packages/sklearnex/decomposition/pca.py +71 -19
  8. {scikit_learn_intelex-2024.3.0.data → scikit_learn_intelex-2024.5.0.data}/data/Lib/site-packages/sklearnex/decomposition/tests/test_pca.py +2 -2
  9. {scikit_learn_intelex-2024.3.0.data → scikit_learn_intelex-2024.5.0.data}/data/Lib/site-packages/sklearnex/dispatcher.py +33 -2
  10. {scikit_learn_intelex-2024.3.0.data → scikit_learn_intelex-2024.5.0.data}/data/Lib/site-packages/sklearnex/ensemble/_forest.py +73 -79
  11. {scikit_learn_intelex-2024.3.0.data → scikit_learn_intelex-2024.5.0.data}/data/Lib/site-packages/sklearnex/linear_model/__init__.py +5 -3
  12. scikit_learn_intelex-2024.5.0.data/data/Lib/site-packages/sklearnex/linear_model/incremental_linear.py +387 -0
  13. scikit_learn_intelex-2024.5.0.data/data/Lib/site-packages/sklearnex/linear_model/linear.py +316 -0
  14. {scikit_learn_intelex-2024.3.0.data → scikit_learn_intelex-2024.5.0.data}/data/Lib/site-packages/sklearnex/linear_model/logistic_regression.py +50 -9
  15. scikit_learn_intelex-2024.5.0.data/data/Lib/site-packages/sklearnex/linear_model/tests/test_incremental_linear.py +200 -0
  16. {scikit_learn_intelex-2024.3.0.data → scikit_learn_intelex-2024.5.0.data}/data/Lib/site-packages/sklearnex/linear_model/tests/test_linear.py +40 -5
  17. {scikit_learn_intelex-2024.3.0.data → scikit_learn_intelex-2024.5.0.data}/data/Lib/site-packages/sklearnex/neighbors/_lof.py +53 -36
  18. {scikit_learn_intelex-2024.3.0.data → scikit_learn_intelex-2024.5.0.data}/data/Lib/site-packages/sklearnex/neighbors/common.py +4 -1
  19. {scikit_learn_intelex-2024.3.0.data → scikit_learn_intelex-2024.5.0.data}/data/Lib/site-packages/sklearnex/neighbors/knn_classification.py +37 -122
  20. {scikit_learn_intelex-2024.3.0.data → scikit_learn_intelex-2024.5.0.data}/data/Lib/site-packages/sklearnex/neighbors/knn_regression.py +10 -117
  21. {scikit_learn_intelex-2024.3.0.data → scikit_learn_intelex-2024.5.0.data}/data/Lib/site-packages/sklearnex/neighbors/knn_unsupervised.py +6 -78
  22. {scikit_learn_intelex-2024.3.0.data → scikit_learn_intelex-2024.5.0.data}/data/Lib/site-packages/sklearnex/neighbors/tests/test_neighbors.py +2 -2
  23. {scikit_learn_intelex-2024.3.0.data → scikit_learn_intelex-2024.5.0.data}/data/Lib/site-packages/sklearnex/preview/cluster/k_means.py +5 -73
  24. {scikit_learn_intelex-2024.3.0.data → scikit_learn_intelex-2024.5.0.data}/data/Lib/site-packages/sklearnex/preview/covariance/covariance.py +6 -5
  25. {scikit_learn_intelex-2024.3.0.data → scikit_learn_intelex-2024.5.0.data}/data/Lib/site-packages/sklearnex/preview/covariance/tests/test_covariance.py +18 -5
  26. {scikit_learn_intelex-2024.3.0.data → scikit_learn_intelex-2024.5.0.data}/data/Lib/site-packages/sklearnex/svm/_common.py +4 -7
  27. {scikit_learn_intelex-2024.3.0.data → scikit_learn_intelex-2024.5.0.data}/data/Lib/site-packages/sklearnex/svm/nusvc.py +66 -50
  28. {scikit_learn_intelex-2024.3.0.data → scikit_learn_intelex-2024.5.0.data}/data/Lib/site-packages/sklearnex/svm/nusvr.py +3 -49
  29. {scikit_learn_intelex-2024.3.0.data → scikit_learn_intelex-2024.5.0.data}/data/Lib/site-packages/sklearnex/svm/svc.py +66 -51
  30. {scikit_learn_intelex-2024.3.0.data → scikit_learn_intelex-2024.5.0.data}/data/Lib/site-packages/sklearnex/svm/svr.py +3 -49
  31. {scikit_learn_intelex-2024.3.0.data → scikit_learn_intelex-2024.5.0.data}/data/Lib/site-packages/sklearnex/tests/_utils.py +34 -16
  32. {scikit_learn_intelex-2024.3.0.data → scikit_learn_intelex-2024.5.0.data}/data/Lib/site-packages/sklearnex/tests/test_memory_usage.py +5 -1
  33. {scikit_learn_intelex-2024.3.0.data → scikit_learn_intelex-2024.5.0.data}/data/Lib/site-packages/sklearnex/tests/test_n_jobs_support.py +12 -2
  34. {scikit_learn_intelex-2024.3.0.data → scikit_learn_intelex-2024.5.0.data}/data/Lib/site-packages/sklearnex/tests/test_patching.py +87 -58
  35. {scikit_learn_intelex-2024.3.0.data → scikit_learn_intelex-2024.5.0.data}/data/Lib/site-packages/sklearnex/tests/test_run_to_run_stability_tests.py +1 -1
  36. {scikit_learn_intelex-2024.3.0.data → scikit_learn_intelex-2024.5.0.data}/data/Lib/site-packages/sklearnex/utils/__init__.py +2 -1
  37. scikit_learn_intelex-2024.5.0.data/data/Lib/site-packages/sklearnex/utils/_namespace.py +97 -0
  38. scikit_learn_intelex-2024.5.0.data/data/Lib/site-packages/sklearnex/utils/tests/test_finite.py +89 -0
  39. {scikit_learn_intelex-2024.3.0.dist-info → scikit_learn_intelex-2024.5.0.dist-info}/METADATA +227 -230
  40. scikit_learn_intelex-2024.5.0.dist-info/RECORD +104 -0
  41. {scikit_learn_intelex-2024.3.0.dist-info → scikit_learn_intelex-2024.5.0.dist-info}/WHEEL +1 -1
  42. scikit_learn_intelex-2024.3.0.data/data/Lib/site-packages/sklearnex/covariance/incremental_covariance.py +0 -130
  43. scikit_learn_intelex-2024.3.0.data/data/Lib/site-packages/sklearnex/linear_model/linear.py +0 -381
  44. scikit_learn_intelex-2024.3.0.dist-info/RECORD +0 -98
  45. {scikit_learn_intelex-2024.3.0.data → scikit_learn_intelex-2024.5.0.data}/data/Lib/site-packages/sklearnex/__init__.py +0 -0
  46. {scikit_learn_intelex-2024.3.0.data → scikit_learn_intelex-2024.5.0.data}/data/Lib/site-packages/sklearnex/__main__.py +0 -0
  47. {scikit_learn_intelex-2024.3.0.data → scikit_learn_intelex-2024.5.0.data}/data/Lib/site-packages/sklearnex/_config.py +0 -0
  48. {scikit_learn_intelex-2024.3.0.data → scikit_learn_intelex-2024.5.0.data}/data/Lib/site-packages/sklearnex/_utils.py +0 -0
  49. {scikit_learn_intelex-2024.3.0.data → scikit_learn_intelex-2024.5.0.data}/data/Lib/site-packages/sklearnex/basic_statistics/basic_statistics.py +0 -0
  50. {scikit_learn_intelex-2024.3.0.data → scikit_learn_intelex-2024.5.0.data}/data/Lib/site-packages/sklearnex/cluster/__init__.py +0 -0
  51. {scikit_learn_intelex-2024.3.0.data → scikit_learn_intelex-2024.5.0.data}/data/Lib/site-packages/sklearnex/cluster/dbscan.py +0 -0
  52. {scikit_learn_intelex-2024.3.0.data → scikit_learn_intelex-2024.5.0.data}/data/Lib/site-packages/sklearnex/cluster/k_means.py +0 -0
  53. {scikit_learn_intelex-2024.3.0.data → scikit_learn_intelex-2024.5.0.data}/data/Lib/site-packages/sklearnex/cluster/tests/test_dbscan.py +0 -0
  54. {scikit_learn_intelex-2024.3.0.data → scikit_learn_intelex-2024.5.0.data}/data/Lib/site-packages/sklearnex/cluster/tests/test_kmeans.py +0 -0
  55. {scikit_learn_intelex-2024.3.0.data → scikit_learn_intelex-2024.5.0.data}/data/Lib/site-packages/sklearnex/conftest.py +0 -0
  56. {scikit_learn_intelex-2024.3.0.data → scikit_learn_intelex-2024.5.0.data}/data/Lib/site-packages/sklearnex/covariance/__init__.py +0 -0
  57. {scikit_learn_intelex-2024.3.0.data → scikit_learn_intelex-2024.5.0.data}/data/Lib/site-packages/sklearnex/decomposition/__init__.py +0 -0
  58. {scikit_learn_intelex-2024.3.0.data → scikit_learn_intelex-2024.5.0.data}/data/Lib/site-packages/sklearnex/doc/third-party-programs.txt +0 -0
  59. {scikit_learn_intelex-2024.3.0.data → scikit_learn_intelex-2024.5.0.data}/data/Lib/site-packages/sklearnex/ensemble/__init__.py +0 -0
  60. {scikit_learn_intelex-2024.3.0.data → scikit_learn_intelex-2024.5.0.data}/data/Lib/site-packages/sklearnex/ensemble/tests/test_forest.py +0 -0
  61. {scikit_learn_intelex-2024.3.0.data → scikit_learn_intelex-2024.5.0.data}/data/Lib/site-packages/sklearnex/glob/__main__.py +0 -0
  62. {scikit_learn_intelex-2024.3.0.data → scikit_learn_intelex-2024.5.0.data}/data/Lib/site-packages/sklearnex/glob/dispatcher.py +0 -0
  63. {scikit_learn_intelex-2024.3.0.data → scikit_learn_intelex-2024.5.0.data}/data/Lib/site-packages/sklearnex/linear_model/coordinate_descent.py +0 -0
  64. {scikit_learn_intelex-2024.3.0.data → scikit_learn_intelex-2024.5.0.data}/data/Lib/site-packages/sklearnex/linear_model/logistic_path.py +0 -0
  65. {scikit_learn_intelex-2024.3.0.data → scikit_learn_intelex-2024.5.0.data}/data/Lib/site-packages/sklearnex/linear_model/ridge.py +0 -0
  66. {scikit_learn_intelex-2024.3.0.data → scikit_learn_intelex-2024.5.0.data}/data/Lib/site-packages/sklearnex/linear_model/tests/test_logreg.py +0 -0
  67. {scikit_learn_intelex-2024.3.0.data → scikit_learn_intelex-2024.5.0.data}/data/Lib/site-packages/sklearnex/manifold/__init__.py +0 -0
  68. {scikit_learn_intelex-2024.3.0.data → scikit_learn_intelex-2024.5.0.data}/data/Lib/site-packages/sklearnex/manifold/t_sne.py +0 -0
  69. {scikit_learn_intelex-2024.3.0.data → scikit_learn_intelex-2024.5.0.data}/data/Lib/site-packages/sklearnex/manifold/tests/test_tsne.py +0 -0
  70. {scikit_learn_intelex-2024.3.0.data → scikit_learn_intelex-2024.5.0.data}/data/Lib/site-packages/sklearnex/metrics/__init__.py +0 -0
  71. {scikit_learn_intelex-2024.3.0.data → scikit_learn_intelex-2024.5.0.data}/data/Lib/site-packages/sklearnex/metrics/pairwise.py +0 -0
  72. {scikit_learn_intelex-2024.3.0.data → scikit_learn_intelex-2024.5.0.data}/data/Lib/site-packages/sklearnex/metrics/ranking.py +0 -0
  73. {scikit_learn_intelex-2024.3.0.data → scikit_learn_intelex-2024.5.0.data}/data/Lib/site-packages/sklearnex/metrics/tests/test_metrics.py +0 -0
  74. {scikit_learn_intelex-2024.3.0.data → scikit_learn_intelex-2024.5.0.data}/data/Lib/site-packages/sklearnex/model_selection/__init__.py +0 -0
  75. {scikit_learn_intelex-2024.3.0.data → scikit_learn_intelex-2024.5.0.data}/data/Lib/site-packages/sklearnex/model_selection/split.py +0 -0
  76. {scikit_learn_intelex-2024.3.0.data → scikit_learn_intelex-2024.5.0.data}/data/Lib/site-packages/sklearnex/model_selection/tests/test_model_selection.py +0 -0
  77. {scikit_learn_intelex-2024.3.0.data → scikit_learn_intelex-2024.5.0.data}/data/Lib/site-packages/sklearnex/neighbors/__init__.py +0 -0
  78. {scikit_learn_intelex-2024.3.0.data → scikit_learn_intelex-2024.5.0.data}/data/Lib/site-packages/sklearnex/preview/__init__.py +0 -0
  79. {scikit_learn_intelex-2024.3.0.data → scikit_learn_intelex-2024.5.0.data}/data/Lib/site-packages/sklearnex/preview/cluster/__init__.py +0 -0
  80. {scikit_learn_intelex-2024.3.0.data → scikit_learn_intelex-2024.5.0.data}/data/Lib/site-packages/sklearnex/preview/cluster/_common.py +0 -0
  81. {scikit_learn_intelex-2024.3.0.data → scikit_learn_intelex-2024.5.0.data}/data/Lib/site-packages/sklearnex/preview/covariance/__init__.py +0 -0
  82. {scikit_learn_intelex-2024.3.0.data → scikit_learn_intelex-2024.5.0.data}/data/Lib/site-packages/sklearnex/spmd/__init__.py +0 -0
  83. {scikit_learn_intelex-2024.3.0.data/data/Lib/site-packages/sklearnex → scikit_learn_intelex-2024.5.0.data/data/Lib/site-packages/sklearnex/spmd}/basic_statistics/__init__.py +0 -0
  84. {scikit_learn_intelex-2024.3.0.data → scikit_learn_intelex-2024.5.0.data}/data/Lib/site-packages/sklearnex/spmd/basic_statistics/basic_statistics.py +0 -0
  85. {scikit_learn_intelex-2024.3.0.data → scikit_learn_intelex-2024.5.0.data}/data/Lib/site-packages/sklearnex/spmd/cluster/__init__.py +0 -0
  86. {scikit_learn_intelex-2024.3.0.data → scikit_learn_intelex-2024.5.0.data}/data/Lib/site-packages/sklearnex/spmd/cluster/dbscan.py +0 -0
  87. {scikit_learn_intelex-2024.3.0.data → scikit_learn_intelex-2024.5.0.data}/data/Lib/site-packages/sklearnex/spmd/cluster/kmeans.py +0 -0
  88. {scikit_learn_intelex-2024.3.0.data → scikit_learn_intelex-2024.5.0.data}/data/Lib/site-packages/sklearnex/spmd/covariance/__init__.py +0 -0
  89. {scikit_learn_intelex-2024.3.0.data → scikit_learn_intelex-2024.5.0.data}/data/Lib/site-packages/sklearnex/spmd/covariance/covariance.py +0 -0
  90. {scikit_learn_intelex-2024.3.0.data → scikit_learn_intelex-2024.5.0.data}/data/Lib/site-packages/sklearnex/spmd/decomposition/__init__.py +0 -0
  91. {scikit_learn_intelex-2024.3.0.data → scikit_learn_intelex-2024.5.0.data}/data/Lib/site-packages/sklearnex/spmd/decomposition/pca.py +0 -0
  92. {scikit_learn_intelex-2024.3.0.data → scikit_learn_intelex-2024.5.0.data}/data/Lib/site-packages/sklearnex/spmd/ensemble/__init__.py +0 -0
  93. {scikit_learn_intelex-2024.3.0.data → scikit_learn_intelex-2024.5.0.data}/data/Lib/site-packages/sklearnex/spmd/ensemble/forest.py +0 -0
  94. {scikit_learn_intelex-2024.3.0.data → scikit_learn_intelex-2024.5.0.data}/data/Lib/site-packages/sklearnex/spmd/linear_model/__init__.py +0 -0
  95. {scikit_learn_intelex-2024.3.0.data → scikit_learn_intelex-2024.5.0.data}/data/Lib/site-packages/sklearnex/spmd/linear_model/linear_model.py +0 -0
  96. {scikit_learn_intelex-2024.3.0.data → scikit_learn_intelex-2024.5.0.data}/data/Lib/site-packages/sklearnex/spmd/linear_model/logistic_regression.py +0 -0
  97. {scikit_learn_intelex-2024.3.0.data → scikit_learn_intelex-2024.5.0.data}/data/Lib/site-packages/sklearnex/spmd/neighbors/__init__.py +0 -0
  98. {scikit_learn_intelex-2024.3.0.data → scikit_learn_intelex-2024.5.0.data}/data/Lib/site-packages/sklearnex/spmd/neighbors/neighbors.py +0 -0
  99. {scikit_learn_intelex-2024.3.0.data → scikit_learn_intelex-2024.5.0.data}/data/Lib/site-packages/sklearnex/svm/__init__.py +0 -0
  100. {scikit_learn_intelex-2024.3.0.data → scikit_learn_intelex-2024.5.0.data}/data/Lib/site-packages/sklearnex/svm/tests/test_svm.py +0 -0
  101. {scikit_learn_intelex-2024.3.0.data → scikit_learn_intelex-2024.5.0.data}/data/Lib/site-packages/sklearnex/tests/test_config.py +0 -0
  102. {scikit_learn_intelex-2024.3.0.data → scikit_learn_intelex-2024.5.0.data}/data/Lib/site-packages/sklearnex/tests/test_monkeypatch.py +0 -0
  103. {scikit_learn_intelex-2024.3.0.data → scikit_learn_intelex-2024.5.0.data}/data/Lib/site-packages/sklearnex/tests/test_parallel.py +0 -0
  104. {scikit_learn_intelex-2024.3.0.data → scikit_learn_intelex-2024.5.0.data}/data/Lib/site-packages/sklearnex/utils/parallel.py +0 -0
  105. {scikit_learn_intelex-2024.3.0.data → scikit_learn_intelex-2024.5.0.data}/data/Lib/site-packages/sklearnex/utils/validation.py +0 -0
  106. {scikit_learn_intelex-2024.3.0.dist-info → scikit_learn_intelex-2024.5.0.dist-info}/LICENSE.txt +0 -0
  107. {scikit_learn_intelex-2024.3.0.dist-info → scikit_learn_intelex-2024.5.0.dist-info}/top_level.txt +0 -0
@@ -17,6 +17,10 @@
17
17
  import numpy as np
18
18
  import pytest
19
19
  from numpy.testing import assert_allclose
20
+ from sklearn.covariance.tests.test_covariance import (
21
+ test_covariance,
22
+ test_EmpiricalCovariance_validates_mahalanobis,
23
+ )
20
24
 
21
25
  from onedal.tests.utils._dataframes_support import (
22
26
  _convert_to_dataframe,
@@ -26,13 +30,14 @@ from onedal.tests.utils._dataframes_support import (
26
30
 
27
31
  @pytest.mark.parametrize("dataframe,queue", get_dataframes_and_queues())
28
32
  @pytest.mark.parametrize("dtype", [np.float32, np.float64])
29
- def test_sklearnex_partial_fit_on_gold_data(dataframe, queue, dtype):
33
+ @pytest.mark.parametrize("assume_centered", [True, False])
34
+ def test_sklearnex_partial_fit_on_gold_data(dataframe, queue, dtype, assume_centered):
30
35
  from sklearnex.covariance import IncrementalEmpiricalCovariance
31
36
 
32
37
  X = np.array([[0, 1], [0, 1]])
33
38
  X = X.astype(dtype)
34
39
  X_split = np.array_split(X, 2)
35
- inccov = IncrementalEmpiricalCovariance()
40
+ inccov = IncrementalEmpiricalCovariance(assume_centered=assume_centered)
36
41
 
37
42
  for i in range(2):
38
43
  X_split_df = _convert_to_dataframe(
@@ -40,8 +45,12 @@ def test_sklearnex_partial_fit_on_gold_data(dataframe, queue, dtype):
40
45
  )
41
46
  result = inccov.partial_fit(X_split_df)
42
47
 
43
- expected_covariance = np.array([[0, 0], [0, 0]])
44
- expected_means = np.array([0, 1])
48
+ if assume_centered:
49
+ expected_covariance = np.array([[0, 0], [0, 1]])
50
+ expected_means = np.array([0, 0])
51
+ else:
52
+ expected_covariance = np.array([[0, 0], [0, 0]])
53
+ expected_means = np.array([0, 1])
45
54
 
46
55
  assert_allclose(expected_covariance, result.covariance_)
47
56
  assert_allclose(expected_means, result.location_)
@@ -49,7 +58,7 @@ def test_sklearnex_partial_fit_on_gold_data(dataframe, queue, dtype):
49
58
  X = np.array([[1, 2], [3, 6]])
50
59
  X = X.astype(dtype)
51
60
  X_split = np.array_split(X, 2)
52
- inccov = IncrementalEmpiricalCovariance()
61
+ inccov = IncrementalEmpiricalCovariance(assume_centered=assume_centered)
53
62
 
54
63
  for i in range(2):
55
64
  X_split_df = _convert_to_dataframe(
@@ -57,8 +66,12 @@ def test_sklearnex_partial_fit_on_gold_data(dataframe, queue, dtype):
57
66
  )
58
67
  result = inccov.partial_fit(X_split_df)
59
68
 
60
- expected_covariance = np.array([[1, 2], [2, 4]])
61
- expected_means = np.array([2, 4])
69
+ if assume_centered:
70
+ expected_covariance = np.array([[5, 10], [10, 20]])
71
+ expected_means = np.array([0, 0])
72
+ else:
73
+ expected_covariance = np.array([[1, 2], [2, 4]])
74
+ expected_means = np.array([2, 4])
62
75
 
63
76
  assert_allclose(expected_covariance, result.covariance_)
64
77
  assert_allclose(expected_means, result.location_)
@@ -87,9 +100,9 @@ def test_sklearnex_fit_on_gold_data(dataframe, queue, batch_size, dtype):
87
100
 
88
101
 
89
102
  @pytest.mark.parametrize("dataframe,queue", get_dataframes_and_queues())
90
- @pytest.mark.parametrize("num_batches", [2, 4, 6, 8, 10])
91
- @pytest.mark.parametrize("row_count", [100, 1000, 2000])
92
- @pytest.mark.parametrize("column_count", [10, 100, 200])
103
+ @pytest.mark.parametrize("num_batches", [2, 10])
104
+ @pytest.mark.parametrize("row_count", [100, 1000])
105
+ @pytest.mark.parametrize("column_count", [10, 100])
93
106
  @pytest.mark.parametrize("dtype", [np.float32, np.float64])
94
107
  def test_sklearnex_partial_fit_on_random_data(
95
108
  dataframe, queue, num_batches, row_count, column_count, dtype
@@ -117,12 +130,13 @@ def test_sklearnex_partial_fit_on_random_data(
117
130
 
118
131
 
119
132
  @pytest.mark.parametrize("dataframe,queue", get_dataframes_and_queues())
120
- @pytest.mark.parametrize("num_batches", [2, 4, 6, 8, 10])
121
- @pytest.mark.parametrize("row_count", [100, 1000, 2000])
122
- @pytest.mark.parametrize("column_count", [10, 100, 200])
133
+ @pytest.mark.parametrize("num_batches", [2, 10])
134
+ @pytest.mark.parametrize("row_count", [100, 1000])
135
+ @pytest.mark.parametrize("column_count", [10, 100])
123
136
  @pytest.mark.parametrize("dtype", [np.float32, np.float64])
137
+ @pytest.mark.parametrize("assume_centered", [True, False])
124
138
  def test_sklearnex_fit_on_random_data(
125
- dataframe, queue, num_batches, row_count, column_count, dtype
139
+ dataframe, queue, num_batches, row_count, column_count, dtype, assume_centered
126
140
  ):
127
141
  from sklearnex.covariance import IncrementalEmpiricalCovariance
128
142
 
@@ -132,12 +146,35 @@ def test_sklearnex_fit_on_random_data(
132
146
  X = X.astype(dtype)
133
147
  X_df = _convert_to_dataframe(X, sycl_queue=queue, target_df=dataframe)
134
148
  batch_size = row_count // num_batches
135
- inccov = IncrementalEmpiricalCovariance(batch_size=batch_size)
149
+ inccov = IncrementalEmpiricalCovariance(
150
+ batch_size=batch_size, assume_centered=assume_centered
151
+ )
136
152
 
137
153
  result = inccov.fit(X_df)
138
154
 
139
- expected_covariance = np.cov(X.T, bias=1)
140
- expected_means = np.mean(X, axis=0)
155
+ if assume_centered:
156
+ expected_covariance = np.dot(X.T, X) / X.shape[0]
157
+ expected_means = np.zeros_like(X[0])
158
+ else:
159
+ expected_covariance = np.cov(X.T, bias=1)
160
+ expected_means = np.mean(X, axis=0)
141
161
 
142
162
  assert_allclose(expected_covariance, result.covariance_, atol=1e-6)
143
163
  assert_allclose(expected_means, result.location_, atol=1e-6)
164
+
165
+
166
+ # Monkeypatch IncrementalEmpiricalCovariance into relevant sklearn.covariance tests
167
+ @pytest.mark.allow_sklearn_fallback
168
+ @pytest.mark.parametrize(
169
+ "sklearn_test",
170
+ [
171
+ test_covariance,
172
+ test_EmpiricalCovariance_validates_mahalanobis,
173
+ ],
174
+ )
175
+ def test_IncrementalEmpiricalCovariance_against_sklearn(monkeypatch, sklearn_test):
176
+ from sklearnex.covariance import IncrementalEmpiricalCovariance
177
+
178
+ class_name = ".".join([sklearn_test.__module__, "EmpiricalCovariance"])
179
+ monkeypatch.setattr(class_name, IncrementalEmpiricalCovariance)
180
+ sklearn_test()
@@ -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
 
@@ -95,6 +110,7 @@ if daal_check_version((2024, "P", 100)):
95
110
  self._fit(X)
96
111
  return self
97
112
 
113
+ @wrap_output_data
98
114
  def _fit(self, X):
99
115
  if sklearn_check_version("1.2"):
100
116
  self._validate_params()
@@ -106,7 +122,7 @@ if daal_check_version((2024, "P", 100)):
106
122
  target_type=numbers.Integral,
107
123
  )
108
124
 
109
- U, S, Vt = dispatch(
125
+ return dispatch(
110
126
  self,
111
127
  "fit",
112
128
  {
@@ -115,7 +131,6 @@ if daal_check_version((2024, "P", 100)):
115
131
  },
116
132
  X,
117
133
  )
118
- return U, S, Vt
119
134
 
120
135
  def _onedal_fit(self, X, queue=None):
121
136
  X = self._validate_data(
@@ -128,7 +143,7 @@ if daal_check_version((2024, "P", 100)):
128
143
  onedal_params = {
129
144
  "n_components": self.n_components,
130
145
  "is_deterministic": True,
131
- "method": "cov",
146
+ "method": "svd" if self._fit_svd_solver == "onedal_svd" else "cov",
132
147
  "whiten": self.whiten,
133
148
  }
134
149
  self._onedal_estimator = onedal_PCA(**onedal_params)
@@ -139,7 +154,13 @@ if daal_check_version((2024, "P", 100)):
139
154
  S = self.singular_values_
140
155
  Vt = self.components_
141
156
 
142
- 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
143
164
 
144
165
  @wrap_output_data
145
166
  def transform(self, X):
@@ -155,34 +176,39 @@ if daal_check_version((2024, "P", 100)):
155
176
 
156
177
  def _onedal_transform(self, X, queue=None):
157
178
  check_is_fitted(self)
179
+ if sklearn_check_version("1.0"):
180
+ self._check_feature_names(X, reset=False)
158
181
  X = self._validate_data(
159
182
  X,
160
183
  dtype=[np.float64, np.float32],
161
184
  reset=False,
162
185
  )
163
186
  self._validate_n_features_in_after_fitting(X)
164
- if sklearn_check_version("1.0"):
165
- self._check_feature_names(X, reset=False)
166
187
 
167
188
  return self._onedal_estimator.predict(X, queue=queue)
168
189
 
169
- @wrap_output_data
170
190
  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
- X_transformed = self._onedal_transform(X)
175
- return X_transformed
191
+ if sklearn_check_version("1.5"):
192
+ U, S, Vt, X_fit, x_is_centered, xp = self._fit(X)
176
193
  else:
194
+ U, S, Vt = self._fit(X)
195
+ X_fit = X
196
+ if hasattr(self, "_onedal_estimator"):
197
+ # oneDAL PCA was fit
198
+ return self.transform(X)
199
+ elif U is not None:
177
200
  # Scikit-learn PCA was fit
178
201
  U = U[:, : self.n_components_]
179
202
 
180
203
  if self.whiten:
181
- U *= sqrt(X.shape[0] - 1)
204
+ U *= sqrt(X_fit.shape[0] - 1)
182
205
  else:
183
206
  U *= S[: self.n_components_]
184
207
 
185
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)
186
212
 
187
213
  def _onedal_supported(self, method_name, X):
188
214
  class_name = self.__class__.__name__
@@ -200,7 +226,13 @@ if daal_check_version((2024, "P", 100)):
200
226
  ),
201
227
  (
202
228
  self._is_solver_compatible_with_onedal(shape_tuple),
203
- 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
+ ),
204
236
  ),
205
237
  (not issparse(X), "oneDAL PCA does not support sparse data"),
206
238
  ]
@@ -255,7 +287,13 @@ if daal_check_version((2024, "P", 100)):
255
287
 
256
288
  if self._fit_svd_solver == "auto":
257
289
  if sklearn_check_version("1.1"):
258
- 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":
259
297
  self._fit_svd_solver = "full"
260
298
  elif 1 <= n_components < 0.8 * n_sf_min:
261
299
  self._fit_svd_solver = "randomized"
@@ -289,7 +327,23 @@ if daal_check_version((2024, "P", 100)):
289
327
  else:
290
328
  self._fit_svd_solver = "full"
291
329
 
292
- 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"
293
347
  return True
294
348
  else:
295
349
  return False
@@ -298,11 +352,9 @@ if daal_check_version((2024, "P", 100)):
298
352
  self.n_samples_ = self._onedal_estimator.n_samples_
299
353
  if sklearn_check_version("1.2"):
300
354
  self.n_features_in_ = self._onedal_estimator.n_features_
301
- elif sklearn_check_version("0.24"):
302
- self.n_features_ = self._onedal_estimator.n_features_
303
- self.n_features_in_ = self._onedal_estimator.n_features_
304
355
  else:
305
356
  self.n_features_ = self._onedal_estimator.n_features_
357
+ self.n_features_in_ = self._onedal_estimator.n_features_
306
358
  self.n_components_ = self._onedal_estimator.n_components_
307
359
  self.components_ = self._onedal_estimator.components_
308
360
  self.mean_ = self._onedal_estimator.mean_
@@ -41,10 +41,10 @@ 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__
@@ -93,6 +93,7 @@ def get_patch_map_core(preview=False):
93
93
  # Scikit-learn* modules
94
94
  import sklearn as base_module
95
95
  import sklearn.cluster as cluster_module
96
+ import sklearn.covariance as covariance_module
96
97
  import sklearn.decomposition as decomposition_module
97
98
  import sklearn.ensemble as ensemble_module
98
99
  import sklearn.linear_model as linear_model_module
@@ -115,11 +116,17 @@ def get_patch_map_core(preview=False):
115
116
  from .utils.parallel import _FuncWrapperOld as _FuncWrapper_sklearnex
116
117
 
117
118
  from .cluster import DBSCAN as DBSCAN_sklearnex
119
+ from .covariance import (
120
+ IncrementalEmpiricalCovariance as IncrementalEmpiricalCovariance_sklearnex,
121
+ )
118
122
  from .decomposition import PCA as PCA_sklearnex
119
123
  from .ensemble import ExtraTreesClassifier as ExtraTreesClassifier_sklearnex
120
124
  from .ensemble import ExtraTreesRegressor as ExtraTreesRegressor_sklearnex
121
125
  from .ensemble import RandomForestClassifier as RandomForestClassifier_sklearnex
122
126
  from .ensemble import RandomForestRegressor as RandomForestRegressor_sklearnex
127
+ from .linear_model import (
128
+ IncrementalLinearRegression as IncrementalLinearRegression_sklearnex,
129
+ )
123
130
  from .linear_model import LinearRegression as LinearRegression_sklearnex
124
131
  from .linear_model import LogisticRegression as LogisticRegression_sklearnex
125
132
  from .neighbors import KNeighborsClassifier as KNeighborsClassifier_sklearnex
@@ -273,6 +280,30 @@ def get_patch_map_core(preview=False):
273
280
  ]
274
281
  mapping["localoutlierfactor"] = mapping["lof"]
275
282
 
283
+ # IncrementalEmpiricalCovariance
284
+ mapping["incrementalempiricalcovariance"] = [
285
+ [
286
+ (
287
+ covariance_module,
288
+ "IncrementalEmpiricalCovariance",
289
+ IncrementalEmpiricalCovariance_sklearnex,
290
+ ),
291
+ None,
292
+ ]
293
+ ]
294
+
295
+ # IncrementalLinearRegression
296
+ mapping["incrementallinearregression"] = [
297
+ [
298
+ (
299
+ linear_model_module,
300
+ "IncrementalLinearRegression",
301
+ IncrementalLinearRegression_sklearnex,
302
+ ),
303
+ None,
304
+ ]
305
+ ]
306
+
276
307
  # Configs
277
308
  mapping["set_config"] = [
278
309
  [(base_module, "set_config", set_config_sklearnex), None]
@@ -314,10 +345,10 @@ def get_patch_names():
314
345
  def patch_sklearn(name=None, verbose=True, global_patch=False, preview=False):
315
346
  if preview:
316
347
  os.environ["SKLEARNEX_PREVIEW"] = "enabled_via_patch_sklearn"
317
- if not sklearn_check_version("0.22"):
348
+ if not sklearn_check_version("0.24"):
318
349
  raise NotImplementedError(
319
350
  "Intel(R) Extension for Scikit-learn* patches apply "
320
- "for scikit-learn >= 0.22 only ..."
351
+ "for scikit-learn >= 0.24 only ..."
321
352
  )
322
353
 
323
354
  if global_patch: