scikit-learn-intelex 2025.4.0__py39-none-win_amd64.whl → 2025.5.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 (269) hide show
  1. {scikit_learn_intelex-2025.4.0.data → scikit_learn_intelex-2025.5.0.data}/data/Lib/site-packages/daal4py/__main__.py +1 -1
  2. scikit_learn_intelex-2025.5.0.data/data/Lib/site-packages/daal4py/_daal4py.cp39-win_amd64.pyd +0 -0
  3. {scikit_learn_intelex-2025.4.0.data → scikit_learn_intelex-2025.5.0.data}/data/Lib/site-packages/daal4py/doc/third-party-programs.txt +1 -1
  4. scikit_learn_intelex-2025.5.0.data/data/Lib/site-packages/daal4py/mb/__init__.py +83 -0
  5. scikit_learn_intelex-2025.5.0.data/data/Lib/site-packages/daal4py/mb/gbt_convertors.py +855 -0
  6. scikit_learn_intelex-2025.5.0.data/data/Lib/site-packages/daal4py/mb/logistic_regression_builders.py +217 -0
  7. scikit_learn_intelex-2025.4.0.data/data/Lib/site-packages/daal4py/mb/model_builders.py → scikit_learn_intelex-2025.5.0.data/data/Lib/site-packages/daal4py/mb/tree_based_builders.py +99 -91
  8. {scikit_learn_intelex-2025.4.0.data → scikit_learn_intelex-2025.5.0.data}/data/Lib/site-packages/daal4py/mpi_transceiver.cp39-win_amd64.pyd +0 -0
  9. {scikit_learn_intelex-2025.4.0.data → scikit_learn_intelex-2025.5.0.data}/data/Lib/site-packages/daal4py/sklearn/_n_jobs_support.py +6 -2
  10. {scikit_learn_intelex-2025.4.0.data → scikit_learn_intelex-2025.5.0.data}/data/Lib/site-packages/daal4py/sklearn/_utils.py +1 -1
  11. {scikit_learn_intelex-2025.4.0.data → scikit_learn_intelex-2025.5.0.data}/data/Lib/site-packages/daal4py/sklearn/cluster/dbscan.py +2 -2
  12. {scikit_learn_intelex-2025.4.0.data → scikit_learn_intelex-2025.5.0.data}/data/Lib/site-packages/daal4py/sklearn/cluster/k_means.py +6 -38
  13. {scikit_learn_intelex-2025.4.0.data → scikit_learn_intelex-2025.5.0.data}/data/Lib/site-packages/daal4py/sklearn/decomposition/_pca.py +12 -8
  14. {scikit_learn_intelex-2025.4.0.data → scikit_learn_intelex-2025.5.0.data}/data/Lib/site-packages/daal4py/sklearn/ensemble/AdaBoostClassifier.py +2 -6
  15. {scikit_learn_intelex-2025.4.0.data → scikit_learn_intelex-2025.5.0.data}/data/Lib/site-packages/daal4py/sklearn/ensemble/GBTDAAL.py +3 -7
  16. {scikit_learn_intelex-2025.4.0.data → scikit_learn_intelex-2025.5.0.data}/data/Lib/site-packages/daal4py/sklearn/ensemble/_forest.py +41 -153
  17. {scikit_learn_intelex-2025.4.0.data → scikit_learn_intelex-2025.5.0.data}/data/Lib/site-packages/daal4py/sklearn/linear_model/_coordinate_descent.py +13 -15
  18. {scikit_learn_intelex-2025.4.0.data → scikit_learn_intelex-2025.5.0.data}/data/Lib/site-packages/daal4py/sklearn/linear_model/_linear.py +7 -10
  19. {scikit_learn_intelex-2025.4.0.data → scikit_learn_intelex-2025.5.0.data}/data/Lib/site-packages/daal4py/sklearn/linear_model/_ridge.py +22 -57
  20. {scikit_learn_intelex-2025.4.0.data → scikit_learn_intelex-2025.5.0.data}/data/Lib/site-packages/daal4py/sklearn/linear_model/logistic_path.py +3 -4
  21. {scikit_learn_intelex-2025.4.0.data → scikit_learn_intelex-2025.5.0.data}/data/Lib/site-packages/daal4py/sklearn/manifold/_t_sne.py +8 -3
  22. {scikit_learn_intelex-2025.4.0.data → scikit_learn_intelex-2025.5.0.data}/data/Lib/site-packages/daal4py/sklearn/metrics/_pairwise.py +30 -7
  23. {scikit_learn_intelex-2025.4.0.data → scikit_learn_intelex-2025.5.0.data}/data/Lib/site-packages/daal4py/sklearn/monkeypatch/dispatcher.py +2 -2
  24. {scikit_learn_intelex-2025.4.0.data → scikit_learn_intelex-2025.5.0.data}/data/Lib/site-packages/daal4py/sklearn/neighbors/_base.py +6 -16
  25. {scikit_learn_intelex-2025.4.0.data → scikit_learn_intelex-2025.5.0.data}/data/Lib/site-packages/daal4py/sklearn/neighbors/_classification.py +4 -7
  26. {scikit_learn_intelex-2025.4.0.data → scikit_learn_intelex-2025.5.0.data}/data/Lib/site-packages/daal4py/sklearn/neighbors/_regression.py +3 -5
  27. {scikit_learn_intelex-2025.4.0.data → scikit_learn_intelex-2025.5.0.data}/data/Lib/site-packages/daal4py/sklearn/svm/svm.py +4 -2
  28. {scikit_learn_intelex-2025.4.0.data → scikit_learn_intelex-2025.5.0.data}/data/Lib/site-packages/daal4py/sklearn/utils/base.py +8 -3
  29. {scikit_learn_intelex-2025.4.0.data → scikit_learn_intelex-2025.5.0.data}/data/Lib/site-packages/daal4py/sklearn/utils/validation.py +82 -5
  30. {scikit_learn_intelex-2025.4.0.data → scikit_learn_intelex-2025.5.0.data}/data/Lib/site-packages/onedal/__init__.py +125 -83
  31. {scikit_learn_intelex-2025.4.0.data → scikit_learn_intelex-2025.5.0.data}/data/Lib/site-packages/onedal/_config.py +27 -2
  32. {scikit_learn_intelex-2025.4.0.data → scikit_learn_intelex-2025.5.0.data}/data/Lib/site-packages/onedal/_device_offload.py +79 -83
  33. scikit_learn_intelex-2025.5.0.data/data/Lib/site-packages/onedal/_onedal_py_dpc.cp39-win_amd64.pyd +0 -0
  34. scikit_learn_intelex-2025.5.0.data/data/Lib/site-packages/onedal/_onedal_py_host.cp39-win_amd64.pyd +0 -0
  35. {scikit_learn_intelex-2025.4.0.data → scikit_learn_intelex-2025.5.0.data}/data/Lib/site-packages/onedal/basic_statistics/basic_statistics.py +21 -17
  36. {scikit_learn_intelex-2025.4.0.data → scikit_learn_intelex-2025.5.0.data}/data/Lib/site-packages/onedal/basic_statistics/incremental_basic_statistics.py +44 -39
  37. {scikit_learn_intelex-2025.4.0.data → scikit_learn_intelex-2025.5.0.data}/data/Lib/site-packages/onedal/cluster/dbscan.py +35 -42
  38. {scikit_learn_intelex-2025.4.0.data → scikit_learn_intelex-2025.5.0.data}/data/Lib/site-packages/onedal/cluster/kmeans.py +83 -74
  39. {scikit_learn_intelex-2025.4.0.data → scikit_learn_intelex-2025.5.0.data}/data/Lib/site-packages/onedal/cluster/kmeans_init.py +57 -24
  40. scikit_learn_intelex-2025.5.0.data/data/Lib/site-packages/onedal/common/_backend.py +233 -0
  41. {scikit_learn_intelex-2025.4.0.data → scikit_learn_intelex-2025.5.0.data}/data/Lib/site-packages/onedal/common/hyperparameters.py +4 -4
  42. {scikit_learn_intelex-2025.4.0.data → scikit_learn_intelex-2025.5.0.data}/data/Lib/site-packages/onedal/common/tests/test_sycl.py +27 -12
  43. {scikit_learn_intelex-2025.4.0.data → scikit_learn_intelex-2025.5.0.data}/data/Lib/site-packages/onedal/covariance/covariance.py +27 -19
  44. {scikit_learn_intelex-2025.4.0.data → scikit_learn_intelex-2025.5.0.data}/data/Lib/site-packages/onedal/covariance/incremental_covariance.py +35 -32
  45. {scikit_learn_intelex-2025.4.0.data → scikit_learn_intelex-2025.5.0.data}/data/Lib/site-packages/onedal/datatypes/_data_conversion.py +6 -10
  46. {scikit_learn_intelex-2025.4.0.data → scikit_learn_intelex-2025.5.0.data}/data/Lib/site-packages/onedal/datatypes/tests/test_data.py +179 -78
  47. {scikit_learn_intelex-2025.4.0.data → scikit_learn_intelex-2025.5.0.data}/data/Lib/site-packages/onedal/decomposition/incremental_pca.py +39 -25
  48. {scikit_learn_intelex-2025.4.0.data → scikit_learn_intelex-2025.5.0.data}/data/Lib/site-packages/onedal/decomposition/pca.py +28 -16
  49. {scikit_learn_intelex-2025.4.0.data → scikit_learn_intelex-2025.5.0.data}/data/Lib/site-packages/onedal/decomposition/tests/test_incremental_pca.py +2 -2
  50. {scikit_learn_intelex-2025.4.0.data → scikit_learn_intelex-2025.5.0.data}/data/Lib/site-packages/onedal/ensemble/forest.py +130 -93
  51. {scikit_learn_intelex-2025.4.0.data → scikit_learn_intelex-2025.5.0.data}/data/Lib/site-packages/onedal/linear_model/incremental_linear_model.py +76 -57
  52. {scikit_learn_intelex-2025.4.0.data → scikit_learn_intelex-2025.5.0.data}/data/Lib/site-packages/onedal/linear_model/linear_model.py +63 -37
  53. {scikit_learn_intelex-2025.4.0.data → scikit_learn_intelex-2025.5.0.data}/data/Lib/site-packages/onedal/linear_model/logistic_regression.py +96 -68
  54. {scikit_learn_intelex-2025.4.0.data → scikit_learn_intelex-2025.5.0.data}/data/Lib/site-packages/onedal/neighbors/neighbors.py +156 -119
  55. {scikit_learn_intelex-2025.4.0.data → scikit_learn_intelex-2025.5.0.data}/data/Lib/site-packages/onedal/primitives/get_tree.py +5 -3
  56. {scikit_learn_intelex-2025.4.0.data → scikit_learn_intelex-2025.5.0.data}/data/Lib/site-packages/onedal/primitives/kernel_functions.py +21 -18
  57. {scikit_learn_intelex-2025.4.0.data → scikit_learn_intelex-2025.5.0.data}/data/Lib/site-packages/onedal/primitives/tests/test_kernel_functions.py +4 -4
  58. {scikit_learn_intelex-2025.4.0.data → scikit_learn_intelex-2025.5.0.data}/data/Lib/site-packages/onedal/svm/svm.py +80 -32
  59. {scikit_learn_intelex-2025.4.0.data → scikit_learn_intelex-2025.5.0.data}/data/Lib/site-packages/onedal/svm/tests/test_csr_svm.py +10 -9
  60. {scikit_learn_intelex-2025.4.0.data → scikit_learn_intelex-2025.5.0.data}/data/Lib/site-packages/onedal/svm/tests/test_nusvc.py +10 -10
  61. {scikit_learn_intelex-2025.4.0.data → scikit_learn_intelex-2025.5.0.data}/data/Lib/site-packages/onedal/svm/tests/test_nusvr.py +8 -8
  62. {scikit_learn_intelex-2025.4.0.data → scikit_learn_intelex-2025.5.0.data}/data/Lib/site-packages/onedal/svm/tests/test_svc.py +5 -5
  63. {scikit_learn_intelex-2025.4.0.data → scikit_learn_intelex-2025.5.0.data}/data/Lib/site-packages/onedal/svm/tests/test_svr.py +10 -10
  64. {scikit_learn_intelex-2025.4.0.data → scikit_learn_intelex-2025.5.0.data}/data/Lib/site-packages/onedal/tests/utils/_device_selection.py +1 -13
  65. {scikit_learn_intelex-2025.4.0.data → scikit_learn_intelex-2025.5.0.data}/data/Lib/site-packages/onedal/utils/_array_api.py +3 -1
  66. {scikit_learn_intelex-2025.4.0.data → scikit_learn_intelex-2025.5.0.data}/data/Lib/site-packages/onedal/utils/_dpep_helpers.py +16 -1
  67. scikit_learn_intelex-2025.5.0.data/data/Lib/site-packages/onedal/utils/_sycl_queue_manager.py +147 -0
  68. {scikit_learn_intelex-2025.4.0.data → scikit_learn_intelex-2025.5.0.data}/data/Lib/site-packages/onedal/utils/tests/test_validation.py +3 -3
  69. {scikit_learn_intelex-2025.4.0.data → scikit_learn_intelex-2025.5.0.data}/data/Lib/site-packages/onedal/utils/validation.py +47 -16
  70. {scikit_learn_intelex-2025.4.0.data → scikit_learn_intelex-2025.5.0.data}/data/Lib/site-packages/sklearnex/__init__.py +3 -2
  71. {scikit_learn_intelex-2025.4.0.data → scikit_learn_intelex-2025.5.0.data}/data/Lib/site-packages/sklearnex/__main__.py +2 -2
  72. {scikit_learn_intelex-2025.4.0.data → scikit_learn_intelex-2025.5.0.data}/data/Lib/site-packages/sklearnex/_config.py +48 -6
  73. scikit_learn_intelex-2025.5.0.data/data/Lib/site-packages/sklearnex/_device_offload.py +143 -0
  74. {scikit_learn_intelex-2025.4.0.data → scikit_learn_intelex-2025.5.0.data}/data/Lib/site-packages/sklearnex/_utils.py +28 -2
  75. {scikit_learn_intelex-2025.4.0.data → scikit_learn_intelex-2025.5.0.data}/data/Lib/site-packages/sklearnex/basic_statistics/basic_statistics.py +13 -20
  76. {scikit_learn_intelex-2025.4.0.data → scikit_learn_intelex-2025.5.0.data}/data/Lib/site-packages/sklearnex/basic_statistics/incremental_basic_statistics.py +34 -40
  77. {scikit_learn_intelex-2025.4.0.data → scikit_learn_intelex-2025.5.0.data}/data/Lib/site-packages/sklearnex/cluster/dbscan.py +6 -8
  78. {scikit_learn_intelex-2025.4.0.data → scikit_learn_intelex-2025.5.0.data}/data/Lib/site-packages/sklearnex/cluster/k_means.py +2 -6
  79. {scikit_learn_intelex-2025.4.0.data → scikit_learn_intelex-2025.5.0.data}/data/Lib/site-packages/sklearnex/covariance/incremental_covariance.py +42 -60
  80. {scikit_learn_intelex-2025.4.0.data → scikit_learn_intelex-2025.5.0.data}/data/Lib/site-packages/sklearnex/decomposition/pca.py +7 -17
  81. {scikit_learn_intelex-2025.4.0.data → scikit_learn_intelex-2025.5.0.data}/data/Lib/site-packages/sklearnex/dispatcher.py +4 -4
  82. {scikit_learn_intelex-2025.4.0.data → scikit_learn_intelex-2025.5.0.data}/data/Lib/site-packages/sklearnex/doc/third-party-programs.txt +207 -2
  83. {scikit_learn_intelex-2025.4.0.data → scikit_learn_intelex-2025.5.0.data}/data/Lib/site-packages/sklearnex/ensemble/_forest.py +106 -362
  84. {scikit_learn_intelex-2025.4.0.data → scikit_learn_intelex-2025.5.0.data}/data/Lib/site-packages/sklearnex/glob/__main__.py +1 -1
  85. {scikit_learn_intelex-2025.4.0.data → scikit_learn_intelex-2025.5.0.data}/data/Lib/site-packages/sklearnex/glob/dispatcher.py +1 -1
  86. {scikit_learn_intelex-2025.4.0.data → scikit_learn_intelex-2025.5.0.data}/data/Lib/site-packages/sklearnex/linear_model/coordinate_descent.py +6 -6
  87. {scikit_learn_intelex-2025.4.0.data → scikit_learn_intelex-2025.5.0.data}/data/Lib/site-packages/sklearnex/linear_model/incremental_linear.py +41 -126
  88. {scikit_learn_intelex-2025.4.0.data → scikit_learn_intelex-2025.5.0.data}/data/Lib/site-packages/sklearnex/linear_model/incremental_ridge.py +42 -85
  89. {scikit_learn_intelex-2025.4.0.data → scikit_learn_intelex-2025.5.0.data}/data/Lib/site-packages/sklearnex/linear_model/linear.py +48 -39
  90. {scikit_learn_intelex-2025.4.0.data → scikit_learn_intelex-2025.5.0.data}/data/Lib/site-packages/sklearnex/linear_model/logistic_regression.py +34 -71
  91. {scikit_learn_intelex-2025.4.0.data → scikit_learn_intelex-2025.5.0.data}/data/Lib/site-packages/sklearnex/linear_model/ridge.py +14 -18
  92. {scikit_learn_intelex-2025.4.0.data → scikit_learn_intelex-2025.5.0.data}/data/Lib/site-packages/sklearnex/linear_model/tests/test_linear.py +60 -1
  93. {scikit_learn_intelex-2025.4.0.data → scikit_learn_intelex-2025.5.0.data}/data/Lib/site-packages/sklearnex/linear_model/tests/test_logreg.py +2 -2
  94. {scikit_learn_intelex-2025.4.0.data → scikit_learn_intelex-2025.5.0.data}/data/Lib/site-packages/sklearnex/manifold/t_sne.py +2 -3
  95. {scikit_learn_intelex-2025.4.0.data → scikit_learn_intelex-2025.5.0.data}/data/Lib/site-packages/sklearnex/metrics/pairwise.py +1 -3
  96. {scikit_learn_intelex-2025.4.0.data → scikit_learn_intelex-2025.5.0.data}/data/Lib/site-packages/sklearnex/metrics/ranking.py +1 -1
  97. {scikit_learn_intelex-2025.4.0.data → scikit_learn_intelex-2025.5.0.data}/data/Lib/site-packages/sklearnex/model_selection/split.py +1 -3
  98. {scikit_learn_intelex-2025.4.0.data → scikit_learn_intelex-2025.5.0.data}/data/Lib/site-packages/sklearnex/neighbors/_lof.py +7 -54
  99. {scikit_learn_intelex-2025.4.0.data → scikit_learn_intelex-2025.5.0.data}/data/Lib/site-packages/sklearnex/neighbors/common.py +3 -3
  100. {scikit_learn_intelex-2025.4.0.data → scikit_learn_intelex-2025.5.0.data}/data/Lib/site-packages/sklearnex/neighbors/knn_classification.py +31 -73
  101. {scikit_learn_intelex-2025.4.0.data → scikit_learn_intelex-2025.5.0.data}/data/Lib/site-packages/sklearnex/neighbors/knn_regression.py +30 -70
  102. {scikit_learn_intelex-2025.4.0.data → scikit_learn_intelex-2025.5.0.data}/data/Lib/site-packages/sklearnex/neighbors/knn_unsupervised.py +5 -13
  103. {scikit_learn_intelex-2025.4.0.data → scikit_learn_intelex-2025.5.0.data}/data/Lib/site-packages/sklearnex/preview/covariance/covariance.py +3 -13
  104. {scikit_learn_intelex-2025.4.0.data → scikit_learn_intelex-2025.5.0.data}/data/Lib/site-packages/sklearnex/preview/decomposition/incremental_pca.py +48 -62
  105. {scikit_learn_intelex-2025.4.0.data → scikit_learn_intelex-2025.5.0.data}/data/Lib/site-packages/sklearnex/spmd/basic_statistics/tests/test_basic_statistics_spmd.py +10 -3
  106. {scikit_learn_intelex-2025.4.0.data → scikit_learn_intelex-2025.5.0.data}/data/Lib/site-packages/sklearnex/spmd/basic_statistics/tests/test_incremental_basic_statistics_spmd.py +8 -4
  107. {scikit_learn_intelex-2025.4.0.data → scikit_learn_intelex-2025.5.0.data}/data/Lib/site-packages/sklearnex/spmd/cluster/tests/test_dbscan_spmd.py +13 -2
  108. {scikit_learn_intelex-2025.4.0.data → scikit_learn_intelex-2025.5.0.data}/data/Lib/site-packages/sklearnex/spmd/cluster/tests/test_kmeans_spmd.py +10 -3
  109. {scikit_learn_intelex-2025.4.0.data → scikit_learn_intelex-2025.5.0.data}/data/Lib/site-packages/sklearnex/spmd/covariance/tests/test_covariance_spmd.py +7 -4
  110. {scikit_learn_intelex-2025.4.0.data → scikit_learn_intelex-2025.5.0.data}/data/Lib/site-packages/sklearnex/spmd/covariance/tests/test_incremental_covariance_spmd.py +13 -2
  111. {scikit_learn_intelex-2025.4.0.data → scikit_learn_intelex-2025.5.0.data}/data/Lib/site-packages/sklearnex/spmd/decomposition/tests/test_incremental_pca_spmd.py +9 -2
  112. {scikit_learn_intelex-2025.4.0.data → scikit_learn_intelex-2025.5.0.data}/data/Lib/site-packages/sklearnex/spmd/decomposition/tests/test_pca_spmd.py +7 -2
  113. {scikit_learn_intelex-2025.4.0.data → scikit_learn_intelex-2025.5.0.data}/data/Lib/site-packages/sklearnex/spmd/ensemble/tests/test_forest_spmd.py +25 -8
  114. {scikit_learn_intelex-2025.4.0.data → scikit_learn_intelex-2025.5.0.data}/data/Lib/site-packages/sklearnex/spmd/linear_model/tests/test_incremental_linear_spmd.py +6 -2
  115. {scikit_learn_intelex-2025.4.0.data → scikit_learn_intelex-2025.5.0.data}/data/Lib/site-packages/sklearnex/spmd/linear_model/tests/test_linear_regression_spmd.py +12 -3
  116. {scikit_learn_intelex-2025.4.0.data → scikit_learn_intelex-2025.5.0.data}/data/Lib/site-packages/sklearnex/spmd/linear_model/tests/test_logistic_regression_spmd.py +12 -5
  117. {scikit_learn_intelex-2025.4.0.data/data/Lib/site-packages/daal4py/mb → scikit_learn_intelex-2025.5.0.data/data/Lib/site-packages/sklearnex/spmd/neighbors}/__init__.py +2 -2
  118. {scikit_learn_intelex-2025.4.0.data → scikit_learn_intelex-2025.5.0.data}/data/Lib/site-packages/sklearnex/spmd/neighbors/tests/test_neighbors_spmd.py +27 -5
  119. {scikit_learn_intelex-2025.4.0.data → scikit_learn_intelex-2025.5.0.data}/data/Lib/site-packages/sklearnex/svm/_common.py +12 -25
  120. {scikit_learn_intelex-2025.4.0.data → scikit_learn_intelex-2025.5.0.data}/data/Lib/site-packages/sklearnex/svm/nusvc.py +35 -128
  121. {scikit_learn_intelex-2025.4.0.data → scikit_learn_intelex-2025.5.0.data}/data/Lib/site-packages/sklearnex/svm/nusvr.py +9 -21
  122. {scikit_learn_intelex-2025.4.0.data → scikit_learn_intelex-2025.5.0.data}/data/Lib/site-packages/sklearnex/svm/svc.py +33 -126
  123. {scikit_learn_intelex-2025.4.0.data → scikit_learn_intelex-2025.5.0.data}/data/Lib/site-packages/sklearnex/svm/svr.py +9 -21
  124. {scikit_learn_intelex-2025.4.0.data → scikit_learn_intelex-2025.5.0.data}/data/Lib/site-packages/sklearnex/tests/test_common.py +26 -11
  125. {scikit_learn_intelex-2025.4.0.data → scikit_learn_intelex-2025.5.0.data}/data/Lib/site-packages/sklearnex/tests/test_memory_usage.py +16 -23
  126. {scikit_learn_intelex-2025.4.0.data → scikit_learn_intelex-2025.5.0.data}/data/Lib/site-packages/sklearnex/tests/test_monkeypatch.py +4 -4
  127. {scikit_learn_intelex-2025.4.0.data → scikit_learn_intelex-2025.5.0.data}/data/Lib/site-packages/sklearnex/tests/utils/base.py +2 -2
  128. {scikit_learn_intelex-2025.4.0.data → scikit_learn_intelex-2025.5.0.data}/data/Lib/site-packages/sklearnex/utils/validation.py +8 -22
  129. {scikit_learn_intelex-2025.4.0.dist-info → scikit_learn_intelex-2025.5.0.dist-info}/METADATA +2 -2
  130. scikit_learn_intelex-2025.5.0.dist-info/RECORD +257 -0
  131. scikit_learn_intelex-2025.4.0.data/data/Lib/site-packages/daal4py/_daal4py.cp39-win_amd64.pyd +0 -0
  132. scikit_learn_intelex-2025.4.0.data/data/Lib/site-packages/onedal/_onedal_py_dpc.cp39-win_amd64.pyd +0 -0
  133. scikit_learn_intelex-2025.4.0.data/data/Lib/site-packages/onedal/_onedal_py_host.cp39-win_amd64.pyd +0 -0
  134. scikit_learn_intelex-2025.4.0.data/data/Lib/site-packages/onedal/common/_base.py +0 -38
  135. scikit_learn_intelex-2025.4.0.data/data/Lib/site-packages/onedal/common/_policy.py +0 -55
  136. scikit_learn_intelex-2025.4.0.data/data/Lib/site-packages/onedal/common/_spmd_policy.py +0 -30
  137. scikit_learn_intelex-2025.4.0.data/data/Lib/site-packages/onedal/common/tests/test_policy.py +0 -76
  138. scikit_learn_intelex-2025.4.0.data/data/Lib/site-packages/onedal/utils/__init__.py +0 -49
  139. scikit_learn_intelex-2025.4.0.data/data/Lib/site-packages/sklearnex/_device_offload.py +0 -126
  140. scikit_learn_intelex-2025.4.0.data/data/Lib/site-packages/sklearnex/spmd/neighbors/__init__.py +0 -19
  141. scikit_learn_intelex-2025.4.0.data/data/Lib/site-packages/sklearnex/spmd/neighbors/neighbors.py +0 -25
  142. scikit_learn_intelex-2025.4.0.dist-info/RECORD +0 -259
  143. {scikit_learn_intelex-2025.4.0.data → scikit_learn_intelex-2025.5.0.data}/data/Lib/site-packages/daal4py/__init__.py +0 -0
  144. {scikit_learn_intelex-2025.4.0.data → scikit_learn_intelex-2025.5.0.data}/data/Lib/site-packages/daal4py/sklearn/__init__.py +0 -0
  145. {scikit_learn_intelex-2025.4.0.data → scikit_learn_intelex-2025.5.0.data}/data/Lib/site-packages/daal4py/sklearn/cluster/__init__.py +0 -0
  146. {scikit_learn_intelex-2025.4.0.data → scikit_learn_intelex-2025.5.0.data}/data/Lib/site-packages/daal4py/sklearn/cluster/tests/test_dbscan.py +0 -0
  147. {scikit_learn_intelex-2025.4.0.data → scikit_learn_intelex-2025.5.0.data}/data/Lib/site-packages/daal4py/sklearn/decomposition/__init__.py +0 -0
  148. {scikit_learn_intelex-2025.4.0.data → scikit_learn_intelex-2025.5.0.data}/data/Lib/site-packages/daal4py/sklearn/ensemble/__init__.py +0 -0
  149. {scikit_learn_intelex-2025.4.0.data → scikit_learn_intelex-2025.5.0.data}/data/Lib/site-packages/daal4py/sklearn/ensemble/tests/test_decision_forest.py +0 -0
  150. {scikit_learn_intelex-2025.4.0.data → scikit_learn_intelex-2025.5.0.data}/data/Lib/site-packages/daal4py/sklearn/linear_model/__init__.py +0 -0
  151. {scikit_learn_intelex-2025.4.0.data → scikit_learn_intelex-2025.5.0.data}/data/Lib/site-packages/daal4py/sklearn/linear_model/coordinate_descent.py +0 -0
  152. {scikit_learn_intelex-2025.4.0.data → scikit_learn_intelex-2025.5.0.data}/data/Lib/site-packages/daal4py/sklearn/linear_model/linear.py +0 -0
  153. {scikit_learn_intelex-2025.4.0.data → scikit_learn_intelex-2025.5.0.data}/data/Lib/site-packages/daal4py/sklearn/linear_model/logistic_loss.py +0 -0
  154. {scikit_learn_intelex-2025.4.0.data → scikit_learn_intelex-2025.5.0.data}/data/Lib/site-packages/daal4py/sklearn/linear_model/ridge.py +0 -0
  155. {scikit_learn_intelex-2025.4.0.data → scikit_learn_intelex-2025.5.0.data}/data/Lib/site-packages/daal4py/sklearn/linear_model/tests/test_linear.py +0 -0
  156. {scikit_learn_intelex-2025.4.0.data → scikit_learn_intelex-2025.5.0.data}/data/Lib/site-packages/daal4py/sklearn/linear_model/tests/test_ridge.py +0 -0
  157. {scikit_learn_intelex-2025.4.0.data → scikit_learn_intelex-2025.5.0.data}/data/Lib/site-packages/daal4py/sklearn/manifold/__init__.py +0 -0
  158. {scikit_learn_intelex-2025.4.0.data → scikit_learn_intelex-2025.5.0.data}/data/Lib/site-packages/daal4py/sklearn/metrics/__init__.py +0 -0
  159. {scikit_learn_intelex-2025.4.0.data → scikit_learn_intelex-2025.5.0.data}/data/Lib/site-packages/daal4py/sklearn/metrics/_ranking.py +0 -0
  160. {scikit_learn_intelex-2025.4.0.data → scikit_learn_intelex-2025.5.0.data}/data/Lib/site-packages/daal4py/sklearn/model_selection/__init__.py +0 -0
  161. {scikit_learn_intelex-2025.4.0.data → scikit_learn_intelex-2025.5.0.data}/data/Lib/site-packages/daal4py/sklearn/model_selection/_split.py +0 -0
  162. {scikit_learn_intelex-2025.4.0.data → scikit_learn_intelex-2025.5.0.data}/data/Lib/site-packages/daal4py/sklearn/model_selection/tests/test_split.py +0 -0
  163. {scikit_learn_intelex-2025.4.0.data → scikit_learn_intelex-2025.5.0.data}/data/Lib/site-packages/daal4py/sklearn/monkeypatch/__init__.py +0 -0
  164. {scikit_learn_intelex-2025.4.0.data → scikit_learn_intelex-2025.5.0.data}/data/Lib/site-packages/daal4py/sklearn/monkeypatch/tests/_models_info.py +0 -0
  165. {scikit_learn_intelex-2025.4.0.data → scikit_learn_intelex-2025.5.0.data}/data/Lib/site-packages/daal4py/sklearn/monkeypatch/tests/test_monkeypatch.py +0 -0
  166. {scikit_learn_intelex-2025.4.0.data → scikit_learn_intelex-2025.5.0.data}/data/Lib/site-packages/daal4py/sklearn/monkeypatch/tests/test_patching.py +0 -0
  167. {scikit_learn_intelex-2025.4.0.data → scikit_learn_intelex-2025.5.0.data}/data/Lib/site-packages/daal4py/sklearn/monkeypatch/tests/utils/_launch_algorithms.py +0 -0
  168. {scikit_learn_intelex-2025.4.0.data → scikit_learn_intelex-2025.5.0.data}/data/Lib/site-packages/daal4py/sklearn/neighbors/__init__.py +0 -0
  169. {scikit_learn_intelex-2025.4.0.data → scikit_learn_intelex-2025.5.0.data}/data/Lib/site-packages/daal4py/sklearn/neighbors/_unsupervised.py +0 -0
  170. {scikit_learn_intelex-2025.4.0.data → scikit_learn_intelex-2025.5.0.data}/data/Lib/site-packages/daal4py/sklearn/neighbors/tests/test_kneighbors.py +0 -0
  171. {scikit_learn_intelex-2025.4.0.data → scikit_learn_intelex-2025.5.0.data}/data/Lib/site-packages/daal4py/sklearn/svm/__init__.py +0 -0
  172. {scikit_learn_intelex-2025.4.0.data → scikit_learn_intelex-2025.5.0.data}/data/Lib/site-packages/daal4py/sklearn/utils/__init__.py +0 -0
  173. {scikit_learn_intelex-2025.4.0.data → scikit_learn_intelex-2025.5.0.data}/data/Lib/site-packages/daal4py/sklearn/utils/tests/test_utils.py +0 -0
  174. {scikit_learn_intelex-2025.4.0.data → scikit_learn_intelex-2025.5.0.data}/data/Lib/site-packages/onedal/basic_statistics/__init__.py +0 -0
  175. {scikit_learn_intelex-2025.4.0.data → scikit_learn_intelex-2025.5.0.data}/data/Lib/site-packages/onedal/basic_statistics/tests/test_basic_statistics.py +0 -0
  176. {scikit_learn_intelex-2025.4.0.data → scikit_learn_intelex-2025.5.0.data}/data/Lib/site-packages/onedal/basic_statistics/tests/test_incremental_basic_statistics.py +0 -0
  177. {scikit_learn_intelex-2025.4.0.data → scikit_learn_intelex-2025.5.0.data}/data/Lib/site-packages/onedal/basic_statistics/tests/utils.py +0 -0
  178. {scikit_learn_intelex-2025.4.0.data → scikit_learn_intelex-2025.5.0.data}/data/Lib/site-packages/onedal/cluster/__init__.py +0 -0
  179. {scikit_learn_intelex-2025.4.0.data → scikit_learn_intelex-2025.5.0.data}/data/Lib/site-packages/onedal/cluster/tests/test_dbscan.py +0 -0
  180. {scikit_learn_intelex-2025.4.0.data → scikit_learn_intelex-2025.5.0.data}/data/Lib/site-packages/onedal/cluster/tests/test_kmeans.py +0 -0
  181. {scikit_learn_intelex-2025.4.0.data → scikit_learn_intelex-2025.5.0.data}/data/Lib/site-packages/onedal/cluster/tests/test_kmeans_init.py +0 -0
  182. {scikit_learn_intelex-2025.4.0.data → scikit_learn_intelex-2025.5.0.data}/data/Lib/site-packages/onedal/common/_estimator_checks.py +0 -0
  183. {scikit_learn_intelex-2025.4.0.data → scikit_learn_intelex-2025.5.0.data}/data/Lib/site-packages/onedal/common/_mixin.py +0 -0
  184. {scikit_learn_intelex-2025.4.0.data → scikit_learn_intelex-2025.5.0.data}/data/Lib/site-packages/onedal/covariance/__init__.py +0 -0
  185. {scikit_learn_intelex-2025.4.0.data → scikit_learn_intelex-2025.5.0.data}/data/Lib/site-packages/onedal/covariance/tests/test_covariance.py +0 -0
  186. {scikit_learn_intelex-2025.4.0.data → scikit_learn_intelex-2025.5.0.data}/data/Lib/site-packages/onedal/covariance/tests/test_incremental_covariance.py +0 -0
  187. {scikit_learn_intelex-2025.4.0.data → scikit_learn_intelex-2025.5.0.data}/data/Lib/site-packages/onedal/datatypes/__init__.py +0 -0
  188. {scikit_learn_intelex-2025.4.0.data → scikit_learn_intelex-2025.5.0.data}/data/Lib/site-packages/onedal/datatypes/tests/common.py +0 -0
  189. {scikit_learn_intelex-2025.4.0.data → scikit_learn_intelex-2025.5.0.data}/data/Lib/site-packages/onedal/decomposition/__init__.py +0 -0
  190. {scikit_learn_intelex-2025.4.0.data → scikit_learn_intelex-2025.5.0.data}/data/Lib/site-packages/onedal/ensemble/__init__.py +0 -0
  191. {scikit_learn_intelex-2025.4.0.data → scikit_learn_intelex-2025.5.0.data}/data/Lib/site-packages/onedal/ensemble/tests/test_random_forest.py +0 -0
  192. {scikit_learn_intelex-2025.4.0.data → scikit_learn_intelex-2025.5.0.data}/data/Lib/site-packages/onedal/linear_model/__init__.py +0 -0
  193. {scikit_learn_intelex-2025.4.0.data → scikit_learn_intelex-2025.5.0.data}/data/Lib/site-packages/onedal/linear_model/tests/test_incremental_linear_regression.py +0 -0
  194. {scikit_learn_intelex-2025.4.0.data → scikit_learn_intelex-2025.5.0.data}/data/Lib/site-packages/onedal/linear_model/tests/test_incremental_ridge_regression.py +0 -0
  195. {scikit_learn_intelex-2025.4.0.data → scikit_learn_intelex-2025.5.0.data}/data/Lib/site-packages/onedal/linear_model/tests/test_linear_regression.py +0 -0
  196. {scikit_learn_intelex-2025.4.0.data → scikit_learn_intelex-2025.5.0.data}/data/Lib/site-packages/onedal/linear_model/tests/test_logistic_regression.py +0 -0
  197. {scikit_learn_intelex-2025.4.0.data → scikit_learn_intelex-2025.5.0.data}/data/Lib/site-packages/onedal/linear_model/tests/test_ridge.py +0 -0
  198. {scikit_learn_intelex-2025.4.0.data → scikit_learn_intelex-2025.5.0.data}/data/Lib/site-packages/onedal/neighbors/__init__.py +0 -0
  199. {scikit_learn_intelex-2025.4.0.data → scikit_learn_intelex-2025.5.0.data}/data/Lib/site-packages/onedal/neighbors/tests/test_knn_classification.py +0 -0
  200. {scikit_learn_intelex-2025.4.0.data → scikit_learn_intelex-2025.5.0.data}/data/Lib/site-packages/onedal/primitives/__init__.py +0 -0
  201. {scikit_learn_intelex-2025.4.0.data → scikit_learn_intelex-2025.5.0.data}/data/Lib/site-packages/onedal/svm/__init__.py +0 -0
  202. {scikit_learn_intelex-2025.4.0.data → scikit_learn_intelex-2025.5.0.data}/data/Lib/site-packages/onedal/tests/test_common.py +0 -0
  203. {scikit_learn_intelex-2025.4.0.data → scikit_learn_intelex-2025.5.0.data}/data/Lib/site-packages/onedal/tests/utils/_dataframes_support.py +0 -0
  204. {scikit_learn_intelex-2025.4.0.data → scikit_learn_intelex-2025.5.0.data}/data/Lib/site-packages/sklearnex/basic_statistics/__init__.py +0 -0
  205. {scikit_learn_intelex-2025.4.0.data → scikit_learn_intelex-2025.5.0.data}/data/Lib/site-packages/sklearnex/basic_statistics/tests/test_basic_statistics.py +0 -0
  206. {scikit_learn_intelex-2025.4.0.data → scikit_learn_intelex-2025.5.0.data}/data/Lib/site-packages/sklearnex/basic_statistics/tests/test_incremental_basic_statistics.py +0 -0
  207. {scikit_learn_intelex-2025.4.0.data → scikit_learn_intelex-2025.5.0.data}/data/Lib/site-packages/sklearnex/cluster/__init__.py +0 -0
  208. {scikit_learn_intelex-2025.4.0.data → scikit_learn_intelex-2025.5.0.data}/data/Lib/site-packages/sklearnex/cluster/tests/test_dbscan.py +0 -0
  209. {scikit_learn_intelex-2025.4.0.data → scikit_learn_intelex-2025.5.0.data}/data/Lib/site-packages/sklearnex/cluster/tests/test_kmeans.py +0 -0
  210. {scikit_learn_intelex-2025.4.0.data → scikit_learn_intelex-2025.5.0.data}/data/Lib/site-packages/sklearnex/conftest.py +0 -0
  211. {scikit_learn_intelex-2025.4.0.data → scikit_learn_intelex-2025.5.0.data}/data/Lib/site-packages/sklearnex/covariance/__init__.py +0 -0
  212. {scikit_learn_intelex-2025.4.0.data → scikit_learn_intelex-2025.5.0.data}/data/Lib/site-packages/sklearnex/covariance/tests/test_incremental_covariance.py +0 -0
  213. {scikit_learn_intelex-2025.4.0.data → scikit_learn_intelex-2025.5.0.data}/data/Lib/site-packages/sklearnex/decomposition/__init__.py +0 -0
  214. {scikit_learn_intelex-2025.4.0.data → scikit_learn_intelex-2025.5.0.data}/data/Lib/site-packages/sklearnex/decomposition/tests/test_pca.py +0 -0
  215. {scikit_learn_intelex-2025.4.0.data → scikit_learn_intelex-2025.5.0.data}/data/Lib/site-packages/sklearnex/ensemble/__init__.py +0 -0
  216. {scikit_learn_intelex-2025.4.0.data → scikit_learn_intelex-2025.5.0.data}/data/Lib/site-packages/sklearnex/ensemble/tests/test_forest.py +0 -0
  217. {scikit_learn_intelex-2025.4.0.data → scikit_learn_intelex-2025.5.0.data}/data/Lib/site-packages/sklearnex/linear_model/__init__.py +0 -0
  218. {scikit_learn_intelex-2025.4.0.data → scikit_learn_intelex-2025.5.0.data}/data/Lib/site-packages/sklearnex/linear_model/tests/test_incremental_linear.py +0 -0
  219. {scikit_learn_intelex-2025.4.0.data → scikit_learn_intelex-2025.5.0.data}/data/Lib/site-packages/sklearnex/linear_model/tests/test_incremental_ridge.py +0 -0
  220. {scikit_learn_intelex-2025.4.0.data → scikit_learn_intelex-2025.5.0.data}/data/Lib/site-packages/sklearnex/linear_model/tests/test_ridge.py +0 -0
  221. {scikit_learn_intelex-2025.4.0.data → scikit_learn_intelex-2025.5.0.data}/data/Lib/site-packages/sklearnex/manifold/__init__.py +0 -0
  222. {scikit_learn_intelex-2025.4.0.data → scikit_learn_intelex-2025.5.0.data}/data/Lib/site-packages/sklearnex/manifold/tests/test_tsne.py +0 -0
  223. {scikit_learn_intelex-2025.4.0.data → scikit_learn_intelex-2025.5.0.data}/data/Lib/site-packages/sklearnex/metrics/__init__.py +0 -0
  224. {scikit_learn_intelex-2025.4.0.data → scikit_learn_intelex-2025.5.0.data}/data/Lib/site-packages/sklearnex/metrics/tests/test_metrics.py +0 -0
  225. {scikit_learn_intelex-2025.4.0.data → scikit_learn_intelex-2025.5.0.data}/data/Lib/site-packages/sklearnex/model_selection/__init__.py +0 -0
  226. {scikit_learn_intelex-2025.4.0.data → scikit_learn_intelex-2025.5.0.data}/data/Lib/site-packages/sklearnex/model_selection/tests/test_model_selection.py +0 -0
  227. {scikit_learn_intelex-2025.4.0.data → scikit_learn_intelex-2025.5.0.data}/data/Lib/site-packages/sklearnex/neighbors/__init__.py +0 -0
  228. {scikit_learn_intelex-2025.4.0.data → scikit_learn_intelex-2025.5.0.data}/data/Lib/site-packages/sklearnex/neighbors/tests/test_neighbors.py +0 -0
  229. {scikit_learn_intelex-2025.4.0.data → scikit_learn_intelex-2025.5.0.data}/data/Lib/site-packages/sklearnex/preview/__init__.py +0 -0
  230. {scikit_learn_intelex-2025.4.0.data → scikit_learn_intelex-2025.5.0.data}/data/Lib/site-packages/sklearnex/preview/covariance/__init__.py +0 -0
  231. {scikit_learn_intelex-2025.4.0.data → scikit_learn_intelex-2025.5.0.data}/data/Lib/site-packages/sklearnex/preview/covariance/tests/test_covariance.py +0 -0
  232. {scikit_learn_intelex-2025.4.0.data → scikit_learn_intelex-2025.5.0.data}/data/Lib/site-packages/sklearnex/preview/decomposition/__init__.py +0 -0
  233. {scikit_learn_intelex-2025.4.0.data → scikit_learn_intelex-2025.5.0.data}/data/Lib/site-packages/sklearnex/preview/decomposition/tests/test_incremental_pca.py +0 -0
  234. {scikit_learn_intelex-2025.4.0.data → scikit_learn_intelex-2025.5.0.data}/data/Lib/site-packages/sklearnex/spmd/__init__.py +0 -0
  235. {scikit_learn_intelex-2025.4.0.data → scikit_learn_intelex-2025.5.0.data}/data/Lib/site-packages/sklearnex/spmd/basic_statistics/__init__.py +0 -0
  236. {scikit_learn_intelex-2025.4.0.data → scikit_learn_intelex-2025.5.0.data}/data/Lib/site-packages/sklearnex/spmd/basic_statistics/basic_statistics.py +0 -0
  237. {scikit_learn_intelex-2025.4.0.data → scikit_learn_intelex-2025.5.0.data}/data/Lib/site-packages/sklearnex/spmd/basic_statistics/incremental_basic_statistics.py +0 -0
  238. {scikit_learn_intelex-2025.4.0.data → scikit_learn_intelex-2025.5.0.data}/data/Lib/site-packages/sklearnex/spmd/cluster/__init__.py +0 -0
  239. {scikit_learn_intelex-2025.4.0.data → scikit_learn_intelex-2025.5.0.data}/data/Lib/site-packages/sklearnex/spmd/cluster/dbscan.py +0 -0
  240. {scikit_learn_intelex-2025.4.0.data → scikit_learn_intelex-2025.5.0.data}/data/Lib/site-packages/sklearnex/spmd/cluster/kmeans.py +0 -0
  241. {scikit_learn_intelex-2025.4.0.data → scikit_learn_intelex-2025.5.0.data}/data/Lib/site-packages/sklearnex/spmd/covariance/__init__.py +0 -0
  242. {scikit_learn_intelex-2025.4.0.data → scikit_learn_intelex-2025.5.0.data}/data/Lib/site-packages/sklearnex/spmd/covariance/covariance.py +0 -0
  243. {scikit_learn_intelex-2025.4.0.data → scikit_learn_intelex-2025.5.0.data}/data/Lib/site-packages/sklearnex/spmd/covariance/incremental_covariance.py +0 -0
  244. {scikit_learn_intelex-2025.4.0.data → scikit_learn_intelex-2025.5.0.data}/data/Lib/site-packages/sklearnex/spmd/decomposition/__init__.py +0 -0
  245. {scikit_learn_intelex-2025.4.0.data → scikit_learn_intelex-2025.5.0.data}/data/Lib/site-packages/sklearnex/spmd/decomposition/incremental_pca.py +0 -0
  246. {scikit_learn_intelex-2025.4.0.data → scikit_learn_intelex-2025.5.0.data}/data/Lib/site-packages/sklearnex/spmd/decomposition/pca.py +0 -0
  247. {scikit_learn_intelex-2025.4.0.data → scikit_learn_intelex-2025.5.0.data}/data/Lib/site-packages/sklearnex/spmd/ensemble/__init__.py +0 -0
  248. {scikit_learn_intelex-2025.4.0.data → scikit_learn_intelex-2025.5.0.data}/data/Lib/site-packages/sklearnex/spmd/ensemble/forest.py +0 -0
  249. {scikit_learn_intelex-2025.4.0.data → scikit_learn_intelex-2025.5.0.data}/data/Lib/site-packages/sklearnex/spmd/linear_model/__init__.py +0 -0
  250. {scikit_learn_intelex-2025.4.0.data → scikit_learn_intelex-2025.5.0.data}/data/Lib/site-packages/sklearnex/spmd/linear_model/incremental_linear_model.py +0 -0
  251. {scikit_learn_intelex-2025.4.0.data → scikit_learn_intelex-2025.5.0.data}/data/Lib/site-packages/sklearnex/spmd/linear_model/linear_model.py +0 -0
  252. {scikit_learn_intelex-2025.4.0.data → scikit_learn_intelex-2025.5.0.data}/data/Lib/site-packages/sklearnex/spmd/linear_model/logistic_regression.py +0 -0
  253. {scikit_learn_intelex-2025.4.0.data → scikit_learn_intelex-2025.5.0.data}/data/Lib/site-packages/sklearnex/svm/__init__.py +0 -0
  254. {scikit_learn_intelex-2025.4.0.data → scikit_learn_intelex-2025.5.0.data}/data/Lib/site-packages/sklearnex/svm/tests/test_svm.py +0 -0
  255. {scikit_learn_intelex-2025.4.0.data → scikit_learn_intelex-2025.5.0.data}/data/Lib/site-packages/sklearnex/tests/test_config.py +0 -0
  256. {scikit_learn_intelex-2025.4.0.data → scikit_learn_intelex-2025.5.0.data}/data/Lib/site-packages/sklearnex/tests/test_hyperparameters.py +0 -0
  257. {scikit_learn_intelex-2025.4.0.data → scikit_learn_intelex-2025.5.0.data}/data/Lib/site-packages/sklearnex/tests/test_n_jobs_support.py +0 -0
  258. {scikit_learn_intelex-2025.4.0.data → scikit_learn_intelex-2025.5.0.data}/data/Lib/site-packages/sklearnex/tests/test_parallel.py +0 -0
  259. {scikit_learn_intelex-2025.4.0.data → scikit_learn_intelex-2025.5.0.data}/data/Lib/site-packages/sklearnex/tests/test_patching.py +0 -0
  260. {scikit_learn_intelex-2025.4.0.data → scikit_learn_intelex-2025.5.0.data}/data/Lib/site-packages/sklearnex/tests/test_run_to_run_stability.py +0 -0
  261. {scikit_learn_intelex-2025.4.0.data → scikit_learn_intelex-2025.5.0.data}/data/Lib/site-packages/sklearnex/tests/utils/__init__.py +0 -0
  262. {scikit_learn_intelex-2025.4.0.data → scikit_learn_intelex-2025.5.0.data}/data/Lib/site-packages/sklearnex/tests/utils/spmd.py +0 -0
  263. {scikit_learn_intelex-2025.4.0.data → scikit_learn_intelex-2025.5.0.data}/data/Lib/site-packages/sklearnex/utils/__init__.py +0 -0
  264. {scikit_learn_intelex-2025.4.0.data → scikit_learn_intelex-2025.5.0.data}/data/Lib/site-packages/sklearnex/utils/_array_api.py +0 -0
  265. {scikit_learn_intelex-2025.4.0.data → scikit_learn_intelex-2025.5.0.data}/data/Lib/site-packages/sklearnex/utils/parallel.py +0 -0
  266. {scikit_learn_intelex-2025.4.0.data → scikit_learn_intelex-2025.5.0.data}/data/Lib/site-packages/sklearnex/utils/tests/test_validation.py +0 -0
  267. {scikit_learn_intelex-2025.4.0.dist-info → scikit_learn_intelex-2025.5.0.dist-info}/LICENSE.txt +0 -0
  268. {scikit_learn_intelex-2025.4.0.dist-info → scikit_learn_intelex-2025.5.0.dist-info}/WHEEL +0 -0
  269. {scikit_learn_intelex-2025.4.0.dist-info → scikit_learn_intelex-2025.5.0.dist-info}/top_level.txt +0 -0
