scikit-learn-intelex 2025.10.0__py313-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.
Files changed (267) hide show
  1. scikit_learn_intelex-2025.10.0.data/data/Lib/site-packages/daal4py/__init__.py +73 -0
  2. scikit_learn_intelex-2025.10.0.data/data/Lib/site-packages/daal4py/__main__.py +58 -0
  3. scikit_learn_intelex-2025.10.0.data/data/Lib/site-packages/daal4py/_daal4py.cp313-win_amd64.pyd +0 -0
  4. scikit_learn_intelex-2025.10.0.data/data/Lib/site-packages/daal4py/mb/__init__.py +94 -0
  5. scikit_learn_intelex-2025.10.0.data/data/Lib/site-packages/daal4py/mb/gbt_convertors.py +1199 -0
  6. scikit_learn_intelex-2025.10.0.data/data/Lib/site-packages/daal4py/mb/logistic_regression_builders.py +211 -0
  7. scikit_learn_intelex-2025.10.0.data/data/Lib/site-packages/daal4py/mb/tree_based_builders.py +425 -0
  8. scikit_learn_intelex-2025.10.0.data/data/Lib/site-packages/daal4py/mpi_transceiver.cp313-win_amd64.pyd +0 -0
  9. scikit_learn_intelex-2025.10.0.data/data/Lib/site-packages/daal4py/sklearn/__init__.py +40 -0
  10. scikit_learn_intelex-2025.10.0.data/data/Lib/site-packages/daal4py/sklearn/_n_jobs_support.py +252 -0
  11. scikit_learn_intelex-2025.10.0.data/data/Lib/site-packages/daal4py/sklearn/_utils.py +245 -0
  12. scikit_learn_intelex-2025.10.0.data/data/Lib/site-packages/daal4py/sklearn/cluster/__init__.py +20 -0
  13. scikit_learn_intelex-2025.10.0.data/data/Lib/site-packages/daal4py/sklearn/cluster/dbscan.py +165 -0
  14. scikit_learn_intelex-2025.10.0.data/data/Lib/site-packages/daal4py/sklearn/cluster/k_means.py +565 -0
  15. scikit_learn_intelex-2025.10.0.data/data/Lib/site-packages/daal4py/sklearn/cluster/tests/test_dbscan.py +109 -0
  16. scikit_learn_intelex-2025.10.0.data/data/Lib/site-packages/daal4py/sklearn/decomposition/__init__.py +19 -0
  17. scikit_learn_intelex-2025.10.0.data/data/Lib/site-packages/daal4py/sklearn/decomposition/_pca.py +528 -0
  18. scikit_learn_intelex-2025.10.0.data/data/Lib/site-packages/daal4py/sklearn/ensemble/AdaBoostClassifier.py +192 -0
  19. scikit_learn_intelex-2025.10.0.data/data/Lib/site-packages/daal4py/sklearn/ensemble/GBTDAAL.py +333 -0
  20. scikit_learn_intelex-2025.10.0.data/data/Lib/site-packages/daal4py/sklearn/ensemble/__init__.py +27 -0
  21. scikit_learn_intelex-2025.10.0.data/data/Lib/site-packages/daal4py/sklearn/ensemble/_forest.py +1285 -0
  22. scikit_learn_intelex-2025.10.0.data/data/Lib/site-packages/daal4py/sklearn/ensemble/tests/test_decision_forest.py +206 -0
  23. scikit_learn_intelex-2025.10.0.data/data/Lib/site-packages/daal4py/sklearn/linear_model/__init__.py +29 -0
  24. scikit_learn_intelex-2025.10.0.data/data/Lib/site-packages/daal4py/sklearn/linear_model/_coordinate_descent.py +826 -0
  25. scikit_learn_intelex-2025.10.0.data/data/Lib/site-packages/daal4py/sklearn/linear_model/_linear.py +269 -0
  26. scikit_learn_intelex-2025.10.0.data/data/Lib/site-packages/daal4py/sklearn/linear_model/_ridge.py +290 -0
  27. scikit_learn_intelex-2025.10.0.data/data/Lib/site-packages/daal4py/sklearn/linear_model/coordinate_descent.py +17 -0
  28. scikit_learn_intelex-2025.10.0.data/data/Lib/site-packages/daal4py/sklearn/linear_model/linear.py +17 -0
  29. scikit_learn_intelex-2025.10.0.data/data/Lib/site-packages/daal4py/sklearn/linear_model/logistic_loss.py +195 -0
  30. scikit_learn_intelex-2025.10.0.data/data/Lib/site-packages/daal4py/sklearn/linear_model/logistic_path.py +561 -0
  31. scikit_learn_intelex-2025.10.0.data/data/Lib/site-packages/daal4py/sklearn/linear_model/ridge.py +17 -0
  32. scikit_learn_intelex-2025.10.0.data/data/Lib/site-packages/daal4py/sklearn/linear_model/tests/test_enet.py +157 -0
  33. scikit_learn_intelex-2025.10.0.data/data/Lib/site-packages/daal4py/sklearn/linear_model/tests/test_linear.py +198 -0
  34. scikit_learn_intelex-2025.10.0.data/data/Lib/site-packages/daal4py/sklearn/linear_model/tests/test_ridge.py +69 -0
  35. scikit_learn_intelex-2025.10.0.data/data/Lib/site-packages/daal4py/sklearn/manifold/__init__.py +19 -0
  36. scikit_learn_intelex-2025.10.0.data/data/Lib/site-packages/daal4py/sklearn/manifold/_t_sne.py +432 -0
  37. scikit_learn_intelex-2025.10.0.data/data/Lib/site-packages/daal4py/sklearn/metrics/__init__.py +20 -0
  38. scikit_learn_intelex-2025.10.0.data/data/Lib/site-packages/daal4py/sklearn/metrics/_pairwise.py +259 -0
  39. scikit_learn_intelex-2025.10.0.data/data/Lib/site-packages/daal4py/sklearn/metrics/_ranking.py +210 -0
  40. scikit_learn_intelex-2025.10.0.data/data/Lib/site-packages/daal4py/sklearn/model_selection/__init__.py +19 -0
  41. scikit_learn_intelex-2025.10.0.data/data/Lib/site-packages/daal4py/sklearn/model_selection/_split.py +309 -0
  42. scikit_learn_intelex-2025.10.0.data/data/Lib/site-packages/daal4py/sklearn/model_selection/tests/test_split.py +56 -0
  43. scikit_learn_intelex-2025.10.0.data/data/Lib/site-packages/daal4py/sklearn/monkeypatch/__init__.py +0 -0
  44. scikit_learn_intelex-2025.10.0.data/data/Lib/site-packages/daal4py/sklearn/monkeypatch/dispatcher.py +232 -0
  45. scikit_learn_intelex-2025.10.0.data/data/Lib/site-packages/daal4py/sklearn/monkeypatch/tests/_models_info.py +164 -0
  46. scikit_learn_intelex-2025.10.0.data/data/Lib/site-packages/daal4py/sklearn/monkeypatch/tests/test_monkeypatch.py +71 -0
  47. scikit_learn_intelex-2025.10.0.data/data/Lib/site-packages/daal4py/sklearn/monkeypatch/tests/test_patching.py +90 -0
  48. scikit_learn_intelex-2025.10.0.data/data/Lib/site-packages/daal4py/sklearn/monkeypatch/tests/utils/_launch_algorithms.py +117 -0
  49. scikit_learn_intelex-2025.10.0.data/data/Lib/site-packages/daal4py/sklearn/neighbors/__init__.py +21 -0
  50. scikit_learn_intelex-2025.10.0.data/data/Lib/site-packages/daal4py/sklearn/neighbors/_base.py +493 -0
  51. scikit_learn_intelex-2025.10.0.data/data/Lib/site-packages/daal4py/sklearn/neighbors/_classification.py +136 -0
  52. scikit_learn_intelex-2025.10.0.data/data/Lib/site-packages/daal4py/sklearn/neighbors/_regression.py +72 -0
  53. scikit_learn_intelex-2025.10.0.data/data/Lib/site-packages/daal4py/sklearn/neighbors/_unsupervised.py +55 -0
  54. scikit_learn_intelex-2025.10.0.data/data/Lib/site-packages/daal4py/sklearn/neighbors/tests/test_kneighbors.py +113 -0
  55. scikit_learn_intelex-2025.10.0.data/data/Lib/site-packages/daal4py/sklearn/svm/__init__.py +19 -0
  56. scikit_learn_intelex-2025.10.0.data/data/Lib/site-packages/daal4py/sklearn/svm/svm.py +736 -0
  57. scikit_learn_intelex-2025.10.0.data/data/Lib/site-packages/daal4py/sklearn/utils/__init__.py +21 -0
  58. scikit_learn_intelex-2025.10.0.data/data/Lib/site-packages/daal4py/sklearn/utils/base.py +80 -0
  59. scikit_learn_intelex-2025.10.0.data/data/Lib/site-packages/daal4py/sklearn/utils/tests/test_utils.py +51 -0
  60. scikit_learn_intelex-2025.10.0.data/data/Lib/site-packages/daal4py/sklearn/utils/validation.py +772 -0
  61. scikit_learn_intelex-2025.10.0.data/data/Lib/site-packages/onedal/__init__.py +151 -0
  62. scikit_learn_intelex-2025.10.0.data/data/Lib/site-packages/onedal/_config.py +80 -0
  63. scikit_learn_intelex-2025.10.0.data/data/Lib/site-packages/onedal/_device_offload.py +199 -0
  64. scikit_learn_intelex-2025.10.0.data/data/Lib/site-packages/onedal/_onedal_py_dpc.cp313-win_amd64.pyd +0 -0
  65. scikit_learn_intelex-2025.10.0.data/data/Lib/site-packages/onedal/_onedal_py_host.cp313-win_amd64.pyd +0 -0
  66. scikit_learn_intelex-2025.10.0.data/data/Lib/site-packages/onedal/basic_statistics/__init__.py +20 -0
  67. scikit_learn_intelex-2025.10.0.data/data/Lib/site-packages/onedal/basic_statistics/basic_statistics.py +151 -0
  68. scikit_learn_intelex-2025.10.0.data/data/Lib/site-packages/onedal/basic_statistics/incremental_basic_statistics.py +165 -0
  69. scikit_learn_intelex-2025.10.0.data/data/Lib/site-packages/onedal/basic_statistics/tests/test_basic_statistics.py +241 -0
  70. scikit_learn_intelex-2025.10.0.data/data/Lib/site-packages/onedal/basic_statistics/tests/test_incremental_basic_statistics.py +279 -0
  71. scikit_learn_intelex-2025.10.0.data/data/Lib/site-packages/onedal/basic_statistics/tests/utils.py +50 -0
  72. scikit_learn_intelex-2025.10.0.data/data/Lib/site-packages/onedal/cluster/__init__.py +27 -0
  73. scikit_learn_intelex-2025.10.0.data/data/Lib/site-packages/onedal/cluster/dbscan.py +80 -0
  74. scikit_learn_intelex-2025.10.0.data/data/Lib/site-packages/onedal/cluster/kmeans.py +582 -0
  75. scikit_learn_intelex-2025.10.0.data/data/Lib/site-packages/onedal/cluster/kmeans_init.py +145 -0
  76. scikit_learn_intelex-2025.10.0.data/data/Lib/site-packages/onedal/cluster/tests/test_dbscan.py +125 -0
  77. scikit_learn_intelex-2025.10.0.data/data/Lib/site-packages/onedal/cluster/tests/test_kmeans.py +88 -0
  78. scikit_learn_intelex-2025.10.0.data/data/Lib/site-packages/onedal/cluster/tests/test_kmeans_init.py +93 -0
  79. scikit_learn_intelex-2025.10.0.data/data/Lib/site-packages/onedal/common/_backend.py +258 -0
  80. scikit_learn_intelex-2025.10.0.data/data/Lib/site-packages/onedal/common/_estimator_checks.py +47 -0
  81. scikit_learn_intelex-2025.10.0.data/data/Lib/site-packages/onedal/common/_mixin.py +62 -0
  82. scikit_learn_intelex-2025.10.0.data/data/Lib/site-packages/onedal/common/hyperparameters.py +148 -0
  83. scikit_learn_intelex-2025.10.0.data/data/Lib/site-packages/onedal/common/tests/test_sycl.py +148 -0
  84. scikit_learn_intelex-2025.10.0.data/data/Lib/site-packages/onedal/covariance/__init__.py +20 -0
  85. scikit_learn_intelex-2025.10.0.data/data/Lib/site-packages/onedal/covariance/covariance.py +121 -0
  86. scikit_learn_intelex-2025.10.0.data/data/Lib/site-packages/onedal/covariance/incremental_covariance.py +151 -0
  87. scikit_learn_intelex-2025.10.0.data/data/Lib/site-packages/onedal/covariance/tests/test_covariance.py +50 -0
  88. scikit_learn_intelex-2025.10.0.data/data/Lib/site-packages/onedal/covariance/tests/test_incremental_covariance.py +190 -0
  89. scikit_learn_intelex-2025.10.0.data/data/Lib/site-packages/onedal/datatypes/__init__.py +29 -0
  90. scikit_learn_intelex-2025.10.0.data/data/Lib/site-packages/onedal/datatypes/_data_conversion.py +158 -0
  91. scikit_learn_intelex-2025.10.0.data/data/Lib/site-packages/onedal/datatypes/_dlpack.py +64 -0
  92. scikit_learn_intelex-2025.10.0.data/data/Lib/site-packages/onedal/datatypes/_sycl_usm.py +63 -0
  93. scikit_learn_intelex-2025.10.0.data/data/Lib/site-packages/onedal/datatypes/tests/common.py +131 -0
  94. scikit_learn_intelex-2025.10.0.data/data/Lib/site-packages/onedal/datatypes/tests/test_data.py +686 -0
  95. scikit_learn_intelex-2025.10.0.data/data/Lib/site-packages/onedal/decomposition/__init__.py +20 -0
  96. scikit_learn_intelex-2025.10.0.data/data/Lib/site-packages/onedal/decomposition/incremental_pca.py +218 -0
  97. scikit_learn_intelex-2025.10.0.data/data/Lib/site-packages/onedal/decomposition/pca.py +124 -0
  98. scikit_learn_intelex-2025.10.0.data/data/Lib/site-packages/onedal/decomposition/tests/test_incremental_pca.py +291 -0
  99. scikit_learn_intelex-2025.10.0.data/data/Lib/site-packages/onedal/dummy/__init__.py +19 -0
  100. scikit_learn_intelex-2025.10.0.data/data/Lib/site-packages/onedal/dummy/dummy.py +137 -0
  101. scikit_learn_intelex-2025.10.0.data/data/Lib/site-packages/onedal/ensemble/__init__.py +29 -0
  102. scikit_learn_intelex-2025.10.0.data/data/Lib/site-packages/onedal/ensemble/forest.py +781 -0
  103. scikit_learn_intelex-2025.10.0.data/data/Lib/site-packages/onedal/ensemble/tests/test_random_forest.py +97 -0
  104. scikit_learn_intelex-2025.10.0.data/data/Lib/site-packages/onedal/linear_model/__init__.py +27 -0
  105. scikit_learn_intelex-2025.10.0.data/data/Lib/site-packages/onedal/linear_model/incremental_linear_model.py +201 -0
  106. scikit_learn_intelex-2025.10.0.data/data/Lib/site-packages/onedal/linear_model/linear_model.py +230 -0
  107. scikit_learn_intelex-2025.10.0.data/data/Lib/site-packages/onedal/linear_model/logistic_regression.py +293 -0
  108. scikit_learn_intelex-2025.10.0.data/data/Lib/site-packages/onedal/linear_model/tests/test_incremental_linear_regression.py +213 -0
  109. scikit_learn_intelex-2025.10.0.data/data/Lib/site-packages/onedal/linear_model/tests/test_incremental_ridge_regression.py +171 -0
  110. scikit_learn_intelex-2025.10.0.data/data/Lib/site-packages/onedal/linear_model/tests/test_linear_regression.py +252 -0
  111. scikit_learn_intelex-2025.10.0.data/data/Lib/site-packages/onedal/linear_model/tests/test_logistic_regression.py +95 -0
  112. scikit_learn_intelex-2025.10.0.data/data/Lib/site-packages/onedal/linear_model/tests/test_ridge.py +95 -0
  113. scikit_learn_intelex-2025.10.0.data/data/Lib/site-packages/onedal/neighbors/__init__.py +19 -0
  114. scikit_learn_intelex-2025.10.0.data/data/Lib/site-packages/onedal/neighbors/neighbors.py +690 -0
  115. scikit_learn_intelex-2025.10.0.data/data/Lib/site-packages/onedal/neighbors/tests/test_knn_classification.py +49 -0
  116. scikit_learn_intelex-2025.10.0.data/data/Lib/site-packages/onedal/primitives/__init__.py +27 -0
  117. scikit_learn_intelex-2025.10.0.data/data/Lib/site-packages/onedal/primitives/get_tree.py +27 -0
  118. scikit_learn_intelex-2025.10.0.data/data/Lib/site-packages/onedal/primitives/kernel_functions.py +202 -0
  119. scikit_learn_intelex-2025.10.0.data/data/Lib/site-packages/onedal/primitives/tests/test_kernel_functions.py +159 -0
  120. scikit_learn_intelex-2025.10.0.data/data/Lib/site-packages/onedal/svm/__init__.py +19 -0
  121. scikit_learn_intelex-2025.10.0.data/data/Lib/site-packages/onedal/svm/svm.py +592 -0
  122. scikit_learn_intelex-2025.10.0.data/data/Lib/site-packages/onedal/svm/tests/test_csr_svm.py +352 -0
  123. scikit_learn_intelex-2025.10.0.data/data/Lib/site-packages/onedal/svm/tests/test_nusvc.py +204 -0
  124. scikit_learn_intelex-2025.10.0.data/data/Lib/site-packages/onedal/svm/tests/test_nusvr.py +210 -0
  125. scikit_learn_intelex-2025.10.0.data/data/Lib/site-packages/onedal/svm/tests/test_svc.py +168 -0
  126. scikit_learn_intelex-2025.10.0.data/data/Lib/site-packages/onedal/svm/tests/test_svr.py +243 -0
  127. scikit_learn_intelex-2025.10.0.data/data/Lib/site-packages/onedal/tests/test_common.py +71 -0
  128. scikit_learn_intelex-2025.10.0.data/data/Lib/site-packages/onedal/tests/utils/_dataframes_support.py +179 -0
  129. scikit_learn_intelex-2025.10.0.data/data/Lib/site-packages/onedal/tests/utils/_device_selection.py +94 -0
  130. scikit_learn_intelex-2025.10.0.data/data/Lib/site-packages/onedal/utils/_array_api.py +98 -0
  131. scikit_learn_intelex-2025.10.0.data/data/Lib/site-packages/onedal/utils/_sycl_queue_manager.py +213 -0
  132. scikit_learn_intelex-2025.10.0.data/data/Lib/site-packages/onedal/utils/_third_party.py +220 -0
  133. scikit_learn_intelex-2025.10.0.data/data/Lib/site-packages/onedal/utils/tests/test_validation.py +142 -0
  134. scikit_learn_intelex-2025.10.0.data/data/Lib/site-packages/onedal/utils/validation.py +503 -0
  135. scikit_learn_intelex-2025.10.0.data/data/Lib/site-packages/sklearnex/__init__.py +69 -0
  136. scikit_learn_intelex-2025.10.0.data/data/Lib/site-packages/sklearnex/__main__.py +58 -0
  137. scikit_learn_intelex-2025.10.0.data/data/Lib/site-packages/sklearnex/_config.py +163 -0
  138. scikit_learn_intelex-2025.10.0.data/data/Lib/site-packages/sklearnex/_device_offload.py +205 -0
  139. scikit_learn_intelex-2025.10.0.data/data/Lib/site-packages/sklearnex/_utils.py +219 -0
  140. scikit_learn_intelex-2025.10.0.data/data/Lib/site-packages/sklearnex/base.py +109 -0
  141. scikit_learn_intelex-2025.10.0.data/data/Lib/site-packages/sklearnex/basic_statistics/__init__.py +20 -0
  142. scikit_learn_intelex-2025.10.0.data/data/Lib/site-packages/sklearnex/basic_statistics/basic_statistics.py +241 -0
  143. scikit_learn_intelex-2025.10.0.data/data/Lib/site-packages/sklearnex/basic_statistics/incremental_basic_statistics.py +338 -0
  144. scikit_learn_intelex-2025.10.0.data/data/Lib/site-packages/sklearnex/basic_statistics/tests/test_basic_statistics.py +405 -0
  145. scikit_learn_intelex-2025.10.0.data/data/Lib/site-packages/sklearnex/basic_statistics/tests/test_incremental_basic_statistics.py +455 -0
  146. scikit_learn_intelex-2025.10.0.data/data/Lib/site-packages/sklearnex/cluster/__init__.py +20 -0
  147. scikit_learn_intelex-2025.10.0.data/data/Lib/site-packages/sklearnex/cluster/dbscan.py +199 -0
  148. scikit_learn_intelex-2025.10.0.data/data/Lib/site-packages/sklearnex/cluster/k_means.py +399 -0
  149. scikit_learn_intelex-2025.10.0.data/data/Lib/site-packages/sklearnex/cluster/tests/test_dbscan.py +38 -0
  150. scikit_learn_intelex-2025.10.0.data/data/Lib/site-packages/sklearnex/cluster/tests/test_kmeans.py +157 -0
  151. scikit_learn_intelex-2025.10.0.data/data/Lib/site-packages/sklearnex/conftest.py +82 -0
  152. scikit_learn_intelex-2025.10.0.data/data/Lib/site-packages/sklearnex/covariance/__init__.py +19 -0
  153. scikit_learn_intelex-2025.10.0.data/data/Lib/site-packages/sklearnex/covariance/incremental_covariance.py +440 -0
  154. scikit_learn_intelex-2025.10.0.data/data/Lib/site-packages/sklearnex/covariance/tests/test_incremental_covariance.py +307 -0
  155. scikit_learn_intelex-2025.10.0.data/data/Lib/site-packages/sklearnex/decomposition/__init__.py +19 -0
  156. scikit_learn_intelex-2025.10.0.data/data/Lib/site-packages/sklearnex/decomposition/pca.py +558 -0
  157. scikit_learn_intelex-2025.10.0.data/data/Lib/site-packages/sklearnex/decomposition/tests/test_pca.py +164 -0
  158. scikit_learn_intelex-2025.10.0.data/data/Lib/site-packages/sklearnex/dispatcher.py +572 -0
  159. scikit_learn_intelex-2025.10.0.data/data/Lib/site-packages/sklearnex/doc/third-party-programs.txt +629 -0
  160. scikit_learn_intelex-2025.10.0.data/data/Lib/site-packages/sklearnex/dummy/__init__.py +19 -0
  161. scikit_learn_intelex-2025.10.0.data/data/Lib/site-packages/sklearnex/dummy/_dummy.py +615 -0
  162. scikit_learn_intelex-2025.10.0.data/data/Lib/site-packages/sklearnex/dummy/tests/test_dummy.py +62 -0
  163. scikit_learn_intelex-2025.10.0.data/data/Lib/site-packages/sklearnex/ensemble/__init__.py +29 -0
  164. scikit_learn_intelex-2025.10.0.data/data/Lib/site-packages/sklearnex/ensemble/_forest.py +1799 -0
  165. scikit_learn_intelex-2025.10.0.data/data/Lib/site-packages/sklearnex/ensemble/tests/test_forest.py +196 -0
  166. scikit_learn_intelex-2025.10.0.data/data/Lib/site-packages/sklearnex/glob/__main__.py +72 -0
  167. scikit_learn_intelex-2025.10.0.data/data/Lib/site-packages/sklearnex/glob/dispatcher.py +101 -0
  168. scikit_learn_intelex-2025.10.0.data/data/Lib/site-packages/sklearnex/linear_model/__init__.py +32 -0
  169. scikit_learn_intelex-2025.10.0.data/data/Lib/site-packages/sklearnex/linear_model/coordinate_descent.py +44 -0
  170. scikit_learn_intelex-2025.10.0.data/data/Lib/site-packages/sklearnex/linear_model/incremental_linear.py +427 -0
  171. scikit_learn_intelex-2025.10.0.data/data/Lib/site-packages/sklearnex/linear_model/incremental_ridge.py +407 -0
  172. scikit_learn_intelex-2025.10.0.data/data/Lib/site-packages/sklearnex/linear_model/linear.py +363 -0
  173. scikit_learn_intelex-2025.10.0.data/data/Lib/site-packages/sklearnex/linear_model/logistic_regression.py +466 -0
  174. scikit_learn_intelex-2025.10.0.data/data/Lib/site-packages/sklearnex/linear_model/ridge.py +407 -0
  175. scikit_learn_intelex-2025.10.0.data/data/Lib/site-packages/sklearnex/linear_model/tests/test_incremental_linear.py +267 -0
  176. scikit_learn_intelex-2025.10.0.data/data/Lib/site-packages/sklearnex/linear_model/tests/test_incremental_ridge.py +214 -0
  177. scikit_learn_intelex-2025.10.0.data/data/Lib/site-packages/sklearnex/linear_model/tests/test_linear.py +167 -0
  178. scikit_learn_intelex-2025.10.0.data/data/Lib/site-packages/sklearnex/linear_model/tests/test_logreg.py +565 -0
  179. scikit_learn_intelex-2025.10.0.data/data/Lib/site-packages/sklearnex/linear_model/tests/test_ridge.py +256 -0
  180. scikit_learn_intelex-2025.10.0.data/data/Lib/site-packages/sklearnex/manifold/__init__.py +19 -0
  181. scikit_learn_intelex-2025.10.0.data/data/Lib/site-packages/sklearnex/manifold/t_sne.py +28 -0
  182. scikit_learn_intelex-2025.10.0.data/data/Lib/site-packages/sklearnex/manifold/tests/test_tsne.py +256 -0
  183. scikit_learn_intelex-2025.10.0.data/data/Lib/site-packages/sklearnex/metrics/__init__.py +23 -0
  184. scikit_learn_intelex-2025.10.0.data/data/Lib/site-packages/sklearnex/metrics/pairwise.py +20 -0
  185. scikit_learn_intelex-2025.10.0.data/data/Lib/site-packages/sklearnex/metrics/ranking.py +20 -0
  186. scikit_learn_intelex-2025.10.0.data/data/Lib/site-packages/sklearnex/metrics/tests/test_metrics.py +39 -0
  187. scikit_learn_intelex-2025.10.0.data/data/Lib/site-packages/sklearnex/model_selection/__init__.py +21 -0
  188. scikit_learn_intelex-2025.10.0.data/data/Lib/site-packages/sklearnex/model_selection/split.py +20 -0
  189. scikit_learn_intelex-2025.10.0.data/data/Lib/site-packages/sklearnex/model_selection/tests/test_model_selection.py +34 -0
  190. scikit_learn_intelex-2025.10.0.data/data/Lib/site-packages/sklearnex/neighbors/__init__.py +27 -0
  191. scikit_learn_intelex-2025.10.0.data/data/Lib/site-packages/sklearnex/neighbors/_lof.py +189 -0
  192. scikit_learn_intelex-2025.10.0.data/data/Lib/site-packages/sklearnex/neighbors/common.py +313 -0
  193. scikit_learn_intelex-2025.10.0.data/data/Lib/site-packages/sklearnex/neighbors/knn_classification.py +189 -0
  194. scikit_learn_intelex-2025.10.0.data/data/Lib/site-packages/sklearnex/neighbors/knn_regression.py +167 -0
  195. scikit_learn_intelex-2025.10.0.data/data/Lib/site-packages/sklearnex/neighbors/knn_unsupervised.py +170 -0
  196. scikit_learn_intelex-2025.10.0.data/data/Lib/site-packages/sklearnex/neighbors/tests/test_neighbors.py +82 -0
  197. scikit_learn_intelex-2025.10.0.data/data/Lib/site-packages/sklearnex/preview/__init__.py +17 -0
  198. scikit_learn_intelex-2025.10.0.data/data/Lib/site-packages/sklearnex/preview/covariance/__init__.py +19 -0
  199. scikit_learn_intelex-2025.10.0.data/data/Lib/site-packages/sklearnex/preview/covariance/covariance.py +261 -0
  200. scikit_learn_intelex-2025.10.0.data/data/Lib/site-packages/sklearnex/preview/covariance/tests/test_covariance.py +112 -0
  201. scikit_learn_intelex-2025.10.0.data/data/Lib/site-packages/sklearnex/preview/decomposition/__init__.py +19 -0
  202. scikit_learn_intelex-2025.10.0.data/data/Lib/site-packages/sklearnex/preview/decomposition/incremental_pca.py +406 -0
  203. scikit_learn_intelex-2025.10.0.data/data/Lib/site-packages/sklearnex/preview/decomposition/tests/test_incremental_pca.py +390 -0
  204. scikit_learn_intelex-2025.10.0.data/data/Lib/site-packages/sklearnex/spmd/__init__.py +25 -0
  205. scikit_learn_intelex-2025.10.0.data/data/Lib/site-packages/sklearnex/spmd/basic_statistics/__init__.py +20 -0
  206. scikit_learn_intelex-2025.10.0.data/data/Lib/site-packages/sklearnex/spmd/basic_statistics/basic_statistics.py +24 -0
  207. scikit_learn_intelex-2025.10.0.data/data/Lib/site-packages/sklearnex/spmd/basic_statistics/incremental_basic_statistics.py +30 -0
  208. scikit_learn_intelex-2025.10.0.data/data/Lib/site-packages/sklearnex/spmd/basic_statistics/tests/test_basic_statistics_spmd.py +117 -0
  209. scikit_learn_intelex-2025.10.0.data/data/Lib/site-packages/sklearnex/spmd/basic_statistics/tests/test_incremental_basic_statistics_spmd.py +314 -0
  210. scikit_learn_intelex-2025.10.0.data/data/Lib/site-packages/sklearnex/spmd/cluster/__init__.py +30 -0
  211. scikit_learn_intelex-2025.10.0.data/data/Lib/site-packages/sklearnex/spmd/cluster/dbscan.py +26 -0
  212. scikit_learn_intelex-2025.10.0.data/data/Lib/site-packages/sklearnex/spmd/cluster/kmeans.py +21 -0
  213. scikit_learn_intelex-2025.10.0.data/data/Lib/site-packages/sklearnex/spmd/cluster/tests/test_dbscan_spmd.py +108 -0
  214. scikit_learn_intelex-2025.10.0.data/data/Lib/site-packages/sklearnex/spmd/cluster/tests/test_kmeans_spmd.py +180 -0
  215. scikit_learn_intelex-2025.10.0.data/data/Lib/site-packages/sklearnex/spmd/covariance/__init__.py +20 -0
  216. scikit_learn_intelex-2025.10.0.data/data/Lib/site-packages/sklearnex/spmd/covariance/covariance.py +24 -0
  217. scikit_learn_intelex-2025.10.0.data/data/Lib/site-packages/sklearnex/spmd/covariance/incremental_covariance.py +29 -0
  218. scikit_learn_intelex-2025.10.0.data/data/Lib/site-packages/sklearnex/spmd/covariance/tests/test_covariance_spmd.py +120 -0
  219. scikit_learn_intelex-2025.10.0.data/data/Lib/site-packages/sklearnex/spmd/covariance/tests/test_incremental_covariance_spmd.py +200 -0
  220. scikit_learn_intelex-2025.10.0.data/data/Lib/site-packages/sklearnex/spmd/decomposition/__init__.py +20 -0
  221. scikit_learn_intelex-2025.10.0.data/data/Lib/site-packages/sklearnex/spmd/decomposition/incremental_pca.py +23 -0
  222. scikit_learn_intelex-2025.10.0.data/data/Lib/site-packages/sklearnex/spmd/decomposition/pca.py +23 -0
  223. scikit_learn_intelex-2025.10.0.data/data/Lib/site-packages/sklearnex/spmd/decomposition/tests/test_incremental_pca_spmd.py +276 -0
  224. scikit_learn_intelex-2025.10.0.data/data/Lib/site-packages/sklearnex/spmd/decomposition/tests/test_pca_spmd.py +146 -0
  225. scikit_learn_intelex-2025.10.0.data/data/Lib/site-packages/sklearnex/spmd/ensemble/__init__.py +19 -0
  226. scikit_learn_intelex-2025.10.0.data/data/Lib/site-packages/sklearnex/spmd/ensemble/forest.py +299 -0
  227. scikit_learn_intelex-2025.10.0.data/data/Lib/site-packages/sklearnex/spmd/ensemble/tests/test_forest_spmd.py +299 -0
  228. scikit_learn_intelex-2025.10.0.data/data/Lib/site-packages/sklearnex/spmd/linear_model/__init__.py +21 -0
  229. scikit_learn_intelex-2025.10.0.data/data/Lib/site-packages/sklearnex/spmd/linear_model/incremental_linear_model.py +28 -0
  230. scikit_learn_intelex-2025.10.0.data/data/Lib/site-packages/sklearnex/spmd/linear_model/linear_model.py +24 -0
  231. scikit_learn_intelex-2025.10.0.data/data/Lib/site-packages/sklearnex/spmd/linear_model/logistic_regression.py +21 -0
  232. scikit_learn_intelex-2025.10.0.data/data/Lib/site-packages/sklearnex/spmd/linear_model/tests/test_incremental_linear_spmd.py +345 -0
  233. scikit_learn_intelex-2025.10.0.data/data/Lib/site-packages/sklearnex/spmd/linear_model/tests/test_linear_regression_spmd.py +162 -0
  234. scikit_learn_intelex-2025.10.0.data/data/Lib/site-packages/sklearnex/spmd/linear_model/tests/test_logistic_regression_spmd.py +169 -0
  235. scikit_learn_intelex-2025.10.0.data/data/Lib/site-packages/sklearnex/spmd/neighbors/__init__.py +23 -0
  236. scikit_learn_intelex-2025.10.0.data/data/Lib/site-packages/sklearnex/spmd/neighbors/tests/test_neighbors_spmd.py +433 -0
  237. scikit_learn_intelex-2025.10.0.data/data/Lib/site-packages/sklearnex/svm/__init__.py +29 -0
  238. scikit_learn_intelex-2025.10.0.data/data/Lib/site-packages/sklearnex/svm/_common.py +403 -0
  239. scikit_learn_intelex-2025.10.0.data/data/Lib/site-packages/sklearnex/svm/nusvc.py +278 -0
  240. scikit_learn_intelex-2025.10.0.data/data/Lib/site-packages/sklearnex/svm/nusvr.py +158 -0
  241. scikit_learn_intelex-2025.10.0.data/data/Lib/site-packages/sklearnex/svm/svc.py +306 -0
  242. scikit_learn_intelex-2025.10.0.data/data/Lib/site-packages/sklearnex/svm/svr.py +155 -0
  243. scikit_learn_intelex-2025.10.0.data/data/Lib/site-packages/sklearnex/svm/tests/test_svm.py +124 -0
  244. scikit_learn_intelex-2025.10.0.data/data/Lib/site-packages/sklearnex/tests/test_common.py +607 -0
  245. scikit_learn_intelex-2025.10.0.data/data/Lib/site-packages/sklearnex/tests/test_config.py +256 -0
  246. scikit_learn_intelex-2025.10.0.data/data/Lib/site-packages/sklearnex/tests/test_hyperparameters.py +111 -0
  247. scikit_learn_intelex-2025.10.0.data/data/Lib/site-packages/sklearnex/tests/test_memory_usage.py +335 -0
  248. scikit_learn_intelex-2025.10.0.data/data/Lib/site-packages/sklearnex/tests/test_monkeypatch.py +269 -0
  249. scikit_learn_intelex-2025.10.0.data/data/Lib/site-packages/sklearnex/tests/test_n_jobs_support.py +111 -0
  250. scikit_learn_intelex-2025.10.0.data/data/Lib/site-packages/sklearnex/tests/test_parallel.py +48 -0
  251. scikit_learn_intelex-2025.10.0.data/data/Lib/site-packages/sklearnex/tests/test_patching.py +418 -0
  252. scikit_learn_intelex-2025.10.0.data/data/Lib/site-packages/sklearnex/tests/test_run_to_run_stability.py +335 -0
  253. scikit_learn_intelex-2025.10.0.data/data/Lib/site-packages/sklearnex/tests/utils/__init__.py +48 -0
  254. scikit_learn_intelex-2025.10.0.data/data/Lib/site-packages/sklearnex/tests/utils/base.py +420 -0
  255. scikit_learn_intelex-2025.10.0.data/data/Lib/site-packages/sklearnex/tests/utils/spmd.py +198 -0
  256. scikit_learn_intelex-2025.10.0.data/data/Lib/site-packages/sklearnex/utils/__init__.py +19 -0
  257. scikit_learn_intelex-2025.10.0.data/data/Lib/site-packages/sklearnex/utils/_array_api.py +217 -0
  258. scikit_learn_intelex-2025.10.0.data/data/Lib/site-packages/sklearnex/utils/class_weight.py +100 -0
  259. scikit_learn_intelex-2025.10.0.data/data/Lib/site-packages/sklearnex/utils/parallel.py +97 -0
  260. scikit_learn_intelex-2025.10.0.data/data/Lib/site-packages/sklearnex/utils/tests/test_class_weight.py +69 -0
  261. scikit_learn_intelex-2025.10.0.data/data/Lib/site-packages/sklearnex/utils/tests/test_validation.py +238 -0
  262. scikit_learn_intelex-2025.10.0.data/data/Lib/site-packages/sklearnex/utils/validation.py +212 -0
  263. scikit_learn_intelex-2025.10.0.dist-info/LICENSE.txt +202 -0
  264. scikit_learn_intelex-2025.10.0.dist-info/METADATA +182 -0
  265. scikit_learn_intelex-2025.10.0.dist-info/RECORD +267 -0
  266. scikit_learn_intelex-2025.10.0.dist-info/WHEEL +5 -0
  267. scikit_learn_intelex-2025.10.0.dist-info/top_level.txt +1 -0
