scikit-learn-intelex 2025.4.0__py313-none-manylinux_2_28_x86_64.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.
- daal4py/__init__.py +73 -0
- daal4py/__main__.py +58 -0
- daal4py/_daal4py.cpython-313-x86_64-linux-gnu.so +0 -0
- daal4py/doc/third-party-programs.txt +424 -0
- daal4py/mb/__init__.py +19 -0
- daal4py/mb/model_builders.py +377 -0
- daal4py/mpi_transceiver.cpython-313-x86_64-linux-gnu.so +0 -0
- daal4py/sklearn/__init__.py +40 -0
- daal4py/sklearn/_n_jobs_support.py +248 -0
- daal4py/sklearn/_utils.py +245 -0
- daal4py/sklearn/cluster/__init__.py +20 -0
- daal4py/sklearn/cluster/dbscan.py +165 -0
- daal4py/sklearn/cluster/k_means.py +597 -0
- daal4py/sklearn/cluster/tests/test_dbscan.py +109 -0
- daal4py/sklearn/decomposition/__init__.py +19 -0
- daal4py/sklearn/decomposition/_pca.py +524 -0
- daal4py/sklearn/ensemble/AdaBoostClassifier.py +196 -0
- daal4py/sklearn/ensemble/GBTDAAL.py +337 -0
- daal4py/sklearn/ensemble/__init__.py +27 -0
- daal4py/sklearn/ensemble/_forest.py +1397 -0
- daal4py/sklearn/ensemble/tests/test_decision_forest.py +206 -0
- daal4py/sklearn/linear_model/__init__.py +29 -0
- daal4py/sklearn/linear_model/_coordinate_descent.py +848 -0
- daal4py/sklearn/linear_model/_linear.py +272 -0
- daal4py/sklearn/linear_model/_ridge.py +325 -0
- daal4py/sklearn/linear_model/coordinate_descent.py +17 -0
- daal4py/sklearn/linear_model/linear.py +17 -0
- daal4py/sklearn/linear_model/logistic_loss.py +195 -0
- daal4py/sklearn/linear_model/logistic_path.py +1026 -0
- daal4py/sklearn/linear_model/ridge.py +17 -0
- daal4py/sklearn/linear_model/tests/test_linear.py +208 -0
- daal4py/sklearn/linear_model/tests/test_ridge.py +69 -0
- daal4py/sklearn/manifold/__init__.py +19 -0
- daal4py/sklearn/manifold/_t_sne.py +405 -0
- daal4py/sklearn/metrics/__init__.py +20 -0
- daal4py/sklearn/metrics/_pairwise.py +236 -0
- daal4py/sklearn/metrics/_ranking.py +210 -0
- daal4py/sklearn/model_selection/__init__.py +19 -0
- daal4py/sklearn/model_selection/_split.py +309 -0
- daal4py/sklearn/model_selection/tests/test_split.py +56 -0
- daal4py/sklearn/monkeypatch/__init__.py +0 -0
- daal4py/sklearn/monkeypatch/dispatcher.py +232 -0
- daal4py/sklearn/monkeypatch/tests/_models_info.py +161 -0
- daal4py/sklearn/monkeypatch/tests/test_monkeypatch.py +71 -0
- daal4py/sklearn/monkeypatch/tests/test_patching.py +90 -0
- daal4py/sklearn/monkeypatch/tests/utils/_launch_algorithms.py +117 -0
- daal4py/sklearn/neighbors/__init__.py +21 -0
- daal4py/sklearn/neighbors/_base.py +503 -0
- daal4py/sklearn/neighbors/_classification.py +139 -0
- daal4py/sklearn/neighbors/_regression.py +74 -0
- daal4py/sklearn/neighbors/_unsupervised.py +55 -0
- daal4py/sklearn/neighbors/tests/test_kneighbors.py +113 -0
- daal4py/sklearn/svm/__init__.py +19 -0
- daal4py/sklearn/svm/svm.py +734 -0
- daal4py/sklearn/utils/__init__.py +21 -0
- daal4py/sklearn/utils/base.py +75 -0
- daal4py/sklearn/utils/tests/test_utils.py +51 -0
- daal4py/sklearn/utils/validation.py +696 -0
- onedal/__init__.py +83 -0
- onedal/_config.py +54 -0
- onedal/_device_offload.py +204 -0
- onedal/_onedal_py_dpc.cpython-313-x86_64-linux-gnu.so +0 -0
- onedal/_onedal_py_host.cpython-313-x86_64-linux-gnu.so +0 -0
- onedal/_onedal_py_spmd_dpc.cpython-313-x86_64-linux-gnu.so +0 -0
- onedal/basic_statistics/__init__.py +20 -0
- onedal/basic_statistics/basic_statistics.py +107 -0
- onedal/basic_statistics/incremental_basic_statistics.py +175 -0
- onedal/basic_statistics/tests/test_basic_statistics.py +242 -0
- onedal/basic_statistics/tests/test_incremental_basic_statistics.py +279 -0
- onedal/basic_statistics/tests/utils.py +50 -0
- onedal/cluster/__init__.py +27 -0
- onedal/cluster/dbscan.py +105 -0
- onedal/cluster/kmeans.py +557 -0
- onedal/cluster/kmeans_init.py +112 -0
- onedal/cluster/tests/test_dbscan.py +125 -0
- onedal/cluster/tests/test_kmeans.py +88 -0
- onedal/cluster/tests/test_kmeans_init.py +93 -0
- onedal/common/_base.py +38 -0
- onedal/common/_estimator_checks.py +47 -0
- onedal/common/_mixin.py +62 -0
- onedal/common/_policy.py +55 -0
- onedal/common/_spmd_policy.py +30 -0
- onedal/common/hyperparameters.py +125 -0
- onedal/common/tests/test_policy.py +76 -0
- onedal/common/tests/test_sycl.py +128 -0
- onedal/covariance/__init__.py +20 -0
- onedal/covariance/covariance.py +122 -0
- onedal/covariance/incremental_covariance.py +161 -0
- onedal/covariance/tests/test_covariance.py +50 -0
- onedal/covariance/tests/test_incremental_covariance.py +190 -0
- onedal/datatypes/__init__.py +19 -0
- onedal/datatypes/_data_conversion.py +121 -0
- onedal/datatypes/tests/common.py +126 -0
- onedal/datatypes/tests/test_data.py +475 -0
- onedal/decomposition/__init__.py +20 -0
- onedal/decomposition/incremental_pca.py +214 -0
- onedal/decomposition/pca.py +186 -0
- onedal/decomposition/tests/test_incremental_pca.py +285 -0
- onedal/ensemble/__init__.py +29 -0
- onedal/ensemble/forest.py +736 -0
- onedal/ensemble/tests/test_random_forest.py +97 -0
- onedal/linear_model/__init__.py +27 -0
- onedal/linear_model/incremental_linear_model.py +292 -0
- onedal/linear_model/linear_model.py +325 -0
- onedal/linear_model/logistic_regression.py +247 -0
- onedal/linear_model/tests/test_incremental_linear_regression.py +213 -0
- onedal/linear_model/tests/test_incremental_ridge_regression.py +171 -0
- onedal/linear_model/tests/test_linear_regression.py +259 -0
- onedal/linear_model/tests/test_logistic_regression.py +95 -0
- onedal/linear_model/tests/test_ridge.py +95 -0
- onedal/neighbors/__init__.py +19 -0
- onedal/neighbors/neighbors.py +763 -0
- onedal/neighbors/tests/test_knn_classification.py +49 -0
- onedal/primitives/__init__.py +27 -0
- onedal/primitives/get_tree.py +25 -0
- onedal/primitives/kernel_functions.py +152 -0
- onedal/primitives/tests/test_kernel_functions.py +159 -0
- onedal/spmd/__init__.py +25 -0
- onedal/spmd/_base.py +30 -0
- onedal/spmd/basic_statistics/__init__.py +20 -0
- onedal/spmd/basic_statistics/basic_statistics.py +30 -0
- onedal/spmd/basic_statistics/incremental_basic_statistics.py +71 -0
- onedal/spmd/cluster/__init__.py +28 -0
- onedal/spmd/cluster/dbscan.py +23 -0
- onedal/spmd/cluster/kmeans.py +56 -0
- onedal/spmd/covariance/__init__.py +20 -0
- onedal/spmd/covariance/covariance.py +26 -0
- onedal/spmd/covariance/incremental_covariance.py +83 -0
- onedal/spmd/decomposition/__init__.py +20 -0
- onedal/spmd/decomposition/incremental_pca.py +124 -0
- onedal/spmd/decomposition/pca.py +26 -0
- onedal/spmd/ensemble/__init__.py +19 -0
- onedal/spmd/ensemble/forest.py +28 -0
- onedal/spmd/linear_model/__init__.py +21 -0
- onedal/spmd/linear_model/incremental_linear_model.py +101 -0
- onedal/spmd/linear_model/linear_model.py +30 -0
- onedal/spmd/linear_model/logistic_regression.py +38 -0
- onedal/spmd/neighbors/__init__.py +19 -0
- onedal/spmd/neighbors/neighbors.py +75 -0
- onedal/svm/__init__.py +19 -0
- onedal/svm/svm.py +556 -0
- onedal/svm/tests/test_csr_svm.py +351 -0
- onedal/svm/tests/test_nusvc.py +204 -0
- onedal/svm/tests/test_nusvr.py +210 -0
- onedal/svm/tests/test_svc.py +176 -0
- onedal/svm/tests/test_svr.py +243 -0
- onedal/tests/test_common.py +57 -0
- onedal/tests/utils/_dataframes_support.py +162 -0
- onedal/tests/utils/_device_selection.py +102 -0
- onedal/utils/__init__.py +49 -0
- onedal/utils/_array_api.py +81 -0
- onedal/utils/_dpep_helpers.py +56 -0
- onedal/utils/tests/test_validation.py +142 -0
- onedal/utils/validation.py +464 -0
- scikit_learn_intelex-2025.4.0.dist-info/LICENSE.txt +202 -0
- scikit_learn_intelex-2025.4.0.dist-info/METADATA +190 -0
- scikit_learn_intelex-2025.4.0.dist-info/RECORD +282 -0
- scikit_learn_intelex-2025.4.0.dist-info/WHEEL +5 -0
- scikit_learn_intelex-2025.4.0.dist-info/top_level.txt +3 -0
- sklearnex/__init__.py +66 -0
- sklearnex/__main__.py +58 -0
- sklearnex/_config.py +116 -0
- sklearnex/_device_offload.py +126 -0
- sklearnex/_utils.py +177 -0
- sklearnex/basic_statistics/__init__.py +20 -0
- sklearnex/basic_statistics/basic_statistics.py +261 -0
- sklearnex/basic_statistics/incremental_basic_statistics.py +352 -0
- sklearnex/basic_statistics/tests/test_basic_statistics.py +405 -0
- sklearnex/basic_statistics/tests/test_incremental_basic_statistics.py +455 -0
- sklearnex/cluster/__init__.py +20 -0
- sklearnex/cluster/dbscan.py +197 -0
- sklearnex/cluster/k_means.py +397 -0
- sklearnex/cluster/tests/test_dbscan.py +38 -0
- sklearnex/cluster/tests/test_kmeans.py +157 -0
- sklearnex/conftest.py +82 -0
- sklearnex/covariance/__init__.py +19 -0
- sklearnex/covariance/incremental_covariance.py +405 -0
- sklearnex/covariance/tests/test_incremental_covariance.py +287 -0
- sklearnex/decomposition/__init__.py +19 -0
- sklearnex/decomposition/pca.py +427 -0
- sklearnex/decomposition/tests/test_pca.py +58 -0
- sklearnex/dispatcher.py +534 -0
- sklearnex/doc/third-party-programs.txt +424 -0
- sklearnex/ensemble/__init__.py +29 -0
- sklearnex/ensemble/_forest.py +2029 -0
- sklearnex/ensemble/tests/test_forest.py +140 -0
- sklearnex/glob/__main__.py +72 -0
- sklearnex/glob/dispatcher.py +101 -0
- sklearnex/linear_model/__init__.py +32 -0
- sklearnex/linear_model/coordinate_descent.py +30 -0
- sklearnex/linear_model/incremental_linear.py +495 -0
- sklearnex/linear_model/incremental_ridge.py +432 -0
- sklearnex/linear_model/linear.py +346 -0
- sklearnex/linear_model/logistic_regression.py +415 -0
- sklearnex/linear_model/ridge.py +390 -0
- sklearnex/linear_model/tests/test_incremental_linear.py +267 -0
- sklearnex/linear_model/tests/test_incremental_ridge.py +214 -0
- sklearnex/linear_model/tests/test_linear.py +142 -0
- sklearnex/linear_model/tests/test_logreg.py +134 -0
- sklearnex/linear_model/tests/test_ridge.py +256 -0
- sklearnex/manifold/__init__.py +19 -0
- sklearnex/manifold/t_sne.py +26 -0
- sklearnex/manifold/tests/test_tsne.py +250 -0
- sklearnex/metrics/__init__.py +23 -0
- sklearnex/metrics/pairwise.py +22 -0
- sklearnex/metrics/ranking.py +20 -0
- sklearnex/metrics/tests/test_metrics.py +39 -0
- sklearnex/model_selection/__init__.py +21 -0
- sklearnex/model_selection/split.py +22 -0
- sklearnex/model_selection/tests/test_model_selection.py +34 -0
- sklearnex/neighbors/__init__.py +27 -0
- sklearnex/neighbors/_lof.py +236 -0
- sklearnex/neighbors/common.py +310 -0
- sklearnex/neighbors/knn_classification.py +231 -0
- sklearnex/neighbors/knn_regression.py +207 -0
- sklearnex/neighbors/knn_unsupervised.py +178 -0
- sklearnex/neighbors/tests/test_neighbors.py +82 -0
- sklearnex/preview/__init__.py +17 -0
- sklearnex/preview/covariance/__init__.py +19 -0
- sklearnex/preview/covariance/covariance.py +142 -0
- sklearnex/preview/covariance/tests/test_covariance.py +66 -0
- sklearnex/preview/decomposition/__init__.py +19 -0
- sklearnex/preview/decomposition/incremental_pca.py +244 -0
- sklearnex/preview/decomposition/tests/test_incremental_pca.py +336 -0
- sklearnex/spmd/__init__.py +25 -0
- sklearnex/spmd/basic_statistics/__init__.py +20 -0
- sklearnex/spmd/basic_statistics/basic_statistics.py +21 -0
- sklearnex/spmd/basic_statistics/incremental_basic_statistics.py +30 -0
- sklearnex/spmd/basic_statistics/tests/test_basic_statistics_spmd.py +107 -0
- sklearnex/spmd/basic_statistics/tests/test_incremental_basic_statistics_spmd.py +306 -0
- sklearnex/spmd/cluster/__init__.py +30 -0
- sklearnex/spmd/cluster/dbscan.py +50 -0
- sklearnex/spmd/cluster/kmeans.py +21 -0
- sklearnex/spmd/cluster/tests/test_dbscan_spmd.py +97 -0
- sklearnex/spmd/cluster/tests/test_kmeans_spmd.py +173 -0
- sklearnex/spmd/covariance/__init__.py +20 -0
- sklearnex/spmd/covariance/covariance.py +21 -0
- sklearnex/spmd/covariance/incremental_covariance.py +37 -0
- sklearnex/spmd/covariance/tests/test_covariance_spmd.py +107 -0
- sklearnex/spmd/covariance/tests/test_incremental_covariance_spmd.py +184 -0
- sklearnex/spmd/decomposition/__init__.py +20 -0
- sklearnex/spmd/decomposition/incremental_pca.py +30 -0
- sklearnex/spmd/decomposition/pca.py +21 -0
- sklearnex/spmd/decomposition/tests/test_incremental_pca_spmd.py +269 -0
- sklearnex/spmd/decomposition/tests/test_pca_spmd.py +128 -0
- sklearnex/spmd/ensemble/__init__.py +19 -0
- sklearnex/spmd/ensemble/forest.py +71 -0
- sklearnex/spmd/ensemble/tests/test_forest_spmd.py +265 -0
- sklearnex/spmd/linear_model/__init__.py +21 -0
- sklearnex/spmd/linear_model/incremental_linear_model.py +35 -0
- sklearnex/spmd/linear_model/linear_model.py +21 -0
- sklearnex/spmd/linear_model/logistic_regression.py +21 -0
- sklearnex/spmd/linear_model/tests/test_incremental_linear_spmd.py +331 -0
- sklearnex/spmd/linear_model/tests/test_linear_regression_spmd.py +145 -0
- sklearnex/spmd/linear_model/tests/test_logistic_regression_spmd.py +162 -0
- sklearnex/spmd/neighbors/__init__.py +19 -0
- sklearnex/spmd/neighbors/neighbors.py +25 -0
- sklearnex/spmd/neighbors/tests/test_neighbors_spmd.py +288 -0
- sklearnex/svm/__init__.py +29 -0
- sklearnex/svm/_common.py +339 -0
- sklearnex/svm/nusvc.py +371 -0
- sklearnex/svm/nusvr.py +170 -0
- sklearnex/svm/svc.py +399 -0
- sklearnex/svm/svr.py +167 -0
- sklearnex/svm/tests/test_svm.py +93 -0
- sklearnex/tests/test_common.py +491 -0
- sklearnex/tests/test_config.py +123 -0
- sklearnex/tests/test_hyperparameters.py +43 -0
- sklearnex/tests/test_memory_usage.py +347 -0
- sklearnex/tests/test_monkeypatch.py +269 -0
- sklearnex/tests/test_n_jobs_support.py +108 -0
- sklearnex/tests/test_parallel.py +48 -0
- sklearnex/tests/test_patching.py +377 -0
- sklearnex/tests/test_run_to_run_stability.py +326 -0
- sklearnex/tests/utils/__init__.py +48 -0
- sklearnex/tests/utils/base.py +436 -0
- sklearnex/tests/utils/spmd.py +198 -0
- sklearnex/utils/__init__.py +19 -0
- sklearnex/utils/_array_api.py +82 -0
- sklearnex/utils/parallel.py +59 -0
- sklearnex/utils/tests/test_validation.py +238 -0
- sklearnex/utils/validation.py +208 -0
|
@@ -0,0 +1,190 @@
|
|
|
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 numpy as np
|
|
18
|
+
import pytest
|
|
19
|
+
from numpy.testing import assert_allclose
|
|
20
|
+
|
|
21
|
+
from onedal.datatypes import from_table
|
|
22
|
+
from onedal.tests.utils._device_selection import get_queues
|
|
23
|
+
|
|
24
|
+
|
|
25
|
+
@pytest.mark.parametrize("queue", get_queues())
|
|
26
|
+
@pytest.mark.parametrize("dtype", [np.float32, np.float64])
|
|
27
|
+
def test_on_gold_data_unbiased(queue, dtype):
|
|
28
|
+
from onedal.covariance import IncrementalEmpiricalCovariance
|
|
29
|
+
|
|
30
|
+
X = np.array([[0, 1], [0, 1]])
|
|
31
|
+
X = X.astype(dtype)
|
|
32
|
+
X_split = np.array_split(X, 2)
|
|
33
|
+
inccov = IncrementalEmpiricalCovariance()
|
|
34
|
+
|
|
35
|
+
for i in range(2):
|
|
36
|
+
inccov.partial_fit(X_split[i], queue=queue)
|
|
37
|
+
result = inccov.finalize_fit()
|
|
38
|
+
|
|
39
|
+
expected_covariance = np.array([[0, 0], [0, 0]])
|
|
40
|
+
expected_means = np.array([0, 1])
|
|
41
|
+
|
|
42
|
+
assert_allclose(expected_covariance, result.covariance_)
|
|
43
|
+
assert_allclose(expected_means, result.location_)
|
|
44
|
+
|
|
45
|
+
X = np.array([[1, 2], [3, 6]])
|
|
46
|
+
X = X.astype(dtype)
|
|
47
|
+
X_split = np.array_split(X, 2)
|
|
48
|
+
inccov = IncrementalEmpiricalCovariance()
|
|
49
|
+
|
|
50
|
+
for i in range(2):
|
|
51
|
+
inccov.partial_fit(X_split[i], queue=queue)
|
|
52
|
+
result = inccov.finalize_fit()
|
|
53
|
+
|
|
54
|
+
expected_covariance = np.array([[2, 4], [4, 8]])
|
|
55
|
+
expected_means = np.array([2, 4])
|
|
56
|
+
|
|
57
|
+
assert_allclose(expected_covariance, result.covariance_)
|
|
58
|
+
assert_allclose(expected_means, result.location_)
|
|
59
|
+
|
|
60
|
+
|
|
61
|
+
@pytest.mark.parametrize("queue", get_queues())
|
|
62
|
+
@pytest.mark.parametrize("dtype", [np.float32, np.float64])
|
|
63
|
+
def test_on_gold_data_biased(queue, dtype):
|
|
64
|
+
from onedal.covariance import IncrementalEmpiricalCovariance
|
|
65
|
+
|
|
66
|
+
X = np.array([[0, 1], [0, 1]])
|
|
67
|
+
X = X.astype(dtype)
|
|
68
|
+
X_split = np.array_split(X, 2)
|
|
69
|
+
inccov = IncrementalEmpiricalCovariance(bias=True)
|
|
70
|
+
|
|
71
|
+
for i in range(2):
|
|
72
|
+
inccov.partial_fit(X_split[i], queue=queue)
|
|
73
|
+
result = inccov.finalize_fit()
|
|
74
|
+
|
|
75
|
+
expected_covariance = np.array([[0, 0], [0, 0]])
|
|
76
|
+
expected_means = np.array([0, 1])
|
|
77
|
+
|
|
78
|
+
assert_allclose(expected_covariance, result.covariance_)
|
|
79
|
+
assert_allclose(expected_means, result.location_)
|
|
80
|
+
|
|
81
|
+
X = np.array([[1, 2], [3, 6]])
|
|
82
|
+
X = X.astype(dtype)
|
|
83
|
+
X_split = np.array_split(X, 2)
|
|
84
|
+
inccov = IncrementalEmpiricalCovariance(bias=True)
|
|
85
|
+
|
|
86
|
+
for i in range(2):
|
|
87
|
+
inccov.partial_fit(X_split[i], queue=queue)
|
|
88
|
+
result = inccov.finalize_fit()
|
|
89
|
+
|
|
90
|
+
expected_covariance = np.array([[1, 2], [2, 4]])
|
|
91
|
+
expected_means = np.array([2, 4])
|
|
92
|
+
|
|
93
|
+
assert_allclose(expected_covariance, result.covariance_)
|
|
94
|
+
assert_allclose(expected_means, result.location_)
|
|
95
|
+
|
|
96
|
+
|
|
97
|
+
@pytest.mark.parametrize("queue", get_queues())
|
|
98
|
+
@pytest.mark.parametrize("num_batches", [2, 4, 6, 8, 10])
|
|
99
|
+
@pytest.mark.parametrize("row_count", [100, 1000, 2000])
|
|
100
|
+
@pytest.mark.parametrize("column_count", [10, 100, 200])
|
|
101
|
+
@pytest.mark.parametrize("bias", [True, False])
|
|
102
|
+
@pytest.mark.parametrize("dtype", [np.float32, np.float64])
|
|
103
|
+
def test_partial_fit_on_random_data(
|
|
104
|
+
queue, num_batches, row_count, column_count, bias, dtype
|
|
105
|
+
):
|
|
106
|
+
from onedal.covariance import IncrementalEmpiricalCovariance
|
|
107
|
+
|
|
108
|
+
seed = 77
|
|
109
|
+
gen = np.random.default_rng(seed)
|
|
110
|
+
X = gen.uniform(low=-0.3, high=+0.7, size=(row_count, column_count))
|
|
111
|
+
X = X.astype(dtype)
|
|
112
|
+
X_split = np.array_split(X, num_batches)
|
|
113
|
+
inccov = IncrementalEmpiricalCovariance(bias=bias)
|
|
114
|
+
|
|
115
|
+
for i in range(num_batches):
|
|
116
|
+
inccov.partial_fit(X_split[i], queue=queue)
|
|
117
|
+
result = inccov.finalize_fit()
|
|
118
|
+
|
|
119
|
+
expected_covariance = np.cov(X.T, bias=bias)
|
|
120
|
+
expected_means = np.mean(X, axis=0)
|
|
121
|
+
|
|
122
|
+
assert_allclose(expected_covariance, result.covariance_, atol=1e-6)
|
|
123
|
+
assert_allclose(expected_means, result.location_, atol=1e-6)
|
|
124
|
+
|
|
125
|
+
|
|
126
|
+
@pytest.mark.parametrize("queue", get_queues())
|
|
127
|
+
@pytest.mark.parametrize("dtype", [np.float32, np.float64])
|
|
128
|
+
def test_incremental_estimator_pickle(queue, dtype):
|
|
129
|
+
import pickle
|
|
130
|
+
|
|
131
|
+
from onedal.covariance import IncrementalEmpiricalCovariance
|
|
132
|
+
|
|
133
|
+
inccov = IncrementalEmpiricalCovariance()
|
|
134
|
+
|
|
135
|
+
# Check that estimator can be serialized without any data.
|
|
136
|
+
dump = pickle.dumps(inccov)
|
|
137
|
+
inccov_loaded = pickle.loads(dump)
|
|
138
|
+
seed = 77
|
|
139
|
+
gen = np.random.default_rng(seed)
|
|
140
|
+
X = gen.uniform(low=-0.3, high=+0.7, size=(10, 10))
|
|
141
|
+
X = X.astype(dtype)
|
|
142
|
+
X_split = np.array_split(X, 2)
|
|
143
|
+
inccov.partial_fit(X_split[0], queue=queue)
|
|
144
|
+
inccov_loaded.partial_fit(X_split[0], queue=queue)
|
|
145
|
+
|
|
146
|
+
assert inccov._need_to_finalize == True
|
|
147
|
+
assert inccov_loaded._need_to_finalize == True
|
|
148
|
+
|
|
149
|
+
# Check that estimator can be serialized after partial_fit call.
|
|
150
|
+
dump = pickle.dumps(inccov)
|
|
151
|
+
inccov_loaded = pickle.loads(dump)
|
|
152
|
+
|
|
153
|
+
assert inccov._need_to_finalize == False
|
|
154
|
+
# Finalize is called during serialization to make sure partial results are finalized correctly.
|
|
155
|
+
assert inccov_loaded._need_to_finalize == False
|
|
156
|
+
|
|
157
|
+
partial_n_rows = from_table(inccov._partial_result.partial_n_rows)
|
|
158
|
+
partial_n_rows_loaded = from_table(inccov_loaded._partial_result.partial_n_rows)
|
|
159
|
+
assert_allclose(partial_n_rows, partial_n_rows_loaded)
|
|
160
|
+
|
|
161
|
+
partial_crossproduct = from_table(inccov._partial_result.partial_crossproduct)
|
|
162
|
+
partial_crossproduct_loaded = from_table(
|
|
163
|
+
inccov_loaded._partial_result.partial_crossproduct
|
|
164
|
+
)
|
|
165
|
+
assert_allclose(partial_crossproduct, partial_crossproduct_loaded)
|
|
166
|
+
|
|
167
|
+
partial_sums = from_table(inccov._partial_result.partial_sums)
|
|
168
|
+
partial_sums_loaded = from_table(inccov_loaded._partial_result.partial_sums)
|
|
169
|
+
assert_allclose(partial_sums, partial_sums_loaded)
|
|
170
|
+
|
|
171
|
+
inccov.partial_fit(X_split[1], queue=queue)
|
|
172
|
+
inccov_loaded.partial_fit(X_split[1], queue=queue)
|
|
173
|
+
assert inccov._need_to_finalize == True
|
|
174
|
+
assert inccov_loaded._need_to_finalize == True
|
|
175
|
+
|
|
176
|
+
dump = pickle.dumps(inccov_loaded)
|
|
177
|
+
inccov_loaded = pickle.loads(dump)
|
|
178
|
+
|
|
179
|
+
assert inccov._need_to_finalize == True
|
|
180
|
+
assert inccov_loaded._need_to_finalize == False
|
|
181
|
+
|
|
182
|
+
inccov.finalize_fit()
|
|
183
|
+
inccov_loaded.finalize_fit()
|
|
184
|
+
|
|
185
|
+
# Check that finalized estimator can be serialized.
|
|
186
|
+
dump = pickle.dumps(inccov_loaded)
|
|
187
|
+
inccov_loaded = pickle.loads(dump)
|
|
188
|
+
|
|
189
|
+
assert_allclose(inccov.location_, inccov_loaded.location_, atol=1e-6)
|
|
190
|
+
assert_allclose(inccov.covariance_, inccov_loaded.covariance_, atol=1e-6)
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
# ==============================================================================
|
|
2
|
+
# Copyright 2021 Intel Corporation
|
|
3
|
+
#
|
|
4
|
+
# Licensed under the Apache License, Version 2.0 (the "License");
|
|
5
|
+
# you may not use this file except in compliance with the License.
|
|
6
|
+
# You may obtain a copy of the License at
|
|
7
|
+
#
|
|
8
|
+
# http://www.apache.org/licenses/LICENSE-2.0
|
|
9
|
+
#
|
|
10
|
+
# Unless required by applicable law or agreed to in writing, software
|
|
11
|
+
# distributed under the License is distributed on an "AS IS" BASIS,
|
|
12
|
+
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
13
|
+
# See the License for the specific language governing permissions and
|
|
14
|
+
# limitations under the License.
|
|
15
|
+
# ==============================================================================
|
|
16
|
+
|
|
17
|
+
from ._data_conversion import from_table, to_table
|
|
18
|
+
|
|
19
|
+
__all__ = ["from_table", "to_table"]
|
|
@@ -0,0 +1,121 @@
|
|
|
1
|
+
# ==============================================================================
|
|
2
|
+
# Copyright 2021 Intel Corporation
|
|
3
|
+
#
|
|
4
|
+
# Licensed under the Apache License, Version 2.0 (the "License");
|
|
5
|
+
# you may not use this file except in compliance with the License.
|
|
6
|
+
# You may obtain a copy of the License at
|
|
7
|
+
#
|
|
8
|
+
# http://www.apache.org/licenses/LICENSE-2.0
|
|
9
|
+
#
|
|
10
|
+
# Unless required by applicable law or agreed to in writing, software
|
|
11
|
+
# distributed under the License is distributed on an "AS IS" BASIS,
|
|
12
|
+
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
13
|
+
# See the License for the specific language governing permissions and
|
|
14
|
+
# limitations under the License.
|
|
15
|
+
# ==============================================================================
|
|
16
|
+
|
|
17
|
+
import warnings
|
|
18
|
+
|
|
19
|
+
import numpy as np
|
|
20
|
+
|
|
21
|
+
from onedal import _backend, _is_dpc_backend
|
|
22
|
+
|
|
23
|
+
|
|
24
|
+
def _apply_and_pass(func, *args, **kwargs):
|
|
25
|
+
if len(args) == 1:
|
|
26
|
+
return func(args[0], **kwargs)
|
|
27
|
+
return tuple(map(lambda arg: func(arg, **kwargs), args))
|
|
28
|
+
|
|
29
|
+
|
|
30
|
+
def _convert_one_to_table(arg, queue=None):
|
|
31
|
+
# All inputs for table conversion must be array-like or sparse, not scalars
|
|
32
|
+
return _backend.to_table(np.atleast_2d(arg) if np.isscalar(arg) else arg, queue)
|
|
33
|
+
|
|
34
|
+
|
|
35
|
+
def to_table(*args, queue=None):
|
|
36
|
+
"""Create oneDAL tables from scalars and/or arrays.
|
|
37
|
+
|
|
38
|
+
Note: this implementation can be used with scipy.sparse, numpy ndarrays,
|
|
39
|
+
DPCTL/DPNP usm_ndarrays and scalars. Tables will use pointers to the
|
|
40
|
+
original array data. Scalars and non-contiguous arrays will be copies.
|
|
41
|
+
Arrays may be modified in-place by oneDAL during computation. This works
|
|
42
|
+
for data located on CPU and SYCL-enabled Intel GPUs. Each array may only
|
|
43
|
+
be of a single datatype (i.e. each must be homogeneous).
|
|
44
|
+
|
|
45
|
+
Parameters
|
|
46
|
+
----------
|
|
47
|
+
*args : {scalar, numpy array, sycl_usm_ndarray, csr_matrix, or csr_array}
|
|
48
|
+
arg1, arg2... The arrays should be given as arguments.
|
|
49
|
+
|
|
50
|
+
Returns
|
|
51
|
+
-------
|
|
52
|
+
tables: {oneDAL homogeneous tables}
|
|
53
|
+
"""
|
|
54
|
+
return _apply_and_pass(_convert_one_to_table, *args, queue=queue)
|
|
55
|
+
|
|
56
|
+
|
|
57
|
+
if _is_dpc_backend:
|
|
58
|
+
|
|
59
|
+
try:
|
|
60
|
+
# try/catch is used here instead of dpep_helpers because
|
|
61
|
+
# of circular import issues of _data_conversion.py and
|
|
62
|
+
# utils/validation.py. This is a temporary fix until the
|
|
63
|
+
# issue with dpnp is addressed, at which point this can
|
|
64
|
+
# be removed entirely.
|
|
65
|
+
import dpnp
|
|
66
|
+
|
|
67
|
+
def _table_to_array(table, xp=None):
|
|
68
|
+
# By default DPNP ndarray created with a copy.
|
|
69
|
+
# TODO:
|
|
70
|
+
# investigate why dpnp.array(table, copy=False) doesn't work.
|
|
71
|
+
# Work around with using dpctl.tensor.asarray.
|
|
72
|
+
if xp == dpnp:
|
|
73
|
+
return dpnp.array(dpnp.dpctl.tensor.asarray(table), copy=False)
|
|
74
|
+
else:
|
|
75
|
+
return xp.asarray(table)
|
|
76
|
+
|
|
77
|
+
except ImportError:
|
|
78
|
+
|
|
79
|
+
def _table_to_array(table, xp=None):
|
|
80
|
+
return xp.asarray(table)
|
|
81
|
+
|
|
82
|
+
from ..common._policy import _HostInteropPolicy
|
|
83
|
+
|
|
84
|
+
def convert_one_from_table(table, sycl_queue=None, sua_iface=None, xp=None):
|
|
85
|
+
# Currently only `__sycl_usm_array_interface__` protocol used to
|
|
86
|
+
# convert into dpnp/dpctl tensors.
|
|
87
|
+
if sua_iface:
|
|
88
|
+
if (
|
|
89
|
+
sycl_queue
|
|
90
|
+
and sycl_queue.sycl_device.is_cpu
|
|
91
|
+
and table.__sycl_usm_array_interface__["syclobj"] is None
|
|
92
|
+
):
|
|
93
|
+
# oneDAL returns tables with None sycl queue for CPU sycl queue inputs.
|
|
94
|
+
# This workaround is necessary for the functional preservation
|
|
95
|
+
# of the compute-follows-data execution.
|
|
96
|
+
# Host tables first converted into numpy.narrays and then to array from xp
|
|
97
|
+
# namespace.
|
|
98
|
+
return xp.asarray(
|
|
99
|
+
_backend.from_table(table), usm_type="device", sycl_queue=sycl_queue
|
|
100
|
+
)
|
|
101
|
+
else:
|
|
102
|
+
return _table_to_array(table, xp=xp)
|
|
103
|
+
|
|
104
|
+
return _backend.from_table(table)
|
|
105
|
+
|
|
106
|
+
else:
|
|
107
|
+
|
|
108
|
+
def convert_one_from_table(table, sycl_queue=None, sua_iface=None, xp=None):
|
|
109
|
+
# Currently only `__sycl_usm_array_interface__` protocol used to
|
|
110
|
+
# convert into dpnp/dpctl tensors.
|
|
111
|
+
if sua_iface:
|
|
112
|
+
raise RuntimeError(
|
|
113
|
+
"SYCL usm array conversion from table requires the DPC backend"
|
|
114
|
+
)
|
|
115
|
+
return _backend.from_table(table)
|
|
116
|
+
|
|
117
|
+
|
|
118
|
+
def from_table(*args, sycl_queue=None, sua_iface=None, xp=None):
|
|
119
|
+
return _apply_and_pass(
|
|
120
|
+
convert_one_from_table, *args, sycl_queue=sycl_queue, sua_iface=sua_iface, xp=xp
|
|
121
|
+
)
|
|
@@ -0,0 +1,126 @@
|
|
|
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
|
+
from onedal.utils._dpep_helpers import dpctl_available, dpnp_available
|
|
18
|
+
|
|
19
|
+
if dpnp_available:
|
|
20
|
+
import dpnp
|
|
21
|
+
|
|
22
|
+
if dpctl_available:
|
|
23
|
+
import dpctl
|
|
24
|
+
from dpctl.tensor import usm_ndarray
|
|
25
|
+
|
|
26
|
+
def _get_sycl_queue(syclobj):
|
|
27
|
+
if hasattr(syclobj, "_get_capsule"):
|
|
28
|
+
return dpctl.SyclQueue(syclobj._get_capsule())
|
|
29
|
+
else:
|
|
30
|
+
return dpctl.SyclQueue(syclobj)
|
|
31
|
+
|
|
32
|
+
def _assert_tensor_attr(actual, desired, order):
|
|
33
|
+
"""Check attributes of two given USM tensors."""
|
|
34
|
+
is_usm_tensor = (
|
|
35
|
+
lambda x: dpnp_available
|
|
36
|
+
and isinstance(x, dpnp.ndarray)
|
|
37
|
+
or isinstance(x, usm_ndarray)
|
|
38
|
+
)
|
|
39
|
+
assert is_usm_tensor(actual)
|
|
40
|
+
assert is_usm_tensor(desired)
|
|
41
|
+
# dpctl.tensor is the dpnp.ndarrays's core tensor structure along
|
|
42
|
+
# with advanced device management. Convert dpnp to dpctl.tensor with zero copy.
|
|
43
|
+
get_tensor = lambda x: (
|
|
44
|
+
x.get_array() if dpnp_available and isinstance(x, dpnp.ndarray) else x
|
|
45
|
+
)
|
|
46
|
+
# Now DPCtl tensors
|
|
47
|
+
actual = get_tensor(actual)
|
|
48
|
+
desired = get_tensor(desired)
|
|
49
|
+
|
|
50
|
+
assert actual.shape == desired.shape
|
|
51
|
+
assert actual.strides == desired.strides
|
|
52
|
+
assert actual.dtype == desired.dtype
|
|
53
|
+
if order == "F":
|
|
54
|
+
assert actual.flags.f_contiguous
|
|
55
|
+
assert desired.flags.f_contiguous
|
|
56
|
+
assert actual.flags.f_contiguous == desired.flags.f_contiguous
|
|
57
|
+
else:
|
|
58
|
+
assert actual.flags.c_contiguous
|
|
59
|
+
assert desired.flags.c_contiguous
|
|
60
|
+
assert actual.flags.c_contiguous == desired.flags.c_contiguous
|
|
61
|
+
assert actual.flags == desired.flags
|
|
62
|
+
assert actual.sycl_queue == desired.sycl_queue
|
|
63
|
+
# TODO:
|
|
64
|
+
# check better way to check usm ptrs.
|
|
65
|
+
assert actual.usm_data._pointer == desired.usm_data._pointer
|
|
66
|
+
|
|
67
|
+
def _assert_sua_iface_fields(
|
|
68
|
+
actual, desired, skip_syclobj=False, skip_data_0=False, skip_data_1=False
|
|
69
|
+
):
|
|
70
|
+
"""Check attributes of two given reprsesentations of
|
|
71
|
+
USM allocations `__sycl_usm_array_interface__`.
|
|
72
|
+
|
|
73
|
+
For full documentation about `__sycl_usm_array_interface__` refer
|
|
74
|
+
https://intelpython.github.io/dpctl/latest/api_reference/dpctl/sycl_usm_array_interface.html.
|
|
75
|
+
|
|
76
|
+
Parameters
|
|
77
|
+
----------
|
|
78
|
+
actual : dict, __sycl_usm_array_interface__
|
|
79
|
+
desired : dict, __sycl_usm_array_interface__
|
|
80
|
+
skip_syclobj : bool, default=False
|
|
81
|
+
If True, check for __sycl_usm_array_interface__["syclobj"]
|
|
82
|
+
will be skipped.
|
|
83
|
+
skip_data_0 : bool, default=False
|
|
84
|
+
If True, check for __sycl_usm_array_interface__["data"][0]
|
|
85
|
+
will be skipped.
|
|
86
|
+
skip_data_1 : bool, default=False
|
|
87
|
+
If True, check for __sycl_usm_array_interface__["data"][1]
|
|
88
|
+
will be skipped.
|
|
89
|
+
"""
|
|
90
|
+
assert hasattr(actual, "__sycl_usm_array_interface__")
|
|
91
|
+
assert hasattr(desired, "__sycl_usm_array_interface__")
|
|
92
|
+
actual_sua_iface = actual.__sycl_usm_array_interface__
|
|
93
|
+
desired_sua_iface = desired.__sycl_usm_array_interface__
|
|
94
|
+
# data: A 2-tuple whose first element is a Python integer encoding
|
|
95
|
+
# USM pointer value. The second entry in the tuple is a read-only flag
|
|
96
|
+
# (True means the data area is read-only).
|
|
97
|
+
if not skip_data_0:
|
|
98
|
+
assert actual_sua_iface["data"][0] == desired_sua_iface["data"][0]
|
|
99
|
+
if not skip_data_1:
|
|
100
|
+
assert actual_sua_iface["data"][1] == desired_sua_iface["data"][1]
|
|
101
|
+
# shape: a tuple of integers describing dimensions of an N-dimensional array.
|
|
102
|
+
# Reformating shapes for check cases (r,) vs (r,1). Contiguous flattened array
|
|
103
|
+
# shape (r,) becoming (r,1) just for the check, since oneDAL supports only (r,1)
|
|
104
|
+
# for 1-D arrays. In code after from_table conversion for 1-D expected outputs
|
|
105
|
+
# xp.ravel or reshape(-1) is used.
|
|
106
|
+
get_shape_if_1d = lambda shape: (shape[0], 1) if len(shape) == 1 else shape
|
|
107
|
+
actual_shape = get_shape_if_1d(actual_sua_iface["shape"])
|
|
108
|
+
desired_shape = get_shape_if_1d(desired_sua_iface["shape"])
|
|
109
|
+
assert actual_shape == desired_shape
|
|
110
|
+
# strides: An optional tuple of integers describing number of array elements
|
|
111
|
+
# needed to jump to the next array element in the corresponding dimensions.
|
|
112
|
+
if not actual_sua_iface["strides"] and not desired_sua_iface["strides"]:
|
|
113
|
+
# None to indicate a C-style contiguous 1D array.
|
|
114
|
+
# onedal4py constructs __sycl_usm_array_interface__["strides"] with
|
|
115
|
+
# real values.
|
|
116
|
+
assert actual_sua_iface["strides"] == desired_sua_iface["strides"]
|
|
117
|
+
# versions: Version of the interface.
|
|
118
|
+
assert actual_sua_iface["version"] == desired_sua_iface["version"]
|
|
119
|
+
# typestr: a string encoding elemental data type of the array.
|
|
120
|
+
assert actual_sua_iface["typestr"] == desired_sua_iface["typestr"]
|
|
121
|
+
# syclobj: Python object from which SYCL context to which represented USM
|
|
122
|
+
# allocation is bound.
|
|
123
|
+
if not skip_syclobj and dpctl_available:
|
|
124
|
+
actual_sycl_queue = _get_sycl_queue(actual_sua_iface["syclobj"])
|
|
125
|
+
desired_sycl_queue = _get_sycl_queue(desired_sua_iface["syclobj"])
|
|
126
|
+
assert actual_sycl_queue == desired_sycl_queue
|