From 494b807d9d53df11e94d5e00f23dabab27358839 Mon Sep 17 00:00:00 2001 From: Zubair Shakoor Date: Thu, 30 Oct 2025 20:14:12 +0500 Subject: [PATCH 1/7] enh: Added array api support in laplacian_kernel --- sklearn/metrics/__init__.py | 2 ++ sklearn/metrics/pairwise.py | 6 +++++- sklearn/metrics/tests/test_common.py | 2 ++ 3 files changed, 9 insertions(+), 1 deletion(-) diff --git a/sklearn/metrics/__init__.py b/sklearn/metrics/__init__.py index 60101a4cc86d0..981c64b99b23e 100644 --- a/sklearn/metrics/__init__.py +++ b/sklearn/metrics/__init__.py @@ -98,6 +98,7 @@ pairwise_distances_argmin_min, pairwise_distances_chunked, pairwise_kernels, + laplacian_kernel, ) __all__ = [ @@ -170,6 +171,7 @@ "pairwise_distances_argmin_min", "pairwise_distances_chunked", "pairwise_kernels", + "laplacian_kernel", "precision_recall_curve", "precision_recall_fscore_support", "precision_score", diff --git a/sklearn/metrics/pairwise.py b/sklearn/metrics/pairwise.py index 7957540c15e70..005a353b8d778 100644 --- a/sklearn/metrics/pairwise.py +++ b/sklearn/metrics/pairwise.py @@ -1672,7 +1672,11 @@ def laplacian_kernel(X, Y=None, gamma=None): gamma = 1.0 / X.shape[1] K = -gamma * manhattan_distances(X, Y) - np.exp(K, K) # exponentiate K in-place + xp, _ = get_namespace(X, Y) + if _is_numpy_namespace(xp): + np.exp(K, K) # exponentiate K in-place + else: + K = xp.exp(K) return K diff --git a/sklearn/metrics/tests/test_common.py b/sklearn/metrics/tests/test_common.py index ca92cc09c8660..4853df560f390 100644 --- a/sklearn/metrics/tests/test_common.py +++ b/sklearn/metrics/tests/test_common.py @@ -33,6 +33,7 @@ label_ranking_average_precision_score, label_ranking_loss, log_loss, + laplacian_kernel, matthews_corrcoef, max_error, mean_absolute_error, @@ -246,6 +247,7 @@ def precision_recall_curve_padded_thresholds(*args, **kwargs): "coverage_error": coverage_error, "label_ranking_loss": label_ranking_loss, "log_loss": log_loss, + "laplacian_kernel": laplacian_kernel, "unnormalized_log_loss": partial(log_loss, normalize=False), "hinge_loss": hinge_loss, "brier_score_loss": brier_score_loss, From 2eb5536a5da3a94dc8f182db858479b5e2d0186d Mon Sep 17 00:00:00 2001 From: Zubair Shakoor Date: Thu, 30 Oct 2025 21:01:32 +0500 Subject: [PATCH 2/7] fix: tests fixed --- sklearn/metrics/tests/test_common.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/sklearn/metrics/tests/test_common.py b/sklearn/metrics/tests/test_common.py index 4853df560f390..e9058ece611b8 100644 --- a/sklearn/metrics/tests/test_common.py +++ b/sklearn/metrics/tests/test_common.py @@ -32,8 +32,8 @@ jaccard_score, label_ranking_average_precision_score, label_ranking_loss, - log_loss, laplacian_kernel, + log_loss, matthews_corrcoef, max_error, mean_absolute_error, @@ -247,7 +247,6 @@ def precision_recall_curve_padded_thresholds(*args, **kwargs): "coverage_error": coverage_error, "label_ranking_loss": label_ranking_loss, "log_loss": log_loss, - "laplacian_kernel": laplacian_kernel, "unnormalized_log_loss": partial(log_loss, normalize=False), "hinge_loss": hinge_loss, "brier_score_loss": brier_score_loss, @@ -2269,6 +2268,7 @@ def check_array_api_metric_pairwise(metric, array_namespace, device, dtype_name) check_array_api_multiclass_classification_metric, check_array_api_multilabel_classification_metric, ], + laplacian_kernel: [check_array_api_metric_pairwise], multilabel_confusion_matrix: [ check_array_api_binary_classification_metric, check_array_api_multiclass_classification_metric, From a2334f23728655678ed03297c2f5e92ec411e23f Mon Sep 17 00:00:00 2001 From: Zubair Shakoor Date: Thu, 30 Oct 2025 21:27:23 +0500 Subject: [PATCH 3/7] fix: tests fixed --- sklearn/metrics/__init__.py | 2 -- sklearn/metrics/tests/test_common.py | 2 +- 2 files changed, 1 insertion(+), 3 deletions(-) diff --git a/sklearn/metrics/__init__.py b/sklearn/metrics/__init__.py index 981c64b99b23e..60101a4cc86d0 100644 --- a/sklearn/metrics/__init__.py +++ b/sklearn/metrics/__init__.py @@ -98,7 +98,6 @@ pairwise_distances_argmin_min, pairwise_distances_chunked, pairwise_kernels, - laplacian_kernel, ) __all__ = [ @@ -171,7 +170,6 @@ "pairwise_distances_argmin_min", "pairwise_distances_chunked", "pairwise_kernels", - "laplacian_kernel", "precision_recall_curve", "precision_recall_fscore_support", "precision_score", diff --git a/sklearn/metrics/tests/test_common.py b/sklearn/metrics/tests/test_common.py index e9058ece611b8..4c71a2f605e8a 100644 --- a/sklearn/metrics/tests/test_common.py +++ b/sklearn/metrics/tests/test_common.py @@ -32,7 +32,6 @@ jaccard_score, label_ranking_average_precision_score, label_ranking_loss, - laplacian_kernel, log_loss, matthews_corrcoef, max_error, @@ -65,6 +64,7 @@ cosine_distances, cosine_similarity, euclidean_distances, + laplacian_kernel, linear_kernel, manhattan_distances, paired_cosine_distances, From 1708316155ce9f5cbc294d2ecb1955093ae37223 Mon Sep 17 00:00:00 2001 From: Zubair Shakoor Date: Thu, 30 Oct 2025 21:47:50 +0500 Subject: [PATCH 4/7] fix: updated docs --- doc/modules/array_api.rst | 1 + doc/whats_new/upcoming_changes/array-api/32613.feature.rst | 2 ++ sklearn/metrics/tests/test_pairwise.py | 1 + 3 files changed, 4 insertions(+) create mode 100644 doc/whats_new/upcoming_changes/array-api/32613.feature.rst diff --git a/doc/modules/array_api.rst b/doc/modules/array_api.rst index 5ae5f99f23b68..66b1f0319c53e 100644 --- a/doc/modules/array_api.rst +++ b/doc/modules/array_api.rst @@ -174,6 +174,7 @@ Metrics - :func:`sklearn.metrics.pairwise.cosine_distances` - :func:`sklearn.metrics.pairwise.pairwise_distances` (only supports "cosine", "euclidean", "manhattan" and "l2" metrics) - :func:`sklearn.metrics.pairwise.euclidean_distances` (see :ref:`device_support_for_float64`) +- :func:`sklearn.metrics.pairwise.laplacian_kernel` - :func:`sklearn.metrics.pairwise.linear_kernel` - :func:`sklearn.metrics.pairwise.manhattan_distances` - :func:`sklearn.metrics.pairwise.paired_cosine_distances` diff --git a/doc/whats_new/upcoming_changes/array-api/32613.feature.rst b/doc/whats_new/upcoming_changes/array-api/32613.feature.rst new file mode 100644 index 0000000000000..34c73b653f475 --- /dev/null +++ b/doc/whats_new/upcoming_changes/array-api/32613.feature.rst @@ -0,0 +1,2 @@ +- :func:`sklearn.metrics.pairwise.laplacian_kernel` now supports array API compatible inputs. + By :user:`Zubair Shakoor `. diff --git a/sklearn/metrics/tests/test_pairwise.py b/sklearn/metrics/tests/test_pairwise.py index 34647b388050f..c88a58cd9d84b 100644 --- a/sklearn/metrics/tests/test_pairwise.py +++ b/sklearn/metrics/tests/test_pairwise.py @@ -401,6 +401,7 @@ def test_pairwise_parallel(func, metric, kwds, dtype): (pairwise_distances, "manhattan", {}), (pairwise_kernels, "polynomial", {"degree": 1}), (pairwise_kernels, callable_rbf_kernel, {"gamma": 0.1}), + (pairwise_kernels, "laplacian", {"gamma": 0.1}), ], ) def test_pairwise_parallel_array_api( From 14a334c34df50b130de79165b8f64c4cb857b92c Mon Sep 17 00:00:00 2001 From: Zubair Shakoor Date: Thu, 30 Oct 2025 21:53:15 +0500 Subject: [PATCH 5/7] fix: test common updated order --- sklearn/metrics/tests/test_common.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/sklearn/metrics/tests/test_common.py b/sklearn/metrics/tests/test_common.py index 4c71a2f605e8a..07cd0ac25fe2e 100644 --- a/sklearn/metrics/tests/test_common.py +++ b/sklearn/metrics/tests/test_common.py @@ -2268,7 +2268,6 @@ def check_array_api_metric_pairwise(metric, array_namespace, device, dtype_name) check_array_api_multiclass_classification_metric, check_array_api_multilabel_classification_metric, ], - laplacian_kernel: [check_array_api_metric_pairwise], multilabel_confusion_matrix: [ check_array_api_binary_classification_metric, check_array_api_multiclass_classification_metric, @@ -2345,6 +2344,7 @@ def check_array_api_metric_pairwise(metric, array_namespace, device, dtype_name) euclidean_distances: [check_array_api_metric_pairwise], manhattan_distances: [check_array_api_metric_pairwise], linear_kernel: [check_array_api_metric_pairwise], + laplacian_kernel: [check_array_api_metric_pairwise], polynomial_kernel: [check_array_api_metric_pairwise], rbf_kernel: [check_array_api_metric_pairwise], root_mean_squared_error: [ From c7258709090efa0969e9dbe29bfdd7635d6745f8 Mon Sep 17 00:00:00 2001 From: Zubair Shakoor Date: Thu, 30 Oct 2025 22:00:04 +0500 Subject: [PATCH 6/7] fix: test params updated --- sklearn/metrics/tests/test_pairwise.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/sklearn/metrics/tests/test_pairwise.py b/sklearn/metrics/tests/test_pairwise.py index c88a58cd9d84b..0efa3647f5122 100644 --- a/sklearn/metrics/tests/test_pairwise.py +++ b/sklearn/metrics/tests/test_pairwise.py @@ -488,7 +488,7 @@ def test_pairwise_kernels(metric, csr_container): ) @pytest.mark.parametrize( "metric", - ["rbf", "sigmoid", "polynomial", "linear", "chi2", "additive_chi2"], + ["rbf", "sigmoid", "polynomial", "linear", "laplacian", "chi2", "additive_chi2"], ) def test_pairwise_kernels_array_api(metric, array_namespace, device, dtype_name): # Test array API support in pairwise_kernels. From d0a7127eeb0472b8404506ce938a7eab73744605 Mon Sep 17 00:00:00 2001 From: Zubair Shakoor Date: Fri, 31 Oct 2025 13:32:13 +0500 Subject: [PATCH 7/7] fix: updated docs --- doc/modules/array_api.rst | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/doc/modules/array_api.rst b/doc/modules/array_api.rst index 66b1f0319c53e..708e487993563 100644 --- a/doc/modules/array_api.rst +++ b/doc/modules/array_api.rst @@ -179,7 +179,7 @@ Metrics - :func:`sklearn.metrics.pairwise.manhattan_distances` - :func:`sklearn.metrics.pairwise.paired_cosine_distances` - :func:`sklearn.metrics.pairwise.paired_euclidean_distances` -- :func:`sklearn.metrics.pairwise.pairwise_kernels` (supports all `sklearn.pairwise.PAIRWISE_KERNEL_FUNCTIONS` except :func:`sklearn.metrics.pairwise.laplacian_kernel`) +- :func:`sklearn.metrics.pairwise.pairwise_kernels` - :func:`sklearn.metrics.pairwise.polynomial_kernel` - :func:`sklearn.metrics.pairwise.rbf_kernel` (see :ref:`device_support_for_float64`) - :func:`sklearn.metrics.pairwise.sigmoid_kernel`