@@ -0,0 +1,252 @@
1
+ # ==============================================================================
2
+ # Copyright 2024 Intel Corporation
3
+ #
4
+ # Licensed under the Apache License, Version 2.0 (the "License");
5
+ # you may not use this file except in compliance with the License.
6
+ # You may obtain a copy of the License at
7
+ #
8
+ # http://www.apache.org/licenses/LICENSE-2.0
9
+ #
10
+ # Unless required by applicable law or agreed to in writing, software
11
+ # distributed under the License is distributed on an "AS IS" BASIS,
12
+ # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13
+ # See the License for the specific language governing permissions and
14
+ # limitations under the License.
15
+ # ==============================================================================
16
+
17
+ import logging
18
+ import sys
19
+ import threading
20
+ from functools import wraps
21
+ from inspect import Parameter, signature
22
+ from multiprocessing import cpu_count
23
+ from numbers import Integral
24
+ from warnings import warn
25
+
26
+ import threadpoolctl
27
+
28
+ from daal4py import daalinit as set_n_threads
29
+ from daal4py import num_threads as get_n_threads
30
+
31
+ from ._utils import sklearn_check_version
32
+
33
+ if sklearn_check_version("1.2"):
34
+ from sklearn.utils._param_validation import validate_parameter_constraints
35
+
36
+
37
+ # Note: getting controller in global scope of this module is required
38
+ # to avoid overheads by its initialization per each function call
39
+ threadpool_controller = threadpoolctl.ThreadpoolController()
40
+
41
+
42
+ def get_suggested_n_threads(n_cpus):
43
+ """
44
+ Function to get `n_threads` limit
45
+ if `n_jobs` is set in upper parallelization context.
46
+ Usually, limit is equal to `n_logical_cpus` // `n_jobs`.
47
+ Returns None if limit is not set.
48
+ """
49
+ n_threads_map = {
50
+ lib_ctl.internal_api: lib_ctl.get_num_threads()
51
+ for lib_ctl in threadpool_controller.lib_controllers
52
+ if lib_ctl.internal_api != "mkl"
53
+ }
54
+ # openBLAS is limited to 24, 64 or 128 threads by default
55
+ # depending on SW/HW configuration.
56
+ # thus, these numbers of threads from openBLAS are uninformative
57
+ if "openblas" in n_threads_map and n_threads_map["openblas"] in [24, 64, 128]:
58
+ del n_threads_map["openblas"]
59
+ # remove default values equal to n_cpus as uninformative
60
+ for backend in list(n_threads_map.keys()):
61
+ if n_threads_map[backend] == n_cpus:
62
+ del n_threads_map[backend]
63
+ if len(n_threads_map) > 0:
64
+ return min(n_threads_map.values())
65
+ else:
66
+ return None
67
+
68
+
69
+ def _run_with_n_jobs(method):
70
+ """
71
+ Decorator for running of methods containing oneDAL kernels with 'n_jobs'.
72
+
73
+ Outside actual call of decorated method, this decorator:
74
+ - checks correctness of passed 'n_jobs',
75
+ - deducts actual number of threads to use,
76
+ - sets and resets this number for oneDAL environment.
77
+ """
78
+
79
+ @wraps(method)
80
+ def n_jobs_wrapper(self, *args, **kwargs):
81
+ # threading parallel backend branch
82
+ if not isinstance(threading.current_thread(), threading._MainThread):
83
+ warn(
84
+ "'Threading' parallel backend is not supported by "
85
+ "Extension for Scikit-learn*. "
86
+ "Falling back to usage of all available threads."
87
+ )
88
+ result = method(self, *args, **kwargs)
89
+ return result
90
+ # multiprocess parallel backends branch
91
+ # preemptive validation of n_jobs parameter is required
92
+ # because '_run_with_n_jobs' decorator is applied on top of method
93
+ # where validation takes place
94
+ if sklearn_check_version("1.2") and hasattr(self, "_parameter_constraints"):
95
+ validate_parameter_constraints(
96
+ parameter_constraints={"n_jobs": self._parameter_constraints["n_jobs"]},
97
+ params={"n_jobs": self.n_jobs},
98
+ caller_name=self.__class__.__name__,
99
+ )
100
+ # search for specified n_jobs
101
+ n_jobs = self.n_jobs
102
+ n_cpus = cpu_count()
103
+ # receive n_threads limitation from upper parallelism context
104
+ # using `threadpoolctl.ThreadpoolController`
105
+ n_threads = get_suggested_n_threads(n_cpus)
106
+ # get real `n_jobs` number of threads for oneDAL
107
+ # using sklearn rules and `n_threads` from upper parallelism context
108
+ if n_jobs is None or n_jobs == 0:
109
+ if n_threads is None:
110
+ # default branch with no setting for n_jobs
111
+ return method(self, *args, **kwargs)
112
+ else:
113
+ n_jobs = n_threads
114
+ elif n_jobs < 0:
115
+ if n_threads is None:
116
+ n_jobs = max(1, n_cpus + n_jobs + 1)
117
+ else:
118
+ n_jobs = max(1, n_threads + n_jobs + 1)
119
+ # branch with set n_jobs
120
+ old_n_threads = get_n_threads()
121
+ if n_jobs == old_n_threads:
122
+ return method(self, *args, **kwargs)
123
+
124
+ try:
125
+ logger = logging.getLogger("sklearnex")
126
+ cl = self.__class__
127
+ logger.debug(
128
+ f"{cl.__module__}.{cl.__name__}.{method.__name__}: "
129
+ f"setting {n_jobs} threads (previous - {old_n_threads})"
130
+ )
131
+ set_n_threads(n_jobs)
132
+ return method(self, *args, **kwargs)
133
+ finally:
134
+ set_n_threads(old_n_threads)
135
+
136
+ return n_jobs_wrapper
137
+
138
+
139
+ def control_n_jobs(decorated_methods: list = []):
140
+ """
141
+ Decorator for controlling the 'n_jobs' parameter in an estimator class.
142
+
143
+ This decorator is designed to be applied to both estimators with and without
144
+ native support for the 'n_jobs' parameter in the original Scikit-learn APIs.
145
+ When applied to an estimator without 'n_jobs' support in
146
+ its original '__init__' method, this decorator adds the 'n_jobs' parameter.
147
+
148
+ Additionally, this decorator allows for fine-grained control over which methods
149
+ should be executed with the 'n_jobs' parameter. The methods specified in
150
+ the 'decorated_methods' argument will run with 'n_jobs',
151
+ while all other methods remain unaffected.
152
+
153
+ Parameters
154
+ ----------
155
+ decorated_methods: list
156
+ A list of method names to be executed with 'n_jobs'.
157
+
158
+ Example
159
+ -------
160
+ @control_n_jobs(decorated_methods=['fit', 'predict'])
161
+
162
+ class MyEstimator:
163
+
164
+ def __init__(self, *args, **kwargs):
165
+ # Your original __init__ implementation here
166
+
167
+ def fit(self, *args, **kwargs):
168
+ # Your original fit implementation here
169
+
170
+ def predict(self, *args, **kwargs):
171
+ # Your original predict implementation here
172
+
173
+ def other_method(self, *args, **kwargs):
174
+ # Methods not listed in decorated_methods will not be affected by 'n_jobs'
175
+ pass
176
+ """
177
+
178
+ def class_wrapper(original_class):
179
+ original_class._n_jobs_supported_onedal_methods = decorated_methods.copy()
180
+
181
+ original_init = original_class.__init__
182
+
183
+ if sklearn_check_version("1.2") and hasattr(
184
+ original_class, "_parameter_constraints"
185
+ ):
186
+ parameter_constraints = original_class._parameter_constraints
187
+ if "n_jobs" not in parameter_constraints:
188
+ parameter_constraints["n_jobs"] = [Integral, None]
189
+
190
+ @wraps(original_init)
191
+ def init_with_n_jobs(self, *args, n_jobs=None, **kwargs):
192
+ original_init(self, *args, **kwargs)
193
+ self.n_jobs = n_jobs
194
+
195
+ # add "n_jobs" parameter to signature of wrapped init
196
+ # if estimator doesn't originally support it
197
+ sig = signature(original_init)
198
+ if "n_jobs" not in sig.parameters:
199
+ params_copy = sig.parameters.copy()
200
+ params_copy.update(
201
+ {
202
+ "n_jobs": Parameter(
203
+ name="n_jobs", kind=Parameter.KEYWORD_ONLY, default=None
204
+ )
205
+ }
206
+ )
207
+ init_with_n_jobs.__signature__ = sig.replace(parameters=params_copy.values())
208
+ original_class.__init__ = init_with_n_jobs
209
+
210
+ # add n_jobs to __doc__ string if needed
211
+ if (
212
+ hasattr(original_class, "__doc__")
213
+ and isinstance(original_class.__doc__, str)
214
+ and "n_jobs : int" not in original_class.__doc__
215
+ ):
216
+ # Python 3.13 removed extra tab in class doc string
217
+ tab = (
218
+ " "
219
+ if (sys.version_info.major == 3 and sys.version_info.minor < 13)
220
+ else ""
221
+ )
222
+ parameters_doc_tail = f"\n{tab}Attributes"
223
+ n_jobs_doc = f"""
224
+ {tab}n_jobs : int, default=None
225
+ {tab} The number of jobs to use in parallel for the computation.
226
+ {tab} ``None`` means using all physical cores
227
+ {tab} unless in a :obj:`joblib.parallel_backend` context.
228
+ {tab} ``-1`` means using all logical cores.
229
+ {tab} See :term:`Glossary <n_jobs>` for more details.
230
+ """
231
+ original_class.__doc__ = original_class.__doc__.replace(
232
+ parameters_doc_tail, n_jobs_doc + parameters_doc_tail
233
+ )
234
+
235
+ # decorate methods to be run with applied n_jobs parameter
236
+ for method_name in decorated_methods:
237
+ # if method doesn't exist, we want it to raise an Exception
238
+ method = getattr(original_class, method_name)
239
+ if not hasattr(method, "__onedal_n_jobs_decorated__"):
240
+ decorated_method = _run_with_n_jobs(method)
241
+ # sign decorated method for testing and other purposes
242
+ decorated_method.__onedal_n_jobs_decorated__ = True
243
+ setattr(original_class, method_name, decorated_method)
244
+ else:
245
+ warn(
246
+ f"{original_class.__name__}.{method_name} already has "
247
+ "oneDAL n_jobs support and will not be decorated."
248
+ )
249
+
250
+ return original_class
251
+
252
+ return class_wrapper
@@ -0,0 +1,245 @@
1
+ # ==============================================================================
2
+ # Copyright 2014 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 functools
18
+ import os
19
+ import sys
20
+ import warnings
21
+ from typing import Any, Tuple
22
+
23
+ import numpy as np
24
+ from numpy.lib.recfunctions import require_fields
25
+ from sklearn import __version__ as sklearn_version
26
+
27
+ from daal4py import _get__daal_link_version__ as dv
28
+
29
+ DaalVersionTuple = Tuple[int, str, int]
30
+
31
+ import logging
32
+
33
+ try:
34
+ from packaging.version import Version
35
+ except ImportError:
36
+ from distutils.version import LooseVersion as Version
37
+
38
+ try:
39
+ from pandas import DataFrame
40
+ from pandas.core.dtypes.cast import find_common_type
41
+
42
+ pandas_is_imported = True
43
+ except (ImportError, ModuleNotFoundError):
44
+ pandas_is_imported = False
45
+
46
+
47
+ def set_idp_sklearn_verbose():
48
+ logLevel = os.environ.get("IDP_SKLEARN_VERBOSE")
49
+ try:
50
+ if logLevel is not None:
51
+ logging.basicConfig(
52
+ stream=sys.stdout,
53
+ format="%(levelname)s: %(message)s",
54
+ level=logLevel.upper(),
55
+ )
56
+ except Exception:
57
+ warnings.warn(
58
+ 'Unknown level "{}" for logging.\n'
59
+ 'Please, use one of "CRITICAL", "ERROR", '
60
+ '"WARNING", "INFO", "DEBUG".'.format(logLevel)
61
+ )
62
+
63
+
64
+ def get_daal_version() -> DaalVersionTuple:
65
+ return int(dv()[0:4]), str(dv()[10:11]), int(dv()[4:8])
66
+
67
+
68
+ @functools.lru_cache(maxsize=256, typed=False)
69
+ def daal_check_version(
70
+ required_version: Tuple[Any, ...],
71
+ daal_version: Tuple[Any, ...] = get_daal_version(),
72
+ ) -> bool:
73
+ """Check daal version provided as (MAJOR, STATUS, MINOR+PATCH)
74
+
75
+ This function also accepts a list or tuple of daal versions. It will return true if
76
+ any version in the list/tuple is <= `daal_version`.
77
+ """
78
+ if isinstance(required_version[0], (list, tuple)):
79
+ # a list of version candidates was provided, recursively check if any is <= daal_version
80
+ return any(
81
+ map(lambda ver: daal_check_version(ver, daal_version), required_version)
82
+ )
83
+
84
+ major_required, status_required, patch_required = required_version
85
+ major, status, patch = daal_version
86
+
87
+ if status != status_required:
88
+ return False
89
+
90
+ if major_required < major:
91
+ return True
92
+ if major == major_required:
93
+ return patch_required <= patch
94
+
95
+ return False
96
+
97
+
98
+ def _package_check_version(version_to_check, available_version):
99
+ if hasattr(Version(version_to_check), "base_version"):
100
+ base_package_version = Version(available_version).base_version
101
+ res = bool(Version(base_package_version) >= Version(version_to_check))
102
+ else:
103
+ # packaging module not available
104
+ res = bool(Version(available_version) >= Version(version_to_check))
105
+ return res
106
+
107
+
108
+ @functools.lru_cache(maxsize=256, typed=False)
109
+ def sklearn_check_version(ver):
110
+ return _package_check_version(ver, sklearn_version)
111
+
112
+
113
+ def parse_dtype(dt):
114
+ if dt == np.double:
115
+ return "double"
116
+ if dt == np.single:
117
+ return "float"
118
+ raise ValueError(f"Input array has unexpected dtype = {dt}")
119
+
120
+
121
+ def getFPType(X):
122
+ if pandas_is_imported:
123
+ if isinstance(X, DataFrame):
124
+ dt = find_common_type(X.dtypes.tolist())
125
+ return parse_dtype(dt)
126
+
127
+ dt = getattr(X, "dtype", None)
128
+ return parse_dtype(dt)
129
+
130
+
131
+ def make2d(X):
132
+ if np.isscalar(X):
133
+ X = np.asarray(X)[np.newaxis, np.newaxis]
134
+ elif isinstance(X, np.ndarray) and X.ndim == 1:
135
+ X = X.reshape((X.size, 1))
136
+ return X
137
+
138
+
139
+ def get_patch_message(s):
140
+ if s == "daal":
141
+ message = "running accelerated version on CPU"
142
+
143
+ elif s == "sklearn":
144
+ message = "fallback to original Scikit-learn"
145
+ elif s == "sklearn_after_daal":
146
+ message = "failed to run accelerated version, fallback to original Scikit-learn"
147
+ else:
148
+ raise ValueError(
149
+ f"Invalid input - expected one of 'daal','sklearn',"
150
+ f" 'sklearn_after_daal', got {s}"
151
+ )
152
+ return message
153
+
154
+
155
+ def is_DataFrame(X):
156
+ if pandas_is_imported:
157
+ return isinstance(X, DataFrame)
158
+ else:
159
+ return False
160
+
161
+
162
+ def get_dtype(X):
163
+ if pandas_is_imported:
164
+ return find_common_type(list(X.dtypes)) if is_DataFrame(X) else X.dtype
165
+ else:
166
+ return getattr(X, "dtype", None)
167
+
168
+
169
+ def get_number_of_types(dataframe):
170
+ dtypes = getattr(dataframe, "dtypes", None)
171
+ try:
172
+ return len(set(dtypes))
173
+ except TypeError:
174
+ return 1
175
+
176
+
177
+ def check_tree_nodes(tree_nodes):
178
+ def convert_to_old_tree_nodes(tree_nodes):
179
+ # conversion from sklearn>=1.3 tree nodes format to previous format:
180
+ # removal of 'missing_go_to_left' field from node dtype
181
+ new_field = "missing_go_to_left"
182
+ new_dtype = tree_nodes.dtype
183
+ old_dtype = np.dtype(
184
+ [
185
+ (key, value[0])
186
+ for key, value in new_dtype.fields.items()
187
+ if key != new_field
188
+ ]
189
+ )
190
+ return require_fields(tree_nodes, old_dtype)
191
+
192
+ if sklearn_check_version("1.3"):
193
+ return tree_nodes
194
+ else:
195
+ return convert_to_old_tree_nodes(tree_nodes)
196
+
197
+
198
+ class PatchingConditionsChain:
199
+ def __init__(self, scope_name):
200
+ self.scope_name = scope_name
201
+ self.patching_is_enabled = True
202
+ self.messages = []
203
+ self.logger = logging.getLogger("sklearnex")
204
+
205
+ def _iter_conditions(self, conditions_and_messages):
206
+ result = []
207
+ for condition, message in conditions_and_messages:
208
+ result.append(condition)
209
+ if not condition:
210
+ self.messages.append(message)
211
+ return result
212
+
213
+ def and_conditions(self, conditions_and_messages, conditions_merging=all):
214
+ self.patching_is_enabled &= conditions_merging(
215
+ self._iter_conditions(conditions_and_messages)
216
+ )
217
+ return self.patching_is_enabled
218
+
219
+ def and_condition(self, condition, message):
220
+ return self.and_conditions([(condition, message)])
221
+
222
+ def or_conditions(self, conditions_and_messages, conditions_merging=all):
223
+ self.patching_is_enabled |= conditions_merging(
224
+ self._iter_conditions(conditions_and_messages)
225
+ )
226
+ return self.patching_is_enabled
227
+
228
+ def write_log(self):
229
+ if self.patching_is_enabled:
230
+ self.logger.info(f"{self.scope_name}: {get_patch_message('daal')}")
231
+ else:
232
+ self.logger.debug(
233
+ f"{self.scope_name}: debugging for the patch is enabled to track"
234
+ " the usage of oneAPI Data Analytics Library (oneDAL)"
235
+ )
236
+ for message in self.messages:
237
+ self.logger.debug(
238
+ f"{self.scope_name}: patching failed with cause - {message}"
239
+ )
240
+ self.logger.info(f"{self.scope_name}: {get_patch_message('sklearn')}")
241
+
242
+ def get_status(self, logs=False):
243
+ if logs:
244
+ self.write_log()
245
+ return self.patching_is_enabled
@@ -0,0 +1,20 @@
1
+ # ==============================================================================
2
+ # Copyright 2014 Intel Corporation
3
+ #
4
+ # Licensed under the Apache License, Version 2.0 (the "License");
5
+ # you may not use this file except in compliance with the License.
6
+ # You may obtain a copy of the License at
7
+ #
8
+ # http://www.apache.org/licenses/LICENSE-2.0
9
+ #
10
+ # Unless required by applicable law or agreed to in writing, software
11
+ # distributed under the License is distributed on an "AS IS" BASIS,
12
+ # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13
+ # See the License for the specific language governing permissions and
14
+ # limitations under the License.
15
+ # ==============================================================================
16
+
17
+ from .dbscan import DBSCAN
18
+ from .k_means import KMeans
19
+
20
+ __all__ = ["KMeans", "DBSCAN"]
@@ -0,0 +1,165 @@
1
+ # ==============================================================================
2
+ # Copyright 2014 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 numbers
18
+
19
+ import numpy as np
20
+ from scipy import sparse as sp
21
+ from sklearn.cluster import DBSCAN as DBSCAN_original
22
+ from sklearn.utils import check_array
23
+ from sklearn.utils.validation import _check_sample_weight
24
+
25
+ import daal4py
26
+
27
+ from .._n_jobs_support import control_n_jobs
28
+ from .._utils import PatchingConditionsChain, getFPType, make2d, sklearn_check_version
29
+ from ..utils.validation import check_feature_names
30
+
31
+ if sklearn_check_version("1.1") and not sklearn_check_version("1.2"):
32
+ from sklearn.utils import check_scalar
33
+
34
+
35
+ def _daal_dbscan(X, eps=0.5, min_samples=5, sample_weight=None):
36
+ ww = make2d(sample_weight) if sample_weight is not None else None
37
+ XX = make2d(X)
38
+
39
+ fpt = getFPType(XX) # codespell:ignore fpt
40
+ alg = daal4py.dbscan(
41
+ method="defaultDense",
42
+ fptype=fpt, # codespell:ignore fpt
43
+ epsilon=float(eps),
44
+ minObservations=int(min_samples),
45
+ memorySavingMode=False,
46
+ resultsToCompute="computeCoreIndices",
47
+ )
48
+
49
+ daal_res = alg.compute(XX, ww)
50
+ assignments = daal_res.assignments.ravel()
51
+ if daal_res.coreIndices is not None:
52
+ core_ind = daal_res.coreIndices.ravel()
53
+ else:
54
+ core_ind = np.array([], dtype=np.intc)
55
+
56
+ return (core_ind, assignments)
57
+
58
+
59
+ @control_n_jobs(decorated_methods=["fit"])
60
+ class DBSCAN(DBSCAN_original):
61
+ __doc__ = DBSCAN_original.__doc__
62
+
63
+ if sklearn_check_version("1.2"):
64
+ _parameter_constraints: dict = {**DBSCAN_original._parameter_constraints}
65
+
66
+ def __init__(
67
+ self,
68
+ eps=0.5,
69
+ min_samples=5,
70
+ metric="euclidean",
71
+ metric_params=None,
72
+ algorithm="auto",
73
+ leaf_size=30,
74
+ p=None,
75
+ n_jobs=None,
76
+ ):
77
+ self.eps = eps
78
+ self.min_samples = min_samples
79
+ self.metric = metric
80
+ self.metric_params = metric_params
81
+ self.algorithm = algorithm
82
+ self.leaf_size = leaf_size
83
+ self.p = p
84
+ self.n_jobs = n_jobs
85
+
86
+ def fit(self, X, y=None, sample_weight=None):
87
+ if sklearn_check_version("1.2"):
88
+ self._validate_params()
89
+ elif sklearn_check_version("1.1"):
90
+ check_scalar(
91
+ self.eps,
92
+ "eps",
93
+ target_type=numbers.Real,
94
+ min_val=0.0,
95
+ include_boundaries="neither",
96
+ )
97
+ check_scalar(
98
+ self.min_samples,
99
+ "min_samples",
100
+ target_type=numbers.Integral,
101
+ min_val=1,
102
+ include_boundaries="left",
103
+ )
104
+ check_scalar(
105
+ self.leaf_size,
106
+ "leaf_size",
107
+ target_type=numbers.Integral,
108
+ min_val=1,
109
+ include_boundaries="left",
110
+ )
111
+ if self.p is not None:
112
+ check_scalar(
113
+ self.p,
114
+ "p",
115
+ target_type=numbers.Real,
116
+ min_val=0.0,
117
+ include_boundaries="left",
118
+ )
119
+ if self.n_jobs is not None:
120
+ check_scalar(self.n_jobs, "n_jobs", target_type=numbers.Integral)
121
+ else:
122
+ if self.eps <= 0.0:
123
+ raise ValueError(f"eps == {self.eps}, must be > 0.0.")
124
+
125
+ check_feature_names(self, X, reset=True)
126
+
127
+ if sample_weight is not None:
128
+ sample_weight = _check_sample_weight(sample_weight, X)
129
+
130
+ _patching_status = PatchingConditionsChain("sklearn.cluster.DBSCAN.fit")
131
+ _dal_ready = _patching_status.and_conditions(
132
+ [
133
+ (
134
+ self.algorithm in ["auto", "brute"],
135
+ f"'{self.algorithm}' algorithm is not supported. "
136
+ "Only 'auto' and 'brute' algorithms are supported",
137
+ ),
138
+ (
139
+ self.metric == "euclidean"
140
+ or (self.metric == "minkowski" and self.p == 2),
141
+ f"'{self.metric}' (p={self.p}) metric is not supported. "
142
+ "Only 'euclidean' or 'minkowski' with p=2 metrics are supported.",
143
+ ),
144
+ (not sp.issparse(X), "X is sparse. Sparse input is not supported."),
145
+ ]
146
+ )
147
+
148
+ _patching_status.write_log()
149
+ if _dal_ready:
150
+ X = check_array(X, accept_sparse="csr", dtype=[np.float64, np.float32])
151
+ core_ind, assignments = _daal_dbscan(
152
+ X, self.eps, self.min_samples, sample_weight=sample_weight
153
+ )
154
+ self.core_sample_indices_ = core_ind
155
+ self.labels_ = assignments
156
+ self.components_ = np.take(X, core_ind, axis=0)
157
+ self.n_features_in_ = X.shape[1]
158
+ return self
159
+ return super().fit(X, y, sample_weight=sample_weight)
160
+
161
+ def fit_predict(self, X, y=None, sample_weight=None):
162
+ return super().fit_predict(X, y, sample_weight)
163
+
164
+ fit.__doc__ = DBSCAN_original.fit.__doc__
165
+ fit_predict.__doc__ = DBSCAN_original.fit_predict.__doc__