@@ -0,0 +1,855 @@
1
+ # ===============================================================================
2
+ # Copyright 2023 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 json
18
+ from collections import deque
19
+ from copy import deepcopy
20
+ from tempfile import NamedTemporaryFile
21
+ from typing import Any, Deque, Dict, List, Optional, Tuple
22
+ from warnings import warn
23
+
24
+ import numpy as np
25
+
26
+ from .. import gbt_clf_model_builder, gbt_reg_model_builder
27
+
28
+
29
+ class CatBoostNode:
30
+ def __init__(
31
+ self,
32
+ split: Optional[Dict] = None,
33
+ value: Optional[List[float]] = None,
34
+ right: Optional[int] = None,
35
+ left: Optional[float] = None,
36
+ cover: Optional[float] = None,
37
+ ) -> None:
38
+ self.split = split
39
+ self.value = value
40
+ self.right = right
41
+ self.left = left
42
+ self.cover = cover
43
+
44
+
45
+ class CatBoostModelData:
46
+ """Wrapper around the CatBoost model dump for easier access to properties"""
47
+
48
+ def __init__(self, data):
49
+ self.__data = data
50
+
51
+ @property
52
+ def n_features(self):
53
+ return len(self.__data["features_info"]["float_features"])
54
+
55
+ @property
56
+ def grow_policy(self):
57
+ return self.__data["model_info"]["params"]["tree_learner_options"]["grow_policy"]
58
+
59
+ @property
60
+ def oblivious_trees(self):
61
+ return self.__data["oblivious_trees"]
62
+
63
+ @property
64
+ def trees(self):
65
+ return self.__data["trees"]
66
+
67
+ @property
68
+ def n_classes(self):
69
+ """Number of classes, returns -1 if it's not a classification model"""
70
+ if "class_params" in self.__data["model_info"]:
71
+ return len(self.__data["model_info"]["class_params"]["class_to_label"])
72
+ return -1
73
+
74
+ @property
75
+ def is_classification(self):
76
+ return "class_params" in self.__data["model_info"]
77
+
78
+ @property
79
+ def has_categorical_features(self):
80
+ return "categorical_features" in self.__data["features_info"]
81
+
82
+ @property
83
+ def is_symmetric_tree(self):
84
+ return self.grow_policy == "SymmetricTree"
85
+
86
+ @property
87
+ def float_features(self):
88
+ return self.__data["features_info"]["float_features"]
89
+
90
+ @property
91
+ def n_iterations(self):
92
+ if self.is_symmetric_tree:
93
+ return len(self.oblivious_trees)
94
+ else:
95
+ return len(self.trees)
96
+
97
+ @property
98
+ def bias(self):
99
+ if self.is_classification:
100
+ return 0
101
+ return self.__data["scale_and_bias"][1][0] / self.n_iterations
102
+
103
+ @property
104
+ def scale(self):
105
+ if self.is_classification:
106
+ return 1
107
+ else:
108
+ return self.__data["scale_and_bias"][0]
109
+
110
+ @property
111
+ def default_left(self):
112
+ dpo = self.__data["model_info"]["params"]["data_processing_options"]
113
+ nan_mode = dpo["float_features_binarization"]["nan_mode"]
114
+ return int(nan_mode.lower() == "min")
115
+
116
+
117
+ class Node:
118
+ """Helper class holding Tree Node information"""
119
+
120
+ def __init__(
121
+ self,
122
+ cover: float,
123
+ is_leaf: bool,
124
+ default_left: bool,
125
+ feature: int,
126
+ value: float,
127
+ n_children: int = 0,
128
+ left_child: "Optional[Node]" = None,
129
+ right_child: "Optional[Node]" = None,
130
+ parent_id: Optional[int] = -1,
131
+ position: Optional[int] = -1,
132
+ ) -> None:
133
+ self.cover = cover
134
+ self.is_leaf = is_leaf
135
+ self.default_left = default_left
136
+ self.__feature = feature
137
+ self.value = value
138
+ self.n_children = n_children
139
+ self.left_child = left_child
140
+ self.right_child = right_child
141
+ self.parent_id = parent_id
142
+ self.position = position
143
+
144
+ @staticmethod
145
+ def from_xgb_dict(
146
+ input_dict: Dict[str, Any], feature_names_to_indices: dict[str, int]
147
+ ) -> "Node":
148
+ if "children" in input_dict:
149
+ left_child = Node.from_xgb_dict(
150
+ input_dict["children"][0], feature_names_to_indices
151
+ )
152
+ right_child = Node.from_xgb_dict(
153
+ input_dict["children"][1], feature_names_to_indices
154
+ )
155
+ n_children = 2 + left_child.n_children + right_child.n_children
156
+ else:
157
+ left_child = None
158
+ right_child = None
159
+ n_children = 0
160
+ is_leaf = "leaf" in input_dict
161
+ default_left = "yes" in input_dict and input_dict["yes"] == input_dict["missing"]
162
+ feature = input_dict.get("split")
163
+ if feature:
164
+ feature = feature_names_to_indices[feature]
165
+ return Node(
166
+ cover=input_dict["cover"],
167
+ is_leaf=is_leaf,
168
+ default_left=default_left,
169
+ feature=feature,
170
+ value=input_dict["leaf"] if is_leaf else input_dict["split_condition"],
171
+ n_children=n_children,
172
+ left_child=left_child,
173
+ right_child=right_child,
174
+ )
175
+
176
+ @staticmethod
177
+ def from_lightgbm_dict(input_dict: Dict[str, Any]) -> "Node":
178
+ if "tree_structure" in input_dict:
179
+ tree = input_dict["tree_structure"]
180
+ else:
181
+ tree = input_dict
182
+
183
+ n_children = 0
184
+ if "left_child" in tree:
185
+ left_child = Node.from_lightgbm_dict(tree["left_child"])
186
+ n_children += 1 + left_child.n_children
187
+ else:
188
+ left_child = None
189
+ if "right_child" in tree:
190
+ right_child = Node.from_lightgbm_dict(tree["right_child"])
191
+ n_children += 1 + right_child.n_children
192
+ else:
193
+ right_child = None
194
+
195
+ is_leaf = "leaf_value" in tree
196
+ # get cover and value for leaf nodes or internal nodes
197
+ cover = tree.get("leaf_count", 0) or tree.get("internal_count", 0)
198
+ value = tree.get("leaf_value", 0) or tree.get("threshold", 0)
199
+ return Node(
200
+ cover=cover,
201
+ is_leaf=is_leaf,
202
+ default_left=tree.get("default_left", 0),
203
+ feature=tree.get("split_feature"),
204
+ value=value,
205
+ n_children=n_children,
206
+ left_child=left_child,
207
+ right_child=right_child,
208
+ )
209
+
210
+ def get_value_closest_float_downward(self) -> np.float64:
211
+ """Get the closest exact fp value smaller than self.value"""
212
+ return np.nextafter(np.single(self.value), np.single(-np.inf))
213
+
214
+ def get_children(self) -> "Optional[Tuple[Node, Node]]":
215
+ if not self.left_child or not self.right_child:
216
+ assert self.is_leaf
217
+ else:
218
+ return (self.left_child, self.right_child)
219
+
220
+ @property
221
+ def feature(self) -> int:
222
+ if isinstance(self.__feature, int):
223
+ return self.__feature
224
+ if isinstance(self.__feature, str) and self.__feature.isnumeric():
225
+ return int(self.__feature)
226
+ raise ValueError(
227
+ f"Feature names must be integers (got ({type(self.__feature)}){self.__feature})"
228
+ )
229
+
230
+
231
+ class TreeView:
232
+ """Helper class, treating a list of nodes as one tree"""
233
+
234
+ def __init__(self, tree_id: int, root_node: Node) -> None:
235
+ self.tree_id = tree_id
236
+ self.root_node = root_node
237
+
238
+ @property
239
+ def is_leaf(self) -> bool:
240
+ return self.root_node.is_leaf
241
+
242
+ @property
243
+ def value(self) -> float:
244
+ if not self.is_leaf:
245
+ raise ValueError("Tree is not a leaf-only tree")
246
+ if self.root_node.value is None:
247
+ raise ValueError("Tree is leaf-only but leaf node has no value")
248
+ return self.root_node.value
249
+
250
+ @property
251
+ def cover(self) -> float:
252
+ if not self.is_leaf:
253
+ raise ValueError("Tree is not a leaf-only tree")
254
+ return self.root_node.cover
255
+
256
+ @property
257
+ def n_nodes(self) -> int:
258
+ return self.root_node.n_children + 1
259
+
260
+
261
+ class TreeList(list):
262
+ """Helper class that is able to extract all information required by the
263
+ model builders from various objects"""
264
+
265
+ @staticmethod
266
+ def from_xgb_booster(
267
+ booster, max_trees: int, feature_names_to_indices: dict[str, int]
268
+ ) -> "TreeList":
269
+ """
270
+ Load a TreeList from an xgb.Booster object
271
+ Note: We cannot type-hint the xgb.Booster without loading xgb as dependency in pyx code,
272
+ therefore not type hint is added.
273
+ """
274
+
275
+ # Note: in XGBoost, it's possible to use 'int' type for features that contain
276
+ # non-integer floating points. In such case, the training procedure and JSON
277
+ # export from XGBoost will not treat them any differently from 'q'-type
278
+ # (numeric) features, but the per-tree JSON text dumps used here will output
279
+ # a split threshold rounded to the nearest integer for those 'int' features,
280
+ # even if the booster internally has thresholds with decimal points and outputs
281
+ # them as such in the full-model JSON dumps. Hence the need for this override
282
+ # mechanism. If this behavior changes in XGBoost, then this conversion and
283
+ # override can be removed.
284
+ orig_feature_types = None
285
+ try:
286
+ if hasattr(booster, "feature_types"):
287
+ feature_types = booster.feature_types
288
+ orig_feature_types = deepcopy(feature_types)
289
+ if feature_types:
290
+ for i in range(len(feature_types)):
291
+ if feature_types[i] == "int":
292
+ feature_types[i] = "float"
293
+ booster.feature_types = feature_types
294
+
295
+ tl = TreeList()
296
+ dump = booster.get_dump(dump_format="json", with_stats=True)
297
+ finally:
298
+ if orig_feature_types:
299
+ booster.feature_types = orig_feature_types
300
+ for tree_id, raw_tree in enumerate(dump):
301
+ if max_trees > 0 and tree_id == max_trees:
302
+ break
303
+ raw_tree_parsed = json.loads(raw_tree)
304
+ root_node = Node.from_xgb_dict(raw_tree_parsed, feature_names_to_indices)
305
+ tl.append(TreeView(tree_id=tree_id, root_node=root_node))
306
+
307
+ return tl
308
+
309
+ @staticmethod
310
+ def from_lightgbm_booster_dump(dump: Dict[str, Any]) -> "TreeList":
311
+ """
312
+ Load a TreeList from a lgbm Booster dump
313
+ Note: We cannot type-hint the the Model without loading lightgbm as dependency in pyx code,
314
+ therefore not type hint is added.
315
+ """
316
+ tl = TreeList()
317
+ for tree_id, tree_dict in enumerate(dump["tree_info"]):
318
+ root_node = Node.from_lightgbm_dict(tree_dict)
319
+ tl.append(TreeView(tree_id=tree_id, root_node=root_node))
320
+
321
+ return tl
322
+
323
+ def __setitem__(self):
324
+ raise NotImplementedError(
325
+ "Use TreeList.from_*() methods to initialize a TreeList"
326
+ )
327
+
328
+
329
+ def get_lightgbm_params(booster):
330
+ return booster.dump_model()
331
+
332
+
333
+ def get_xgboost_params(booster):
334
+ return json.loads(booster.save_config())
335
+
336
+
337
+ def get_catboost_params(booster):
338
+ with NamedTemporaryFile() as fp:
339
+ booster.save_model(fp.name, "json")
340
+ fp.seek(0)
341
+ model_data = json.load(fp)
342
+ return model_data
343
+
344
+
345
+ def get_gbt_model_from_tree_list(
346
+ tree_list: TreeList,
347
+ n_iterations: int,
348
+ is_regression: bool,
349
+ n_features: int,
350
+ n_classes: int,
351
+ base_score: Optional[float] = None,
352
+ ):
353
+ """Return a GBT Model from TreeList"""
354
+
355
+ if is_regression:
356
+ mb = gbt_reg_model_builder(n_features=n_features, n_iterations=n_iterations)
357
+ else:
358
+ mb = gbt_clf_model_builder(
359
+ n_features=n_features, n_iterations=n_iterations, n_classes=n_classes
360
+ )
361
+
362
+ class_label = 0
363
+ for counter, tree in enumerate(tree_list, start=1):
364
+ # find out the number of nodes in the tree
365
+ if is_regression:
366
+ tree_id = mb.create_tree(tree.n_nodes)
367
+ else:
368
+ tree_id = mb.create_tree(n_nodes=tree.n_nodes, class_label=class_label)
369
+
370
+ if counter % n_iterations == 0:
371
+ class_label += 1
372
+
373
+ if tree.is_leaf:
374
+ mb.add_leaf(tree_id=tree_id, response=tree.value, cover=tree.cover)
375
+ continue
376
+
377
+ root_node = tree.root_node
378
+ parent_id = mb.add_split(
379
+ tree_id=tree_id,
380
+ feature_index=root_node.feature,
381
+ feature_value=root_node.get_value_closest_float_downward(),
382
+ cover=root_node.cover,
383
+ default_left=root_node.default_left,
384
+ )
385
+
386
+ # create queue
387
+ node_queue: Deque[Node] = deque()
388
+ children = root_node.get_children()
389
+ assert children is not None
390
+ for position, child in enumerate(children):
391
+ child.parent_id = parent_id
392
+ child.position = position
393
+ node_queue.append(child)
394
+
395
+ while node_queue:
396
+ node = node_queue.popleft()
397
+ assert node.parent_id != -1, "node.parent_id must not be -1"
398
+ assert node.position != -1, "node.position must not be -1"
399
+
400
+ if node.is_leaf:
401
+ mb.add_leaf(
402
+ tree_id=tree_id,
403
+ response=node.value,
404
+ cover=node.cover,
405
+ parent_id=node.parent_id,
406
+ position=node.position,
407
+ )
408
+ else:
409
+ parent_id = mb.add_split(
410
+ tree_id=tree_id,
411
+ feature_index=node.feature,
412
+ feature_value=node.get_value_closest_float_downward(),
413
+ cover=node.cover,
414
+ default_left=node.default_left,
415
+ parent_id=node.parent_id,
416
+ position=node.position,
417
+ )
418
+
419
+ children = node.get_children()
420
+ assert children is not None
421
+ for position, child in enumerate(children):
422
+ child.parent_id = parent_id
423
+ child.position = position
424
+ node_queue.append(child)
425
+
426
+ return mb.model(base_score=base_score)
427
+
428
+
429
+ def get_gbt_model_from_lightgbm(model: Any, booster=None) -> Any:
430
+ if booster is None:
431
+ booster = model.dump_model()
432
+
433
+ n_features = booster["max_feature_idx"] + 1
434
+ n_iterations = len(booster["tree_info"]) / booster["num_tree_per_iteration"]
435
+ n_classes = booster["num_tree_per_iteration"]
436
+
437
+ is_regression = False
438
+ objective_fun = booster["objective"]
439
+ if n_classes > 2:
440
+ if "multiclass" not in objective_fun:
441
+ raise TypeError(
442
+ "multiclass (softmax) objective is only supported for multiclass classification"
443
+ )
444
+ elif "binary" in objective_fun: # nClasses == 1
445
+ n_classes = 2
446
+ else:
447
+ is_regression = True
448
+
449
+ tree_list = TreeList.from_lightgbm_booster_dump(booster)
450
+
451
+ return get_gbt_model_from_tree_list(
452
+ tree_list,
453
+ n_iterations=n_iterations,
454
+ is_regression=is_regression,
455
+ n_features=n_features,
456
+ n_classes=n_classes,
457
+ )
458
+
459
+
460
+ def get_gbt_model_from_xgboost(booster: Any, xgb_config=None) -> Any:
461
+ # Note: in the absence of any feature names, XGBoost will generate
462
+ # tree json dumps where features are named 'f0..N'. While the JSONs
463
+ # of the whole model will have feature indices, the per-tree JSONs
464
+ # used here always use string names instead, hence the need for this.
465
+ feature_names = booster.feature_names
466
+ if feature_names:
467
+ feature_names_to_indices = {fname: ind for ind, fname in enumerate(feature_names)}
468
+ else:
469
+ feature_names_to_indices = {
470
+ f"f{ind}": ind for ind in range(booster.num_features())
471
+ }
472
+
473
+ if xgb_config is None:
474
+ xgb_config = get_xgboost_params(booster)
475
+
476
+ n_features = int(xgb_config["learner"]["learner_model_param"]["num_feature"])
477
+ n_classes = int(xgb_config["learner"]["learner_model_param"]["num_class"])
478
+ base_score = float(xgb_config["learner"]["learner_model_param"]["base_score"])
479
+
480
+ is_regression = False
481
+ objective_fun = xgb_config["learner"]["learner_train_param"]["objective"]
482
+
483
+ # Note: the base score from XGBoost is in the response scale, but the predictions
484
+ # are calculated in the link scale, so when there is a non-identity link function,
485
+ # it needs to be converted to the link scale.
486
+ if objective_fun in ["count:poisson", "reg:gamma", "reg:tweedie", "survival:aft"]:
487
+ base_score = float(np.log(base_score))
488
+ elif objective_fun == "reg:logistic":
489
+ base_score = float(np.log(base_score / (1 - base_score)))
490
+ elif objective_fun.startswith("rank"):
491
+ raise TypeError("Ranking objectives are not supported.")
492
+
493
+ if n_classes > 2:
494
+ if objective_fun not in ["multi:softprob", "multi:softmax"]:
495
+ raise TypeError(
496
+ "multi:softprob and multi:softmax are only supported for multiclass classification"
497
+ )
498
+ elif objective_fun.startswith("binary:"):
499
+ if objective_fun not in ["binary:logistic", "binary:logitraw"]:
500
+ raise TypeError(
501
+ "only binary:logistic and binary:logitraw are supported for binary classification"
502
+ )
503
+ n_classes = 2
504
+ if objective_fun == "binary:logitraw":
505
+ # daal4py always applies a sigmoid for pred_proba, wheres XGBoost
506
+ # returns raw predictions with logitraw
507
+ warn(
508
+ "objective='binary:logitraw' selected\n"
509
+ "XGBoost returns raw class scores when calling pred_proba()\n"
510
+ "whilst scikit-learn-intelex always uses binary:logistic\n"
511
+ )
512
+ base_score = float(1 / (1 + np.exp(-base_score)))
513
+ else:
514
+ is_regression = True
515
+
516
+ # max_trees=0 if best_iteration does not exist
517
+ max_trees = getattr(booster, "best_iteration", -1) + 1
518
+ if n_classes > 2:
519
+ max_trees *= n_classes
520
+ tree_list = TreeList.from_xgb_booster(booster, max_trees, feature_names_to_indices)
521
+
522
+ if hasattr(booster, "best_iteration"):
523
+ n_iterations = booster.best_iteration + 1
524
+ else:
525
+ n_iterations = len(tree_list) // (n_classes if n_classes > 2 else 1)
526
+
527
+ return get_gbt_model_from_tree_list(
528
+ tree_list,
529
+ n_iterations=n_iterations,
530
+ is_regression=is_regression,
531
+ n_features=n_features,
532
+ n_classes=n_classes,
533
+ base_score=base_score,
534
+ )
535
+
536
+
537
+ def __get_value_as_list(node):
538
+ """Make sure the values are a list"""
539
+ values = node["value"]
540
+ if isinstance(values, (list, tuple)):
541
+ return values
542
+ else:
543
+ return [values]
544
+
545
+
546
+ def __calc_node_weights_from_leaf_weights(weights):
547
+ def sum_pairs(values):
548
+ assert len(values) % 2 == 0, "Length of values must be even"
549
+ return [values[i] + values[i + 1] for i in range(0, len(values), 2)]
550
+
551
+ level_weights = sum_pairs(weights)
552
+ result = [level_weights]
553
+ while len(level_weights) > 1:
554
+ level_weights = sum_pairs(level_weights)
555
+ result.append(level_weights)
556
+ return result[::-1]
557
+
558
+
559
+ def get_gbt_model_from_catboost(booster: Any) -> Any:
560
+ if not booster.is_fitted():
561
+ raise RuntimeError("Model should be fitted before exporting to daal4py.")
562
+
563
+ model = CatBoostModelData(get_catboost_params(booster))
564
+
565
+ if model.has_categorical_features:
566
+ raise NotImplementedError(
567
+ "Categorical features are not supported in daal4py Gradient Boosting Trees"
568
+ )
569
+
570
+ if model.is_classification:
571
+ mb = gbt_clf_model_builder(
572
+ n_features=model.n_features,
573
+ n_iterations=model.n_iterations,
574
+ n_classes=model.n_classes,
575
+ )
576
+ else:
577
+ mb = gbt_reg_model_builder(
578
+ n_features=model.n_features, n_iterations=model.n_iterations
579
+ )
580
+
581
+ # Create splits array (all splits are placed sequentially)
582
+ splits = []
583
+ for feature in model.float_features:
584
+ if feature["borders"]:
585
+ for feature_border in feature["borders"]:
586
+ splits.append(
587
+ {"feature_index": feature["feature_index"], "value": feature_border}
588
+ )
589
+
590
+ trees_explicit = []
591
+ tree_symmetric = []
592
+
593
+ if model.is_symmetric_tree:
594
+ for tree in model.oblivious_trees:
595
+ cur_tree_depth = len(tree.get("splits", []))
596
+ tree_symmetric.append((tree, cur_tree_depth))
597
+ else:
598
+ for tree in model.trees:
599
+ n_nodes = 1
600
+ if "split" not in tree:
601
+ # handle leaf node
602
+ values = __get_value_as_list(tree)
603
+ root_node = CatBoostNode(value=[value * model.scale for value in values])
604
+ continue
605
+ # Check if node is a leaf (in case of stump)
606
+ if "split" in tree:
607
+ # Get number of trees and splits info via BFS
608
+ # Create queue
609
+ nodes_queue = []
610
+ root_node = CatBoostNode(split=splits[tree["split"]["split_index"]])
611
+ nodes_queue.append((tree, root_node))
612
+ while nodes_queue:
613
+ cur_node_data, cur_node = nodes_queue.pop(0)
614
+ if "value" in cur_node_data:
615
+ cur_node.value = __get_value_as_list(cur_node_data)
616
+ else:
617
+ cur_node.split = splits[cur_node_data["split"]["split_index"]]
618
+ left_node = CatBoostNode()
619
+ right_node = CatBoostNode()
620
+ cur_node.left = left_node
621
+ cur_node.right = right_node
622
+ nodes_queue.append((cur_node_data["left"], left_node))
623
+ nodes_queue.append((cur_node_data["right"], right_node))
624
+ n_nodes += 2
625
+ else:
626
+ root_node = CatBoostNode()
627
+ if model.is_classification and model.n_classes > 2:
628
+ root_node.value = [value * model.scale for value in tree["value"]]
629
+ else:
630
+ root_node.value = [tree["value"] * model.scale + model.bias]
631
+ trees_explicit.append((root_node, n_nodes))
632
+
633
+ tree_id = []
634
+ class_label = 0
635
+ count = 0
636
+
637
+ # Only 1 tree for each iteration in case of regression or binary classification
638
+ if not model.is_classification or model.n_classes == 2:
639
+ n_tree_each_iter = 1
640
+ else:
641
+ n_tree_each_iter = model.n_classes
642
+
643
+ shap_ready = False
644
+
645
+ # Create id for trees (for the right order in model builder)
646
+ for i in range(model.n_iterations):
647
+ for _ in range(n_tree_each_iter):
648
+ if model.is_symmetric_tree:
649
+ n_nodes = 2 ** (tree_symmetric[i][1] + 1) - 1
650
+ else:
651
+ n_nodes = trees_explicit[i][1]
652
+
653
+ if model.is_classification and model.n_classes > 2:
654
+ tree_id.append(mb.create_tree(n_nodes, class_label))
655
+ count += 1
656
+ if count == model.n_iterations:
657
+ class_label += 1
658
+ count = 0
659
+
660
+ elif model.is_classification:
661
+ tree_id.append(mb.create_tree(n_nodes, 0))
662
+ else:
663
+ tree_id.append(mb.create_tree(n_nodes))
664
+
665
+ if model.is_symmetric_tree:
666
+ for class_label in range(n_tree_each_iter):
667
+ for i in range(model.n_iterations):
668
+ shap_ready = True # this code branch provides all info for SHAP values
669
+ cur_tree_info = tree_symmetric[i][0]
670
+ cur_tree_id = tree_id[i * n_tree_each_iter + class_label]
671
+ cur_tree_leaf_val = cur_tree_info["leaf_values"]
672
+ cur_tree_leaf_weights = cur_tree_info["leaf_weights"]
673
+ cur_tree_depth = tree_symmetric[i][1]
674
+ if cur_tree_depth == 0:
675
+ mb.add_leaf(
676
+ tree_id=cur_tree_id,
677
+ response=cur_tree_leaf_val[0],
678
+ cover=cur_tree_leaf_weights[0],
679
+ )
680
+ else:
681
+ # One split used for the whole level
682
+ cur_level_split = splits[
683
+ cur_tree_info["splits"][cur_tree_depth - 1]["split_index"]
684
+ ]
685
+ cur_tree_weights_per_level = __calc_node_weights_from_leaf_weights(
686
+ cur_tree_leaf_weights
687
+ )
688
+ root_weight = cur_tree_weights_per_level[0][0]
689
+ root_id = mb.add_split(
690
+ tree_id=cur_tree_id,
691
+ feature_index=cur_level_split["feature_index"],
692
+ feature_value=cur_level_split["value"],
693
+ default_left=model.default_left,
694
+ cover=root_weight,
695
+ )
696
+ prev_level_nodes = [root_id]
697
+
698
+ # Iterate over levels, splits in json are reversed (root split is the last)
699
+ for cur_level in range(cur_tree_depth - 2, -1, -1):
700
+ cur_level_nodes = []
701
+ next_level_weights = cur_tree_weights_per_level[cur_level + 1]
702
+ cur_level_node_index = 0
703
+ for cur_parent in prev_level_nodes:
704
+ cur_level_split = splits[
705
+ cur_tree_info["splits"][cur_level]["split_index"]
706
+ ]
707
+ cur_left_node = mb.add_split(
708
+ tree_id=cur_tree_id,
709
+ parent_id=cur_parent,
710
+ position=0,
711
+ feature_index=cur_level_split["feature_index"],
712
+ feature_value=cur_level_split["value"],
713
+ default_left=model.default_left,
714
+ cover=next_level_weights[cur_level_node_index],
715
+ )
716
+ # cur_level_node_index += 1
717
+ cur_right_node = mb.add_split(
718
+ tree_id=cur_tree_id,
719
+ parent_id=cur_parent,
720
+ position=1,
721
+ feature_index=cur_level_split["feature_index"],
722
+ feature_value=cur_level_split["value"],
723
+ default_left=model.default_left,
724
+ cover=next_level_weights[cur_level_node_index],
725
+ )
726
+ # cur_level_node_index += 1
727
+ cur_level_nodes.append(cur_left_node)
728
+ cur_level_nodes.append(cur_right_node)
729
+ prev_level_nodes = cur_level_nodes
730
+
731
+ # Different storing format for leaves
732
+ if not model.is_classification or model.n_classes == 2:
733
+ for last_level_node_num in range(len(prev_level_nodes)):
734
+ mb.add_leaf(
735
+ tree_id=cur_tree_id,
736
+ response=cur_tree_leaf_val[2 * last_level_node_num]
737
+ * model.scale
738
+ + model.bias,
739
+ parent_id=prev_level_nodes[last_level_node_num],
740
+ position=0,
741
+ cover=cur_tree_leaf_weights[2 * last_level_node_num],
742
+ )
743
+ mb.add_leaf(
744
+ tree_id=cur_tree_id,
745
+ response=cur_tree_leaf_val[2 * last_level_node_num + 1]
746
+ * model.scale
747
+ + model.bias,
748
+ parent_id=prev_level_nodes[last_level_node_num],
749
+ position=1,
750
+ cover=cur_tree_leaf_weights[2 * last_level_node_num + 1],
751
+ )
752
+ else:
753
+ shap_ready = False
754
+ for last_level_node_num in range(len(prev_level_nodes)):
755
+ left_index = (
756
+ 2 * last_level_node_num * n_tree_each_iter + class_label
757
+ )
758
+ right_index = (
759
+ 2 * last_level_node_num + 1
760
+ ) * n_tree_each_iter + class_label
761
+ mb.add_leaf(
762
+ tree_id=cur_tree_id,
763
+ response=cur_tree_leaf_val[left_index] * model.scale
764
+ + model.bias,
765
+ parent_id=prev_level_nodes[last_level_node_num],
766
+ position=0,
767
+ cover=0.0,
768
+ )
769
+ mb.add_leaf(
770
+ tree_id=cur_tree_id,
771
+ response=cur_tree_leaf_val[right_index] * model.scale
772
+ + model.bias,
773
+ parent_id=prev_level_nodes[last_level_node_num],
774
+ position=1,
775
+ cover=0.0,
776
+ )
777
+ else:
778
+ shap_ready = False
779
+ for class_label in range(n_tree_each_iter):
780
+ for i in range(model.n_iterations):
781
+ root_node = trees_explicit[i][0]
782
+
783
+ cur_tree_id = tree_id[i * n_tree_each_iter + class_label]
784
+ # Traverse tree via BFS and build tree with modelbuilder
785
+ if root_node.value is None:
786
+ root_id = mb.add_split(
787
+ tree_id=cur_tree_id,
788
+ feature_index=root_node.split["feature_index"],
789
+ feature_value=root_node.split["value"],
790
+ default_left=model.default_left,
791
+ cover=0.0,
792
+ )
793
+ nodes_queue = [(root_node, root_id)]
794
+ while nodes_queue:
795
+ cur_node, cur_node_id = nodes_queue.pop(0)
796
+ left_node = cur_node.left
797
+ # Check if node is a leaf
798
+ if left_node.value is None:
799
+ left_node_id = mb.add_split(
800
+ tree_id=cur_tree_id,
801
+ parent_id=cur_node_id,
802
+ position=0,
803
+ feature_index=left_node.split["feature_index"],
804
+ feature_value=left_node.split["value"],
805
+ default_left=model.default_left,
806
+ cover=0.0,
807
+ )
808
+ nodes_queue.append((left_node, left_node_id))
809
+ else:
810
+ mb.add_leaf(
811
+ tree_id=cur_tree_id,
812
+ response=left_node.value[class_label],
813
+ parent_id=cur_node_id,
814
+ position=0,
815
+ cover=0.0,
816
+ )
817
+ right_node = cur_node.right
818
+ # Check if node is a leaf
819
+ if right_node.value is None:
820
+ right_node_id = mb.add_split(
821
+ tree_id=cur_tree_id,
822
+ parent_id=cur_node_id,
823
+ position=1,
824
+ feature_index=right_node.split["feature_index"],
825
+ feature_value=right_node.split["value"],
826
+ default_left=model.default_left,
827
+ cover=0.0,
828
+ )
829
+ nodes_queue.append((right_node, right_node_id))
830
+ else:
831
+ mb.add_leaf(
832
+ tree_id=cur_tree_id,
833
+ response=cur_node.right.value[class_label],
834
+ parent_id=cur_node_id,
835
+ position=1,
836
+ cover=0.0,
837
+ )
838
+
839
+ else:
840
+ # Tree has only one node
841
+ mb.add_leaf(
842
+ tree_id=cur_tree_id,
843
+ response=root_node.value[class_label],
844
+ cover=0.0,
845
+ )
846
+
847
+ if not shap_ready:
848
+ warn("Converted models of this type do not support SHAP value calculation")
849
+ else:
850
+ warn(
851
+ "CatBoost SHAP values seem to be incorrect. "
852
+ "Values from converted models will differ. "
853
+ "See https://github.com/catboost/catboost/issues/2556 for more details."
854
+ )
855
+ return mb.model(base_score=0.0)