From 40b685b6268a21658a35952d21930fea0a7559ca Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Lo=C3=AFc=20Est=C3=A8ve?= Date: Tue, 1 Apr 2025 19:12:04 +0200 Subject: [PATCH 001/182] DOC Add bumping dependencies guidelines to maintainer doc (#31118) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Co-authored-by: Tim Head Co-authored-by: Jérémie du Boisberranger --- doc/developers/maintainer.rst.template | 32 ++++ maint_tools/bump-dependencies-versions.py | 171 ++++++++++++++++++++++ 2 files changed, 203 insertions(+) create mode 100644 maint_tools/bump-dependencies-versions.py diff --git a/doc/developers/maintainer.rst.template b/doc/developers/maintainer.rst.template index 3c49f6f4c01f8..b7134d4170521 100644 --- a/doc/developers/maintainer.rst.template +++ b/doc/developers/maintainer.rst.template @@ -25,6 +25,9 @@ We adopted the following release schedule: - Make sure the deprecations, FIXMEs, and TODOs tagged for the release have been taken care of. +- Make sure that the minimum supported versions of our dependencies have been bumped, see + :ref:`bumping_dependencies_guideline` for details. + - For major/minor final releases, make sure that a *Release Highlights* page has been done as a runnable example and check that its HTML rendering looks correct. It should be linked from the what's new file for the new version of scikit-learn. @@ -353,6 +356,35 @@ following script and enter the token when prompted: cd build_tools make authors # Enter the token when prompted +.. _bumping_dependencies_guideline: + +Guideline for bumping minimum versions of our dependencies +---------------------------------------------------------- + +- **minimum Python version**: at the time of a minor scikit-learn release (`X.Y.0`), + we drop the Python version with an initial release date of more than 4 years + ago. In other words, our minimum Python version is between 3 and 4 years old. +- **compiled dependencies** (numpy, scipy, as well as compiled optional + dependencies (pandas, matplotlib, pyamg, pillow, ...): we take the oldest minor + release (`X.Y.0`) that has wheels for our minimum Python version. In practice + this means that our minimum supported version is around 3 years old, maybe a + bit less. +- **pure Python dependencies** (joblib, threadpoolctl): at the time of the + scikit-learn release our minimum supported version is the most recent minor + release (`X.Y.0`) that is at least 2 years old. +- we may decide to be less conservative than this guideline in some edge cases. + These edge cases include: a security bugfix in one of our dependencies or a + critical bugfix in one of our dependencies makes it too costly to support it in + terms of maintenance. + +`maint_tools/bump-dependencies-versions.py` implements these rules and can be +used to give the new minimum dependency versions. It takes as input the +expected scikit-learn release date, for example: + +.. code:: bash + + python maint_tools/bump-dependencies-versions.py 2025-12-01 + Merging Pull Requests --------------------- diff --git a/maint_tools/bump-dependencies-versions.py b/maint_tools/bump-dependencies-versions.py new file mode 100644 index 0000000000000..1ae1f69be2720 --- /dev/null +++ b/maint_tools/bump-dependencies-versions.py @@ -0,0 +1,171 @@ +import re +import subprocess +import sys +from datetime import datetime +from pathlib import Path + +import pandas as pd +import requests +from packaging import version + +df_list = pd.read_html("https://devguide.python.org/versions/") +df = pd.concat(df_list).astype({"Branch": str}) +release_dates = {} +python_version_info = { + version: release_date + for version, release_date in zip(df["Branch"], df["First release"]) +} +python_version_info = { + version: pd.to_datetime(release_date) + for version, release_date in python_version_info.items() +} + + +def get_min_version_with_wheel(package_name, python_version): + # For compiled dependencies we want the oldest minor version that has + # wheels for 'python_version' + url = f"https://pypi.org/pypi/{package_name}/json" + response = requests.get(url) + if response.status_code != 200: + return None + + data = response.json() + releases = data["releases"] + + compatible_versions = [] + # We want only minor X.Y.0 and not bugfix X.Y.Z + minor_releases = [ + (ver, release_info) + for ver, release_info in releases.items() + if re.match(r"^\d+\.\d+\.0$", ver) + ] + for ver, release_info in minor_releases: + for file_info in release_info: + if ( + file_info["packagetype"] == "bdist_wheel" + and f'cp{python_version.replace(".", "")}' in file_info["filename"] + and not file_info["yanked"] + ): + compatible_versions.append(ver) + break + + if not compatible_versions: + return None + + return min(compatible_versions, key=version.parse) + + +def get_min_python_version(scikit_learn_release_date_str="today"): + # min Python version is the most recent Python release at least 3 years old + # at the time of the scikit-learn release + if scikit_learn_release_date_str == "today": + scikit_learn_release_date = pd.to_datetime(datetime.now().date()) + else: + scikit_learn_release_date = datetime.strptime( + scikit_learn_release_date_str, "%Y-%m-%d" + ) + version_and_releases = [ + {"python_version": python_version, "python_release_date": python_release_date} + for python_version, python_release_date in python_version_info.items() + if (scikit_learn_release_date - python_release_date).days > 365 * 3 + ] + return max(version_and_releases, key=lambda each: each["python_release_date"])[ + "python_version" + ] + + +def get_min_version_pure_python(package_name, scikit_learn_release_date_str="today"): + # for pure Python dependencies we want the most recent minor release that + # is at least 2 years old + if scikit_learn_release_date_str == "today": + scikit_learn_release_date = pd.to_datetime(datetime.now().date()) + else: + scikit_learn_release_date = datetime.strptime( + scikit_learn_release_date_str, "%Y-%m-%d" + ) + + url = f"https://pypi.org/pypi/{package_name}/json" + response = requests.get(url) + if response.status_code != 200: + return None + + data = response.json() + releases = data["releases"] + + compatible_versions = [] + # We want only minor X.Y.0 and not bugfix X.Y.Z + releases = [ + (ver, release_info) + for ver, release_info in releases.items() + if re.match(r"^\d+\.\d+\.0$", ver) + ] + for ver, release_info in releases: + for file_info in release_info: + if ( + file_info["packagetype"] == "bdist_wheel" + and not file_info["yanked"] + and ( + scikit_learn_release_date - pd.to_datetime(file_info["upload_time"]) + ).days + > 365 * 2 + ): + compatible_versions.append(ver) + break + + if not compatible_versions: + return None + + return max(compatible_versions, key=version.parse) + + +def get_current_dependencies_version(dep): + return ( + subprocess.check_output([sys.executable, "sklearn/_min_dependencies.py", dep]) + .decode() + .strip() + ) + + +def get_current_min_python_version(): + content = Path("pyproject.toml").read_text() + min_python = re.findall(r'requires-python\s*=\s*">=(\d+\.\d+)"', content)[0] + + return min_python + + +def show_versions_update(scikit_learn_release_date="today"): + future_versions = {"python": get_min_python_version(scikit_learn_release_date)} + + compiled_dependencies = ["numpy", "scipy", "pandas", "matplotlib", "pyamg"] + future_versions.update( + { + dep: get_min_version_with_wheel(dep, future_versions["python"]) + for dep in compiled_dependencies + } + ) + + pure_python_dependencies = ["joblib", "threadpoolctl"] + future_versions.update( + { + dep: get_min_version_pure_python(dep, scikit_learn_release_date) + for dep in pure_python_dependencies + } + ) + + current_versions = {"python": get_current_min_python_version()} + current_versions.update( + { + dep: get_current_dependencies_version(dep) + for dep in compiled_dependencies + pure_python_dependencies + } + ) + + print(f"For future release at date {scikit_learn_release_date}") + for k in future_versions: + if future_versions[k] != current_versions[k]: + print(f"- {k}: {current_versions[k]} -> {future_versions[k]}") + + +if __name__ == "__main__": + scikit_learn_release_date = sys.argv[1] if len(sys.argv) > 1 else "today" + show_versions_update(scikit_learn_release_date) From 9d27353bc5abd0f66fff132f2515eda6c1d2b89d Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?J=C3=A9r=C3=A9mie=20du=20Boisberranger?= Date: Tue, 1 Apr 2025 23:21:58 +0200 Subject: [PATCH 002/182] MNT Clean-up deprecations for 1.7: Ridge cv_values (#31120) --- sklearn/linear_model/_ridge.py | 72 +++--------------------- sklearn/linear_model/tests/test_ridge.py | 26 --------- 2 files changed, 7 insertions(+), 91 deletions(-) diff --git a/sklearn/linear_model/_ridge.py b/sklearn/linear_model/_ridge.py index 1581a3f99bf14..c22690b2b01c6 100644 --- a/sklearn/linear_model/_ridge.py +++ b/sklearn/linear_model/_ridge.py @@ -30,7 +30,6 @@ check_scalar, column_or_1d, compute_sample_weight, - deprecated, ) from ..utils._array_api import ( _is_numpy_namespace, @@ -39,7 +38,7 @@ get_namespace, get_namespace_and_device, ) -from ..utils._param_validation import Hidden, Interval, StrOptions, validate_params +from ..utils._param_validation import Interval, StrOptions, validate_params from ..utils.extmath import row_norms, safe_sparse_dot from ..utils.fixes import _sparse_linalg_cg from ..utils.metadata_routing import ( @@ -2304,9 +2303,8 @@ class _BaseRidgeCV(LinearModel): "scoring": [StrOptions(set(get_scorer_names())), callable, None], "cv": ["cv_object"], "gcv_mode": [StrOptions({"auto", "svd", "eigen"}), None], - "store_cv_results": ["boolean", Hidden(None)], + "store_cv_results": ["boolean"], "alpha_per_target": ["boolean"], - "store_cv_values": ["boolean", Hidden(StrOptions({"deprecated"}))], } def __init__( @@ -2317,9 +2315,8 @@ def __init__( scoring=None, cv=None, gcv_mode=None, - store_cv_results=None, + store_cv_results=False, alpha_per_target=False, - store_cv_values="deprecated", ): self.alphas = alphas self.fit_intercept = fit_intercept @@ -2328,7 +2325,6 @@ def __init__( self.gcv_mode = gcv_mode self.store_cv_results = store_cv_results self.alpha_per_target = alpha_per_target - self.store_cv_values = store_cv_values def fit(self, X, y, sample_weight=None, **params): """Fit Ridge regression model with cv. @@ -2373,28 +2369,6 @@ def fit(self, X, y, sample_weight=None, **params): cv = self.cv scorer = self._get_scorer() - # TODO(1.7): Remove in 1.7 - # Also change `store_cv_results` default back to False - if self.store_cv_values != "deprecated": - if self.store_cv_results is not None: - raise ValueError( - "Both 'store_cv_values' and 'store_cv_results' were set. " - "'store_cv_values' is deprecated in version 1.5 and will be " - "removed in 1.7. To avoid this error, only set 'store_cv_results'." - ) - warnings.warn( - ( - "'store_cv_values' is deprecated in version 1.5 and will be " - "removed in 1.7. Use 'store_cv_results' instead." - ), - FutureWarning, - ) - self._store_cv_results = self.store_cv_values - elif self.store_cv_results is None: - self._store_cv_results = False - else: - self._store_cv_results = self.store_cv_results - # `_RidgeGCV` does not work for alpha = 0 if cv is None: check_scalar_alpha = partial( @@ -2444,7 +2418,7 @@ def fit(self, X, y, sample_weight=None, **params): fit_intercept=self.fit_intercept, scoring=scorer, gcv_mode=self.gcv_mode, - store_cv_results=self._store_cv_results, + store_cv_results=self.store_cv_results, is_clf=is_classifier(self), alpha_per_target=self.alpha_per_target, ) @@ -2456,10 +2430,10 @@ def fit(self, X, y, sample_weight=None, **params): ) self.alpha_ = estimator.alpha_ self.best_score_ = estimator.best_score_ - if self._store_cv_results: + if self.store_cv_results: self.cv_results_ = estimator.cv_results_ else: - if self._store_cv_results: + if self.store_cv_results: raise ValueError("cv!=None and store_cv_results=True are incompatible") if self.alpha_per_target: raise ValueError("cv!=None and alpha_per_target=True are incompatible") @@ -2532,16 +2506,6 @@ def _get_scorer(self): scorer.set_score_request(sample_weight=True) return scorer - # TODO(1.7): Remove - # mypy error: Decorated property not supported - @deprecated( # type: ignore - "Attribute `cv_values_` is deprecated in version 1.5 and will be removed " - "in 1.7. Use `cv_results_` instead." - ) - @property - def cv_values_(self): - return self.cv_results_ - def __sklearn_tags__(self): tags = super().__sklearn_tags__() tags.input_tags.sparse = True @@ -2630,16 +2594,6 @@ class RidgeCV(MultiOutputMixin, RegressorMixin, _BaseRidgeCV): .. versionadded:: 0.24 - store_cv_values : bool - Flag indicating if the cross-validation values corresponding to - each alpha should be stored in the ``cv_values_`` attribute (see - below). This flag is only compatible with ``cv=None`` (i.e. using - Leave-One-Out Cross-Validation). - - .. deprecated:: 1.5 - `store_cv_values` is deprecated in version 1.5 in favor of - `store_cv_results` and will be removed in version 1.7. - Attributes ---------- cv_results_ : ndarray of shape (n_samples, n_alphas) or \ @@ -2807,16 +2761,6 @@ class RidgeClassifierCV(_RidgeClassifierMixin, _BaseRidgeCV): .. versionchanged:: 1.5 Parameter name changed from `store_cv_values` to `store_cv_results`. - store_cv_values : bool - Flag indicating if the cross-validation values corresponding to - each alpha should be stored in the ``cv_values_`` attribute (see - below). This flag is only compatible with ``cv=None`` (i.e. using - Leave-One-Out Cross-Validation). - - .. deprecated:: 1.5 - `store_cv_values` is deprecated in version 1.5 in favor of - `store_cv_results` and will be removed in version 1.7. - Attributes ---------- cv_results_ : ndarray of shape (n_samples, n_targets, n_alphas), optional @@ -2896,8 +2840,7 @@ def __init__( scoring=None, cv=None, class_weight=None, - store_cv_results=None, - store_cv_values="deprecated", + store_cv_results=False, ): super().__init__( alphas=alphas, @@ -2905,7 +2848,6 @@ def __init__( scoring=scoring, cv=cv, store_cv_results=store_cv_results, - store_cv_values=store_cv_values, ) self.class_weight = class_weight diff --git a/sklearn/linear_model/tests/test_ridge.py b/sklearn/linear_model/tests/test_ridge.py index 043966afdc7d9..a7e02c7afb561 100644 --- a/sklearn/linear_model/tests/test_ridge.py +++ b/sklearn/linear_model/tests/test_ridge.py @@ -2233,32 +2233,6 @@ def test_ridge_sample_weight_consistency( assert_allclose(reg1.intercept_, reg2.intercept_) -# TODO(1.7): Remove -def test_ridge_store_cv_values_deprecated(): - """Check `store_cv_values` parameter deprecated.""" - X, y = make_regression(n_samples=6, random_state=42) - ridge = RidgeCV(store_cv_values=True) - msg = "'store_cv_values' is deprecated" - with pytest.warns(FutureWarning, match=msg): - ridge.fit(X, y) - - # Error when both set - ridge = RidgeCV(store_cv_results=True, store_cv_values=True) - msg = "Both 'store_cv_values' and 'store_cv_results' were" - with pytest.raises(ValueError, match=msg): - ridge.fit(X, y) - - -def test_ridge_cv_values_deprecated(): - """Check `cv_values_` deprecated.""" - X, y = make_regression(n_samples=6, random_state=42) - ridge = RidgeCV(store_cv_results=True) - msg = "Attribute `cv_values_` is deprecated" - with pytest.warns(FutureWarning, match=msg): - ridge.fit(X, y) - ridge.cv_values_ - - @pytest.mark.parametrize("with_sample_weight", [False, True]) @pytest.mark.parametrize("fit_intercept", [False, True]) @pytest.mark.parametrize("n_targets", [1, 2]) From 9d9550947a9570f7fb2cd5f730fd961fd4ec7682 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?J=C3=A9r=C3=A9mie=20du=20Boisberranger?= Date: Wed, 2 Apr 2025 06:04:21 +0200 Subject: [PATCH 003/182] MNT Clean-up deprecations for 1.7: proba_pred in precision_recall_curve (#31121) --- sklearn/metrics/_ranking.py | 40 +++------------------------ sklearn/metrics/tests/test_ranking.py | 22 --------------- 2 files changed, 4 insertions(+), 58 deletions(-) diff --git a/sklearn/metrics/_ranking.py b/sklearn/metrics/_ranking.py index f12052867a781..99e4970b64627 100644 --- a/sklearn/metrics/_ranking.py +++ b/sklearn/metrics/_ranking.py @@ -29,7 +29,7 @@ column_or_1d, ) from ..utils._encode import _encode, _unique -from ..utils._param_validation import Hidden, Interval, StrOptions, validate_params +from ..utils._param_validation import Interval, StrOptions, validate_params from ..utils.extmath import stable_cumsum from ..utils.multiclass import type_of_target from ..utils.sparsefuncs import count_nonzero @@ -866,25 +866,20 @@ def _binary_clf_curve(y_true, y_score, pos_label=None, sample_weight=None): @validate_params( { "y_true": ["array-like"], - "y_score": ["array-like", Hidden(None)], + "y_score": ["array-like"], "pos_label": [Real, str, "boolean", None], "sample_weight": ["array-like", None], "drop_intermediate": ["boolean"], - "probas_pred": [ - "array-like", - Hidden(StrOptions({"deprecated"})), - ], }, prefer_skip_nested_validation=True, ) def precision_recall_curve( y_true, - y_score=None, + y_score, *, pos_label=None, sample_weight=None, drop_intermediate=False, - probas_pred="deprecated", ): """Compute precision-recall pairs for different probability thresholds. @@ -936,15 +931,6 @@ def precision_recall_curve( .. versionadded:: 1.3 - probas_pred : array-like of shape (n_samples,) - Target scores, can either be probability estimates of the positive - class, or non-thresholded measure of decisions (as returned by - `decision_function` on some classifiers). - - .. deprecated:: 1.5 - `probas_pred` is deprecated and will be removed in 1.7. Use - `y_score` instead. - Returns ------- precision : ndarray of shape (n_thresholds + 1,) @@ -957,7 +943,7 @@ def precision_recall_curve( thresholds : ndarray of shape (n_thresholds,) Increasing thresholds on the decision function used to compute - precision and recall where `n_thresholds = len(np.unique(probas_pred))`. + precision and recall where `n_thresholds = len(np.unique(y_score))`. See Also -------- @@ -984,24 +970,6 @@ def precision_recall_curve( >>> thresholds array([0.1 , 0.35, 0.4 , 0.8 ]) """ - # TODO(1.7): remove in 1.7 and reset y_score to be required - # Note: validate params will raise an error if probas_pred is not array-like, - # or "deprecated" - if y_score is not None and not isinstance(probas_pred, str): - raise ValueError( - "`probas_pred` and `y_score` cannot be both specified. Please use `y_score`" - " only as `probas_pred` is deprecated in v1.5 and will be removed in v1.7." - ) - if y_score is None: - warnings.warn( - ( - "probas_pred was deprecated in version 1.5 and will be removed in 1.7." - "Please use ``y_score`` instead." - ), - FutureWarning, - ) - y_score = probas_pred - fps, tps, thresholds = _binary_clf_curve( y_true, y_score, pos_label=pos_label, sample_weight=sample_weight ) diff --git a/sklearn/metrics/tests/test_ranking.py b/sklearn/metrics/tests/test_ranking.py index c92fee002595f..9f9b4301a7190 100644 --- a/sklearn/metrics/tests/test_ranking.py +++ b/sklearn/metrics/tests/test_ranking.py @@ -2248,25 +2248,3 @@ def test_roc_curve_with_probablity_estimates(global_random_seed): y_score = rng.rand(10) _, _, thresholds = roc_curve(y_true, y_score) assert np.isinf(thresholds[0]) - - -# TODO(1.7): remove -def test_precision_recall_curve_deprecation_warning(): - """Check the message for future deprecation.""" - # Check precision_recall_curve function - y_true, _, y_score = make_prediction(binary=True) - - warn_msg = "probas_pred was deprecated in version 1.5" - with pytest.warns(FutureWarning, match=warn_msg): - precision_recall_curve( - y_true, - probas_pred=y_score, - ) - - error_msg = "`probas_pred` and `y_score` cannot be both specified" - with pytest.raises(ValueError, match=error_msg): - precision_recall_curve( - y_true, - probas_pred=y_score, - y_score=y_score, - ) From c8e3187ff5012b392c94c9b66f2845d6c95cab9a Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?J=C3=A9r=C3=A9mie=20du=20Boisberranger?= Date: Wed, 2 Apr 2025 07:00:58 +0200 Subject: [PATCH 004/182] MNT Clean-up deprecations for 1.7: Xt in inverse_transform (#31106) --- sklearn/cluster/_feature_agglomeration.py | 17 +---------- .../tests/test_feature_agglomeration.py | 25 ----------------- sklearn/decomposition/_nmf.py | 18 ++---------- sklearn/decomposition/tests/test_nmf.py | 28 ------------------- sklearn/model_selection/_search.py | 11 +------- sklearn/model_selection/tests/test_search.py | 22 --------------- sklearn/pipeline.py | 14 +--------- sklearn/preprocessing/_discretization.py | 10 +------ .../tests/test_discretization.py | 24 ---------------- sklearn/tests/test_pipeline.py | 21 -------------- sklearn/utils/deprecation.py | 19 ------------- 11 files changed, 6 insertions(+), 203 deletions(-) diff --git a/sklearn/cluster/_feature_agglomeration.py b/sklearn/cluster/_feature_agglomeration.py index 1983aae00ecbb..3471329cb1472 100644 --- a/sklearn/cluster/_feature_agglomeration.py +++ b/sklearn/cluster/_feature_agglomeration.py @@ -11,8 +11,6 @@ from scipy.sparse import issparse from ..base import TransformerMixin -from ..utils import metadata_routing -from ..utils.deprecation import _deprecate_Xt_in_inverse_transform from ..utils.validation import check_is_fitted, validate_data ############################################################################### @@ -24,11 +22,6 @@ class AgglomerationTransform(TransformerMixin): A class for feature agglomeration via the transform interface. """ - # This prevents ``set_split_inverse_transform`` to be generated for the - # non-standard ``Xt`` arg on ``inverse_transform``. - # TODO(1.7): remove when Xt is removed for inverse_transform. - __metadata_request__inverse_transform = {"Xt": metadata_routing.UNUSED} - def transform(self, X): """ Transform a new matrix using the built clustering. @@ -63,7 +56,7 @@ def transform(self, X): nX = np.array(nX).T return nX - def inverse_transform(self, X=None, *, Xt=None): + def inverse_transform(self, X): """ Inverse the transformation and return a vector of size `n_features`. @@ -72,20 +65,12 @@ def inverse_transform(self, X=None, *, Xt=None): X : array-like of shape (n_samples, n_clusters) or (n_clusters,) The values to be assigned to each cluster of samples. - Xt : array-like of shape (n_samples, n_clusters) or (n_clusters,) - The values to be assigned to each cluster of samples. - - .. deprecated:: 1.5 - `Xt` was deprecated in 1.5 and will be removed in 1.7. Use `X` instead. - Returns ------- X : ndarray of shape (n_samples, n_features) or (n_features,) A vector of size `n_samples` with the values of `Xred` assigned to each of the cluster of samples. """ - X = _deprecate_Xt_in_inverse_transform(X, Xt) - check_is_fitted(self) unil, inverse = np.unique(self.labels_, return_inverse=True) diff --git a/sklearn/cluster/tests/test_feature_agglomeration.py b/sklearn/cluster/tests/test_feature_agglomeration.py index ef8596c0813f8..80aa251c35815 100644 --- a/sklearn/cluster/tests/test_feature_agglomeration.py +++ b/sklearn/cluster/tests/test_feature_agglomeration.py @@ -2,10 +2,7 @@ Tests for sklearn.cluster._feature_agglomeration """ -import warnings - import numpy as np -import pytest from numpy.testing import assert_array_equal from sklearn.cluster import FeatureAgglomeration @@ -56,25 +53,3 @@ def test_feature_agglomeration_feature_names_out(): assert_array_equal( [f"featureagglomeration{i}" for i in range(n_clusters)], names_out ) - - -# TODO(1.7): remove this test -def test_inverse_transform_Xt_deprecation(): - X = np.array([0, 0, 1]).reshape(1, 3) # (n_samples, n_features) - - est = FeatureAgglomeration(n_clusters=1, pooling_func=np.mean) - est.fit(X) - X = est.transform(X) - - with pytest.raises(TypeError, match="Missing required positional argument"): - est.inverse_transform() - - with pytest.raises(TypeError, match="Cannot use both X and Xt. Use X only."): - est.inverse_transform(X=X, Xt=X) - - with warnings.catch_warnings(record=True): - warnings.simplefilter("error") - est.inverse_transform(X) - - with pytest.warns(FutureWarning, match="Xt was renamed X in version 1.5"): - est.inverse_transform(Xt=X) diff --git a/sklearn/decomposition/_nmf.py b/sklearn/decomposition/_nmf.py index dc21e389f6849..78c394ad7f90b 100644 --- a/sklearn/decomposition/_nmf.py +++ b/sklearn/decomposition/_nmf.py @@ -22,13 +22,12 @@ _fit_context, ) from ..exceptions import ConvergenceWarning -from ..utils import check_array, check_random_state, gen_batches, metadata_routing +from ..utils import check_array, check_random_state, gen_batches from ..utils._param_validation import ( Interval, StrOptions, validate_params, ) -from ..utils.deprecation import _deprecate_Xt_in_inverse_transform from ..utils.extmath import randomized_svd, safe_sparse_dot, squared_norm from ..utils.validation import ( check_is_fitted, @@ -1135,11 +1134,6 @@ def non_negative_factorization( class _BaseNMF(ClassNamePrefixFeaturesOutMixin, TransformerMixin, BaseEstimator, ABC): """Base class for NMF and MiniBatchNMF.""" - # This prevents ``set_split_inverse_transform`` to be generated for the - # non-standard ``Xt`` arg on ``inverse_transform``. - # TODO(1.7): remove when Xt is removed in v1.7 for inverse_transform - __metadata_request__inverse_transform = {"Xt": metadata_routing.UNUSED} - _parameter_constraints: dict = { "n_components": [ Interval(Integral, 1, None, closed="left"), @@ -1296,7 +1290,7 @@ def fit(self, X, y=None, **params): self.fit_transform(X, **params) return self - def inverse_transform(self, X=None, *, Xt=None): + def inverse_transform(self, X): """Transform data back to its original space. .. versionadded:: 0.18 @@ -1306,20 +1300,12 @@ def inverse_transform(self, X=None, *, Xt=None): X : {ndarray, sparse matrix} of shape (n_samples, n_components) Transformed data matrix. - Xt : {ndarray, sparse matrix} of shape (n_samples, n_components) - Transformed data matrix. - - .. deprecated:: 1.5 - `Xt` was deprecated in 1.5 and will be removed in 1.7. Use `X` instead. - Returns ------- X : ndarray of shape (n_samples, n_features) Returns a data matrix of the original shape. """ - X = _deprecate_Xt_in_inverse_transform(X, Xt) - check_is_fitted(self) return X @ self.components_ diff --git a/sklearn/decomposition/tests/test_nmf.py b/sklearn/decomposition/tests/test_nmf.py index be7d902a58d2e..17be798b3f392 100644 --- a/sklearn/decomposition/tests/test_nmf.py +++ b/sklearn/decomposition/tests/test_nmf.py @@ -1,6 +1,5 @@ import re import sys -import warnings from io import StringIO import numpy as np @@ -919,33 +918,6 @@ def test_minibatch_nmf_verbose(): sys.stdout = old_stdout -# TODO(1.7): remove this test -@pytest.mark.parametrize("Estimator", [NMF, MiniBatchNMF]) -def test_NMF_inverse_transform_Xt_deprecation(Estimator): - rng = np.random.RandomState(42) - A = np.abs(rng.randn(6, 5)) - est = Estimator( - n_components=3, - init="random", - random_state=0, - tol=1e-6, - ) - X = est.fit_transform(A) - - with pytest.raises(TypeError, match="Missing required positional argument"): - est.inverse_transform() - - with pytest.raises(TypeError, match="Cannot use both X and Xt. Use X only"): - est.inverse_transform(X=X, Xt=X) - - with warnings.catch_warnings(record=True): - warnings.simplefilter("error") - est.inverse_transform(X) - - with pytest.warns(FutureWarning, match="Xt was renamed X in version 1.5"): - est.inverse_transform(Xt=X) - - @pytest.mark.parametrize("Estimator", [NMF, MiniBatchNMF]) def test_nmf_n_components_auto(Estimator): # Check that n_components is correctly inferred diff --git a/sklearn/model_selection/_search.py b/sklearn/model_selection/_search.py index c8ee1a5b65730..fe86a11c50267 100644 --- a/sklearn/model_selection/_search.py +++ b/sklearn/model_selection/_search.py @@ -34,7 +34,6 @@ from ..utils._estimator_html_repr import _VisualBlock from ..utils._param_validation import HasMethods, Interval, StrOptions from ..utils._tags import get_tags -from ..utils.deprecation import _deprecate_Xt_in_inverse_transform from ..utils.metadata_routing import ( MetadataRouter, MethodMapping, @@ -690,7 +689,7 @@ def transform(self, X): return self.best_estimator_.transform(X) @available_if(_search_estimator_has("inverse_transform")) - def inverse_transform(self, X=None, Xt=None): + def inverse_transform(self, X): """Call inverse_transform on the estimator with the best found params. Only available if the underlying estimator implements @@ -702,20 +701,12 @@ def inverse_transform(self, X=None, Xt=None): Must fulfill the input assumptions of the underlying estimator. - Xt : indexable, length n_samples - Must fulfill the input assumptions of the - underlying estimator. - - .. deprecated:: 1.5 - `Xt` was deprecated in 1.5 and will be removed in 1.7. Use `X` instead. - Returns ------- X : {ndarray, sparse matrix} of shape (n_samples, n_features) Result of the `inverse_transform` function for `Xt` based on the estimator with the best found parameters. """ - X = _deprecate_Xt_in_inverse_transform(X, Xt) check_is_fitted(self) return self.best_estimator_.inverse_transform(X) diff --git a/sklearn/model_selection/tests/test_search.py b/sklearn/model_selection/tests/test_search.py index e35a0dfb3a366..e87bb440c9563 100644 --- a/sklearn/model_selection/tests/test_search.py +++ b/sklearn/model_selection/tests/test_search.py @@ -2679,28 +2679,6 @@ def test_search_html_repr(): assert "
LogisticRegression()
" in repr_html -# TODO(1.7): remove this test -@pytest.mark.parametrize("SearchCV", [GridSearchCV, RandomizedSearchCV]) -def test_inverse_transform_Xt_deprecation(SearchCV): - clf = MockClassifier() - search = SearchCV(clf, {"foo_param": [1, 2, 3]}, cv=2, verbose=3) - - X2 = search.fit(X, y).transform(X) - - with pytest.raises(TypeError, match="Missing required positional argument"): - search.inverse_transform() - - with pytest.raises(TypeError, match="Cannot use both X and Xt. Use X only"): - search.inverse_transform(X=X2, Xt=X2) - - with warnings.catch_warnings(record=True): - warnings.simplefilter("error") - search.inverse_transform(X2) - - with pytest.warns(FutureWarning, match="Xt was renamed X in version 1.5"): - search.inverse_transform(Xt=X2) - - # Metadata Routing Tests # ====================== diff --git a/sklearn/pipeline.py b/sklearn/pipeline.py index 68b4344bab9e3..13b9599ffc5e0 100644 --- a/sklearn/pipeline.py +++ b/sklearn/pipeline.py @@ -25,7 +25,6 @@ ) from .utils._tags import get_tags from .utils._user_interface import _print_elapsed_time -from .utils.deprecation import _deprecate_Xt_in_inverse_transform from .utils.metadata_routing import ( MetadataRouter, MethodMapping, @@ -1096,7 +1095,7 @@ def _can_inverse_transform(self): return all(hasattr(t, "inverse_transform") for _, _, t in self._iter()) @available_if(_can_inverse_transform) - def inverse_transform(self, X=None, *, Xt=None, **params): + def inverse_transform(self, X, **params): """Apply `inverse_transform` for each step in a reverse order. All estimators in the pipeline must support `inverse_transform`. @@ -1109,15 +1108,6 @@ def inverse_transform(self, X=None, *, Xt=None, **params): input requirements of last step of pipeline's ``inverse_transform`` method. - Xt : array-like of shape (n_samples, n_transformed_features) - Data samples, where ``n_samples`` is the number of samples and - ``n_features`` is the number of features. Must fulfill - input requirements of last step of pipeline's - ``inverse_transform`` method. - - .. deprecated:: 1.5 - `Xt` was deprecated in 1.5 and will be removed in 1.7. Use `X` instead. - **params : dict of str -> object Parameters requested and accepted by steps. Each step must have requested certain metadata for these parameters to be forwarded to @@ -1138,8 +1128,6 @@ def inverse_transform(self, X=None, *, Xt=None, **params): with _raise_or_warn_if_not_fitted(self): _raise_for_params(params, self, "inverse_transform") - X = _deprecate_Xt_in_inverse_transform(X, Xt) - # we don't have to branch here, since params is only non-empty if # enable_metadata_routing=True. routed_params = process_routing(self, "inverse_transform", **params) diff --git a/sklearn/preprocessing/_discretization.py b/sklearn/preprocessing/_discretization.py index f5bc3c8109159..0cdfe225d163f 100644 --- a/sklearn/preprocessing/_discretization.py +++ b/sklearn/preprocessing/_discretization.py @@ -10,7 +10,6 @@ from ..base import BaseEstimator, TransformerMixin, _fit_context from ..utils import resample from ..utils._param_validation import Interval, Options, StrOptions -from ..utils.deprecation import _deprecate_Xt_in_inverse_transform from ..utils.stats import _averaged_weighted_percentile, _weighted_percentile from ..utils.validation import ( _check_feature_names_in, @@ -481,7 +480,7 @@ def transform(self, X): self._encoder.dtype = dtype_init return Xt_enc - def inverse_transform(self, X=None, *, Xt=None): + def inverse_transform(self, X): """ Transform discretized data back to original feature space. @@ -493,18 +492,11 @@ def inverse_transform(self, X=None, *, Xt=None): X : array-like of shape (n_samples, n_features) Transformed data in the binned space. - Xt : array-like of shape (n_samples, n_features) - Transformed data in the binned space. - - .. deprecated:: 1.5 - `Xt` was deprecated in 1.5 and will be removed in 1.7. Use `X` instead. - Returns ------- Xinv : ndarray, dtype={np.float32, np.float64} Data in the original feature space. """ - X = _deprecate_Xt_in_inverse_transform(X, Xt) check_is_fitted(self) diff --git a/sklearn/preprocessing/tests/test_discretization.py b/sklearn/preprocessing/tests/test_discretization.py index 7ee2cbcdb560b..7463a8608291c 100644 --- a/sklearn/preprocessing/tests/test_discretization.py +++ b/sklearn/preprocessing/tests/test_discretization.py @@ -663,27 +663,3 @@ def test_invalid_quantile_method_with_sample_weight(): X, sample_weight=[1, 1, 2, 2], ) - - -# TODO(1.7): remove this test -@pytest.mark.parametrize( - "strategy, quantile_method", - [("uniform", "warn"), ("quantile", "averaged_inverted_cdf"), ("kmeans", "warn")], -) -def test_KBD_inverse_transform_Xt_deprecation(strategy, quantile_method): - X = np.arange(10)[:, None] - kbd = KBinsDiscretizer(strategy=strategy, quantile_method=quantile_method) - X = kbd.fit_transform(X) - - with pytest.raises(TypeError, match="Missing required positional argument"): - kbd.inverse_transform() - - with pytest.raises(TypeError, match="Cannot use both X and Xt. Use X only"): - kbd.inverse_transform(X=X, Xt=X) - - with warnings.catch_warnings(record=True): - warnings.simplefilter("error") - kbd.inverse_transform(X) - - with pytest.warns(FutureWarning, match="Xt was renamed X in version 1.5"): - kbd.inverse_transform(Xt=X) diff --git a/sklearn/tests/test_pipeline.py b/sklearn/tests/test_pipeline.py index 74a5b17b27b9d..ad00ffb67a616 100644 --- a/sklearn/tests/test_pipeline.py +++ b/sklearn/tests/test_pipeline.py @@ -6,7 +6,6 @@ import re import shutil import time -import warnings from tempfile import mkdtemp import joblib @@ -1891,26 +1890,6 @@ def test_feature_union_feature_names_in_(): assert not hasattr(union, "feature_names_in_") -# TODO(1.7): remove this test -def test_pipeline_inverse_transform_Xt_deprecation(): - X = np.random.RandomState(0).normal(size=(10, 5)) - pipe = Pipeline([("pca", PCA(n_components=2))]) - X = pipe.fit_transform(X) - - with pytest.raises(TypeError, match="Missing required positional argument"): - pipe.inverse_transform() - - with pytest.raises(TypeError, match="Cannot use both X and Xt. Use X only"): - pipe.inverse_transform(X=X, Xt=X) - - with warnings.catch_warnings(record=True): - warnings.simplefilter("error") - pipe.inverse_transform(X) - - with pytest.warns(FutureWarning, match="Xt was renamed X in version 1.5"): - pipe.inverse_transform(Xt=X) - - # transform_input tests # ===================== diff --git a/sklearn/utils/deprecation.py b/sklearn/utils/deprecation.py index 35b9dfc8a47f6..d03978a8d243e 100644 --- a/sklearn/utils/deprecation.py +++ b/sklearn/utils/deprecation.py @@ -124,25 +124,6 @@ def _is_deprecated(func): return is_deprecated -# TODO: remove in 1.7 -def _deprecate_Xt_in_inverse_transform(X, Xt): - """Helper to deprecate the `Xt` argument in favor of `X` in inverse_transform.""" - if X is not None and Xt is not None: - raise TypeError("Cannot use both X and Xt. Use X only.") - - if X is None and Xt is None: - raise TypeError("Missing required positional argument: X.") - - if Xt is not None: - warnings.warn( - "Xt was renamed X in version 1.5 and will be removed in 1.7.", - FutureWarning, - ) - return Xt - - return X - - # TODO(1.8): remove force_all_finite and change the default value of ensure_all_finite # to True (remove None without deprecation). def _deprecate_force_all_finite(force_all_finite, ensure_all_finite): From 45fadfe76570bba201d671e7d37865bf07c83e2c Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?J=C3=A9r=C3=A9mie=20du=20Boisberranger?= Date: Wed, 2 Apr 2025 07:58:22 +0200 Subject: [PATCH 005/182] MNT Clean-up deprecations for 1.7: Y in PLS* (#31109) --- sklearn/cross_decomposition/_pls.py | 226 ++++++----------- sklearn/cross_decomposition/tests/test_pls.py | 235 ++++++------------ 2 files changed, 158 insertions(+), 303 deletions(-) diff --git a/sklearn/cross_decomposition/_pls.py b/sklearn/cross_decomposition/_pls.py index 7d0762406afca..6999cabf2d8b8 100644 --- a/sklearn/cross_decomposition/_pls.py +++ b/sklearn/cross_decomposition/_pls.py @@ -48,11 +48,11 @@ def _pinv2_old(a): def _get_first_singular_vectors_power_method( - X, Y, mode="A", max_iter=500, tol=1e-06, norm_y_weights=False + X, y, mode="A", max_iter=500, tol=1e-06, norm_y_weights=False ): - """Return the first left and right singular vectors of X'Y. + """Return the first left and right singular vectors of X'y. - Provides an alternative to the svd(X'Y) and uses the power method instead. + Provides an alternative to the svd(X'y) and uses the power method instead. With norm_y_weights to True and in mode A, this corresponds to the algorithm section 11.3 of the Wegelin's review, except this starts at the "update saliences" part. @@ -60,7 +60,7 @@ def _get_first_singular_vectors_power_method( eps = np.finfo(X.dtype).eps try: - y_score = next(col for col in Y.T if np.any(np.abs(col) > eps)) + y_score = next(col for col in y.T if np.any(np.abs(col) > eps)) except StopIteration as e: raise StopIteration("y residual is constant") from e @@ -73,7 +73,7 @@ def _get_first_singular_vectors_power_method( # As a result, and as detailed in the Wegelin's review, CCA (i.e. mode # B) will be unstable if n_features > n_samples or n_targets > # n_samples - X_pinv, Y_pinv = _pinv2_old(X), _pinv2_old(Y) + X_pinv, y_pinv = _pinv2_old(X), _pinv2_old(y) for i in range(max_iter): if mode == "B": @@ -85,17 +85,17 @@ def _get_first_singular_vectors_power_method( x_score = np.dot(X, x_weights) if mode == "B": - y_weights = np.dot(Y_pinv, x_score) + y_weights = np.dot(y_pinv, x_score) else: - y_weights = np.dot(Y.T, x_score) / np.dot(x_score.T, x_score) + y_weights = np.dot(y.T, x_score) / np.dot(x_score.T, x_score) if norm_y_weights: y_weights /= np.sqrt(np.dot(y_weights, y_weights)) + eps - y_score = np.dot(Y, y_weights) / (np.dot(y_weights, y_weights) + eps) + y_score = np.dot(y, y_weights) / (np.dot(y_weights, y_weights) + eps) x_weights_diff = x_weights - x_weights_old - if np.dot(x_weights_diff, x_weights_diff) < tol or Y.shape[1] == 1: + if np.dot(x_weights_diff, x_weights_diff) < tol or y.shape[1] == 1: break x_weights_old = x_weights @@ -106,40 +106,40 @@ def _get_first_singular_vectors_power_method( return x_weights, y_weights, n_iter -def _get_first_singular_vectors_svd(X, Y): - """Return the first left and right singular vectors of X'Y. +def _get_first_singular_vectors_svd(X, y): + """Return the first left and right singular vectors of X'y. Here the whole SVD is computed. """ - C = np.dot(X.T, Y) + C = np.dot(X.T, y) U, _, Vt = svd(C, full_matrices=False) return U[:, 0], Vt[0, :] -def _center_scale_xy(X, Y, scale=True): - """Center X, Y and scale if the scale parameter==True +def _center_scale_xy(X, y, scale=True): + """Center X, y and scale if the scale parameter==True Returns ------- - X, Y, x_mean, y_mean, x_std, y_std + X, y, x_mean, y_mean, x_std, y_std """ # center x_mean = X.mean(axis=0) X -= x_mean - y_mean = Y.mean(axis=0) - Y -= y_mean + y_mean = y.mean(axis=0) + y -= y_mean # scale if scale: x_std = X.std(axis=0, ddof=1) x_std[x_std == 0.0] = 1.0 X /= x_std - y_std = Y.std(axis=0, ddof=1) + y_std = y.std(axis=0, ddof=1) y_std[y_std == 0.0] = 1.0 - Y /= y_std + y /= y_std else: x_std = np.ones(X.shape[1]) - y_std = np.ones(Y.shape[1]) - return X, Y, x_mean, y_mean, x_std, y_std + y_std = np.ones(y.shape[1]) + return X, y, x_mean, y_mean, x_std, y_std def _svd_flip_1d(u, v): @@ -152,28 +152,6 @@ def _svd_flip_1d(u, v): v *= sign -# TODO(1.7): Remove -def _deprecate_Y_when_optional(y, Y): - if Y is not None: - warnings.warn( - "`Y` is deprecated in 1.5 and will be removed in 1.7. Use `y` instead.", - FutureWarning, - ) - if y is not None: - raise ValueError( - "Cannot use both `y` and `Y`. Use only `y` as `Y` is deprecated." - ) - return Y - return y - - -# TODO(1.7): Remove -def _deprecate_Y_when_required(y, Y): - if y is None and Y is None: - raise ValueError("y is required.") - return _deprecate_Y_when_optional(y, Y) - - class _PLS( ClassNamePrefixFeaturesOutMixin, TransformerMixin, @@ -225,7 +203,7 @@ def __init__( self.copy = copy @_fit_context(prefer_skip_nested_validation=True) - def fit(self, X, y=None, Y=None): + def fit(self, X, y): """Fit model to data. Parameters @@ -238,20 +216,11 @@ def fit(self, X, y=None, Y=None): Target vectors, where `n_samples` is the number of samples and `n_targets` is the number of response variables. - Y : array-like of shape (n_samples,) or (n_samples, n_targets) - Target vectors, where `n_samples` is the number of samples and - `n_targets` is the number of response variables. - - .. deprecated:: 1.5 - `Y` is deprecated in 1.5 and will be removed in 1.7. Use `y` instead. - Returns ------- self : object Fitted model. """ - y = _deprecate_Y_when_required(y, Y) - check_consistent_length(X, y) X = validate_data( self, @@ -282,7 +251,7 @@ def fit(self, X, y=None, Y=None): n_components = self.n_components # With PLSRegression n_components is bounded by the rank of (X.T X) see # Wegelin page 25. With CCA and PLSCanonical, n_components is bounded - # by the rank of X and the rank of Y: see Wegelin page 12 + # by the rank of X and the rank of y: see Wegelin page 12 rank_upper_bound = ( min(n, p) if self.deflation_mode == "regression" else min(n, p, q) ) @@ -313,7 +282,7 @@ def fit(self, X, y=None, Y=None): # paper. y_eps = np.finfo(yk.dtype).eps for k in range(n_components): - # Find first left and right singular vectors of the X.T.dot(Y) + # Find first left and right singular vectors of the X.T.dot(y) # cross-covariance matrix. if self.algorithm == "nipals": # Replace columns that are all close to zero with zeros @@ -347,7 +316,7 @@ def fit(self, X, y=None, Y=None): # inplace sign flip for consistency across solvers and archs _svd_flip_1d(x_weights, y_weights) - # compute scores, i.e. the projections of X and Y + # compute scores, i.e. the projections of X and y x_scores = np.dot(Xk, x_weights) if norm_y_weights: y_ss = 1 @@ -355,16 +324,16 @@ def fit(self, X, y=None, Y=None): y_ss = np.dot(y_weights, y_weights) y_scores = np.dot(yk, y_weights) / y_ss - # Deflation: subtract rank-one approx to obtain Xk+1 and Yk+1 + # Deflation: subtract rank-one approx to obtain Xk+1 and yk+1 x_loadings = np.dot(x_scores, Xk) / np.dot(x_scores, x_scores) Xk -= np.outer(x_scores, x_loadings) if self.deflation_mode == "canonical": - # regress Yk on y_score + # regress yk on y_score y_loadings = np.dot(y_scores, yk) / np.dot(y_scores, y_scores) yk -= np.outer(y_scores, y_loadings) if self.deflation_mode == "regression": - # regress Yk on x_score + # regress yk on x_score y_loadings = np.dot(x_scores, yk) / np.dot(x_scores, x_scores) yk -= np.outer(x_scores, y_loadings) @@ -396,7 +365,7 @@ def fit(self, X, y=None, Y=None): self._n_features_out = self.x_rotations_.shape[1] return self - def transform(self, X, y=None, Y=None, copy=True): + def transform(self, X, y=None, copy=True): """Apply the dimension reduction. Parameters @@ -407,22 +376,14 @@ def transform(self, X, y=None, Y=None, copy=True): y : array-like of shape (n_samples, n_targets), default=None Target vectors. - Y : array-like of shape (n_samples, n_targets), default=None - Target vectors. - - .. deprecated:: 1.5 - `Y` is deprecated in 1.5 and will be removed in 1.7. Use `y` instead. - copy : bool, default=True - Whether to copy `X` and `Y`, or perform in-place normalization. + Whether to copy `X` and `y`, or perform in-place normalization. Returns ------- x_scores, y_scores : array-like or tuple of array-like - Return `x_scores` if `Y` is not given, `(x_scores, y_scores)` otherwise. + Return `x_scores` if `y` is not given, `(x_scores, y_scores)` otherwise. """ - y = _deprecate_Y_when_optional(y, Y) - check_is_fitted(self) X = validate_data(self, X, copy=copy, dtype=FLOAT_DTYPES, reset=False) # Normalize @@ -443,7 +404,7 @@ def transform(self, X, y=None, Y=None, copy=True): return x_scores - def inverse_transform(self, X, y=None, Y=None): + def inverse_transform(self, X, y=None): """Transform data back to its original space. Parameters @@ -456,13 +417,6 @@ def inverse_transform(self, X, y=None, Y=None): New target, where `n_samples` is the number of samples and `n_components` is the number of pls components. - Y : array-like of shape (n_samples, n_components) - New target, where `n_samples` is the number of samples - and `n_components` is the number of pls components. - - .. deprecated:: 1.5 - `Y` is deprecated in 1.5 and will be removed in 1.7. Use `y` instead. - Returns ------- X_reconstructed : ndarray of shape (n_samples, n_features) @@ -475,8 +429,6 @@ def inverse_transform(self, X, y=None, Y=None): ----- This transformation will only be exact if `n_components=n_features`. """ - y = _deprecate_Y_when_optional(y, Y) - check_is_fitted(self) X = check_array(X, input_name="X", dtype=FLOAT_DTYPES) # From pls space to original space @@ -505,7 +457,7 @@ def predict(self, X, copy=True): Samples. copy : bool, default=True - Whether to copy `X` and `Y`, or perform in-place normalization. + Whether to copy `X` or perform in-place normalization. Returns ------- @@ -522,8 +474,8 @@ def predict(self, X, copy=True): X = validate_data(self, X, copy=copy, dtype=FLOAT_DTYPES, reset=False) # Only center X but do not scale it since the coefficients are already scaled X -= self._x_mean - Ypred = X @ self.coef_.T + self.intercept_ - return Ypred.ravel() if self._predict_1d else Ypred + y_pred = X @ self.coef_.T + self.intercept_ + return y_pred.ravel() if self._predict_1d else y_pred def fit_transform(self, X, y=None): """Learn and apply the dimension reduction on the train data. @@ -541,7 +493,7 @@ def fit_transform(self, X, y=None): Returns ------- self : ndarray of shape (n_samples, n_components) - Return `x_scores` if `Y` is not given, `(x_scores, y_scores)` otherwise. + Return `x_scores` if `y` is not given, `(x_scores, y_scores)` otherwise. """ return self.fit(X, y).transform(X, y) @@ -571,7 +523,7 @@ class PLSRegression(_PLS): Number of components to keep. Should be in `[1, n_features]`. scale : bool, default=True - Whether to scale `X` and `Y`. + Whether to scale `X` and `y`. max_iter : int, default=500 The maximum number of iterations of the power method when @@ -583,7 +535,7 @@ class PLSRegression(_PLS): than `tol`, where `u` corresponds to the left singular vector. copy : bool, default=True - Whether to copy `X` and `Y` in :term:`fit` before applying centering, + Whether to copy `X` and `y` in :term:`fit` before applying centering, and potentially scaling. If `False`, these operations will be done inplace, modifying both arrays. @@ -601,7 +553,7 @@ class PLSRegression(_PLS): The loadings of `X`. y_loadings_ : ndarray of shape (n_targets, n_components) - The loadings of `Y`. + The loadings of `y`. x_scores_ : ndarray of shape (n_samples, n_components) The transformed training samples. @@ -613,15 +565,15 @@ class PLSRegression(_PLS): The projection matrix used to transform `X`. y_rotations_ : ndarray of shape (n_targets, n_components) - The projection matrix used to transform `Y`. + The projection matrix used to transform `y`. coef_ : ndarray of shape (n_target, n_features) - The coefficients of the linear model such that `Y` is approximated as - `Y = X @ coef_.T + intercept_`. + The coefficients of the linear model such that `y` is approximated as + `y = X @ coef_.T + intercept_`. intercept_ : ndarray of shape (n_targets,) - The intercepts of the linear model such that `Y` is approximated as - `Y = X @ coef_.T + intercept_`. + The intercepts of the linear model such that `y` is approximated as + `y = X @ coef_.T + intercept_`. .. versionadded:: 1.1 @@ -650,7 +602,7 @@ class PLSRegression(_PLS): >>> pls2 = PLSRegression(n_components=2) >>> pls2.fit(X, y) PLSRegression() - >>> Y_pred = pls2.predict(X) + >>> y_pred = pls2.predict(X) For a comparison between PLS Regression and :class:`~sklearn.decomposition.PCA`, see :ref:`sphx_glr_auto_examples_cross_decomposition_plot_pcr_vs_pls.py`. @@ -662,9 +614,9 @@ class PLSRegression(_PLS): # This implementation provides the same results that 3 PLS packages # provided in the R language (R-project): - # - "mixOmics" with function pls(X, Y, mode = "regression") - # - "plspm " with function plsreg2(X, Y) - # - "pls" with function oscorespls.fit(X, Y) + # - "mixOmics" with function pls(X, y, mode = "regression") + # - "plspm " with function plsreg2(X, y) + # - "pls" with function oscorespls.fit(X, y) def __init__( self, n_components=2, *, scale=True, max_iter=500, tol=1e-06, copy=True @@ -680,7 +632,7 @@ def __init__( copy=copy, ) - def fit(self, X, y=None, Y=None): + def fit(self, X, y): """Fit model to data. Parameters @@ -693,20 +645,11 @@ def fit(self, X, y=None, Y=None): Target vectors, where `n_samples` is the number of samples and `n_targets` is the number of response variables. - Y : array-like of shape (n_samples,) or (n_samples, n_targets) - Target vectors, where `n_samples` is the number of samples and - `n_targets` is the number of response variables. - - .. deprecated:: 1.5 - `Y` is deprecated in 1.5 and will be removed in 1.7. Use `y` instead. - Returns ------- self : object Fitted model. """ - y = _deprecate_Y_when_required(y, Y) - super().fit(X, y) # expose the fitted attributes `x_scores_` and `y_scores_` self.x_scores_ = self._x_scores @@ -731,7 +674,7 @@ class PLSCanonical(_PLS): n_features, n_targets)]`. scale : bool, default=True - Whether to scale `X` and `Y`. + Whether to scale `X` and `y`. algorithm : {'nipals', 'svd'}, default='nipals' The algorithm used to estimate the first singular vectors of the @@ -748,7 +691,7 @@ class PLSCanonical(_PLS): than `tol`, where `u` corresponds to the left singular vector. copy : bool, default=True - Whether to copy `X` and `Y` in fit before applying centering, and + Whether to copy `X` and `y` in fit before applying centering, and potentially scaling. If False, these operations will be done inplace, modifying both arrays. @@ -766,21 +709,21 @@ class PLSCanonical(_PLS): The loadings of `X`. y_loadings_ : ndarray of shape (n_targets, n_components) - The loadings of `Y`. + The loadings of `y`. x_rotations_ : ndarray of shape (n_features, n_components) The projection matrix used to transform `X`. y_rotations_ : ndarray of shape (n_targets, n_components) - The projection matrix used to transform `Y`. + The projection matrix used to transform `y`. coef_ : ndarray of shape (n_targets, n_features) - The coefficients of the linear model such that `Y` is approximated as - `Y = X @ coef_.T + intercept_`. + The coefficients of the linear model such that `y` is approximated as + `y = X @ coef_.T + intercept_`. intercept_ : ndarray of shape (n_targets,) - The intercepts of the linear model such that `Y` is approximated as - `Y = X @ coef_.T + intercept_`. + The intercepts of the linear model such that `y` is approximated as + `y = X @ coef_.T + intercept_`. .. versionadded:: 1.1 @@ -818,7 +761,7 @@ class PLSCanonical(_PLS): _parameter_constraints.pop(param) # This implementation provides the same results that the "plspm" package - # provided in the R language (R-project), using the function plsca(X, Y). + # provided in the R language (R-project), using the function plsca(X, y). # Results are equal or collinear with the function # ``pls(..., mode = "canonical")`` of the "mixOmics" package. The # difference relies in the fact that mixOmics implementation does not @@ -862,7 +805,7 @@ class CCA(_PLS): n_features, n_targets)]`. scale : bool, default=True - Whether to scale `X` and `Y`. + Whether to scale `X` and `y`. max_iter : int, default=500 The maximum number of iterations of the power method. @@ -873,7 +816,7 @@ class CCA(_PLS): than `tol`, where `u` corresponds to the left singular vector. copy : bool, default=True - Whether to copy `X` and `Y` in fit before applying centering, and + Whether to copy `X` and `y` in fit before applying centering, and potentially scaling. If False, these operations will be done inplace, modifying both arrays. @@ -891,21 +834,21 @@ class CCA(_PLS): The loadings of `X`. y_loadings_ : ndarray of shape (n_targets, n_components) - The loadings of `Y`. + The loadings of `y`. x_rotations_ : ndarray of shape (n_features, n_components) The projection matrix used to transform `X`. y_rotations_ : ndarray of shape (n_targets, n_components) - The projection matrix used to transform `Y`. + The projection matrix used to transform `y`. coef_ : ndarray of shape (n_targets, n_features) - The coefficients of the linear model such that `Y` is approximated as - `Y = X @ coef_.T + intercept_`. + The coefficients of the linear model such that `y` is approximated as + `y = X @ coef_.T + intercept_`. intercept_ : ndarray of shape (n_targets,) - The intercepts of the linear model such that `Y` is approximated as - `Y = X @ coef_.T + intercept_`. + The intercepts of the linear model such that `y` is approximated as + `y = X @ coef_.T + intercept_`. .. versionadded:: 1.1 @@ -935,7 +878,7 @@ class CCA(_PLS): >>> cca = CCA(n_components=1) >>> cca.fit(X, y) CCA(n_components=1) - >>> X_c, Y_c = cca.transform(X, y) + >>> X_c, y_c = cca.transform(X, y) """ _parameter_constraints: dict = {**_PLS._parameter_constraints} @@ -961,8 +904,8 @@ class PLSSVD(ClassNamePrefixFeaturesOutMixin, TransformerMixin, BaseEstimator): """Partial Least Square SVD. This transformer simply performs a SVD on the cross-covariance matrix - `X'Y`. It is able to project both the training data `X` and the targets - `Y`. The training data `X` is projected on the left singular vectors, while + `X'y`. It is able to project both the training data `X` and the targets + `y`. The training data `X` is projected on the left singular vectors, while the targets are projected on the right singular vectors. Read more in the :ref:`User Guide `. @@ -976,10 +919,10 @@ class PLSSVD(ClassNamePrefixFeaturesOutMixin, TransformerMixin, BaseEstimator): min(n_samples, n_features, n_targets)]`. scale : bool, default=True - Whether to scale `X` and `Y`. + Whether to scale `X` and `y`. copy : bool, default=True - Whether to copy `X` and `Y` in fit before applying centering, and + Whether to copy `X` and `y` in fit before applying centering, and potentially scaling. If `False`, these operations will be done inplace, modifying both arrays. @@ -1037,7 +980,7 @@ def __init__(self, n_components=2, *, scale=True, copy=True): self.copy = copy @_fit_context(prefer_skip_nested_validation=True) - def fit(self, X, y=None, Y=None): + def fit(self, X, y): """Fit model to data. Parameters @@ -1048,18 +991,11 @@ def fit(self, X, y=None, Y=None): y : array-like of shape (n_samples,) or (n_samples, n_targets) Targets. - Y : array-like of shape (n_samples,) or (n_samples, n_targets) - Targets. - - .. deprecated:: 1.5 - `Y` is deprecated in 1.5 and will be removed in 1.7. Use `y` instead. - Returns ------- self : object Fitted estimator. """ - y = _deprecate_Y_when_required(y, Y) check_consistent_length(X, y) X = validate_data( self, @@ -1108,7 +1044,7 @@ def fit(self, X, y=None, Y=None): self._n_features_out = self.x_weights_.shape[1] return self - def transform(self, X, y=None, Y=None): + def transform(self, X, y=None): """ Apply the dimensionality reduction. @@ -1121,20 +1057,12 @@ def transform(self, X, y=None, Y=None): default=None Targets. - Y : array-like of shape (n_samples,) or (n_samples, n_targets), \ - default=None - Targets. - - .. deprecated:: 1.5 - `Y` is deprecated in 1.5 and will be removed in 1.7. Use `y` instead. - Returns ------- x_scores : array-like or tuple of array-like - The transformed data `X_transformed` if `Y is not None`, - `(X_transformed, Y_transformed)` otherwise. + The transformed data `X_transformed` if `y is not None`, + `(X_transformed, y_transformed)` otherwise. """ - y = _deprecate_Y_when_optional(y, Y) check_is_fitted(self) X = validate_data(self, X, dtype=np.float64, reset=False) Xr = (X - self._x_mean) / self._x_std @@ -1163,7 +1091,7 @@ def fit_transform(self, X, y=None): Returns ------- out : array-like or tuple of array-like - The transformed data `X_transformed` if `Y is not None`, - `(X_transformed, Y_transformed)` otherwise. + The transformed data `X_transformed` if `y is not None`, + `(X_transformed, y_transformed)` otherwise. """ return self.fit(X, y).transform(X, y) diff --git a/sklearn/cross_decomposition/tests/test_pls.py b/sklearn/cross_decomposition/tests/test_pls.py index 381868b9b60b0..c107a6a1a76dd 100644 --- a/sklearn/cross_decomposition/tests/test_pls.py +++ b/sklearn/cross_decomposition/tests/test_pls.py @@ -28,40 +28,40 @@ def test_pls_canonical_basics(): # Basic checks for PLSCanonical d = load_linnerud() X = d.data - Y = d.target + y = d.target pls = PLSCanonical(n_components=X.shape[1]) - pls.fit(X, Y) + pls.fit(X, y) assert_matrix_orthogonal(pls.x_weights_) assert_matrix_orthogonal(pls.y_weights_) assert_matrix_orthogonal(pls._x_scores) assert_matrix_orthogonal(pls._y_scores) - # Check X = TP' and Y = UQ' + # Check X = TP' and y = UQ' T = pls._x_scores P = pls.x_loadings_ U = pls._y_scores Q = pls.y_loadings_ # Need to scale first - Xc, Yc, x_mean, y_mean, x_std, y_std = _center_scale_xy( - X.copy(), Y.copy(), scale=True + Xc, yc, x_mean, y_mean, x_std, y_std = _center_scale_xy( + X.copy(), y.copy(), scale=True ) assert_array_almost_equal(Xc, np.dot(T, P.T)) - assert_array_almost_equal(Yc, np.dot(U, Q.T)) + assert_array_almost_equal(yc, np.dot(U, Q.T)) # Check that rotations on training data lead to scores Xt = pls.transform(X) assert_array_almost_equal(Xt, pls._x_scores) - Xt, Yt = pls.transform(X, Y) + Xt, yt = pls.transform(X, y) assert_array_almost_equal(Xt, pls._x_scores) - assert_array_almost_equal(Yt, pls._y_scores) + assert_array_almost_equal(yt, pls._y_scores) # Check that inverse_transform works X_back = pls.inverse_transform(Xt) assert_array_almost_equal(X_back, X) - _, Y_back = pls.inverse_transform(Xt, Yt) - assert_array_almost_equal(Y_back, Y) + _, y_back = pls.inverse_transform(Xt, yt) + assert_array_almost_equal(y_back, y) def test_sanity_check_pls_regression(): @@ -70,10 +70,10 @@ def test_sanity_check_pls_regression(): d = load_linnerud() X = d.data - Y = d.target + y = d.target pls = PLSRegression(n_components=X.shape[1]) - X_trans, _ = pls.fit_transform(X, Y) + X_trans, _ = pls.fit_transform(X, y) # FIXME: one would expect y_trans == pls.y_scores_ but this is not # the case. @@ -127,16 +127,16 @@ def test_sanity_check_pls_regression(): assert_array_almost_equal(y_loadings_sign_flip, y_weights_sign_flip) -def test_sanity_check_pls_regression_constant_column_Y(): - # Check behavior when the first column of Y is constant +def test_sanity_check_pls_regression_constant_column_y(): + # Check behavior when the first column of y is constant # The results are checked against a modified version of plsreg2 # from the R-package plsdepot d = load_linnerud() X = d.data - Y = d.target - Y[:, 0] = 1 + y = d.target + y[:, 0] = 1 pls = PLSRegression(n_components=X.shape[1]) - pls.fit(X, Y) + pls.fit(X, y) expected_x_weights = np.array( [ @@ -183,10 +183,10 @@ def test_sanity_check_pls_canonical(): d = load_linnerud() X = d.data - Y = d.target + y = d.target pls = PLSCanonical(n_components=X.shape[1]) - pls.fit(X, Y) + pls.fit(X, y) expected_x_weights = np.array( [ @@ -251,12 +251,12 @@ def test_sanity_check_pls_canonical_random(): l2 = rng.normal(size=n) latents = np.array([l1, l1, l2, l2]).T X = latents + rng.normal(size=4 * n).reshape((n, 4)) - Y = latents + rng.normal(size=4 * n).reshape((n, 4)) + y = latents + rng.normal(size=4 * n).reshape((n, 4)) X = np.concatenate((X, rng.normal(size=p_noise * n).reshape(n, p_noise)), axis=1) - Y = np.concatenate((Y, rng.normal(size=q_noise * n).reshape(n, q_noise)), axis=1) + y = np.concatenate((y, rng.normal(size=q_noise * n).reshape(n, q_noise)), axis=1) pls = PLSCanonical(n_components=3) - pls.fit(X, Y) + pls.fit(X, y) expected_x_weights = np.array( [ @@ -347,10 +347,10 @@ def test_convergence_fail(): # Make sure ConvergenceWarning is raised if max_iter is too small d = load_linnerud() X = d.data - Y = d.target + y = d.target pls_nipals = PLSCanonical(n_components=X.shape[1], max_iter=2) with pytest.warns(ConvergenceWarning): - pls_nipals.fit(X, Y) + pls_nipals.fit(X, y) @pytest.mark.parametrize("Est", (PLSSVD, PLSRegression, PLSCanonical)) @@ -358,10 +358,10 @@ def test_attibutes_shapes(Est): # Make sure attributes are of the correct shape depending on n_components d = load_linnerud() X = d.data - Y = d.target + y = d.target n_components = 2 pls = Est(n_components=n_components) - pls.fit(X, Y) + pls.fit(X, y) assert all( attr.shape[1] == n_components for attr in (pls.x_weights_, pls.y_weights_) ) @@ -369,14 +369,14 @@ def test_attibutes_shapes(Est): @pytest.mark.parametrize("Est", (PLSRegression, PLSCanonical, CCA)) def test_univariate_equivalence(Est): - # Ensure 2D Y with 1 column is equivalent to 1D Y + # Ensure 2D y with 1 column is equivalent to 1D y d = load_linnerud() X = d.data - Y = d.target + y = d.target est = Est(n_components=1) - one_d_coeff = est.fit(X, Y[:, 0]).coef_ - two_d_coeff = est.fit(X, Y[:, :1]).coef_ + one_d_coeff = est.fit(X, y[:, 0]).coef_ + two_d_coeff = est.fit(X, y[:, :1]).coef_ assert one_d_coeff.shape == two_d_coeff.shape assert_array_almost_equal(one_d_coeff, two_d_coeff) @@ -387,16 +387,16 @@ def test_copy(Est): # check that the "copy" keyword works d = load_linnerud() X = d.data - Y = d.target + y = d.target X_orig = X.copy() # copy=True won't modify inplace - pls = Est(copy=True).fit(X, Y) + pls = Est(copy=True).fit(X, y) assert_array_equal(X, X_orig) # copy=False will modify inplace with pytest.raises(AssertionError): - Est(copy=False).fit(X, Y) + Est(copy=False).fit(X, y) assert_array_almost_equal(X, X_orig) if Est is PLSSVD: @@ -404,7 +404,7 @@ def test_copy(Est): X_orig = X.copy() with pytest.raises(AssertionError): - pls.transform(X, Y, copy=False), + pls.transform(X, y, copy=False), assert_array_almost_equal(X, X_orig) X_orig = X.copy() @@ -414,7 +414,7 @@ def test_copy(Est): # Make sure copy=True gives same transform and predictions as predict=False assert_array_almost_equal( - pls.transform(X, Y, copy=True), pls.transform(X.copy(), Y.copy(), copy=False) + pls.transform(X, y, copy=True), pls.transform(X.copy(), y.copy(), copy=False) ) assert_array_almost_equal( pls.predict(X, copy=True), pls.predict(X.copy(), copy=False) @@ -429,43 +429,43 @@ def _generate_test_scale_and_stability_datasets(): n_targets = 5 n_features = 10 Q = rng.randn(n_targets, n_features) - Y = rng.randn(n_samples, n_targets) - X = np.dot(Y, Q) + 2 * rng.randn(n_samples, n_features) + 1 + y = rng.randn(n_samples, n_targets) + X = np.dot(y, Q) + 2 * rng.randn(n_samples, n_features) + 1 X *= 1000 - yield X, Y + yield X, y # Data set where one of the features is constraint - X, Y = load_linnerud(return_X_y=True) + X, y = load_linnerud(return_X_y=True) # causes X[:, -1].std() to be zero X[:, -1] = 1.0 - yield X, Y + yield X, y X = np.array([[0.0, 0.0, 1.0], [1.0, 0.0, 0.0], [2.0, 2.0, 2.0], [3.0, 5.0, 4.0]]) - Y = np.array([[0.1, -0.2], [0.9, 1.1], [6.2, 5.9], [11.9, 12.3]]) - yield X, Y + y = np.array([[0.1, -0.2], [0.9, 1.1], [6.2, 5.9], [11.9, 12.3]]) + yield X, y # Seeds that provide a non-regression test for #18746, where CCA fails seeds = [530, 741] for seed in seeds: rng = np.random.RandomState(seed) X = rng.randn(4, 3) - Y = rng.randn(4, 2) - yield X, Y + y = rng.randn(4, 2) + yield X, y @pytest.mark.parametrize("Est", (CCA, PLSCanonical, PLSRegression, PLSSVD)) -@pytest.mark.parametrize("X, Y", _generate_test_scale_and_stability_datasets()) -def test_scale_and_stability(Est, X, Y): +@pytest.mark.parametrize("X, y", _generate_test_scale_and_stability_datasets()) +def test_scale_and_stability(Est, X, y): """scale=True is equivalent to scale=False on centered/scaled data This allows to check numerical stability over platforms as well""" - X_s, Y_s, *_ = _center_scale_xy(X, Y) + X_s, y_s, *_ = _center_scale_xy(X, y) - X_score, Y_score = Est(scale=True).fit_transform(X, Y) - X_s_score, Y_s_score = Est(scale=False).fit_transform(X_s, Y_s) + X_score, y_score = Est(scale=True).fit_transform(X, y) + X_s_score, y_s_score = Est(scale=False).fit_transform(X_s, y_s) assert_allclose(X_s_score, X_score, atol=1e-4) - assert_allclose(Y_s_score, Y_score, atol=1e-4) + assert_allclose(y_s_score, y_score, atol=1e-4) @pytest.mark.parametrize("Estimator", (PLSSVD, PLSRegression, PLSCanonical, CCA)) @@ -473,32 +473,32 @@ def test_n_components_upper_bounds(Estimator): """Check the validation of `n_components` upper bounds for `PLS` regressors.""" rng = np.random.RandomState(0) X = rng.randn(10, 5) - Y = rng.randn(10, 3) + y = rng.randn(10, 3) est = Estimator(n_components=10) err_msg = "`n_components` upper bound is .*. Got 10 instead. Reduce `n_components`." with pytest.raises(ValueError, match=err_msg): - est.fit(X, Y) + est.fit(X, y) def test_n_components_upper_PLSRegression(): """Check the validation of `n_components` upper bounds for PLSRegression.""" rng = np.random.RandomState(0) X = rng.randn(20, 64) - Y = rng.randn(20, 3) + y = rng.randn(20, 3) est = PLSRegression(n_components=30) err_msg = "`n_components` upper bound is 20. Got 30 instead. Reduce `n_components`." with pytest.raises(ValueError, match=err_msg): - est.fit(X, Y) + est.fit(X, y) @pytest.mark.parametrize("n_samples, n_features", [(100, 10), (100, 200)]) def test_singular_value_helpers(n_samples, n_features, global_random_seed): # Make sure SVD and power method give approximately the same results - X, Y = make_regression( + X, y = make_regression( n_samples, n_features, n_targets=5, random_state=global_random_seed ) - u1, v1, _ = _get_first_singular_vectors_power_method(X, Y, norm_y_weights=True) - u2, v2 = _get_first_singular_vectors_svd(X, Y) + u1, v1, _ = _get_first_singular_vectors_power_method(X, y, norm_y_weights=True) + u2, v2 = _get_first_singular_vectors_svd(X, y) _svd_flip_1d(u1, v1) _svd_flip_1d(u2, v2) @@ -512,10 +512,10 @@ def test_singular_value_helpers(n_samples, n_features, global_random_seed): def test_one_component_equivalence(global_random_seed): # PLSSVD, PLSRegression and PLSCanonical should all be equivalent when # n_components is 1 - X, Y = make_regression(100, 10, n_targets=5, random_state=global_random_seed) - svd = PLSSVD(n_components=1).fit(X, Y).transform(X) - reg = PLSRegression(n_components=1).fit(X, Y).transform(X) - canonical = PLSCanonical(n_components=1).fit(X, Y).transform(X) + X, y = make_regression(100, 10, n_targets=5, random_state=global_random_seed) + svd = PLSSVD(n_components=1).fit(X, y).transform(X) + reg = PLSRegression(n_components=1).fit(X, y).transform(X) + canonical = PLSCanonical(n_components=1).fit(X, y).transform(X) rtol = 1e-3 # Setting atol because some entries are very close to zero @@ -579,11 +579,11 @@ def test_pls_coef_shape(PLSEstimator): """ d = load_linnerud() X = d.data - Y = d.target + y = d.target - pls = PLSEstimator(copy=True).fit(X, Y) + pls = PLSEstimator(copy=True).fit(X, y) - n_targets, n_features = Y.shape[1], X.shape[1] + n_targets, n_features = y.shape[1], X.shape[1] assert pls.coef_.shape == (n_targets, n_features) @@ -593,24 +593,24 @@ def test_pls_prediction(PLSEstimator, scale): """Check the behaviour of the prediction function.""" d = load_linnerud() X = d.data - Y = d.target + y = d.target - pls = PLSEstimator(copy=True, scale=scale).fit(X, Y) - Y_pred = pls.predict(X, copy=True) + pls = PLSEstimator(copy=True, scale=scale).fit(X, y) + y_pred = pls.predict(X, copy=True) - y_mean = Y.mean(axis=0) + y_mean = y.mean(axis=0) X_trans = X - X.mean(axis=0) assert_allclose(pls.intercept_, y_mean) - assert_allclose(Y_pred, X_trans @ pls.coef_.T + pls.intercept_) + assert_allclose(y_pred, X_trans @ pls.coef_.T + pls.intercept_) @pytest.mark.parametrize("Klass", [CCA, PLSSVD, PLSRegression, PLSCanonical]) def test_pls_feature_names_out(Klass): """Check `get_feature_names_out` cross_decomposition module.""" - X, Y = load_linnerud(return_X_y=True) + X, y = load_linnerud(return_X_y=True) - est = Klass().fit(X, Y) + est = Klass().fit(X, y) names_out = est.get_feature_names_out() class_name_lower = Klass.__name__.lower() @@ -625,10 +625,10 @@ def test_pls_feature_names_out(Klass): def test_pls_set_output(Klass): """Check `set_output` in cross_decomposition module.""" pd = pytest.importorskip("pandas") - X, Y = load_linnerud(return_X_y=True, as_frame=True) + X, y = load_linnerud(return_X_y=True, as_frame=True) - est = Klass().set_output(transform="pandas").fit(X, Y) - X_trans, y_trans = est.transform(X, Y) + est = Klass().set_output(transform="pandas").fit(X, y) + X_trans, y_trans = est.transform(X, y) assert isinstance(y_trans, np.ndarray) assert isinstance(X_trans, pd.DataFrame) assert_array_equal(X_trans.columns, est.get_feature_names_out()) @@ -657,94 +657,21 @@ def test_pls_regression_fit_1d_y(): def test_pls_regression_scaling_coef(): """Check that when using `scale=True`, the coefficients are using the std. dev. from - both `X` and `Y`. + both `X` and `y`. Non-regression test for: https://github.com/scikit-learn/scikit-learn/issues/27964 """ - # handcrafted data where we can predict Y from X with an additional scaling factor + # handcrafted data where we can predict y from X with an additional scaling factor rng = np.random.RandomState(0) coef = rng.uniform(size=(3, 5)) X = rng.normal(scale=10, size=(30, 5)) # add a std of 10 - Y = X @ coef.T + y = X @ coef.T # we need to make sure that the dimension of the latent space is large enough to - # perfectly predict `Y` from `X` (no information loss) - pls = PLSRegression(n_components=5, scale=True).fit(X, Y) + # perfectly predict `y` from `X` (no information loss) + pls = PLSRegression(n_components=5, scale=True).fit(X, y) assert_allclose(pls.coef_, coef) - # we therefore should be able to predict `Y` from `X` - assert_allclose(pls.predict(X), Y) - - -# TODO(1.7): Remove -@pytest.mark.parametrize("Klass", [PLSRegression, CCA, PLSSVD, PLSCanonical]) -def test_pls_fit_warning_on_deprecated_Y_argument(Klass): - # Test warning message is shown when using Y instead of y - - d = load_linnerud() - X = d.data - Y = d.target - y = d.target - - msg = "`Y` is deprecated in 1.5 and will be removed in 1.7. Use `y` instead." - with pytest.warns(FutureWarning, match=msg): - Klass().fit(X=X, Y=Y) - - err_msg1 = "Cannot use both `y` and `Y`. Use only `y` as `Y` is deprecated." - with ( - pytest.warns(FutureWarning, match=msg), - pytest.raises(ValueError, match=err_msg1), - ): - Klass().fit(X, y, Y) - - err_msg2 = "y is required." - with pytest.raises(ValueError, match=err_msg2): - Klass().fit(X) - - -# TODO(1.7): Remove -@pytest.mark.parametrize("Klass", [PLSRegression, CCA, PLSSVD, PLSCanonical]) -def test_pls_transform_warning_on_deprecated_Y_argument(Klass): - # Test warning message is shown when using Y instead of y - - d = load_linnerud() - X = d.data - Y = d.target - y = d.target - - plsr = Klass().fit(X, y) - msg = "`Y` is deprecated in 1.5 and will be removed in 1.7. Use `y` instead." - with pytest.warns(FutureWarning, match=msg): - plsr.transform(X=X, Y=Y) - - err_msg1 = "Cannot use both `y` and `Y`. Use only `y` as `Y` is deprecated." - with ( - pytest.warns(FutureWarning, match=msg), - pytest.raises(ValueError, match=err_msg1), - ): - plsr.transform(X, y, Y) - - -# TODO(1.7): Remove -@pytest.mark.parametrize("Klass", [PLSRegression, CCA, PLSCanonical]) -def test_pls_inverse_transform_warning_on_deprecated_Y_argument(Klass): - # Test warning message is shown when using Y instead of y - - d = load_linnerud() - X = d.data - y = d.target - - plsr = Klass().fit(X, y) - X_transformed, y_transformed = plsr.transform(X, y) - - msg = "`Y` is deprecated in 1.5 and will be removed in 1.7. Use `y` instead." - with pytest.warns(FutureWarning, match=msg): - plsr.inverse_transform(X=X_transformed, Y=y_transformed) - - err_msg1 = "Cannot use both `y` and `Y`. Use only `y` as `Y` is deprecated." - with ( - pytest.warns(FutureWarning, match=msg), - pytest.raises(ValueError, match=err_msg1), - ): - plsr.inverse_transform(X=X_transformed, y=y_transformed, Y=y_transformed) + # we therefore should be able to predict `y` from `X` + assert_allclose(pls.predict(X), y) From 42a7d0cdf5a1a536ce47e820d576df4530e19494 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Wed, 2 Apr 2025 10:15:02 +0200 Subject: [PATCH 006/182] CI Bump the actions group with 2 updates (#31125) Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- .github/workflows/cuda-ci.yml | 2 +- .github/workflows/emscripten.yml | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/.github/workflows/cuda-ci.yml b/.github/workflows/cuda-ci.yml index fc2d38da925d0..8bcd78abb9cbf 100644 --- a/.github/workflows/cuda-ci.yml +++ b/.github/workflows/cuda-ci.yml @@ -18,7 +18,7 @@ jobs: - uses: actions/checkout@v4 - name: Build wheels - uses: pypa/cibuildwheel@v2.23.0 + uses: pypa/cibuildwheel@v2.23.2 env: CIBW_BUILD: cp313-manylinux_x86_64 CIBW_MANYLINUX_X86_64_IMAGE: manylinux2014 diff --git a/.github/workflows/emscripten.yml b/.github/workflows/emscripten.yml index a240b42c68980..99186c5fb1bee 100644 --- a/.github/workflows/emscripten.yml +++ b/.github/workflows/emscripten.yml @@ -67,7 +67,7 @@ jobs: with: persist-credentials: false - - uses: pypa/cibuildwheel@d04cacbc9866d432033b1d09142936e6a0e2121a # v2.23.2 + - uses: pypa/cibuildwheel@6c426a3a17cfcadf4b6048de53653eba55d7ae4f # v2.23.2 env: CIBW_PLATFORM: pyodide SKLEARN_SKIP_OPENMP_TEST: "true" @@ -99,7 +99,7 @@ jobs: merge-multiple: true - name: Push to Anaconda PyPI index - uses: scientific-python/upload-nightly-action@82396a2ed4269ba06c6b2988bb4fd568ef3c3d6b # 0.6.1 + uses: scientific-python/upload-nightly-action@b36e8c0c10dbcfd2e05bf95f17ef8c14fd708dbf # 0.6.2 with: artifacts_path: wheelhouse/ anaconda_nightly_upload_token: ${{ secrets.SCIKIT_LEARN_NIGHTLY_UPLOAD_TOKEN }} From efe2b766b6be66a81b69df1e6273a75c21eed088 Mon Sep 17 00:00:00 2001 From: Stefanie Senger <91849487+StefanieSenger@users.noreply.github.com> Date: Wed, 2 Apr 2025 10:33:44 +0200 Subject: [PATCH 007/182] MNT improve UnsetMetadataPassedError error message and fix disable metadata routing in examples (#31069) --- doc/metadata_routing.rst | 3 ++- .../plot_cost_sensitive_learning.py | 3 +++ .../plot_release_highlights_1_6_0.py | 26 +++++++++---------- sklearn/utils/_metadata_requests.py | 7 +++-- sklearn/utils/multiclass.py | 2 +- 5 files changed, 24 insertions(+), 17 deletions(-) diff --git a/doc/metadata_routing.rst b/doc/metadata_routing.rst index 0a73ab803271b..b7f95f3d608d7 100644 --- a/doc/metadata_routing.rst +++ b/doc/metadata_routing.rst @@ -248,7 +248,8 @@ should be passed to the estimator's scorer or not:: [sample_weight] are passed but are not explicitly set as requested or not requested for LogisticRegression.score, which is used within GridSearchCV.fit. Call `LogisticRegression.set_score_request({metadata}=True/False)` for each metadata - you want to request/ignore. + you want to request/ignore. See the Metadata Routing User guide + for more information. The issue can be fixed by explicitly setting the request value:: diff --git a/examples/model_selection/plot_cost_sensitive_learning.py b/examples/model_selection/plot_cost_sensitive_learning.py index c4dbb64535d69..9845d27661374 100644 --- a/examples/model_selection/plot_cost_sensitive_learning.py +++ b/examples/model_selection/plot_cost_sensitive_learning.py @@ -689,3 +689,6 @@ def business_metric(y_true, y_pred, amount): # historical data (offline evaluation) should ideally be confirmed by A/B testing # on live data (online evaluation). Note however that A/B testing models is # beyond the scope of the scikit-learn library itself. + +# At the end, we disable the configuration flag for metadata routing:: +sklearn.set_config(enable_metadata_routing=False) diff --git a/examples/release_highlights/plot_release_highlights_1_6_0.py b/examples/release_highlights/plot_release_highlights_1_6_0.py index 5a1214fc31b85..7e842659f018a 100644 --- a/examples/release_highlights/plot_release_highlights_1_6_0.py +++ b/examples/release_highlights/plot_release_highlights_1_6_0.py @@ -69,20 +69,20 @@ # a validation set. We can now have a pipeline which will transform the validation set # and pass it to the estimator:: # -# sklearn.set_config(enable_metadata_routing=True) -# est_gs = GridSearchCV( -# Pipeline( -# ( -# StandardScaler(), -# EstimatorWithValidationSet(...).set_fit_request(X_val=True, y_val=True), +# with sklearn.config_context(enable_metadata_routing=True): +# est_gs = GridSearchCV( +# Pipeline( +# ( +# StandardScaler(), +# EstimatorWithValidationSet(...).set_fit_request(X_val=True, y_val=True), +# ), +# # telling pipeline to transform these inputs up to the step which is +# # requesting them. +# transform_input=["X_val"], # ), -# # telling pipeline to transform these inputs up to the step which is -# # requesting them. -# transform_input=["X_val"], -# ), -# param_grid={"estimatorwithvalidationset__param_to_optimize": list(range(5))}, -# cv=5, -# ).fit(X, y, X_val=X_val, y_val=y_val) +# param_grid={"estimatorwithvalidationset__param_to_optimize": list(range(5))}, +# cv=5, +# ).fit(X, y, X_val=X_val, y_val=y_val) # # In the above code, the key parts are the call to `set_fit_request` to specify that # `X_val` and `y_val` are required by the `EstimatorWithValidationSet.fit` method, and diff --git a/sklearn/utils/_metadata_requests.py b/sklearn/utils/_metadata_requests.py index ebfbc41c0eab8..d7d77a74c6fa8 100644 --- a/sklearn/utils/_metadata_requests.py +++ b/sklearn/utils/_metadata_requests.py @@ -458,7 +458,10 @@ def _route_params(self, params, parent, caller): f" {self.owner}.{self.method}, which is used within" f" {parent}.{caller}. Call `{self.owner}" + set_requests_on - + "` for each metadata you want to request/ignore." + + "` for each metadata you want to request/ignore. See the" + " Metadata Routing User guide" + " for more" + " information." ) raise UnsetMetadataPassedError( message=message, @@ -1384,7 +1387,7 @@ def __init_subclass__(cls, **kwargs): for method in SIMPLE_METHODS: mmr = getattr(requests, method) - # set ``set_{method}_request``` methods + # set ``set_{method}_request`` methods if not len(mmr.requests): continue setattr( diff --git a/sklearn/utils/multiclass.py b/sklearn/utils/multiclass.py index 5df206259c5d1..6c089069387be 100644 --- a/sklearn/utils/multiclass.py +++ b/sklearn/utils/multiclass.py @@ -137,7 +137,7 @@ def is_multilabel(y): Returns ------- out : bool - Return ``True``, if ``y`` is in a multilabel format, else ```False``. + Return ``True``, if ``y`` is in a multilabel format, else ``False``. Examples -------- From 1a063ffa1b3aff73545293feed704037546dcbae Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Lo=C3=AFc=20Est=C3=A8ve?= Date: Wed, 2 Apr 2025 13:14:04 +0200 Subject: [PATCH 008/182] DOC Add paid support section (#31122) --- doc/support.rst | 10 ++++++++++ 1 file changed, 10 insertions(+) diff --git a/doc/support.rst b/doc/support.rst index 9152630eb490d..eb90ff6dd3d94 100644 --- a/doc/support.rst +++ b/doc/support.rst @@ -88,6 +88,16 @@ Include in your report: **Tip**: Gists are Git repositories; you can push data files to them using Git. +Paid support +============ + +The following companies (listed in alphabetical order) offer support services +related to scikit-learn and have a proven track record of employing long-term +maintainers of scikit-learn and related open source projects: + +- `:probabl. `__ +- `Quansight `__ + .. _social_media: Social Media From 812ff67e6725a8ca207a37f5ed4bfeafc5d1265d Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Lo=C3=AFc=20Est=C3=A8ve?= Date: Wed, 2 Apr 2025 14:28:01 +0200 Subject: [PATCH 009/182] MNT Mention security advisory in our security policy (#31082) --- SECURITY.md | 11 +++++++---- 1 file changed, 7 insertions(+), 4 deletions(-) diff --git a/SECURITY.md b/SECURITY.md index dd93079e26ffb..cfc0bc34c738d 100644 --- a/SECURITY.md +++ b/SECURITY.md @@ -9,12 +9,15 @@ ## Reporting a Vulnerability -Please report security vulnerabilities by email to `security@scikit-learn.org`. -This email is an alias to a subset of the scikit-learn maintainers' team. +Please report security vulnerabilities by opening a new [GitHub security +advisory](https://github.com/scikit-learn/scikit-learn/security/advisories/new). + +You can also send an email to `security@scikit-learn.org`, which is an alias to +a subset of the scikit-learn maintainers' team. If the security vulnerability is accepted, a patch will be crafted privately in order to prepare a dedicated bugfix release as timely as possible (depending on the complexity of the fix). -In addition to sending the report by email, you can also report security -vulnerabilities to [tidelift](https://tidelift.com/security). +In addition to the options above, you can also report security vulnerabilities +to [tidelift](https://tidelift.com/security). From f03817a8f3224484880cc7d6ac05a4e400c90ceb Mon Sep 17 00:00:00 2001 From: Dimitri Papadopoulos Orfanos <3234522+DimitriPapadopoulos@users.noreply.github.com> Date: Thu, 3 Apr 2025 14:15:32 +0200 Subject: [PATCH 010/182] DOC Fix typos (#31138) --- doc/whats_new/upcoming_changes/array-api/30340.other.rst | 2 +- sklearn/externals/array_api_compat/common/_helpers.py | 2 +- sklearn/metrics/_classification.py | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/doc/whats_new/upcoming_changes/array-api/30340.other.rst b/doc/whats_new/upcoming_changes/array-api/30340.other.rst index 87d9c47789c7d..38053567080f4 100644 --- a/doc/whats_new/upcoming_changes/array-api/30340.other.rst +++ b/doc/whats_new/upcoming_changes/array-api/30340.other.rst @@ -1,4 +1,4 @@ - array-api-compat and array-api-extra are now vendored within the scikit-learn source. Users of the experimental array API standard - support no longer need to install array-api-compat in their environemnt. + support no longer need to install array-api-compat in their environment. by :user:`Lucas Colley ` diff --git a/sklearn/externals/array_api_compat/common/_helpers.py b/sklearn/externals/array_api_compat/common/_helpers.py index 791edb817068a..970450e8ff2e9 100644 --- a/sklearn/externals/array_api_compat/common/_helpers.py +++ b/sklearn/externals/array_api_compat/common/_helpers.py @@ -899,7 +899,7 @@ def is_lazy_array(x: object) -> bool: try: bool(x) return False - # The Array API standard dictactes that __bool__ should raise TypeError if the + # The Array API standard dictates that __bool__ should raise TypeError if the # output cannot be defined. # Here we allow for it to raise arbitrary exceptions, e.g. like Dask does. except Exception: diff --git a/sklearn/metrics/_classification.py b/sklearn/metrics/_classification.py index b4625648495e2..0175b4760d39d 100644 --- a/sklearn/metrics/_classification.py +++ b/sklearn/metrics/_classification.py @@ -3487,7 +3487,7 @@ def brier_score_loss( The smaller the Brier score loss, the better, hence the naming with "loss". The Brier score measures the mean squared difference between the predicted - probability and the actual outcome. The Brier score is a stricly proper scoring + probability and the actual outcome. The Brier score is a strictly proper scoring rule. Read more in the :ref:`User Guide `. From 434010c883a21ecf354385ddb3d730b5c3bf12f4 Mon Sep 17 00:00:00 2001 From: Dimitri Papadopoulos Orfanos <3234522+DimitriPapadopoulos@users.noreply.github.com> Date: Thu, 3 Apr 2025 15:18:56 +0200 Subject: [PATCH 011/182] DOC Remove obsolete comment from doc sources (#31137) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Co-authored-by: Jérémie du Boisberranger --- doc/developers/advanced_installation.rst | 6 ------ 1 file changed, 6 deletions(-) diff --git a/doc/developers/advanced_installation.rst b/doc/developers/advanced_installation.rst index e39490d2292a5..4170961d64404 100644 --- a/doc/developers/advanced_installation.rst +++ b/doc/developers/advanced_installation.rst @@ -150,12 +150,6 @@ Build dependencies Building Scikit-learn also requires: -.. - # The following places need to be in sync with regard to Cython version: - # - .circleci config file - # - sklearn/_build_utils/__init__.py - # - advanced installation guide - - Cython >= |CythonMinVersion| - A C/C++ compiler and a matching OpenMP_ runtime library. See the :ref:`platform system specific instructions From 75cb7c37cb7ef54a40b6fcaf99efd8e75fb0c4a7 Mon Sep 17 00:00:00 2001 From: Hleb Levitski <36483986+glevv@users.noreply.github.com> Date: Thu, 3 Apr 2025 18:12:53 +0300 Subject: [PATCH 012/182] FIX Fix adjusted_mutual_info_score numerical issue (#31065) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Co-authored-by: Loïc Estève --- .../sklearn.metrics/31065.fix.rst | 3 + sklearn/metrics/cluster/_supervised.py | 12 +- .../metrics/cluster/tests/test_supervised.py | 106 ++++++++++-------- 3 files changed, 71 insertions(+), 50 deletions(-) create mode 100644 doc/whats_new/upcoming_changes/sklearn.metrics/31065.fix.rst diff --git a/doc/whats_new/upcoming_changes/sklearn.metrics/31065.fix.rst b/doc/whats_new/upcoming_changes/sklearn.metrics/31065.fix.rst new file mode 100644 index 0000000000000..82126da7852cc --- /dev/null +++ b/doc/whats_new/upcoming_changes/sklearn.metrics/31065.fix.rst @@ -0,0 +1,3 @@ +- Fix :func:`metrics.adjusted_mutual_info_score` numerical issue when number of + classes and samples is low. + By :user:`Hleb Levitski ` diff --git a/sklearn/metrics/cluster/_supervised.py b/sklearn/metrics/cluster/_supervised.py index 0f56513abca8e..bb903b70749dd 100644 --- a/sklearn/metrics/cluster/_supervised.py +++ b/sklearn/metrics/cluster/_supervised.py @@ -1033,6 +1033,9 @@ def adjusted_mutual_info_score( or classes.shape[0] == clusters.shape[0] == 0 ): return 1.0 + # if there is only one class or one cluster return 0.0. + elif classes.shape[0] == 1 or clusters.shape[0] == 1: + return 0.0 contingency = contingency_matrix(labels_true, labels_pred, sparse=True) # Calculate the MI for the two clusterings @@ -1051,8 +1054,13 @@ def adjusted_mutual_info_score( denominator = min(denominator, -np.finfo("float64").eps) else: denominator = max(denominator, np.finfo("float64").eps) - ami = (mi - emi) / denominator - return float(ami) + # The same applies analogously to mi and emi. + numerator = mi - emi + if numerator < 0: + numerator = min(numerator, -np.finfo("float64").eps) + else: + numerator = max(numerator, np.finfo("float64").eps) + return float(numerator / denominator) @validate_params( diff --git a/sklearn/metrics/cluster/tests/test_supervised.py b/sklearn/metrics/cluster/tests/test_supervised.py index 417ae3ea4897f..6c68c0a85f698 100644 --- a/sklearn/metrics/cluster/tests/test_supervised.py +++ b/sklearn/metrics/cluster/tests/test_supervised.py @@ -40,21 +40,19 @@ ] -def test_error_messages_on_wrong_input(): - for score_func in score_funcs: - expected = ( - r"Found input variables with inconsistent numbers of samples: \[2, 3\]" - ) - with pytest.raises(ValueError, match=expected): - score_func([0, 1], [1, 1, 1]) +@pytest.mark.parametrize("score_func", score_funcs) +def test_error_messages_on_wrong_input(score_func): + expected = r"Found input variables with inconsistent numbers of samples: \[2, 3\]" + with pytest.raises(ValueError, match=expected): + score_func([0, 1], [1, 1, 1]) - expected = r"labels_true must be 1D: shape is \(2" - with pytest.raises(ValueError, match=expected): - score_func([[0, 1], [1, 0]], [1, 1, 1]) + expected = r"labels_true must be 1D: shape is \(2" + with pytest.raises(ValueError, match=expected): + score_func([[0, 1], [1, 0]], [1, 1, 1]) - expected = r"labels_pred must be 1D: shape is \(2" - with pytest.raises(ValueError, match=expected): - score_func([0, 1, 0], [[1, 1], [0, 0]]) + expected = r"labels_pred must be 1D: shape is \(2" + with pytest.raises(ValueError, match=expected): + score_func([0, 1, 0], [[1, 1], [0, 0]]) def test_generalized_average(): @@ -67,39 +65,50 @@ def test_generalized_average(): assert means[0] == means[1] == means[2] == means[3] -def test_perfect_matches(): - for score_func in score_funcs: - assert score_func([], []) == pytest.approx(1.0) - assert score_func([0], [1]) == pytest.approx(1.0) - assert score_func([0, 0, 0], [0, 0, 0]) == pytest.approx(1.0) - assert score_func([0, 1, 0], [42, 7, 42]) == pytest.approx(1.0) - assert score_func([0.0, 1.0, 0.0], [42.0, 7.0, 42.0]) == pytest.approx(1.0) - assert score_func([0.0, 1.0, 2.0], [42.0, 7.0, 2.0]) == pytest.approx(1.0) - assert score_func([0, 1, 2], [42, 7, 2]) == pytest.approx(1.0) - score_funcs_with_changing_means = [ +@pytest.mark.parametrize("score_func", score_funcs) +def test_perfect_matches(score_func): + assert score_func([], []) == pytest.approx(1.0) + assert score_func([0], [1]) == pytest.approx(1.0) + assert score_func([0, 0, 0], [0, 0, 0]) == pytest.approx(1.0) + assert score_func([0, 1, 0], [42, 7, 42]) == pytest.approx(1.0) + assert score_func([0.0, 1.0, 0.0], [42.0, 7.0, 42.0]) == pytest.approx(1.0) + assert score_func([0.0, 1.0, 2.0], [42.0, 7.0, 2.0]) == pytest.approx(1.0) + assert score_func([0, 1, 2], [42, 7, 2]) == pytest.approx(1.0) + + +@pytest.mark.parametrize( + "score_func", + [ normalized_mutual_info_score, adjusted_mutual_info_score, - ] - means = {"min", "geometric", "arithmetic", "max"} - for score_func in score_funcs_with_changing_means: - for mean in means: - assert score_func([], [], average_method=mean) == pytest.approx(1.0) - assert score_func([0], [1], average_method=mean) == pytest.approx(1.0) - assert score_func( - [0, 0, 0], [0, 0, 0], average_method=mean - ) == pytest.approx(1.0) - assert score_func( - [0, 1, 0], [42, 7, 42], average_method=mean - ) == pytest.approx(1.0) - assert score_func( - [0.0, 1.0, 0.0], [42.0, 7.0, 42.0], average_method=mean - ) == pytest.approx(1.0) - assert score_func( - [0.0, 1.0, 2.0], [42.0, 7.0, 2.0], average_method=mean - ) == pytest.approx(1.0) - assert score_func( - [0, 1, 2], [42, 7, 2], average_method=mean - ) == pytest.approx(1.0) + ], +) +@pytest.mark.parametrize("average_method", ["min", "geometric", "arithmetic", "max"]) +def test_perfect_matches_with_changing_means(score_func, average_method): + assert score_func([], [], average_method=average_method) == pytest.approx(1.0) + assert score_func([0], [1], average_method=average_method) == pytest.approx(1.0) + assert score_func( + [0, 0, 0], [0, 0, 0], average_method=average_method + ) == pytest.approx(1.0) + assert score_func( + [0, 1, 0], [42, 7, 42], average_method=average_method + ) == pytest.approx(1.0) + assert score_func( + [0.0, 1.0, 0.0], [42.0, 7.0, 42.0], average_method=average_method + ) == pytest.approx(1.0) + assert score_func( + [0.0, 1.0, 2.0], [42.0, 7.0, 2.0], average_method=average_method + ) == pytest.approx(1.0) + assert score_func( + [0, 1, 2], [42, 7, 2], average_method=average_method + ) == pytest.approx(1.0) + # Non-regression tests for: https://github.com/scikit-learn/scikit-learn/issues/30950 + assert score_func([0, 1], [0, 1], average_method=average_method) == pytest.approx( + 1.0 + ) + assert score_func( + [0, 1, 2, 3], [0, 1, 2, 3], average_method=average_method + ) == pytest.approx(1.0) def test_homogeneous_but_not_complete_labeling(): @@ -306,12 +315,13 @@ def test_exactly_zero_info_score(): labels_a, labels_b = (np.ones(i, dtype=int), np.arange(i, dtype=int)) assert normalized_mutual_info_score(labels_a, labels_b) == pytest.approx(0.0) assert v_measure_score(labels_a, labels_b) == pytest.approx(0.0) - assert adjusted_mutual_info_score(labels_a, labels_b) == pytest.approx(0.0) + assert adjusted_mutual_info_score(labels_a, labels_b) == 0.0 assert normalized_mutual_info_score(labels_a, labels_b) == pytest.approx(0.0) for method in ["min", "geometric", "arithmetic", "max"]: - assert adjusted_mutual_info_score( - labels_a, labels_b, average_method=method - ) == pytest.approx(0.0) + assert ( + adjusted_mutual_info_score(labels_a, labels_b, average_method=method) + == 0.0 + ) assert normalized_mutual_info_score( labels_a, labels_b, average_method=method ) == pytest.approx(0.0) From a6efcaf2e9e8592ab870f4cde7f64f096bd4c299 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?J=C3=A9r=C3=A9mie=20du=20Boisberranger?= Date: Thu, 3 Apr 2025 22:50:49 +0200 Subject: [PATCH 013/182] MNT Clean-up deprecations for 1.7: y_prob in brier_score_loss (#31141) --- sklearn/metrics/_classification.py | 31 ++------------------ sklearn/metrics/tests/test_classification.py | 23 --------------- 2 files changed, 2 insertions(+), 52 deletions(-) diff --git a/sklearn/metrics/_classification.py b/sklearn/metrics/_classification.py index 0175b4760d39d..30dd53bc16109 100644 --- a/sklearn/metrics/_classification.py +++ b/sklearn/metrics/_classification.py @@ -3464,24 +3464,22 @@ def _validate_binary_probabilistic_prediction(y_true, y_prob, sample_weight, pos @validate_params( { "y_true": ["array-like"], - "y_proba": ["array-like", Hidden(None)], + "y_proba": ["array-like"], "sample_weight": ["array-like", None], "pos_label": [Real, str, "boolean", None], "labels": ["array-like", None], "scale_by_half": ["boolean", StrOptions({"auto"})], - "y_prob": ["array-like", Hidden(StrOptions({"deprecated"}))], }, prefer_skip_nested_validation=True, ) def brier_score_loss( y_true, - y_proba=None, + y_proba, *, sample_weight=None, pos_label=None, labels=None, scale_by_half="auto", - y_prob="deprecated", ): r"""Compute the Brier score loss. @@ -3533,13 +3531,6 @@ def brier_score_loss( .. versionadded:: 1.7 - y_prob : array-like of shape (n_samples,) - Probabilities of the positive class. - - .. deprecated:: 1.5 - `y_prob` is deprecated and will be removed in 1.7. Use - `y_proba` instead. - Returns ------- score : float @@ -3598,24 +3589,6 @@ def brier_score_loss( ... ) 0.146... """ - # TODO(1.7): remove in 1.7 and reset y_proba to be required - # Note: validate params will raise an error if y_prob is not array-like, - # or "deprecated" - if y_proba is not None and not isinstance(y_prob, str): - raise ValueError( - "`y_prob` and `y_proba` cannot be both specified. Please use `y_proba` only" - " as `y_prob` is deprecated in v1.5 and will be removed in v1.7." - ) - if y_proba is None: - warnings.warn( - ( - "y_prob was deprecated in version 1.5 and will be removed in 1.7." - "Please use ``y_proba`` instead." - ), - FutureWarning, - ) - y_proba = y_prob - y_proba = check_array( y_proba, ensure_2d=False, dtype=[np.float64, np.float32, np.float16] ) diff --git a/sklearn/metrics/tests/test_classification.py b/sklearn/metrics/tests/test_classification.py index 0c79420e3cb6f..13fe8b3deb88e 100644 --- a/sklearn/metrics/tests/test_classification.py +++ b/sklearn/metrics/tests/test_classification.py @@ -3166,29 +3166,6 @@ def test_classification_metric_division_by_zero_nan_validaton(scoring): cross_val_score(classifier, X, y, scoring=scoring, n_jobs=2, error_score="raise") -# TODO(1.7): remove -def test_brier_score_loss_deprecation_warning(): - """Check the message for future deprecation.""" - # Check brier_score_loss function - y_true = np.array([0, 1, 1, 0, 1, 1]) - y_pred = np.array([0.1, 0.8, 0.9, 0.3, 1.0, 0.95]) - - warn_msg = "y_prob was deprecated in version 1.5" - with pytest.warns(FutureWarning, match=warn_msg): - brier_score_loss( - y_true, - y_prob=y_pred, - ) - - error_msg = "`y_prob` and `y_proba` cannot be both specified" - with pytest.raises(ValueError, match=error_msg): - brier_score_loss( - y_true, - y_prob=y_pred, - y_proba=y_pred, - ) - - def test_d2_log_loss_score(): y_true = [0, 0, 0, 1, 1, 1] y_true_string = ["no", "no", "no", "yes", "yes", "yes"] From bb261bfd23e6d2085e6c7497290e39f46a64d1ac Mon Sep 17 00:00:00 2001 From: EmilyXinyi <52259856+EmilyXinyi@users.noreply.github.com> Date: Fri, 4 Apr 2025 07:58:55 -0400 Subject: [PATCH 014/182] Add array API support for _weighted_percentile (#29431) Co-authored-by: Olivier Grisel Co-authored-by: Lucy Liu --- sklearn/utils/stats.py | 99 +++++++++++++---------- sklearn/utils/tests/test_stats.py | 129 ++++++++++++++++++++++++++---- 2 files changed, 170 insertions(+), 58 deletions(-) diff --git a/sklearn/utils/stats.py b/sklearn/utils/stats.py index 8fdcfdb9decd2..d665ee449f388 100644 --- a/sklearn/utils/stats.py +++ b/sklearn/utils/stats.py @@ -1,12 +1,13 @@ # Authors: The scikit-learn developers # SPDX-License-Identifier: BSD-3-Clause -import numpy as np +from ..utils._array_api import ( + _find_matching_floating_dtype, + get_namespace_and_device, +) -from .extmath import stable_cumsum - -def _weighted_percentile(array, sample_weight, percentile_rank=50): +def _weighted_percentile(array, sample_weight, percentile_rank=50, xp=None): """Compute the weighted percentile with method 'inverted_cdf'. When the percentile lies between two data points of `array`, the function returns @@ -37,63 +38,77 @@ def _weighted_percentile(array, sample_weight, percentile_rank=50): The probability level of the percentile to compute, in percent. Must be between 0 and 100. + xp : array_namespace, default=None + The standard-compatible namespace for `array`. Default: infer. + Returns ------- - percentile : int if `array` 1D, ndarray if `array` 2D + percentile : scalar or 0D array if `array` 1D (or 0D), array if `array` 2D Weighted percentile at the requested probability level. """ + xp, _, device = get_namespace_and_device(array) + # `sample_weight` should follow `array` for dtypes + floating_dtype = _find_matching_floating_dtype(array, xp=xp) + array = xp.asarray(array, dtype=floating_dtype, device=device) + sample_weight = xp.asarray(sample_weight, dtype=floating_dtype, device=device) + n_dim = array.ndim if n_dim == 0: - return array[()] + return array if array.ndim == 1: - array = array.reshape((-1, 1)) + array = xp.reshape(array, (-1, 1)) # When sample_weight 1D, repeat for each array.shape[1] if array.shape != sample_weight.shape and array.shape[0] == sample_weight.shape[0]: - sample_weight = np.tile(sample_weight, (array.shape[1], 1)).T - + sample_weight = xp.tile(sample_weight, (array.shape[1], 1)).T # Sort `array` and `sample_weight` along axis=0: - sorted_idx = np.argsort(array, axis=0) - sorted_weights = np.take_along_axis(sample_weight, sorted_idx, axis=0) + sorted_idx = xp.argsort(array, axis=0) + sorted_weights = xp.take_along_axis(sample_weight, sorted_idx, axis=0) - # Set NaN values in `sample_weight` to 0. We only perform this operation if NaN - # values are present at all to avoid temporary allocations of size `(n_samples, - # n_features)`. If NaN values were present, they would sort to the end (which we can - # observe from `sorted_idx`). + # Set NaN values in `sample_weight` to 0. Only perform this operation if NaN + # values present to avoid temporary allocations of size `(n_samples, n_features)`. n_features = array.shape[1] - largest_value_per_column = array[sorted_idx[-1, ...], np.arange(n_features)] - if np.isnan(largest_value_per_column).any(): - sorted_nan_mask = np.take_along_axis(np.isnan(array), sorted_idx, axis=0) + largest_value_per_column = array[ + sorted_idx[-1, ...], xp.arange(n_features, device=device) + ] + # NaN values get sorted to end (largest value) + if xp.any(xp.isnan(largest_value_per_column)): + sorted_nan_mask = xp.take_along_axis(xp.isnan(array), sorted_idx, axis=0) sorted_weights[sorted_nan_mask] = 0 # Compute the weighted cumulative distribution function (CDF) based on - # sample_weight and scale percentile_rank along it: - weight_cdf = stable_cumsum(sorted_weights, axis=0) - adjusted_percentile_rank = percentile_rank / 100 * weight_cdf[-1] - - # For percentile_rank=0, ignore leading observations with sample_weight=0; see - # PR #20528: + # `sample_weight` and scale `percentile_rank` along it. + # + # Note: we call `xp.cumulative_sum` on the transposed `sorted_weights` to + # ensure that the result is of shape `(n_features, n_samples)` so + # `xp.searchsorted` calls take contiguous inputs as a result (for + # performance reasons). + weight_cdf = xp.cumulative_sum(sorted_weights.T, axis=1) + adjusted_percentile_rank = percentile_rank / 100 * weight_cdf[..., -1] + + # Ignore leading `sample_weight=0` observations when `percentile_rank=0` (#20528) mask = adjusted_percentile_rank == 0 - adjusted_percentile_rank[mask] = np.nextafter( + adjusted_percentile_rank[mask] = xp.nextafter( adjusted_percentile_rank[mask], adjusted_percentile_rank[mask] + 1 ) - - # Find index (i) of `adjusted_percentile` in `weight_cdf`, - # such that weight_cdf[i-1] < percentile <= weight_cdf[i] - percentile_idx = np.array( + # For each feature with index j, find sample index i of the scalar value + # `adjusted_percentile_rank[j]` in 1D array `weight_cdf[j]`, such that: + # weight_cdf[j, i-1] < adjusted_percentile_rank[j] <= weight_cdf[j, i]. + percentile_indices = xp.asarray( [ - np.searchsorted(weight_cdf[:, i], adjusted_percentile_rank[i]) - for i in range(weight_cdf.shape[1]) - ] + xp.searchsorted( + weight_cdf[feature_idx, ...], adjusted_percentile_rank[feature_idx] + ) + for feature_idx in range(weight_cdf.shape[0]) + ], + device=device, ) - - # In rare cases, percentile_idx equals to sorted_idx.shape[0]: + # In rare cases, `percentile_indices` equals to `sorted_idx.shape[0]` max_idx = sorted_idx.shape[0] - 1 - percentile_idx = np.apply_along_axis( - lambda x: np.clip(x, 0, max_idx), axis=0, arr=percentile_idx - ) + percentile_indices = xp.clip(percentile_indices, 0, max_idx) + + col_indices = xp.arange(array.shape[1], device=device) + percentile_in_sorted = sorted_idx[percentile_indices, col_indices] - col_indices = np.arange(array.shape[1]) - percentile_in_sorted = sorted_idx[percentile_idx, col_indices] result = array[percentile_in_sorted, col_indices] return result[0] if n_dim == 1 else result @@ -101,8 +116,8 @@ def _weighted_percentile(array, sample_weight, percentile_rank=50): # TODO: refactor to do the symmetrisation inside _weighted_percentile to avoid # sorting the input array twice. -def _averaged_weighted_percentile(array, sample_weight, percentile_rank=50): +def _averaged_weighted_percentile(array, sample_weight, percentile_rank=50, xp=None): return ( - _weighted_percentile(array, sample_weight, percentile_rank) - - _weighted_percentile(-array, sample_weight, 100 - percentile_rank) + _weighted_percentile(array, sample_weight, percentile_rank, xp=xp) + - _weighted_percentile(-array, sample_weight, 100 - percentile_rank, xp=xp) ) / 2 diff --git a/sklearn/utils/tests/test_stats.py b/sklearn/utils/tests/test_stats.py index 5e5a01e05426c..ec60a1358e440 100644 --- a/sklearn/utils/tests/test_stats.py +++ b/sklearn/utils/tests/test_stats.py @@ -3,6 +3,14 @@ from numpy.testing import assert_allclose, assert_array_equal from pytest import approx +from sklearn._config import config_context +from sklearn.utils._array_api import ( + _convert_to_numpy, + get_namespace, + yield_namespace_device_dtype_combinations, +) +from sklearn.utils._array_api import device as array_device +from sklearn.utils.estimator_checks import _array_api_for_tests from sklearn.utils.fixes import np_version, parse_version from sklearn.utils.stats import _averaged_weighted_percentile, _weighted_percentile @@ -39,6 +47,7 @@ def test_averaged_and_weighted_percentile(): def test_weighted_percentile(): + """Check `weighted_percentile` on artificial data with obvious median.""" y = np.empty(102, dtype=np.float64) y[:50] = 0 y[-51:] = 2 @@ -51,15 +60,16 @@ def test_weighted_percentile(): def test_weighted_percentile_equal(): + """Check `weighted_percentile` with all weights equal to 1.""" y = np.empty(102, dtype=np.float64) y.fill(0.0) sw = np.ones(102, dtype=np.float64) - sw[-1] = 0.0 - value = _weighted_percentile(y, sw, 50) - assert value == 0 + score = _weighted_percentile(y, sw, 50) + assert approx(score) == 0 def test_weighted_percentile_zero_weight(): + """Check `weighted_percentile` with all weights equal to 0.""" y = np.empty(102, dtype=np.float64) y.fill(1.0) sw = np.ones(102, dtype=np.float64) @@ -69,6 +79,11 @@ def test_weighted_percentile_zero_weight(): def test_weighted_percentile_zero_weight_zero_percentile(): + """Check `weighted_percentile(percentile_rank=0)` behaves correctly. + + Ensures that (leading)zero-weight observations ignored when `percentile_rank=0`. + See #20528 for details. + """ y = np.array([0, 1, 2, 3, 4, 5]) sw = np.array([0, 0, 1, 1, 1, 0]) value = _weighted_percentile(y, sw, 0) @@ -82,18 +97,18 @@ def test_weighted_percentile_zero_weight_zero_percentile(): def test_weighted_median_equal_weights(): - # Checks that `_weighted_percentile` and `np.median` (both at probability level=0.5 - # and with `sample_weights` being all 1s) return the same percentiles if the number - # of the samples in the data is odd. In this special case, `_weighted_percentile` - # always falls on a precise value (not on the next lower value) and is thus equal to - # `np.median`. - # As discussed in #17370, a similar check with an even number of samples does not - # consistently hold, since then the lower of two percentiles might be selected, - # while the median might lie in between. + """Checks `_weighted_percentile(percentile_rank=50)` is the same as `np.median`. + + `sample_weights` are all 1s and the number of samples is odd. + When number of samples is odd, `_weighted_percentile` always falls on a single + observation (not between 2 values, in which case the lower value would be taken) + and is thus equal to `np.median`. + For an even number of samples, this check will not always hold as (note that + for some other percentile methods it will always hold). See #17370 for details. + """ rng = np.random.RandomState(0) x = rng.randint(10, size=11) weights = np.ones(x.shape) - median = np.median(x) w_median = _weighted_percentile(x, weights) assert median == approx(w_median) @@ -106,10 +121,8 @@ def test_weighted_median_integer_weights(): x = rng.randint(20, size=10) weights = rng.choice(5, size=10) x_manual = np.repeat(x, weights) - median = np.median(x_manual) w_median = _weighted_percentile(x, weights) - assert median == approx(w_median) @@ -125,8 +138,7 @@ def test_weighted_percentile_2d(): w_median = _weighted_percentile(x_2d, w1) p_axis_0 = [_weighted_percentile(x_2d[:, i], w1) for i in range(x_2d.shape[1])] assert_allclose(w_median, p_axis_0) - - # Check when array and sample_weight boht 2D + # Check when array and sample_weight both 2D w2 = rng.choice(5, size=10) w_2d = np.vstack((w1, w2)).T @@ -137,6 +149,91 @@ def test_weighted_percentile_2d(): assert_allclose(w_median, p_axis_0) +@pytest.mark.parametrize( + "array_namespace, device, dtype_name", yield_namespace_device_dtype_combinations() +) +@pytest.mark.parametrize( + "data, weights, percentile", + [ + # NumPy scalars input (handled as 0D arrays on array API) + (np.float32(42), np.int32(1), 50), + # Random 1D array, constant weights + (lambda rng: rng.rand(50), np.ones(50).astype(np.int32), 50), + # Random 2D array and random 1D weights + (lambda rng: rng.rand(50, 3), lambda rng: rng.rand(50).astype(np.float32), 75), + # Random 2D array and random 2D weights + ( + lambda rng: rng.rand(20, 3), + lambda rng: rng.rand(20, 3).astype(np.float32), + 25, + ), + # zero-weights and `rank_percentile=0` (#20528) (`sample_weight` dtype: int64) + (np.array([0, 1, 2, 3, 4, 5]), np.array([0, 0, 1, 1, 1, 0]), 0), + # np.nan's in data and some zero-weights (`sample_weight` dtype: int64) + (np.array([np.nan, np.nan, 0, 3, 4, 5]), np.array([0, 1, 1, 1, 1, 0]), 0), + # `sample_weight` dtype: int32 + ( + np.array([0, 1, 2, 3, 4, 5]), + np.array([0, 1, 1, 1, 1, 0], dtype=np.int32), + 25, + ), + ], +) +def test_weighted_percentile_array_api_consistency( + global_random_seed, array_namespace, device, dtype_name, data, weights, percentile +): + """Check `_weighted_percentile` gives consistent results with array API.""" + if array_namespace == "array_api_strict": + try: + import array_api_strict + except ImportError: + pass + else: + if device == array_api_strict.Device("device1"): + # See https://github.com/data-apis/array-api-strict/issues/134 + pytest.xfail( + "array_api_strict has bug when indexing with tuple of arrays " + "on non-'CPU_DEVICE' devices." + ) + + xp = _array_api_for_tests(array_namespace, device) + + # Skip test for percentile=0 edge case (#20528) on namespace/device where + # xp.nextafter is broken. This is the case for torch with MPS device: + # https://github.com/pytorch/pytorch/issues/150027 + zero = xp.zeros(1, device=device) + one = xp.ones(1, device=device) + if percentile == 0 and xp.all(xp.nextafter(zero, one) == zero): + pytest.xfail(f"xp.nextafter is broken on {device}") + + rng = np.random.RandomState(global_random_seed) + X_np = data(rng) if callable(data) else data + weights_np = weights(rng) if callable(weights) else weights + # Ensure `data` of correct dtype + X_np = X_np.astype(dtype_name) + + result_np = _weighted_percentile(X_np, weights_np, percentile) + # Convert to Array API arrays + X_xp = xp.asarray(X_np, device=device) + weights_xp = xp.asarray(weights_np, device=device) + + with config_context(array_api_dispatch=True): + result_xp = _weighted_percentile(X_xp, weights_xp, percentile) + assert array_device(result_xp) == array_device(X_xp) + assert get_namespace(result_xp)[0] == get_namespace(X_xp)[0] + result_xp_np = _convert_to_numpy(result_xp, xp=xp) + + assert result_xp_np.dtype == result_np.dtype + assert result_xp_np.shape == result_np.shape + assert_allclose(result_np, result_xp_np) + + # Check dtype correct (`sample_weight` should follow `array`) + if dtype_name == "float32": + assert result_xp_np.dtype == result_np.dtype == np.float32 + else: + assert result_xp_np.dtype == np.float64 + + @pytest.mark.parametrize("sample_weight_ndim", [1, 2]) def test_weighted_percentile_nan_filtered(sample_weight_ndim): """Test that calling _weighted_percentile on an array with nan values returns From 5b671f76957bea1b51bd191ceb185e3d8e594c09 Mon Sep 17 00:00:00 2001 From: Dimitri Papadopoulos Orfanos <3234522+DimitriPapadopoulos@users.noreply.github.com> Date: Fri, 4 Apr 2025 14:46:52 +0200 Subject: [PATCH 015/182] DOC Clean up build dependencies (#31142) --- doc/developers/advanced_installation.rst | 58 ++++-------------------- 1 file changed, 9 insertions(+), 49 deletions(-) diff --git a/doc/developers/advanced_installation.rst b/doc/developers/advanced_installation.rst index 4170961d64404..0b2aa30efb757 100644 --- a/doc/developers/advanced_installation.rst +++ b/doc/developers/advanced_installation.rst @@ -98,6 +98,15 @@ feature, code or documentation improvement). for :ref:`compiler_windows`, :ref:`compiler_macos`, :ref:`compiler_linux` and :ref:`compiler_freebsd`. + .. note:: + + If OpenMP is not supported by the compiler, the build will be done with + OpenMP functionalities disabled. This is not recommended since it will force + some estimators to run in sequential mode instead of leveraging thread-based + parallelism. Setting the ``SKLEARN_FAIL_NO_OPENMP`` environment variable + (before cythonization) will force the build to fail if OpenMP is not + supported. + #. Build the project with pip: .. prompt:: bash $ @@ -130,55 +139,6 @@ feature, code or documentation improvement). Note that `--config-settings` is only supported in `pip` version 23.1 or later. To upgrade `pip` to a compatible version, run `pip install -U pip`. -Dependencies ------------- - -Runtime dependencies -~~~~~~~~~~~~~~~~~~~~ - -Scikit-learn requires the following dependencies both at build time and at -runtime: - -- Python (>= |PythonMinVersion|), -- NumPy (>= |NumpyMinVersion|), -- SciPy (>= |ScipyMinVersion|), -- Joblib (>= |JoblibMinVersion|), -- threadpoolctl (>= |ThreadpoolctlMinVersion|). - -Build dependencies -~~~~~~~~~~~~~~~~~~ - -Building Scikit-learn also requires: - -- Cython >= |CythonMinVersion| -- A C/C++ compiler and a matching OpenMP_ runtime library. See the - :ref:`platform system specific instructions - ` for more details. - -.. note:: - - If OpenMP is not supported by the compiler, the build will be done with - OpenMP functionalities disabled. This is not recommended since it will force - some estimators to run in sequential mode instead of leveraging thread-based - parallelism. Setting the ``SKLEARN_FAIL_NO_OPENMP`` environment variable - (before cythonization) will force the build to fail if OpenMP is not - supported. - -Since version 0.21, scikit-learn automatically detects and uses the linear -algebra library used by SciPy **at runtime**. Scikit-learn has therefore no -build dependency on BLAS/LAPACK implementations such as OpenBlas, Atlas, Blis -or MKL. - -Test dependencies -~~~~~~~~~~~~~~~~~ - -Running tests requires: - -- pytest >= |PytestMinVersion| - -Some tests also require `pandas `_. - - Building a specific version from a tag -------------------------------------- From 424727300d9fd557d3c047d574e7b34ea6dedf8d Mon Sep 17 00:00:00 2001 From: "Christine P. Chai" Date: Fri, 4 Apr 2025 07:57:21 -0700 Subject: [PATCH 016/182] DOC Add a cross-ref link to oversubscription section (#31136) --- doc/computing/parallelism.rst | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/doc/computing/parallelism.rst b/doc/computing/parallelism.rst index e6a5a983db80c..d2ff106aec3be 100644 --- a/doc/computing/parallelism.rst +++ b/doc/computing/parallelism.rst @@ -72,7 +72,7 @@ In practice, whether parallelism is helpful at improving runtime depends on many factors. It is usually a good idea to experiment rather than assuming that increasing the number of workers is always a good thing. In some cases it can be highly detrimental to performance to run multiple copies of some -estimators or functions in parallel (see oversubscription below). +estimators or functions in parallel (see :ref:`oversubscription` below). Lower-level parallelism with OpenMP ................................... @@ -127,6 +127,8 @@ for different values of `OMP_NUM_THREADS`: are linked by default with MKL. +.. _oversubscription: + Oversubscription: spawning too many threads ........................................... From ed590c5b184995ca5675825a5d9634ab30f1f909 Mon Sep 17 00:00:00 2001 From: Lucy Liu Date: Sat, 5 Apr 2025 02:16:24 +1100 Subject: [PATCH 017/182] DOC Improve `pairwise_kernel` docstring (#31103) --- sklearn/metrics/pairwise.py | 18 ++++++++++++------ 1 file changed, 12 insertions(+), 6 deletions(-) diff --git a/sklearn/metrics/pairwise.py b/sklearn/metrics/pairwise.py index c3e87b2452078..cec24a1e8924b 100644 --- a/sklearn/metrics/pairwise.py +++ b/sklearn/metrics/pairwise.py @@ -2575,17 +2575,23 @@ def pairwise_kernels( ): """Compute the kernel between arrays X and optional array Y. - This method takes either a vector array or a kernel matrix, and returns - a kernel matrix. If the input is a vector array, the kernels are - computed. If the input is a kernel matrix, it is returned instead. + This method takes one or two vector arrays or a kernel matrix, and returns + a kernel matrix. + + - If `X` is a vector array, of shape (n_samples_X, n_features), and: + + - `Y` is `None` and `metric` is not 'precomputed', the pairwise kernels + between `X` and itself are computed. + - `Y` is a vector array of shape (n_samples_Y, n_features), the pairwise + kernels between arrays `X` and `Y` is returned. + + - If `X` is a kernel matrix, of shape (n_samples_X, n_samples_X), `metric` + should be 'precomputed'. `Y` is thus ignored and `X` is returned as is. This method provides a safe way to take a kernel matrix as input, while preserving compatibility with many other algorithms that take a vector array. - If Y is given (default is None), then the returned matrix is the pairwise - kernel between the arrays from both X and Y. - Valid values for metric are: ['additive_chi2', 'chi2', 'linear', 'poly', 'polynomial', 'rbf', 'laplacian', 'sigmoid', 'cosine'] From ff82bda801b07b8d063128d172cec64655097962 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Lo=C3=AFc=20Est=C3=A8ve?= Date: Fri, 4 Apr 2025 17:32:47 +0200 Subject: [PATCH 018/182] CI Fix pyodide wheel testing (#31145) --- .github/workflows/emscripten.yml | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/.github/workflows/emscripten.yml b/.github/workflows/emscripten.yml index 99186c5fb1bee..cd2731a6ceec4 100644 --- a/.github/workflows/emscripten.yml +++ b/.github/workflows/emscripten.yml @@ -67,12 +67,13 @@ jobs: with: persist-credentials: false - - uses: pypa/cibuildwheel@6c426a3a17cfcadf4b6048de53653eba55d7ae4f # v2.23.2 + - uses: pypa/cibuildwheel@d04cacbc9866d432033b1d09142936e6a0e2121a # v2.23.2 env: CIBW_PLATFORM: pyodide SKLEARN_SKIP_OPENMP_TEST: "true" SKLEARN_SKIP_NETWORK_TESTS: 1 CIBW_TEST_REQUIRES: "pytest pandas" + # -s pytest argument is needed to avoid an issue in pytest output capturing with Pyodide CIBW_TEST_COMMAND: "python -m pytest -svra --pyargs sklearn --durations 20 --showlocals" - name: Upload wheel artifact From 00d3ef9f4d7e224e59f9e01f678abb918231858f Mon Sep 17 00:00:00 2001 From: Dimitri Papadopoulos Orfanos <3234522+DimitriPapadopoulos@users.noreply.github.com> Date: Fri, 4 Apr 2025 17:38:57 +0200 Subject: [PATCH 019/182] DOC One version per line, for readability (#31132) --- doc/install.rst | 23 +++++++++++++++++------ 1 file changed, 17 insertions(+), 6 deletions(-) diff --git a/doc/install.rst b/doc/install.rst index de67ed96b67be..9cb50a95a1988 100644 --- a/doc/install.rst +++ b/doc/install.rst @@ -202,12 +202,23 @@ purpose. .. warning:: Scikit-learn 0.20 was the last version to support Python 2.7 and Python 3.4. - Scikit-learn 0.21 supported Python 3.5-3.7. - Scikit-learn 0.22 supported Python 3.5-3.8. - Scikit-learn 0.23-0.24 required Python 3.6 or newer. - Scikit-learn 1.0 supported Python 3.7-3.10. - Scikit-learn 1.1, 1.2 and 1.3 support Python 3.8-3.12 - Scikit-learn 1.4 requires Python 3.9 or newer. + + Scikit-learn 0.21 supported Python 3.5—3.7. + + Scikit-learn 0.22 supported Python 3.5—3.8. + + Scikit-learn 0.23 required Python 3.6—3.8. + + Scikit-learn 0.24 required Python 3.6—3.9. + + Scikit-learn 1.0 supported Python 3.7—3.10. + + Scikit-learn 1.1, 1.2 and 1.3 supported Python 3.8—3.12. + + Scikit-learn 1.4 and 1.5 supported Python 3.9—3.12. + + Scikit-learn 1.6 supported Python 3.9—3.13. + Scikit-learn 1.7 requires Python 3.10 or newer. .. _install_by_distribution: From 4383d869a497705f27933e78ad7bbdde336baf59 Mon Sep 17 00:00:00 2001 From: scikit-learn-bot Date: Mon, 7 Apr 2025 11:10:59 +0200 Subject: [PATCH 020/182] :lock: :robot: CI Update lock files for scipy-dev CI build(s) :lock: :robot: (#31154) Co-authored-by: Lock file bot --- build_tools/azure/pylatest_pip_scipy_dev_linux-64_conda.lock | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/build_tools/azure/pylatest_pip_scipy_dev_linux-64_conda.lock b/build_tools/azure/pylatest_pip_scipy_dev_linux-64_conda.lock index 7a7697fc64aee..80f9a0972c976 100644 --- a/build_tools/azure/pylatest_pip_scipy_dev_linux-64_conda.lock +++ b/build_tools/azure/pylatest_pip_scipy_dev_linux-64_conda.lock @@ -39,7 +39,7 @@ https://repo.anaconda.com/pkgs/main/linux-64/pip-25.0-py313h06a4308_0.conda#cbe2 # pip imagesize @ https://files.pythonhosted.org/packages/ff/62/85c4c919272577931d407be5ba5d71c20f0b616d31a0befe0ae45bb79abd/imagesize-1.4.1-py2.py3-none-any.whl#sha256=0d8d18d08f840c19d0ee7ca1fd82490fdc3729b7ac93f49870406ddde8ef8d8b # pip iniconfig @ https://files.pythonhosted.org/packages/2c/e1/e6716421ea10d38022b952c159d5161ca1193197fb744506875fbb87ea7b/iniconfig-2.1.0-py3-none-any.whl#sha256=9deba5723312380e77435581c6bf4935c94cbfab9b1ed33ef8d238ea168eb760 # pip markupsafe @ https://files.pythonhosted.org/packages/0c/91/96cf928db8236f1bfab6ce15ad070dfdd02ed88261c2afafd4b43575e9e9/MarkupSafe-3.0.2-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl#sha256=15ab75ef81add55874e7ab7055e9c397312385bd9ced94920f2802310c930396 -# pip meson @ https://files.pythonhosted.org/packages/ab/3b/63fdad828b4cbeb49cef3aad26f3edfbc72f37a0ab54917d445ec0b9d9ff/meson-1.7.0-py3-none-any.whl#sha256=ae3f12953045f3c7c60e27f2af1ad862f14dee125b4ed9bcb8a842a5080dbf85 +# pip meson @ https://files.pythonhosted.org/packages/e5/2b/46bda4ef5a7ae4135dbfe27fc0368c44e5a349a897a54fdf2cedb8dcb66e/meson-1.7.2-py3-none-any.whl#sha256=82c6818dc81743c96de3a458f06175776ebfde4081195ea31ea6971838f25e38 # pip ninja @ https://files.pythonhosted.org/packages/eb/7a/455d2877fe6cf99886849c7f9755d897df32eaf3a0fba47b56e615f880f7/ninja-1.11.1.4-py3-none-manylinux_2_12_x86_64.manylinux2010_x86_64.whl#sha256=096487995473320de7f65d622c3f1d16c3ad174797602218ca8c967f51ec38a0 # pip packaging @ https://files.pythonhosted.org/packages/88/ef/eb23f262cca3c0c4eb7ab1933c3b1f03d021f2c48f54763065b6f0e321be/packaging-24.2-py3-none-any.whl#sha256=09abb1bccd265c01f4a3aa3f7a7db064b36514d2cba19a2f694fe6150451a759 # pip platformdirs @ https://files.pythonhosted.org/packages/6d/45/59578566b3275b8fd9157885918fcd0c4d74162928a5310926887b856a51/platformdirs-4.3.7-py3-none-any.whl#sha256=a03875334331946f13c549dbd8f4bac7a13a50a895a0eb1e8c6a8ace80d40a94 @@ -64,7 +64,7 @@ https://repo.anaconda.com/pkgs/main/linux-64/pip-25.0-py313h06a4308_0.conda#cbe2 # pip requests @ https://files.pythonhosted.org/packages/f9/9b/335f9764261e915ed497fcdeb11df5dfd6f7bf257d4a6a2a686d80da4d54/requests-2.32.3-py3-none-any.whl#sha256=70761cfe03c773ceb22aa2f671b4757976145175cdfca038c02654d061d6dcc6 # pip meson-python @ https://files.pythonhosted.org/packages/7d/ec/40c0ddd29ef4daa6689a2b9c5ced47d5b58fa54ae149b19e9a97f4979c8c/meson_python-0.17.1-py3-none-any.whl#sha256=30a75c52578ef14aff8392677b09c39346e0a24d2b2c6204b8ed30583c11269c # pip pooch @ https://files.pythonhosted.org/packages/a8/87/77cc11c7a9ea9fd05503def69e3d18605852cd0d4b0d3b8f15bbeb3ef1d1/pooch-1.8.2-py3-none-any.whl#sha256=3529a57096f7198778a5ceefd5ac3ef0e4d06a6ddaf9fc2d609b806f25302c47 -# pip pytest-cov @ https://files.pythonhosted.org/packages/36/3b/48e79f2cd6a61dbbd4807b4ed46cb564b4fd50a76166b1c4ea5c1d9e2371/pytest_cov-6.0.0-py3-none-any.whl#sha256=eee6f1b9e61008bd34975a4d5bab25801eb31898b032dd55addc93e96fcaaa35 +# pip pytest-cov @ https://files.pythonhosted.org/packages/28/d0/def53b4a790cfb21483016430ed828f64830dd981ebe1089971cd10cab25/pytest_cov-6.1.1-py3-none-any.whl#sha256=bddf29ed2d0ab6f4df17b4c55b0a657287db8684af9c42ea546b21b1041b3dde # pip pytest-xdist @ https://files.pythonhosted.org/packages/6d/82/1d96bf03ee4c0fdc3c0cbe61470070e659ca78dc0086fb88b66c185e2449/pytest_xdist-3.6.1-py3-none-any.whl#sha256=9ed4adfb68a016610848639bb7e02c9352d5d9f03d04809919e2dafc3be4cca7 # pip sphinx @ https://files.pythonhosted.org/packages/2f/72/9a437a9dc5393c0eabba447bdb6233a7b02bb23e84975f17ad9a9ca86677/sphinx-8.3.0-py3-none-any.whl#sha256=bd8fcf35ab2c4240b01c74a411c948350a3aebd6aa175579363754ed380d350a # pip numpydoc @ https://files.pythonhosted.org/packages/6c/45/56d99ba9366476cd8548527667f01869279cedb9e66b28eb4dfb27701679/numpydoc-1.8.0-py3-none-any.whl#sha256=72024c7fd5e17375dec3608a27c03303e8ad00c81292667955c6fea7a3ccf541 From 252c467bc57354503a282155453306c4dfa154fb Mon Sep 17 00:00:00 2001 From: scikit-learn-bot Date: Mon, 7 Apr 2025 11:13:08 +0200 Subject: [PATCH 021/182] :lock: :robot: CI Update lock files for main CI build(s) :lock: :robot: (#31156) Co-authored-by: Lock file bot --- build_tools/azure/debian_32bit_lock.txt | 4 +- ...latest_conda_forge_mkl_linux-64_conda.lock | 82 +++++++++---------- ...pylatest_conda_forge_mkl_osx-64_conda.lock | 46 +++++------ ...test_conda_mkl_no_openmp_osx-64_conda.lock | 4 +- ...st_pip_openblas_pandas_linux-64_conda.lock | 10 +-- .../pymin_conda_forge_mkl_win-64_conda.lock | 28 +++---- ...nblas_min_dependencies_linux-64_conda.lock | 39 +++++---- ...e_openblas_ubuntu_2204_linux-64_conda.lock | 12 +-- build_tools/azure/ubuntu_atlas_lock.txt | 2 +- build_tools/circle/doc_linux-64_conda.lock | 48 +++++------ .../doc_min_dependencies_linux-64_conda.lock | 51 ++++++------ ...n_conda_forge_arm_linux-aarch64_conda.lock | 34 ++++---- 12 files changed, 179 insertions(+), 181 deletions(-) diff --git a/build_tools/azure/debian_32bit_lock.txt b/build_tools/azure/debian_32bit_lock.txt index a0793f19ce69a..1b990ab021db0 100644 --- a/build_tools/azure/debian_32bit_lock.txt +++ b/build_tools/azure/debian_32bit_lock.txt @@ -12,7 +12,7 @@ iniconfig==2.1.0 # via pytest joblib==1.4.2 # via -r build_tools/azure/debian_32bit_requirements.txt -meson==1.7.0 +meson==1.7.2 # via meson-python meson-python==0.17.1 # via -r build_tools/azure/debian_32bit_requirements.txt @@ -31,7 +31,7 @@ pytest==8.3.5 # via # -r build_tools/azure/debian_32bit_requirements.txt # pytest-cov -pytest-cov==6.0.0 +pytest-cov==6.1.1 # via -r build_tools/azure/debian_32bit_requirements.txt threadpoolctl==3.6.0 # via -r build_tools/azure/debian_32bit_requirements.txt diff --git a/build_tools/azure/pylatest_conda_forge_mkl_linux-64_conda.lock b/build_tools/azure/pylatest_conda_forge_mkl_linux-64_conda.lock index c98790e49dd11..a9ea47c37078e 100644 --- a/build_tools/azure/pylatest_conda_forge_mkl_linux-64_conda.lock +++ b/build_tools/azure/pylatest_conda_forge_mkl_linux-64_conda.lock @@ -9,28 +9,28 @@ https://conda.anaconda.org/conda-forge/noarch/font-ttf-source-code-pro-2.038-h77 https://conda.anaconda.org/conda-forge/noarch/font-ttf-ubuntu-0.83-h77eed37_3.conda#49023d73832ef61042f6a237cb2687e7 https://conda.anaconda.org/conda-forge/linux-64/libopentelemetry-cpp-headers-1.19.0-ha770c72_0.conda#6a85954c6b124241afa7d3d1897321e2 https://conda.anaconda.org/conda-forge/linux-64/mkl-include-2024.2.2-ha957f24_16.conda#42b0d14354b5910a9f41e29289914f6b -https://conda.anaconda.org/conda-forge/linux-64/python_abi-3.13-5_cp313.conda#381bbd2a92c863f640a55b6ff3c35161 +https://conda.anaconda.org/conda-forge/linux-64/python_abi-3.13-6_cp313.conda#ef1d8e55d61220011cceed0b94a920d2 https://conda.anaconda.org/conda-forge/noarch/tzdata-2025b-h78e105d_0.conda#4222072737ccff51314b5ece9c7d6f5a https://conda.anaconda.org/conda-forge/noarch/fonts-conda-forge-1-0.tar.bz2#f766549260d6815b0c52253f1fb1bb29 https://conda.anaconda.org/conda-forge/linux-64/ld_impl_linux-64-2.43-h712a8e2_4.conda#01f8d123c96816249efd255a31ad7712 https://conda.anaconda.org/conda-forge/linux-64/libglvnd-1.7.0-ha4b6fd6_2.conda#434ca7e50e40f4918ab701e3facd59a0 -https://conda.anaconda.org/conda-forge/linux-64/llvm-openmp-20.1.1-h024ca30_1.conda#cfae5693f2ee2117e75e5e533451e04c +https://conda.anaconda.org/conda-forge/linux-64/llvm-openmp-20.1.2-h024ca30_0.conda#322da3c0641a7f0dafd5be6d3ea23d96 https://conda.anaconda.org/conda-forge/linux-64/_openmp_mutex-4.5-3_kmp_llvm.conda#ee5c2118262e30b972bc0b4db8ef0ba5 https://conda.anaconda.org/conda-forge/noarch/fonts-conda-ecosystem-1-0.tar.bz2#fee5683a3f04bd15cbd8318b096a27ab https://conda.anaconda.org/conda-forge/linux-64/libegl-1.7.0-ha4b6fd6_2.conda#c151d5eb730e9b7480e6d48c0fc44048 https://conda.anaconda.org/conda-forge/linux-64/libopengl-1.7.0-ha4b6fd6_2.conda#7df50d44d4a14d6c31a2c54f2cd92157 https://conda.anaconda.org/conda-forge/linux-64/libgcc-14.2.0-h767d61c_2.conda#ef504d1acbd74b7cc6849ef8af47dd03 https://conda.anaconda.org/conda-forge/linux-64/alsa-lib-1.2.13-hb9d3cd8_0.conda#ae1370588aa6a5157c34c73e9bbb36a0 -https://conda.anaconda.org/conda-forge/linux-64/aws-c-common-0.12.0-hb9d3cd8_0.conda#f65c946f28f0518f41ced702f44c52b7 +https://conda.anaconda.org/conda-forge/linux-64/aws-c-common-0.12.1-hb9d3cd8_0.conda#eac0ac2d6cf8c0aba9d2028bff9a4374 https://conda.anaconda.org/conda-forge/linux-64/c-ares-1.34.4-hb9d3cd8_0.conda#e2775acf57efd5af15b8e3d1d74d72d3 https://conda.anaconda.org/conda-forge/linux-64/libbrotlicommon-1.1.0-hb9d3cd8_2.conda#41b599ed2b02abcfdd84302bff174b23 https://conda.anaconda.org/conda-forge/linux-64/libdeflate-1.23-h4ddbbb0_0.conda#8dfae1d2e74767e9ce36d5fa0d8605db -https://conda.anaconda.org/conda-forge/linux-64/libexpat-2.6.4-h5888daf_0.conda#db833e03127376d461e1e13e76f09b6c -https://conda.anaconda.org/conda-forge/linux-64/libffi-3.4.6-h2dba641_0.conda#e3eb7806380bc8bcecba6d749ad5f026 +https://conda.anaconda.org/conda-forge/linux-64/libexpat-2.7.0-h5888daf_0.conda#db0bfbe7dd197b68ad5f30333bae6ce0 +https://conda.anaconda.org/conda-forge/linux-64/libffi-3.4.6-h2dba641_1.conda#ede4673863426c0883c0063d853bbd85 https://conda.anaconda.org/conda-forge/linux-64/libgcc-ng-14.2.0-h69a702a_2.conda#a2222a6ada71fb478682efe483ce0f92 https://conda.anaconda.org/conda-forge/linux-64/libgfortran5-14.2.0-hf1ad2bd_2.conda#556a4fdfac7287d349b8f09aba899693 https://conda.anaconda.org/conda-forge/linux-64/libiconv-1.18-h4ce23a2_1.conda#e796ff8ddc598affdf7c173d6145f087 -https://conda.anaconda.org/conda-forge/linux-64/liblzma-5.6.4-hb9d3cd8_0.conda#42d5b6a0f30d3c10cd88cb8584fda1cb +https://conda.anaconda.org/conda-forge/linux-64/liblzma-5.8.1-hb9d3cd8_0.conda#0e87378639676987af32fee53ba32258 https://conda.anaconda.org/conda-forge/linux-64/libntlm-1.8-hb9d3cd8_0.conda#7c7927b404672409d9917d49bff5f2d6 https://conda.anaconda.org/conda-forge/linux-64/libstdcxx-14.2.0-h8f9b012_2.conda#a78c856b6dc6bf4ea8daeb9beaaa3fb0 https://conda.anaconda.org/conda-forge/linux-64/libutf8proc-2.10.0-h4c51ac1_0.conda#aeccfff2806ae38430638ffbb4be9610 @@ -43,13 +43,13 @@ https://conda.anaconda.org/conda-forge/linux-64/pthread-stubs-0.4-hb9d3cd8_1002. https://conda.anaconda.org/conda-forge/linux-64/xorg-libice-1.1.2-hb9d3cd8_0.conda#fb901ff28063514abb6046c9ec2c4a45 https://conda.anaconda.org/conda-forge/linux-64/xorg-libxau-1.0.12-hb9d3cd8_0.conda#f6ebe2cb3f82ba6c057dde5d9debe4f7 https://conda.anaconda.org/conda-forge/linux-64/xorg-libxdmcp-1.1.5-hb9d3cd8_0.conda#8035c64cb77ed555e3f150b7b3972480 -https://conda.anaconda.org/conda-forge/linux-64/aws-c-cal-0.8.7-h043a21b_0.conda#4fdf835d66ea197e693125c64fbd4482 -https://conda.anaconda.org/conda-forge/linux-64/aws-c-compression-0.3.1-h3870646_2.conda#17ccde79d864e6183a83c5bbb8fff34d -https://conda.anaconda.org/conda-forge/linux-64/aws-c-sdkutils-0.2.3-h3870646_2.conda#06008b5ab42117c89c982aa2a32a5b25 -https://conda.anaconda.org/conda-forge/linux-64/aws-checksums-0.2.3-h3870646_2.conda#303d9e83e0518f1dcb66e90054635ca6 +https://conda.anaconda.org/conda-forge/linux-64/aws-c-cal-0.8.7-h7d555fd_1.conda#84de42a656bc56eb19218525fd5a7b5f +https://conda.anaconda.org/conda-forge/linux-64/aws-c-compression-0.3.1-hcbd9e4e_3.conda#2e01a03cfc3f90d1bdf9e0f5a0b3ddcd +https://conda.anaconda.org/conda-forge/linux-64/aws-c-sdkutils-0.2.3-hcbd9e4e_3.conda#5d6e5bc1d183d02a35f209bfdd71559f +https://conda.anaconda.org/conda-forge/linux-64/aws-checksums-0.2.3-hcbd9e4e_3.conda#42f28750f17fd7fa4a8942f300211bf6 https://conda.anaconda.org/conda-forge/linux-64/bzip2-1.0.8-h4bc722e_7.conda#62ee74e96c5ebb0af99386de58cf9553 https://conda.anaconda.org/conda-forge/linux-64/double-conversion-3.3.1-h5888daf_0.conda#bfd56492d8346d669010eccafe0ba058 -https://conda.anaconda.org/conda-forge/linux-64/expat-2.6.4-h5888daf_0.conda#1d6afef758879ef5ee78127eb4cd2c4a +https://conda.anaconda.org/conda-forge/linux-64/expat-2.7.0-h5888daf_0.conda#d6845ae4dea52a2f90178bf1829a21f8 https://conda.anaconda.org/conda-forge/linux-64/gflags-2.2.2-h5888daf_1005.conda#d411fc29e338efb48c5fd4576d71d881 https://conda.anaconda.org/conda-forge/linux-64/keyutils-1.6.1-h166bdaf_0.tar.bz2#30186d27e2c9fa62b45fb1476b7200e3 https://conda.anaconda.org/conda-forge/linux-64/libabseil-20250127.1-cxx17_hbbce691_0.conda#00290e549c5c8a32cc271020acc9ec6b @@ -72,13 +72,13 @@ https://conda.anaconda.org/conda-forge/linux-64/lz4-c-1.10.0-h5888daf_1.conda#9d https://conda.anaconda.org/conda-forge/linux-64/mysql-common-9.0.1-h266115a_5.conda#6cf2f0c19b0b7ff3d5349c9826c26a9e https://conda.anaconda.org/conda-forge/linux-64/pixman-0.44.2-h29eaf8c_0.conda#5e2a7acfa2c24188af39e7944e1b3604 https://conda.anaconda.org/conda-forge/linux-64/readline-8.2-h8c095d6_2.conda#283b96675859b20a825f8fa30f311446 -https://conda.anaconda.org/conda-forge/linux-64/s2n-1.5.14-h6c98b2b_0.conda#efab4ad81ba5731b2fefa0ab4359e884 +https://conda.anaconda.org/conda-forge/linux-64/s2n-1.5.15-hd830067_0.conda#81bde3ad0187adf0dd37fe86e84aff46 https://conda.anaconda.org/conda-forge/linux-64/sleef-3.8-h1b44611_0.conda#aec4dba5d4c2924730088753f6fa164b https://conda.anaconda.org/conda-forge/linux-64/snappy-1.2.1-h8bd8927_1.conda#3b3e64af585eadfb52bb90b553db5edf https://conda.anaconda.org/conda-forge/linux-64/tk-8.6.13-noxft_h4845f30_101.conda#d453b98d9c83e71da0741bb0ff4d76bc https://conda.anaconda.org/conda-forge/linux-64/zlib-1.3.1-hb9d3cd8_2.conda#c9f075ab2f33b3bbee9e62d4ad0a6cd8 https://conda.anaconda.org/conda-forge/linux-64/zstd-1.5.7-hb8e6e7a_2.conda#6432cb5d4ac0046c3ac0a8a0f95842f9 -https://conda.anaconda.org/conda-forge/linux-64/aws-c-io-0.17.0-h3dad3f2_6.conda#3a127d28266cdc0da93384d1f59fe8df +https://conda.anaconda.org/conda-forge/linux-64/aws-c-io-0.17.0-ha855f32_8.conda#310a7a7bc53c1e00f938ee2e8c219930 https://conda.anaconda.org/conda-forge/linux-64/brotli-bin-1.1.0-hb9d3cd8_2.conda#c63b5e52939e795ba8d26e35d767a843 https://conda.anaconda.org/conda-forge/linux-64/freetype-2.13.3-h48d6fc4_0.conda#9ecfd6f2ca17077dd9c2d24770bb9ccd https://conda.anaconda.org/conda-forge/linux-64/glog-0.7.1-hbabe93e_0.conda#ff862eebdfeb2fd048ae9dc92510baca @@ -107,8 +107,8 @@ https://conda.anaconda.org/conda-forge/linux-64/xcb-util-renderutil-0.3.10-hb711 https://conda.anaconda.org/conda-forge/linux-64/xcb-util-wm-0.4.2-hb711507_0.conda#608e0ef8256b81d04456e8d211eee3e8 https://conda.anaconda.org/conda-forge/linux-64/xorg-libsm-1.2.6-he73a12e_0.conda#1c74ff8c35dcadf952a16f752ca5aa49 https://conda.anaconda.org/conda-forge/linux-64/xorg-libx11-1.8.12-h4f16b4b_0.conda#db038ce880f100acc74dba10302b5630 -https://conda.anaconda.org/conda-forge/linux-64/aws-c-event-stream-0.5.4-h04a3f94_2.conda#81096a80f03fc2f0fb2a230f5d028643 -https://conda.anaconda.org/conda-forge/linux-64/aws-c-http-0.9.4-hb9b18c6_4.conda#773c99d0dbe2b3704af165f97ff399e5 +https://conda.anaconda.org/conda-forge/linux-64/aws-c-event-stream-0.5.4-h286e7e7_3.conda#aac4138e5fe70061b0e4126ee71e3a9f +https://conda.anaconda.org/conda-forge/linux-64/aws-c-http-0.9.5-hbca0721_0.conda#9cb70e8f68551738d478117fe973c114 https://conda.anaconda.org/conda-forge/linux-64/brotli-1.1.0-hb9d3cd8_2.conda#98514fe74548d768907ce7a13f680e8f https://conda.anaconda.org/conda-forge/noarch/colorama-0.4.6-pyhd8ed1ab_1.conda#962b9857ee8e7018c22f2776ffa0b2d7 https://conda.anaconda.org/conda-forge/noarch/cpython-3.13.2-py313hd8ed1ab_101.conda#d6be72c63da6e99ac2a1b87b120d135a @@ -119,16 +119,16 @@ https://conda.anaconda.org/conda-forge/noarch/exceptiongroup-1.2.2-pyhd8ed1ab_1. https://conda.anaconda.org/conda-forge/noarch/execnet-2.1.1-pyhd8ed1ab_1.conda#a71efeae2c160f6789900ba2631a2c90 https://conda.anaconda.org/conda-forge/noarch/filelock-3.18.0-pyhd8ed1ab_0.conda#4547b39256e296bb758166893e909a7c https://conda.anaconda.org/conda-forge/linux-64/fontconfig-2.15.0-h7e30c49_1.conda#8f5b0b297b59e1ac160ad4beec99dbee -https://conda.anaconda.org/conda-forge/noarch/fsspec-2025.3.1-pyhd8ed1ab_0.conda#2ded25bc46cbae83d08807c89cb84747 +https://conda.anaconda.org/conda-forge/noarch/fsspec-2025.3.2-pyhd8ed1ab_0.conda#9c40692c3d24c7aaf335f673ac09d308 https://conda.anaconda.org/conda-forge/noarch/iniconfig-2.0.0-pyhd8ed1ab_1.conda#6837f3eff7dcea42ecd714ce1ac2b108 https://conda.anaconda.org/conda-forge/linux-64/kiwisolver-1.4.7-py313h33d0bda_0.conda#9862d13a5e466273d5a4738cffcb8d6c https://conda.anaconda.org/conda-forge/linux-64/libcups-2.3.3-h4637d8d_4.conda#d4529f4dff3057982a7617c7ac58fde3 -https://conda.anaconda.org/conda-forge/linux-64/libcurl-8.12.1-h332b0f4_0.conda#45e9dc4e7b25e2841deb392be085500e -https://conda.anaconda.org/conda-forge/linux-64/libglib-2.84.0-h2ff4ddf_0.conda#40cdeafb789a5513415f7bdbef053cf5 +https://conda.anaconda.org/conda-forge/linux-64/libcurl-8.13.0-h332b0f4_0.conda#cbdc92ac0d93fe3c796e36ad65c7905c +https://conda.anaconda.org/conda-forge/linux-64/libglib-2.84.1-h2ff4ddf_0.conda#0305434da649d4fb48a425e588b79ea6 https://conda.anaconda.org/conda-forge/linux-64/libglx-1.7.0-ha4b6fd6_2.conda#c8013e438185f33b13814c5c488acd5c https://conda.anaconda.org/conda-forge/linux-64/libhiredis-1.0.2-h2cc385e_0.tar.bz2#b34907d3a81a3cd8095ee83d174c074a https://conda.anaconda.org/conda-forge/linux-64/libtiff-4.7.0-hd9ff511_3.conda#0ea6510969e1296cc19966fad481f6de -https://conda.anaconda.org/conda-forge/linux-64/libxml2-2.13.7-h8d12d68_0.conda#109427e5576d0ce9c42257c2421b1680 +https://conda.anaconda.org/conda-forge/linux-64/libxml2-2.13.7-h4bc477f_1.conda#ad1f1f8238834cd3c88ceeaee8da444a https://conda.anaconda.org/conda-forge/linux-64/markupsafe-3.0.2-py313h8060acc_1.conda#21b62c55924f01b6eef6827167b46acb https://conda.anaconda.org/conda-forge/linux-64/mpfr-4.2.1-h90cbb55_3.conda#2eeb50cab6652538eee8fc0bc3340c81 https://conda.anaconda.org/conda-forge/noarch/mpmath-1.3.0-pyhd8ed1ab_1.conda#3585aa87c43ab15b167b574cd73b057b @@ -149,30 +149,30 @@ https://conda.anaconda.org/conda-forge/noarch/threadpoolctl-3.6.0-pyhecae5ae_0.c https://conda.anaconda.org/conda-forge/noarch/toml-0.10.2-pyhd8ed1ab_1.conda#b0dd904de08b7db706167240bf37b164 https://conda.anaconda.org/conda-forge/noarch/tomli-2.2.1-pyhd8ed1ab_1.conda#ac944244f1fed2eb49bae07193ae8215 https://conda.anaconda.org/conda-forge/linux-64/tornado-6.4.2-py313h536fd9c_0.conda#5f5cbdd527d2e74e270d8b6255ba714f -https://conda.anaconda.org/conda-forge/noarch/typing_extensions-4.13.0-pyh29332c3_1.conda#4c446320a86cc5d48e3b80e332d6ebd7 +https://conda.anaconda.org/conda-forge/noarch/typing_extensions-4.13.1-pyh29332c3_0.conda#5710c79a5fb0a6bfdba0a887f90583b1 https://conda.anaconda.org/conda-forge/linux-64/xcb-util-image-0.4.0-hb711507_2.conda#a0901183f08b6c7107aab109733a3c91 https://conda.anaconda.org/conda-forge/linux-64/xkeyboard-config-2.43-hb9d3cd8_0.conda#f725c7425d6d7c15e31f3b99a88ea02f https://conda.anaconda.org/conda-forge/linux-64/xorg-libxext-1.3.6-hb9d3cd8_0.conda#febbab7d15033c913d53c7a2c102309d https://conda.anaconda.org/conda-forge/linux-64/xorg-libxfixes-6.0.1-hb9d3cd8_0.conda#4bdb303603e9821baf5fe5fdff1dc8f8 https://conda.anaconda.org/conda-forge/linux-64/xorg-libxrender-0.9.12-hb9d3cd8_0.conda#96d57aba173e878a2089d5638016dc5e -https://conda.anaconda.org/conda-forge/linux-64/aws-c-auth-0.8.6-hd08a7f5_4.conda#f5a770ac1fd2cb34b21327fc513013a7 -https://conda.anaconda.org/conda-forge/linux-64/aws-c-mqtt-0.12.2-h108da3e_2.conda#90e07c8bac8da6378ee1882ef0a9374a +https://conda.anaconda.org/conda-forge/linux-64/aws-c-auth-0.8.7-h7743f02_1.conda#185af639e073ef45fbd75f9d4f30605b +https://conda.anaconda.org/conda-forge/linux-64/aws-c-mqtt-0.12.2-hffac463_3.conda#18d498ed5cd14ab8d7d745a18303edf4 https://conda.anaconda.org/conda-forge/linux-64/azure-core-cpp-1.14.0-h5cfcd09_0.conda#0a8838771cc2e985cd295e01ae83baf1 https://conda.anaconda.org/conda-forge/linux-64/cairo-1.18.4-h3394656_0.conda#09262e66b19567aff4f592fb53b28760 https://conda.anaconda.org/conda-forge/linux-64/ccache-4.11.2-hd714d17_0.conda#35ae7ce74089ab05fdb1cb9746c0fbe4 https://conda.anaconda.org/conda-forge/linux-64/coverage-7.8.0-py313h8060acc_0.conda#375064d30e709bf7c1d4580e70aaea61 https://conda.anaconda.org/conda-forge/linux-64/dbus-1.13.6-h5008d03_3.tar.bz2#ecfff944ba3960ecb334b9a2663d708d -https://conda.anaconda.org/conda-forge/linux-64/fonttools-4.56.0-py313h8060acc_0.conda#2011223fad66419512446914251be2a6 +https://conda.anaconda.org/conda-forge/linux-64/fonttools-4.57.0-py313h8060acc_0.conda#76b3a3367ac578a7cc43f4b7814e7e87 https://conda.anaconda.org/conda-forge/noarch/jinja2-3.1.6-pyhd8ed1ab_0.conda#446bd6c8cb26050d528881df495ce646 https://conda.anaconda.org/conda-forge/noarch/joblib-1.4.2-pyhd8ed1ab_1.conda#bf8243ee348f3a10a14ed0cae323e0c1 https://conda.anaconda.org/conda-forge/linux-64/lcms2-2.17-h717163a_0.conda#000e85703f0fd9594c81710dd5066471 https://conda.anaconda.org/conda-forge/linux-64/libgl-1.7.0-ha4b6fd6_2.conda#928b8be80851f5d8ffb016f9c81dae7a https://conda.anaconda.org/conda-forge/linux-64/libgrpc-1.71.0-he753a82_0.conda#65e3fc5e73aa153bb069c1baec51fc12 https://conda.anaconda.org/conda-forge/linux-64/libhwloc-2.11.2-default_h0d58e46_1001.conda#804ca9e91bcaea0824a341d55b1684f2 -https://conda.anaconda.org/conda-forge/linux-64/libllvm20-20.1.1-ha7bfdaf_0.conda#2e234fb7d6eeb5c32eb5b256403b5795 +https://conda.anaconda.org/conda-forge/linux-64/libllvm20-20.1.2-ha7bfdaf_0.conda#8354769527f9f441a3a04aa1c19188d9 https://conda.anaconda.org/conda-forge/linux-64/libxkbcommon-1.8.1-hc4a0caf_0.conda#e7e5b0652227d646b44abdcbd989da7b https://conda.anaconda.org/conda-forge/linux-64/libxslt-1.1.39-h76b75d6_0.conda#e71f31f8cfb0a91439f2086fc8aa0461 -https://conda.anaconda.org/conda-forge/noarch/meson-1.7.0-pyhd8ed1ab_0.conda#6d4bbcce47061d2f9f2636409a8fe7c0 +https://conda.anaconda.org/conda-forge/noarch/meson-1.7.1-pyhd8ed1ab_0.conda#90018ee73b8741268027421ceac2809a https://conda.anaconda.org/conda-forge/linux-64/mpc-1.3.1-h24ddda3_1.conda#aa14b9a5196a6d8dd364164b7ce56acf https://conda.anaconda.org/conda-forge/linux-64/openjpeg-2.5.3-h5fbd93e_0.conda#9e5816bc95d285c115a3ebc2f8563564 https://conda.anaconda.org/conda-forge/linux-64/openldap-2.6.9-he970967_0.conda#ca2de8bbdc871bce41dbf59e51324165 @@ -181,7 +181,7 @@ https://conda.anaconda.org/conda-forge/noarch/pybind11-2.13.6-pyh1ec8472_2.conda https://conda.anaconda.org/conda-forge/noarch/pyproject-metadata-0.9.1-pyhd8ed1ab_0.conda#22ae7c6ea81e0c8661ef32168dda929b https://conda.anaconda.org/conda-forge/noarch/pytest-8.3.5-pyhd8ed1ab_0.conda#c3c9316209dec74a705a36797970c6be https://conda.anaconda.org/conda-forge/noarch/python-dateutil-2.9.0.post0-pyhff2d567_1.conda#5ba79d7c71f03c678c8ead841f347d6e -https://conda.anaconda.org/conda-forge/noarch/typing-extensions-4.13.0-h9fa5a19_1.conda#3fbcc45b908040dca030d3f78ed9a212 +https://conda.anaconda.org/conda-forge/noarch/typing-extensions-4.13.1-hf5ce1d7_0.conda#e37cf790f710cf72fd13dcb6b2d4370c https://conda.anaconda.org/conda-forge/linux-64/xcb-util-cursor-0.1.5-hb9d3cd8_0.conda#eb44b3b6deb1cab08d72cb61686fe64c https://conda.anaconda.org/conda-forge/linux-64/xorg-libxcomposite-0.4.6-hb9d3cd8_2.conda#d3c295b50f092ab525ffe3c2aa4b7413 https://conda.anaconda.org/conda-forge/linux-64/xorg-libxcursor-1.2.3-hb9d3cd8_0.conda#2ccd714aa2242315acaf0a67faea780b @@ -189,54 +189,54 @@ https://conda.anaconda.org/conda-forge/linux-64/xorg-libxdamage-1.1.6-hb9d3cd8_0 https://conda.anaconda.org/conda-forge/linux-64/xorg-libxi-1.8.2-hb9d3cd8_0.conda#17dcc85db3c7886650b8908b183d6876 https://conda.anaconda.org/conda-forge/linux-64/xorg-libxrandr-1.5.4-hb9d3cd8_0.conda#2de7f99d6581a4a7adbff607b5c278ca https://conda.anaconda.org/conda-forge/linux-64/xorg-libxxf86vm-1.1.6-hb9d3cd8_0.conda#5efa5fa6243a622445fdfd72aee15efa -https://conda.anaconda.org/conda-forge/linux-64/aws-c-s3-0.7.13-h822ba82_2.conda#9cf2c3c13468f2209ee814be2c88655f +https://conda.anaconda.org/conda-forge/linux-64/aws-c-s3-0.7.13-h4c9fe3b_3.conda#207518c1b938d5ca2a970c24e342d98f https://conda.anaconda.org/conda-forge/linux-64/azure-identity-cpp-1.10.0-h113e628_0.conda#73f73f60854f325a55f1d31459f2ab73 https://conda.anaconda.org/conda-forge/linux-64/azure-storage-common-cpp-12.8.0-h736e048_1.conda#13de36be8de3ae3f05ba127631599213 https://conda.anaconda.org/conda-forge/linux-64/gmpy2-2.1.5-py313h11186cd_3.conda#846a773cdc154eda7b86d7f4427432f2 https://conda.anaconda.org/conda-forge/linux-64/harfbuzz-11.0.0-h76408a6_0.conda#347cb348bfc8d77062daee11c326e518 -https://conda.anaconda.org/conda-forge/linux-64/libclang-cpp20.1-20.1.1-default_hb5137d0_0.conda#331dee424fabc0c26331767acc93a074 -https://conda.anaconda.org/conda-forge/linux-64/libclang13-20.1.1-default_h9c6a7e4_0.conda#f8b1b8c13c0a0fede5e1a204eafb48f8 +https://conda.anaconda.org/conda-forge/linux-64/libclang-cpp20.1-20.1.2-default_hb5137d0_0.conda#729198eae19e9dbf8e0ffe355d416bde +https://conda.anaconda.org/conda-forge/linux-64/libclang13-20.1.2-default_h9c6a7e4_0.conda#c5fe177150aecc6ec46609b0a6123f39 https://conda.anaconda.org/conda-forge/linux-64/libgoogle-cloud-2.36.0-hc4361e1_1.conda#ae36e6296a8dd8e8a9a8375965bf6398 https://conda.anaconda.org/conda-forge/linux-64/libopentelemetry-cpp-1.19.0-hd1b1c89_0.conda#21fdfc7394cf73e8f5d46e66a1eeed09 -https://conda.anaconda.org/conda-forge/linux-64/libpq-17.4-h27ae623_0.conda#d67f3f3c33344ff3e9ef5270001e9011 +https://conda.anaconda.org/conda-forge/linux-64/libpq-17.4-h27ae623_1.conda#37fba334855ef3b51549308e61ed7a3d https://conda.anaconda.org/conda-forge/noarch/meson-python-0.17.1-pyh70fd9c4_1.conda#7a02679229c6c2092571b4c025055440 https://conda.anaconda.org/conda-forge/linux-64/optree-0.14.1-py313h33d0bda_1.conda#951a8b89db3ca099f93586919c03226d https://conda.anaconda.org/conda-forge/linux-64/pillow-11.1.0-py313h8db990d_0.conda#1e86810c6c3fb6d6aebdba26564eb2e8 -https://conda.anaconda.org/conda-forge/noarch/pytest-cov-6.0.0-pyhd8ed1ab_1.conda#79963c319d1be62c8fd3e34555816e01 +https://conda.anaconda.org/conda-forge/noarch/pytest-cov-6.1.1-pyhd8ed1ab_0.conda#1e35d8f975bc0e984a19819aa91c440a https://conda.anaconda.org/conda-forge/noarch/pytest-xdist-3.6.1-pyhd8ed1ab_1.conda#59aad4fb37cabc0bacc73cf344612ddd https://conda.anaconda.org/conda-forge/linux-64/tbb-2021.13.0-hceb3a55_1.conda#ba7726b8df7b9d34ea80e82b097a4893 https://conda.anaconda.org/conda-forge/linux-64/xorg-libxtst-1.2.5-hb9d3cd8_3.conda#7bbe9a0cc0df0ac5f5a8ad6d6a11af2f -https://conda.anaconda.org/conda-forge/linux-64/aws-crt-cpp-0.31.0-h55f77e1_4.conda#0627af705ed70681f5bede31e72348e5 +https://conda.anaconda.org/conda-forge/linux-64/aws-crt-cpp-0.31.1-h46b750d_1.conda#df4a6731864b1d6e125c0b94328262fe https://conda.anaconda.org/conda-forge/linux-64/azure-storage-blobs-cpp-12.13.0-h3cf044e_1.conda#7eb66060455c7a47d9dcdbfa9f46579b https://conda.anaconda.org/conda-forge/linux-64/libgoogle-cloud-storage-2.36.0-h0121fbd_1.conda#a0f7588c1f0a26d550e7bae4fb49427a https://conda.anaconda.org/conda-forge/linux-64/mkl-2024.2.2-ha957f24_16.conda#1459379c79dda834673426504d52b319 -https://conda.anaconda.org/conda-forge/linux-64/qt6-main-6.8.3-h6441bc3_1.conda#db96ef4241de437be7b41082045ef7d2 +https://conda.anaconda.org/conda-forge/linux-64/qt6-main-6.9.0-h6441bc3_0.conda#d3df16592e15a3f833cfc4d19ae58677 https://conda.anaconda.org/conda-forge/noarch/sympy-1.13.3-pyh2585a3b_105.conda#254cd5083ffa04d96e3173397a3d30f4 -https://conda.anaconda.org/conda-forge/linux-64/aws-sdk-cpp-1.11.510-h37a5c72_3.conda#beb8577571033140c6897d257acc7724 +https://conda.anaconda.org/conda-forge/linux-64/aws-sdk-cpp-1.11.510-h1fa5cb7_4.conda#b2269aa463cefee750c73da2baf8d583 https://conda.anaconda.org/conda-forge/linux-64/azure-storage-files-datalake-cpp-12.12.0-ha633028_1.conda#7c1980f89dd41b097549782121a73490 https://conda.anaconda.org/conda-forge/linux-64/libblas-3.9.0-31_hfdb39a5_mkl.conda#bdf4a57254e8248222cb631db4393ff1 https://conda.anaconda.org/conda-forge/linux-64/mkl-devel-2024.2.2-ha770c72_16.conda#140891ea14285fc634353b31e9e40a95 -https://conda.anaconda.org/conda-forge/linux-64/pyside6-6.8.3-py313h5f61773_0.conda#920bd63af614ba2bf6f5dd7d6922d5b7 -https://conda.anaconda.org/conda-forge/linux-64/libarrow-19.0.1-h120c447_5_cpu.conda#aaed6701dd9c90e344afbbacff45854a +https://conda.anaconda.org/conda-forge/linux-64/pyside6-6.9.0-py313h5f61773_0.conda#f51f25ec8fcbf777f8b186bb5deeed40 +https://conda.anaconda.org/conda-forge/linux-64/libarrow-19.0.1-h052fb8e_6_cpu.conda#eb77601ca27712a919673aec187e941f https://conda.anaconda.org/conda-forge/linux-64/libcblas-3.9.0-31_h372d94f_mkl.conda#2a06a6c16b45bd3d10002927ca204b67 https://conda.anaconda.org/conda-forge/linux-64/liblapack-3.9.0-31_hc41d3b0_mkl.conda#10d012ddd7cc1c7ff9093d4974a34e53 -https://conda.anaconda.org/conda-forge/linux-64/libarrow-acero-19.0.1-hcb10f89_5_cpu.conda#ab43cfa629332dee94324995a3aa2364 +https://conda.anaconda.org/conda-forge/linux-64/libarrow-acero-19.0.1-hcb10f89_6_cpu.conda#758177a069e22e081f0ab3dcb03174c0 https://conda.anaconda.org/conda-forge/linux-64/liblapacke-3.9.0-31_hbc6e62b_mkl.conda#562026e418363dc346ad5a9e18cce73c -https://conda.anaconda.org/conda-forge/linux-64/libparquet-19.0.1-h081d1f1_5_cpu.conda#acecd5d30fd33aa14c158d5eb6240735 +https://conda.anaconda.org/conda-forge/linux-64/libparquet-19.0.1-h081d1f1_6_cpu.conda#f5dc9977d49bdb7b521e2cc96369c1c0 https://conda.anaconda.org/conda-forge/linux-64/libtorch-2.6.0-cpu_mkl_hec71012_103.conda#f5c1ba21fa4f28b26f518c1954fd8125 https://conda.anaconda.org/conda-forge/linux-64/numpy-2.2.4-py313h17eae1a_0.conda#6c905a8f170edd64f3a390c76572e331 https://conda.anaconda.org/conda-forge/linux-64/pyarrow-core-19.0.1-py313he5f92c8_0_cpu.conda#7d8649531c807b24295c8f9a0a396a78 https://conda.anaconda.org/conda-forge/noarch/array-api-strict-2.3.1-pyhd8ed1ab_0.conda#11107d0aeb8c590a34fee0894909816b https://conda.anaconda.org/conda-forge/linux-64/blas-devel-3.9.0-31_hcf00494_mkl.conda#368c93bde87a67d24a74de15bf4c49fd https://conda.anaconda.org/conda-forge/linux-64/contourpy-1.3.1-py313h33d0bda_0.conda#6b6768e7c585d7029f79a04cbc4cbff0 -https://conda.anaconda.org/conda-forge/linux-64/libarrow-dataset-19.0.1-hcb10f89_5_cpu.conda#ab3d7fed93dcfe27c75bbe52b7a90997 +https://conda.anaconda.org/conda-forge/linux-64/libarrow-dataset-19.0.1-hcb10f89_6_cpu.conda#bc879ea62f1811a73d928c01762bedb1 https://conda.anaconda.org/conda-forge/linux-64/pandas-2.2.3-py313ha87cce1_1.conda#c5d63dd501db554b84a30dea33824164 https://conda.anaconda.org/conda-forge/linux-64/polars-1.26.0-py313hae41bca_0.conda#14817d4747f3996cdf8efbba164c65b9 https://conda.anaconda.org/conda-forge/linux-64/pytorch-2.6.0-cpu_mkl_py313_h69cc176_103.conda#ca8a8e8ce4ce7fd935f17d6475deba20 https://conda.anaconda.org/conda-forge/linux-64/scipy-1.15.2-py313h86fcf2b_0.conda#ca68acd9febc86448eeed68d0c6c8643 -https://conda.anaconda.org/conda-forge/noarch/scipy-doctest-1.6-pyh29332c3_1.conda#7dc3141f40730ee65439a85112374198 +https://conda.anaconda.org/conda-forge/noarch/scipy-doctest-1.7.1-pyh29332c3_0.conda#d3b3b7b88385648eff6ae39694692f27 https://conda.anaconda.org/conda-forge/linux-64/blas-2.131-mkl.conda#9bb865b7e01104255ca54e61a58ded15 -https://conda.anaconda.org/conda-forge/linux-64/libarrow-substrait-19.0.1-h1bed206_5_cpu.conda#8c9dd6ea36aa28139df8c70bfa605f34 +https://conda.anaconda.org/conda-forge/linux-64/libarrow-substrait-19.0.1-h1bed206_6_cpu.conda#5bcca23c52ca5a0522b22814c4aff927 https://conda.anaconda.org/conda-forge/linux-64/matplotlib-base-3.10.1-py313h129903b_0.conda#4e23b3fabf434b418e0d9c6975a6453f https://conda.anaconda.org/conda-forge/linux-64/pyamg-5.2.1-py313hf0ab243_1.conda#4c769bf3858f424cb2ecf952175ec600 https://conda.anaconda.org/conda-forge/linux-64/pytorch-cpu-2.6.0-cpu_mkl_hc60beec_103.conda#2c6ebe539ac8f9a75f3160dd551fb33e diff --git a/build_tools/azure/pylatest_conda_forge_mkl_osx-64_conda.lock b/build_tools/azure/pylatest_conda_forge_mkl_osx-64_conda.lock index d9d01a7829476..2f38fa2545aeb 100644 --- a/build_tools/azure/pylatest_conda_forge_mkl_osx-64_conda.lock +++ b/build_tools/azure/pylatest_conda_forge_mkl_osx-64_conda.lock @@ -3,24 +3,24 @@ # input_hash: b4e9eb0fbe1a7a6d067e4f4b43ca9e632309794c2a76d5c254ce023cb2fa2d99 @EXPLICIT https://conda.anaconda.org/conda-forge/osx-64/ca-certificates-2025.1.31-h8857fd0_0.conda#3418b6c8cac3e71c0bc089fc5ea53042 -https://conda.anaconda.org/conda-forge/noarch/libgfortran-devel_osx-64-13.3.0-h297be85_1.conda#b4e7d8b8e403d8021bc42293082b9da0 +https://conda.anaconda.org/conda-forge/noarch/libgfortran-devel_osx-64-13.3.0-h297be85_105.conda#c4967f8e797d0ffef3c5650fcdc2cdb5 https://conda.anaconda.org/conda-forge/osx-64/libjpeg-turbo-3.0.0-h0dc2134_1.conda#72507f8e3961bc968af17435060b6dd6 https://conda.anaconda.org/conda-forge/osx-64/mkl-include-2023.2.0-h6bab518_50500.conda#835abb8ded5e26f23ea6996259c7972e -https://conda.anaconda.org/conda-forge/osx-64/python_abi-3.13-5_cp313.conda#927a2186f1f997ac018d67c4eece90a6 +https://conda.anaconda.org/conda-forge/osx-64/python_abi-3.13-6_cp313.conda#1867172dd3044e5c3db5772b81d67796 https://conda.anaconda.org/conda-forge/noarch/tzdata-2025b-h78e105d_0.conda#4222072737ccff51314b5ece9c7d6f5a https://conda.anaconda.org/conda-forge/osx-64/bzip2-1.0.8-hfdf4475_7.conda#7ed4301d437b59045be7e051a0308211 https://conda.anaconda.org/conda-forge/osx-64/icu-75.1-h120a0e1_0.conda#d68d48a3060eb5abdc1cdc8e2a3a5966 https://conda.anaconda.org/conda-forge/osx-64/libbrotlicommon-1.1.0-h00291cd_2.conda#58f2c4bdd56c46cc7451596e4ae68e0b -https://conda.anaconda.org/conda-forge/osx-64/libcxx-20.1.1-hf95d169_0.conda#85cff0ed95d940c4762d5a99a6fe34ae +https://conda.anaconda.org/conda-forge/osx-64/libcxx-20.1.2-hf95d169_0.conda#25cc3210a5a8a1b332e12d20db11c6dd https://conda.anaconda.org/conda-forge/osx-64/libdeflate-1.23-he65b83e_0.conda#120f8f7ba6a8defb59f4253447db4bb4 -https://conda.anaconda.org/conda-forge/osx-64/libexpat-2.6.4-h240833e_0.conda#20307f4049a735a78a29073be1be2626 -https://conda.anaconda.org/conda-forge/osx-64/libffi-3.4.6-h281671d_0.conda#b8667b0d0400b8dcb6844d8e06b2027d +https://conda.anaconda.org/conda-forge/osx-64/libexpat-2.7.0-h240833e_0.conda#026d0a1056ba2a3dbbea6d4b08188676 +https://conda.anaconda.org/conda-forge/osx-64/libffi-3.4.6-h281671d_1.conda#4ca9ea59839a9ca8df84170fab4ceb41 https://conda.anaconda.org/conda-forge/osx-64/libiconv-1.18-h4b5e92a_1.conda#6283140d7b2b55b6b095af939b71b13f -https://conda.anaconda.org/conda-forge/osx-64/liblzma-5.6.4-hd471939_0.conda#db9d7b0152613f097cdb61ccf9f70ef5 +https://conda.anaconda.org/conda-forge/osx-64/liblzma-5.8.1-hd471939_0.conda#8e1197f652c67e87a9ece738d82cef4f https://conda.anaconda.org/conda-forge/osx-64/libmpdec-4.0.0-hfdf4475_0.conda#ed625b2e59dff82859c23dd24774156b https://conda.anaconda.org/conda-forge/osx-64/libwebp-base-1.5.0-h6cf52b4_0.conda#5e0cefc99a231ac46ba21e27ae44689f https://conda.anaconda.org/conda-forge/osx-64/libzlib-1.3.1-hd23fc13_2.conda#003a54a4e32b02f7355b50a837e699da -https://conda.anaconda.org/conda-forge/osx-64/llvm-openmp-20.1.1-ha54dae1_1.conda#a1c6289fb8ae152b8cb53a535639c2c7 +https://conda.anaconda.org/conda-forge/osx-64/llvm-openmp-20.1.2-ha54dae1_0.conda#86e822e810ac7658cbed920d548f8398 https://conda.anaconda.org/conda-forge/osx-64/ncurses-6.5-h0622a9a_3.conda#ced34dd9929f491ca6dab6a2927aff25 https://conda.anaconda.org/conda-forge/osx-64/openssl-3.4.1-hc426f3f_0.conda#a7d63f8e7ab23f71327ea6d27e2d5eae https://conda.anaconda.org/conda-forge/osx-64/pthread-stubs-0.4-h00291cd_1002.conda#8bcf980d2c6b17094961198284b8e862 @@ -32,11 +32,11 @@ https://conda.anaconda.org/conda-forge/osx-64/lerc-4.0.0-hb486fe8_0.tar.bz2#f9d6 https://conda.anaconda.org/conda-forge/osx-64/libbrotlidec-1.1.0-h00291cd_2.conda#34709a1f5df44e054c4a12ab536c5459 https://conda.anaconda.org/conda-forge/osx-64/libbrotlienc-1.1.0-h00291cd_2.conda#691f0dcb36f1ae67f5c489f20ae987ea https://conda.anaconda.org/conda-forge/osx-64/libcxx-devel-18.1.8-h7c275be_8.conda#a9513c41f070a9e2d5c370ba5d6c0c00 -https://conda.anaconda.org/conda-forge/osx-64/libgfortran5-14.2.0-h51e75f0_1.conda#9e089ae71e7caca1565af0b632027d4d +https://conda.anaconda.org/conda-forge/osx-64/libgfortran5-14.2.0-h58528f3_105.conda#94560312ff3c78225bed62ab59854c31 https://conda.anaconda.org/conda-forge/osx-64/libpng-1.6.47-h3c4a55f_0.conda#8461ab86d2cdb76d6e971aab225be73f https://conda.anaconda.org/conda-forge/osx-64/libsqlite-3.49.1-hdb6dae5_2.conda#1819e770584a7e83a81541d8253cbabe https://conda.anaconda.org/conda-forge/osx-64/libxcb-1.17.0-hf1f96e2_0.conda#bbeca862892e2898bdb45792a61c4afc -https://conda.anaconda.org/conda-forge/osx-64/libxml2-2.13.7-hebb159f_0.conda#45786cf4067df4fbe9faf3d1c25d3acf +https://conda.anaconda.org/conda-forge/osx-64/libxml2-2.14.0-hebb159f_1.conda#513da8e60b2bb7ea377095f86e262dd0 https://conda.anaconda.org/conda-forge/osx-64/ninja-1.12.1-h3c5361c_0.conda#a0ebabd021c8191aeb82793fe43cfdcb https://conda.anaconda.org/conda-forge/osx-64/qhull-2020.2-h3c5361c_5.conda#dd1ea9ff27c93db7c01a7b7656bd4ad4 https://conda.anaconda.org/conda-forge/osx-64/readline-8.2-h7cca4af_2.conda#342570f8e02f2f022147a7f841475784 @@ -47,9 +47,9 @@ https://conda.anaconda.org/conda-forge/osx-64/zlib-1.3.1-hd23fc13_2.conda#c989e0 https://conda.anaconda.org/conda-forge/osx-64/zstd-1.5.7-h8210216_2.conda#cd60a4a5a8d6a476b30d8aa4bb49251a https://conda.anaconda.org/conda-forge/osx-64/brotli-bin-1.1.0-h00291cd_2.conda#049933ecbf552479a12c7917f0a4ce59 https://conda.anaconda.org/conda-forge/osx-64/freetype-2.13.3-h40dfd5c_0.conda#e391f0c2d07df272cf7c6df235e97bb9 -https://conda.anaconda.org/conda-forge/osx-64/libgfortran-5.0.0-14_2_0_h51e75f0_1.conda#e8b6b4962db050d7923e2cee3efff446 -https://conda.anaconda.org/conda-forge/osx-64/libhwloc-2.11.2-default_h4cdd727_1001.conda#52bbb10ac083c563d00df035c94f9a63 -https://conda.anaconda.org/conda-forge/osx-64/libllvm18-18.1.8-hc29ff6c_3.conda#a04c2fc058fd6b0630c1a2faad322676 +https://conda.anaconda.org/conda-forge/osx-64/libgfortran-14.2.0-hef36b68_105.conda#6b27baf030f5d6603713c7e72d3f6b9a +https://conda.anaconda.org/conda-forge/osx-64/libhwloc-2.11.2-default_hb6fbd3b_1000.conda#b59efe292f2f737cfa48fea2d6fc95d6 +https://conda.anaconda.org/conda-forge/osx-64/libllvm18-18.1.8-default_h3571c67_5.conda#01dd8559b569ad39b64fef0a61ded1e9 https://conda.anaconda.org/conda-forge/osx-64/libtiff-4.7.0-hb77a491_3.conda#6f2f9df7b093d6b33bc0c334acc7d2d9 https://conda.anaconda.org/conda-forge/osx-64/mpfr-4.2.1-haed47dc_3.conda#d511e58aaaabfc23136880d9956fa7a6 https://conda.anaconda.org/conda-forge/osx-64/python-3.13.2-h534c281_101_cp313.conda#2e883c630979a183e23a510d470194e2 @@ -62,10 +62,10 @@ https://conda.anaconda.org/conda-forge/noarch/execnet-2.1.1-pyhd8ed1ab_1.conda#a https://conda.anaconda.org/conda-forge/noarch/iniconfig-2.0.0-pyhd8ed1ab_1.conda#6837f3eff7dcea42ecd714ce1ac2b108 https://conda.anaconda.org/conda-forge/osx-64/kiwisolver-1.4.7-py313h0c4e38b_0.conda#c37fceab459e104e77bb5456e219fc37 https://conda.anaconda.org/conda-forge/osx-64/lcms2-2.17-h72f5680_0.conda#bf210d0c63f2afb9e414a858b79f0eaa -https://conda.anaconda.org/conda-forge/osx-64/ld64_osx-64-951.9-h33512f0_4.conda#b1678041160c249a3df7937be93c56aa +https://conda.anaconda.org/conda-forge/osx-64/ld64_osx-64-951.9-h33512f0_6.conda#6cd120f5c9dae65b858e1fad2b7959a0 https://conda.anaconda.org/conda-forge/osx-64/libclang-cpp18.1-18.1.8-default_h3571c67_8.conda#1444a2cd1f78fccea7dacb658f8aeb39 https://conda.anaconda.org/conda-forge/osx-64/libhiredis-1.0.2-h2beb688_0.tar.bz2#524282b2c46c9dedf051b3bc2ae05494 -https://conda.anaconda.org/conda-forge/osx-64/llvm-tools-18-18.1.8-hc29ff6c_3.conda#61dfcd8dc654e2ca399a214641ab549f +https://conda.anaconda.org/conda-forge/osx-64/llvm-tools-18-18.1.8-default_h3571c67_5.conda#4391981e855468ced32ca1940b3d7613 https://conda.anaconda.org/conda-forge/osx-64/mpc-1.3.1-h9d8efa1_1.conda#0520855aaae268ea413d6bc913f1384c https://conda.anaconda.org/conda-forge/noarch/munkres-1.1.4-pyh9f0ad1d_0.tar.bz2#2ba8498c1018c1e9c61eb99b973dfe19 https://conda.anaconda.org/conda-forge/osx-64/openjpeg-2.5.3-h7fd6d84_0.conda#025c711177fc3309228ca1a32374458d @@ -75,7 +75,7 @@ https://conda.anaconda.org/conda-forge/noarch/pluggy-1.5.0-pyhd8ed1ab_1.conda#e9 https://conda.anaconda.org/conda-forge/noarch/pyparsing-3.2.3-pyhd8ed1ab_1.conda#513d3c262ee49b54a8fec85c5bc99764 https://conda.anaconda.org/conda-forge/noarch/python-tzdata-2025.2-pyhd8ed1ab_0.conda#88476ae6ebd24f39261e0854ac244f33 https://conda.anaconda.org/conda-forge/noarch/pytz-2024.1-pyhd8ed1ab_0.conda#3eeeeb9e4827ace8c0c1419c85d590ad -https://conda.anaconda.org/conda-forge/noarch/setuptools-75.8.2-pyhff2d567_0.conda#9bddfdbf4e061821a1a443f93223be61 +https://conda.anaconda.org/conda-forge/noarch/setuptools-78.1.0-pyhff2d567_0.conda#a42da9837e46c53494df0044c3eb1f53 https://conda.anaconda.org/conda-forge/noarch/six-1.17.0-pyhd8ed1ab_0.conda#a451d576819089b0d672f18768be0f65 https://conda.anaconda.org/conda-forge/osx-64/tbb-2021.13.0-hb890de9_1.conda#284892942cdddfded53d090050b639a5 https://conda.anaconda.org/conda-forge/noarch/threadpoolctl-3.6.0-pyhecae5ae_0.conda#9d64911b31d57ca443e9f1e36b04385f @@ -85,25 +85,25 @@ https://conda.anaconda.org/conda-forge/osx-64/tornado-6.4.2-py313h63b0ddb_0.cond https://conda.anaconda.org/conda-forge/osx-64/ccache-4.11.2-h30d2cd9_0.conda#9412b5214abe467b2d70eaf8c65975a0 https://conda.anaconda.org/conda-forge/osx-64/clang-18-18.1.8-default_h3571c67_8.conda#c40e72e808995df189d70d9a438d77ac https://conda.anaconda.org/conda-forge/osx-64/coverage-7.8.0-py313h717bdf5_0.conda#1215b56c8d9915318d1714cbd004035f -https://conda.anaconda.org/conda-forge/osx-64/fonttools-4.56.0-py313h717bdf5_0.conda#1f3a7b59e9bf19440142f3fc45230935 -https://conda.anaconda.org/conda-forge/osx-64/gfortran_impl_osx-64-13.3.0-h355c40b_1.conda#e794cbceda961689c8a5c2691a918dc2 +https://conda.anaconda.org/conda-forge/osx-64/fonttools-4.57.0-py313h717bdf5_0.conda#190b8625dd6c38afe4f10e3be50122e4 +https://conda.anaconda.org/conda-forge/osx-64/gfortran_impl_osx-64-13.3.0-hbf5bf67_105.conda#f56a107c8d1253346d01785ecece7977 https://conda.anaconda.org/conda-forge/noarch/joblib-1.4.2-pyhd8ed1ab_1.conda#bf8243ee348f3a10a14ed0cae323e0c1 -https://conda.anaconda.org/conda-forge/osx-64/ld64-951.9-h4e51db5_4.conda#a35ccc73726f64d22dc9c4349f5c58bd -https://conda.anaconda.org/conda-forge/osx-64/llvm-tools-18.1.8-hc29ff6c_3.conda#2585f8254d2ce24399a601e9b4e15652 -https://conda.anaconda.org/conda-forge/noarch/meson-1.7.0-pyhd8ed1ab_0.conda#6d4bbcce47061d2f9f2636409a8fe7c0 +https://conda.anaconda.org/conda-forge/osx-64/ld64-951.9-h4e51db5_6.conda#45bf526d53b1bc95bc0b932a91a41576 +https://conda.anaconda.org/conda-forge/osx-64/llvm-tools-18.1.8-default_h3571c67_5.conda#cc07ff74d2547da1f1452c42b67bafd6 +https://conda.anaconda.org/conda-forge/noarch/meson-1.7.1-pyhd8ed1ab_0.conda#90018ee73b8741268027421ceac2809a https://conda.anaconda.org/conda-forge/osx-64/mkl-2023.2.0-h54c2260_50500.conda#0a342ccdc79e4fcd359245ac51941e7b https://conda.anaconda.org/conda-forge/osx-64/pillow-11.1.0-py313h0c4f865_0.conda#11b4dd7a814202f2a0b655420f1c1c3a https://conda.anaconda.org/conda-forge/noarch/pyproject-metadata-0.9.1-pyhd8ed1ab_0.conda#22ae7c6ea81e0c8661ef32168dda929b https://conda.anaconda.org/conda-forge/noarch/pytest-8.3.5-pyhd8ed1ab_0.conda#c3c9316209dec74a705a36797970c6be https://conda.anaconda.org/conda-forge/noarch/python-dateutil-2.9.0.post0-pyhff2d567_1.conda#5ba79d7c71f03c678c8ead841f347d6e -https://conda.anaconda.org/conda-forge/osx-64/cctools_osx-64-1010.6-hd19c6af_4.conda#1ddf5221f68b7df9e22795cdb01933e2 +https://conda.anaconda.org/conda-forge/osx-64/cctools_osx-64-1010.6-hd19c6af_6.conda#4694e9e497454a8ce5b9fb61e50d9c5d https://conda.anaconda.org/conda-forge/osx-64/clang-18.1.8-default_h576c50e_8.conda#0a7a5caf8e1f0b52b96104bbd2ee677f https://conda.anaconda.org/conda-forge/osx-64/libblas-3.9.0-20_osx64_mkl.conda#160fdc97a51d66d51dc782fb67d35205 https://conda.anaconda.org/conda-forge/noarch/meson-python-0.17.1-pyh70fd9c4_1.conda#7a02679229c6c2092571b4c025055440 https://conda.anaconda.org/conda-forge/osx-64/mkl-devel-2023.2.0-h694c41f_50500.conda#1b4d0235ef253a1e19459351badf4f9f -https://conda.anaconda.org/conda-forge/noarch/pytest-cov-6.0.0-pyhd8ed1ab_1.conda#79963c319d1be62c8fd3e34555816e01 +https://conda.anaconda.org/conda-forge/noarch/pytest-cov-6.1.1-pyhd8ed1ab_0.conda#1e35d8f975bc0e984a19819aa91c440a https://conda.anaconda.org/conda-forge/noarch/pytest-xdist-3.6.1-pyhd8ed1ab_1.conda#59aad4fb37cabc0bacc73cf344612ddd -https://conda.anaconda.org/conda-forge/osx-64/cctools-1010.6-ha66f10e_4.conda#df1dfc9721444ad44d0916d9454e55f3 +https://conda.anaconda.org/conda-forge/osx-64/cctools-1010.6-ha66f10e_6.conda#a126dcde2752751ac781b67238f7fac4 https://conda.anaconda.org/conda-forge/osx-64/clangxx-18.1.8-default_heb2e8d1_8.conda#06a53a18fa886ec96f519b9022eeb449 https://conda.anaconda.org/conda-forge/osx-64/libcblas-3.9.0-20_osx64_mkl.conda#51089a4865eb4aec2bc5c7468bd07f9f https://conda.anaconda.org/conda-forge/osx-64/liblapack-3.9.0-20_osx64_mkl.conda#58f08e12ad487fac4a08f90ff0b87aec diff --git a/build_tools/azure/pylatest_conda_mkl_no_openmp_osx-64_conda.lock b/build_tools/azure/pylatest_conda_mkl_no_openmp_osx-64_conda.lock index 62d975f5d717a..a4d9900f69f1c 100644 --- a/build_tools/azure/pylatest_conda_mkl_no_openmp_osx-64_conda.lock +++ b/build_tools/azure/pylatest_conda_mkl_no_openmp_osx-64_conda.lock @@ -27,7 +27,7 @@ https://repo.anaconda.com/pkgs/main/osx-64/openssl-3.0.16-h184c1cd_0.conda#8e3c1 https://repo.anaconda.com/pkgs/main/osx-64/readline-8.2-hca72f7f_0.conda#971667436260e523f6f7355fdfa238bf https://repo.anaconda.com/pkgs/main/osx-64/tbb-2021.8.0-ha357a0b_0.conda#fb48530a3eea681c11dafb95b3387c0f https://repo.anaconda.com/pkgs/main/osx-64/tk-8.6.14-h4d00af3_0.conda#a2c03940c2ae54614301ec82e6a98d75 -https://repo.anaconda.com/pkgs/main/osx-64/freetype-2.12.1-hd8bbffd_0.conda#1f276af321375ee7fe8056843044fa76 +https://repo.anaconda.com/pkgs/main/osx-64/freetype-2.13.3-h02243ff_0.conda#acf5e48106235eb200eecb79119c7ffc https://repo.anaconda.com/pkgs/main/osx-64/libgfortran-5.0.0-11_3_0_hecd8cb5_28.conda#2eb13b680803f1064e53873ae0aaafb3 https://repo.anaconda.com/pkgs/main/osx-64/mkl-2023.1.0-h8e150cf_43560.conda#85d0f3431dd5c6ae44f8725fdd3d3e59 https://repo.anaconda.com/pkgs/main/osx-64/sqlite-3.45.3-h6c40b1e_0.conda#2edf909b937b3aad48322c9cb2e8f1a0 @@ -76,7 +76,7 @@ https://repo.anaconda.com/pkgs/main/osx-64/scipy-1.11.4-py312h81688c2_0.conda#7d https://repo.anaconda.com/pkgs/main/osx-64/pandas-2.2.3-py312h6d0c2b6_0.conda#84ce5b8ec4a986d13a5df17811f556a2 https://repo.anaconda.com/pkgs/main/osx-64/pyamg-5.2.1-py312h1962661_0.conda#58881950d4ce74c9302b56961f97a43c # pip cython @ https://files.pythonhosted.org/packages/e6/6c/3be501a6520a93449b1e7e6f63e598ec56f3b5d1bc7ad14167c72a22ddf7/Cython-3.0.12-cp312-cp312-macosx_10_9_x86_64.whl#sha256=fe030d4a00afb2844f5f70896b7f2a1a0d7da09bf3aa3d884cbe5f73fff5d310 -# pip meson @ https://files.pythonhosted.org/packages/ab/3b/63fdad828b4cbeb49cef3aad26f3edfbc72f37a0ab54917d445ec0b9d9ff/meson-1.7.0-py3-none-any.whl#sha256=ae3f12953045f3c7c60e27f2af1ad862f14dee125b4ed9bcb8a842a5080dbf85 +# pip meson @ https://files.pythonhosted.org/packages/e5/2b/46bda4ef5a7ae4135dbfe27fc0368c44e5a349a897a54fdf2cedb8dcb66e/meson-1.7.2-py3-none-any.whl#sha256=82c6818dc81743c96de3a458f06175776ebfde4081195ea31ea6971838f25e38 # pip threadpoolctl @ https://files.pythonhosted.org/packages/32/d5/f9a850d79b0851d1d4ef6456097579a9005b31fea68726a4ae5f2d82ddd9/threadpoolctl-3.6.0-py3-none-any.whl#sha256=43a0b8fd5a2928500110039e43a5eed8480b918967083ea48dc3ab9f13c4a7fb # pip pyproject-metadata @ https://files.pythonhosted.org/packages/7e/b1/8e63033b259e0a4e40dd1ec4a9fee17718016845048b43a36ec67d62e6fe/pyproject_metadata-0.9.1-py3-none-any.whl#sha256=ee5efde548c3ed9b75a354fc319d5afd25e9585fa918a34f62f904cc731973ad # pip meson-python @ https://files.pythonhosted.org/packages/7d/ec/40c0ddd29ef4daa6689a2b9c5ced47d5b58fa54ae149b19e9a97f4979c8c/meson_python-0.17.1-py3-none-any.whl#sha256=30a75c52578ef14aff8392677b09c39346e0a24d2b2c6204b8ed30583c11269c diff --git a/build_tools/azure/pylatest_pip_openblas_pandas_linux-64_conda.lock b/build_tools/azure/pylatest_pip_openblas_pandas_linux-64_conda.lock index 58b87952fda46..d0f9fc7ddfdfb 100644 --- a/build_tools/azure/pylatest_pip_openblas_pandas_linux-64_conda.lock +++ b/build_tools/azure/pylatest_pip_openblas_pandas_linux-64_conda.lock @@ -37,19 +37,19 @@ https://repo.anaconda.com/pkgs/main/linux-64/pip-25.0-py313h06a4308_0.conda#cbe2 # pip cython @ https://files.pythonhosted.org/packages/a8/30/7f48207ea13dab46604db0dd388e807d53513ba6ad1c34462892072f8f8c/Cython-3.0.12-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl#sha256=879ae9023958d63c0675015369384642d0afb9c9d1f3473df9186c42f7a9d265 # pip docutils @ https://files.pythonhosted.org/packages/8f/d7/9322c609343d929e75e7e5e6255e614fcc67572cfd083959cdef3b7aad79/docutils-0.21.2-py3-none-any.whl#sha256=dafca5b9e384f0e419294eb4d2ff9fa826435bf15f15b7bd45723e8ad76811b2 # pip execnet @ https://files.pythonhosted.org/packages/43/09/2aea36ff60d16dd8879bdb2f5b3ee0ba8d08cbbdcdfe870e695ce3784385/execnet-2.1.1-py3-none-any.whl#sha256=26dee51f1b80cebd6d0ca8e74dd8745419761d3bef34163928cbebbdc4749fdc -# pip fonttools @ https://files.pythonhosted.org/packages/be/6a/fd4018e0448c8a5e12138906411282c5eab51a598493f080a9f0960e658f/fonttools-4.56.0-cp313-cp313-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl#sha256=a05d1f07eb0a7d755fbe01fee1fd255c3a4d3730130cf1bfefb682d18fd2fcea +# pip fonttools @ https://files.pythonhosted.org/packages/f8/ad/c25116352f456c0d1287545a7aa24e98987b6d99c5b0456c4bd14321f20f/fonttools-4.57.0-cp313-cp313-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl#sha256=4dea5893b58d4637ffa925536462ba626f8a1b9ffbe2f5c272cdf2c6ebadb817 # pip idna @ https://files.pythonhosted.org/packages/76/c6/c88e154df9c4e1a2a66ccf0005a88dfb2650c1dffb6f5ce603dfbd452ce3/idna-3.10-py3-none-any.whl#sha256=946d195a0d259cbba61165e88e65941f16e9b36ea6ddb97f00452bae8b1287d3 # pip imagesize @ https://files.pythonhosted.org/packages/ff/62/85c4c919272577931d407be5ba5d71c20f0b616d31a0befe0ae45bb79abd/imagesize-1.4.1-py2.py3-none-any.whl#sha256=0d8d18d08f840c19d0ee7ca1fd82490fdc3729b7ac93f49870406ddde8ef8d8b # pip iniconfig @ https://files.pythonhosted.org/packages/2c/e1/e6716421ea10d38022b952c159d5161ca1193197fb744506875fbb87ea7b/iniconfig-2.1.0-py3-none-any.whl#sha256=9deba5723312380e77435581c6bf4935c94cbfab9b1ed33ef8d238ea168eb760 # pip joblib @ https://files.pythonhosted.org/packages/91/29/df4b9b42f2be0b623cbd5e2140cafcaa2bef0759a00b7b70104dcfe2fb51/joblib-1.4.2-py3-none-any.whl#sha256=06d478d5674cbc267e7496a410ee875abd68e4340feff4490bcb7afb88060ae6 # pip kiwisolver @ https://files.pythonhosted.org/packages/8f/e9/6a7d025d8da8c4931522922cd706105aa32b3291d1add8c5427cdcd66e63/kiwisolver-1.4.8-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl#sha256=a5ce1e481a74b44dd5e92ff03ea0cb371ae7a0268318e202be06c8f04f4f1246 # pip markupsafe @ https://files.pythonhosted.org/packages/0c/91/96cf928db8236f1bfab6ce15ad070dfdd02ed88261c2afafd4b43575e9e9/MarkupSafe-3.0.2-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl#sha256=15ab75ef81add55874e7ab7055e9c397312385bd9ced94920f2802310c930396 -# pip meson @ https://files.pythonhosted.org/packages/ab/3b/63fdad828b4cbeb49cef3aad26f3edfbc72f37a0ab54917d445ec0b9d9ff/meson-1.7.0-py3-none-any.whl#sha256=ae3f12953045f3c7c60e27f2af1ad862f14dee125b4ed9bcb8a842a5080dbf85 +# pip meson @ https://files.pythonhosted.org/packages/e5/2b/46bda4ef5a7ae4135dbfe27fc0368c44e5a349a897a54fdf2cedb8dcb66e/meson-1.7.2-py3-none-any.whl#sha256=82c6818dc81743c96de3a458f06175776ebfde4081195ea31ea6971838f25e38 # pip networkx @ https://files.pythonhosted.org/packages/b9/54/dd730b32ea14ea797530a4479b2ed46a6fb250f682a9cfb997e968bf0261/networkx-3.4.2-py3-none-any.whl#sha256=df5d4365b724cf81b8c6a7312509d0c22386097011ad1abe274afd5e9d3bbc5f # pip ninja @ https://files.pythonhosted.org/packages/eb/7a/455d2877fe6cf99886849c7f9755d897df32eaf3a0fba47b56e615f880f7/ninja-1.11.1.4-py3-none-manylinux_2_12_x86_64.manylinux2010_x86_64.whl#sha256=096487995473320de7f65d622c3f1d16c3ad174797602218ca8c967f51ec38a0 # pip numpy @ https://files.pythonhosted.org/packages/4b/04/e208ff3ae3ddfbafc05910f89546382f15a3f10186b1f56bd99f159689c2/numpy-2.2.4-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl#sha256=bce43e386c16898b91e162e5baaad90c4b06f9dcbe36282490032cec98dc8ae7 # pip packaging @ https://files.pythonhosted.org/packages/88/ef/eb23f262cca3c0c4eb7ab1933c3b1f03d021f2c48f54763065b6f0e321be/packaging-24.2-py3-none-any.whl#sha256=09abb1bccd265c01f4a3aa3f7a7db064b36514d2cba19a2f694fe6150451a759 -# pip pillow @ https://files.pythonhosted.org/packages/de/7c/7433122d1cfadc740f577cb55526fdc39129a648ac65ce64db2eb7209277/pillow-11.1.0-cp313-cp313-manylinux_2_28_x86_64.whl#sha256=3764d53e09cdedd91bee65c2527815d315c6b90d7b8b79759cc48d7bf5d4f114 +# pip pillow @ https://files.pythonhosted.org/packages/b4/d8/20a183f52b2703afb1243aa1cb80b3bbcfe32f75507615ca93889de24e71/pillow-11.2.0-cp313-cp313-manylinux_2_28_x86_64.whl#sha256=676461578f605c8e56ea108c371632e4bf40697996d80b5899c592043432e5f1 # pip pluggy @ https://files.pythonhosted.org/packages/88/5f/e351af9a41f866ac3f1fac4ca0613908d9a41741cfcf2228f4ad853b697d/pluggy-1.5.0-py3-none-any.whl#sha256=44e1ad92c8ca002de6377e165f3e0f1be63266ab4d554740532335b9d75ea669 # pip pygments @ https://files.pythonhosted.org/packages/8a/0b/9fcc47d19c48b59121088dd6da2488a49d5f72dacf8262e2790a1d2c7d15/pygments-2.19.1-py3-none-any.whl#sha256=9ea1544ad55cecf4b8242fab6dd35a93bbce657034b0611ee383099054ab6d8c # pip pyparsing @ https://files.pythonhosted.org/packages/05/e7/df2285f3d08fee213f2d041540fa4fc9ca6c2d44cf36d3a035bf2a8d2bcc/pyparsing-3.2.3-py3-none-any.whl#sha256=a749938e02d6fd0b59b356ca504a24982314bb090c383e3cf201c95ef7e2bfcf @@ -83,9 +83,9 @@ https://repo.anaconda.com/pkgs/main/linux-64/pip-25.0-py313h06a4308_0.conda#cbe2 # pip meson-python @ https://files.pythonhosted.org/packages/7d/ec/40c0ddd29ef4daa6689a2b9c5ced47d5b58fa54ae149b19e9a97f4979c8c/meson_python-0.17.1-py3-none-any.whl#sha256=30a75c52578ef14aff8392677b09c39346e0a24d2b2c6204b8ed30583c11269c # pip pandas @ https://files.pythonhosted.org/packages/e8/31/aa8da88ca0eadbabd0a639788a6da13bb2ff6edbbb9f29aa786450a30a91/pandas-2.2.3-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl#sha256=f3a255b2c19987fbbe62a9dfd6cff7ff2aa9ccab3fc75218fd4b7530f01efa24 # pip pyamg @ https://files.pythonhosted.org/packages/cd/a7/0df731cbfb09e73979a1a032fc7bc5be0eba617d798b998a0f887afe8ade/pyamg-5.2.1-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl#sha256=6999b351ab969c79faacb81faa74c0fa9682feeff3954979212872a3ee40c298 -# pip pytest-cov @ https://files.pythonhosted.org/packages/36/3b/48e79f2cd6a61dbbd4807b4ed46cb564b4fd50a76166b1c4ea5c1d9e2371/pytest_cov-6.0.0-py3-none-any.whl#sha256=eee6f1b9e61008bd34975a4d5bab25801eb31898b032dd55addc93e96fcaaa35 +# pip pytest-cov @ https://files.pythonhosted.org/packages/28/d0/def53b4a790cfb21483016430ed828f64830dd981ebe1089971cd10cab25/pytest_cov-6.1.1-py3-none-any.whl#sha256=bddf29ed2d0ab6f4df17b4c55b0a657287db8684af9c42ea546b21b1041b3dde # pip pytest-xdist @ https://files.pythonhosted.org/packages/6d/82/1d96bf03ee4c0fdc3c0cbe61470070e659ca78dc0086fb88b66c185e2449/pytest_xdist-3.6.1-py3-none-any.whl#sha256=9ed4adfb68a016610848639bb7e02c9352d5d9f03d04809919e2dafc3be4cca7 # pip scikit-image @ https://files.pythonhosted.org/packages/cd/9b/c3da56a145f52cd61a68b8465d6a29d9503bc45bc993bb45e84371c97d94/scikit_image-0.25.2-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl#sha256=b8abd3c805ce6944b941cfed0406d88faeb19bab3ed3d4b50187af55cf24d147 -# pip scipy-doctest @ https://files.pythonhosted.org/packages/ca/e9/0330ebc475a142c6cb0c21a401037ab839b7c5d9bc88f9f04cf8ba07f196/scipy_doctest-1.6-py3-none-any.whl#sha256=665af41687eff8f61a506408cc0dbddbe2f822179b2c59579596aba50566dc3b +# pip scipy-doctest @ https://files.pythonhosted.org/packages/76/eb/668949f884d5fe8a0d231dcba42c02e7b84626b35ca9072d6283c3aae773/scipy_doctest-1.7.1-py3-none-any.whl#sha256=dece106ec5ac8c595cc6372480d724e68c684450124dd0ddeb6be487ad62b365 # pip sphinx @ https://files.pythonhosted.org/packages/2f/72/9a437a9dc5393c0eabba447bdb6233a7b02bb23e84975f17ad9a9ca86677/sphinx-8.3.0-py3-none-any.whl#sha256=bd8fcf35ab2c4240b01c74a411c948350a3aebd6aa175579363754ed380d350a # pip numpydoc @ https://files.pythonhosted.org/packages/6c/45/56d99ba9366476cd8548527667f01869279cedb9e66b28eb4dfb27701679/numpydoc-1.8.0-py3-none-any.whl#sha256=72024c7fd5e17375dec3608a27c03303e8ad00c81292667955c6fea7a3ccf541 diff --git a/build_tools/azure/pymin_conda_forge_mkl_win-64_conda.lock b/build_tools/azure/pymin_conda_forge_mkl_win-64_conda.lock index 1ed2de82c9b52..d7488dccc0d05 100644 --- a/build_tools/azure/pymin_conda_forge_mkl_win-64_conda.lock +++ b/build_tools/azure/pymin_conda_forge_mkl_win-64_conda.lock @@ -9,7 +9,7 @@ https://conda.anaconda.org/conda-forge/noarch/font-ttf-source-code-pro-2.038-h77 https://conda.anaconda.org/conda-forge/noarch/font-ttf-ubuntu-0.83-h77eed37_3.conda#49023d73832ef61042f6a237cb2687e7 https://conda.anaconda.org/conda-forge/win-64/intel-openmp-2024.2.1-h57928b3_1083.conda#2d89243bfb53652c182a7c73182cce4f https://conda.anaconda.org/conda-forge/win-64/mkl-include-2024.2.2-h66d3029_15.conda#e2f516189b44b6e042199d13e7015361 -https://conda.anaconda.org/conda-forge/win-64/python_abi-3.10-5_cp310.conda#3c510f4c4383f5fbdb12fdd971b30d49 +https://conda.anaconda.org/conda-forge/win-64/python_abi-3.10-6_cp310.conda#041cd0bfc8be015fbd78b5b2fe9b168e https://conda.anaconda.org/conda-forge/noarch/tzdata-2025b-h78e105d_0.conda#4222072737ccff51314b5ece9c7d6f5a https://conda.anaconda.org/conda-forge/win-64/ucrt-10.0.22621.0-h57928b3_1.conda#6797b005cd0f439c4c5c9ac565783700 https://conda.anaconda.org/conda-forge/noarch/fonts-conda-forge-1-0.tar.bz2#f766549260d6815b0c52253f1fb1bb29 @@ -27,11 +27,11 @@ https://conda.anaconda.org/conda-forge/win-64/icu-75.1-he0c23c2_0.conda#8579b6bb https://conda.anaconda.org/conda-forge/win-64/lerc-4.0.0-h63175ca_0.tar.bz2#1900cb3cab5055833cfddb0ba233b074 https://conda.anaconda.org/conda-forge/win-64/libbrotlicommon-1.1.0-h2466b09_2.conda#f7dc9a8f21d74eab46456df301da2972 https://conda.anaconda.org/conda-forge/win-64/libdeflate-1.23-h9062f6e_0.conda#a9624935147a25b06013099d3038e467 -https://conda.anaconda.org/conda-forge/win-64/libexpat-2.6.4-he0c23c2_0.conda#eb383771c680aa792feb529eaf9df82f -https://conda.anaconda.org/conda-forge/win-64/libffi-3.4.6-h537db12_0.conda#31d5107f75b2f204937728417e2e39e5 +https://conda.anaconda.org/conda-forge/win-64/libexpat-2.7.0-he0c23c2_0.conda#b6f5352fdb525662f4169a0431d2dd7a +https://conda.anaconda.org/conda-forge/win-64/libffi-3.4.6-h537db12_1.conda#85d8fa5e55ed8f93f874b3b23ed54ec6 https://conda.anaconda.org/conda-forge/win-64/libiconv-1.18-h135ad9c_1.conda#21fc5dba2cbcd8e5e26ff976a312122c https://conda.anaconda.org/conda-forge/win-64/libjpeg-turbo-3.0.0-hcfcfb64_1.conda#3f1b948619c45b1ca714d60c7389092c -https://conda.anaconda.org/conda-forge/win-64/liblzma-5.6.4-h2466b09_0.conda#c48f6ad0ef0a555b27b233dfcab46a90 +https://conda.anaconda.org/conda-forge/win-64/liblzma-5.8.1-h2466b09_0.conda#8d5cb0016b645d6688e2ff57c5d51302 https://conda.anaconda.org/conda-forge/win-64/libsqlite-3.49.1-h67fdade_2.conda#b58b66d4ad1aaf1c2543cbbd6afb1a59 https://conda.anaconda.org/conda-forge/win-64/libwebp-base-1.5.0-h3b0e114_0.conda#33f7313967072c6e6d8f865f5493c7ae https://conda.anaconda.org/conda-forge/win-64/libzlib-1.3.1-h2466b09_2.conda#41fbfac52c601159df6c01f875de31b9 @@ -46,9 +46,9 @@ https://conda.anaconda.org/conda-forge/win-64/libbrotlienc-1.1.0-h2466b09_2.cond https://conda.anaconda.org/conda-forge/win-64/libgcc-14.2.0-h1383e82_2.conda#4a74c1461a0ba47a3346c04bdccbe2ad https://conda.anaconda.org/conda-forge/win-64/libintl-0.22.5-h5728263_3.conda#2cf0cf76cc15d360dfa2f17fd6cf9772 https://conda.anaconda.org/conda-forge/win-64/libpng-1.6.47-had7236b_0.conda#7d717163d9dab337c65f2bf21a676b8f -https://conda.anaconda.org/conda-forge/win-64/libxml2-2.13.7-he286e8c_0.conda#aec4cf455e4c6cc2644abb348de7ff20 +https://conda.anaconda.org/conda-forge/win-64/libxml2-2.13.7-h442d1da_1.conda#c14ff7f05e57489df9244917d2b55763 https://conda.anaconda.org/conda-forge/win-64/pcre2-10.44-h3d7b363_2.conda#a3a3baddcfb8c80db84bec3cb7746fb8 -https://conda.anaconda.org/conda-forge/win-64/python-3.10.16-h37870fc_1_cpython.conda#5c292a7bd9c32a256ba7939b3e6dee03 +https://conda.anaconda.org/conda-forge/win-64/python-3.10.16-hfdde91d_2_cpython.conda#d4d056da0f59dc89bf5155901f096428 https://conda.anaconda.org/conda-forge/win-64/zstd-1.5.7-hbeecb71_2.conda#21f56217d6125fb30c3c3f10c786d751 https://conda.anaconda.org/conda-forge/win-64/brotli-bin-1.1.0-h2466b09_2.conda#d22534a9be5771fc58eb7564947f669d https://conda.anaconda.org/conda-forge/noarch/colorama-0.4.6-pyhd8ed1ab_1.conda#962b9857ee8e7018c22f2776ffa0b2d7 @@ -59,8 +59,8 @@ https://conda.anaconda.org/conda-forge/noarch/execnet-2.1.1-pyhd8ed1ab_1.conda#a https://conda.anaconda.org/conda-forge/win-64/freetype-2.13.3-h0b5ce68_0.conda#9c461ed7b07fb360d2c8cfe726c7d521 https://conda.anaconda.org/conda-forge/noarch/iniconfig-2.0.0-pyhd8ed1ab_1.conda#6837f3eff7dcea42ecd714ce1ac2b108 https://conda.anaconda.org/conda-forge/win-64/kiwisolver-1.4.7-py310hc19bc0b_0.conda#50d96539497fc7493cbe469fbb6b8b6e -https://conda.anaconda.org/conda-forge/win-64/libclang13-20.1.1-default_ha5278ca_0.conda#c432d7ab334986169fd534725fc9375d -https://conda.anaconda.org/conda-forge/win-64/libglib-2.84.0-h7025463_0.conda#ea8df8a5c5c7adf4c03bf9e3db1637c3 +https://conda.anaconda.org/conda-forge/win-64/libclang13-20.1.2-default_ha5278ca_0.conda#4270e55ba56854c5098a51592e45809a +https://conda.anaconda.org/conda-forge/win-64/libglib-2.84.1-h7025463_0.conda#6cbaea9075a4f007eb7d0a90bb9a2a09 https://conda.anaconda.org/conda-forge/win-64/libhwloc-2.11.2-default_ha69328c_1001.conda#b87a0ac5ab6495d8225db5dc72dd21cd https://conda.anaconda.org/conda-forge/win-64/libtiff-4.7.0-h797046b_3.conda#defed79ff7a9164ad40320e3f116a138 https://conda.anaconda.org/conda-forge/win-64/libxslt-1.1.39-h3df6e99_0.conda#279ee338c9b34871d578cb3c7aa68f70 @@ -69,7 +69,7 @@ https://conda.anaconda.org/conda-forge/noarch/packaging-24.2-pyhd8ed1ab_2.conda# https://conda.anaconda.org/conda-forge/noarch/pluggy-1.5.0-pyhd8ed1ab_1.conda#e9dcbce5f45f9ee500e728ae58b605b6 https://conda.anaconda.org/conda-forge/win-64/pthread-stubs-0.4-h0e40799_1002.conda#3c8f2573569bb816483e5cf57efbbe29 https://conda.anaconda.org/conda-forge/noarch/pyparsing-3.2.3-pyhd8ed1ab_1.conda#513d3c262ee49b54a8fec85c5bc99764 -https://conda.anaconda.org/conda-forge/noarch/setuptools-75.8.2-pyhff2d567_0.conda#9bddfdbf4e061821a1a443f93223be61 +https://conda.anaconda.org/conda-forge/noarch/setuptools-78.1.0-pyhff2d567_0.conda#a42da9837e46c53494df0044c3eb1f53 https://conda.anaconda.org/conda-forge/noarch/six-1.17.0-pyhd8ed1ab_0.conda#a451d576819089b0d672f18768be0f65 https://conda.anaconda.org/conda-forge/noarch/threadpoolctl-3.6.0-pyhecae5ae_0.conda#9d64911b31d57ca443e9f1e36b04385f https://conda.anaconda.org/conda-forge/noarch/toml-0.10.2-pyhd8ed1ab_1.conda#b0dd904de08b7db706167240bf37b164 @@ -85,7 +85,7 @@ https://conda.anaconda.org/conda-forge/win-64/fontconfig-2.15.0-h765892d_1.conda https://conda.anaconda.org/conda-forge/noarch/joblib-1.4.2-pyhd8ed1ab_1.conda#bf8243ee348f3a10a14ed0cae323e0c1 https://conda.anaconda.org/conda-forge/win-64/lcms2-2.17-hbcf6048_0.conda#3538827f77b82a837fa681a4579e37a1 https://conda.anaconda.org/conda-forge/win-64/libxcb-1.17.0-h0e4246c_0.conda#a69bbf778a462da324489976c84cfc8c -https://conda.anaconda.org/conda-forge/noarch/meson-1.7.0-pyhd8ed1ab_0.conda#6d4bbcce47061d2f9f2636409a8fe7c0 +https://conda.anaconda.org/conda-forge/noarch/meson-1.7.1-pyhd8ed1ab_0.conda#90018ee73b8741268027421ceac2809a https://conda.anaconda.org/conda-forge/win-64/openjpeg-2.5.3-h4d64b90_0.conda#fc050366dd0b8313eb797ed1ffef3a29 https://conda.anaconda.org/conda-forge/noarch/pip-25.0.1-pyh8b19718_0.conda#79b5c1440aedc5010f687048d9103628 https://conda.anaconda.org/conda-forge/noarch/pyproject-metadata-0.9.1-pyhd8ed1ab_0.conda#22ae7c6ea81e0c8661ef32168dda929b @@ -93,21 +93,21 @@ https://conda.anaconda.org/conda-forge/noarch/pytest-8.3.5-pyhd8ed1ab_0.conda#c3 https://conda.anaconda.org/conda-forge/noarch/python-dateutil-2.9.0.post0-pyhff2d567_1.conda#5ba79d7c71f03c678c8ead841f347d6e https://conda.anaconda.org/conda-forge/win-64/tbb-2021.13.0-h62715c5_1.conda#9190dd0a23d925f7602f9628b3aed511 https://conda.anaconda.org/conda-forge/win-64/cairo-1.18.4-h5782bbf_0.conda#20e32ced54300292aff690a69c5e7b97 -https://conda.anaconda.org/conda-forge/win-64/fonttools-4.56.0-py310h38315fa_0.conda#fd7c0f52022a6bbd9bc7f71c11faf59c +https://conda.anaconda.org/conda-forge/win-64/fonttools-4.57.0-py310h38315fa_0.conda#1f25f742c39582715cc058f5fe451975 https://conda.anaconda.org/conda-forge/noarch/meson-python-0.17.1-pyh70fd9c4_1.conda#7a02679229c6c2092571b4c025055440 https://conda.anaconda.org/conda-forge/win-64/mkl-2024.2.2-h66d3029_15.conda#302dff2807f2927b3e9e0d19d60121de https://conda.anaconda.org/conda-forge/win-64/pillow-11.1.0-py310h9595edc_0.conda#67a38507ac20bd85226fe6dd7ed87462 -https://conda.anaconda.org/conda-forge/noarch/pytest-cov-6.0.0-pyhd8ed1ab_1.conda#79963c319d1be62c8fd3e34555816e01 +https://conda.anaconda.org/conda-forge/noarch/pytest-cov-6.1.1-pyhd8ed1ab_0.conda#1e35d8f975bc0e984a19819aa91c440a https://conda.anaconda.org/conda-forge/noarch/pytest-xdist-3.6.1-pyhd8ed1ab_1.conda#59aad4fb37cabc0bacc73cf344612ddd https://conda.anaconda.org/conda-forge/win-64/harfbuzz-11.0.0-h9e37d49_0.conda#b7648427f5b6797ae3904ad76e4c7f19 https://conda.anaconda.org/conda-forge/win-64/libblas-3.9.0-31_h641d27c_mkl.conda#d05563c577fe2f37693a554b3f271e8f https://conda.anaconda.org/conda-forge/win-64/mkl-devel-2024.2.2-h57928b3_15.conda#a85f53093da069c7c657f090e388f3ef https://conda.anaconda.org/conda-forge/win-64/libcblas-3.9.0-31_h5e41251_mkl.conda#43c100b94ad2607382b0cf0f3a6b0bf3 https://conda.anaconda.org/conda-forge/win-64/liblapack-3.9.0-31_h1aa476e_mkl.conda#40b47ee720a185289760960fc6185750 -https://conda.anaconda.org/conda-forge/win-64/qt6-main-6.8.3-h72a539a_1.conda#1f2b193841a71a412f8af19c9925caf0 +https://conda.anaconda.org/conda-forge/win-64/qt6-main-6.9.0-h83cda92_0.conda#d92e5a0de3263315551d54d5574f5193 https://conda.anaconda.org/conda-forge/win-64/liblapacke-3.9.0-31_h845c4fa_mkl.conda#003a2041cb07a7cf698f48dd26301273 https://conda.anaconda.org/conda-forge/win-64/numpy-2.2.4-py310h4987827_0.conda#f345b8969677cf68503d28ce0c28e756 -https://conda.anaconda.org/conda-forge/win-64/pyside6-6.8.3-py310h60c6385_0.conda#7d2176204fae5a2f90c012b26bcc4d91 +https://conda.anaconda.org/conda-forge/win-64/pyside6-6.9.0-py310hc1b6536_0.conda#e90c8d8a817b5d63b7785d7d18c99ae0 https://conda.anaconda.org/conda-forge/win-64/blas-devel-3.9.0-31_hfb1a452_mkl.conda#0deeb3d9d6f0e56393c55ef382899010 https://conda.anaconda.org/conda-forge/win-64/contourpy-1.3.1-py310hc19bc0b_0.conda#741bcc6a07e77d3102aa23c580cad4f0 https://conda.anaconda.org/conda-forge/win-64/scipy-1.15.2-py310h15c175c_0.conda#81798168111d1021e3d815217c444418 diff --git a/build_tools/azure/pymin_conda_forge_openblas_min_dependencies_linux-64_conda.lock b/build_tools/azure/pymin_conda_forge_openblas_min_dependencies_linux-64_conda.lock index d0fcc47ce5dcd..c37b2b2e1c6e7 100644 --- a/build_tools/azure/pymin_conda_forge_openblas_min_dependencies_linux-64_conda.lock +++ b/build_tools/azure/pymin_conda_forge_openblas_min_dependencies_linux-64_conda.lock @@ -7,12 +7,12 @@ https://conda.anaconda.org/conda-forge/noarch/font-ttf-dejavu-sans-mono-2.37-hab https://conda.anaconda.org/conda-forge/noarch/font-ttf-inconsolata-3.000-h77eed37_0.tar.bz2#34893075a5c9e55cdafac56607368fc6 https://conda.anaconda.org/conda-forge/noarch/font-ttf-source-code-pro-2.038-h77eed37_0.tar.bz2#4d59c254e01d9cde7957100457e2d5fb https://conda.anaconda.org/conda-forge/noarch/font-ttf-ubuntu-0.83-h77eed37_3.conda#49023d73832ef61042f6a237cb2687e7 -https://conda.anaconda.org/conda-forge/linux-64/python_abi-3.10-5_cp310.conda#2921c34715e74b3587b4cff4d36844f9 +https://conda.anaconda.org/conda-forge/linux-64/python_abi-3.10-6_cp310.conda#01f0f2104b8466714804a72e511de599 https://conda.anaconda.org/conda-forge/noarch/tzdata-2025b-h78e105d_0.conda#4222072737ccff51314b5ece9c7d6f5a https://conda.anaconda.org/conda-forge/noarch/fonts-conda-forge-1-0.tar.bz2#f766549260d6815b0c52253f1fb1bb29 https://conda.anaconda.org/conda-forge/linux-64/ld_impl_linux-64-2.43-h712a8e2_4.conda#01f8d123c96816249efd255a31ad7712 https://conda.anaconda.org/conda-forge/linux-64/libglvnd-1.7.0-ha4b6fd6_2.conda#434ca7e50e40f4918ab701e3facd59a0 -https://conda.anaconda.org/conda-forge/linux-64/llvm-openmp-20.1.1-h024ca30_1.conda#cfae5693f2ee2117e75e5e533451e04c +https://conda.anaconda.org/conda-forge/linux-64/llvm-openmp-20.1.2-h024ca30_0.conda#322da3c0641a7f0dafd5be6d3ea23d96 https://conda.anaconda.org/conda-forge/linux-64/_openmp_mutex-4.5-3_kmp_llvm.conda#ee5c2118262e30b972bc0b4db8ef0ba5 https://conda.anaconda.org/conda-forge/noarch/fonts-conda-ecosystem-1-0.tar.bz2#fee5683a3f04bd15cbd8318b096a27ab https://conda.anaconda.org/conda-forge/linux-64/libegl-1.7.0-ha4b6fd6_2.conda#c151d5eb730e9b7480e6d48c0fc44048 @@ -27,7 +27,7 @@ https://conda.anaconda.org/conda-forge/linux-64/libgcc-ng-14.2.0-h69a702a_2.cond https://conda.anaconda.org/conda-forge/linux-64/libgettextpo-0.23.1-h5888daf_0.conda#a09ce5decdef385bcce78c32809fa794 https://conda.anaconda.org/conda-forge/linux-64/libgfortran5-14.2.0-hf1ad2bd_2.conda#556a4fdfac7287d349b8f09aba899693 https://conda.anaconda.org/conda-forge/linux-64/libiconv-1.18-h4ce23a2_1.conda#e796ff8ddc598affdf7c173d6145f087 -https://conda.anaconda.org/conda-forge/linux-64/liblzma-5.6.4-hb9d3cd8_0.conda#42d5b6a0f30d3c10cd88cb8584fda1cb +https://conda.anaconda.org/conda-forge/linux-64/liblzma-5.8.1-hb9d3cd8_0.conda#0e87378639676987af32fee53ba32258 https://conda.anaconda.org/conda-forge/linux-64/libntlm-1.8-hb9d3cd8_0.conda#7c7927b404672409d9917d49bff5f2d6 https://conda.anaconda.org/conda-forge/linux-64/libstdcxx-14.2.0-h8f9b012_2.conda#a78c856b6dc6bf4ea8daeb9beaaa3fb0 https://conda.anaconda.org/conda-forge/linux-64/libwebp-base-1.5.0-h851e524_0.conda#63f790534398730f59e1b899c3644d4a @@ -86,7 +86,7 @@ https://conda.anaconda.org/conda-forge/linux-64/mysql-libs-9.0.1-he0572af_5.cond https://conda.anaconda.org/conda-forge/linux-64/ninja-1.12.1-h297d8ca_0.conda#3aa1c7e292afeff25a0091ddd7c69b72 https://conda.anaconda.org/conda-forge/linux-64/nss-3.110-h159eef7_0.conda#945659af183e87429c8aa7e0be3cc91d https://conda.anaconda.org/conda-forge/linux-64/pcre2-10.44-hba22ea6_2.conda#df359c09c41cd186fffb93a2d87aa6f5 -https://conda.anaconda.org/conda-forge/linux-64/python-3.10.16-he725a3c_1_cpython.conda#b887811a901b3aa622a92caf03bc8917 +https://conda.anaconda.org/conda-forge/linux-64/python-3.10.16-habfa6aa_2_cpython.conda#35e864ff2ec654d09fdc189706dfd139 https://conda.anaconda.org/conda-forge/linux-64/xcb-util-0.4.1-hb711507_2.conda#8637c3e5821654d0edf97e2b0404b443 https://conda.anaconda.org/conda-forge/linux-64/xcb-util-keysyms-0.4.1-hb711507_0.conda#ad748ccca349aec3e91743e08b5e2b50 https://conda.anaconda.org/conda-forge/linux-64/xcb-util-renderutil-0.3.10-hb711507_0.conda#0e0cbe0564d03a99afd5fd7b362feecd @@ -106,26 +106,26 @@ https://conda.anaconda.org/conda-forge/linux-64/gettext-0.23.1-h5888daf_0.conda# https://conda.anaconda.org/conda-forge/noarch/iniconfig-2.0.0-pyhd8ed1ab_1.conda#6837f3eff7dcea42ecd714ce1ac2b108 https://conda.anaconda.org/conda-forge/linux-64/kiwisolver-1.4.7-py310h3788b33_0.conda#4186d9b4d004b0fe0de6aa62496fb48a https://conda.anaconda.org/conda-forge/linux-64/libcups-2.3.3-h4637d8d_4.conda#d4529f4dff3057982a7617c7ac58fde3 -https://conda.anaconda.org/conda-forge/linux-64/libglib-2.84.0-h2ff4ddf_0.conda#40cdeafb789a5513415f7bdbef053cf5 +https://conda.anaconda.org/conda-forge/linux-64/libglib-2.84.1-h2ff4ddf_0.conda#0305434da649d4fb48a425e588b79ea6 https://conda.anaconda.org/conda-forge/linux-64/libglx-1.7.0-ha4b6fd6_2.conda#c8013e438185f33b13814c5c488acd5c https://conda.anaconda.org/conda-forge/linux-64/libhiredis-1.0.2-h2cc385e_0.tar.bz2#b34907d3a81a3cd8095ee83d174c074a https://conda.anaconda.org/conda-forge/linux-64/libopenblas-0.3.25-pthreads_h413a1c8_0.conda#d172b34a443b95f86089e8229ddc9a17 https://conda.anaconda.org/conda-forge/linux-64/libsystemd0-257.4-h4e0b6ca_1.conda#04bcf3055e51f8dde6fab9672fb9fca0 https://conda.anaconda.org/conda-forge/linux-64/libtiff-4.7.0-hd9ff511_3.conda#0ea6510969e1296cc19966fad481f6de -https://conda.anaconda.org/conda-forge/linux-64/libxml2-2.13.7-h8d12d68_0.conda#109427e5576d0ce9c42257c2421b1680 +https://conda.anaconda.org/conda-forge/linux-64/libxml2-2.13.7-h4bc477f_1.conda#ad1f1f8238834cd3c88ceeaee8da444a https://conda.anaconda.org/conda-forge/noarch/munkres-1.1.4-pyh9f0ad1d_0.tar.bz2#2ba8498c1018c1e9c61eb99b973dfe19 https://conda.anaconda.org/conda-forge/noarch/packaging-24.2-pyhd8ed1ab_2.conda#3bfed7e6228ebf2f7b9eaa47f1b4e2aa https://conda.anaconda.org/conda-forge/noarch/pluggy-1.5.0-pyhd8ed1ab_1.conda#e9dcbce5f45f9ee500e728ae58b605b6 https://conda.anaconda.org/conda-forge/noarch/ply-3.11-pyhd8ed1ab_3.conda#fd5062942bfa1b0bd5e0d2a4397b099e https://conda.anaconda.org/conda-forge/noarch/pyparsing-3.2.3-pyhd8ed1ab_1.conda#513d3c262ee49b54a8fec85c5bc99764 https://conda.anaconda.org/conda-forge/noarch/pytz-2025.2-pyhd8ed1ab_0.conda#bc8e3267d44011051f2eb14d22fb0960 -https://conda.anaconda.org/conda-forge/noarch/setuptools-75.8.2-pyhff2d567_0.conda#9bddfdbf4e061821a1a443f93223be61 +https://conda.anaconda.org/conda-forge/noarch/setuptools-78.1.0-pyhff2d567_0.conda#a42da9837e46c53494df0044c3eb1f53 https://conda.anaconda.org/conda-forge/noarch/six-1.17.0-pyhd8ed1ab_0.conda#a451d576819089b0d672f18768be0f65 https://conda.anaconda.org/conda-forge/noarch/threadpoolctl-3.1.0-pyh8a188c0_0.tar.bz2#a2995ee828f65687ac5b1e71a2ab1e0c https://conda.anaconda.org/conda-forge/noarch/toml-0.10.2-pyhd8ed1ab_1.conda#b0dd904de08b7db706167240bf37b164 https://conda.anaconda.org/conda-forge/noarch/tomli-2.2.1-pyhd8ed1ab_1.conda#ac944244f1fed2eb49bae07193ae8215 https://conda.anaconda.org/conda-forge/linux-64/tornado-6.4.2-py310ha75aee5_0.conda#166d59aab40b9c607b4cc21c03924e9d -https://conda.anaconda.org/conda-forge/noarch/typing_extensions-4.13.0-pyh29332c3_1.conda#4c446320a86cc5d48e3b80e332d6ebd7 +https://conda.anaconda.org/conda-forge/noarch/typing_extensions-4.13.1-pyh29332c3_0.conda#5710c79a5fb0a6bfdba0a887f90583b1 https://conda.anaconda.org/conda-forge/linux-64/unicodedata2-16.0.0-py310ha75aee5_0.conda#1d7a4b9202cdd10d56ecdd7f6c347190 https://conda.anaconda.org/conda-forge/noarch/wheel-0.45.1-pyhd8ed1ab_1.conda#75cb7132eb58d97896e173ef12ac9986 https://conda.anaconda.org/conda-forge/linux-64/xcb-util-image-0.4.0-hb711507_2.conda#a0901183f08b6c7107aab109733a3c91 @@ -137,17 +137,16 @@ https://conda.anaconda.org/conda-forge/linux-64/cairo-1.18.4-h3394656_0.conda#09 https://conda.anaconda.org/conda-forge/linux-64/ccache-4.11.2-hd714d17_0.conda#35ae7ce74089ab05fdb1cb9746c0fbe4 https://conda.anaconda.org/conda-forge/linux-64/coverage-7.8.0-py310h89163eb_0.conda#9f7865c17117d16f804b687b498e35fa https://conda.anaconda.org/conda-forge/linux-64/dbus-1.13.6-h5008d03_3.tar.bz2#ecfff944ba3960ecb334b9a2663d708d -https://conda.anaconda.org/conda-forge/linux-64/fonttools-4.56.0-py310h89163eb_0.conda#cd3125e1924bd8699dac9989652bca74 -https://conda.anaconda.org/conda-forge/linux-64/glib-tools-2.84.0-h4833e2c_0.conda#2d876130380b1593f25c20998df37880 +https://conda.anaconda.org/conda-forge/linux-64/fonttools-4.57.0-py310h89163eb_0.conda#34378af82141b3c1725dcdf898b28fc6 +https://conda.anaconda.org/conda-forge/linux-64/glib-tools-2.84.1-h4833e2c_0.conda#ddc06964296eee2b4070e65415b332fd https://conda.anaconda.org/conda-forge/noarch/joblib-1.2.0-pyhd8ed1ab_0.tar.bz2#7583652522d71ad78ba536bba06940eb https://conda.anaconda.org/conda-forge/linux-64/lcms2-2.17-h717163a_0.conda#000e85703f0fd9594c81710dd5066471 https://conda.anaconda.org/conda-forge/linux-64/libblas-3.9.0-20_linux64_openblas.conda#2b7bb4f7562c8cf334fc2e20c2d28abc https://conda.anaconda.org/conda-forge/linux-64/libflac-1.4.3-h59595ed_0.conda#ee48bf17cc83a00f59ca1494d5646869 https://conda.anaconda.org/conda-forge/linux-64/libgl-1.7.0-ha4b6fd6_2.conda#928b8be80851f5d8ffb016f9c81dae7a -https://conda.anaconda.org/conda-forge/linux-64/libllvm19-19.1.7-ha7bfdaf_1.conda#6d2362046dce932eefbdeb0540de0c38 -https://conda.anaconda.org/conda-forge/linux-64/libllvm20-20.1.1-ha7bfdaf_0.conda#2e234fb7d6eeb5c32eb5b256403b5795 +https://conda.anaconda.org/conda-forge/linux-64/libllvm20-20.1.2-ha7bfdaf_0.conda#8354769527f9f441a3a04aa1c19188d9 https://conda.anaconda.org/conda-forge/linux-64/libxkbcommon-1.8.1-hc4a0caf_0.conda#e7e5b0652227d646b44abdcbd989da7b -https://conda.anaconda.org/conda-forge/noarch/meson-1.7.0-pyhd8ed1ab_0.conda#6d4bbcce47061d2f9f2636409a8fe7c0 +https://conda.anaconda.org/conda-forge/noarch/meson-1.7.1-pyhd8ed1ab_0.conda#90018ee73b8741268027421ceac2809a https://conda.anaconda.org/conda-forge/linux-64/openblas-0.3.25-pthreads_h7a3da1a_0.conda#87661673941b5e702275fdf0fc095ad0 https://conda.anaconda.org/conda-forge/linux-64/openjpeg-2.5.3-h5fbd93e_0.conda#9e5816bc95d285c115a3ebc2f8563564 https://conda.anaconda.org/conda-forge/linux-64/openldap-2.6.9-he970967_0.conda#ca2de8bbdc871bce41dbf59e51324165 @@ -158,18 +157,18 @@ https://conda.anaconda.org/conda-forge/noarch/python-dateutil-2.9.0.post0-pyhff2 https://conda.anaconda.org/conda-forge/linux-64/sip-6.7.12-py310hc6cd4ac_0.conda#68d5bfccaba2d89a7812098dd3966d9b https://conda.anaconda.org/conda-forge/linux-64/xorg-libxdamage-1.1.6-hb9d3cd8_0.conda#b5fcc7172d22516e1f965490e65e33a4 https://conda.anaconda.org/conda-forge/linux-64/xorg-libxxf86vm-1.1.6-hb9d3cd8_0.conda#5efa5fa6243a622445fdfd72aee15efa -https://conda.anaconda.org/conda-forge/linux-64/glib-2.84.0-h07242d1_0.conda#609bc3cf0d6fa5f35e33f49ffc72a09c -https://conda.anaconda.org/conda-forge/linux-64/harfbuzz-10.4.0-h76408a6_0.conda#81f137b4153cf111ff8e3188b6fb8e73 +https://conda.anaconda.org/conda-forge/linux-64/glib-2.84.1-h07242d1_0.conda#2c2357f18073331d4aefe7252b9fad17 +https://conda.anaconda.org/conda-forge/linux-64/harfbuzz-11.0.0-h76408a6_0.conda#347cb348bfc8d77062daee11c326e518 https://conda.anaconda.org/conda-forge/linux-64/libcblas-3.9.0-20_linux64_openblas.conda#36d486d72ab64ffea932329a1d3729a3 -https://conda.anaconda.org/conda-forge/linux-64/libclang-cpp19.1-19.1.7-default_hb5137d0_2.conda#62d6f9353753a12a281ae99e0a3403c4 -https://conda.anaconda.org/conda-forge/linux-64/libclang13-20.1.1-default_h9c6a7e4_0.conda#f8b1b8c13c0a0fede5e1a204eafb48f8 +https://conda.anaconda.org/conda-forge/linux-64/libclang-cpp20.1-20.1.2-default_hb5137d0_0.conda#729198eae19e9dbf8e0ffe355d416bde +https://conda.anaconda.org/conda-forge/linux-64/libclang13-20.1.2-default_h9c6a7e4_0.conda#c5fe177150aecc6ec46609b0a6123f39 https://conda.anaconda.org/conda-forge/linux-64/liblapack-3.9.0-20_linux64_openblas.conda#6fabc51f5e647d09cc010c40061557e0 -https://conda.anaconda.org/conda-forge/linux-64/libpq-17.4-h27ae623_0.conda#d67f3f3c33344ff3e9ef5270001e9011 +https://conda.anaconda.org/conda-forge/linux-64/libpq-17.4-h27ae623_1.conda#37fba334855ef3b51549308e61ed7a3d https://conda.anaconda.org/conda-forge/linux-64/libsndfile-1.2.2-hc60ed4a_1.conda#ef1910918dd895516a769ed36b5b3a4e https://conda.anaconda.org/conda-forge/noarch/meson-python-0.16.0-pyh0c530f3_0.conda#e16f0dbf502da873be9f9adb0dc52547 https://conda.anaconda.org/conda-forge/linux-64/pillow-11.1.0-py310h7e6dc6c_0.conda#14d300b9e1504748e70cc6499a7b4d25 https://conda.anaconda.org/conda-forge/linux-64/pyqt5-sip-12.12.2-py310hc6cd4ac_5.conda#ef5333594a958b25912002886b82b253 -https://conda.anaconda.org/conda-forge/noarch/pytest-cov-6.0.0-pyhd8ed1ab_1.conda#79963c319d1be62c8fd3e34555816e01 +https://conda.anaconda.org/conda-forge/noarch/pytest-cov-6.1.1-pyhd8ed1ab_0.conda#1e35d8f975bc0e984a19819aa91c440a https://conda.anaconda.org/conda-forge/noarch/pytest-xdist-3.6.1-pyhd8ed1ab_1.conda#59aad4fb37cabc0bacc73cf344612ddd https://conda.anaconda.org/conda-forge/linux-64/gstreamer-1.24.7-hf3bb09a_0.conda#c78bc4ef0afb3cd2365d9973c71fc876 https://conda.anaconda.org/conda-forge/linux-64/liblapacke-3.9.0-20_linux64_openblas.conda#05c5862c7dc25e65ba6c471d96429dae @@ -183,6 +182,6 @@ https://conda.anaconda.org/conda-forge/linux-64/polars-0.20.30-py310h031f9ce_0.c https://conda.anaconda.org/conda-forge/linux-64/scipy-1.8.0-py310hea5193d_1.tar.bz2#664d80ddeb51241629b3ada5ea926e4d https://conda.anaconda.org/conda-forge/linux-64/blas-2.120-openblas.conda#c8f6916a81a340650078171b1d852574 https://conda.anaconda.org/conda-forge/linux-64/pyamg-4.2.1-py310h7c3ba0c_0.tar.bz2#89f5a48e1f23b5cf3163a6094903d181 -https://conda.anaconda.org/conda-forge/linux-64/qt-main-5.15.15-hc3cb62f_2.conda#eadc22e45a87c8d5c71670d9ec956aba +https://conda.anaconda.org/conda-forge/linux-64/qt-main-5.15.15-h993ce98_3.conda#aa49f5308f39277477d47cd6687eb8f3 https://conda.anaconda.org/conda-forge/linux-64/pyqt-5.15.9-py310h04931ad_5.conda#f4fe7a6e3d7c78c9de048ea9dda21690 https://conda.anaconda.org/conda-forge/linux-64/matplotlib-3.5.0-py310hff52083_0.tar.bz2#1b2f3b135d5d9c594b5e0e6150c03b7b diff --git a/build_tools/azure/pymin_conda_forge_openblas_ubuntu_2204_linux-64_conda.lock b/build_tools/azure/pymin_conda_forge_openblas_ubuntu_2204_linux-64_conda.lock index 88f8501dee71d..599a71068d167 100644 --- a/build_tools/azure/pymin_conda_forge_openblas_ubuntu_2204_linux-64_conda.lock +++ b/build_tools/azure/pymin_conda_forge_openblas_ubuntu_2204_linux-64_conda.lock @@ -4,17 +4,17 @@ @EXPLICIT https://conda.anaconda.org/conda-forge/linux-64/_libgcc_mutex-0.1-conda_forge.tar.bz2#d7c89558ba9fa0495403155b64376d81 https://conda.anaconda.org/conda-forge/linux-64/ca-certificates-2025.1.31-hbcca054_0.conda#19f3a56f68d2fd06c516076bff482c52 -https://conda.anaconda.org/conda-forge/linux-64/python_abi-3.10-5_cp310.conda#2921c34715e74b3587b4cff4d36844f9 +https://conda.anaconda.org/conda-forge/linux-64/python_abi-3.10-6_cp310.conda#01f0f2104b8466714804a72e511de599 https://conda.anaconda.org/conda-forge/noarch/tzdata-2025b-h78e105d_0.conda#4222072737ccff51314b5ece9c7d6f5a https://conda.anaconda.org/conda-forge/linux-64/ld_impl_linux-64-2.43-h712a8e2_4.conda#01f8d123c96816249efd255a31ad7712 https://conda.anaconda.org/conda-forge/linux-64/libgomp-14.2.0-h767d61c_2.conda#06d02030237f4d5b3d9a7e7d348fe3c6 https://conda.anaconda.org/conda-forge/linux-64/_openmp_mutex-4.5-2_gnu.tar.bz2#73aaf86a425cc6e73fcf236a5a46396d https://conda.anaconda.org/conda-forge/linux-64/libgcc-14.2.0-h767d61c_2.conda#ef504d1acbd74b7cc6849ef8af47dd03 https://conda.anaconda.org/conda-forge/linux-64/libdeflate-1.23-h4ddbbb0_0.conda#8dfae1d2e74767e9ce36d5fa0d8605db -https://conda.anaconda.org/conda-forge/linux-64/libffi-3.4.6-h2dba641_0.conda#e3eb7806380bc8bcecba6d749ad5f026 +https://conda.anaconda.org/conda-forge/linux-64/libffi-3.4.6-h2dba641_1.conda#ede4673863426c0883c0063d853bbd85 https://conda.anaconda.org/conda-forge/linux-64/libgcc-ng-14.2.0-h69a702a_2.conda#a2222a6ada71fb478682efe483ce0f92 https://conda.anaconda.org/conda-forge/linux-64/libgfortran5-14.2.0-hf1ad2bd_2.conda#556a4fdfac7287d349b8f09aba899693 -https://conda.anaconda.org/conda-forge/linux-64/liblzma-5.6.4-hb9d3cd8_0.conda#42d5b6a0f30d3c10cd88cb8584fda1cb +https://conda.anaconda.org/conda-forge/linux-64/liblzma-5.8.1-hb9d3cd8_0.conda#0e87378639676987af32fee53ba32258 https://conda.anaconda.org/conda-forge/linux-64/libstdcxx-14.2.0-h8f9b012_2.conda#a78c856b6dc6bf4ea8daeb9beaaa3fb0 https://conda.anaconda.org/conda-forge/linux-64/libwebp-base-1.5.0-h851e524_0.conda#63f790534398730f59e1b899c3644d4a https://conda.anaconda.org/conda-forge/linux-64/libzlib-1.3.1-hb9d3cd8_2.conda#edb0dca6bc32e4f4789199455a1dbeb8 @@ -41,7 +41,7 @@ https://conda.anaconda.org/conda-forge/linux-64/lerc-4.0.0-h27087fc_0.tar.bz2#76 https://conda.anaconda.org/conda-forge/linux-64/libgfortran-ng-14.2.0-h69a702a_2.conda#4056c857af1a99ee50589a941059ec55 https://conda.anaconda.org/conda-forge/linux-64/libopenblas-0.3.29-pthreads_h94d23a6_0.conda#0a4d0252248ef9a0f88f2ba8b8a08e12 https://conda.anaconda.org/conda-forge/linux-64/ninja-1.12.1-h297d8ca_0.conda#3aa1c7e292afeff25a0091ddd7c69b72 -https://conda.anaconda.org/conda-forge/linux-64/python-3.10.16-he725a3c_1_cpython.conda#b887811a901b3aa622a92caf03bc8917 +https://conda.anaconda.org/conda-forge/linux-64/python-3.10.16-habfa6aa_2_cpython.conda#35e864ff2ec654d09fdc189706dfd139 https://conda.anaconda.org/conda-forge/noarch/alabaster-1.0.0-pyhd8ed1ab_1.conda#1fd9696649f65fd6611fcdb4ffec738a https://conda.anaconda.org/conda-forge/linux-64/brotli-python-1.1.0-py310hf71b8c6_2.conda#bf502c169c71e3c6ac0d6175addfacc2 https://conda.anaconda.org/conda-forge/noarch/certifi-2025.1.31-pyhd8ed1ab_0.conda#c207fa5ac7ea99b149344385a9c0880d @@ -68,7 +68,7 @@ https://conda.anaconda.org/conda-forge/noarch/pygments-2.19.1-pyhd8ed1ab_0.conda https://conda.anaconda.org/conda-forge/noarch/pysocks-1.7.1-pyha55dd90_7.conda#461219d1a5bd61342293efa2c0c90eac https://conda.anaconda.org/conda-forge/noarch/python-tzdata-2025.2-pyhd8ed1ab_0.conda#88476ae6ebd24f39261e0854ac244f33 https://conda.anaconda.org/conda-forge/noarch/pytz-2024.1-pyhd8ed1ab_0.conda#3eeeeb9e4827ace8c0c1419c85d590ad -https://conda.anaconda.org/conda-forge/noarch/setuptools-75.8.2-pyhff2d567_0.conda#9bddfdbf4e061821a1a443f93223be61 +https://conda.anaconda.org/conda-forge/noarch/setuptools-78.1.0-pyhff2d567_0.conda#a42da9837e46c53494df0044c3eb1f53 https://conda.anaconda.org/conda-forge/noarch/six-1.17.0-pyhd8ed1ab_0.conda#a451d576819089b0d672f18768be0f65 https://conda.anaconda.org/conda-forge/noarch/snowballstemmer-2.2.0-pyhd8ed1ab_0.tar.bz2#4d22a9315e78c6827f806065957d566e https://conda.anaconda.org/conda-forge/noarch/sphinxcontrib-jsmath-1.0.1-pyhd8ed1ab_1.conda#fa839b5ff59e192f411ccc7dae6588bb @@ -85,7 +85,7 @@ https://conda.anaconda.org/conda-forge/noarch/joblib-1.4.2-pyhd8ed1ab_1.conda#bf https://conda.anaconda.org/conda-forge/linux-64/lcms2-2.17-h717163a_0.conda#000e85703f0fd9594c81710dd5066471 https://conda.anaconda.org/conda-forge/linux-64/libcblas-3.9.0-31_he106b2a_openblas.conda#abb32c727da370c481a1c206f5159ce9 https://conda.anaconda.org/conda-forge/linux-64/liblapack-3.9.0-31_h7ac8fdf_openblas.conda#452b98eafe050ecff932f0ec832dd03f -https://conda.anaconda.org/conda-forge/noarch/meson-1.7.0-pyhd8ed1ab_0.conda#6d4bbcce47061d2f9f2636409a8fe7c0 +https://conda.anaconda.org/conda-forge/noarch/meson-1.7.1-pyhd8ed1ab_0.conda#90018ee73b8741268027421ceac2809a https://conda.anaconda.org/conda-forge/linux-64/openjpeg-2.5.3-h5fbd93e_0.conda#9e5816bc95d285c115a3ebc2f8563564 https://conda.anaconda.org/conda-forge/noarch/pip-25.0.1-pyh8b19718_0.conda#79b5c1440aedc5010f687048d9103628 https://conda.anaconda.org/conda-forge/noarch/pyproject-metadata-0.9.1-pyhd8ed1ab_0.conda#22ae7c6ea81e0c8661ef32168dda929b diff --git a/build_tools/azure/ubuntu_atlas_lock.txt b/build_tools/azure/ubuntu_atlas_lock.txt index 9cfb39b559ff2..f35c2b1928f52 100644 --- a/build_tools/azure/ubuntu_atlas_lock.txt +++ b/build_tools/azure/ubuntu_atlas_lock.txt @@ -14,7 +14,7 @@ iniconfig==2.1.0 # via pytest joblib==1.2.0 # via -r build_tools/azure/ubuntu_atlas_requirements.txt -meson==1.7.0 +meson==1.7.2 # via meson-python meson-python==0.17.1 # via -r build_tools/azure/ubuntu_atlas_requirements.txt diff --git a/build_tools/circle/doc_linux-64_conda.lock b/build_tools/circle/doc_linux-64_conda.lock index a70274d4931aa..a80c44c33d7fc 100644 --- a/build_tools/circle/doc_linux-64_conda.lock +++ b/build_tools/circle/doc_linux-64_conda.lock @@ -9,7 +9,7 @@ https://conda.anaconda.org/conda-forge/noarch/font-ttf-inconsolata-3.000-h77eed3 https://conda.anaconda.org/conda-forge/noarch/font-ttf-source-code-pro-2.038-h77eed37_0.tar.bz2#4d59c254e01d9cde7957100457e2d5fb https://conda.anaconda.org/conda-forge/noarch/font-ttf-ubuntu-0.83-h77eed37_3.conda#49023d73832ef61042f6a237cb2687e7 https://conda.anaconda.org/conda-forge/noarch/kernel-headers_linux-64-3.10.0-he073ed8_18.conda#ad8527bf134a90e1c9ed35fa0b64318c -https://conda.anaconda.org/conda-forge/linux-64/python_abi-3.10-5_cp310.conda#2921c34715e74b3587b4cff4d36844f9 +https://conda.anaconda.org/conda-forge/linux-64/python_abi-3.10-6_cp310.conda#01f0f2104b8466714804a72e511de599 https://conda.anaconda.org/conda-forge/noarch/tzdata-2025b-h78e105d_0.conda#4222072737ccff51314b5ece9c7d6f5a https://conda.anaconda.org/conda-forge/noarch/fonts-conda-forge-1-0.tar.bz2#f766549260d6815b0c52253f1fb1bb29 https://conda.anaconda.org/conda-forge/linux-64/ld_impl_linux-64-2.43-h712a8e2_4.conda#01f8d123c96816249efd255a31ad7712 @@ -29,12 +29,12 @@ https://conda.anaconda.org/conda-forge/linux-64/libgcc-14.2.0-h767d61c_2.conda#e https://conda.anaconda.org/conda-forge/linux-64/alsa-lib-1.2.13-hb9d3cd8_0.conda#ae1370588aa6a5157c34c73e9bbb36a0 https://conda.anaconda.org/conda-forge/linux-64/libbrotlicommon-1.1.0-hb9d3cd8_2.conda#41b599ed2b02abcfdd84302bff174b23 https://conda.anaconda.org/conda-forge/linux-64/libdeflate-1.23-h4ddbbb0_0.conda#8dfae1d2e74767e9ce36d5fa0d8605db -https://conda.anaconda.org/conda-forge/linux-64/libexpat-2.6.4-h5888daf_0.conda#db833e03127376d461e1e13e76f09b6c -https://conda.anaconda.org/conda-forge/linux-64/libffi-3.4.6-h2dba641_0.conda#e3eb7806380bc8bcecba6d749ad5f026 +https://conda.anaconda.org/conda-forge/linux-64/libexpat-2.7.0-h5888daf_0.conda#db0bfbe7dd197b68ad5f30333bae6ce0 +https://conda.anaconda.org/conda-forge/linux-64/libffi-3.4.6-h2dba641_1.conda#ede4673863426c0883c0063d853bbd85 https://conda.anaconda.org/conda-forge/linux-64/libgcc-ng-14.2.0-h69a702a_2.conda#a2222a6ada71fb478682efe483ce0f92 https://conda.anaconda.org/conda-forge/linux-64/libgfortran5-14.2.0-hf1ad2bd_2.conda#556a4fdfac7287d349b8f09aba899693 https://conda.anaconda.org/conda-forge/linux-64/libiconv-1.18-h4ce23a2_1.conda#e796ff8ddc598affdf7c173d6145f087 -https://conda.anaconda.org/conda-forge/linux-64/liblzma-5.6.4-hb9d3cd8_0.conda#42d5b6a0f30d3c10cd88cb8584fda1cb +https://conda.anaconda.org/conda-forge/linux-64/liblzma-5.8.1-hb9d3cd8_0.conda#0e87378639676987af32fee53ba32258 https://conda.anaconda.org/conda-forge/linux-64/libntlm-1.8-hb9d3cd8_0.conda#7c7927b404672409d9917d49bff5f2d6 https://conda.anaconda.org/conda-forge/linux-64/libstdcxx-14.2.0-h8f9b012_2.conda#a78c856b6dc6bf4ea8daeb9beaaa3fb0 https://conda.anaconda.org/conda-forge/linux-64/libwebp-base-1.5.0-h851e524_0.conda#63f790534398730f59e1b899c3644d4a @@ -48,7 +48,7 @@ https://conda.anaconda.org/conda-forge/linux-64/xorg-libxdmcp-1.1.5-hb9d3cd8_0.c https://conda.anaconda.org/conda-forge/linux-64/bzip2-1.0.8-h4bc722e_7.conda#62ee74e96c5ebb0af99386de58cf9553 https://conda.anaconda.org/conda-forge/linux-64/dav1d-1.2.1-hd590300_0.conda#418c6ca5929a611cbd69204907a83995 https://conda.anaconda.org/conda-forge/linux-64/double-conversion-3.3.1-h5888daf_0.conda#bfd56492d8346d669010eccafe0ba058 -https://conda.anaconda.org/conda-forge/linux-64/expat-2.6.4-h5888daf_0.conda#1d6afef758879ef5ee78127eb4cd2c4a +https://conda.anaconda.org/conda-forge/linux-64/expat-2.7.0-h5888daf_0.conda#d6845ae4dea52a2f90178bf1829a21f8 https://conda.anaconda.org/conda-forge/linux-64/giflib-5.2.2-hd590300_0.conda#3bf7b9fd5a7136126e0234db4b87c8b6 https://conda.anaconda.org/conda-forge/linux-64/jxrlib-1.1-hd590300_3.conda#5aeabe88534ea4169d4c49998f293d6c https://conda.anaconda.org/conda-forge/linux-64/keyutils-1.6.1-h166bdaf_0.tar.bz2#30186d27e2c9fa62b45fb1476b7200e3 @@ -96,7 +96,7 @@ https://conda.anaconda.org/conda-forge/linux-64/libzopfli-1.0.3-h9c3ff4c_0.tar.b https://conda.anaconda.org/conda-forge/linux-64/mysql-libs-9.0.1-he0572af_5.conda#d13932a2a61de7c0fb7864b592034a6e https://conda.anaconda.org/conda-forge/linux-64/ninja-1.12.1-h297d8ca_0.conda#3aa1c7e292afeff25a0091ddd7c69b72 https://conda.anaconda.org/conda-forge/linux-64/pcre2-10.44-hba22ea6_2.conda#df359c09c41cd186fffb93a2d87aa6f5 -https://conda.anaconda.org/conda-forge/linux-64/python-3.10.16-he725a3c_1_cpython.conda#b887811a901b3aa622a92caf03bc8917 +https://conda.anaconda.org/conda-forge/linux-64/python-3.10.16-habfa6aa_2_cpython.conda#35e864ff2ec654d09fdc189706dfd139 https://conda.anaconda.org/conda-forge/linux-64/qhull-2020.2-h434a139_5.conda#353823361b1d27eb3960efb076dfcaf6 https://conda.anaconda.org/conda-forge/linux-64/wayland-1.23.1-h3e06ad9_0.conda#0a732427643ae5e0486a727927791da1 https://conda.anaconda.org/conda-forge/linux-64/xcb-util-0.4.1-hb711507_2.conda#8637c3e5821654d0edf97e2b0404b443 @@ -132,14 +132,14 @@ https://conda.anaconda.org/conda-forge/linux-64/kiwisolver-1.4.7-py310h3788b33_0 https://conda.anaconda.org/conda-forge/linux-64/libavif16-1.2.1-hbb36593_2.conda#971387a27e61235b97cacb440a37e991 https://conda.anaconda.org/conda-forge/linux-64/libblas-3.9.0-31_h59b9bed_openblas.conda#728dbebd0f7a20337218beacffd37916 https://conda.anaconda.org/conda-forge/linux-64/libcups-2.3.3-h4637d8d_4.conda#d4529f4dff3057982a7617c7ac58fde3 -https://conda.anaconda.org/conda-forge/linux-64/libglib-2.84.0-h2ff4ddf_0.conda#40cdeafb789a5513415f7bdbef053cf5 +https://conda.anaconda.org/conda-forge/linux-64/libglib-2.84.1-h2ff4ddf_0.conda#0305434da649d4fb48a425e588b79ea6 https://conda.anaconda.org/conda-forge/linux-64/libglx-1.7.0-ha4b6fd6_2.conda#c8013e438185f33b13814c5c488acd5c https://conda.anaconda.org/conda-forge/linux-64/libjxl-0.11.1-hdb8da77_0.conda#32b23f3487beae7e81495fbc1099ae9e https://conda.anaconda.org/conda-forge/linux-64/libtiff-4.7.0-hd9ff511_3.conda#0ea6510969e1296cc19966fad481f6de -https://conda.anaconda.org/conda-forge/linux-64/libxml2-2.13.7-h8d12d68_0.conda#109427e5576d0ce9c42257c2421b1680 +https://conda.anaconda.org/conda-forge/linux-64/libxml2-2.13.7-h4bc477f_1.conda#ad1f1f8238834cd3c88ceeaee8da444a https://conda.anaconda.org/conda-forge/linux-64/markupsafe-3.0.2-py310h89163eb_1.conda#8ce3f0332fd6de0d737e2911d329523f https://conda.anaconda.org/conda-forge/noarch/munkres-1.1.4-pyh9f0ad1d_0.tar.bz2#2ba8498c1018c1e9c61eb99b973dfe19 -https://conda.anaconda.org/conda-forge/noarch/narwhals-1.32.0-pyhd8ed1ab_0.conda#fd49dbbf238fc97ff41a42df6afc94b8 +https://conda.anaconda.org/conda-forge/noarch/narwhals-1.33.0-pyhd8ed1ab_0.conda#54a495cf873b193aa17fb9517d0487c1 https://conda.anaconda.org/conda-forge/noarch/networkx-3.4.2-pyh267e887_2.conda#fd40bf7f7f4bc4b647dc8512053d9873 https://conda.anaconda.org/conda-forge/linux-64/openblas-0.3.29-pthreads_h6ec200e_0.conda#7e4d48870b3258bea920d51b7f495a81 https://conda.anaconda.org/conda-forge/noarch/packaging-24.2-pyhd8ed1ab_2.conda#3bfed7e6228ebf2f7b9eaa47f1b4e2aa @@ -152,7 +152,7 @@ https://conda.anaconda.org/conda-forge/noarch/pyparsing-3.2.3-pyhd8ed1ab_1.conda https://conda.anaconda.org/conda-forge/noarch/pysocks-1.7.1-pyha55dd90_7.conda#461219d1a5bd61342293efa2c0c90eac https://conda.anaconda.org/conda-forge/noarch/python-tzdata-2025.2-pyhd8ed1ab_0.conda#88476ae6ebd24f39261e0854ac244f33 https://conda.anaconda.org/conda-forge/noarch/pytz-2024.1-pyhd8ed1ab_0.conda#3eeeeb9e4827ace8c0c1419c85d590ad -https://conda.anaconda.org/conda-forge/noarch/setuptools-75.8.2-pyhff2d567_0.conda#9bddfdbf4e061821a1a443f93223be61 +https://conda.anaconda.org/conda-forge/noarch/setuptools-78.1.0-pyhff2d567_0.conda#a42da9837e46c53494df0044c3eb1f53 https://conda.anaconda.org/conda-forge/noarch/six-1.17.0-pyhd8ed1ab_0.conda#a451d576819089b0d672f18768be0f65 https://conda.anaconda.org/conda-forge/noarch/snowballstemmer-2.2.0-pyhd8ed1ab_0.tar.bz2#4d22a9315e78c6827f806065957d566e https://conda.anaconda.org/conda-forge/noarch/soupsieve-2.5-pyhd8ed1ab_1.conda#3f144b2c34f8cb5a9abd9ed23a39c561 @@ -161,7 +161,7 @@ https://conda.anaconda.org/conda-forge/noarch/tabulate-0.9.0-pyhd8ed1ab_2.conda# https://conda.anaconda.org/conda-forge/noarch/threadpoolctl-3.6.0-pyhecae5ae_0.conda#9d64911b31d57ca443e9f1e36b04385f https://conda.anaconda.org/conda-forge/noarch/tomli-2.2.1-pyhd8ed1ab_1.conda#ac944244f1fed2eb49bae07193ae8215 https://conda.anaconda.org/conda-forge/linux-64/tornado-6.4.2-py310ha75aee5_0.conda#166d59aab40b9c607b4cc21c03924e9d -https://conda.anaconda.org/conda-forge/noarch/typing_extensions-4.13.0-pyh29332c3_1.conda#4c446320a86cc5d48e3b80e332d6ebd7 +https://conda.anaconda.org/conda-forge/noarch/typing_extensions-4.13.1-pyh29332c3_0.conda#5710c79a5fb0a6bfdba0a887f90583b1 https://conda.anaconda.org/conda-forge/linux-64/unicodedata2-16.0.0-py310ha75aee5_0.conda#1d7a4b9202cdd10d56ecdd7f6c347190 https://conda.anaconda.org/conda-forge/noarch/wheel-0.45.1-pyhd8ed1ab_1.conda#75cb7132eb58d97896e173ef12ac9986 https://conda.anaconda.org/conda-forge/linux-64/xcb-util-image-0.4.0-hb711507_2.conda#a0901183f08b6c7107aab109733a3c91 @@ -177,7 +177,7 @@ https://conda.anaconda.org/conda-forge/linux-64/c-compiler-1.9.0-h2b85faf_0.cond https://conda.anaconda.org/conda-forge/linux-64/cairo-1.18.4-h3394656_0.conda#09262e66b19567aff4f592fb53b28760 https://conda.anaconda.org/conda-forge/linux-64/cffi-1.17.1-py310h8deb56e_0.conda#1fc24a3196ad5ede2a68148be61894f4 https://conda.anaconda.org/conda-forge/linux-64/dbus-1.13.6-h5008d03_3.tar.bz2#ecfff944ba3960ecb334b9a2663d708d -https://conda.anaconda.org/conda-forge/linux-64/fonttools-4.56.0-py310h89163eb_0.conda#cd3125e1924bd8699dac9989652bca74 +https://conda.anaconda.org/conda-forge/linux-64/fonttools-4.57.0-py310h89163eb_0.conda#34378af82141b3c1725dcdf898b28fc6 https://conda.anaconda.org/conda-forge/linux-64/gfortran-13.3.0-h9576a4e_2.conda#19e6d3c9cde10a0a9a170a684082588e https://conda.anaconda.org/conda-forge/linux-64/gfortran_linux-64-13.3.0-hb919d3a_8.conda#5fa84c74a45687350aa5d468f64d8024 https://conda.anaconda.org/conda-forge/linux-64/gxx-13.3.0-h9576a4e_2.conda#07e8df00b7cd3084ad3ef598ce32a71c @@ -191,11 +191,11 @@ https://conda.anaconda.org/conda-forge/linux-64/lcms2-2.17-h717163a_0.conda#000e https://conda.anaconda.org/conda-forge/linux-64/libcblas-3.9.0-31_he106b2a_openblas.conda#abb32c727da370c481a1c206f5159ce9 https://conda.anaconda.org/conda-forge/linux-64/libgl-1.7.0-ha4b6fd6_2.conda#928b8be80851f5d8ffb016f9c81dae7a https://conda.anaconda.org/conda-forge/linux-64/liblapack-3.9.0-31_h7ac8fdf_openblas.conda#452b98eafe050ecff932f0ec832dd03f -https://conda.anaconda.org/conda-forge/linux-64/libllvm20-20.1.1-ha7bfdaf_0.conda#2e234fb7d6eeb5c32eb5b256403b5795 +https://conda.anaconda.org/conda-forge/linux-64/libllvm20-20.1.2-ha7bfdaf_0.conda#8354769527f9f441a3a04aa1c19188d9 https://conda.anaconda.org/conda-forge/linux-64/libxkbcommon-1.8.1-hc4a0caf_0.conda#e7e5b0652227d646b44abdcbd989da7b https://conda.anaconda.org/conda-forge/linux-64/libxslt-1.1.39-h76b75d6_0.conda#e71f31f8cfb0a91439f2086fc8aa0461 https://conda.anaconda.org/conda-forge/noarch/memory_profiler-0.61.0-pyhd8ed1ab_1.conda#71abbefb6f3b95e1668cd5e0af3affb9 -https://conda.anaconda.org/conda-forge/noarch/meson-1.7.0-pyhd8ed1ab_0.conda#6d4bbcce47061d2f9f2636409a8fe7c0 +https://conda.anaconda.org/conda-forge/noarch/meson-1.7.1-pyhd8ed1ab_0.conda#90018ee73b8741268027421ceac2809a https://conda.anaconda.org/conda-forge/linux-64/openjpeg-2.5.3-h5fbd93e_0.conda#9e5816bc95d285c115a3ebc2f8563564 https://conda.anaconda.org/conda-forge/linux-64/openldap-2.6.9-he970967_0.conda#ca2de8bbdc871bce41dbf59e51324165 https://conda.anaconda.org/conda-forge/noarch/pip-25.0.1-pyh8b19718_0.conda#79b5c1440aedc5010f687048d9103628 @@ -203,7 +203,7 @@ https://conda.anaconda.org/conda-forge/noarch/plotly-6.0.1-pyhd8ed1ab_0.conda#37 https://conda.anaconda.org/conda-forge/noarch/pyproject-metadata-0.9.1-pyhd8ed1ab_0.conda#22ae7c6ea81e0c8661ef32168dda929b https://conda.anaconda.org/conda-forge/noarch/pytest-8.3.5-pyhd8ed1ab_0.conda#c3c9316209dec74a705a36797970c6be https://conda.anaconda.org/conda-forge/noarch/python-dateutil-2.9.0.post0-pyhff2d567_1.conda#5ba79d7c71f03c678c8ead841f347d6e -https://conda.anaconda.org/conda-forge/noarch/typing-extensions-4.13.0-h9fa5a19_1.conda#3fbcc45b908040dca030d3f78ed9a212 +https://conda.anaconda.org/conda-forge/noarch/typing-extensions-4.13.1-hf5ce1d7_0.conda#e37cf790f710cf72fd13dcb6b2d4370c https://conda.anaconda.org/conda-forge/linux-64/xcb-util-cursor-0.1.5-hb9d3cd8_0.conda#eb44b3b6deb1cab08d72cb61686fe64c https://conda.anaconda.org/conda-forge/linux-64/xorg-libxcomposite-0.4.6-hb9d3cd8_2.conda#d3c295b50f092ab525ffe3c2aa4b7413 https://conda.anaconda.org/conda-forge/linux-64/xorg-libxcursor-1.2.3-hb9d3cd8_0.conda#2ccd714aa2242315acaf0a67faea780b @@ -217,10 +217,10 @@ https://conda.anaconda.org/conda-forge/linux-64/fortran-compiler-1.9.0-h36df796_ https://conda.anaconda.org/conda-forge/linux-64/harfbuzz-11.0.0-h76408a6_0.conda#347cb348bfc8d77062daee11c326e518 https://conda.anaconda.org/conda-forge/noarch/importlib-resources-6.5.2-pyhd8ed1ab_0.conda#e376ea42e9ae40f3278b0f79c9bf9826 https://conda.anaconda.org/conda-forge/noarch/lazy-loader-0.4-pyhd8ed1ab_2.conda#d10d9393680734a8febc4b362a4c94f2 -https://conda.anaconda.org/conda-forge/linux-64/libclang-cpp20.1-20.1.1-default_hb5137d0_0.conda#331dee424fabc0c26331767acc93a074 -https://conda.anaconda.org/conda-forge/linux-64/libclang13-20.1.1-default_h9c6a7e4_0.conda#f8b1b8c13c0a0fede5e1a204eafb48f8 +https://conda.anaconda.org/conda-forge/linux-64/libclang-cpp20.1-20.1.2-default_hb5137d0_0.conda#729198eae19e9dbf8e0ffe355d416bde +https://conda.anaconda.org/conda-forge/linux-64/libclang13-20.1.2-default_h9c6a7e4_0.conda#c5fe177150aecc6ec46609b0a6123f39 https://conda.anaconda.org/conda-forge/linux-64/liblapacke-3.9.0-31_he2f377e_openblas.conda#7e5fff7d0db69be3a266f7e79a3bb0e2 -https://conda.anaconda.org/conda-forge/linux-64/libpq-17.4-h27ae623_0.conda#d67f3f3c33344ff3e9ef5270001e9011 +https://conda.anaconda.org/conda-forge/linux-64/libpq-17.4-h27ae623_1.conda#37fba334855ef3b51549308e61ed7a3d https://conda.anaconda.org/conda-forge/noarch/meson-python-0.17.1-pyh70fd9c4_1.conda#7a02679229c6c2092571b4c025055440 https://conda.anaconda.org/conda-forge/linux-64/numpy-2.2.4-py310hefbff90_0.conda#b3a99849aa14b78d32250c0709e8792a https://conda.anaconda.org/conda-forge/linux-64/pillow-11.1.0-py310h7e6dc6c_0.conda#14d300b9e1504748e70cc6499a7b4d25 @@ -237,17 +237,17 @@ https://conda.anaconda.org/conda-forge/linux-64/pandas-2.2.3-py310h5eaa309_1.con https://conda.anaconda.org/conda-forge/noarch/patsy-1.0.1-pyhd8ed1ab_1.conda#ee23fabfd0a8c6b8d6f3729b47b2859d https://conda.anaconda.org/conda-forge/linux-64/polars-1.26.0-py310hc556931_0.conda#cc98853d8d0f75ee4676c008b4148468 https://conda.anaconda.org/conda-forge/linux-64/pywavelets-1.8.0-py310hf462985_0.conda#4c441eff2be2e65bd67765c5642051c5 -https://conda.anaconda.org/conda-forge/linux-64/qt6-main-6.8.3-h6441bc3_1.conda#db96ef4241de437be7b41082045ef7d2 +https://conda.anaconda.org/conda-forge/linux-64/qt6-main-6.9.0-h6441bc3_0.conda#d3df16592e15a3f833cfc4d19ae58677 https://conda.anaconda.org/conda-forge/linux-64/scipy-1.15.2-py310h1d65ade_0.conda#8c29cd33b64b2eb78597fa28b5595c8d https://conda.anaconda.org/conda-forge/noarch/towncrier-24.8.0-pyhd8ed1ab_1.conda#820b6a1ddf590fba253f8204f7200d82 https://conda.anaconda.org/conda-forge/noarch/urllib3-2.3.0-pyhd8ed1ab_0.conda#32674f8dbfb7b26410ed580dd3c10a29 https://conda.anaconda.org/conda-forge/linux-64/blas-2.131-openblas.conda#38b2ec894c69bb4be0e66d2ef7fc60bf https://conda.anaconda.org/conda-forge/linux-64/matplotlib-base-3.10.1-py310h68603db_0.conda#29cf3f5959afb841eda926541f26b0fb https://conda.anaconda.org/conda-forge/linux-64/pyamg-5.2.1-py310ha2bacc8_1.conda#817d32861729e14f474249f1036291c4 -https://conda.anaconda.org/conda-forge/linux-64/pyside6-6.8.3-py310hfd10a26_0.conda#dd3dd65ec785c86ed90e8cb4890361f2 +https://conda.anaconda.org/conda-forge/linux-64/pyside6-6.9.0-py310hfd10a26_0.conda#1610ccfe262ee519716bb69bd4395572 https://conda.anaconda.org/conda-forge/noarch/requests-2.32.3-pyhd8ed1ab_1.conda#a9b9368f3701a417eac9edbcae7cb737 https://conda.anaconda.org/conda-forge/linux-64/statsmodels-0.14.4-py310hf462985_0.conda#636d3c500d8a851e377360e88ec95372 -https://conda.anaconda.org/conda-forge/noarch/tifffile-2025.3.13-pyhd8ed1ab_0.conda#4660bf736145d44fe220f0f95c9d9a2a +https://conda.anaconda.org/conda-forge/noarch/tifffile-2025.3.30-pyhd8ed1ab_0.conda#14f46147fae19bb867f82a787c7059e9 https://conda.anaconda.org/conda-forge/linux-64/matplotlib-3.10.1-py310hff52083_0.conda#45c1ad6a0351492b56d1b2bb5442cdfa https://conda.anaconda.org/conda-forge/noarch/pooch-1.8.2-pyhd8ed1ab_1.conda#b3e783e8e8ed7577cf0b6dee37d1fbac https://conda.anaconda.org/conda-forge/linux-64/scikit-image-0.25.2-py310h5eaa309_0.conda#4cc3a231679ecb3c0ba20ebf3c27d12e @@ -272,7 +272,7 @@ https://conda.anaconda.org/conda-forge/noarch/sphinxext-opengraph-0.9.1-pyhd8ed1 # pip defusedxml @ https://files.pythonhosted.org/packages/07/6c/aa3f2f849e01cb6a001cd8554a88d4c77c5c1a31c95bdf1cf9301e6d9ef4/defusedxml-0.7.1-py2.py3-none-any.whl#sha256=a352e7e428770286cc899e2542b6cdaedb2b4953ff269a210103ec58f6198a61 # pip fastjsonschema @ https://files.pythonhosted.org/packages/90/2b/0817a2b257fe88725c25589d89aec060581aabf668707a8d03b2e9e0cb2a/fastjsonschema-2.21.1-py3-none-any.whl#sha256=c9e5b7e908310918cf494a434eeb31384dd84a98b57a30bcb1f535015b554667 # pip fqdn @ https://files.pythonhosted.org/packages/cf/58/8acf1b3e91c58313ce5cb67df61001fc9dcd21be4fadb76c1a2d540e09ed/fqdn-1.5.1-py3-none-any.whl#sha256=3a179af3761e4df6eb2e026ff9e1a3033d3587bf980a0b1b2e1e5d08d7358014 -# pip json5 @ https://files.pythonhosted.org/packages/aa/42/797895b952b682c3dafe23b1834507ee7f02f4d6299b65aaa61425763278/json5-0.10.0-py3-none-any.whl#sha256=19b23410220a7271e8377f81ba8aacba2fdd56947fbb137ee5977cbe1f5e8dfa +# pip json5 @ https://files.pythonhosted.org/packages/41/9f/3500910d5a98549e3098807493851eeef2b89cdd3032227558a104dfe926/json5-0.12.0-py3-none-any.whl#sha256=6d37aa6c08b0609f16e1ec5ff94697e2cbbfbad5ac112afa05794da9ab7810db # pip jsonpointer @ https://files.pythonhosted.org/packages/71/92/5e77f98553e9e75130c78900d000368476aed74276eb8ae8796f65f00918/jsonpointer-3.0.0-py2.py3-none-any.whl#sha256=13e088adc14fca8b6aa8177c044e12701e6ad4b28ff10e65f2267a90109c9942 # pip jupyterlab-pygments @ https://files.pythonhosted.org/packages/b1/dd/ead9d8ea85bf202d90cc513b533f9c363121c7792674f78e0d8a854b63b4/jupyterlab_pygments-0.3.0-py3-none-any.whl#sha256=841a89020971da1d8693f1a99997aefc5dc424bb1b251fd6322462a1b8842780 # pip libsass @ https://files.pythonhosted.org/packages/fd/5a/eb5b62641df0459a3291fc206cf5bd669c0feed7814dded8edef4ade8512/libsass-0.23.0-cp38-abi3-manylinux_2_5_x86_64.manylinux1_x86_64.whl#sha256=4a218406d605f325d234e4678bd57126a66a88841cb95bee2caeafdc6f138306 @@ -301,7 +301,7 @@ https://conda.anaconda.org/conda-forge/noarch/sphinxext-opengraph-0.9.1-pyhd8ed1 # pip jupyter-core @ https://files.pythonhosted.org/packages/c9/fb/108ecd1fe961941959ad0ee4e12ee7b8b1477247f30b1fdfd83ceaf017f0/jupyter_core-5.7.2-py3-none-any.whl#sha256=4f7315d2f6b4bcf2e3e7cb6e46772eba760ae459cd1f59d29eb57b0a01bd7409 # pip markdown-it-py @ https://files.pythonhosted.org/packages/42/d7/1ec15b46af6af88f19b8e5ffea08fa375d433c998b8a7639e76935c14f1f/markdown_it_py-3.0.0-py3-none-any.whl#sha256=355216845c60bd96232cd8d8c40e8f9765cc86f46880e43a8fd22dc1a1a8cab1 # pip mistune @ https://files.pythonhosted.org/packages/01/4d/23c4e4f09da849e127e9f123241946c23c1e30f45a88366879e064211815/mistune-3.1.3-py3-none-any.whl#sha256=1a32314113cff28aa6432e99e522677c8587fd83e3d51c29b82a52409c842bd9 -# pip pyzmq @ https://files.pythonhosted.org/packages/97/d4/4dd152dbbaac35d4e1fe8e8fd26d73640fcd84ec9c3915b545692df1ffb7/pyzmq-26.3.0-cp310-cp310-manylinux_2_28_x86_64.whl#sha256=49334faa749d55b77f084389a80654bf2e68ab5191c0235066f0140c1b670d64 +# pip pyzmq @ https://files.pythonhosted.org/packages/c1/3e/2de5928cdadc2105e7c8f890cc5f404136b41ce5b6eae5902167f1d5641c/pyzmq-26.4.0-cp310-cp310-manylinux_2_28_x86_64.whl#sha256=7dacb06a9c83b007cc01e8e5277f94c95c453c5851aac5e83efe93e72226353f # pip referencing @ https://files.pythonhosted.org/packages/c1/b1/3baf80dc6d2b7bc27a95a67752d0208e410351e3feb4eb78de5f77454d8d/referencing-0.36.2-py3-none-any.whl#sha256=e8699adbbf8b5c7de96d8ffa0eb5c158b3beafce084968e2ea8bb08c6794dcd0 # pip rfc3339-validator @ https://files.pythonhosted.org/packages/7b/44/4e421b96b67b2daff264473f7465db72fbdf36a07e05494f50300cc7b0c6/rfc3339_validator-0.1.4-py2.py3-none-any.whl#sha256=24f6ec1eda14ef823da9e36ec7113124b39c04d50a4d3d3a3c2859577e7791fa # pip sphinxcontrib-sass @ https://files.pythonhosted.org/packages/3f/ec/194f2dbe55b3fe0941b43286c21abb49064d9d023abfb99305c79ad77cad/sphinxcontrib_sass-0.3.5-py2.py3-none-any.whl#sha256=850c83a36ed2d2059562504ccf496ca626c9c0bb89ec642a2d9c42105704bef6 @@ -319,7 +319,7 @@ https://conda.anaconda.org/conda-forge/noarch/sphinxext-opengraph-0.9.1-pyhd8ed1 # pip jupyterlite-pyodide-kernel @ https://files.pythonhosted.org/packages/1b/b5/959a03ca011d1031abac03c18af9e767c18d6a9beb443eb106dda609748c/jupyterlite_pyodide_kernel-0.5.2-py3-none-any.whl#sha256=63ba6ce28d32f2cd19f636c40c153e171369a24189e11e2235457bd7000c5907 # pip jupyter-events @ https://files.pythonhosted.org/packages/e2/48/577993f1f99c552f18a0428731a755e06171f9902fa118c379eb7c04ea22/jupyter_events-0.12.0-py3-none-any.whl#sha256=6464b2fa5ad10451c3d35fabc75eab39556ae1e2853ad0c0cc31b656731a97fb # pip nbformat @ https://files.pythonhosted.org/packages/a9/82/0340caa499416c78e5d8f5f05947ae4bc3cba53c9f038ab6e9ed964e22f1/nbformat-5.10.4-py3-none-any.whl#sha256=3b48d6c8fbca4b299bf3982ea7db1af21580e4fec269ad087b9e81588891200b -# pip jupytext @ https://files.pythonhosted.org/packages/e1/4c/3d7cfac5b8351f649ce41a1007a769baacae8d5d29e481a93d799a209c3f/jupytext-1.16.7-py3-none-any.whl#sha256=912f9d9af7bd3f15470105e5c5dddf1669b2d8c17f0c55772687fc5a4a73fe69 +# pip jupytext @ https://files.pythonhosted.org/packages/dc/46/c2fb92e01eb0423bae7fe91c3bf2ca994069f299a6455919f4a9a12960ed/jupytext-1.17.0-py3-none-any.whl#sha256=d75b7cd198b3640a12f9cdf4d610bb80c9f27a8c3318b00372f90d21466d40e1 # pip nbclient @ https://files.pythonhosted.org/packages/34/6d/e7fa07f03a4a7b221d94b4d586edb754a9b0dc3c9e2c93353e9fa4e0d117/nbclient-0.10.2-py3-none-any.whl#sha256=4ffee11e788b4a27fabeb7955547e4318a5298f34342a4bfd01f2e1faaeadc3d # pip nbconvert @ https://files.pythonhosted.org/packages/cc/9a/cd673b2f773a12c992f41309ef81b99da1690426bd2f96957a7ade0d3ed7/nbconvert-7.16.6-py3-none-any.whl#sha256=1375a7b67e0c2883678c48e506dc320febb57685e5ee67faa51b18a90f3a712b # pip jupyter-server @ https://files.pythonhosted.org/packages/e2/a2/89eeaf0bb954a123a909859fa507fa86f96eb61b62dc30667b60dbd5fdaf/jupyter_server-2.15.0-py3-none-any.whl#sha256=872d989becf83517012ee669f09604aa4a28097c0bd90b2f424310156c2cdae3 diff --git a/build_tools/circle/doc_min_dependencies_linux-64_conda.lock b/build_tools/circle/doc_min_dependencies_linux-64_conda.lock index ab0a88ee474a3..5d63dbc0de3cf 100644 --- a/build_tools/circle/doc_min_dependencies_linux-64_conda.lock +++ b/build_tools/circle/doc_min_dependencies_linux-64_conda.lock @@ -8,7 +8,7 @@ https://conda.anaconda.org/conda-forge/noarch/font-ttf-inconsolata-3.000-h77eed3 https://conda.anaconda.org/conda-forge/noarch/font-ttf-source-code-pro-2.038-h77eed37_0.tar.bz2#4d59c254e01d9cde7957100457e2d5fb https://conda.anaconda.org/conda-forge/noarch/font-ttf-ubuntu-0.83-h77eed37_3.conda#49023d73832ef61042f6a237cb2687e7 https://conda.anaconda.org/conda-forge/noarch/kernel-headers_linux-64-3.10.0-he073ed8_18.conda#ad8527bf134a90e1c9ed35fa0b64318c -https://conda.anaconda.org/conda-forge/linux-64/python_abi-3.10-5_cp310.conda#2921c34715e74b3587b4cff4d36844f9 +https://conda.anaconda.org/conda-forge/linux-64/python_abi-3.10-6_cp310.conda#01f0f2104b8466714804a72e511de599 https://conda.anaconda.org/conda-forge/noarch/tzdata-2025b-h78e105d_0.conda#4222072737ccff51314b5ece9c7d6f5a https://conda.anaconda.org/conda-forge/noarch/fonts-conda-forge-1-0.tar.bz2#f766549260d6815b0c52253f1fb1bb29 https://conda.anaconda.org/conda-forge/linux-64/ld_impl_linux-64-2.43-h712a8e2_4.conda#01f8d123c96816249efd255a31ad7712 @@ -16,7 +16,7 @@ https://conda.anaconda.org/conda-forge/noarch/libgcc-devel_linux-64-13.3.0-hc03c https://conda.anaconda.org/conda-forge/linux-64/libglvnd-1.7.0-ha4b6fd6_2.conda#434ca7e50e40f4918ab701e3facd59a0 https://conda.anaconda.org/conda-forge/linux-64/libgomp-14.2.0-h767d61c_2.conda#06d02030237f4d5b3d9a7e7d348fe3c6 https://conda.anaconda.org/conda-forge/noarch/libstdcxx-devel_linux-64-13.3.0-hc03c837_102.conda#aa38de2738c5f4a72a880e3d31ffe8b4 -https://conda.anaconda.org/conda-forge/linux-64/llvm-openmp-20.1.1-h024ca30_1.conda#cfae5693f2ee2117e75e5e533451e04c +https://conda.anaconda.org/conda-forge/linux-64/llvm-openmp-20.1.2-h024ca30_0.conda#322da3c0641a7f0dafd5be6d3ea23d96 https://conda.anaconda.org/conda-forge/noarch/sysroot_linux-64-2.17-h0157908_18.conda#460eba7851277ec1fd80a1a24080787a https://conda.anaconda.org/conda-forge/linux-64/_openmp_mutex-4.5-3_kmp_llvm.conda#ee5c2118262e30b972bc0b4db8ef0ba5 https://conda.anaconda.org/conda-forge/linux-64/binutils_impl_linux-64-2.43-h4bf12b8_4.conda#ef67db625ad0d2dce398837102f875ed @@ -29,13 +29,13 @@ https://conda.anaconda.org/conda-forge/linux-64/alsa-lib-1.2.13-hb9d3cd8_0.conda https://conda.anaconda.org/conda-forge/linux-64/gettext-tools-0.23.1-h5888daf_0.conda#2f659535feef3cfb782f7053c8775a32 https://conda.anaconda.org/conda-forge/linux-64/libbrotlicommon-1.1.0-hb9d3cd8_2.conda#41b599ed2b02abcfdd84302bff174b23 https://conda.anaconda.org/conda-forge/linux-64/libdeflate-1.23-h4ddbbb0_0.conda#8dfae1d2e74767e9ce36d5fa0d8605db -https://conda.anaconda.org/conda-forge/linux-64/libexpat-2.6.4-h5888daf_0.conda#db833e03127376d461e1e13e76f09b6c -https://conda.anaconda.org/conda-forge/linux-64/libffi-3.4.6-h2dba641_0.conda#e3eb7806380bc8bcecba6d749ad5f026 +https://conda.anaconda.org/conda-forge/linux-64/libexpat-2.7.0-h5888daf_0.conda#db0bfbe7dd197b68ad5f30333bae6ce0 +https://conda.anaconda.org/conda-forge/linux-64/libffi-3.4.6-h2dba641_1.conda#ede4673863426c0883c0063d853bbd85 https://conda.anaconda.org/conda-forge/linux-64/libgcc-ng-14.2.0-h69a702a_2.conda#a2222a6ada71fb478682efe483ce0f92 https://conda.anaconda.org/conda-forge/linux-64/libgettextpo-0.23.1-h5888daf_0.conda#a09ce5decdef385bcce78c32809fa794 https://conda.anaconda.org/conda-forge/linux-64/libgfortran5-14.2.0-hf1ad2bd_2.conda#556a4fdfac7287d349b8f09aba899693 https://conda.anaconda.org/conda-forge/linux-64/libiconv-1.18-h4ce23a2_1.conda#e796ff8ddc598affdf7c173d6145f087 -https://conda.anaconda.org/conda-forge/linux-64/liblzma-5.6.4-hb9d3cd8_0.conda#42d5b6a0f30d3c10cd88cb8584fda1cb +https://conda.anaconda.org/conda-forge/linux-64/liblzma-5.8.1-hb9d3cd8_0.conda#0e87378639676987af32fee53ba32258 https://conda.anaconda.org/conda-forge/linux-64/libntlm-1.8-hb9d3cd8_0.conda#7c7927b404672409d9917d49bff5f2d6 https://conda.anaconda.org/conda-forge/linux-64/libstdcxx-14.2.0-h8f9b012_2.conda#a78c856b6dc6bf4ea8daeb9beaaa3fb0 https://conda.anaconda.org/conda-forge/linux-64/libwebp-base-1.5.0-h851e524_0.conda#63f790534398730f59e1b899c3644d4a @@ -50,7 +50,7 @@ https://conda.anaconda.org/conda-forge/linux-64/attr-2.5.1-h166bdaf_1.tar.bz2#d9 https://conda.anaconda.org/conda-forge/linux-64/blis-0.9.0-h4ab18f5_2.conda#6f77ba1352b69c4a6f8a6d20def30e4e https://conda.anaconda.org/conda-forge/linux-64/bzip2-1.0.8-h4bc722e_7.conda#62ee74e96c5ebb0af99386de58cf9553 https://conda.anaconda.org/conda-forge/linux-64/dav1d-1.2.1-hd590300_0.conda#418c6ca5929a611cbd69204907a83995 -https://conda.anaconda.org/conda-forge/linux-64/expat-2.6.4-h5888daf_0.conda#1d6afef758879ef5ee78127eb4cd2c4a +https://conda.anaconda.org/conda-forge/linux-64/expat-2.7.0-h5888daf_0.conda#d6845ae4dea52a2f90178bf1829a21f8 https://conda.anaconda.org/conda-forge/linux-64/giflib-5.2.2-hd590300_0.conda#3bf7b9fd5a7136126e0234db4b87c8b6 https://conda.anaconda.org/conda-forge/linux-64/jxrlib-1.1-hd590300_3.conda#5aeabe88534ea4169d4c49998f293d6c https://conda.anaconda.org/conda-forge/linux-64/keyutils-1.6.1-h166bdaf_0.tar.bz2#30186d27e2c9fa62b45fb1476b7200e3 @@ -114,7 +114,7 @@ https://conda.anaconda.org/conda-forge/linux-64/mysql-libs-9.0.1-he0572af_5.cond https://conda.anaconda.org/conda-forge/linux-64/ninja-1.12.1-h297d8ca_0.conda#3aa1c7e292afeff25a0091ddd7c69b72 https://conda.anaconda.org/conda-forge/linux-64/nss-3.110-h159eef7_0.conda#945659af183e87429c8aa7e0be3cc91d https://conda.anaconda.org/conda-forge/linux-64/pcre2-10.44-hba22ea6_2.conda#df359c09c41cd186fffb93a2d87aa6f5 -https://conda.anaconda.org/conda-forge/linux-64/python-3.10.16-he725a3c_1_cpython.conda#b887811a901b3aa622a92caf03bc8917 +https://conda.anaconda.org/conda-forge/linux-64/python-3.10.16-habfa6aa_2_cpython.conda#35e864ff2ec654d09fdc189706dfd139 https://conda.anaconda.org/conda-forge/linux-64/xcb-util-0.4.1-hb711507_2.conda#8637c3e5821654d0edf97e2b0404b443 https://conda.anaconda.org/conda-forge/linux-64/xcb-util-keysyms-0.4.1-hb711507_0.conda#ad748ccca349aec3e91743e08b5e2b50 https://conda.anaconda.org/conda-forge/linux-64/xcb-util-renderutil-0.3.10-hb711507_0.conda#0e0cbe0564d03a99afd5fd7b362feecd @@ -137,7 +137,7 @@ https://conda.anaconda.org/conda-forge/noarch/docutils-0.21.2-pyhd8ed1ab_1.conda https://conda.anaconda.org/conda-forge/noarch/exceptiongroup-1.2.2-pyhd8ed1ab_1.conda#a16662747cdeb9abbac74d0057cc976e https://conda.anaconda.org/conda-forge/noarch/execnet-2.1.1-pyhd8ed1ab_1.conda#a71efeae2c160f6789900ba2631a2c90 https://conda.anaconda.org/conda-forge/linux-64/fontconfig-2.15.0-h7e30c49_1.conda#8f5b0b297b59e1ac160ad4beec99dbee -https://conda.anaconda.org/conda-forge/noarch/fsspec-2025.3.1-pyhd8ed1ab_0.conda#2ded25bc46cbae83d08807c89cb84747 +https://conda.anaconda.org/conda-forge/noarch/fsspec-2025.3.2-pyhd8ed1ab_0.conda#9c40692c3d24c7aaf335f673ac09d308 https://conda.anaconda.org/conda-forge/linux-64/gcc-13.3.0-h9576a4e_2.conda#d92e51bf4b6bdbfe45e5884fb0755afe https://conda.anaconda.org/conda-forge/linux-64/gcc_linux-64-13.3.0-hc28eda2_8.conda#0c56ca4bfe2b04e71fe67652d5aa3079 https://conda.anaconda.org/conda-forge/linux-64/gettext-0.23.1-h5888daf_0.conda#0754038c806eae440582da1c3af85577 @@ -152,12 +152,12 @@ https://conda.anaconda.org/conda-forge/linux-64/kiwisolver-1.4.7-py310h3788b33_0 https://conda.anaconda.org/conda-forge/linux-64/libavif16-1.2.1-hbb36593_2.conda#971387a27e61235b97cacb440a37e991 https://conda.anaconda.org/conda-forge/linux-64/libcblas-3.9.0-31_hba4ea11_blis.conda#1ea7ae3db0fea0c5222388d841583c51 https://conda.anaconda.org/conda-forge/linux-64/libcups-2.3.3-h4637d8d_4.conda#d4529f4dff3057982a7617c7ac58fde3 -https://conda.anaconda.org/conda-forge/linux-64/libglib-2.84.0-h2ff4ddf_0.conda#40cdeafb789a5513415f7bdbef053cf5 +https://conda.anaconda.org/conda-forge/linux-64/libglib-2.84.1-h2ff4ddf_0.conda#0305434da649d4fb48a425e588b79ea6 https://conda.anaconda.org/conda-forge/linux-64/libglx-1.7.0-ha4b6fd6_2.conda#c8013e438185f33b13814c5c488acd5c https://conda.anaconda.org/conda-forge/linux-64/libjxl-0.11.1-hdb8da77_0.conda#32b23f3487beae7e81495fbc1099ae9e https://conda.anaconda.org/conda-forge/linux-64/libsystemd0-257.4-h4e0b6ca_1.conda#04bcf3055e51f8dde6fab9672fb9fca0 https://conda.anaconda.org/conda-forge/linux-64/libtiff-4.7.0-hd9ff511_3.conda#0ea6510969e1296cc19966fad481f6de -https://conda.anaconda.org/conda-forge/linux-64/libxml2-2.13.7-h8d12d68_0.conda#109427e5576d0ce9c42257c2421b1680 +https://conda.anaconda.org/conda-forge/linux-64/libxml2-2.13.7-h4bc477f_1.conda#ad1f1f8238834cd3c88ceeaee8da444a https://conda.anaconda.org/conda-forge/noarch/locket-1.0.0-pyhd8ed1ab_0.tar.bz2#91e27ef3d05cc772ce627e51cff111c4 https://conda.anaconda.org/conda-forge/linux-64/markupsafe-3.0.2-py310h89163eb_1.conda#8ce3f0332fd6de0d737e2911d329523f https://conda.anaconda.org/conda-forge/noarch/munkres-1.1.4-pyh9f0ad1d_0.tar.bz2#2ba8498c1018c1e9c61eb99b973dfe19 @@ -172,18 +172,18 @@ https://conda.anaconda.org/conda-forge/noarch/pyparsing-3.2.3-pyhd8ed1ab_1.conda https://conda.anaconda.org/conda-forge/noarch/pysocks-1.7.1-pyha55dd90_7.conda#461219d1a5bd61342293efa2c0c90eac https://conda.anaconda.org/conda-forge/noarch/pytz-2025.2-pyhd8ed1ab_0.conda#bc8e3267d44011051f2eb14d22fb0960 https://conda.anaconda.org/conda-forge/linux-64/pyyaml-6.0.2-py310h89163eb_2.conda#fd343408e64cf1e273ab7c710da374db -https://conda.anaconda.org/conda-forge/noarch/setuptools-75.8.2-pyhff2d567_0.conda#9bddfdbf4e061821a1a443f93223be61 +https://conda.anaconda.org/conda-forge/noarch/setuptools-78.1.0-pyhff2d567_0.conda#a42da9837e46c53494df0044c3eb1f53 https://conda.anaconda.org/conda-forge/noarch/six-1.17.0-pyhd8ed1ab_0.conda#a451d576819089b0d672f18768be0f65 https://conda.anaconda.org/conda-forge/noarch/snowballstemmer-2.2.0-pyhd8ed1ab_0.tar.bz2#4d22a9315e78c6827f806065957d566e https://conda.anaconda.org/conda-forge/noarch/soupsieve-2.5-pyhd8ed1ab_1.conda#3f144b2c34f8cb5a9abd9ed23a39c561 https://conda.anaconda.org/conda-forge/noarch/sphinxcontrib-jsmath-1.0.1-pyhd8ed1ab_1.conda#fa839b5ff59e192f411ccc7dae6588bb -https://conda.anaconda.org/conda-forge/noarch/tenacity-9.0.0-pyhd8ed1ab_1.conda#a09f66fe95a54a92172e56a4a97ba271 +https://conda.anaconda.org/conda-forge/noarch/tenacity-9.1.2-pyhd8ed1ab_0.conda#5d99943f2ae3cc69e1ada12ce9d4d701 https://conda.anaconda.org/conda-forge/noarch/threadpoolctl-3.6.0-pyhecae5ae_0.conda#9d64911b31d57ca443e9f1e36b04385f https://conda.anaconda.org/conda-forge/noarch/toml-0.10.2-pyhd8ed1ab_1.conda#b0dd904de08b7db706167240bf37b164 https://conda.anaconda.org/conda-forge/noarch/tomli-2.2.1-pyhd8ed1ab_1.conda#ac944244f1fed2eb49bae07193ae8215 https://conda.anaconda.org/conda-forge/noarch/toolz-1.0.0-pyhd8ed1ab_1.conda#40d0ed782a8aaa16ef248e68c06c168d https://conda.anaconda.org/conda-forge/linux-64/tornado-6.4.2-py310ha75aee5_0.conda#166d59aab40b9c607b4cc21c03924e9d -https://conda.anaconda.org/conda-forge/noarch/typing_extensions-4.13.0-pyh29332c3_1.conda#4c446320a86cc5d48e3b80e332d6ebd7 +https://conda.anaconda.org/conda-forge/noarch/typing_extensions-4.13.1-pyh29332c3_0.conda#5710c79a5fb0a6bfdba0a887f90583b1 https://conda.anaconda.org/conda-forge/linux-64/unicodedata2-16.0.0-py310ha75aee5_0.conda#1d7a4b9202cdd10d56ecdd7f6c347190 https://conda.anaconda.org/conda-forge/noarch/wheel-0.45.1-pyhd8ed1ab_1.conda#75cb7132eb58d97896e173ef12ac9986 https://conda.anaconda.org/conda-forge/linux-64/xcb-util-image-0.4.0-hb711507_2.conda#a0901183f08b6c7107aab109733a3c91 @@ -200,10 +200,10 @@ https://conda.anaconda.org/conda-forge/linux-64/cairo-1.18.4-h3394656_0.conda#09 https://conda.anaconda.org/conda-forge/linux-64/cffi-1.17.1-py310h8deb56e_0.conda#1fc24a3196ad5ede2a68148be61894f4 https://conda.anaconda.org/conda-forge/linux-64/cytoolz-1.0.1-py310ha75aee5_0.conda#d0be1adaa04a03aed745f3d02afb59ce https://conda.anaconda.org/conda-forge/linux-64/dbus-1.13.6-h5008d03_3.tar.bz2#ecfff944ba3960ecb334b9a2663d708d -https://conda.anaconda.org/conda-forge/linux-64/fonttools-4.56.0-py310h89163eb_0.conda#cd3125e1924bd8699dac9989652bca74 +https://conda.anaconda.org/conda-forge/linux-64/fonttools-4.57.0-py310h89163eb_0.conda#34378af82141b3c1725dcdf898b28fc6 https://conda.anaconda.org/conda-forge/linux-64/gfortran-13.3.0-h9576a4e_2.conda#19e6d3c9cde10a0a9a170a684082588e https://conda.anaconda.org/conda-forge/linux-64/gfortran_linux-64-13.3.0-hb919d3a_8.conda#5fa84c74a45687350aa5d468f64d8024 -https://conda.anaconda.org/conda-forge/linux-64/glib-tools-2.84.0-h4833e2c_0.conda#2d876130380b1593f25c20998df37880 +https://conda.anaconda.org/conda-forge/linux-64/glib-tools-2.84.1-h4833e2c_0.conda#ddc06964296eee2b4070e65415b332fd https://conda.anaconda.org/conda-forge/linux-64/gxx-13.3.0-h9576a4e_2.conda#07e8df00b7cd3084ad3ef598ce32a71c https://conda.anaconda.org/conda-forge/linux-64/gxx_linux-64-13.3.0-h6834431_8.conda#e66a842289d61d859d6df8589159b07b https://conda.anaconda.org/conda-forge/noarch/h2-4.2.0-pyhd8ed1ab_0.conda#b4754fb1bdcb70c8fd54f918301582c6 @@ -215,11 +215,10 @@ https://conda.anaconda.org/conda-forge/linux-64/lcms2-2.17-h717163a_0.conda#000e https://conda.anaconda.org/conda-forge/linux-64/libflac-1.4.3-h59595ed_0.conda#ee48bf17cc83a00f59ca1494d5646869 https://conda.anaconda.org/conda-forge/linux-64/libgl-1.7.0-ha4b6fd6_2.conda#928b8be80851f5d8ffb016f9c81dae7a https://conda.anaconda.org/conda-forge/linux-64/libhwloc-2.11.2-default_h0d58e46_1001.conda#804ca9e91bcaea0824a341d55b1684f2 -https://conda.anaconda.org/conda-forge/linux-64/libllvm19-19.1.7-ha7bfdaf_1.conda#6d2362046dce932eefbdeb0540de0c38 -https://conda.anaconda.org/conda-forge/linux-64/libllvm20-20.1.1-ha7bfdaf_0.conda#2e234fb7d6eeb5c32eb5b256403b5795 +https://conda.anaconda.org/conda-forge/linux-64/libllvm20-20.1.2-ha7bfdaf_0.conda#8354769527f9f441a3a04aa1c19188d9 https://conda.anaconda.org/conda-forge/linux-64/libxkbcommon-1.8.1-hc4a0caf_0.conda#e7e5b0652227d646b44abdcbd989da7b https://conda.anaconda.org/conda-forge/noarch/memory_profiler-0.61.0-pyhd8ed1ab_1.conda#71abbefb6f3b95e1668cd5e0af3affb9 -https://conda.anaconda.org/conda-forge/noarch/meson-1.7.0-pyhd8ed1ab_0.conda#6d4bbcce47061d2f9f2636409a8fe7c0 +https://conda.anaconda.org/conda-forge/noarch/meson-1.7.1-pyhd8ed1ab_0.conda#90018ee73b8741268027421ceac2809a https://conda.anaconda.org/conda-forge/linux-64/openjpeg-2.5.3-h5fbd93e_0.conda#9e5816bc95d285c115a3ebc2f8563564 https://conda.anaconda.org/conda-forge/linux-64/openldap-2.6.9-he970967_0.conda#ca2de8bbdc871bce41dbf59e51324165 https://conda.anaconda.org/conda-forge/noarch/partd-1.4.2-pyhd8ed1ab_0.conda#0badf9c54e24cecfb0ad2f99d680c163 @@ -229,19 +228,19 @@ https://conda.anaconda.org/conda-forge/noarch/pyproject-metadata-0.9.1-pyhd8ed1a https://conda.anaconda.org/conda-forge/noarch/pytest-8.3.5-pyhd8ed1ab_0.conda#c3c9316209dec74a705a36797970c6be https://conda.anaconda.org/conda-forge/noarch/python-dateutil-2.9.0.post0-pyhff2d567_1.conda#5ba79d7c71f03c678c8ead841f347d6e https://conda.anaconda.org/conda-forge/linux-64/sip-6.7.12-py310hc6cd4ac_0.conda#68d5bfccaba2d89a7812098dd3966d9b -https://conda.anaconda.org/conda-forge/noarch/typing-extensions-4.13.0-h9fa5a19_1.conda#3fbcc45b908040dca030d3f78ed9a212 +https://conda.anaconda.org/conda-forge/noarch/typing-extensions-4.13.1-hf5ce1d7_0.conda#e37cf790f710cf72fd13dcb6b2d4370c https://conda.anaconda.org/conda-forge/linux-64/xorg-libxdamage-1.1.6-hb9d3cd8_0.conda#b5fcc7172d22516e1f965490e65e33a4 https://conda.anaconda.org/conda-forge/linux-64/xorg-libxxf86vm-1.1.6-hb9d3cd8_0.conda#5efa5fa6243a622445fdfd72aee15efa https://conda.anaconda.org/conda-forge/noarch/beautifulsoup4-4.13.3-pyha770c72_0.conda#373374a3ed20141090504031dc7b693e https://conda.anaconda.org/conda-forge/linux-64/cxx-compiler-1.9.0-h1a2810e_0.conda#1ce8b218d359d9ed0ab481f2a3f3c512 https://conda.anaconda.org/conda-forge/noarch/dask-core-2025.3.0-pyhd8ed1ab_0.conda#36f6cc22457e3d6a6051c5370832f96c https://conda.anaconda.org/conda-forge/linux-64/fortran-compiler-1.9.0-h36df796_0.conda#cc0cf942201f9d3b0e9654ea02e12486 -https://conda.anaconda.org/conda-forge/linux-64/glib-2.84.0-h07242d1_0.conda#609bc3cf0d6fa5f35e33f49ffc72a09c -https://conda.anaconda.org/conda-forge/linux-64/harfbuzz-10.4.0-h76408a6_0.conda#81f137b4153cf111ff8e3188b6fb8e73 +https://conda.anaconda.org/conda-forge/linux-64/glib-2.84.1-h07242d1_0.conda#2c2357f18073331d4aefe7252b9fad17 +https://conda.anaconda.org/conda-forge/linux-64/harfbuzz-11.0.0-h76408a6_0.conda#347cb348bfc8d77062daee11c326e518 https://conda.anaconda.org/conda-forge/noarch/importlib-resources-6.5.2-pyhd8ed1ab_0.conda#e376ea42e9ae40f3278b0f79c9bf9826 -https://conda.anaconda.org/conda-forge/linux-64/libclang-cpp19.1-19.1.7-default_hb5137d0_2.conda#62d6f9353753a12a281ae99e0a3403c4 -https://conda.anaconda.org/conda-forge/linux-64/libclang13-20.1.1-default_h9c6a7e4_0.conda#f8b1b8c13c0a0fede5e1a204eafb48f8 -https://conda.anaconda.org/conda-forge/linux-64/libpq-17.4-h27ae623_0.conda#d67f3f3c33344ff3e9ef5270001e9011 +https://conda.anaconda.org/conda-forge/linux-64/libclang-cpp20.1-20.1.2-default_hb5137d0_0.conda#729198eae19e9dbf8e0ffe355d416bde +https://conda.anaconda.org/conda-forge/linux-64/libclang13-20.1.2-default_h9c6a7e4_0.conda#c5fe177150aecc6ec46609b0a6123f39 +https://conda.anaconda.org/conda-forge/linux-64/libpq-17.4-h27ae623_1.conda#37fba334855ef3b51549308e61ed7a3d https://conda.anaconda.org/conda-forge/linux-64/libsndfile-1.2.2-hc60ed4a_1.conda#ef1910918dd895516a769ed36b5b3a4e https://conda.anaconda.org/conda-forge/noarch/meson-python-0.17.1-pyh70fd9c4_1.conda#7a02679229c6c2092571b4c025055440 https://conda.anaconda.org/conda-forge/linux-64/pillow-11.1.0-py310h7e6dc6c_0.conda#14d300b9e1504748e70cc6499a7b4d25 @@ -261,7 +260,7 @@ https://conda.anaconda.org/conda-forge/noarch/requests-2.32.3-pyhd8ed1ab_1.conda https://conda.anaconda.org/conda-forge/linux-64/liblapacke-3.9.0-11_h0ad7b2f_netlib.conda#06dacf1374982882a6ca02e1fa13efbd https://conda.anaconda.org/conda-forge/linux-64/numpy-1.22.0-py310h454958d_1.tar.bz2#607c66f0cce2986515a8fe9e136b2b57 https://conda.anaconda.org/conda-forge/noarch/pooch-1.6.0-pyhd8ed1ab_0.tar.bz2#6429e1d1091c51f626b5dcfdd38bf429 -https://conda.anaconda.org/conda-forge/linux-64/qt-main-5.15.15-hc3cb62f_2.conda#eadc22e45a87c8d5c71670d9ec956aba +https://conda.anaconda.org/conda-forge/linux-64/qt-main-5.15.15-h993ce98_3.conda#aa49f5308f39277477d47cd6687eb8f3 https://conda.anaconda.org/conda-forge/linux-64/blas-devel-3.9.0-31_hdec4247_blis.conda#1675e95a742c910204645f7b6d7e56dc https://conda.anaconda.org/conda-forge/linux-64/imagecodecs-2024.12.30-py310h78a9a29_0.conda#e0c50079904122427bcf52e1afcd1cdb https://conda.anaconda.org/conda-forge/noarch/imageio-2.37.0-pyhfb79c49_0.conda#b5577bc2212219566578fd5af9993af6 @@ -277,7 +276,7 @@ https://conda.anaconda.org/conda-forge/linux-64/matplotlib-3.5.0-py310hff52083_0 https://conda.anaconda.org/conda-forge/linux-64/pyamg-4.2.1-py310h7c3ba0c_0.tar.bz2#89f5a48e1f23b5cf3163a6094903d181 https://conda.anaconda.org/conda-forge/noarch/seaborn-base-0.13.2-pyhd8ed1ab_3.conda#fd96da444e81f9e6fcaac38590f3dd42 https://conda.anaconda.org/conda-forge/linux-64/statsmodels-0.14.2-py310h261611a_0.conda#4b8508bab02b2aa2cef12eab4883f4a1 -https://conda.anaconda.org/conda-forge/noarch/tifffile-2025.3.13-pyhd8ed1ab_0.conda#4660bf736145d44fe220f0f95c9d9a2a +https://conda.anaconda.org/conda-forge/noarch/tifffile-2025.3.30-pyhd8ed1ab_0.conda#14f46147fae19bb867f82a787c7059e9 https://conda.anaconda.org/conda-forge/linux-64/scikit-image-0.19.0-py310hb5077e9_0.tar.bz2#aa24b3a4aa979641ac3144405209cd89 https://conda.anaconda.org/conda-forge/noarch/seaborn-0.13.2-hd8ed1ab_3.conda#62afb877ca2c2b4b6f9ecb37320085b6 https://conda.anaconda.org/conda-forge/noarch/numpydoc-1.2-pyhd8ed1ab_0.tar.bz2#025ad7ca2c7f65007ab6b6f5d93a56eb diff --git a/build_tools/github/pymin_conda_forge_arm_linux-aarch64_conda.lock b/build_tools/github/pymin_conda_forge_arm_linux-aarch64_conda.lock index 04f131445126d..de98371205a57 100644 --- a/build_tools/github/pymin_conda_forge_arm_linux-aarch64_conda.lock +++ b/build_tools/github/pymin_conda_forge_arm_linux-aarch64_conda.lock @@ -10,7 +10,7 @@ https://conda.anaconda.org/conda-forge/noarch/font-ttf-ubuntu-0.83-h77eed37_3.co https://conda.anaconda.org/conda-forge/linux-aarch64/ld_impl_linux-aarch64-2.43-h80caac9_4.conda#80c9ad5e05e91bb6c0967af3880c9742 https://conda.anaconda.org/conda-forge/linux-aarch64/libglvnd-1.7.0-hd24410f_2.conda#9e115653741810778c9a915a2f8439e7 https://conda.anaconda.org/conda-forge/linux-aarch64/libgomp-14.2.0-he277a41_2.conda#b11c09d9463daf4cae492d29806b1889 -https://conda.anaconda.org/conda-forge/linux-aarch64/python_abi-3.10-5_cp310.conda#c6694ec383fb171da3ab68cae8d0e8f1 +https://conda.anaconda.org/conda-forge/linux-aarch64/python_abi-3.10-6_cp310.conda#19ea13732057398dc3d5d33bce751646 https://conda.anaconda.org/conda-forge/noarch/tzdata-2025b-h78e105d_0.conda#4222072737ccff51314b5ece9c7d6f5a https://conda.anaconda.org/conda-forge/linux-aarch64/_openmp_mutex-4.5-2_gnu.tar.bz2#6168d71addc746e8f2b8d57dfd2edcea https://conda.anaconda.org/conda-forge/noarch/fonts-conda-forge-1-0.tar.bz2#f766549260d6815b0c52253f1fb1bb29 @@ -21,12 +21,12 @@ https://conda.anaconda.org/conda-forge/linux-aarch64/libgcc-14.2.0-he277a41_2.co https://conda.anaconda.org/conda-forge/linux-aarch64/alsa-lib-1.2.13-h86ecc28_0.conda#f643bb02c4bbcfe7de161a8ca5df530b https://conda.anaconda.org/conda-forge/linux-aarch64/libbrotlicommon-1.1.0-h86ecc28_2.conda#3ee026955c688f551a9999840cff4c67 https://conda.anaconda.org/conda-forge/linux-aarch64/libdeflate-1.23-h5e3c512_0.conda#7e7ca2607b11b180120cefc2354fc0cb -https://conda.anaconda.org/conda-forge/linux-aarch64/libexpat-2.6.4-h5ad3122_0.conda#f1b3fab36861b3ce945a13f0dfdfc688 -https://conda.anaconda.org/conda-forge/linux-aarch64/libffi-3.4.6-he21f813_0.conda#966084fccf3ad62a3160666cda869f28 +https://conda.anaconda.org/conda-forge/linux-aarch64/libexpat-2.7.0-h5ad3122_0.conda#d41a057e7968705dae8dcb7c8ba2c8dd +https://conda.anaconda.org/conda-forge/linux-aarch64/libffi-3.4.6-he21f813_1.conda#15a131f30cae36e9a655ca81fee9a285 https://conda.anaconda.org/conda-forge/linux-aarch64/libgcc-ng-14.2.0-he9431aa_2.conda#692c2bb75f32cfafb6799cf6d1c5d0e0 https://conda.anaconda.org/conda-forge/linux-aarch64/libgfortran5-14.2.0-hb6113d0_2.conda#cd754566661513808ef2408c4ab99a2f https://conda.anaconda.org/conda-forge/linux-aarch64/libiconv-1.18-hc99b53d_1.conda#81541d85a45fbf4d0a29346176f1f21c -https://conda.anaconda.org/conda-forge/linux-aarch64/liblzma-5.6.4-h86ecc28_0.conda#b88244e0a115cc34f7fbca9b11248e76 +https://conda.anaconda.org/conda-forge/linux-aarch64/liblzma-5.8.1-h86ecc28_0.conda#775d36ea4e469b0c049a6f2cd6253d82 https://conda.anaconda.org/conda-forge/linux-aarch64/libstdcxx-14.2.0-h3f4de04_2.conda#eadee2cda99697e29411c1013c187b92 https://conda.anaconda.org/conda-forge/linux-aarch64/libwebp-base-1.5.0-h0886dbf_0.conda#95ef4a689b8cc1b7e18b53784d88f96b https://conda.anaconda.org/conda-forge/linux-aarch64/libzlib-1.3.1-h86ecc28_2.conda#08aad7cbe9f5a6b460d0976076b6ae64 @@ -38,7 +38,7 @@ https://conda.anaconda.org/conda-forge/linux-aarch64/xorg-libxau-1.0.12-h86ecc28 https://conda.anaconda.org/conda-forge/linux-aarch64/xorg-libxdmcp-1.1.5-h57736b2_0.conda#25a5a7b797fe6e084e04ffe2db02fc62 https://conda.anaconda.org/conda-forge/linux-aarch64/bzip2-1.0.8-h68df207_7.conda#56398c28220513b9ea13d7b450acfb20 https://conda.anaconda.org/conda-forge/linux-aarch64/double-conversion-3.3.1-h5ad3122_0.conda#399959d889e1a73fc99f12ce480e77e1 -https://conda.anaconda.org/conda-forge/linux-aarch64/expat-2.6.4-h5ad3122_0.conda#e8f1d587055376ea2419cc78696abd0b +https://conda.anaconda.org/conda-forge/linux-aarch64/expat-2.7.0-h5ad3122_0.conda#c22e14e241ade3d3a74c0409c3d582a2 https://conda.anaconda.org/conda-forge/linux-aarch64/keyutils-1.6.1-h4e544f5_0.tar.bz2#1f24853e59c68892452ef94ddd8afd4b https://conda.anaconda.org/conda-forge/linux-aarch64/libbrotlidec-1.1.0-h86ecc28_2.conda#e64d0f3b59c7c4047446b97a8624a72d https://conda.anaconda.org/conda-forge/linux-aarch64/libbrotlienc-1.1.0-h86ecc28_2.conda#0e9bd365480c72b25c71a448257b537d @@ -71,7 +71,7 @@ https://conda.anaconda.org/conda-forge/linux-aarch64/libopenblas-0.3.29-pthreads https://conda.anaconda.org/conda-forge/linux-aarch64/mysql-libs-9.0.1-h11569fd_5.conda#bbee9b7b1fb37bd1d9c5df0fc50fda84 https://conda.anaconda.org/conda-forge/linux-aarch64/ninja-1.12.1-h70be974_0.conda#216635cea46498d8045c7cf0f03eaf72 https://conda.anaconda.org/conda-forge/linux-aarch64/pcre2-10.44-h070dd5b_2.conda#94022de9682cb1a0bb18a99cbc3541b3 -https://conda.anaconda.org/conda-forge/linux-aarch64/python-3.10.16-h57b00e1_1_cpython.conda#c4b3a08e4d6fc7b070720f75bc883b47 +https://conda.anaconda.org/conda-forge/linux-aarch64/python-3.10.16-hee626be_2_cpython.conda#e199431c5f250b8bc812cf4d6630715c https://conda.anaconda.org/conda-forge/linux-aarch64/qhull-2020.2-h70be974_5.conda#bb138086d938e2b64f5f364945793ebf https://conda.anaconda.org/conda-forge/linux-aarch64/wayland-1.23.1-h698ed42_0.conda#2661f9252065051914f1cdf5835e7430 https://conda.anaconda.org/conda-forge/linux-aarch64/xcb-util-0.4.1-h5c728e9_2.conda#b4cf8ba6cff9cdf1249bcfe1314222b0 @@ -92,17 +92,17 @@ https://conda.anaconda.org/conda-forge/noarch/iniconfig-2.0.0-pyhd8ed1ab_1.conda https://conda.anaconda.org/conda-forge/linux-aarch64/kiwisolver-1.4.7-py310h5d7f10c_0.conda#b86d594bf17c9ad7a291593368ae8ba7 https://conda.anaconda.org/conda-forge/linux-aarch64/libblas-3.9.0-31_h1a9f1db_openblas.conda#48bd5bf15ccf3e409840be9caafc0ad5 https://conda.anaconda.org/conda-forge/linux-aarch64/libcups-2.3.3-h405e4a8_4.conda#d42c670b0c96c1795fd859d5e0275a55 -https://conda.anaconda.org/conda-forge/linux-aarch64/libglib-2.84.0-hc486b8e_0.conda#0e32e3c613a7cd492c8ff99772b77fc6 +https://conda.anaconda.org/conda-forge/linux-aarch64/libglib-2.84.1-hc486b8e_0.conda#07cb059040220481ab9eda17cb86f644 https://conda.anaconda.org/conda-forge/linux-aarch64/libglx-1.7.0-hd24410f_2.conda#1d4269e233636148696a67e2d30dad2a https://conda.anaconda.org/conda-forge/linux-aarch64/libhiredis-1.0.2-h05efe27_0.tar.bz2#a87f068744fd20334cd41489eb163bee https://conda.anaconda.org/conda-forge/linux-aarch64/libtiff-4.7.0-h88f7998_3.conda#36a0ea4a173338c8725dc0807e99cf22 -https://conda.anaconda.org/conda-forge/linux-aarch64/libxml2-2.13.7-h2e0c361_0.conda#745fbda3e667084d1fb00e64cdfeaff6 +https://conda.anaconda.org/conda-forge/linux-aarch64/libxml2-2.13.7-he060846_1.conda#b461618b5dafbc95c6f9492043cd991a https://conda.anaconda.org/conda-forge/noarch/munkres-1.1.4-pyh9f0ad1d_0.tar.bz2#2ba8498c1018c1e9c61eb99b973dfe19 https://conda.anaconda.org/conda-forge/linux-aarch64/openblas-0.3.29-pthreads_h3a8cbd8_0.conda#4ec5b6144709ced5e7933977675f61c6 https://conda.anaconda.org/conda-forge/noarch/packaging-24.2-pyhd8ed1ab_2.conda#3bfed7e6228ebf2f7b9eaa47f1b4e2aa https://conda.anaconda.org/conda-forge/noarch/pluggy-1.5.0-pyhd8ed1ab_1.conda#e9dcbce5f45f9ee500e728ae58b605b6 https://conda.anaconda.org/conda-forge/noarch/pyparsing-3.2.3-pyhd8ed1ab_1.conda#513d3c262ee49b54a8fec85c5bc99764 -https://conda.anaconda.org/conda-forge/noarch/setuptools-75.8.2-pyhff2d567_0.conda#9bddfdbf4e061821a1a443f93223be61 +https://conda.anaconda.org/conda-forge/noarch/setuptools-78.1.0-pyhff2d567_0.conda#a42da9837e46c53494df0044c3eb1f53 https://conda.anaconda.org/conda-forge/noarch/six-1.17.0-pyhd8ed1ab_0.conda#a451d576819089b0d672f18768be0f65 https://conda.anaconda.org/conda-forge/noarch/threadpoolctl-3.6.0-pyhecae5ae_0.conda#9d64911b31d57ca443e9f1e36b04385f https://conda.anaconda.org/conda-forge/noarch/tomli-2.2.1-pyhd8ed1ab_1.conda#ac944244f1fed2eb49bae07193ae8215 @@ -117,16 +117,16 @@ https://conda.anaconda.org/conda-forge/linux-aarch64/xorg-libxrender-0.9.12-h86e https://conda.anaconda.org/conda-forge/linux-aarch64/cairo-1.18.4-h83712da_0.conda#cd55953a67ec727db5dc32b167201aa6 https://conda.anaconda.org/conda-forge/linux-aarch64/ccache-4.11.2-h3aba2e8_0.conda#a46293869605e4a6b0635f0bf9e0d492 https://conda.anaconda.org/conda-forge/linux-aarch64/dbus-1.13.6-h12b9eeb_3.tar.bz2#f3d63805602166bac09386741e00935e -https://conda.anaconda.org/conda-forge/linux-aarch64/fonttools-4.56.0-py310heeae437_0.conda#e7f958bd810515699d872ed7a9ba2cbb +https://conda.anaconda.org/conda-forge/linux-aarch64/fonttools-4.57.0-py310heeae437_0.conda#548b750f1b3ec57d07b0014f8081e9c2 https://conda.anaconda.org/conda-forge/noarch/joblib-1.4.2-pyhd8ed1ab_1.conda#bf8243ee348f3a10a14ed0cae323e0c1 https://conda.anaconda.org/conda-forge/linux-aarch64/lcms2-2.17-hc88f144_0.conda#b87b1abd2542cf65a00ad2e2461a3083 https://conda.anaconda.org/conda-forge/linux-aarch64/libcblas-3.9.0-31_hab92f65_openblas.conda#6b81dbae56a519f1ec2f25e0ee2f4334 https://conda.anaconda.org/conda-forge/linux-aarch64/libgl-1.7.0-hd24410f_2.conda#0d00176464ebb25af83d40736a2cd3bb https://conda.anaconda.org/conda-forge/linux-aarch64/liblapack-3.9.0-31_h411afd4_openblas.conda#41dbff5eb805a75c120a7b7a1c744dc2 -https://conda.anaconda.org/conda-forge/linux-aarch64/libllvm20-20.1.1-h2edbd07_0.conda#33bff90f1ccb38bcf5934aad0137d683 +https://conda.anaconda.org/conda-forge/linux-aarch64/libllvm20-20.1.2-h2edbd07_0.conda#a6a01576192b8b535047f2aff6563170 https://conda.anaconda.org/conda-forge/linux-aarch64/libxkbcommon-1.8.1-h2ef6bd0_0.conda#8abc18afd93162a37d25fd244bf62ab5 https://conda.anaconda.org/conda-forge/linux-aarch64/libxslt-1.1.39-h1cc9640_0.conda#13e1d3f9188e85c6d59a98651aced002 -https://conda.anaconda.org/conda-forge/noarch/meson-1.7.0-pyhd8ed1ab_0.conda#6d4bbcce47061d2f9f2636409a8fe7c0 +https://conda.anaconda.org/conda-forge/noarch/meson-1.7.1-pyhd8ed1ab_0.conda#90018ee73b8741268027421ceac2809a https://conda.anaconda.org/conda-forge/linux-aarch64/openjpeg-2.5.3-h3f56577_0.conda#04231368e4af50d11184b50e14250993 https://conda.anaconda.org/conda-forge/linux-aarch64/openldap-2.6.9-h30c48ee_0.conda#c07822a5de65ce9797b9afa257faa917 https://conda.anaconda.org/conda-forge/noarch/pip-25.0.1-pyh8b19718_0.conda#79b5c1440aedc5010f687048d9103628 @@ -141,10 +141,10 @@ https://conda.anaconda.org/conda-forge/linux-aarch64/xorg-libxi-1.8.2-h57736b2_0 https://conda.anaconda.org/conda-forge/linux-aarch64/xorg-libxrandr-1.5.4-h86ecc28_0.conda#dd3e74283a082381aa3860312e3c721e https://conda.anaconda.org/conda-forge/linux-aarch64/xorg-libxxf86vm-1.1.6-h86ecc28_0.conda#d745faa2d7c15092652e40a22bb261ed https://conda.anaconda.org/conda-forge/linux-aarch64/harfbuzz-11.0.0-hb5e3f52_0.conda#05aafde71043cefa7aa045d02d13a121 -https://conda.anaconda.org/conda-forge/linux-aarch64/libclang-cpp20.1-20.1.1-default_he324ac1_0.conda#e77c186cbd69b54d2be6e189a7c53981 -https://conda.anaconda.org/conda-forge/linux-aarch64/libclang13-20.1.1-default_h4390ef5_0.conda#faa5920ac55e48c39732b018ba13d11c +https://conda.anaconda.org/conda-forge/linux-aarch64/libclang-cpp20.1-20.1.2-default_he324ac1_0.conda#92c39738e932a6e56f4f8e79cf90cbca +https://conda.anaconda.org/conda-forge/linux-aarch64/libclang13-20.1.2-default_h4390ef5_0.conda#1b6fe4be5192efb10a7e8578d29f4cb4 https://conda.anaconda.org/conda-forge/linux-aarch64/liblapacke-3.9.0-31_hc659ca5_openblas.conda#256bb281d78e5b8927ff13a1cde9f6f5 -https://conda.anaconda.org/conda-forge/linux-aarch64/libpq-17.4-hf590da8_0.conda#d5350c35cc7512a5035d24d8e23a0dc7 +https://conda.anaconda.org/conda-forge/linux-aarch64/libpq-17.4-hf590da8_1.conda#10fdc78be541c9017e2144f86d092aa2 https://conda.anaconda.org/conda-forge/noarch/meson-python-0.17.1-pyh70fd9c4_1.conda#7a02679229c6c2092571b4c025055440 https://conda.anaconda.org/conda-forge/linux-aarch64/numpy-2.2.4-py310h6e5608f_0.conda#3a7b45aaa7704194b823d2d34b75aad1 https://conda.anaconda.org/conda-forge/linux-aarch64/pillow-11.1.0-py310h34c99de_0.conda#c4fa80647a708505d65573c2353bc216 @@ -152,9 +152,9 @@ https://conda.anaconda.org/conda-forge/noarch/pytest-xdist-3.6.1-pyhd8ed1ab_1.co https://conda.anaconda.org/conda-forge/linux-aarch64/xorg-libxtst-1.2.5-h57736b2_3.conda#c05698071b5c8e0da82a282085845860 https://conda.anaconda.org/conda-forge/linux-aarch64/blas-devel-3.9.0-31_h9678261_openblas.conda#a2cc143d7e25e52a915cb320e5b0d592 https://conda.anaconda.org/conda-forge/linux-aarch64/contourpy-1.3.1-py310hf54e67a_0.conda#4dd4efc74373cb53f9c1191f768a9b45 -https://conda.anaconda.org/conda-forge/linux-aarch64/qt6-main-6.8.3-ha483c8b_1.conda#11b4b87be60bc5564f4b3c8191c760b2 +https://conda.anaconda.org/conda-forge/linux-aarch64/qt6-main-6.9.0-ha483c8b_0.conda#0790eb2e015cb32391cac90f68b39a40 https://conda.anaconda.org/conda-forge/linux-aarch64/scipy-1.15.2-py310hf37559f_0.conda#5c9b72f10d2118d943a5eaaf2f396891 https://conda.anaconda.org/conda-forge/linux-aarch64/blas-2.131-openblas.conda#51c5f346e1ebee750f76066490059df9 https://conda.anaconda.org/conda-forge/linux-aarch64/matplotlib-base-3.10.1-py310h2cc5e2d_0.conda#5652e355346f4823f6b4bfdd4860359d -https://conda.anaconda.org/conda-forge/linux-aarch64/pyside6-6.8.3-py310hee8ad4f_0.conda#9600fb984ec6d6d6df61146a66c907a7 +https://conda.anaconda.org/conda-forge/linux-aarch64/pyside6-6.9.0-py310hee8ad4f_0.conda#68f556281ac23f1780381f00de99d66d https://conda.anaconda.org/conda-forge/linux-aarch64/matplotlib-3.10.1-py310hbbe02a8_0.conda#c6aa0ea00ec104d0ad260c2ed2bb5582 From bef5759d601ff103170c11dd60530adad131b958 Mon Sep 17 00:00:00 2001 From: scikit-learn-bot Date: Mon, 7 Apr 2025 11:14:01 +0200 Subject: [PATCH 022/182] :lock: :robot: CI Update lock files for free-threaded CI build(s) :lock: :robot: (#31153) Co-authored-by: Lock file bot --- .../azure/pylatest_free_threaded_linux-64_conda.lock | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/build_tools/azure/pylatest_free_threaded_linux-64_conda.lock b/build_tools/azure/pylatest_free_threaded_linux-64_conda.lock index f869ef9e2349a..1cda1d57605b8 100644 --- a/build_tools/azure/pylatest_free_threaded_linux-64_conda.lock +++ b/build_tools/azure/pylatest_free_threaded_linux-64_conda.lock @@ -10,11 +10,11 @@ https://conda.anaconda.org/conda-forge/linux-64/ld_impl_linux-64-2.43-h712a8e2_4 https://conda.anaconda.org/conda-forge/linux-64/libgomp-14.2.0-h767d61c_2.conda#06d02030237f4d5b3d9a7e7d348fe3c6 https://conda.anaconda.org/conda-forge/linux-64/_openmp_mutex-4.5-2_gnu.tar.bz2#73aaf86a425cc6e73fcf236a5a46396d https://conda.anaconda.org/conda-forge/linux-64/libgcc-14.2.0-h767d61c_2.conda#ef504d1acbd74b7cc6849ef8af47dd03 -https://conda.anaconda.org/conda-forge/linux-64/libexpat-2.6.4-h5888daf_0.conda#db833e03127376d461e1e13e76f09b6c -https://conda.anaconda.org/conda-forge/linux-64/libffi-3.4.6-h2dba641_0.conda#e3eb7806380bc8bcecba6d749ad5f026 +https://conda.anaconda.org/conda-forge/linux-64/libexpat-2.7.0-h5888daf_0.conda#db0bfbe7dd197b68ad5f30333bae6ce0 +https://conda.anaconda.org/conda-forge/linux-64/libffi-3.4.6-h2dba641_1.conda#ede4673863426c0883c0063d853bbd85 https://conda.anaconda.org/conda-forge/linux-64/libgcc-ng-14.2.0-h69a702a_2.conda#a2222a6ada71fb478682efe483ce0f92 https://conda.anaconda.org/conda-forge/linux-64/libgfortran5-14.2.0-hf1ad2bd_2.conda#556a4fdfac7287d349b8f09aba899693 -https://conda.anaconda.org/conda-forge/linux-64/liblzma-5.6.4-hb9d3cd8_0.conda#42d5b6a0f30d3c10cd88cb8584fda1cb +https://conda.anaconda.org/conda-forge/linux-64/liblzma-5.8.1-hb9d3cd8_0.conda#0e87378639676987af32fee53ba32258 https://conda.anaconda.org/conda-forge/linux-64/libstdcxx-14.2.0-h8f9b012_2.conda#a78c856b6dc6bf4ea8daeb9beaaa3fb0 https://conda.anaconda.org/conda-forge/linux-64/libzlib-1.3.1-hb9d3cd8_2.conda#edb0dca6bc32e4f4789199455a1dbeb8 https://conda.anaconda.org/conda-forge/linux-64/ncurses-6.5-h2d0b736_3.conda#47e340acb35de30501a76c7c799c41d7 @@ -42,14 +42,14 @@ https://conda.anaconda.org/conda-forge/linux-64/libhiredis-1.0.2-h2cc385e_0.tar. https://conda.anaconda.org/conda-forge/noarch/packaging-24.2-pyhd8ed1ab_2.conda#3bfed7e6228ebf2f7b9eaa47f1b4e2aa https://conda.anaconda.org/conda-forge/noarch/pip-25.0.1-pyh145f28c_0.conda#9ba21d75dc722c29827988a575a65707 https://conda.anaconda.org/conda-forge/noarch/pluggy-1.5.0-pyhd8ed1ab_1.conda#e9dcbce5f45f9ee500e728ae58b605b6 -https://conda.anaconda.org/conda-forge/noarch/setuptools-75.8.2-pyhff2d567_0.conda#9bddfdbf4e061821a1a443f93223be61 +https://conda.anaconda.org/conda-forge/noarch/setuptools-78.1.0-pyhff2d567_0.conda#a42da9837e46c53494df0044c3eb1f53 https://conda.anaconda.org/conda-forge/noarch/threadpoolctl-3.6.0-pyhecae5ae_0.conda#9d64911b31d57ca443e9f1e36b04385f https://conda.anaconda.org/conda-forge/noarch/tomli-2.2.1-pyhd8ed1ab_1.conda#ac944244f1fed2eb49bae07193ae8215 https://conda.anaconda.org/conda-forge/linux-64/ccache-4.11.2-hd714d17_0.conda#35ae7ce74089ab05fdb1cb9746c0fbe4 https://conda.anaconda.org/conda-forge/noarch/joblib-1.4.2-pyhd8ed1ab_1.conda#bf8243ee348f3a10a14ed0cae323e0c1 https://conda.anaconda.org/conda-forge/linux-64/libcblas-3.9.0-31_he106b2a_openblas.conda#abb32c727da370c481a1c206f5159ce9 https://conda.anaconda.org/conda-forge/linux-64/liblapack-3.9.0-31_h7ac8fdf_openblas.conda#452b98eafe050ecff932f0ec832dd03f -https://conda.anaconda.org/conda-forge/noarch/meson-1.7.0-pyhd8ed1ab_0.conda#6d4bbcce47061d2f9f2636409a8fe7c0 +https://conda.anaconda.org/conda-forge/noarch/meson-1.7.1-pyhd8ed1ab_0.conda#90018ee73b8741268027421ceac2809a https://conda.anaconda.org/conda-forge/noarch/pyproject-metadata-0.9.1-pyhd8ed1ab_0.conda#22ae7c6ea81e0c8661ef32168dda929b https://conda.anaconda.org/conda-forge/noarch/pytest-8.3.5-pyhd8ed1ab_0.conda#c3c9316209dec74a705a36797970c6be https://conda.anaconda.org/conda-forge/noarch/python-freethreading-3.13.2-h92d6c8b_1.conda#e113f67f0de399caeaa57693237f2fd2 From 35c431d5115e98d4f60264547dddad29646abecc Mon Sep 17 00:00:00 2001 From: scikit-learn-bot Date: Mon, 7 Apr 2025 11:15:09 +0200 Subject: [PATCH 023/182] :lock: :robot: CI Update lock files for array-api CI build(s) :lock: :robot: (#31155) Co-authored-by: Lock file bot --- ...a_forge_cuda_array-api_linux-64_conda.lock | 44 +++++++++---------- 1 file changed, 22 insertions(+), 22 deletions(-) diff --git a/build_tools/github/pylatest_conda_forge_cuda_array-api_linux-64_conda.lock b/build_tools/github/pylatest_conda_forge_cuda_array-api_linux-64_conda.lock index 9f4bf41811b54..762e851df399e 100644 --- a/build_tools/github/pylatest_conda_forge_cuda_array-api_linux-64_conda.lock +++ b/build_tools/github/pylatest_conda_forge_cuda_array-api_linux-64_conda.lock @@ -9,12 +9,12 @@ https://conda.anaconda.org/conda-forge/noarch/font-ttf-inconsolata-3.000-h77eed3 https://conda.anaconda.org/conda-forge/noarch/font-ttf-source-code-pro-2.038-h77eed37_0.tar.bz2#4d59c254e01d9cde7957100457e2d5fb https://conda.anaconda.org/conda-forge/noarch/font-ttf-ubuntu-0.83-h77eed37_3.conda#49023d73832ef61042f6a237cb2687e7 https://conda.anaconda.org/conda-forge/noarch/kernel-headers_linux-64-3.10.0-he073ed8_18.conda#ad8527bf134a90e1c9ed35fa0b64318c -https://conda.anaconda.org/conda-forge/linux-64/python_abi-3.13-5_cp313.conda#381bbd2a92c863f640a55b6ff3c35161 +https://conda.anaconda.org/conda-forge/linux-64/python_abi-3.13-6_cp313.conda#ef1d8e55d61220011cceed0b94a920d2 https://conda.anaconda.org/conda-forge/noarch/tzdata-2025b-h78e105d_0.conda#4222072737ccff51314b5ece9c7d6f5a https://conda.anaconda.org/conda-forge/noarch/fonts-conda-forge-1-0.tar.bz2#f766549260d6815b0c52253f1fb1bb29 https://conda.anaconda.org/conda-forge/linux-64/ld_impl_linux-64-2.43-h712a8e2_4.conda#01f8d123c96816249efd255a31ad7712 https://conda.anaconda.org/conda-forge/linux-64/libglvnd-1.7.0-ha4b6fd6_2.conda#434ca7e50e40f4918ab701e3facd59a0 -https://conda.anaconda.org/conda-forge/linux-64/llvm-openmp-20.1.1-h024ca30_1.conda#cfae5693f2ee2117e75e5e533451e04c +https://conda.anaconda.org/conda-forge/linux-64/llvm-openmp-20.1.2-h024ca30_0.conda#322da3c0641a7f0dafd5be6d3ea23d96 https://conda.anaconda.org/conda-forge/noarch/sysroot_linux-64-2.17-h0157908_18.conda#460eba7851277ec1fd80a1a24080787a https://conda.anaconda.org/conda-forge/linux-64/_openmp_mutex-4.5-3_kmp_llvm.conda#ee5c2118262e30b972bc0b4db8ef0ba5 https://conda.anaconda.org/conda-forge/noarch/fonts-conda-ecosystem-1-0.tar.bz2#fee5683a3f04bd15cbd8318b096a27ab @@ -26,12 +26,12 @@ https://conda.anaconda.org/conda-forge/linux-64/aws-c-common-0.10.6-hb9d3cd8_0.c https://conda.anaconda.org/conda-forge/linux-64/c-ares-1.34.4-hb9d3cd8_0.conda#e2775acf57efd5af15b8e3d1d74d72d3 https://conda.anaconda.org/conda-forge/linux-64/libbrotlicommon-1.1.0-hb9d3cd8_2.conda#41b599ed2b02abcfdd84302bff174b23 https://conda.anaconda.org/conda-forge/linux-64/libdeflate-1.23-h4ddbbb0_0.conda#8dfae1d2e74767e9ce36d5fa0d8605db -https://conda.anaconda.org/conda-forge/linux-64/libexpat-2.6.4-h5888daf_0.conda#db833e03127376d461e1e13e76f09b6c -https://conda.anaconda.org/conda-forge/linux-64/libffi-3.4.6-h2dba641_0.conda#e3eb7806380bc8bcecba6d749ad5f026 +https://conda.anaconda.org/conda-forge/linux-64/libexpat-2.7.0-h5888daf_0.conda#db0bfbe7dd197b68ad5f30333bae6ce0 +https://conda.anaconda.org/conda-forge/linux-64/libffi-3.4.6-h2dba641_1.conda#ede4673863426c0883c0063d853bbd85 https://conda.anaconda.org/conda-forge/linux-64/libgcc-ng-14.2.0-h69a702a_2.conda#a2222a6ada71fb478682efe483ce0f92 https://conda.anaconda.org/conda-forge/linux-64/libgfortran5-14.2.0-hf1ad2bd_2.conda#556a4fdfac7287d349b8f09aba899693 https://conda.anaconda.org/conda-forge/linux-64/libiconv-1.18-h4ce23a2_1.conda#e796ff8ddc598affdf7c173d6145f087 -https://conda.anaconda.org/conda-forge/linux-64/liblzma-5.6.4-hb9d3cd8_0.conda#42d5b6a0f30d3c10cd88cb8584fda1cb +https://conda.anaconda.org/conda-forge/linux-64/liblzma-5.8.1-hb9d3cd8_0.conda#0e87378639676987af32fee53ba32258 https://conda.anaconda.org/conda-forge/linux-64/libntlm-1.8-hb9d3cd8_0.conda#7c7927b404672409d9917d49bff5f2d6 https://conda.anaconda.org/conda-forge/linux-64/libstdcxx-14.2.0-h8f9b012_2.conda#a78c856b6dc6bf4ea8daeb9beaaa3fb0 https://conda.anaconda.org/conda-forge/linux-64/libutf8proc-2.9.0-hb9d3cd8_1.conda#1e936bd23d737aac62a18e9a1e7f8b18 @@ -50,7 +50,7 @@ https://conda.anaconda.org/conda-forge/linux-64/aws-c-sdkutils-0.2.1-h4e1184b_4. https://conda.anaconda.org/conda-forge/linux-64/aws-checksums-0.2.2-h4e1184b_4.conda#74e8c3e4df4ceae34aa2959df4b28101 https://conda.anaconda.org/conda-forge/linux-64/bzip2-1.0.8-h4bc722e_7.conda#62ee74e96c5ebb0af99386de58cf9553 https://conda.anaconda.org/conda-forge/linux-64/double-conversion-3.3.1-h5888daf_0.conda#bfd56492d8346d669010eccafe0ba058 -https://conda.anaconda.org/conda-forge/linux-64/expat-2.6.4-h5888daf_0.conda#1d6afef758879ef5ee78127eb4cd2c4a +https://conda.anaconda.org/conda-forge/linux-64/expat-2.7.0-h5888daf_0.conda#d6845ae4dea52a2f90178bf1829a21f8 https://conda.anaconda.org/conda-forge/linux-64/gflags-2.2.2-h5888daf_1005.conda#d411fc29e338efb48c5fd4576d71d881 https://conda.anaconda.org/conda-forge/linux-64/keyutils-1.6.1-h166bdaf_0.tar.bz2#30186d27e2c9fa62b45fb1476b7200e3 https://conda.anaconda.org/conda-forge/linux-64/libabseil-20240722.0-cxx17_hbbce691_4.conda#488f260ccda0afaf08acb286db439c2f @@ -114,7 +114,7 @@ https://conda.anaconda.org/conda-forge/linux-64/aws-c-http-0.9.2-hefd7a92_4.cond https://conda.anaconda.org/conda-forge/linux-64/brotli-1.1.0-hb9d3cd8_2.conda#98514fe74548d768907ce7a13f680e8f https://conda.anaconda.org/conda-forge/noarch/colorama-0.4.6-pyhd8ed1ab_1.conda#962b9857ee8e7018c22f2776ffa0b2d7 https://conda.anaconda.org/conda-forge/noarch/cpython-3.13.2-py313hd8ed1ab_101.conda#d6be72c63da6e99ac2a1b87b120d135a -https://conda.anaconda.org/conda-forge/linux-64/cudnn-9.8.0.87-hf36481c_0.conda#3424e20886c41f78c7801f6c5e9f6934 +https://conda.anaconda.org/conda-forge/linux-64/cudnn-9.8.0.87-hf36481c_1.conda#988b6d0f8a2660fdee429d3d0f761ed3 https://conda.anaconda.org/conda-forge/noarch/cycler-0.12.1-pyhd8ed1ab_1.conda#44600c4667a319d67dbe0681fc0bc833 https://conda.anaconda.org/conda-forge/linux-64/cyrus-sasl-2.1.27-h54b06d7_7.conda#dce22f70b4e5a407ce88f2be046f4ceb https://conda.anaconda.org/conda-forge/linux-64/cython-3.0.12-py313h5dec8f5_0.conda#24a42a0c1cc33743e33572d63d489b54 @@ -123,17 +123,17 @@ https://conda.anaconda.org/conda-forge/noarch/execnet-2.1.1-pyhd8ed1ab_1.conda#a https://conda.anaconda.org/conda-forge/linux-64/fastrlock-0.8.3-py313h9800cb9_1.conda#54dd71b3be2ed6ccc50f180347c901db https://conda.anaconda.org/conda-forge/noarch/filelock-3.18.0-pyhd8ed1ab_0.conda#4547b39256e296bb758166893e909a7c https://conda.anaconda.org/conda-forge/linux-64/fontconfig-2.15.0-h7e30c49_1.conda#8f5b0b297b59e1ac160ad4beec99dbee -https://conda.anaconda.org/conda-forge/noarch/fsspec-2025.3.1-pyhd8ed1ab_0.conda#2ded25bc46cbae83d08807c89cb84747 +https://conda.anaconda.org/conda-forge/noarch/fsspec-2025.3.2-pyhd8ed1ab_0.conda#9c40692c3d24c7aaf335f673ac09d308 https://conda.anaconda.org/conda-forge/noarch/iniconfig-2.0.0-pyhd8ed1ab_1.conda#6837f3eff7dcea42ecd714ce1ac2b108 https://conda.anaconda.org/conda-forge/linux-64/kiwisolver-1.4.7-py313h33d0bda_0.conda#9862d13a5e466273d5a4738cffcb8d6c https://conda.anaconda.org/conda-forge/linux-64/libblas-3.9.0-31_h59b9bed_openblas.conda#728dbebd0f7a20337218beacffd37916 https://conda.anaconda.org/conda-forge/linux-64/libcups-2.3.3-h4637d8d_4.conda#d4529f4dff3057982a7617c7ac58fde3 -https://conda.anaconda.org/conda-forge/linux-64/libcurl-8.12.1-h332b0f4_0.conda#45e9dc4e7b25e2841deb392be085500e -https://conda.anaconda.org/conda-forge/linux-64/libglib-2.84.0-h2ff4ddf_0.conda#40cdeafb789a5513415f7bdbef053cf5 +https://conda.anaconda.org/conda-forge/linux-64/libcurl-8.13.0-h332b0f4_0.conda#cbdc92ac0d93fe3c796e36ad65c7905c +https://conda.anaconda.org/conda-forge/linux-64/libglib-2.84.1-h2ff4ddf_0.conda#0305434da649d4fb48a425e588b79ea6 https://conda.anaconda.org/conda-forge/linux-64/libglx-1.7.0-ha4b6fd6_2.conda#c8013e438185f33b13814c5c488acd5c https://conda.anaconda.org/conda-forge/linux-64/libhiredis-1.0.2-h2cc385e_0.tar.bz2#b34907d3a81a3cd8095ee83d174c074a https://conda.anaconda.org/conda-forge/linux-64/libtiff-4.7.0-hd9ff511_3.conda#0ea6510969e1296cc19966fad481f6de -https://conda.anaconda.org/conda-forge/linux-64/libxml2-2.13.7-h8d12d68_0.conda#109427e5576d0ce9c42257c2421b1680 +https://conda.anaconda.org/conda-forge/linux-64/libxml2-2.13.7-h4bc477f_1.conda#ad1f1f8238834cd3c88ceeaee8da444a https://conda.anaconda.org/conda-forge/linux-64/markupsafe-3.0.2-py313h8060acc_1.conda#21b62c55924f01b6eef6827167b46acb https://conda.anaconda.org/conda-forge/linux-64/mpfr-4.2.1-h90cbb55_3.conda#2eeb50cab6652538eee8fc0bc3340c81 https://conda.anaconda.org/conda-forge/noarch/mpmath-1.3.0-pyhd8ed1ab_1.conda#3585aa87c43ab15b167b574cd73b057b @@ -148,13 +148,13 @@ https://conda.anaconda.org/conda-forge/noarch/pyparsing-3.2.3-pyhd8ed1ab_1.conda https://conda.anaconda.org/conda-forge/noarch/python-tzdata-2025.2-pyhd8ed1ab_0.conda#88476ae6ebd24f39261e0854ac244f33 https://conda.anaconda.org/conda-forge/noarch/pytz-2024.1-pyhd8ed1ab_0.conda#3eeeeb9e4827ace8c0c1419c85d590ad https://conda.anaconda.org/conda-forge/linux-64/re2-2024.07.02-h9925aae_2.conda#e84ddf12bde691e8ec894b00ea829ddf -https://conda.anaconda.org/conda-forge/noarch/setuptools-75.8.2-pyhff2d567_0.conda#9bddfdbf4e061821a1a443f93223be61 +https://conda.anaconda.org/conda-forge/noarch/setuptools-78.1.0-pyhff2d567_0.conda#a42da9837e46c53494df0044c3eb1f53 https://conda.anaconda.org/conda-forge/noarch/six-1.17.0-pyhd8ed1ab_0.conda#a451d576819089b0d672f18768be0f65 https://conda.anaconda.org/conda-forge/noarch/threadpoolctl-3.6.0-pyhecae5ae_0.conda#9d64911b31d57ca443e9f1e36b04385f https://conda.anaconda.org/conda-forge/noarch/toml-0.10.2-pyhd8ed1ab_1.conda#b0dd904de08b7db706167240bf37b164 https://conda.anaconda.org/conda-forge/noarch/tomli-2.2.1-pyhd8ed1ab_1.conda#ac944244f1fed2eb49bae07193ae8215 https://conda.anaconda.org/conda-forge/linux-64/tornado-6.4.2-py313h536fd9c_0.conda#5f5cbdd527d2e74e270d8b6255ba714f -https://conda.anaconda.org/conda-forge/noarch/typing_extensions-4.13.0-pyh29332c3_1.conda#4c446320a86cc5d48e3b80e332d6ebd7 +https://conda.anaconda.org/conda-forge/noarch/typing_extensions-4.13.1-pyh29332c3_0.conda#5710c79a5fb0a6bfdba0a887f90583b1 https://conda.anaconda.org/conda-forge/linux-64/xcb-util-image-0.4.0-hb711507_2.conda#a0901183f08b6c7107aab109733a3c91 https://conda.anaconda.org/conda-forge/linux-64/xkeyboard-config-2.43-hb9d3cd8_0.conda#f725c7425d6d7c15e31f3b99a88ea02f https://conda.anaconda.org/conda-forge/linux-64/xorg-libxext-1.3.6-hb9d3cd8_0.conda#febbab7d15033c913d53c7a2c102309d @@ -167,7 +167,7 @@ https://conda.anaconda.org/conda-forge/linux-64/cairo-1.18.4-h3394656_0.conda#09 https://conda.anaconda.org/conda-forge/linux-64/ccache-4.11.2-hd714d17_0.conda#35ae7ce74089ab05fdb1cb9746c0fbe4 https://conda.anaconda.org/conda-forge/linux-64/coverage-7.8.0-py313h8060acc_0.conda#375064d30e709bf7c1d4580e70aaea61 https://conda.anaconda.org/conda-forge/linux-64/dbus-1.13.6-h5008d03_3.tar.bz2#ecfff944ba3960ecb334b9a2663d708d -https://conda.anaconda.org/conda-forge/linux-64/fonttools-4.56.0-py313h8060acc_0.conda#2011223fad66419512446914251be2a6 +https://conda.anaconda.org/conda-forge/linux-64/fonttools-4.57.0-py313h8060acc_0.conda#76b3a3367ac578a7cc43f4b7814e7e87 https://conda.anaconda.org/conda-forge/noarch/jinja2-3.1.6-pyhd8ed1ab_0.conda#446bd6c8cb26050d528881df495ce646 https://conda.anaconda.org/conda-forge/noarch/joblib-1.4.2-pyhd8ed1ab_1.conda#bf8243ee348f3a10a14ed0cae323e0c1 https://conda.anaconda.org/conda-forge/linux-64/lcms2-2.17-h717163a_0.conda#000e85703f0fd9594c81710dd5066471 @@ -176,10 +176,10 @@ https://conda.anaconda.org/conda-forge/linux-64/libgl-1.7.0-ha4b6fd6_2.conda#928 https://conda.anaconda.org/conda-forge/linux-64/libgrpc-1.67.1-hc2c308b_0.conda#4606a4647bfe857e3cfe21ca12ac3afb https://conda.anaconda.org/conda-forge/linux-64/libhwloc-2.11.2-default_h0d58e46_1001.conda#804ca9e91bcaea0824a341d55b1684f2 https://conda.anaconda.org/conda-forge/linux-64/liblapack-3.9.0-31_h7ac8fdf_openblas.conda#452b98eafe050ecff932f0ec832dd03f -https://conda.anaconda.org/conda-forge/linux-64/libllvm20-20.1.1-ha7bfdaf_0.conda#2e234fb7d6eeb5c32eb5b256403b5795 +https://conda.anaconda.org/conda-forge/linux-64/libllvm20-20.1.2-ha7bfdaf_0.conda#8354769527f9f441a3a04aa1c19188d9 https://conda.anaconda.org/conda-forge/linux-64/libxkbcommon-1.8.1-hc4a0caf_0.conda#e7e5b0652227d646b44abdcbd989da7b https://conda.anaconda.org/conda-forge/linux-64/libxslt-1.1.39-h76b75d6_0.conda#e71f31f8cfb0a91439f2086fc8aa0461 -https://conda.anaconda.org/conda-forge/noarch/meson-1.7.0-pyhd8ed1ab_0.conda#6d4bbcce47061d2f9f2636409a8fe7c0 +https://conda.anaconda.org/conda-forge/noarch/meson-1.7.1-pyhd8ed1ab_0.conda#90018ee73b8741268027421ceac2809a https://conda.anaconda.org/conda-forge/linux-64/mpc-1.3.1-h24ddda3_1.conda#aa14b9a5196a6d8dd364164b7ce56acf https://conda.anaconda.org/conda-forge/linux-64/openjpeg-2.5.3-h5fbd93e_0.conda#9e5816bc95d285c115a3ebc2f8563564 https://conda.anaconda.org/conda-forge/linux-64/openldap-2.6.9-he970967_0.conda#ca2de8bbdc871bce41dbf59e51324165 @@ -198,16 +198,16 @@ https://conda.anaconda.org/conda-forge/linux-64/azure-identity-cpp-1.10.0-h113e6 https://conda.anaconda.org/conda-forge/linux-64/azure-storage-common-cpp-12.8.0-h736e048_1.conda#13de36be8de3ae3f05ba127631599213 https://conda.anaconda.org/conda-forge/linux-64/gmpy2-2.1.5-py313h11186cd_3.conda#846a773cdc154eda7b86d7f4427432f2 https://conda.anaconda.org/conda-forge/linux-64/harfbuzz-11.0.0-h76408a6_0.conda#347cb348bfc8d77062daee11c326e518 -https://conda.anaconda.org/conda-forge/linux-64/libclang-cpp20.1-20.1.1-default_hb5137d0_0.conda#331dee424fabc0c26331767acc93a074 -https://conda.anaconda.org/conda-forge/linux-64/libclang13-20.1.1-default_h9c6a7e4_0.conda#f8b1b8c13c0a0fede5e1a204eafb48f8 +https://conda.anaconda.org/conda-forge/linux-64/libclang-cpp20.1-20.1.2-default_hb5137d0_0.conda#729198eae19e9dbf8e0ffe355d416bde +https://conda.anaconda.org/conda-forge/linux-64/libclang13-20.1.2-default_h9c6a7e4_0.conda#c5fe177150aecc6ec46609b0a6123f39 https://conda.anaconda.org/conda-forge/linux-64/libgoogle-cloud-2.32.0-h804f50b_0.conda#3d96df4d6b1c88455e05b94ce8a14a53 https://conda.anaconda.org/conda-forge/linux-64/liblapacke-3.9.0-31_he2f377e_openblas.conda#7e5fff7d0db69be3a266f7e79a3bb0e2 https://conda.anaconda.org/conda-forge/linux-64/libmagma-2.8.0-h9ddd185_2.conda#8de40c4f75d36bb00a5870f682457f1d -https://conda.anaconda.org/conda-forge/linux-64/libpq-17.4-h27ae623_0.conda#d67f3f3c33344ff3e9ef5270001e9011 +https://conda.anaconda.org/conda-forge/linux-64/libpq-17.4-h27ae623_1.conda#37fba334855ef3b51549308e61ed7a3d https://conda.anaconda.org/conda-forge/noarch/meson-python-0.17.1-pyh70fd9c4_1.conda#7a02679229c6c2092571b4c025055440 https://conda.anaconda.org/conda-forge/linux-64/numpy-2.2.4-py313h17eae1a_0.conda#6c905a8f170edd64f3a390c76572e331 https://conda.anaconda.org/conda-forge/linux-64/pillow-11.1.0-py313h8db990d_0.conda#1e86810c6c3fb6d6aebdba26564eb2e8 -https://conda.anaconda.org/conda-forge/noarch/pytest-cov-6.0.0-pyhd8ed1ab_1.conda#79963c319d1be62c8fd3e34555816e01 +https://conda.anaconda.org/conda-forge/noarch/pytest-cov-6.1.1-pyhd8ed1ab_0.conda#1e35d8f975bc0e984a19819aa91c440a https://conda.anaconda.org/conda-forge/noarch/pytest-xdist-3.6.1-pyhd8ed1ab_1.conda#59aad4fb37cabc0bacc73cf344612ddd https://conda.anaconda.org/conda-forge/linux-64/tbb-2021.13.0-hceb3a55_1.conda#ba7726b8df7b9d34ea80e82b097a4893 https://conda.anaconda.org/conda-forge/linux-64/xorg-libxtst-1.2.5-hb9d3cd8_3.conda#7bbe9a0cc0df0ac5f5a8ad6d6a11af2f @@ -222,7 +222,7 @@ https://conda.anaconda.org/conda-forge/linux-64/libmagma_sparse-2.8.0-h9ddd185_0 https://conda.anaconda.org/conda-forge/linux-64/mkl-2024.2.2-ha957f24_16.conda#1459379c79dda834673426504d52b319 https://conda.anaconda.org/conda-forge/linux-64/pandas-2.2.3-py313ha87cce1_1.conda#c5d63dd501db554b84a30dea33824164 https://conda.anaconda.org/conda-forge/linux-64/polars-1.26.0-py313hae41bca_0.conda#14817d4747f3996cdf8efbba164c65b9 -https://conda.anaconda.org/conda-forge/linux-64/qt6-main-6.8.3-h6441bc3_1.conda#db96ef4241de437be7b41082045ef7d2 +https://conda.anaconda.org/conda-forge/linux-64/qt6-main-6.9.0-h6441bc3_0.conda#d3df16592e15a3f833cfc4d19ae58677 https://conda.anaconda.org/conda-forge/linux-64/scipy-1.15.2-py313h86fcf2b_0.conda#ca68acd9febc86448eeed68d0c6c8643 https://conda.anaconda.org/conda-forge/noarch/sympy-1.13.3-pyh2585a3b_105.conda#254cd5083ffa04d96e3173397a3d30f4 https://conda.anaconda.org/conda-forge/linux-64/aws-sdk-cpp-1.11.458-hc430e4a_4.conda#aeefac461bea1f126653c1285cf5af08 @@ -232,7 +232,7 @@ https://conda.anaconda.org/conda-forge/linux-64/cupy-13.4.1-py313h66a2ee2_0.cond https://conda.anaconda.org/conda-forge/linux-64/libtorch-2.5.1-cuda118_hb34f2e8_303.conda#da799bf557ff6376a1a58f40bddfb293 https://conda.anaconda.org/conda-forge/linux-64/matplotlib-base-3.10.1-py313h129903b_0.conda#4e23b3fabf434b418e0d9c6975a6453f https://conda.anaconda.org/conda-forge/linux-64/pyamg-5.2.1-py313hf0ab243_1.conda#4c769bf3858f424cb2ecf952175ec600 -https://conda.anaconda.org/conda-forge/linux-64/pyside6-6.8.3-py313h5f61773_0.conda#920bd63af614ba2bf6f5dd7d6922d5b7 +https://conda.anaconda.org/conda-forge/linux-64/pyside6-6.9.0-py313h5f61773_0.conda#f51f25ec8fcbf777f8b186bb5deeed40 https://conda.anaconda.org/conda-forge/linux-64/libarrow-18.1.0-h44a453e_6_cpu.conda#2cf6d608d6e66506f69797d5c6944c35 https://conda.anaconda.org/conda-forge/linux-64/matplotlib-3.10.1-py313h78bf25f_0.conda#d0c80dea550ca97fc0710b2ecef919ba https://conda.anaconda.org/conda-forge/linux-64/pytorch-2.5.1-cuda118_py313h40cdc2d_303.conda#19ad990954a4ed89358d91d0a3e7016d From d3f9701ba9f61c297c8dc25c092568160eaf92b1 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?J=C3=A9r=C3=A9mie=20du=20Boisberranger?= Date: Wed, 9 Apr 2025 13:58:50 +0200 Subject: [PATCH 024/182] MNT Clean-up deprecations for 1.7: TSNE's n_iter (#31140) --- sklearn/manifold/_t_sne.py | 47 +++------------------------- sklearn/manifold/tests/test_t_sne.py | 22 ------------- 2 files changed, 5 insertions(+), 64 deletions(-) diff --git a/sklearn/manifold/_t_sne.py b/sklearn/manifold/_t_sne.py index 1bc29fb068da7..5944749d6df6f 100644 --- a/sklearn/manifold/_t_sne.py +++ b/sklearn/manifold/_t_sne.py @@ -6,7 +6,6 @@ # * Fast Optimization for t-SNE: # https://cseweb.ucsd.edu/~lvdmaaten/workshops/nips2010/papers/vandermaaten.pdf -import warnings from numbers import Integral, Real from time import time @@ -26,7 +25,7 @@ from ..neighbors import NearestNeighbors from ..utils import check_random_state from ..utils._openmp_helpers import _openmp_effective_n_threads -from ..utils._param_validation import Hidden, Interval, StrOptions, validate_params +from ..utils._param_validation import Interval, StrOptions, validate_params from ..utils.validation import _num_samples, check_non_negative, validate_data # mypy error: Module 'sklearn.manifold' has no attribute '_utils' @@ -702,14 +701,6 @@ class TSNE(ClassNamePrefixFeaturesOutMixin, TransformerMixin, BaseEstimator): .. versionadded:: 0.22 - n_iter : int - Maximum number of iterations for the optimization. Should be at - least 250. - - .. deprecated:: 1.5 - `n_iter` was deprecated in version 1.5 and will be removed in 1.7. - Please use `max_iter` instead. - Attributes ---------- embedding_ : array-like of shape (n_samples, n_components) @@ -794,7 +785,7 @@ class TSNE(ClassNamePrefixFeaturesOutMixin, TransformerMixin, BaseEstimator): StrOptions({"auto"}), Interval(Real, 0, None, closed="neither"), ], - "max_iter": [Interval(Integral, 250, None, closed="left"), None], + "max_iter": [Interval(Integral, 250, None, closed="left")], "n_iter_without_progress": [Interval(Integral, -1, None, closed="left")], "min_grad_norm": [Interval(Real, 0, None, closed="left")], "metric": [StrOptions(set(_VALID_METRICS) | {"precomputed"}), callable], @@ -808,10 +799,6 @@ class TSNE(ClassNamePrefixFeaturesOutMixin, TransformerMixin, BaseEstimator): "method": [StrOptions({"barnes_hut", "exact"})], "angle": [Interval(Real, 0, 1, closed="both")], "n_jobs": [None, Integral], - "n_iter": [ - Interval(Integral, 250, None, closed="left"), - Hidden(StrOptions({"deprecated"})), - ], } # Control the number of exploration iterations with early_exaggeration on @@ -827,7 +814,7 @@ def __init__( perplexity=30.0, early_exaggeration=12.0, learning_rate="auto", - max_iter=None, # TODO(1.7): set to 1000 + max_iter=1000, n_iter_without_progress=300, min_grad_norm=1e-7, metric="euclidean", @@ -838,7 +825,6 @@ def __init__( method="barnes_hut", angle=0.5, n_jobs=None, - n_iter="deprecated", ): self.n_components = n_components self.perplexity = perplexity @@ -855,7 +841,6 @@ def __init__( self.method = method self.angle = angle self.n_jobs = n_jobs - self.n_iter = n_iter def _check_params_vs_input(self, X): if self.perplexity >= X.shape[0]: @@ -1108,9 +1093,9 @@ def _tsne( # Learning schedule (part 2): disable early exaggeration and finish # optimization with a higher momentum at 0.8 P /= self.early_exaggeration - remaining = self._max_iter - self._EXPLORATION_MAX_ITER + remaining = self.max_iter - self._EXPLORATION_MAX_ITER if it < self._EXPLORATION_MAX_ITER or remaining > 0: - opt_args["max_iter"] = self._max_iter + opt_args["max_iter"] = self.max_iter opt_args["it"] = it + 1 opt_args["momentum"] = 0.8 opt_args["n_iter_without_progress"] = self.n_iter_without_progress @@ -1155,28 +1140,6 @@ def fit_transform(self, X, y=None): X_new : ndarray of shape (n_samples, n_components) Embedding of the training data in low-dimensional space. """ - # TODO(1.7): remove - # Also make sure to change `max_iter` default back to 1000 and deprecate None - if self.n_iter != "deprecated": - if self.max_iter is not None: - raise ValueError( - "Both 'n_iter' and 'max_iter' attributes were set. Attribute" - " 'n_iter' was deprecated in version 1.5 and will be removed in" - " 1.7. To avoid this error, only set the 'max_iter' attribute." - ) - warnings.warn( - ( - "'n_iter' was renamed to 'max_iter' in version 1.5 and " - "will be removed in 1.7." - ), - FutureWarning, - ) - self._max_iter = self.n_iter - elif self.max_iter is None: - self._max_iter = 1000 - else: - self._max_iter = self.max_iter - self._check_params_vs_input(X) embedding = self._fit(X) self.embedding_ = embedding diff --git a/sklearn/manifold/tests/test_t_sne.py b/sklearn/manifold/tests/test_t_sne.py index 8e20bdf86769a..d54c845108ae6 100644 --- a/sklearn/manifold/tests/test_t_sne.py +++ b/sklearn/manifold/tests/test_t_sne.py @@ -1185,25 +1185,3 @@ def test_tsne_works_with_pandas_output(): with config_context(transform_output="pandas"): arr = np.arange(35 * 4).reshape(35, 4) TSNE(n_components=2).fit_transform(arr) - - -# TODO(1.7): remove -def test_tnse_n_iter_deprecated(): - """Check `n_iter` parameter deprecated.""" - random_state = check_random_state(0) - X = random_state.randn(40, 100) - tsne = TSNE(n_iter=250) - msg = "'n_iter' was renamed to 'max_iter'" - with pytest.warns(FutureWarning, match=msg): - tsne.fit_transform(X) - - -# TODO(1.7): remove -def test_tnse_n_iter_max_iter_both_set(): - """Check error raised when `n_iter` and `max_iter` both set.""" - random_state = check_random_state(0) - X = random_state.randn(40, 100) - tsne = TSNE(n_iter=250, max_iter=500) - msg = "Both 'n_iter' and 'max_iter' attributes were set" - with pytest.raises(ValueError, match=msg): - tsne.fit_transform(X) From 6fce50f75b5fc9cf3ba8afbb85aeac8cc42f8802 Mon Sep 17 00:00:00 2001 From: Lucy Liu Date: Wed, 9 Apr 2025 23:17:44 +1000 Subject: [PATCH 025/182] DOC Remove old comment in `cosine_similarity` (#31163) --- sklearn/metrics/pairwise.py | 2 -- 1 file changed, 2 deletions(-) diff --git a/sklearn/metrics/pairwise.py b/sklearn/metrics/pairwise.py index cec24a1e8924b..3fe3db110238e 100644 --- a/sklearn/metrics/pairwise.py +++ b/sklearn/metrics/pairwise.py @@ -1733,8 +1733,6 @@ def cosine_similarity(X, Y=None, dense_output=True): array([[0. , 0. ], [0.57..., 0.81...]]) """ - # to avoid recursive import - X, Y = check_pairwise_arrays(X, Y) X_normalized = normalize(X, copy=True) From 16f7d5aebee6e6768ea4e67a663bc170032f351e Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Lo=C3=AFc=20Est=C3=A8ve?= Date: Wed, 9 Apr 2025 15:21:09 +0200 Subject: [PATCH 026/182] CI Work around the lack of Windows free-threaded wheel for pandas (#31159) --- .github/workflows/wheels.yml | 1 - build_tools/github/build_minimal_windows_image.sh | 10 ++++------ build_tools/wheels/cibw_before_test.sh | 13 ------------- 3 files changed, 4 insertions(+), 20 deletions(-) delete mode 100755 build_tools/wheels/cibw_before_test.sh diff --git a/.github/workflows/wheels.yml b/.github/workflows/wheels.yml index cbcd9841aa542..33e8897c147f7 100644 --- a/.github/workflows/wheels.yml +++ b/.github/workflows/wheels.yml @@ -182,7 +182,6 @@ jobs: CIBW_REPAIR_WHEEL_COMMAND_WINDOWS: bash build_tools/github/repair_windows_wheels.sh {wheel} {dest_dir} CIBW_BEFORE_BUILD: bash {project}/build_tools/wheels/cibw_before_build.sh {project} CIBW_BEFORE_TEST_WINDOWS: bash build_tools/github/build_minimal_windows_image.sh ${{ matrix.python }} - CIBW_BEFORE_TEST: bash {project}/build_tools/wheels/cibw_before_test.sh CIBW_ENVIRONMENT_PASS_LINUX: RUNNER_OS CIBW_TEST_REQUIRES: pytest pandas # On Windows, we use a custom Docker image and CIBW_TEST_REQUIRES_WINDOWS diff --git a/build_tools/github/build_minimal_windows_image.sh b/build_tools/github/build_minimal_windows_image.sh index b1efb1333f94a..8cc9af937dfd9 100755 --- a/build_tools/github/build_minimal_windows_image.sh +++ b/build_tools/github/build_minimal_windows_image.sh @@ -44,10 +44,8 @@ if [[ $FREE_THREADED_BUILD == "False" ]]; then docker commit $CONTAINER_ID scikit-learn/minimal-windows else # This is too cumbersome to use a Docker image in the free-threaded case - # TODO Remove the next three lines when scipy and pandas each have a release - # with a Windows free-threaded wheel. - python -m pip install numpy - dev_anaconda_url=https://pypi.anaconda.org/scientific-python-nightly-wheels/simple - python -m pip install --pre --upgrade --timeout=60 --extra-index $dev_anaconda_url scipy pandas --only-binary :all: - python -m pip install $CIBW_TEST_REQUIRES + # TODO When pandas has a release with a Windows free-threaded wheel we can + # replace the next line with + # python -m pip install CIBW_TEST_REQUIRES + python -m pip install pytest fi diff --git a/build_tools/wheels/cibw_before_test.sh b/build_tools/wheels/cibw_before_test.sh deleted file mode 100755 index 29bfcd41a8bb3..0000000000000 --- a/build_tools/wheels/cibw_before_test.sh +++ /dev/null @@ -1,13 +0,0 @@ -#!/bin/bash - -set -e -set -x - -FREE_THREADED_BUILD="$(python -c"import sysconfig; print(bool(sysconfig.get_config_var('Py_GIL_DISABLED')))")" -PY_VERSION=$(python -c 'import sys; print(f"{sys.version_info.major}{sys.version_info.minor}")') - -# TODO: remove when scipy has a release with free-threaded wheels -if [[ $FREE_THREADED_BUILD == "True" ]]; then - python -m pip install numpy pandas - python -m pip install --pre --extra-index https://pypi.anaconda.org/scientific-python-nightly-wheels/simple scipy --only-binary :all: -fi From 16effb9da664fbadcdbfc28ad0c1e6beb7317c32 Mon Sep 17 00:00:00 2001 From: Rishab Saini <90474550+Rishab260@users.noreply.github.com> Date: Thu, 10 Apr 2025 16:13:56 +0530 Subject: [PATCH 027/182] TST use global_random_seed in sklearn/utils/tests/test_stats.py (#30857) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Co-authored-by: Jérémie du Boisberranger --- sklearn/utils/tests/test_stats.py | 38 +++++++++++++++---------------- 1 file changed, 19 insertions(+), 19 deletions(-) diff --git a/sklearn/utils/tests/test_stats.py b/sklearn/utils/tests/test_stats.py index ec60a1358e440..1c979425f12f8 100644 --- a/sklearn/utils/tests/test_stats.py +++ b/sklearn/utils/tests/test_stats.py @@ -24,8 +24,8 @@ def test_averaged_weighted_median(): assert score == np.median(y) -def test_averaged_weighted_percentile(): - rng = np.random.RandomState(0) +def test_averaged_weighted_percentile(global_random_seed): + rng = np.random.RandomState(global_random_seed) y = rng.randint(20, size=10) sw = np.ones(10) @@ -96,7 +96,7 @@ def test_weighted_percentile_zero_weight_zero_percentile(): assert approx(value) == 4 -def test_weighted_median_equal_weights(): +def test_weighted_median_equal_weights(global_random_seed): """Checks `_weighted_percentile(percentile_rank=50)` is the same as `np.median`. `sample_weights` are all 1s and the number of samples is odd. @@ -106,7 +106,7 @@ def test_weighted_median_equal_weights(): For an even number of samples, this check will not always hold as (note that for some other percentile methods it will always hold). See #17370 for details. """ - rng = np.random.RandomState(0) + rng = np.random.RandomState(global_random_seed) x = rng.randint(10, size=11) weights = np.ones(x.shape) median = np.median(x) @@ -114,21 +114,21 @@ def test_weighted_median_equal_weights(): assert median == approx(w_median) -def test_weighted_median_integer_weights(): - # Checks weighted percentile_rank=0.5 is same as median when manually weight +def test_weighted_median_integer_weights(global_random_seed): + # Checks average weighted percentile_rank=0.5 is same as median when manually weight # data - rng = np.random.RandomState(0) + rng = np.random.RandomState(global_random_seed) x = rng.randint(20, size=10) weights = rng.choice(5, size=10) x_manual = np.repeat(x, weights) median = np.median(x_manual) - w_median = _weighted_percentile(x, weights) + w_median = _averaged_weighted_percentile(x, weights) assert median == approx(w_median) -def test_weighted_percentile_2d(): +def test_weighted_percentile_2d(global_random_seed): # Check for when array 2D and sample_weight 1D - rng = np.random.RandomState(0) + rng = np.random.RandomState(global_random_seed) x1 = rng.randint(10, size=10) w1 = rng.choice(5, size=10) @@ -235,21 +235,21 @@ def test_weighted_percentile_array_api_consistency( @pytest.mark.parametrize("sample_weight_ndim", [1, 2]) -def test_weighted_percentile_nan_filtered(sample_weight_ndim): +def test_weighted_percentile_nan_filtered(sample_weight_ndim, global_random_seed): """Test that calling _weighted_percentile on an array with nan values returns the same results as calling _weighted_percentile on a filtered version of the data. We test both with sample_weight of the same shape as the data and with one-dimensional sample_weight.""" - rng = np.random.RandomState(42) - array_with_nans = rng.rand(10, 100) + rng = np.random.RandomState(global_random_seed) + array_with_nans = rng.rand(100, 10) array_with_nans[rng.rand(*array_with_nans.shape) < 0.5] = np.nan nan_mask = np.isnan(array_with_nans) if sample_weight_ndim == 2: - sample_weight = rng.randint(1, 6, size=(10, 100)) + sample_weight = rng.randint(1, 6, size=(100, 10)) else: - sample_weight = rng.randint(1, 6, size=(10,)) + sample_weight = rng.randint(1, 6, size=(100,)) # Find the weighted percentile on the array with nans: results = _weighted_percentile(array_with_nans, sample_weight, 30) @@ -306,11 +306,11 @@ def test_weighted_percentile_all_nan_column(): reason="np.quantile only accepts weights since version 2.0", ) @pytest.mark.parametrize("percentile", [66, 10, 50]) -def test_weighted_percentile_like_numpy_quantile(percentile): +def test_weighted_percentile_like_numpy_quantile(percentile, global_random_seed): """Check that _weighted_percentile delivers equivalent results as np.quantile with weights.""" - rng = np.random.RandomState(42) + rng = np.random.RandomState(global_random_seed) array = rng.rand(10, 100) sample_weight = rng.randint(1, 6, size=(10, 100)) @@ -329,11 +329,11 @@ def test_weighted_percentile_like_numpy_quantile(percentile): reason="np.nanquantile only accepts weights since version 2.0", ) @pytest.mark.parametrize("percentile", [66, 10, 50]) -def test_weighted_percentile_like_numpy_nanquantile(percentile): +def test_weighted_percentile_like_numpy_nanquantile(percentile, global_random_seed): """Check that _weighted_percentile delivers equivalent results as np.nanquantile with weights.""" - rng = np.random.RandomState(42) + rng = np.random.RandomState(global_random_seed) array_with_nans = rng.rand(10, 100) array_with_nans[rng.rand(*array_with_nans.shape) < 0.5] = np.nan sample_weight = rng.randint(1, 6, size=(10, 100)) From 8e97791dac113b1a2b830889d59583bdc224c175 Mon Sep 17 00:00:00 2001 From: Maren Westermann Date: Thu, 10 Apr 2025 16:48:36 +0200 Subject: [PATCH 028/182] TST use global_random_seed in sklearn/utils/tests/test_optimize.py (#30112) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Co-authored-by: sply88 Co-authored-by: sply88 <43181038+sply88@users.noreply.github.com> Co-authored-by: Jérémie du Boisberranger --- sklearn/utils/tests/test_optimize.py | 14 +++++++++----- 1 file changed, 9 insertions(+), 5 deletions(-) diff --git a/sklearn/utils/tests/test_optimize.py b/sklearn/utils/tests/test_optimize.py index 5975fe4f9c191..775da5791b9a6 100644 --- a/sklearn/utils/tests/test_optimize.py +++ b/sklearn/utils/tests/test_optimize.py @@ -3,14 +3,14 @@ from scipy.optimize import fmin_ncg from sklearn.exceptions import ConvergenceWarning -from sklearn.utils._testing import assert_array_almost_equal +from sklearn.utils._testing import assert_allclose from sklearn.utils.optimize import _newton_cg -def test_newton_cg(): +def test_newton_cg(global_random_seed): # Test that newton_cg gives same result as scipy's fmin_ncg - rng = np.random.RandomState(0) + rng = np.random.RandomState(global_random_seed) A = rng.normal(size=(10, 10)) x0 = np.ones(10) @@ -27,9 +27,13 @@ def hess(x, p): def grad_hess(x): return grad(x), lambda x: A.T.dot(A.dot(x)) - assert_array_almost_equal( - _newton_cg(grad_hess, func, grad, x0, tol=1e-10)[0], + # func is a definite positive quadratic form, so the minimum is at x = 0 + # hence the use of absolute tolerance. + assert np.all(np.abs(_newton_cg(grad_hess, func, grad, x0, tol=1e-10)[0]) <= 1e-7) + assert_allclose( + _newton_cg(grad_hess, func, grad, x0, tol=1e-7)[0], fmin_ncg(f=func, x0=x0, fprime=grad, fhess_p=hess), + atol=1e-5, ) From 65a3e64965ca60daa3f86f2d041a91605f8115d3 Mon Sep 17 00:00:00 2001 From: Irene Date: Thu, 10 Apr 2025 14:06:07 -0600 Subject: [PATCH 029/182] TST use global_random_seed in sklearn/cluster/tests/test_spectral.py (#24802) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Co-authored-by: Jérémie du Boisberranger --- sklearn/cluster/tests/test_spectral.py | 65 ++++++++++++++++---------- 1 file changed, 41 insertions(+), 24 deletions(-) diff --git a/sklearn/cluster/tests/test_spectral.py b/sklearn/cluster/tests/test_spectral.py index a1975902c0c47..68860e789666d 100644 --- a/sklearn/cluster/tests/test_spectral.py +++ b/sklearn/cluster/tests/test_spectral.py @@ -39,7 +39,9 @@ @pytest.mark.parametrize("csr_container", CSR_CONTAINERS) @pytest.mark.parametrize("eigen_solver", ("arpack", "lobpcg")) @pytest.mark.parametrize("assign_labels", ("kmeans", "discretize", "cluster_qr")) -def test_spectral_clustering(eigen_solver, assign_labels, csr_container): +def test_spectral_clustering( + eigen_solver, assign_labels, csr_container, global_random_seed +): S = np.array( [ [1.0, 1.0, 1.0, 0.2, 0.0, 0.0, 0.0], @@ -54,7 +56,7 @@ def test_spectral_clustering(eigen_solver, assign_labels, csr_container): for mat in (S, csr_container(S)): model = SpectralClustering( - random_state=0, + random_state=global_random_seed, n_clusters=2, affinity="precomputed", eigen_solver=eigen_solver, @@ -74,9 +76,12 @@ def test_spectral_clustering(eigen_solver, assign_labels, csr_container): @pytest.mark.parametrize("coo_container", COO_CONTAINERS) @pytest.mark.parametrize("assign_labels", ("kmeans", "discretize", "cluster_qr")) -def test_spectral_clustering_sparse(assign_labels, coo_container): +def test_spectral_clustering_sparse(assign_labels, coo_container, global_random_seed): X, y = make_blobs( - n_samples=20, random_state=0, centers=[[1, 1], [-1, -1]], cluster_std=0.01 + n_samples=20, + random_state=global_random_seed, + centers=[[1, 1], [-1, -1]], + cluster_std=0.01, ) S = rbf_kernel(X, gamma=1) @@ -85,7 +90,7 @@ def test_spectral_clustering_sparse(assign_labels, coo_container): labels = ( SpectralClustering( - random_state=0, + random_state=global_random_seed, n_clusters=2, affinity="precomputed", assign_labels=assign_labels, @@ -96,10 +101,13 @@ def test_spectral_clustering_sparse(assign_labels, coo_container): assert adjusted_rand_score(y, labels) == 1 -def test_precomputed_nearest_neighbors_filtering(): +def test_precomputed_nearest_neighbors_filtering(global_random_seed): # Test precomputed graph filtering when containing too many neighbors X, y = make_blobs( - n_samples=200, random_state=0, centers=[[1, 1], [-1, -1]], cluster_std=0.01 + n_samples=250, + random_state=global_random_seed, + centers=[[1, 1], [-1, -1]], + cluster_std=0.01, ) n_neighbors = 2 @@ -109,7 +117,7 @@ def test_precomputed_nearest_neighbors_filtering(): graph = nn.kneighbors_graph(X, mode="connectivity") labels = ( SpectralClustering( - random_state=0, + random_state=global_random_seed, n_clusters=2, affinity="precomputed_nearest_neighbors", n_neighbors=n_neighbors, @@ -122,7 +130,7 @@ def test_precomputed_nearest_neighbors_filtering(): assert_array_equal(results[0], results[1]) -def test_affinities(): +def test_affinities(global_random_seed): # Note: in the following, random_state has been selected to have # a dataset that yields a stable eigen decomposition both when built # on OSX and Linux @@ -135,7 +143,7 @@ def test_affinities(): sp.fit(X) assert adjusted_rand_score(y, sp.labels_) == 1 - sp = SpectralClustering(n_clusters=2, gamma=2, random_state=0) + sp = SpectralClustering(n_clusters=2, gamma=2, random_state=global_random_seed) labels = sp.fit(X).labels_ assert adjusted_rand_score(y, labels) == 1 @@ -164,12 +172,12 @@ def histogram(x, y, **kwargs): assert (X.shape[0],) == labels.shape -def test_cluster_qr(): +def test_cluster_qr(global_random_seed): # cluster_qr by itself should not be used for clustering generic data # other than the rows of the eigenvectors within spectral clustering, # but cluster_qr must still preserve the labels for different dtypes # of the generic fixed input even if the labels may be meaningless. - random_state = np.random.RandomState(seed=8) + random_state = np.random.RandomState(seed=global_random_seed) n_samples, n_components = 10, 5 data = random_state.randn(n_samples, n_components) labels_float64 = cluster_qr(data.astype(np.float64)) @@ -182,9 +190,9 @@ def test_cluster_qr(): assert np.array_equal(labels_float64, labels_float32) -def test_cluster_qr_permutation_invariance(): +def test_cluster_qr_permutation_invariance(global_random_seed): # cluster_qr must be invariant to sample permutation. - random_state = np.random.RandomState(seed=8) + random_state = np.random.RandomState(seed=global_random_seed) n_samples, n_components = 100, 5 data = random_state.randn(n_samples, n_components) perm = random_state.permutation(n_samples) @@ -196,9 +204,9 @@ def test_cluster_qr_permutation_invariance(): @pytest.mark.parametrize("coo_container", COO_CONTAINERS) @pytest.mark.parametrize("n_samples", [50, 100, 150, 500]) -def test_discretize(n_samples, coo_container): +def test_discretize(n_samples, coo_container, global_random_seed): # Test the discretize using a noise assignment matrix - random_state = np.random.RandomState(seed=8) + random_state = np.random.RandomState(seed=global_random_seed) for n_class in range(2, 10): # random class labels y_true = random_state.randint(0, n_class + 1, n_samples) @@ -215,7 +223,7 @@ def test_discretize(n_samples, coo_container): assert adjusted_rand_score(y_true, y_pred) > 0.8 -def test_spectral_clustering_with_arpack_amg_solvers(): +def test_spectral_clustering_with_arpack_amg_solvers(global_random_seed): # Test that spectral_clustering is the same for arpack and amg solver # Based on toy example from plot_segmentation_toy.py @@ -236,14 +244,14 @@ def test_spectral_clustering_with_arpack_amg_solvers(): graph.data = np.exp(-graph.data / graph.data.std()) labels_arpack = spectral_clustering( - graph, n_clusters=2, eigen_solver="arpack", random_state=0 + graph, n_clusters=2, eigen_solver="arpack", random_state=global_random_seed ) assert len(np.unique(labels_arpack)) == 2 if amg_loaded: labels_amg = spectral_clustering( - graph, n_clusters=2, eigen_solver="amg", random_state=0 + graph, n_clusters=2, eigen_solver="amg", random_state=global_random_seed ) assert adjusted_rand_score(labels_arpack, labels_amg) == 1 else: @@ -251,17 +259,24 @@ def test_spectral_clustering_with_arpack_amg_solvers(): spectral_clustering(graph, n_clusters=2, eigen_solver="amg", random_state=0) -def test_n_components(): +def test_n_components(global_random_seed): # Test that after adding n_components, result is different and # n_components = n_clusters by default X, y = make_blobs( - n_samples=20, random_state=0, centers=[[1, 1], [-1, -1]], cluster_std=0.01 + n_samples=20, + random_state=global_random_seed, + centers=[[1, 1], [-1, -1]], + cluster_std=0.01, ) - sp = SpectralClustering(n_clusters=2, random_state=0) + sp = SpectralClustering(n_clusters=2, random_state=global_random_seed) labels = sp.fit(X).labels_ # set n_components = n_cluster and test if result is the same labels_same_ncomp = ( - SpectralClustering(n_clusters=2, n_components=2, random_state=0).fit(X).labels_ + SpectralClustering( + n_clusters=2, n_components=2, random_state=global_random_seed + ) + .fit(X) + .labels_ ) # test that n_components=n_clusters by default assert_array_equal(labels, labels_same_ncomp) @@ -269,7 +284,9 @@ def test_n_components(): # test that n_components affect result # n_clusters=8 by default, and set n_components=2 labels_diff_ncomp = ( - SpectralClustering(n_components=2, random_state=0).fit(X).labels_ + SpectralClustering(n_components=2, random_state=global_random_seed) + .fit(X) + .labels_ ) assert not np.array_equal(labels, labels_diff_ncomp) From 31cbde32872d864a41f821ce9720fd2944e579aa Mon Sep 17 00:00:00 2001 From: Sortofamudkip <29839553+sortofamudkip@users.noreply.github.com> Date: Fri, 11 Apr 2025 14:22:14 +0200 Subject: [PATCH 030/182] TST use global_random_seed in sklearn/metrics/tests/test_regression.py (#30865) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Co-authored-by: Jérémie du Boisberranger --- sklearn/metrics/tests/test_regression.py | 40 ++++++++++++++---------- 1 file changed, 23 insertions(+), 17 deletions(-) diff --git a/sklearn/metrics/tests/test_regression.py b/sklearn/metrics/tests/test_regression.py index ea8412d53c247..5e90727583189 100644 --- a/sklearn/metrics/tests/test_regression.py +++ b/sklearn/metrics/tests/test_regression.py @@ -494,42 +494,44 @@ def test_regression_single_sample(metric): assert np.isnan(score) -def test_tweedie_deviance_continuity(): +def test_tweedie_deviance_continuity(global_random_seed): n_samples = 100 - y_true = np.random.RandomState(0).rand(n_samples) + 0.1 - y_pred = np.random.RandomState(1).rand(n_samples) + 0.1 + rng = np.random.RandomState(global_random_seed) + + y_true = rng.rand(n_samples) + 0.1 + y_pred = rng.rand(n_samples) + 0.1 assert_allclose( mean_tweedie_deviance(y_true, y_pred, power=0 - 1e-10), mean_tweedie_deviance(y_true, y_pred, power=0), ) - # Ws we get closer to the limit, with 1e-12 difference the absolute + # Ws we get closer to the limit, with 1e-12 difference the # tolerance to pass the below check increases. There are likely # numerical precision issues on the edges of different definition # regions. assert_allclose( mean_tweedie_deviance(y_true, y_pred, power=1 + 1e-10), mean_tweedie_deviance(y_true, y_pred, power=1), - atol=1e-6, + rtol=1e-5, ) assert_allclose( mean_tweedie_deviance(y_true, y_pred, power=2 - 1e-10), mean_tweedie_deviance(y_true, y_pred, power=2), - atol=1e-6, + rtol=1e-5, ) assert_allclose( mean_tweedie_deviance(y_true, y_pred, power=2 + 1e-10), mean_tweedie_deviance(y_true, y_pred, power=2), - atol=1e-6, + rtol=1e-5, ) -def test_mean_absolute_percentage_error(): - random_number_generator = np.random.RandomState(42) +def test_mean_absolute_percentage_error(global_random_seed): + random_number_generator = np.random.RandomState(global_random_seed) y_true = random_number_generator.exponential(size=100) y_pred = 1.2 * y_true assert mean_absolute_percentage_error(y_true, y_pred) == pytest.approx(0.2) @@ -539,7 +541,9 @@ def test_mean_absolute_percentage_error(): "distribution", ["normal", "lognormal", "exponential", "uniform"] ) @pytest.mark.parametrize("target_quantile", [0.05, 0.5, 0.75]) -def test_mean_pinball_loss_on_constant_predictions(distribution, target_quantile): +def test_mean_pinball_loss_on_constant_predictions( + distribution, target_quantile, global_random_seed +): if not hasattr(np, "quantile"): pytest.skip( "This test requires a more recent version of numpy " @@ -548,7 +552,7 @@ def test_mean_pinball_loss_on_constant_predictions(distribution, target_quantile # Check that the pinball loss is minimized by the empirical quantile. n_samples = 3000 - rng = np.random.RandomState(42) + rng = np.random.RandomState(global_random_seed) data = getattr(rng, distribution)(size=n_samples) # Compute the best possible pinball loss for any constant predictor: @@ -582,20 +586,22 @@ def objective_func(x): constant_pred = np.full(n_samples, fill_value=x) return mean_pinball_loss(data, constant_pred, alpha=target_quantile) - result = optimize.minimize(objective_func, data.mean(), method="Nelder-Mead") + result = optimize.minimize(objective_func, data.mean()) assert result.success # The minimum is not unique with limited data, hence the large tolerance. - assert result.x == pytest.approx(best_pred, rel=1e-2) + # For the normal distribution and the 0.5 quantile, the expected result is close to + # 0, hence the additional use of absolute tolerance. + assert_allclose(result.x, best_pred, rtol=1e-1, atol=1e-3) assert result.fun == pytest.approx(best_pbl) -def test_dummy_quantile_parameter_tuning(): +def test_dummy_quantile_parameter_tuning(global_random_seed): # Integration test to check that it is possible to use the pinball loss to # tune the hyperparameter of a quantile regressor. This is conceptually # similar to the previous test but using the scikit-learn estimator and # scoring API instead. n_samples = 1000 - rng = np.random.RandomState(0) + rng = np.random.RandomState(global_random_seed) X = rng.normal(size=(n_samples, 5)) # Ignored y = rng.exponential(size=n_samples) @@ -616,9 +622,9 @@ def test_dummy_quantile_parameter_tuning(): assert grid_search.best_params_["quantile"] == pytest.approx(alpha) -def test_pinball_loss_relation_with_mae(): +def test_pinball_loss_relation_with_mae(global_random_seed): # Test that mean_pinball loss with alpha=0.5 if half of mean absolute error - rng = np.random.RandomState(714) + rng = np.random.RandomState(global_random_seed) n = 100 y_true = rng.normal(size=n) y_pred = y_true.copy() + rng.uniform(n) From 5d4ba49a28f6e7d90656b74cd77ff2d8c57185e3 Mon Sep 17 00:00:00 2001 From: Simarjot Sidhu <41749062+simarssidhu@users.noreply.github.com> Date: Fri, 11 Apr 2025 09:50:45 -0400 Subject: [PATCH 031/182] TST Incorporate global_random_seed in test_optics.py (#30844) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Co-authored-by: Jérémie du Boisberranger --- sklearn/cluster/tests/test_optics.py | 32 ++++++++++++++++++---------- 1 file changed, 21 insertions(+), 11 deletions(-) diff --git a/sklearn/cluster/tests/test_optics.py b/sklearn/cluster/tests/test_optics.py index 95324704f6371..cf7d36f7848af 100644 --- a/sklearn/cluster/tests/test_optics.py +++ b/sklearn/cluster/tests/test_optics.py @@ -84,6 +84,8 @@ def test_the_extract_xi_labels(ordering, clusters, expected): def test_extract_xi(global_dtype): # small and easy test (no clusters around other clusters) # but with a clear noise data. + # global_random_seed is not used here since the expected labels + # are hardcoded for these specific data. rng = np.random.RandomState(0) n_points_per_cluster = 5 @@ -138,8 +140,8 @@ def test_extract_xi(global_dtype): assert_array_equal(clust.labels_, expected_labels) -def test_cluster_hierarchy_(global_dtype): - rng = np.random.RandomState(0) +def test_cluster_hierarchy(global_dtype, global_random_seed): + rng = np.random.RandomState(global_random_seed) n_points_per_cluster = 100 C1 = [0, 0] + 2 * rng.randn(n_points_per_cluster, 2).astype( global_dtype, copy=False @@ -148,12 +150,16 @@ def test_cluster_hierarchy_(global_dtype): global_dtype, copy=False ) X = np.vstack((C1, C2)) - X = shuffle(X, random_state=0) + X = shuffle(X, random_state=rng) - clusters = OPTICS(min_samples=20, xi=0.1).fit(X).cluster_hierarchy_ + clusters = OPTICS(min_samples=20, xi=0.2).fit(X).cluster_hierarchy_ assert clusters.shape == (2, 2) - diff = np.sum(clusters - np.array([[0, 99], [0, 199]])) - assert diff / len(X) < 0.05 + + # The first cluster should contain all point from C1 but due to how the data is + # generated, some points from C2 may end up in it. + assert 100 <= np.diff(clusters[0]) + 1 <= 115 + # The second cluster should contain all points from C1 and C2. + assert np.diff(clusters[-1]) + 1 == 200 @pytest.mark.parametrize( @@ -785,10 +791,10 @@ def test_compare_to_ELKI(): assert_allclose(clust1.core_distances_[index], clust2.core_distances_[index]) -def test_extract_dbscan(global_dtype): +def test_extract_dbscan(global_dtype, global_random_seed): # testing an easy dbscan case. Not including clusters with different # densities. - rng = np.random.RandomState(0) + rng = np.random.RandomState(global_random_seed) n_points_per_cluster = 20 C1 = [-5, -2] + 0.2 * rng.randn(n_points_per_cluster, 2) C2 = [4, -1] + 0.2 * rng.randn(n_points_per_cluster, 2) @@ -797,7 +803,9 @@ def test_extract_dbscan(global_dtype): X = np.vstack((C1, C2, C3, C4)).astype(global_dtype, copy=False) clust = OPTICS(cluster_method="dbscan", eps=0.5).fit(X) - assert_array_equal(np.sort(np.unique(clust.labels_)), [0, 1, 2, 3]) + assert_array_equal( + np.sort(np.unique(clust.labels_[clust.labels_ != -1])), [0, 1, 2, 3] + ) @pytest.mark.parametrize("csr_container", [None] + CSR_CONTAINERS) @@ -817,12 +825,14 @@ def test_precomputed_dists(global_dtype, csr_container): @pytest.mark.parametrize("csr_container", CSR_CONTAINERS) -def test_optics_input_not_modified_precomputed_sparse_nodiag(csr_container): +def test_optics_input_not_modified_precomputed_sparse_nodiag( + csr_container, global_random_seed +): """Check that we don't modify in-place the pre-computed sparse matrix. Non-regression test for: https://github.com/scikit-learn/scikit-learn/issues/27508 """ - X = np.random.RandomState(0).rand(6, 6) + X = np.random.RandomState(global_random_seed).rand(6, 6) # Add zeros on the diagonal that will be implicit when creating # the sparse matrix. If `X` is modified in-place, the zeros from # the diagonal will be made explicit. From d59d16660a1189491af3ded0001655a381b18082 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Martin=20Jur=C4=8Da?= Date: Fri, 11 Apr 2025 17:14:59 +0200 Subject: [PATCH 032/182] DOC Fix minor typos and formatting issues (#31179) --- doc/modules/decomposition.rst | 2 +- doc/modules/feature_extraction.rst | 2 +- doc/modules/model_evaluation.rst | 2 +- doc/modules/outlier_detection.rst | 18 ++++++++---------- doc/modules/preprocessing.rst | 4 ++-- 5 files changed, 13 insertions(+), 15 deletions(-) diff --git a/doc/modules/decomposition.rst b/doc/modules/decomposition.rst index b3be752e31e91..24fcd43a292c0 100644 --- a/doc/modules/decomposition.rst +++ b/doc/modules/decomposition.rst @@ -739,7 +739,7 @@ implemented in scikit-learn using the :class:`Fast ICA ` algorithm. Typically, ICA is not used for reducing dimensionality but for separating superimposed signals. Since the ICA model does not include a noise term, for the model to be correct, whitening must be applied. -This can be done internally using the whiten argument or manually using one +This can be done internally using the `whiten` argument or manually using one of the PCA variants. It is classically used to separate mixed signals (a problem known as diff --git a/doc/modules/feature_extraction.rst b/doc/modules/feature_extraction.rst index f7ac0979ce51e..ce62e22b0bc74 100644 --- a/doc/modules/feature_extraction.rst +++ b/doc/modules/feature_extraction.rst @@ -245,7 +245,7 @@ The Bag of Words representation ------------------------------- Text Analysis is a major application field for machine learning -algorithms. However the raw data, a sequence of symbols cannot be fed +algorithms. However the raw data, a sequence of symbols, cannot be fed directly to the algorithms themselves as most of them expect numerical feature vectors with a fixed size rather than the raw text documents with variable length. diff --git a/doc/modules/model_evaluation.rst b/doc/modules/model_evaluation.rst index a1ae46e66b048..b7371c0ba6def 100644 --- a/doc/modules/model_evaluation.rst +++ b/doc/modules/model_evaluation.rst @@ -2372,7 +2372,7 @@ engine algorithms or related applications. Using a graded relevance scale of documents in a search-engine result set, DCG measures the usefulness, or gain, of a document based on its position in the result list. The gain is accumulated from the top of the result list to the bottom, with the gain of each result -discounted at lower ranks" +discounted at lower ranks." DCG orders the true targets (e.g. relevance of query answers) in the predicted order, then multiplies them by a logarithmic decay and sums the result. The sum diff --git a/doc/modules/outlier_detection.rst b/doc/modules/outlier_detection.rst index 4875b9807b30c..7de2da4f1818e 100644 --- a/doc/modules/outlier_detection.rst +++ b/doc/modules/outlier_detection.rst @@ -340,16 +340,14 @@ average local density of its k-nearest neighbors, and its own local density: a normal instance is expected to have a local density similar to that of its neighbors, while abnormal data are expected to have much smaller local density. -The number k of neighbors considered, (alias parameter n_neighbors) is typically -chosen 1) greater than the minimum number of objects a cluster has to contain, -so that other objects can be local outliers relative to this cluster, and 2) -smaller than the maximum number of close by objects that can potentially be -local outliers. -In practice, such information is generally not available, and taking -n_neighbors=20 appears to work well in general. -When the proportion of outliers is high (i.e. greater than 10 \%, as in the -example below), n_neighbors should be greater (n_neighbors=35 in the example -below). +The number k of neighbors considered, (alias parameter `n_neighbors`) is +typically chosen 1) greater than the minimum number of objects a cluster has to +contain, so that other objects can be local outliers relative to this cluster, +and 2) smaller than the maximum number of close by objects that can potentially +be local outliers. In practice, such information is generally not available, and +taking `n_neighbors=20` appears to work well in general. When the proportion of +outliers is high (i.e. greater than 10 \%, as in the example below), +`n_neighbors` should be greater (`n_neighbors=35` in the example below). The strength of the LOF algorithm is that it takes both local and global properties of datasets into consideration: it can perform well even in datasets diff --git a/doc/modules/preprocessing.rst b/doc/modules/preprocessing.rst index 835aead4f8836..2c7f7af1fe130 100644 --- a/doc/modules/preprocessing.rst +++ b/doc/modules/preprocessing.rst @@ -757,8 +757,8 @@ enable the gathering of infrequent categories are `min_frequency` and input feature. `max_categories` includes the feature that combines infrequent categories. -In the following example with :class:`OrdinalEncoder`, the categories `'dog'` and -`'snake'` are considered infrequent:: +In the following example with :class:`OrdinalEncoder`, the categories `'dog'` +and `'snake'` are considered infrequent:: >>> X = np.array([['dog'] * 5 + ['cat'] * 20 + ['rabbit'] * 10 + ... ['snake'] * 3], dtype=object).T From aa0f381675bdf8fe27b864467e32810ae6b80a80 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Lo=C3=AFc=20Est=C3=A8ve?= Date: Fri, 11 Apr 2025 17:22:50 +0200 Subject: [PATCH 033/182] BLD Fix another Meson dependency (#31174) --- sklearn/linear_model/meson.build | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/sklearn/linear_model/meson.build b/sklearn/linear_model/meson.build index 53d44d45b0a2d..04fde5a16dde8 100644 --- a/sklearn/linear_model/meson.build +++ b/sklearn/linear_model/meson.build @@ -22,7 +22,7 @@ foreach name: name_list # TODO in principle this should go in py.exension_module below. This is # temporary work-around for dependency issue with .pyx.tp files. For more # details, see https://github.com/mesonbuild/meson/issues/13212 - depends: [linear_model_cython_tree, utils_cython_tree], + depends: [linear_model_cython_tree, utils_cython_tree, _loss_cython_tree], ) py.extension_module( name, From 84a7b963b7ae3355f416bdda89b9a67053f748d5 Mon Sep 17 00:00:00 2001 From: Xiao Yuan Date: Fri, 11 Apr 2025 18:38:12 +0300 Subject: [PATCH 034/182] DOC fix small typos in `LatentDirichletAllocation` (#31182) --- sklearn/decomposition/_lda.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/sklearn/decomposition/_lda.py b/sklearn/decomposition/_lda.py index 4580ff073bca5..94b1413745a22 100644 --- a/sklearn/decomposition/_lda.py +++ b/sklearn/decomposition/_lda.py @@ -495,7 +495,7 @@ def _e_step(self, X, cal_sstats, random_init, parallel=None): def _em_step(self, X, total_samples, batch_update, parallel=None): """EM update for 1 iteration. - update `_component` by batch VB or online VB. + update `component_` by batch VB or online VB. Parameters ---------- @@ -772,7 +772,7 @@ def fit_transform(self, X, y=None, *, normalize=True): Returns ------- - X_new : ndarray array of shape (n_samples, n_features_new) + X_new : ndarray array of shape (n_samples, n_components) Transformed array. """ return self.fit(X, y).transform(X, normalize=normalize) From 7f55ecb42dd22a76dd56175c950424688e307ec6 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Dea=20Mar=C3=ADa=20L=C3=A9on?= Date: Fri, 11 Apr 2025 18:03:20 +0200 Subject: [PATCH 035/182] TST Use global_random_seed in sklearn/datasets/tests/test_samples_generator.py (#31181) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Co-authored-by: Jérémie du Boisberranger --- .../datasets/tests/test_samples_generator.py | 61 +++++++++++-------- 1 file changed, 34 insertions(+), 27 deletions(-) diff --git a/sklearn/datasets/tests/test_samples_generator.py b/sklearn/datasets/tests/test_samples_generator.py index 5f1fddee0dacd..c1a7cca3141ad 100644 --- a/sklearn/datasets/tests/test_samples_generator.py +++ b/sklearn/datasets/tests/test_samples_generator.py @@ -344,20 +344,20 @@ def test_make_hastie_10_2(): assert np.unique(y).shape == (2,), "Unexpected number of classes" -def test_make_regression(): +def test_make_regression(global_random_seed): X, y, c = make_regression( - n_samples=100, + n_samples=200, n_features=10, n_informative=3, effective_rank=5, coef=True, bias=0.0, noise=1.0, - random_state=0, + random_state=global_random_seed, ) - assert X.shape == (100, 10), "X shape mismatch" - assert y.shape == (100,), "y shape mismatch" + assert X.shape == (200, 10), "X shape mismatch" + assert y.shape == (200,), "y shape mismatch" assert c.shape == (10,), "coef shape mismatch" assert sum(c != 0.0) == 3, "Unexpected number of informative features" @@ -369,7 +369,7 @@ def test_make_regression(): assert X.shape == (100, 1) -def test_make_regression_multitarget(): +def test_make_regression_multitarget(global_random_seed): X, y, c = make_regression( n_samples=100, n_features=10, @@ -377,7 +377,7 @@ def test_make_regression_multitarget(): n_targets=3, coef=True, noise=1.0, - random_state=0, + random_state=global_random_seed, ) assert X.shape == (100, 10), "X shape mismatch" @@ -389,11 +389,11 @@ def test_make_regression_multitarget(): assert_almost_equal(np.std(y - np.dot(X, c)), 1.0, decimal=1) -def test_make_blobs(): +def test_make_blobs(global_random_seed): cluster_stds = np.array([0.05, 0.2, 0.4]) cluster_centers = np.array([[0.0, 0.0], [1.0, 1.0], [0.0, 1.0]]) X, y = make_blobs( - random_state=0, + random_state=global_random_seed, n_samples=50, n_features=2, centers=cluster_centers, @@ -417,12 +417,15 @@ def test_make_blobs_n_samples_list(): ), "Incorrect number of samples per blob" -def test_make_blobs_n_samples_list_with_centers(): +def test_make_blobs_n_samples_list_with_centers(global_random_seed): n_samples = [20, 20, 20] centers = np.array([[0.0, 0.0], [1.0, 1.0], [0.0, 1.0]]) cluster_stds = np.array([0.05, 0.2, 0.4]) X, y = make_blobs( - n_samples=n_samples, centers=centers, cluster_std=cluster_stds, random_state=0 + n_samples=n_samples, + centers=centers, + cluster_std=cluster_stds, + random_state=global_random_seed, ) assert X.shape == (sum(n_samples), 2), "X shape mismatch" @@ -479,8 +482,10 @@ def test_make_blobs_error(): make_blobs(n_samples, centers=3) -def test_make_friedman1(): - X, y = make_friedman1(n_samples=5, n_features=10, noise=0.0, random_state=0) +def test_make_friedman1(global_random_seed): + X, y = make_friedman1( + n_samples=5, n_features=10, noise=0.0, random_state=global_random_seed + ) assert X.shape == (5, 10), "X shape mismatch" assert y.shape == (5,), "y shape mismatch" @@ -494,8 +499,8 @@ def test_make_friedman1(): ) -def test_make_friedman2(): - X, y = make_friedman2(n_samples=5, noise=0.0, random_state=0) +def test_make_friedman2(global_random_seed): + X, y = make_friedman2(n_samples=5, noise=0.0, random_state=global_random_seed) assert X.shape == (5, 4), "X shape mismatch" assert y.shape == (5,), "y shape mismatch" @@ -505,8 +510,8 @@ def test_make_friedman2(): ) -def test_make_friedman3(): - X, y = make_friedman3(n_samples=5, noise=0.0, random_state=0) +def test_make_friedman3(global_random_seed): + X, y = make_friedman3(n_samples=5, noise=0.0, random_state=global_random_seed) assert X.shape == (5, 4), "X shape mismatch" assert y.shape == (5,), "y shape mismatch" @@ -533,13 +538,13 @@ def test_make_low_rank_matrix(): assert sum(s) - 5 < 0.1, "X rank is not approximately 5" -def test_make_sparse_coded_signal(): +def test_make_sparse_coded_signal(global_random_seed): Y, D, X = make_sparse_coded_signal( n_samples=5, n_components=8, n_features=10, n_nonzero_coefs=3, - random_state=0, + random_state=global_random_seed, ) assert Y.shape == (5, 10), "Y shape mismatch" assert D.shape == (8, 10), "D shape mismatch" @@ -557,8 +562,8 @@ def test_make_sparse_uncorrelated(): assert y.shape == (5,), "y shape mismatch" -def test_make_spd_matrix(): - X = make_spd_matrix(n_dim=5, random_state=0) +def test_make_spd_matrix(global_random_seed): + X = make_spd_matrix(n_dim=5, random_state=global_random_seed) assert X.shape == (5, 5), "X shape mismatch" assert_array_almost_equal(X, X.T) @@ -604,8 +609,10 @@ def test_make_sparse_spd_matrix(norm_diag, sparse_format, global_random_seed): @pytest.mark.parametrize("hole", [False, True]) -def test_make_swiss_roll(hole): - X, t = make_swiss_roll(n_samples=5, noise=0.0, random_state=0, hole=hole) +def test_make_swiss_roll(global_random_seed, hole): + X, t = make_swiss_roll( + n_samples=5, noise=0.0, random_state=global_random_seed, hole=hole + ) assert X.shape == (5, 3) assert t.shape == (5,) @@ -613,8 +620,8 @@ def test_make_swiss_roll(hole): assert_array_almost_equal(X[:, 2], t * np.sin(t)) -def test_make_s_curve(): - X, t = make_s_curve(n_samples=5, noise=0.0, random_state=0) +def test_make_s_curve(global_random_seed): + X, t = make_s_curve(n_samples=5, noise=0.0, random_state=global_random_seed) assert X.shape == (5, 3), "X shape mismatch" assert t.shape == (5,), "t shape mismatch" @@ -669,8 +676,8 @@ def test_make_checkerboard(): assert_array_almost_equal(X1, X2) -def test_make_moons(): - X, y = make_moons(3, shuffle=False) +def test_make_moons(global_random_seed): + X, y = make_moons(3, shuffle=False, random_state=global_random_seed) for x, label in zip(X, y): center = [0.0, 0.0] if label == 0 else [1.0, 0.5] dist_sqr = ((x - center) ** 2).sum() From d0ca47b4b201e1ca5ec7484feb196a470599aba6 Mon Sep 17 00:00:00 2001 From: Lucy Liu Date: Sat, 12 Apr 2025 02:05:54 +1000 Subject: [PATCH 036/182] MAINT Remove scalar manipulation in `consine_distances` now `clip` fixed in array-api-compat (#31171) --- sklearn/metrics/pairwise.py | 10 +--------- 1 file changed, 1 insertion(+), 9 deletions(-) diff --git a/sklearn/metrics/pairwise.py b/sklearn/metrics/pairwise.py index 3fe3db110238e..cca8f2b6ae1c7 100644 --- a/sklearn/metrics/pairwise.py +++ b/sklearn/metrics/pairwise.py @@ -24,7 +24,6 @@ _is_numpy_namespace, _max_precision_float_dtype, _modify_in_place_if_numpy, - device, get_namespace, get_namespace_and_device, ) @@ -1168,14 +1167,7 @@ def cosine_distances(X, Y=None): S = cosine_similarity(X, Y) S *= -1 S += 1 - # TODO: remove the xp.asarray calls once the following is fixed: - # https://github.com/data-apis/array-api-compat/issues/177 - device_ = device(S) - S = xp.clip( - S, - xp.asarray(0.0, device=device_, dtype=S.dtype), - xp.asarray(2.0, device=device_, dtype=S.dtype), - ) + S = xp.clip(S, 0.0, 2.0) if X is Y or Y is None: # Ensure that distances between vectors and themselves are set to 0.0. # This may not be the case due to floating point rounding errors. From e4fbc3735c51018a9b30c5d6c749249f83d37132 Mon Sep 17 00:00:00 2001 From: JoaoRodriguesIST Date: Fri, 11 Apr 2025 18:18:51 +0100 Subject: [PATCH 037/182] MNT Update index finding to use np.nonzero (#31115) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Co-authored-by: Jérémie du Boisberranger --- examples/applications/plot_species_distribution_modeling.py | 2 +- examples/applications/plot_stock_market.py | 2 +- examples/bicluster/plot_bicluster_newsgroups.py | 2 +- examples/cluster/plot_hdbscan.py | 2 +- examples/decomposition/plot_sparse_coding.py | 2 +- examples/ensemble/plot_adaboost_twoclass.py | 2 +- examples/linear_model/plot_sgd_iris.py | 2 +- examples/manifold/plot_mds.py | 2 +- examples/miscellaneous/plot_multilabel.py | 4 ++-- .../plot_label_propagation_digits_active_learning.py | 2 +- examples/semi_supervised/plot_label_propagation_structure.py | 4 ++-- examples/svm/plot_linearsvc_support_vectors.py | 2 +- examples/tree/plot_iris_dtc.py | 2 +- 13 files changed, 15 insertions(+), 15 deletions(-) diff --git a/examples/applications/plot_species_distribution_modeling.py b/examples/applications/plot_species_distribution_modeling.py index 5b0d30bc4c8bf..dc3bd7591a11a 100644 --- a/examples/applications/plot_species_distribution_modeling.py +++ b/examples/applications/plot_species_distribution_modeling.py @@ -194,7 +194,7 @@ def plot_species_distribution( Z = np.ones((data.Ny, data.Nx), dtype=np.float64) # We'll predict only for the land points. - idx = np.where(land_reference > -9999) + idx = (land_reference > -9999).nonzero() coverages_land = data.coverages[:, idx[0], idx[1]].T pred = clf.decision_function((coverages_land - mean) / std) diff --git a/examples/applications/plot_stock_market.py b/examples/applications/plot_stock_market.py index 74f60ffa00c15..40f778c785723 100644 --- a/examples/applications/plot_stock_market.py +++ b/examples/applications/plot_stock_market.py @@ -213,7 +213,7 @@ ) # Plot the edges -start_idx, end_idx = np.where(non_zero) +start_idx, end_idx = non_zero.nonzero() # a sequence of (*line0*, *line1*, *line2*), where:: # linen = (x0, y0), (x1, y1), ... (xm, ym) segments = [ diff --git a/examples/bicluster/plot_bicluster_newsgroups.py b/examples/bicluster/plot_bicluster_newsgroups.py index aed7037086168..054fb0ba399e1 100644 --- a/examples/bicluster/plot_bicluster_newsgroups.py +++ b/examples/bicluster/plot_bicluster_newsgroups.py @@ -147,7 +147,7 @@ def bicluster_ncut(i): # words out_of_cluster_docs = cocluster.row_labels_ != cluster - out_of_cluster_docs = np.where(out_of_cluster_docs)[0] + out_of_cluster_docs = out_of_cluster_docs.nonzero()[0] word_col = X[:, cluster_words] word_scores = np.array( word_col[cluster_docs, :].sum(axis=0) diff --git a/examples/cluster/plot_hdbscan.py b/examples/cluster/plot_hdbscan.py index 64d4936694bf3..eee221d578ca3 100644 --- a/examples/cluster/plot_hdbscan.py +++ b/examples/cluster/plot_hdbscan.py @@ -40,7 +40,7 @@ def plot(X, labels, probabilities=None, parameters=None, ground_truth=False, ax= # Black used for noise. col = [0, 0, 0, 1] - class_index = np.where(labels == k)[0] + class_index = (labels == k).nonzero()[0] for ci in class_index: ax.plot( X[ci, 0], diff --git a/examples/decomposition/plot_sparse_coding.py b/examples/decomposition/plot_sparse_coding.py index 778f718c2ac87..a3456b553486c 100644 --- a/examples/decomposition/plot_sparse_coding.py +++ b/examples/decomposition/plot_sparse_coding.py @@ -106,7 +106,7 @@ def ricker_matrix(width, resolution, n_components): dictionary=D, transform_algorithm="threshold", transform_alpha=20 ) x = coder.transform(y.reshape(1, -1)) - _, idx = np.where(x != 0) + _, idx = (x != 0).nonzero() x[0, idx], _, _, _ = np.linalg.lstsq(D[idx, :].T, y, rcond=None) x = np.ravel(np.dot(x, D)) squared_error = np.sum((y - x) ** 2) diff --git a/examples/ensemble/plot_adaboost_twoclass.py b/examples/ensemble/plot_adaboost_twoclass.py index c499a9f6dc44b..18a2a10841c1c 100644 --- a/examples/ensemble/plot_adaboost_twoclass.py +++ b/examples/ensemble/plot_adaboost_twoclass.py @@ -65,7 +65,7 @@ # Plot the training points for i, n, c in zip(range(2), class_names, plot_colors): - idx = np.where(y == i) + idx = (y == i).nonzero() plt.scatter( X[idx, 0], X[idx, 1], diff --git a/examples/linear_model/plot_sgd_iris.py b/examples/linear_model/plot_sgd_iris.py index 46dc2e7c31cd1..e8aaf3a2e13a2 100644 --- a/examples/linear_model/plot_sgd_iris.py +++ b/examples/linear_model/plot_sgd_iris.py @@ -55,7 +55,7 @@ # Plot also the training points for i, color in zip(clf.classes_, colors): - idx = np.where(y == i) + idx = (y == i).nonzero() plt.scatter( X[idx, 0], X[idx, 1], diff --git a/examples/manifold/plot_mds.py b/examples/manifold/plot_mds.py index afea676b245a8..d35423ad51367 100644 --- a/examples/manifold/plot_mds.py +++ b/examples/manifold/plot_mds.py @@ -89,7 +89,7 @@ plt.legend(scatterpoints=1, loc="best", shadow=False) # Plot the edges -start_idx, end_idx = np.where(X_mds) +start_idx, end_idx = X_mds.nonzero() # a sequence of (*line0*, *line1*, *line2*), where:: # linen = (x0, y0), (x1, y1), ... (xm, ym) segments = [ diff --git a/examples/miscellaneous/plot_multilabel.py b/examples/miscellaneous/plot_multilabel.py index 9d08ad3fa7907..4c88dbe1838f2 100644 --- a/examples/miscellaneous/plot_multilabel.py +++ b/examples/miscellaneous/plot_multilabel.py @@ -71,8 +71,8 @@ def plot_subfigure(X, Y, subplot, title, transform): plt.subplot(2, 2, subplot) plt.title(title) - zero_class = np.where(Y[:, 0]) - one_class = np.where(Y[:, 1]) + zero_class = (Y[:, 0]).nonzero() + one_class = (Y[:, 1]).nonzero() plt.scatter(X[:, 0], X[:, 1], s=40, c="gray", edgecolors=(0, 0, 0)) plt.scatter( X[zero_class, 0], diff --git a/examples/semi_supervised/plot_label_propagation_digits_active_learning.py b/examples/semi_supervised/plot_label_propagation_digits_active_learning.py index 1e03f528acdb8..36183a8f6bfe5 100644 --- a/examples/semi_supervised/plot_label_propagation_digits_active_learning.py +++ b/examples/semi_supervised/plot_label_propagation_digits_active_learning.py @@ -108,7 +108,7 @@ sub.axis("off") # labeling 5 points, remote from labeled set - (delete_index,) = np.where(unlabeled_indices == image_index) + (delete_index,) = (unlabeled_indices == image_index).nonzero() delete_indices = np.concatenate((delete_indices, delete_index)) unlabeled_indices = np.delete(unlabeled_indices, delete_indices) diff --git a/examples/semi_supervised/plot_label_propagation_structure.py b/examples/semi_supervised/plot_label_propagation_structure.py index 8a1798c84edf4..2b44c51923686 100644 --- a/examples/semi_supervised/plot_label_propagation_structure.py +++ b/examples/semi_supervised/plot_label_propagation_structure.py @@ -78,8 +78,8 @@ # when the label was unknown. output_labels = label_spread.transduction_ output_label_array = np.asarray(output_labels) -outer_numbers = np.where(output_label_array == outer)[0] -inner_numbers = np.where(output_label_array == inner)[0] +outer_numbers = (output_label_array == outer).nonzero()[0] +inner_numbers = (output_label_array == inner).nonzero()[0] plt.figure(figsize=(4, 4)) plt.scatter( diff --git a/examples/svm/plot_linearsvc_support_vectors.py b/examples/svm/plot_linearsvc_support_vectors.py index 021e1c6b55962..370f826d11a64 100644 --- a/examples/svm/plot_linearsvc_support_vectors.py +++ b/examples/svm/plot_linearsvc_support_vectors.py @@ -31,7 +31,7 @@ # decision_function = np.dot(X, clf.coef_[0]) + clf.intercept_[0] # The support vectors are the samples that lie within the margin # boundaries, whose size is conventionally constrained to 1 - support_vector_indices = np.where(np.abs(decision_function) <= 1 + 1e-15)[0] + support_vector_indices = (np.abs(decision_function) <= 1 + 1e-15).nonzero()[0] support_vectors = X[support_vector_indices] plt.subplot(1, 2, i + 1) diff --git a/examples/tree/plot_iris_dtc.py b/examples/tree/plot_iris_dtc.py index 9d4298919d515..349f4a893511e 100644 --- a/examples/tree/plot_iris_dtc.py +++ b/examples/tree/plot_iris_dtc.py @@ -63,7 +63,7 @@ # Plot the training points for i, color in zip(range(n_classes), plot_colors): - idx = np.where(y == i) + idx = np.asarray(y == i).nonzero() plt.scatter( X[idx, 0], X[idx, 1], From 7f325a933bae2c5c541a2626e9d89e53838b3ee0 Mon Sep 17 00:00:00 2001 From: emelia-hdz Date: Fri, 11 Apr 2025 11:38:23 -0600 Subject: [PATCH 038/182] MNT use np.nonzero instead of np.where in _affinity_propagation.py (#30520) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Co-authored-by: Jérémie du Boisberranger --- sklearn/cluster/_affinity_propagation.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/sklearn/cluster/_affinity_propagation.py b/sklearn/cluster/_affinity_propagation.py index f38488b39a46f..c7ae6ed63580d 100644 --- a/sklearn/cluster/_affinity_propagation.py +++ b/sklearn/cluster/_affinity_propagation.py @@ -148,7 +148,7 @@ def _affinity_propagation( c[I] = np.arange(K) # Identify clusters # Refine the final set of exemplars and clusters and return results for k in range(K): - ii = np.where(c == k)[0] + ii = np.asarray(c == k).nonzero()[0] j = np.argmax(np.sum(S[ii[:, np.newaxis], ii], axis=0)) I[k] = ii[j] From a744c476511e8d87952be7910143a764d7152ef4 Mon Sep 17 00:00:00 2001 From: Bagus Tris Atmaja Date: Sat, 12 Apr 2025 21:10:55 +0530 Subject: [PATCH 039/182] DEP expose y_score instead of y_pred RocCurveDisplay.from_predictions (#29865) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Co-authored-by: Guillaume Lemaitre Co-authored-by: Jérémie du Boisberranger --- .../sklearn.metrics/29865.api.rst | 4 ++ .../plot_outlier_detection_bench.py | 30 +++++----- sklearn/metrics/_plot/roc_curve.py | 56 +++++++++++++++---- .../_plot/tests/test_roc_curve_display.py | 54 ++++++++++++++---- sklearn/metrics/_ranking.py | 12 ++-- 5 files changed, 111 insertions(+), 45 deletions(-) create mode 100644 doc/whats_new/upcoming_changes/sklearn.metrics/29865.api.rst diff --git a/doc/whats_new/upcoming_changes/sklearn.metrics/29865.api.rst b/doc/whats_new/upcoming_changes/sklearn.metrics/29865.api.rst new file mode 100644 index 0000000000000..60ea7d83de71f --- /dev/null +++ b/doc/whats_new/upcoming_changes/sklearn.metrics/29865.api.rst @@ -0,0 +1,4 @@ +- In :meth:`sklearn.metrics.RocCurveDisplay.from_predictions`, + the argument `y_pred` has been renamed to `y_score` to better reflect its purpose. + `y_pred` will be removed in 1.9. + By :user:`Bagus Tris Atmaja ` in diff --git a/examples/miscellaneous/plot_outlier_detection_bench.py b/examples/miscellaneous/plot_outlier_detection_bench.py index cef58e20d75eb..600eceb1a06b3 100644 --- a/examples/miscellaneous/plot_outlier_detection_bench.py +++ b/examples/miscellaneous/plot_outlier_detection_bench.py @@ -88,12 +88,12 @@ def fit_predict(estimator, X): tic = perf_counter() if estimator[-1].__class__.__name__ == "LocalOutlierFactor": estimator.fit(X) - y_pred = estimator[-1].negative_outlier_factor_ + y_score = estimator[-1].negative_outlier_factor_ else: # "IsolationForest" - y_pred = estimator.fit(X).decision_function(X) + y_score = estimator.fit(X).decision_function(X) toc = perf_counter() print(f"Duration for {model_name}: {toc - tic:.2f} s") - return y_pred + return y_score # %% @@ -138,7 +138,7 @@ def fit_predict(estimator, X): # %% y_true = {} -y_pred = {"LOF": {}, "IForest": {}} +y_score = {"LOF": {}, "IForest": {}} model_names = ["LOF", "IForest"] cat_columns = ["protocol_type", "service", "flag"] @@ -150,7 +150,7 @@ def fit_predict(estimator, X): lof_kw={"n_neighbors": int(n_samples * anomaly_frac)}, iforest_kw={"random_state": 42}, ) - y_pred[model_name]["KDDCup99 - SA"] = fit_predict(model, X) + y_score[model_name]["KDDCup99 - SA"] = fit_predict(model, X) # %% # Forest covertypes dataset @@ -185,7 +185,7 @@ def fit_predict(estimator, X): lof_kw={"n_neighbors": int(n_samples * anomaly_frac)}, iforest_kw={"random_state": 42}, ) - y_pred[model_name]["forestcover"] = fit_predict(model, X) + y_score[model_name]["forestcover"] = fit_predict(model, X) # %% # Ames Housing dataset @@ -242,7 +242,7 @@ def fit_predict(estimator, X): lof_kw={"n_neighbors": int(n_samples * anomaly_frac)}, iforest_kw={"random_state": 42}, ) - y_pred[model_name]["ames_housing"] = fit_predict(model, X) + y_score[model_name]["ames_housing"] = fit_predict(model, X) # %% # Cardiotocography dataset @@ -271,7 +271,7 @@ def fit_predict(estimator, X): lof_kw={"n_neighbors": int(n_samples * anomaly_frac)}, iforest_kw={"random_state": 42}, ) - y_pred[model_name]["cardiotocography"] = fit_predict(model, X) + y_score[model_name]["cardiotocography"] = fit_predict(model, X) # %% # Plot and interpret results @@ -299,7 +299,7 @@ def fit_predict(estimator, X): for model_idx, model_name in enumerate(model_names): display = RocCurveDisplay.from_predictions( y_true[dataset_name], - y_pred[model_name][dataset_name], + y_score[model_name][dataset_name], pos_label=pos_label, name=model_name, ax=ax, @@ -346,10 +346,10 @@ def fit_predict(estimator, X): for model_idx, (linestyle, n_neighbors) in enumerate(zip(linestyles, n_neighbors_list)): model.set_params(localoutlierfactor__n_neighbors=n_neighbors) model.fit(X) - y_pred = model[-1].negative_outlier_factor_ + y_score = model[-1].negative_outlier_factor_ display = RocCurveDisplay.from_predictions( y, - y_pred, + y_score, pos_label=pos_label, name=f"n_neighbors = {n_neighbors}", ax=ax, @@ -386,10 +386,10 @@ def fit_predict(estimator, X): ): model = make_pipeline(preprocessor, lof) model.fit(X) - y_pred = model[-1].negative_outlier_factor_ + y_score = model[-1].negative_outlier_factor_ display = RocCurveDisplay.from_predictions( y, - y_pred, + y_score, pos_label=pos_label, name=str(preprocessor).split("(")[0], ax=ax, @@ -438,10 +438,10 @@ def fit_predict(estimator, X): ): model = make_pipeline(preprocessor, lof) model.fit(X) - y_pred = model[-1].negative_outlier_factor_ + y_score = model[-1].negative_outlier_factor_ display = RocCurveDisplay.from_predictions( y, - y_pred, + y_score, pos_label=pos_label, name=str(preprocessor).split("(")[0], ax=ax, diff --git a/sklearn/metrics/_plot/roc_curve.py b/sklearn/metrics/_plot/roc_curve.py index ab802d1f3cfff..cc467296cfed1 100644 --- a/sklearn/metrics/_plot/roc_curve.py +++ b/sklearn/metrics/_plot/roc_curve.py @@ -1,6 +1,8 @@ # Authors: The scikit-learn developers # SPDX-License-Identifier: BSD-3-Clause +import warnings + from ...utils._plotting import ( _BinaryClassifierCurveDisplayMixin, _despine, @@ -71,9 +73,9 @@ class RocCurveDisplay(_BinaryClassifierCurveDisplayMixin): >>> import matplotlib.pyplot as plt >>> import numpy as np >>> from sklearn import metrics - >>> y = np.array([0, 0, 1, 1]) - >>> pred = np.array([0.1, 0.4, 0.35, 0.8]) - >>> fpr, tpr, thresholds = metrics.roc_curve(y, pred) + >>> y_true = np.array([0, 0, 1, 1]) + >>> y_score = np.array([0.1, 0.4, 0.35, 0.8]) + >>> fpr, tpr, thresholds = metrics.roc_curve(y_true, y_score) >>> roc_auc = metrics.auc(fpr, tpr) >>> display = metrics.RocCurveDisplay(fpr=fpr, tpr=tpr, roc_auc=roc_auc, ... estimator_name='example estimator') @@ -299,7 +301,7 @@ def from_estimator( <...> >>> plt.show() """ - y_pred, pos_label, name = cls._validate_and_get_response_values( + y_score, pos_label, name = cls._validate_and_get_response_values( estimator, X, y, @@ -310,7 +312,7 @@ def from_estimator( return cls.from_predictions( y_true=y, - y_pred=y_pred, + y_score=y_score, sample_weight=sample_weight, drop_intermediate=drop_intermediate, name=name, @@ -326,7 +328,7 @@ def from_estimator( def from_predictions( cls, y_true, - y_pred, + y_score=None, *, sample_weight=None, drop_intermediate=True, @@ -336,6 +338,7 @@ def from_predictions( plot_chance_level=False, chance_level_kw=None, despine=False, + y_pred="deprecated", **kwargs, ): """Plot ROC curve given the true and predicted values. @@ -349,11 +352,14 @@ def from_predictions( y_true : array-like of shape (n_samples,) True labels. - y_pred : array-like of shape (n_samples,) + y_score : array-like of shape (n_samples,) Target scores, can either be probability estimates of the positive class, confidence values, or non-thresholded measure of decisions (as returned by “decision_function” on some classifiers). + .. versionadded:: 1.7 + `y_pred` has been renamed to `y_score`. + sample_weight : array-like of shape (n_samples,), default=None Sample weights. @@ -391,6 +397,15 @@ def from_predictions( .. versionadded:: 1.6 + y_pred : array-like of shape (n_samples,) + Target scores, can either be probability estimates of the positive + class, confidence values, or non-thresholded measure of decisions + (as returned by “decision_function” on some classifiers). + + .. deprecated:: 1.7 + `y_pred` is deprecated and will be removed in 1.9. Use + `y_score` instead. + **kwargs : dict Additional keywords arguments passed to matplotlib `plot` function. @@ -417,19 +432,36 @@ def from_predictions( >>> X_train, X_test, y_train, y_test = train_test_split( ... X, y, random_state=0) >>> clf = SVC(random_state=0).fit(X_train, y_train) - >>> y_pred = clf.decision_function(X_test) - >>> RocCurveDisplay.from_predictions( - ... y_test, y_pred) + >>> y_score = clf.decision_function(X_test) + >>> RocCurveDisplay.from_predictions(y_test, y_score) <...> >>> plt.show() """ + # TODO(1.9): remove after the end of the deprecation period of `y_pred` + if y_score is not None and not ( + isinstance(y_pred, str) and y_pred == "deprecated" + ): + raise ValueError( + "`y_pred` and `y_score` cannot be both specified. Please use `y_score`" + " only as `y_pred` is deprecated in 1.7 and will be removed in 1.9." + ) + if not (isinstance(y_pred, str) and y_pred == "deprecated"): + warnings.warn( + ( + "y_pred is deprecated in 1.7 and will be removed in 1.9. " + "Please use `y_score` instead." + ), + FutureWarning, + ) + y_score = y_pred + pos_label_validated, name = cls._validate_from_predictions_params( - y_true, y_pred, sample_weight=sample_weight, pos_label=pos_label, name=name + y_true, y_score, sample_weight=sample_weight, pos_label=pos_label, name=name ) fpr, tpr, _ = roc_curve( y_true, - y_pred, + y_score, pos_label=pos_label, sample_weight=sample_weight, drop_intermediate=drop_intermediate, diff --git a/sklearn/metrics/_plot/tests/test_roc_curve_display.py b/sklearn/metrics/_plot/tests/test_roc_curve_display.py index c8ad57beee1e0..c2e6c865fa9a9 100644 --- a/sklearn/metrics/_plot/tests/test_roc_curve_display.py +++ b/sklearn/metrics/_plot/tests/test_roc_curve_display.py @@ -68,8 +68,8 @@ def test_roc_curve_display_plotting( lr = LogisticRegression() lr.fit(X, y) - y_pred = getattr(lr, response_method)(X) - y_pred = y_pred if y_pred.ndim == 1 else y_pred[:, 1] + y_score = getattr(lr, response_method)(X) + y_score = y_score if y_score.ndim == 1 else y_score[:, 1] if constructor_name == "from_estimator": display = RocCurveDisplay.from_estimator( @@ -84,7 +84,7 @@ def test_roc_curve_display_plotting( else: display = RocCurveDisplay.from_predictions( y, - y_pred, + y_score, sample_weight=sample_weight, drop_intermediate=drop_intermediate, pos_label=pos_label, @@ -93,7 +93,7 @@ def test_roc_curve_display_plotting( fpr, tpr, _ = roc_curve( y, - y_pred, + y_score, sample_weight=sample_weight, drop_intermediate=drop_intermediate, pos_label=pos_label, @@ -155,8 +155,8 @@ def test_roc_curve_chance_level_line( lr = LogisticRegression() lr.fit(X, y) - y_pred = getattr(lr, "predict_proba")(X) - y_pred = y_pred if y_pred.ndim == 1 else y_pred[:, 1] + y_score = getattr(lr, "predict_proba")(X) + y_score = y_score if y_score.ndim == 1 else y_score[:, 1] if constructor_name == "from_estimator": display = RocCurveDisplay.from_estimator( @@ -171,7 +171,7 @@ def test_roc_curve_chance_level_line( else: display = RocCurveDisplay.from_predictions( y, - y_pred, + y_score, label=label, alpha=0.8, plot_chance_level=plot_chance_level, @@ -306,11 +306,11 @@ def test_plot_roc_curve_pos_label(pyplot, response_method, constructor_name): # are betrayed by the class imbalance assert classifier.classes_.tolist() == ["cancer", "not cancer"] - y_pred = getattr(classifier, response_method)(X_test) + y_score = getattr(classifier, response_method)(X_test) # we select the corresponding probability columns or reverse the decision # function otherwise - y_pred_cancer = -1 * y_pred if y_pred.ndim == 1 else y_pred[:, 0] - y_pred_not_cancer = y_pred if y_pred.ndim == 1 else y_pred[:, 1] + y_score_cancer = -1 * y_score if y_score.ndim == 1 else y_score[:, 0] + y_score_not_cancer = y_score if y_score.ndim == 1 else y_score[:, 1] if constructor_name == "from_estimator": display = RocCurveDisplay.from_estimator( @@ -323,7 +323,7 @@ def test_plot_roc_curve_pos_label(pyplot, response_method, constructor_name): else: display = RocCurveDisplay.from_predictions( y_test, - y_pred_cancer, + y_score_cancer, pos_label="cancer", ) @@ -343,7 +343,7 @@ def test_plot_roc_curve_pos_label(pyplot, response_method, constructor_name): else: display = RocCurveDisplay.from_predictions( y_test, - y_pred_not_cancer, + y_score_not_cancer, pos_label="not cancer", ) @@ -351,6 +351,36 @@ def test_plot_roc_curve_pos_label(pyplot, response_method, constructor_name): assert trapezoid(display.tpr, display.fpr) == pytest.approx(roc_auc_limit) +# TODO(1.9): remove +def test_y_score_and_y_pred_specified_error(): + """Check that an error is raised when both y_score and y_pred are specified.""" + y_true = np.array([0, 1, 1, 0]) + y_score = np.array([0.1, 0.4, 0.35, 0.8]) + y_pred = np.array([0.2, 0.3, 0.5, 0.1]) + + with pytest.raises( + ValueError, match="`y_pred` and `y_score` cannot be both specified" + ): + RocCurveDisplay.from_predictions(y_true, y_score=y_score, y_pred=y_pred) + + +# TODO(1.9): remove +def test_y_pred_deprecation_warning(pyplot): + """Check that a warning is raised when y_pred is specified.""" + y_true = np.array([0, 1, 1, 0]) + y_score = np.array([0.1, 0.4, 0.35, 0.8]) + + with pytest.warns(FutureWarning, match="y_pred is deprecated in 1.7"): + display_y_pred = RocCurveDisplay.from_predictions(y_true, y_pred=y_score) + + assert_allclose(display_y_pred.fpr, [0, 0.5, 0.5, 1]) + assert_allclose(display_y_pred.tpr, [0, 0, 1, 1]) + + display_y_score = RocCurveDisplay.from_predictions(y_true, y_score) + assert_allclose(display_y_score.fpr, [0, 0.5, 0.5, 1]) + assert_allclose(display_y_score.tpr, [0, 0, 1, 1]) + + @pytest.mark.parametrize("despine", [True, False]) @pytest.mark.parametrize("constructor_name", ["from_estimator", "from_predictions"]) def test_plot_roc_curve_despine(pyplot, data_binary, despine, constructor_name): diff --git a/sklearn/metrics/_ranking.py b/sklearn/metrics/_ranking.py index 99e4970b64627..b2d0bbf5eec78 100644 --- a/sklearn/metrics/_ranking.py +++ b/sklearn/metrics/_ranking.py @@ -73,9 +73,9 @@ def auc(x, y): -------- >>> import numpy as np >>> from sklearn import metrics - >>> y = np.array([1, 1, 2, 2]) - >>> pred = np.array([0.1, 0.4, 0.35, 0.8]) - >>> fpr, tpr, thresholds = metrics.roc_curve(y, pred, pos_label=2) + >>> y_true = np.array([1, 1, 2, 2]) + >>> y_score = np.array([0.1, 0.4, 0.35, 0.8]) + >>> fpr, tpr, thresholds = metrics.roc_curve(y_true, y_score, pos_label=2) >>> metrics.auc(fpr, tpr) 0.75 """ @@ -604,10 +604,10 @@ class scores must correspond to the order of ``labels``, >>> clf = MultiOutputClassifier(clf).fit(X, y) >>> # get a list of n_output containing probability arrays of shape >>> # (n_samples, n_classes) - >>> y_pred = clf.predict_proba(X) + >>> y_score = clf.predict_proba(X) >>> # extract the positive columns for each output - >>> y_pred = np.transpose([pred[:, 1] for pred in y_pred]) - >>> roc_auc_score(y, y_pred, average=None) + >>> y_score = np.transpose([score[:, 1] for score in y_score]) + >>> roc_auc_score(y, y_score, average=None) array([0.82..., 0.86..., 0.94..., 0.85... , 0.94...]) >>> from sklearn.linear_model import RidgeClassifierCV >>> clf = RidgeClassifierCV().fit(X, y) From 0df96763da31377fe52aad7f6e9a6fcea74ccf61 Mon Sep 17 00:00:00 2001 From: Acciaro Gennaro Daniele Date: Sat, 12 Apr 2025 17:46:32 +0200 Subject: [PATCH 040/182] FIX - changed broken endpoint for reuters dataset (#31186) --- examples/applications/plot_out_of_core_classification.py | 5 +---- 1 file changed, 1 insertion(+), 4 deletions(-) diff --git a/examples/applications/plot_out_of_core_classification.py b/examples/applications/plot_out_of_core_classification.py index a698c8e1c66e2..ad0ff9638e41c 100644 --- a/examples/applications/plot_out_of_core_classification.py +++ b/examples/applications/plot_out_of_core_classification.py @@ -142,10 +142,7 @@ def stream_reuters_documents(data_path=None): """ - DOWNLOAD_URL = ( - "http://archive.ics.uci.edu/ml/machine-learning-databases/" - "reuters21578-mld/reuters21578.tar.gz" - ) + DOWNLOAD_URL = "https://kdd.ics.uci.edu/databases/reuters21578/reuters21578.tar.gz" ARCHIVE_SHA256 = "3bae43c9b14e387f76a61b6d82bf98a4fb5d3ef99ef7e7075ff2ccbcf59f9d30" ARCHIVE_FILENAME = "reuters21578.tar.gz" From cc28738246394ffde91375c1d827d42783ee2b15 Mon Sep 17 00:00:00 2001 From: vpz <43419128+vitorpohlenz@users.noreply.github.com> Date: Sat, 12 Apr 2025 14:10:29 -0300 Subject: [PATCH 041/182] DOC: Update doc of Installing the development version on windows (#31173) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Co-authored-by: Jérémie du Boisberranger --- doc/developers/advanced_installation.rst | 8 ++++++-- 1 file changed, 6 insertions(+), 2 deletions(-) diff --git a/doc/developers/advanced_installation.rst b/doc/developers/advanced_installation.rst index 0b2aa30efb757..09b335ecee1ed 100644 --- a/doc/developers/advanced_installation.rst +++ b/doc/developers/advanced_installation.rst @@ -159,7 +159,7 @@ to build scikit-learn Cython extensions for each supported platform. Windows ------- -First, download the `Build Tools for Visual Studio 2019 installer +First, download the `Build Tools for Visual Studio installer `_. Run the downloaded `vs_buildtools.exe` file, during the installation you will @@ -186,7 +186,11 @@ commands in ``cmd`` or an Anaconda Prompt (if you use Anaconda): .. prompt:: bash C:\> SET DISTUTILS_USE_SDK=1 - "C:\Program Files (x86)\Microsoft Visual Studio\2019\BuildTools\VC\Auxiliary\Build\vcvarsall.bat" x64 + "C:\Program Files (x86)\Microsoft Visual Studio\2022\BuildTools\VC\Auxiliary\Build\vcvarsall.bat" x64 + +.. note:: + The previous command is for the 2022 version of Visual Studio. If you + have a different version, you will need to adjust the year in the path accordingly. Replace ``x64`` by ``x86`` to build for 32-bit Python. From 28ec3cf33905dc809957ff47c6a565a1a1e5791a Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?J=C3=A9r=C3=A9mie=20du=20Boisberranger?= Date: Sun, 13 Apr 2025 10:47:36 +0200 Subject: [PATCH 042/182] MNT Skip sample_weight common test only for scipy 1.15 (#31188) --- sklearn/utils/_test_common/instance_generator.py | 8 +++++++- 1 file changed, 7 insertions(+), 1 deletion(-) diff --git a/sklearn/utils/_test_common/instance_generator.py b/sklearn/utils/_test_common/instance_generator.py index e619deab1c93e..18fb70da7d942 100644 --- a/sklearn/utils/_test_common/instance_generator.py +++ b/sklearn/utils/_test_common/instance_generator.py @@ -1284,7 +1284,13 @@ def _get_expected_failed_checks(estimator): } ) if type(estimator) == LinearRegression: - if _IS_32BIT: + # TODO: remove when scipy min version >= 1.16 + # Regression introduced in scipy 1.15 and fixed in 1.16, see + # https://github.com/scipy/scipy/issues/22791 + if ( + parse_version("1.15.0") <= sp_base_version < parse_version("1.16") + and _IS_32BIT + ): failed_checks.update( { "check_sample_weight_equivalence_on_dense_data": ( From b90e09dceb1fed6bdee9a90a3d8e3c183f311771 Mon Sep 17 00:00:00 2001 From: antoinebaker Date: Sun, 13 Apr 2025 16:46:20 +0200 Subject: [PATCH 043/182] FIX Covariance matrix in BayesianRidge (#31094) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Co-authored-by: Olivier Grisel Co-authored-by: Jérémie du Boisberranger --- .../sklearn.linear_model/31094.fix.rst | 3 +++ sklearn/linear_model/_bayes.py | 20 ++++++++++++++----- sklearn/linear_model/tests/test_bayes.py | 17 ++++++++++++++++ 3 files changed, 35 insertions(+), 5 deletions(-) create mode 100644 doc/whats_new/upcoming_changes/sklearn.linear_model/31094.fix.rst diff --git a/doc/whats_new/upcoming_changes/sklearn.linear_model/31094.fix.rst b/doc/whats_new/upcoming_changes/sklearn.linear_model/31094.fix.rst new file mode 100644 index 0000000000000..b65d96bccd7d2 --- /dev/null +++ b/doc/whats_new/upcoming_changes/sklearn.linear_model/31094.fix.rst @@ -0,0 +1,3 @@ +- :class:`linear_model.BayesianRidge` now uses the full SVD to correctly estimate + the posterior covariance matrix `sigma_` when `n_samples < n_features`. + By :user:`Antoine Baker ` diff --git a/sklearn/linear_model/_bayes.py b/sklearn/linear_model/_bayes.py index 27ce01d0e75d5..adf515d44d1d9 100644 --- a/sklearn/linear_model/_bayes.py +++ b/sklearn/linear_model/_bayes.py @@ -293,8 +293,19 @@ def fit(self, X, y, sample_weight=None): coef_old_ = None XT_y = np.dot(X.T, y) - U, S, Vh = linalg.svd(X, full_matrices=False) + # Let M, N = n_samples, n_features and K = min(M, N). + # The posterior covariance matrix needs Vh_full: (N, N). + # The full SVD is only required when n_samples < n_features. + # When n_samples < n_features, K=M and full_matrices=True + # U: (M, M), S: M, Vh_full: (N, N), Vh: (M, N) + # When n_samples > n_features, K=N and full_matrices=False + # U: (M, N), S: N, Vh_full: (N, N), Vh: (N, N) + U, S, Vh_full = linalg.svd(X, full_matrices=(n_samples < n_features)) + K = len(S) eigen_vals_ = S**2 + eigen_vals_full = np.zeros(n_features, dtype=dtype) + eigen_vals_full[0:K] = eigen_vals_ + Vh = Vh_full[0:K, :] # Convergence loop of the bayesian ridge regression for iter_ in range(self.max_iter): @@ -353,11 +364,10 @@ def fit(self, X, y, sample_weight=None): self.scores_.append(s) self.scores_ = np.array(self.scores_) - # posterior covariance is given by 1/alpha_ * scaled_sigma_ - scaled_sigma_ = np.dot( - Vh.T, Vh / (eigen_vals_ + lambda_ / alpha_)[:, np.newaxis] + # posterior covariance + self.sigma_ = np.dot( + Vh_full.T, Vh_full / (alpha_ * eigen_vals_full + lambda_)[:, np.newaxis] ) - self.sigma_ = (1.0 / alpha_) * scaled_sigma_ self._set_intercept(X_offset_, y_offset_, X_scale_) diff --git a/sklearn/linear_model/tests/test_bayes.py b/sklearn/linear_model/tests/test_bayes.py index 6fae1536582c8..9f7fabb749f52 100644 --- a/sklearn/linear_model/tests/test_bayes.py +++ b/sklearn/linear_model/tests/test_bayes.py @@ -11,6 +11,7 @@ from sklearn.utils import check_random_state from sklearn.utils._testing import ( _convert_container, + assert_allclose, assert_almost_equal, assert_array_almost_equal, assert_array_less, @@ -94,6 +95,22 @@ def test_bayesian_ridge_parameter(): assert_almost_equal(rr_model.intercept_, br_model.intercept_) +@pytest.mark.parametrize("n_samples, n_features", [(10, 20), (20, 10)]) +def test_bayesian_covariance_matrix(n_samples, n_features, global_random_seed): + """Check the posterior covariance matrix sigma_ + + Non-regression test for https://github.com/scikit-learn/scikit-learn/issues/31093 + """ + X, y = datasets.make_regression( + n_samples, n_features, random_state=global_random_seed + ) + reg = BayesianRidge(fit_intercept=False).fit(X, y) + covariance_matrix = np.linalg.inv( + reg.lambda_ * np.identity(n_features) + reg.alpha_ * np.dot(X.T, X) + ) + assert_allclose(reg.sigma_, covariance_matrix, rtol=1e-6) + + def test_bayesian_sample_weights(): # Test correctness of the sample_weights method X = np.array([[1, 1], [3, 4], [5, 7], [4, 1], [2, 6], [3, 10], [3, 2]]) From eec4449e2b36f051baabfb6d20c097fc9e83bf65 Mon Sep 17 00:00:00 2001 From: Mohit Singh Thakur <26721840+mohitthakur13@users.noreply.github.com> Date: Sun, 13 Apr 2025 17:23:13 +0200 Subject: [PATCH 044/182] FIX Raise informative error when validation set is too small in MLPRegressor (#24788) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Co-authored-by: Mohit Singh Thakur Co-authored-by: Mohit Singh Thakur Co-authored-by: Jérémie du Boisberranger --- .../upcoming_changes/sklearn.neural_network/24788.fix.rst | 3 +++ sklearn/neural_network/_multilayer_perceptron.py | 6 ++++++ sklearn/neural_network/tests/test_mlp.py | 8 ++++++++ 3 files changed, 17 insertions(+) create mode 100644 doc/whats_new/upcoming_changes/sklearn.neural_network/24788.fix.rst diff --git a/doc/whats_new/upcoming_changes/sklearn.neural_network/24788.fix.rst b/doc/whats_new/upcoming_changes/sklearn.neural_network/24788.fix.rst new file mode 100644 index 0000000000000..ea67942daec59 --- /dev/null +++ b/doc/whats_new/upcoming_changes/sklearn.neural_network/24788.fix.rst @@ -0,0 +1,3 @@ +:class:`neural_network.MLPRegressor` now raises an informative error when +`early_stopping` is set and the computed validation set is too small. +By :user:`David Shumway `. diff --git a/sklearn/neural_network/_multilayer_perceptron.py b/sklearn/neural_network/_multilayer_perceptron.py index 51ff4176a0524..d18f873e8a0db 100644 --- a/sklearn/neural_network/_multilayer_perceptron.py +++ b/sklearn/neural_network/_multilayer_perceptron.py @@ -668,6 +668,12 @@ def _fit_stochastic( test_size=self.validation_fraction, stratify=stratify, ) + if X_val.shape[0] < 2: + raise ValueError( + "The validation set is too small. Increase 'validation_fraction' " + "or the size of your dataset." + ) + if is_classifier(self): y_val = self._label_binarizer.inverse_transform(y_val) else: diff --git a/sklearn/neural_network/tests/test_mlp.py b/sklearn/neural_network/tests/test_mlp.py index f788426ad60d2..417d15b0f6cf2 100644 --- a/sklearn/neural_network/tests/test_mlp.py +++ b/sklearn/neural_network/tests/test_mlp.py @@ -1084,3 +1084,11 @@ def test_mlp_vs_poisson_glm_equivalent(global_random_seed): random_state=np.random.RandomState(global_random_seed + 1), ).fit(X, y) assert not np.allclose(mlp.predict(X), glm.predict(X), rtol=1e-4) + + +def test_minimum_input_sample_size(): + """Check error message when the validation set is too small.""" + X, y = make_regression(n_samples=2, n_features=5, random_state=0) + model = MLPRegressor(early_stopping=True, random_state=0) + with pytest.raises(ValueError, match="The validation set is too small"): + model.fit(X, y) From 113b9256addb00f9a6433847d02dd9550375fd0e Mon Sep 17 00:00:00 2001 From: scikit-learn-bot Date: Mon, 14 Apr 2025 10:59:54 +0200 Subject: [PATCH 045/182] :lock: :robot: CI Update lock files for array-api CI build(s) :lock: :robot: (#31194) Co-authored-by: Lock file bot --- ...a_forge_cuda_array-api_linux-64_conda.lock | 28 +++++++++---------- 1 file changed, 14 insertions(+), 14 deletions(-) diff --git a/build_tools/github/pylatest_conda_forge_cuda_array-api_linux-64_conda.lock b/build_tools/github/pylatest_conda_forge_cuda_array-api_linux-64_conda.lock index 762e851df399e..d005cc1946107 100644 --- a/build_tools/github/pylatest_conda_forge_cuda_array-api_linux-64_conda.lock +++ b/build_tools/github/pylatest_conda_forge_cuda_array-api_linux-64_conda.lock @@ -14,7 +14,7 @@ https://conda.anaconda.org/conda-forge/noarch/tzdata-2025b-h78e105d_0.conda#4222 https://conda.anaconda.org/conda-forge/noarch/fonts-conda-forge-1-0.tar.bz2#f766549260d6815b0c52253f1fb1bb29 https://conda.anaconda.org/conda-forge/linux-64/ld_impl_linux-64-2.43-h712a8e2_4.conda#01f8d123c96816249efd255a31ad7712 https://conda.anaconda.org/conda-forge/linux-64/libglvnd-1.7.0-ha4b6fd6_2.conda#434ca7e50e40f4918ab701e3facd59a0 -https://conda.anaconda.org/conda-forge/linux-64/llvm-openmp-20.1.2-h024ca30_0.conda#322da3c0641a7f0dafd5be6d3ea23d96 +https://conda.anaconda.org/conda-forge/linux-64/llvm-openmp-20.1.2-h024ca30_1.conda#39a3992c2624b8d8e6b4994dedf3102a https://conda.anaconda.org/conda-forge/noarch/sysroot_linux-64-2.17-h0157908_18.conda#460eba7851277ec1fd80a1a24080787a https://conda.anaconda.org/conda-forge/linux-64/_openmp_mutex-4.5-3_kmp_llvm.conda#ee5c2118262e30b972bc0b4db8ef0ba5 https://conda.anaconda.org/conda-forge/noarch/fonts-conda-ecosystem-1-0.tar.bz2#fee5683a3f04bd15cbd8318b096a27ab @@ -23,7 +23,7 @@ https://conda.anaconda.org/conda-forge/linux-64/libopengl-1.7.0-ha4b6fd6_2.conda https://conda.anaconda.org/conda-forge/linux-64/libgcc-14.2.0-h767d61c_2.conda#ef504d1acbd74b7cc6849ef8af47dd03 https://conda.anaconda.org/conda-forge/linux-64/alsa-lib-1.2.13-hb9d3cd8_0.conda#ae1370588aa6a5157c34c73e9bbb36a0 https://conda.anaconda.org/conda-forge/linux-64/aws-c-common-0.10.6-hb9d3cd8_0.conda#d7d4680337a14001b0e043e96529409b -https://conda.anaconda.org/conda-forge/linux-64/c-ares-1.34.4-hb9d3cd8_0.conda#e2775acf57efd5af15b8e3d1d74d72d3 +https://conda.anaconda.org/conda-forge/linux-64/c-ares-1.34.5-hb9d3cd8_0.conda#f7f0d6cc2dc986d42ac2689ec88192be https://conda.anaconda.org/conda-forge/linux-64/libbrotlicommon-1.1.0-hb9d3cd8_2.conda#41b599ed2b02abcfdd84302bff174b23 https://conda.anaconda.org/conda-forge/linux-64/libdeflate-1.23-h4ddbbb0_0.conda#8dfae1d2e74767e9ce36d5fa0d8605db https://conda.anaconda.org/conda-forge/linux-64/libexpat-2.7.0-h5888daf_0.conda#db0bfbe7dd197b68ad5f30333bae6ce0 @@ -39,7 +39,7 @@ https://conda.anaconda.org/conda-forge/linux-64/libuv-1.50.0-hb9d3cd8_0.conda#77 https://conda.anaconda.org/conda-forge/linux-64/libwebp-base-1.5.0-h851e524_0.conda#63f790534398730f59e1b899c3644d4a https://conda.anaconda.org/conda-forge/linux-64/libzlib-1.3.1-hb9d3cd8_2.conda#edb0dca6bc32e4f4789199455a1dbeb8 https://conda.anaconda.org/conda-forge/linux-64/ncurses-6.5-h2d0b736_3.conda#47e340acb35de30501a76c7c799c41d7 -https://conda.anaconda.org/conda-forge/linux-64/openssl-3.4.1-h7b32b05_0.conda#41adf927e746dc75ecf0ef841c454e48 +https://conda.anaconda.org/conda-forge/linux-64/openssl-3.5.0-h7b32b05_0.conda#bb539841f2a3fde210f387d00ed4bb9d https://conda.anaconda.org/conda-forge/linux-64/pthread-stubs-0.4-hb9d3cd8_1002.conda#b3c17d95b5a10c6e64a21fa17573e70e https://conda.anaconda.org/conda-forge/linux-64/xorg-libice-1.1.2-hb9d3cd8_0.conda#fb901ff28063514abb6046c9ec2c4a45 https://conda.anaconda.org/conda-forge/linux-64/xorg-libxau-1.0.12-hb9d3cd8_0.conda#f6ebe2cb3f82ba6c057dde5d9debe4f7 @@ -70,7 +70,7 @@ https://conda.anaconda.org/conda-forge/linux-64/libstdcxx-ng-14.2.0-h4852527_2.c https://conda.anaconda.org/conda-forge/linux-64/libuuid-2.38.1-h0b41bf4_0.conda#40b61aab5c7ba9ff276c41cfffe6b80b https://conda.anaconda.org/conda-forge/linux-64/libxcb-1.17.0-h8a09558_0.conda#92ed62436b625154323d40d5f2f11dd7 https://conda.anaconda.org/conda-forge/linux-64/lz4-c-1.10.0-h5888daf_1.conda#9de5350a85c4a20c685259b889aa6393 -https://conda.anaconda.org/conda-forge/linux-64/mysql-common-9.0.1-h266115a_5.conda#6cf2f0c19b0b7ff3d5349c9826c26a9e +https://conda.anaconda.org/conda-forge/linux-64/mysql-common-9.2.0-h266115a_0.conda#db22a0962c953e81a2a679ecb1fc6027 https://conda.anaconda.org/conda-forge/linux-64/pixman-0.44.2-h29eaf8c_0.conda#5e2a7acfa2c24188af39e7944e1b3604 https://conda.anaconda.org/conda-forge/linux-64/readline-8.2-h8c095d6_2.conda#283b96675859b20a825f8fa30f311446 https://conda.anaconda.org/conda-forge/linux-64/s2n-1.5.11-h072c03f_0.conda#5e8060d52f676a40edef0006a75c718f @@ -96,11 +96,11 @@ https://conda.anaconda.org/conda-forge/linux-64/libopenblas-0.3.29-pthreads_h94d https://conda.anaconda.org/conda-forge/linux-64/libprotobuf-5.28.2-h5b01275_0.conda#ab0bff36363bec94720275a681af8b83 https://conda.anaconda.org/conda-forge/linux-64/libre2-11-2024.07.02-hbbce691_2.conda#b2fede24428726dd867611664fb372e8 https://conda.anaconda.org/conda-forge/linux-64/libthrift-0.21.0-h0e7cc3e_0.conda#dcb95c0a98ba9ff737f7ae482aef7833 -https://conda.anaconda.org/conda-forge/linux-64/mysql-libs-9.0.1-he0572af_5.conda#d13932a2a61de7c0fb7864b592034a6e -https://conda.anaconda.org/conda-forge/linux-64/nccl-2.26.2.1-h03a54cd_0.conda#b7aa31f9c2be782418d3ab10ef4a6320 +https://conda.anaconda.org/conda-forge/linux-64/mysql-libs-9.2.0-he0572af_0.conda#93340b072c393d23c4700a1d40565dca +https://conda.anaconda.org/conda-forge/linux-64/nccl-2.26.2.1-h03a54cd_1.conda#07f874246d0987e94f8b94685bcc754c https://conda.anaconda.org/conda-forge/linux-64/ninja-1.12.1-h297d8ca_0.conda#3aa1c7e292afeff25a0091ddd7c69b72 https://conda.anaconda.org/conda-forge/linux-64/pcre2-10.44-hba22ea6_2.conda#df359c09c41cd186fffb93a2d87aa6f5 -https://conda.anaconda.org/conda-forge/linux-64/python-3.13.2-hf636f53_101_cp313.conda#a7902a3611fe773da3921cbbf7bc2c5c +https://conda.anaconda.org/conda-forge/linux-64/python-3.13.3-hf636f53_100_cp313.conda#6092d3c7241e67614af8e4d7b1fdf3ee https://conda.anaconda.org/conda-forge/linux-64/qhull-2020.2-h434a139_5.conda#353823361b1d27eb3960efb076dfcaf6 https://conda.anaconda.org/conda-forge/linux-64/wayland-1.23.1-h3e06ad9_0.conda#0a732427643ae5e0486a727927791da1 https://conda.anaconda.org/conda-forge/linux-64/xcb-util-0.4.1-hb711507_2.conda#8637c3e5821654d0edf97e2b0404b443 @@ -113,7 +113,7 @@ https://conda.anaconda.org/conda-forge/linux-64/aws-c-event-stream-0.5.0-h7959bf https://conda.anaconda.org/conda-forge/linux-64/aws-c-http-0.9.2-hefd7a92_4.conda#5ce4df662d32d3123ea8da15571b6f51 https://conda.anaconda.org/conda-forge/linux-64/brotli-1.1.0-hb9d3cd8_2.conda#98514fe74548d768907ce7a13f680e8f https://conda.anaconda.org/conda-forge/noarch/colorama-0.4.6-pyhd8ed1ab_1.conda#962b9857ee8e7018c22f2776ffa0b2d7 -https://conda.anaconda.org/conda-forge/noarch/cpython-3.13.2-py313hd8ed1ab_101.conda#d6be72c63da6e99ac2a1b87b120d135a +https://conda.anaconda.org/conda-forge/noarch/cpython-3.13.3-py313hd8ed1ab_100.conda#488690e9d736c1273ca839d853ca883b https://conda.anaconda.org/conda-forge/linux-64/cudnn-9.8.0.87-hf36481c_1.conda#988b6d0f8a2660fdee429d3d0f761ed3 https://conda.anaconda.org/conda-forge/noarch/cycler-0.12.1-pyhd8ed1ab_1.conda#44600c4667a319d67dbe0681fc0bc833 https://conda.anaconda.org/conda-forge/linux-64/cyrus-sasl-2.1.27-h54b06d7_7.conda#dce22f70b4e5a407ce88f2be046f4ceb @@ -146,7 +146,7 @@ https://conda.anaconda.org/conda-forge/noarch/pip-25.0.1-pyh145f28c_0.conda#9ba2 https://conda.anaconda.org/conda-forge/noarch/pluggy-1.5.0-pyhd8ed1ab_1.conda#e9dcbce5f45f9ee500e728ae58b605b6 https://conda.anaconda.org/conda-forge/noarch/pyparsing-3.2.3-pyhd8ed1ab_1.conda#513d3c262ee49b54a8fec85c5bc99764 https://conda.anaconda.org/conda-forge/noarch/python-tzdata-2025.2-pyhd8ed1ab_0.conda#88476ae6ebd24f39261e0854ac244f33 -https://conda.anaconda.org/conda-forge/noarch/pytz-2024.1-pyhd8ed1ab_0.conda#3eeeeb9e4827ace8c0c1419c85d590ad +https://conda.anaconda.org/conda-forge/noarch/pytz-2025.2-pyhd8ed1ab_0.conda#bc8e3267d44011051f2eb14d22fb0960 https://conda.anaconda.org/conda-forge/linux-64/re2-2024.07.02-h9925aae_2.conda#e84ddf12bde691e8ec894b00ea829ddf https://conda.anaconda.org/conda-forge/noarch/setuptools-78.1.0-pyhff2d567_0.conda#a42da9837e46c53494df0044c3eb1f53 https://conda.anaconda.org/conda-forge/noarch/six-1.17.0-pyhd8ed1ab_0.conda#a451d576819089b0d672f18768be0f65 @@ -154,7 +154,7 @@ https://conda.anaconda.org/conda-forge/noarch/threadpoolctl-3.6.0-pyhecae5ae_0.c https://conda.anaconda.org/conda-forge/noarch/toml-0.10.2-pyhd8ed1ab_1.conda#b0dd904de08b7db706167240bf37b164 https://conda.anaconda.org/conda-forge/noarch/tomli-2.2.1-pyhd8ed1ab_1.conda#ac944244f1fed2eb49bae07193ae8215 https://conda.anaconda.org/conda-forge/linux-64/tornado-6.4.2-py313h536fd9c_0.conda#5f5cbdd527d2e74e270d8b6255ba714f -https://conda.anaconda.org/conda-forge/noarch/typing_extensions-4.13.1-pyh29332c3_0.conda#5710c79a5fb0a6bfdba0a887f90583b1 +https://conda.anaconda.org/conda-forge/noarch/typing_extensions-4.13.2-pyh29332c3_0.conda#83fc6ae00127671e301c9f44254c31b8 https://conda.anaconda.org/conda-forge/linux-64/xcb-util-image-0.4.0-hb711507_2.conda#a0901183f08b6c7107aab109733a3c91 https://conda.anaconda.org/conda-forge/linux-64/xkeyboard-config-2.43-hb9d3cd8_0.conda#f725c7425d6d7c15e31f3b99a88ea02f https://conda.anaconda.org/conda-forge/linux-64/xorg-libxext-1.3.6-hb9d3cd8_0.conda#febbab7d15033c913d53c7a2c102309d @@ -197,7 +197,7 @@ https://conda.anaconda.org/conda-forge/linux-64/aws-c-s3-0.7.7-hf454442_0.conda# https://conda.anaconda.org/conda-forge/linux-64/azure-identity-cpp-1.10.0-h113e628_0.conda#73f73f60854f325a55f1d31459f2ab73 https://conda.anaconda.org/conda-forge/linux-64/azure-storage-common-cpp-12.8.0-h736e048_1.conda#13de36be8de3ae3f05ba127631599213 https://conda.anaconda.org/conda-forge/linux-64/gmpy2-2.1.5-py313h11186cd_3.conda#846a773cdc154eda7b86d7f4427432f2 -https://conda.anaconda.org/conda-forge/linux-64/harfbuzz-11.0.0-h76408a6_0.conda#347cb348bfc8d77062daee11c326e518 +https://conda.anaconda.org/conda-forge/linux-64/harfbuzz-11.0.1-h2c12942_0.conda#c90105cecb8bf8248f6666f1f5a40bbb https://conda.anaconda.org/conda-forge/linux-64/libclang-cpp20.1-20.1.2-default_hb5137d0_0.conda#729198eae19e9dbf8e0ffe355d416bde https://conda.anaconda.org/conda-forge/linux-64/libclang13-20.1.2-default_h9c6a7e4_0.conda#c5fe177150aecc6ec46609b0a6123f39 https://conda.anaconda.org/conda-forge/linux-64/libgoogle-cloud-2.32.0-h804f50b_0.conda#3d96df4d6b1c88455e05b94ce8a14a53 @@ -220,9 +220,9 @@ https://conda.anaconda.org/conda-forge/linux-64/cupy-core-13.4.1-py313hc2a895b_0 https://conda.anaconda.org/conda-forge/linux-64/libgoogle-cloud-storage-2.32.0-h0121fbd_0.conda#877a5ec0431a5af83bf0cd0522bfe661 https://conda.anaconda.org/conda-forge/linux-64/libmagma_sparse-2.8.0-h9ddd185_0.conda#f4eb3cfeaf9d91e72d5b2b8706bf059f https://conda.anaconda.org/conda-forge/linux-64/mkl-2024.2.2-ha957f24_16.conda#1459379c79dda834673426504d52b319 -https://conda.anaconda.org/conda-forge/linux-64/pandas-2.2.3-py313ha87cce1_1.conda#c5d63dd501db554b84a30dea33824164 -https://conda.anaconda.org/conda-forge/linux-64/polars-1.26.0-py313hae41bca_0.conda#14817d4747f3996cdf8efbba164c65b9 -https://conda.anaconda.org/conda-forge/linux-64/qt6-main-6.9.0-h6441bc3_0.conda#d3df16592e15a3f833cfc4d19ae58677 +https://conda.anaconda.org/conda-forge/linux-64/pandas-2.2.3-py313ha87cce1_3.conda#6248b529e537b1d4cb5ab3ef7f537795 +https://conda.anaconda.org/conda-forge/linux-64/polars-1.27.1-py313hae41bca_0.conda#acd55ae120e730edf3eb24de04b9d6f8 +https://conda.anaconda.org/conda-forge/linux-64/qt6-main-6.9.0-h6441bc3_1.conda#4029a8dcb1d97ea241dbe5abfda1fad6 https://conda.anaconda.org/conda-forge/linux-64/scipy-1.15.2-py313h86fcf2b_0.conda#ca68acd9febc86448eeed68d0c6c8643 https://conda.anaconda.org/conda-forge/noarch/sympy-1.13.3-pyh2585a3b_105.conda#254cd5083ffa04d96e3173397a3d30f4 https://conda.anaconda.org/conda-forge/linux-64/aws-sdk-cpp-1.11.458-hc430e4a_4.conda#aeefac461bea1f126653c1285cf5af08 From ab9f99736f22d7a3f0bce2da18f9b67ab5d183d3 Mon Sep 17 00:00:00 2001 From: scikit-learn-bot Date: Mon, 14 Apr 2025 11:00:27 +0200 Subject: [PATCH 046/182] :lock: :robot: CI Update lock files for scipy-dev CI build(s) :lock: :robot: (#31195) Co-authored-by: Lock file bot --- build_tools/azure/pylatest_pip_scipy_dev_linux-64_conda.lock | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/build_tools/azure/pylatest_pip_scipy_dev_linux-64_conda.lock b/build_tools/azure/pylatest_pip_scipy_dev_linux-64_conda.lock index 80f9a0972c976..588febeb58cd2 100644 --- a/build_tools/azure/pylatest_pip_scipy_dev_linux-64_conda.lock +++ b/build_tools/azure/pylatest_pip_scipy_dev_linux-64_conda.lock @@ -56,7 +56,7 @@ https://repo.anaconda.com/pkgs/main/linux-64/pip-25.0-py313h06a4308_0.conda#cbe2 # pip sphinxcontrib-serializinghtml @ https://files.pythonhosted.org/packages/52/a7/d2782e4e3f77c8450f727ba74a8f12756d5ba823d81b941f1b04da9d033a/sphinxcontrib_serializinghtml-2.0.0-py3-none-any.whl#sha256=6e2cb0eef194e10c27ec0023bfeb25badbbb5868244cf5bc5bdc04e4464bf331 # pip tabulate @ https://files.pythonhosted.org/packages/40/44/4a5f08c96eb108af5cb50b41f76142f0afa346dfa99d5296fe7202a11854/tabulate-0.9.0-py3-none-any.whl#sha256=024ca478df22e9340661486f85298cff5f6dcdba14f3813e8830015b9ed1948f # pip threadpoolctl @ https://files.pythonhosted.org/packages/32/d5/f9a850d79b0851d1d4ef6456097579a9005b31fea68726a4ae5f2d82ddd9/threadpoolctl-3.6.0-py3-none-any.whl#sha256=43a0b8fd5a2928500110039e43a5eed8480b918967083ea48dc3ab9f13c4a7fb -# pip urllib3 @ https://files.pythonhosted.org/packages/c8/19/4ec628951a74043532ca2cf5d97b7b14863931476d117c471e8e2b1eb39f/urllib3-2.3.0-py3-none-any.whl#sha256=1cee9ad369867bfdbbb48b7dd50374c0967a0bb7710050facf0dd6911440e3df +# pip urllib3 @ https://files.pythonhosted.org/packages/6b/11/cc635220681e93a0183390e26485430ca2c7b5f9d33b15c74c2861cb8091/urllib3-2.4.0-py3-none-any.whl#sha256=4e16665048960a0900c702d4a66415956a584919c03361cac9f1df5c5dd7e813 # pip jinja2 @ https://files.pythonhosted.org/packages/62/a1/3d680cbfd5f4b8f15abc1d571870c5fc3e594bb582bc3b64ea099db13e56/jinja2-3.1.6-py3-none-any.whl#sha256=85ece4451f492d0c13c5dd7c13a64681a86afae63a5f347908daf103ce6d2f67 # pip pyproject-metadata @ https://files.pythonhosted.org/packages/7e/b1/8e63033b259e0a4e40dd1ec4a9fee17718016845048b43a36ec67d62e6fe/pyproject_metadata-0.9.1-py3-none-any.whl#sha256=ee5efde548c3ed9b75a354fc319d5afd25e9585fa918a34f62f904cc731973ad # pip pytest @ https://files.pythonhosted.org/packages/30/3d/64ad57c803f1fa1e963a7946b6e0fea4a70df53c1a7fed304586539c2bac/pytest-8.3.5-py3-none-any.whl#sha256=c69214aa47deac29fad6c2a4f590b9c4a9fdb16a403176fe154b79c0b4d4d820 From b54e4deea62ee71110a00bf23c4c31421693ec42 Mon Sep 17 00:00:00 2001 From: scikit-learn-bot Date: Mon, 14 Apr 2025 11:00:52 +0200 Subject: [PATCH 047/182] :lock: :robot: CI Update lock files for free-threaded CI build(s) :lock: :robot: (#31196) Co-authored-by: Lock file bot --- .../azure/pylatest_free_threaded_linux-64_conda.lock | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/build_tools/azure/pylatest_free_threaded_linux-64_conda.lock b/build_tools/azure/pylatest_free_threaded_linux-64_conda.lock index 1cda1d57605b8..8b54191a48903 100644 --- a/build_tools/azure/pylatest_free_threaded_linux-64_conda.lock +++ b/build_tools/azure/pylatest_free_threaded_linux-64_conda.lock @@ -18,7 +18,7 @@ https://conda.anaconda.org/conda-forge/linux-64/liblzma-5.8.1-hb9d3cd8_0.conda#0 https://conda.anaconda.org/conda-forge/linux-64/libstdcxx-14.2.0-h8f9b012_2.conda#a78c856b6dc6bf4ea8daeb9beaaa3fb0 https://conda.anaconda.org/conda-forge/linux-64/libzlib-1.3.1-hb9d3cd8_2.conda#edb0dca6bc32e4f4789199455a1dbeb8 https://conda.anaconda.org/conda-forge/linux-64/ncurses-6.5-h2d0b736_3.conda#47e340acb35de30501a76c7c799c41d7 -https://conda.anaconda.org/conda-forge/linux-64/openssl-3.4.1-h7b32b05_0.conda#41adf927e746dc75ecf0ef841c454e48 +https://conda.anaconda.org/conda-forge/linux-64/openssl-3.5.0-h7b32b05_0.conda#bb539841f2a3fde210f387d00ed4bb9d https://conda.anaconda.org/conda-forge/linux-64/bzip2-1.0.8-h4bc722e_7.conda#62ee74e96c5ebb0af99386de58cf9553 https://conda.anaconda.org/conda-forge/linux-64/libgfortran-14.2.0-h69a702a_2.conda#fb54c4ea68b460c278d26eea89cfbcc3 https://conda.anaconda.org/conda-forge/linux-64/libmpdec-4.0.0-h4bc722e_0.conda#aeb98fdeb2e8f25d43ef71fbacbeec80 @@ -31,9 +31,9 @@ https://conda.anaconda.org/conda-forge/linux-64/zstd-1.5.7-hb8e6e7a_2.conda#6432 https://conda.anaconda.org/conda-forge/linux-64/libgfortran-ng-14.2.0-h69a702a_2.conda#4056c857af1a99ee50589a941059ec55 https://conda.anaconda.org/conda-forge/linux-64/libopenblas-0.3.29-pthreads_h94d23a6_0.conda#0a4d0252248ef9a0f88f2ba8b8a08e12 https://conda.anaconda.org/conda-forge/linux-64/ninja-1.12.1-h297d8ca_0.conda#3aa1c7e292afeff25a0091ddd7c69b72 -https://conda.anaconda.org/conda-forge/linux-64/python-3.13.2-h4724d56_1_cp313t.conda#b39c7927f40dee86fdb08e05995557a0 +https://conda.anaconda.org/conda-forge/linux-64/python-3.13.3-h4724d56_0_cp313t.conda#014d41d8e12e2bfe51dfed268ad56415 https://conda.anaconda.org/conda-forge/noarch/colorama-0.4.6-pyhd8ed1ab_1.conda#962b9857ee8e7018c22f2776ffa0b2d7 -https://conda.anaconda.org/conda-forge/noarch/cpython-3.13.2-py313hd8ed1ab_1.conda#51dbcb28815678a67a8b6564d3bb0901 +https://conda.anaconda.org/conda-forge/noarch/cpython-3.13.3-py313hd8ed1ab_0.conda#583ad91b845b5ec8916c57d386f55eb1 https://conda.anaconda.org/conda-forge/noarch/exceptiongroup-1.2.2-pyhd8ed1ab_1.conda#a16662747cdeb9abbac74d0057cc976e https://conda.anaconda.org/conda-forge/noarch/execnet-2.1.1-pyhd8ed1ab_1.conda#a71efeae2c160f6789900ba2631a2c90 https://conda.anaconda.org/conda-forge/noarch/iniconfig-2.0.0-pyhd8ed1ab_1.conda#6837f3eff7dcea42ecd714ce1ac2b108 @@ -52,7 +52,7 @@ https://conda.anaconda.org/conda-forge/linux-64/liblapack-3.9.0-31_h7ac8fdf_open https://conda.anaconda.org/conda-forge/noarch/meson-1.7.1-pyhd8ed1ab_0.conda#90018ee73b8741268027421ceac2809a https://conda.anaconda.org/conda-forge/noarch/pyproject-metadata-0.9.1-pyhd8ed1ab_0.conda#22ae7c6ea81e0c8661ef32168dda929b https://conda.anaconda.org/conda-forge/noarch/pytest-8.3.5-pyhd8ed1ab_0.conda#c3c9316209dec74a705a36797970c6be -https://conda.anaconda.org/conda-forge/noarch/python-freethreading-3.13.2-h92d6c8b_1.conda#e113f67f0de399caeaa57693237f2fd2 +https://conda.anaconda.org/conda-forge/noarch/python-freethreading-3.13.3-h92d6c8b_0.conda#7ac86a40ad1d4605171b44b37b221d6f https://conda.anaconda.org/conda-forge/noarch/meson-python-0.17.1-pyh70fd9c4_1.conda#7a02679229c6c2092571b4c025055440 https://conda.anaconda.org/conda-forge/linux-64/numpy-2.2.4-py313h103f029_0.conda#cb377445eaf9e539629c8249bbf324f4 https://conda.anaconda.org/conda-forge/noarch/pytest-xdist-3.6.1-pyhd8ed1ab_1.conda#59aad4fb37cabc0bacc73cf344612ddd From e24fe04936cdc7fd6f08804fc10243bcab207e4a Mon Sep 17 00:00:00 2001 From: scikit-learn-bot Date: Mon, 14 Apr 2025 11:03:35 +0200 Subject: [PATCH 048/182] :lock: :robot: CI Update lock files for main CI build(s) :lock: :robot: (#31197) Co-authored-by: Lock file bot --- ...latest_conda_forge_mkl_linux-64_conda.lock | 52 +++++++++---------- ...pylatest_conda_forge_mkl_osx-64_conda.lock | 49 +++++++++-------- ...test_conda_mkl_no_openmp_osx-64_conda.lock | 2 +- ...st_pip_openblas_pandas_linux-64_conda.lock | 4 +- .../pymin_conda_forge_mkl_win-64_conda.lock | 8 +-- ...nblas_min_dependencies_linux-64_conda.lock | 24 ++++----- ...e_openblas_ubuntu_2204_linux-64_conda.lock | 11 ++-- build_tools/circle/doc_linux-64_conda.lock | 26 +++++----- .../doc_min_dependencies_linux-64_conda.lock | 28 +++++----- ...n_conda_forge_arm_linux-aarch64_conda.lock | 12 ++--- 10 files changed, 108 insertions(+), 108 deletions(-) diff --git a/build_tools/azure/pylatest_conda_forge_mkl_linux-64_conda.lock b/build_tools/azure/pylatest_conda_forge_mkl_linux-64_conda.lock index a9ea47c37078e..27240ccac9a54 100644 --- a/build_tools/azure/pylatest_conda_forge_mkl_linux-64_conda.lock +++ b/build_tools/azure/pylatest_conda_forge_mkl_linux-64_conda.lock @@ -7,14 +7,15 @@ https://conda.anaconda.org/conda-forge/noarch/font-ttf-dejavu-sans-mono-2.37-hab https://conda.anaconda.org/conda-forge/noarch/font-ttf-inconsolata-3.000-h77eed37_0.tar.bz2#34893075a5c9e55cdafac56607368fc6 https://conda.anaconda.org/conda-forge/noarch/font-ttf-source-code-pro-2.038-h77eed37_0.tar.bz2#4d59c254e01d9cde7957100457e2d5fb https://conda.anaconda.org/conda-forge/noarch/font-ttf-ubuntu-0.83-h77eed37_3.conda#49023d73832ef61042f6a237cb2687e7 -https://conda.anaconda.org/conda-forge/linux-64/libopentelemetry-cpp-headers-1.19.0-ha770c72_0.conda#6a85954c6b124241afa7d3d1897321e2 +https://conda.anaconda.org/conda-forge/linux-64/libopentelemetry-cpp-headers-1.20.0-ha770c72_0.conda#96806e6c31dc89253daff2134aeb58f3 https://conda.anaconda.org/conda-forge/linux-64/mkl-include-2024.2.2-ha957f24_16.conda#42b0d14354b5910a9f41e29289914f6b +https://conda.anaconda.org/conda-forge/linux-64/nlohmann_json-3.12.0-h3f2d84a_0.conda#d76872d096d063e226482c99337209dc https://conda.anaconda.org/conda-forge/linux-64/python_abi-3.13-6_cp313.conda#ef1d8e55d61220011cceed0b94a920d2 https://conda.anaconda.org/conda-forge/noarch/tzdata-2025b-h78e105d_0.conda#4222072737ccff51314b5ece9c7d6f5a https://conda.anaconda.org/conda-forge/noarch/fonts-conda-forge-1-0.tar.bz2#f766549260d6815b0c52253f1fb1bb29 https://conda.anaconda.org/conda-forge/linux-64/ld_impl_linux-64-2.43-h712a8e2_4.conda#01f8d123c96816249efd255a31ad7712 https://conda.anaconda.org/conda-forge/linux-64/libglvnd-1.7.0-ha4b6fd6_2.conda#434ca7e50e40f4918ab701e3facd59a0 -https://conda.anaconda.org/conda-forge/linux-64/llvm-openmp-20.1.2-h024ca30_0.conda#322da3c0641a7f0dafd5be6d3ea23d96 +https://conda.anaconda.org/conda-forge/linux-64/llvm-openmp-20.1.2-h024ca30_1.conda#39a3992c2624b8d8e6b4994dedf3102a https://conda.anaconda.org/conda-forge/linux-64/_openmp_mutex-4.5-3_kmp_llvm.conda#ee5c2118262e30b972bc0b4db8ef0ba5 https://conda.anaconda.org/conda-forge/noarch/fonts-conda-ecosystem-1-0.tar.bz2#fee5683a3f04bd15cbd8318b096a27ab https://conda.anaconda.org/conda-forge/linux-64/libegl-1.7.0-ha4b6fd6_2.conda#c151d5eb730e9b7480e6d48c0fc44048 @@ -22,7 +23,7 @@ https://conda.anaconda.org/conda-forge/linux-64/libopengl-1.7.0-ha4b6fd6_2.conda https://conda.anaconda.org/conda-forge/linux-64/libgcc-14.2.0-h767d61c_2.conda#ef504d1acbd74b7cc6849ef8af47dd03 https://conda.anaconda.org/conda-forge/linux-64/alsa-lib-1.2.13-hb9d3cd8_0.conda#ae1370588aa6a5157c34c73e9bbb36a0 https://conda.anaconda.org/conda-forge/linux-64/aws-c-common-0.12.1-hb9d3cd8_0.conda#eac0ac2d6cf8c0aba9d2028bff9a4374 -https://conda.anaconda.org/conda-forge/linux-64/c-ares-1.34.4-hb9d3cd8_0.conda#e2775acf57efd5af15b8e3d1d74d72d3 +https://conda.anaconda.org/conda-forge/linux-64/c-ares-1.34.5-hb9d3cd8_0.conda#f7f0d6cc2dc986d42ac2689ec88192be https://conda.anaconda.org/conda-forge/linux-64/libbrotlicommon-1.1.0-hb9d3cd8_2.conda#41b599ed2b02abcfdd84302bff174b23 https://conda.anaconda.org/conda-forge/linux-64/libdeflate-1.23-h4ddbbb0_0.conda#8dfae1d2e74767e9ce36d5fa0d8605db https://conda.anaconda.org/conda-forge/linux-64/libexpat-2.7.0-h5888daf_0.conda#db0bfbe7dd197b68ad5f30333bae6ce0 @@ -38,7 +39,7 @@ https://conda.anaconda.org/conda-forge/linux-64/libuv-1.50.0-hb9d3cd8_0.conda#77 https://conda.anaconda.org/conda-forge/linux-64/libwebp-base-1.5.0-h851e524_0.conda#63f790534398730f59e1b899c3644d4a https://conda.anaconda.org/conda-forge/linux-64/libzlib-1.3.1-hb9d3cd8_2.conda#edb0dca6bc32e4f4789199455a1dbeb8 https://conda.anaconda.org/conda-forge/linux-64/ncurses-6.5-h2d0b736_3.conda#47e340acb35de30501a76c7c799c41d7 -https://conda.anaconda.org/conda-forge/linux-64/openssl-3.4.1-h7b32b05_0.conda#41adf927e746dc75ecf0ef841c454e48 +https://conda.anaconda.org/conda-forge/linux-64/openssl-3.5.0-h7b32b05_0.conda#bb539841f2a3fde210f387d00ed4bb9d https://conda.anaconda.org/conda-forge/linux-64/pthread-stubs-0.4-hb9d3cd8_1002.conda#b3c17d95b5a10c6e64a21fa17573e70e https://conda.anaconda.org/conda-forge/linux-64/xorg-libice-1.1.2-hb9d3cd8_0.conda#fb901ff28063514abb6046c9ec2c4a45 https://conda.anaconda.org/conda-forge/linux-64/xorg-libxau-1.0.12-hb9d3cd8_0.conda#f6ebe2cb3f82ba6c057dde5d9debe4f7 @@ -69,7 +70,7 @@ https://conda.anaconda.org/conda-forge/linux-64/libstdcxx-ng-14.2.0-h4852527_2.c https://conda.anaconda.org/conda-forge/linux-64/libuuid-2.38.1-h0b41bf4_0.conda#40b61aab5c7ba9ff276c41cfffe6b80b https://conda.anaconda.org/conda-forge/linux-64/libxcb-1.17.0-h8a09558_0.conda#92ed62436b625154323d40d5f2f11dd7 https://conda.anaconda.org/conda-forge/linux-64/lz4-c-1.10.0-h5888daf_1.conda#9de5350a85c4a20c685259b889aa6393 -https://conda.anaconda.org/conda-forge/linux-64/mysql-common-9.0.1-h266115a_5.conda#6cf2f0c19b0b7ff3d5349c9826c26a9e +https://conda.anaconda.org/conda-forge/linux-64/mysql-common-9.2.0-h266115a_0.conda#db22a0962c953e81a2a679ecb1fc6027 https://conda.anaconda.org/conda-forge/linux-64/pixman-0.44.2-h29eaf8c_0.conda#5e2a7acfa2c24188af39e7944e1b3604 https://conda.anaconda.org/conda-forge/linux-64/readline-8.2-h8c095d6_2.conda#283b96675859b20a825f8fa30f311446 https://conda.anaconda.org/conda-forge/linux-64/s2n-1.5.15-hd830067_0.conda#81bde3ad0187adf0dd37fe86e84aff46 @@ -94,11 +95,10 @@ https://conda.anaconda.org/conda-forge/linux-64/libnghttp2-1.64.0-h161d5f1_0.con https://conda.anaconda.org/conda-forge/linux-64/libprotobuf-5.29.3-h501fc15_0.conda#452518a9744fbac05fb45531979bdf29 https://conda.anaconda.org/conda-forge/linux-64/libre2-11-2024.07.02-hba17884_3.conda#545e93a513c10603327c76c15485e946 https://conda.anaconda.org/conda-forge/linux-64/libthrift-0.21.0-h0e7cc3e_0.conda#dcb95c0a98ba9ff737f7ae482aef7833 -https://conda.anaconda.org/conda-forge/linux-64/mysql-libs-9.0.1-he0572af_5.conda#d13932a2a61de7c0fb7864b592034a6e +https://conda.anaconda.org/conda-forge/linux-64/mysql-libs-9.2.0-he0572af_0.conda#93340b072c393d23c4700a1d40565dca https://conda.anaconda.org/conda-forge/linux-64/ninja-1.12.1-h297d8ca_0.conda#3aa1c7e292afeff25a0091ddd7c69b72 -https://conda.anaconda.org/conda-forge/linux-64/nlohmann_json-3.11.3-he02047a_1.conda#e46f7ac4917215b49df2ea09a694a3fa https://conda.anaconda.org/conda-forge/linux-64/pcre2-10.44-hba22ea6_2.conda#df359c09c41cd186fffb93a2d87aa6f5 -https://conda.anaconda.org/conda-forge/linux-64/python-3.13.2-hf636f53_101_cp313.conda#a7902a3611fe773da3921cbbf7bc2c5c +https://conda.anaconda.org/conda-forge/linux-64/python-3.13.3-hf636f53_100_cp313.conda#6092d3c7241e67614af8e4d7b1fdf3ee https://conda.anaconda.org/conda-forge/linux-64/qhull-2020.2-h434a139_5.conda#353823361b1d27eb3960efb076dfcaf6 https://conda.anaconda.org/conda-forge/linux-64/wayland-1.23.1-h3e06ad9_0.conda#0a732427643ae5e0486a727927791da1 https://conda.anaconda.org/conda-forge/linux-64/xcb-util-0.4.1-hb711507_2.conda#8637c3e5821654d0edf97e2b0404b443 @@ -111,7 +111,7 @@ https://conda.anaconda.org/conda-forge/linux-64/aws-c-event-stream-0.5.4-h286e7e https://conda.anaconda.org/conda-forge/linux-64/aws-c-http-0.9.5-hbca0721_0.conda#9cb70e8f68551738d478117fe973c114 https://conda.anaconda.org/conda-forge/linux-64/brotli-1.1.0-hb9d3cd8_2.conda#98514fe74548d768907ce7a13f680e8f https://conda.anaconda.org/conda-forge/noarch/colorama-0.4.6-pyhd8ed1ab_1.conda#962b9857ee8e7018c22f2776ffa0b2d7 -https://conda.anaconda.org/conda-forge/noarch/cpython-3.13.2-py313hd8ed1ab_101.conda#d6be72c63da6e99ac2a1b87b120d135a +https://conda.anaconda.org/conda-forge/noarch/cpython-3.13.3-py313hd8ed1ab_100.conda#488690e9d736c1273ca839d853ca883b https://conda.anaconda.org/conda-forge/noarch/cycler-0.12.1-pyhd8ed1ab_1.conda#44600c4667a319d67dbe0681fc0bc833 https://conda.anaconda.org/conda-forge/linux-64/cyrus-sasl-2.1.27-h54b06d7_7.conda#dce22f70b4e5a407ce88f2be046f4ceb https://conda.anaconda.org/conda-forge/linux-64/cython-3.0.12-py313h5dec8f5_0.conda#24a42a0c1cc33743e33572d63d489b54 @@ -141,7 +141,7 @@ https://conda.anaconda.org/conda-forge/noarch/pluggy-1.5.0-pyhd8ed1ab_1.conda#e9 https://conda.anaconda.org/conda-forge/noarch/pybind11-global-2.13.6-pyh415d2e4_2.conda#120541563e520d12d8e39abd7de9092c https://conda.anaconda.org/conda-forge/noarch/pyparsing-3.2.3-pyhd8ed1ab_1.conda#513d3c262ee49b54a8fec85c5bc99764 https://conda.anaconda.org/conda-forge/noarch/python-tzdata-2025.2-pyhd8ed1ab_0.conda#88476ae6ebd24f39261e0854ac244f33 -https://conda.anaconda.org/conda-forge/noarch/pytz-2024.1-pyhd8ed1ab_0.conda#3eeeeb9e4827ace8c0c1419c85d590ad +https://conda.anaconda.org/conda-forge/noarch/pytz-2025.2-pyhd8ed1ab_0.conda#bc8e3267d44011051f2eb14d22fb0960 https://conda.anaconda.org/conda-forge/linux-64/re2-2024.07.02-h9925aae_3.conda#6f445fb139c356f903746b2b91bbe786 https://conda.anaconda.org/conda-forge/noarch/setuptools-75.8.2-pyhff2d567_0.conda#9bddfdbf4e061821a1a443f93223be61 https://conda.anaconda.org/conda-forge/noarch/six-1.17.0-pyhd8ed1ab_0.conda#a451d576819089b0d672f18768be0f65 @@ -149,7 +149,7 @@ https://conda.anaconda.org/conda-forge/noarch/threadpoolctl-3.6.0-pyhecae5ae_0.c https://conda.anaconda.org/conda-forge/noarch/toml-0.10.2-pyhd8ed1ab_1.conda#b0dd904de08b7db706167240bf37b164 https://conda.anaconda.org/conda-forge/noarch/tomli-2.2.1-pyhd8ed1ab_1.conda#ac944244f1fed2eb49bae07193ae8215 https://conda.anaconda.org/conda-forge/linux-64/tornado-6.4.2-py313h536fd9c_0.conda#5f5cbdd527d2e74e270d8b6255ba714f -https://conda.anaconda.org/conda-forge/noarch/typing_extensions-4.13.1-pyh29332c3_0.conda#5710c79a5fb0a6bfdba0a887f90583b1 +https://conda.anaconda.org/conda-forge/noarch/typing_extensions-4.13.2-pyh29332c3_0.conda#83fc6ae00127671e301c9f44254c31b8 https://conda.anaconda.org/conda-forge/linux-64/xcb-util-image-0.4.0-hb711507_2.conda#a0901183f08b6c7107aab109733a3c91 https://conda.anaconda.org/conda-forge/linux-64/xkeyboard-config-2.43-hb9d3cd8_0.conda#f725c7425d6d7c15e31f3b99a88ea02f https://conda.anaconda.org/conda-forge/linux-64/xorg-libxext-1.3.6-hb9d3cd8_0.conda#febbab7d15033c913d53c7a2c102309d @@ -181,7 +181,7 @@ https://conda.anaconda.org/conda-forge/noarch/pybind11-2.13.6-pyh1ec8472_2.conda https://conda.anaconda.org/conda-forge/noarch/pyproject-metadata-0.9.1-pyhd8ed1ab_0.conda#22ae7c6ea81e0c8661ef32168dda929b https://conda.anaconda.org/conda-forge/noarch/pytest-8.3.5-pyhd8ed1ab_0.conda#c3c9316209dec74a705a36797970c6be https://conda.anaconda.org/conda-forge/noarch/python-dateutil-2.9.0.post0-pyhff2d567_1.conda#5ba79d7c71f03c678c8ead841f347d6e -https://conda.anaconda.org/conda-forge/noarch/typing-extensions-4.13.1-hf5ce1d7_0.conda#e37cf790f710cf72fd13dcb6b2d4370c +https://conda.anaconda.org/conda-forge/noarch/typing-extensions-4.13.2-h0e9735f_0.conda#568ed1300869dca0ba09fb750cda5dbb https://conda.anaconda.org/conda-forge/linux-64/xcb-util-cursor-0.1.5-hb9d3cd8_0.conda#eb44b3b6deb1cab08d72cb61686fe64c https://conda.anaconda.org/conda-forge/linux-64/xorg-libxcomposite-0.4.6-hb9d3cd8_2.conda#d3c295b50f092ab525ffe3c2aa4b7413 https://conda.anaconda.org/conda-forge/linux-64/xorg-libxcursor-1.2.3-hb9d3cd8_0.conda#2ccd714aa2242315acaf0a67faea780b @@ -193,14 +193,14 @@ https://conda.anaconda.org/conda-forge/linux-64/aws-c-s3-0.7.13-h4c9fe3b_3.conda https://conda.anaconda.org/conda-forge/linux-64/azure-identity-cpp-1.10.0-h113e628_0.conda#73f73f60854f325a55f1d31459f2ab73 https://conda.anaconda.org/conda-forge/linux-64/azure-storage-common-cpp-12.8.0-h736e048_1.conda#13de36be8de3ae3f05ba127631599213 https://conda.anaconda.org/conda-forge/linux-64/gmpy2-2.1.5-py313h11186cd_3.conda#846a773cdc154eda7b86d7f4427432f2 -https://conda.anaconda.org/conda-forge/linux-64/harfbuzz-11.0.0-h76408a6_0.conda#347cb348bfc8d77062daee11c326e518 +https://conda.anaconda.org/conda-forge/linux-64/harfbuzz-11.0.1-h2c12942_0.conda#c90105cecb8bf8248f6666f1f5a40bbb https://conda.anaconda.org/conda-forge/linux-64/libclang-cpp20.1-20.1.2-default_hb5137d0_0.conda#729198eae19e9dbf8e0ffe355d416bde https://conda.anaconda.org/conda-forge/linux-64/libclang13-20.1.2-default_h9c6a7e4_0.conda#c5fe177150aecc6ec46609b0a6123f39 https://conda.anaconda.org/conda-forge/linux-64/libgoogle-cloud-2.36.0-hc4361e1_1.conda#ae36e6296a8dd8e8a9a8375965bf6398 -https://conda.anaconda.org/conda-forge/linux-64/libopentelemetry-cpp-1.19.0-hd1b1c89_0.conda#21fdfc7394cf73e8f5d46e66a1eeed09 +https://conda.anaconda.org/conda-forge/linux-64/libopentelemetry-cpp-1.20.0-hd1b1c89_0.conda#e1185384cc23e3bbf85486987835df94 https://conda.anaconda.org/conda-forge/linux-64/libpq-17.4-h27ae623_1.conda#37fba334855ef3b51549308e61ed7a3d https://conda.anaconda.org/conda-forge/noarch/meson-python-0.17.1-pyh70fd9c4_1.conda#7a02679229c6c2092571b4c025055440 -https://conda.anaconda.org/conda-forge/linux-64/optree-0.14.1-py313h33d0bda_1.conda#951a8b89db3ca099f93586919c03226d +https://conda.anaconda.org/conda-forge/linux-64/optree-0.15.0-py313h33d0bda_0.conda#151f92ff0806c7c700419c8b8cf7cb4b https://conda.anaconda.org/conda-forge/linux-64/pillow-11.1.0-py313h8db990d_0.conda#1e86810c6c3fb6d6aebdba26564eb2e8 https://conda.anaconda.org/conda-forge/noarch/pytest-cov-6.1.1-pyhd8ed1ab_0.conda#1e35d8f975bc0e984a19819aa91c440a https://conda.anaconda.org/conda-forge/noarch/pytest-xdist-3.6.1-pyhd8ed1ab_1.conda#59aad4fb37cabc0bacc73cf344612ddd @@ -210,35 +210,35 @@ https://conda.anaconda.org/conda-forge/linux-64/aws-crt-cpp-0.31.1-h46b750d_1.co https://conda.anaconda.org/conda-forge/linux-64/azure-storage-blobs-cpp-12.13.0-h3cf044e_1.conda#7eb66060455c7a47d9dcdbfa9f46579b https://conda.anaconda.org/conda-forge/linux-64/libgoogle-cloud-storage-2.36.0-h0121fbd_1.conda#a0f7588c1f0a26d550e7bae4fb49427a https://conda.anaconda.org/conda-forge/linux-64/mkl-2024.2.2-ha957f24_16.conda#1459379c79dda834673426504d52b319 -https://conda.anaconda.org/conda-forge/linux-64/qt6-main-6.9.0-h6441bc3_0.conda#d3df16592e15a3f833cfc4d19ae58677 +https://conda.anaconda.org/conda-forge/linux-64/qt6-main-6.9.0-h6441bc3_1.conda#4029a8dcb1d97ea241dbe5abfda1fad6 https://conda.anaconda.org/conda-forge/noarch/sympy-1.13.3-pyh2585a3b_105.conda#254cd5083ffa04d96e3173397a3d30f4 https://conda.anaconda.org/conda-forge/linux-64/aws-sdk-cpp-1.11.510-h1fa5cb7_4.conda#b2269aa463cefee750c73da2baf8d583 https://conda.anaconda.org/conda-forge/linux-64/azure-storage-files-datalake-cpp-12.12.0-ha633028_1.conda#7c1980f89dd41b097549782121a73490 https://conda.anaconda.org/conda-forge/linux-64/libblas-3.9.0-31_hfdb39a5_mkl.conda#bdf4a57254e8248222cb631db4393ff1 https://conda.anaconda.org/conda-forge/linux-64/mkl-devel-2024.2.2-ha770c72_16.conda#140891ea14285fc634353b31e9e40a95 https://conda.anaconda.org/conda-forge/linux-64/pyside6-6.9.0-py313h5f61773_0.conda#f51f25ec8fcbf777f8b186bb5deeed40 -https://conda.anaconda.org/conda-forge/linux-64/libarrow-19.0.1-h052fb8e_6_cpu.conda#eb77601ca27712a919673aec187e941f +https://conda.anaconda.org/conda-forge/linux-64/libarrow-19.0.1-hb90904d_7_cpu.conda#cb63f3394929ba771ac798bbda23dfc9 https://conda.anaconda.org/conda-forge/linux-64/libcblas-3.9.0-31_h372d94f_mkl.conda#2a06a6c16b45bd3d10002927ca204b67 https://conda.anaconda.org/conda-forge/linux-64/liblapack-3.9.0-31_hc41d3b0_mkl.conda#10d012ddd7cc1c7ff9093d4974a34e53 -https://conda.anaconda.org/conda-forge/linux-64/libarrow-acero-19.0.1-hcb10f89_6_cpu.conda#758177a069e22e081f0ab3dcb03174c0 +https://conda.anaconda.org/conda-forge/linux-64/libarrow-acero-19.0.1-hcb10f89_7_cpu.conda#90382dd59eecda17d7c639b8c921d5d4 https://conda.anaconda.org/conda-forge/linux-64/liblapacke-3.9.0-31_hbc6e62b_mkl.conda#562026e418363dc346ad5a9e18cce73c -https://conda.anaconda.org/conda-forge/linux-64/libparquet-19.0.1-h081d1f1_6_cpu.conda#f5dc9977d49bdb7b521e2cc96369c1c0 -https://conda.anaconda.org/conda-forge/linux-64/libtorch-2.6.0-cpu_mkl_hec71012_103.conda#f5c1ba21fa4f28b26f518c1954fd8125 +https://conda.anaconda.org/conda-forge/linux-64/libparquet-19.0.1-h081d1f1_7_cpu.conda#9fa0679126b39a5b9d77063430fe9607 +https://conda.anaconda.org/conda-forge/linux-64/libtorch-2.6.0-cpu_mkl_hf6ddc5a_104.conda#828146bb6100e9a4217e8351b18c8e83 https://conda.anaconda.org/conda-forge/linux-64/numpy-2.2.4-py313h17eae1a_0.conda#6c905a8f170edd64f3a390c76572e331 https://conda.anaconda.org/conda-forge/linux-64/pyarrow-core-19.0.1-py313he5f92c8_0_cpu.conda#7d8649531c807b24295c8f9a0a396a78 https://conda.anaconda.org/conda-forge/noarch/array-api-strict-2.3.1-pyhd8ed1ab_0.conda#11107d0aeb8c590a34fee0894909816b https://conda.anaconda.org/conda-forge/linux-64/blas-devel-3.9.0-31_hcf00494_mkl.conda#368c93bde87a67d24a74de15bf4c49fd https://conda.anaconda.org/conda-forge/linux-64/contourpy-1.3.1-py313h33d0bda_0.conda#6b6768e7c585d7029f79a04cbc4cbff0 -https://conda.anaconda.org/conda-forge/linux-64/libarrow-dataset-19.0.1-hcb10f89_6_cpu.conda#bc879ea62f1811a73d928c01762bedb1 -https://conda.anaconda.org/conda-forge/linux-64/pandas-2.2.3-py313ha87cce1_1.conda#c5d63dd501db554b84a30dea33824164 -https://conda.anaconda.org/conda-forge/linux-64/polars-1.26.0-py313hae41bca_0.conda#14817d4747f3996cdf8efbba164c65b9 -https://conda.anaconda.org/conda-forge/linux-64/pytorch-2.6.0-cpu_mkl_py313_h69cc176_103.conda#ca8a8e8ce4ce7fd935f17d6475deba20 +https://conda.anaconda.org/conda-forge/linux-64/libarrow-dataset-19.0.1-hcb10f89_7_cpu.conda#14adc5f9f5f602e03538a16540c05784 +https://conda.anaconda.org/conda-forge/linux-64/pandas-2.2.3-py313ha87cce1_3.conda#6248b529e537b1d4cb5ab3ef7f537795 +https://conda.anaconda.org/conda-forge/linux-64/polars-1.27.1-py313hae41bca_0.conda#acd55ae120e730edf3eb24de04b9d6f8 +https://conda.anaconda.org/conda-forge/linux-64/pytorch-2.6.0-cpu_mkl_py313_hea9ba1b_104.conda#5544fa15f47f4c53222f263eb51dd6b3 https://conda.anaconda.org/conda-forge/linux-64/scipy-1.15.2-py313h86fcf2b_0.conda#ca68acd9febc86448eeed68d0c6c8643 https://conda.anaconda.org/conda-forge/noarch/scipy-doctest-1.7.1-pyh29332c3_0.conda#d3b3b7b88385648eff6ae39694692f27 https://conda.anaconda.org/conda-forge/linux-64/blas-2.131-mkl.conda#9bb865b7e01104255ca54e61a58ded15 -https://conda.anaconda.org/conda-forge/linux-64/libarrow-substrait-19.0.1-h1bed206_6_cpu.conda#5bcca23c52ca5a0522b22814c4aff927 +https://conda.anaconda.org/conda-forge/linux-64/libarrow-substrait-19.0.1-h1bed206_7_cpu.conda#f75ac4838bdca785c0ab3339911704ee https://conda.anaconda.org/conda-forge/linux-64/matplotlib-base-3.10.1-py313h129903b_0.conda#4e23b3fabf434b418e0d9c6975a6453f https://conda.anaconda.org/conda-forge/linux-64/pyamg-5.2.1-py313hf0ab243_1.conda#4c769bf3858f424cb2ecf952175ec600 -https://conda.anaconda.org/conda-forge/linux-64/pytorch-cpu-2.6.0-cpu_mkl_hc60beec_103.conda#2c6ebe539ac8f9a75f3160dd551fb33e +https://conda.anaconda.org/conda-forge/linux-64/pytorch-cpu-2.6.0-cpu_mkl_hc60beec_104.conda#ccdc8b6254649dd4ed448b94fe80070e https://conda.anaconda.org/conda-forge/linux-64/matplotlib-3.10.1-py313h78bf25f_0.conda#d0c80dea550ca97fc0710b2ecef919ba https://conda.anaconda.org/conda-forge/linux-64/pyarrow-19.0.1-py313h78bf25f_0.conda#e8efe6998a383dd149787c83d3d6a92e diff --git a/build_tools/azure/pylatest_conda_forge_mkl_osx-64_conda.lock b/build_tools/azure/pylatest_conda_forge_mkl_osx-64_conda.lock index 2f38fa2545aeb..bdf929a58486a 100644 --- a/build_tools/azure/pylatest_conda_forge_mkl_osx-64_conda.lock +++ b/build_tools/azure/pylatest_conda_forge_mkl_osx-64_conda.lock @@ -7,6 +7,7 @@ https://conda.anaconda.org/conda-forge/noarch/libgfortran-devel_osx-64-13.3.0-h2 https://conda.anaconda.org/conda-forge/osx-64/libjpeg-turbo-3.0.0-h0dc2134_1.conda#72507f8e3961bc968af17435060b6dd6 https://conda.anaconda.org/conda-forge/osx-64/mkl-include-2023.2.0-h6bab518_50500.conda#835abb8ded5e26f23ea6996259c7972e https://conda.anaconda.org/conda-forge/osx-64/python_abi-3.13-6_cp313.conda#1867172dd3044e5c3db5772b81d67796 +https://conda.anaconda.org/conda-forge/osx-64/tbb-2021.10.0-h1c7c39f_2.conda#73434bcf87082942e938352afae9b0fa https://conda.anaconda.org/conda-forge/noarch/tzdata-2025b-h78e105d_0.conda#4222072737ccff51314b5ece9c7d6f5a https://conda.anaconda.org/conda-forge/osx-64/bzip2-1.0.8-hfdf4475_7.conda#7ed4301d437b59045be7e051a0308211 https://conda.anaconda.org/conda-forge/osx-64/icu-75.1-h120a0e1_0.conda#d68d48a3060eb5abdc1cdc8e2a3a5966 @@ -20,9 +21,9 @@ https://conda.anaconda.org/conda-forge/osx-64/liblzma-5.8.1-hd471939_0.conda#8e1 https://conda.anaconda.org/conda-forge/osx-64/libmpdec-4.0.0-hfdf4475_0.conda#ed625b2e59dff82859c23dd24774156b https://conda.anaconda.org/conda-forge/osx-64/libwebp-base-1.5.0-h6cf52b4_0.conda#5e0cefc99a231ac46ba21e27ae44689f https://conda.anaconda.org/conda-forge/osx-64/libzlib-1.3.1-hd23fc13_2.conda#003a54a4e32b02f7355b50a837e699da -https://conda.anaconda.org/conda-forge/osx-64/llvm-openmp-20.1.2-ha54dae1_0.conda#86e822e810ac7658cbed920d548f8398 +https://conda.anaconda.org/conda-forge/osx-64/llvm-openmp-20.1.2-ha54dae1_1.conda#0919db81cb42375dd9f2ab1ec032af94 https://conda.anaconda.org/conda-forge/osx-64/ncurses-6.5-h0622a9a_3.conda#ced34dd9929f491ca6dab6a2927aff25 -https://conda.anaconda.org/conda-forge/osx-64/openssl-3.4.1-hc426f3f_0.conda#a7d63f8e7ab23f71327ea6d27e2d5eae +https://conda.anaconda.org/conda-forge/osx-64/openssl-3.5.0-hc426f3f_0.conda#e06e13c34056b6334a7a1188b0f4c83c https://conda.anaconda.org/conda-forge/osx-64/pthread-stubs-0.4-h00291cd_1002.conda#8bcf980d2c6b17094961198284b8e862 https://conda.anaconda.org/conda-forge/osx-64/xorg-libxau-1.0.12-h6e16a3a_0.conda#4cf40e60b444d56512a64f39d12c20bd https://conda.anaconda.org/conda-forge/osx-64/xorg-libxdmcp-1.1.5-h00291cd_0.conda#9f438e1b6f4e73fd9e6d78bfe7c36743 @@ -37,6 +38,7 @@ https://conda.anaconda.org/conda-forge/osx-64/libpng-1.6.47-h3c4a55f_0.conda#846 https://conda.anaconda.org/conda-forge/osx-64/libsqlite-3.49.1-hdb6dae5_2.conda#1819e770584a7e83a81541d8253cbabe https://conda.anaconda.org/conda-forge/osx-64/libxcb-1.17.0-hf1f96e2_0.conda#bbeca862892e2898bdb45792a61c4afc https://conda.anaconda.org/conda-forge/osx-64/libxml2-2.14.0-hebb159f_1.conda#513da8e60b2bb7ea377095f86e262dd0 +https://conda.anaconda.org/conda-forge/osx-64/mkl-2023.2.0-h54c2260_50500.conda#0a342ccdc79e4fcd359245ac51941e7b https://conda.anaconda.org/conda-forge/osx-64/ninja-1.12.1-h3c5361c_0.conda#a0ebabd021c8191aeb82793fe43cfdcb https://conda.anaconda.org/conda-forge/osx-64/qhull-2020.2-h3c5361c_5.conda#dd1ea9ff27c93db7c01a7b7656bd4ad4 https://conda.anaconda.org/conda-forge/osx-64/readline-8.2-h7cca4af_2.conda#342570f8e02f2f022147a7f841475784 @@ -47,12 +49,13 @@ https://conda.anaconda.org/conda-forge/osx-64/zlib-1.3.1-hd23fc13_2.conda#c989e0 https://conda.anaconda.org/conda-forge/osx-64/zstd-1.5.7-h8210216_2.conda#cd60a4a5a8d6a476b30d8aa4bb49251a https://conda.anaconda.org/conda-forge/osx-64/brotli-bin-1.1.0-h00291cd_2.conda#049933ecbf552479a12c7917f0a4ce59 https://conda.anaconda.org/conda-forge/osx-64/freetype-2.13.3-h40dfd5c_0.conda#e391f0c2d07df272cf7c6df235e97bb9 +https://conda.anaconda.org/conda-forge/osx-64/libblas-3.9.0-20_osx64_mkl.conda#160fdc97a51d66d51dc782fb67d35205 https://conda.anaconda.org/conda-forge/osx-64/libgfortran-14.2.0-hef36b68_105.conda#6b27baf030f5d6603713c7e72d3f6b9a -https://conda.anaconda.org/conda-forge/osx-64/libhwloc-2.11.2-default_hb6fbd3b_1000.conda#b59efe292f2f737cfa48fea2d6fc95d6 https://conda.anaconda.org/conda-forge/osx-64/libllvm18-18.1.8-default_h3571c67_5.conda#01dd8559b569ad39b64fef0a61ded1e9 https://conda.anaconda.org/conda-forge/osx-64/libtiff-4.7.0-hb77a491_3.conda#6f2f9df7b093d6b33bc0c334acc7d2d9 +https://conda.anaconda.org/conda-forge/osx-64/mkl-devel-2023.2.0-h694c41f_50500.conda#1b4d0235ef253a1e19459351badf4f9f https://conda.anaconda.org/conda-forge/osx-64/mpfr-4.2.1-haed47dc_3.conda#d511e58aaaabfc23136880d9956fa7a6 -https://conda.anaconda.org/conda-forge/osx-64/python-3.13.2-h534c281_101_cp313.conda#2e883c630979a183e23a510d470194e2 +https://conda.anaconda.org/conda-forge/osx-64/python-3.13.3-h534c281_100_cp313.conda#b2da8b48105d2fa3eff867f5a07f8e3d https://conda.anaconda.org/conda-forge/osx-64/brotli-1.1.0-h00291cd_2.conda#2db0c38a7f2321c5bdaf32b181e832c7 https://conda.anaconda.org/conda-forge/noarch/colorama-0.4.6-pyhd8ed1ab_1.conda#962b9857ee8e7018c22f2776ffa0b2d7 https://conda.anaconda.org/conda-forge/noarch/cycler-0.12.1-pyhd8ed1ab_1.conda#44600c4667a319d67dbe0681fc0bc833 @@ -63,8 +66,10 @@ https://conda.anaconda.org/conda-forge/noarch/iniconfig-2.0.0-pyhd8ed1ab_1.conda https://conda.anaconda.org/conda-forge/osx-64/kiwisolver-1.4.7-py313h0c4e38b_0.conda#c37fceab459e104e77bb5456e219fc37 https://conda.anaconda.org/conda-forge/osx-64/lcms2-2.17-h72f5680_0.conda#bf210d0c63f2afb9e414a858b79f0eaa https://conda.anaconda.org/conda-forge/osx-64/ld64_osx-64-951.9-h33512f0_6.conda#6cd120f5c9dae65b858e1fad2b7959a0 -https://conda.anaconda.org/conda-forge/osx-64/libclang-cpp18.1-18.1.8-default_h3571c67_8.conda#1444a2cd1f78fccea7dacb658f8aeb39 +https://conda.anaconda.org/conda-forge/osx-64/libcblas-3.9.0-20_osx64_mkl.conda#51089a4865eb4aec2bc5c7468bd07f9f +https://conda.anaconda.org/conda-forge/osx-64/libclang-cpp18.1-18.1.8-default_h3571c67_9.conda#ef1a444913775b76f3391431967090a9 https://conda.anaconda.org/conda-forge/osx-64/libhiredis-1.0.2-h2beb688_0.tar.bz2#524282b2c46c9dedf051b3bc2ae05494 +https://conda.anaconda.org/conda-forge/osx-64/liblapack-3.9.0-20_osx64_mkl.conda#58f08e12ad487fac4a08f90ff0b87aec https://conda.anaconda.org/conda-forge/osx-64/llvm-tools-18-18.1.8-default_h3571c67_5.conda#4391981e855468ced32ca1940b3d7613 https://conda.anaconda.org/conda-forge/osx-64/mpc-1.3.1-h9d8efa1_1.conda#0520855aaae268ea413d6bc913f1384c https://conda.anaconda.org/conda-forge/noarch/munkres-1.1.4-pyh9f0ad1d_0.tar.bz2#2ba8498c1018c1e9c61eb99b973dfe19 @@ -74,53 +79,47 @@ https://conda.anaconda.org/conda-forge/noarch/pip-25.0.1-pyh145f28c_0.conda#9ba2 https://conda.anaconda.org/conda-forge/noarch/pluggy-1.5.0-pyhd8ed1ab_1.conda#e9dcbce5f45f9ee500e728ae58b605b6 https://conda.anaconda.org/conda-forge/noarch/pyparsing-3.2.3-pyhd8ed1ab_1.conda#513d3c262ee49b54a8fec85c5bc99764 https://conda.anaconda.org/conda-forge/noarch/python-tzdata-2025.2-pyhd8ed1ab_0.conda#88476ae6ebd24f39261e0854ac244f33 -https://conda.anaconda.org/conda-forge/noarch/pytz-2024.1-pyhd8ed1ab_0.conda#3eeeeb9e4827ace8c0c1419c85d590ad +https://conda.anaconda.org/conda-forge/noarch/pytz-2025.2-pyhd8ed1ab_0.conda#bc8e3267d44011051f2eb14d22fb0960 https://conda.anaconda.org/conda-forge/noarch/setuptools-78.1.0-pyhff2d567_0.conda#a42da9837e46c53494df0044c3eb1f53 https://conda.anaconda.org/conda-forge/noarch/six-1.17.0-pyhd8ed1ab_0.conda#a451d576819089b0d672f18768be0f65 -https://conda.anaconda.org/conda-forge/osx-64/tbb-2021.13.0-hb890de9_1.conda#284892942cdddfded53d090050b639a5 https://conda.anaconda.org/conda-forge/noarch/threadpoolctl-3.6.0-pyhecae5ae_0.conda#9d64911b31d57ca443e9f1e36b04385f https://conda.anaconda.org/conda-forge/noarch/toml-0.10.2-pyhd8ed1ab_1.conda#b0dd904de08b7db706167240bf37b164 https://conda.anaconda.org/conda-forge/noarch/tomli-2.2.1-pyhd8ed1ab_1.conda#ac944244f1fed2eb49bae07193ae8215 https://conda.anaconda.org/conda-forge/osx-64/tornado-6.4.2-py313h63b0ddb_0.conda#74a3a14f82dc65fa19f4fd4e2eb8da93 https://conda.anaconda.org/conda-forge/osx-64/ccache-4.11.2-h30d2cd9_0.conda#9412b5214abe467b2d70eaf8c65975a0 -https://conda.anaconda.org/conda-forge/osx-64/clang-18-18.1.8-default_h3571c67_8.conda#c40e72e808995df189d70d9a438d77ac +https://conda.anaconda.org/conda-forge/osx-64/clang-18-18.1.8-default_h3571c67_9.conda#e29d8d2866f15f3b167938cc0e775b2f https://conda.anaconda.org/conda-forge/osx-64/coverage-7.8.0-py313h717bdf5_0.conda#1215b56c8d9915318d1714cbd004035f https://conda.anaconda.org/conda-forge/osx-64/fonttools-4.57.0-py313h717bdf5_0.conda#190b8625dd6c38afe4f10e3be50122e4 https://conda.anaconda.org/conda-forge/osx-64/gfortran_impl_osx-64-13.3.0-hbf5bf67_105.conda#f56a107c8d1253346d01785ecece7977 https://conda.anaconda.org/conda-forge/noarch/joblib-1.4.2-pyhd8ed1ab_1.conda#bf8243ee348f3a10a14ed0cae323e0c1 https://conda.anaconda.org/conda-forge/osx-64/ld64-951.9-h4e51db5_6.conda#45bf526d53b1bc95bc0b932a91a41576 +https://conda.anaconda.org/conda-forge/osx-64/liblapacke-3.9.0-20_osx64_mkl.conda#124ae8e384268a8da66f1d64114a1eda https://conda.anaconda.org/conda-forge/osx-64/llvm-tools-18.1.8-default_h3571c67_5.conda#cc07ff74d2547da1f1452c42b67bafd6 https://conda.anaconda.org/conda-forge/noarch/meson-1.7.1-pyhd8ed1ab_0.conda#90018ee73b8741268027421ceac2809a -https://conda.anaconda.org/conda-forge/osx-64/mkl-2023.2.0-h54c2260_50500.conda#0a342ccdc79e4fcd359245ac51941e7b +https://conda.anaconda.org/conda-forge/osx-64/numpy-2.2.4-py313hc518a0f_0.conda#df79d8538f8677bd8a3b6b179e388f48 https://conda.anaconda.org/conda-forge/osx-64/pillow-11.1.0-py313h0c4f865_0.conda#11b4dd7a814202f2a0b655420f1c1c3a https://conda.anaconda.org/conda-forge/noarch/pyproject-metadata-0.9.1-pyhd8ed1ab_0.conda#22ae7c6ea81e0c8661ef32168dda929b https://conda.anaconda.org/conda-forge/noarch/pytest-8.3.5-pyhd8ed1ab_0.conda#c3c9316209dec74a705a36797970c6be https://conda.anaconda.org/conda-forge/noarch/python-dateutil-2.9.0.post0-pyhff2d567_1.conda#5ba79d7c71f03c678c8ead841f347d6e +https://conda.anaconda.org/conda-forge/osx-64/blas-devel-3.9.0-20_osx64_mkl.conda#cc3260179093918b801e373c6e888e02 https://conda.anaconda.org/conda-forge/osx-64/cctools_osx-64-1010.6-hd19c6af_6.conda#4694e9e497454a8ce5b9fb61e50d9c5d -https://conda.anaconda.org/conda-forge/osx-64/clang-18.1.8-default_h576c50e_8.conda#0a7a5caf8e1f0b52b96104bbd2ee677f -https://conda.anaconda.org/conda-forge/osx-64/libblas-3.9.0-20_osx64_mkl.conda#160fdc97a51d66d51dc782fb67d35205 +https://conda.anaconda.org/conda-forge/osx-64/clang-18.1.8-default_h576c50e_9.conda#266e7e8fa2190df09e6f236571c91511 +https://conda.anaconda.org/conda-forge/osx-64/contourpy-1.3.1-py313ha0b1807_0.conda#5ae850f4b044294bd7d655228fc236f9 https://conda.anaconda.org/conda-forge/noarch/meson-python-0.17.1-pyh70fd9c4_1.conda#7a02679229c6c2092571b4c025055440 -https://conda.anaconda.org/conda-forge/osx-64/mkl-devel-2023.2.0-h694c41f_50500.conda#1b4d0235ef253a1e19459351badf4f9f +https://conda.anaconda.org/conda-forge/osx-64/pandas-2.2.3-py313h2e7108f_3.conda#5c37fc7549913fc4895d7d2e097091ed https://conda.anaconda.org/conda-forge/noarch/pytest-cov-6.1.1-pyhd8ed1ab_0.conda#1e35d8f975bc0e984a19819aa91c440a https://conda.anaconda.org/conda-forge/noarch/pytest-xdist-3.6.1-pyhd8ed1ab_1.conda#59aad4fb37cabc0bacc73cf344612ddd -https://conda.anaconda.org/conda-forge/osx-64/cctools-1010.6-ha66f10e_6.conda#a126dcde2752751ac781b67238f7fac4 -https://conda.anaconda.org/conda-forge/osx-64/clangxx-18.1.8-default_heb2e8d1_8.conda#06a53a18fa886ec96f519b9022eeb449 -https://conda.anaconda.org/conda-forge/osx-64/libcblas-3.9.0-20_osx64_mkl.conda#51089a4865eb4aec2bc5c7468bd07f9f -https://conda.anaconda.org/conda-forge/osx-64/liblapack-3.9.0-20_osx64_mkl.conda#58f08e12ad487fac4a08f90ff0b87aec -https://conda.anaconda.org/conda-forge/noarch/compiler-rt_osx-64-18.1.8-hf2b8a54_1.conda#76f906e6bdc58976c5593f650290ae20 -https://conda.anaconda.org/conda-forge/osx-64/liblapacke-3.9.0-20_osx64_mkl.conda#124ae8e384268a8da66f1d64114a1eda -https://conda.anaconda.org/conda-forge/osx-64/numpy-2.2.4-py313hc518a0f_0.conda#df79d8538f8677bd8a3b6b179e388f48 -https://conda.anaconda.org/conda-forge/osx-64/blas-devel-3.9.0-20_osx64_mkl.conda#cc3260179093918b801e373c6e888e02 -https://conda.anaconda.org/conda-forge/osx-64/compiler-rt-18.1.8-h1020d70_1.conda#bc1714a1e73be18e411cff30dc1fe011 -https://conda.anaconda.org/conda-forge/osx-64/contourpy-1.3.1-py313ha0b1807_0.conda#5ae850f4b044294bd7d655228fc236f9 -https://conda.anaconda.org/conda-forge/osx-64/pandas-2.2.3-py313h38cdd20_1.conda#ab61fb255c951a0514616e92dd2e18b2 https://conda.anaconda.org/conda-forge/osx-64/scipy-1.15.2-py313h7e69c36_0.conda#53c23f87aedf2d139d54c88894c8a07f https://conda.anaconda.org/conda-forge/osx-64/blas-2.120-mkl.conda#b041a7677a412f3d925d8208936cb1e2 -https://conda.anaconda.org/conda-forge/osx-64/clang_impl_osx-64-18.1.8-h6a44ed1_24.conda#5224d53acc2604a86d790f664d7fcbc4 +https://conda.anaconda.org/conda-forge/osx-64/cctools-1010.6-ha66f10e_6.conda#a126dcde2752751ac781b67238f7fac4 +https://conda.anaconda.org/conda-forge/osx-64/clangxx-18.1.8-default_heb2e8d1_9.conda#4ba6bd39da787a7306eba77555e86dd3 https://conda.anaconda.org/conda-forge/osx-64/matplotlib-base-3.10.1-py313he981572_0.conda#45a80d45944fbc43f081d719b23bf366 https://conda.anaconda.org/conda-forge/osx-64/pyamg-5.2.1-py313h0322a6a_1.conda#4bda5182eeaef3d2017a2ec625802e1a -https://conda.anaconda.org/conda-forge/osx-64/clang_osx-64-18.1.8-h7e5c614_24.conda#24e1a9c1296772ec45bfcd6a0d855fa5 +https://conda.anaconda.org/conda-forge/noarch/compiler-rt_osx-64-18.1.8-hf2b8a54_1.conda#76f906e6bdc58976c5593f650290ae20 https://conda.anaconda.org/conda-forge/osx-64/matplotlib-3.10.1-py313habf4b1d_0.conda#81ea3344e4fc2066a38199a64738ca6b +https://conda.anaconda.org/conda-forge/osx-64/compiler-rt-18.1.8-h1020d70_1.conda#bc1714a1e73be18e411cff30dc1fe011 +https://conda.anaconda.org/conda-forge/osx-64/clang_impl_osx-64-18.1.8-h6a44ed1_24.conda#5224d53acc2604a86d790f664d7fcbc4 +https://conda.anaconda.org/conda-forge/osx-64/clang_osx-64-18.1.8-h7e5c614_24.conda#24e1a9c1296772ec45bfcd6a0d855fa5 https://conda.anaconda.org/conda-forge/osx-64/c-compiler-1.9.0-h09a7c41_0.conda#ab45badcb5d035d3bddfdbdd96e00967 https://conda.anaconda.org/conda-forge/osx-64/clangxx_impl_osx-64-18.1.8-h4b7810f_24.conda#9d27517a71e7268679f1c47e7f34e47b https://conda.anaconda.org/conda-forge/osx-64/gfortran_osx-64-13.3.0-h3223c34_1.conda#a6eeb1519091ac3239b88ee3914d6cb6 diff --git a/build_tools/azure/pylatest_conda_mkl_no_openmp_osx-64_conda.lock b/build_tools/azure/pylatest_conda_mkl_no_openmp_osx-64_conda.lock index a4d9900f69f1c..59c4c570255da 100644 --- a/build_tools/azure/pylatest_conda_mkl_no_openmp_osx-64_conda.lock +++ b/build_tools/azure/pylatest_conda_mkl_no_openmp_osx-64_conda.lock @@ -51,7 +51,7 @@ https://repo.anaconda.com/pkgs/main/osx-64/pyparsing-3.2.0-py312hecd8cb5_0.conda https://repo.anaconda.com/pkgs/main/noarch/python-tzdata-2023.3-pyhd3eb1b0_0.conda#479c037de0186d114b9911158427624e https://repo.anaconda.com/pkgs/main/osx-64/pytz-2024.1-py312hecd8cb5_0.conda#2b28ec0e0d07f5c0c701f75200b1e8b6 https://repo.anaconda.com/pkgs/main/osx-64/setuptools-75.8.0-py312hecd8cb5_0.conda#23bf9c15a65f2950af1716724c4e5396 -https://repo.anaconda.com/pkgs/main/noarch/six-1.16.0-pyhd3eb1b0_1.conda#34586824d411d36af2fa40e799c172d0 +https://repo.anaconda.com/pkgs/main/osx-64/six-1.17.0-py312hecd8cb5_0.conda#aadd782bc06426887ae0835eedd98ceb https://repo.anaconda.com/pkgs/main/noarch/toml-0.10.2-pyhd3eb1b0_0.conda#cda05f5f6d8509529d1a2743288d197a https://repo.anaconda.com/pkgs/main/osx-64/tornado-6.4.2-py312h46256e1_0.conda#6b41d7d8a2bf93ae3fc512202b14a9ec https://repo.anaconda.com/pkgs/main/osx-64/unicodedata2-15.1.0-py312h46256e1_1.conda#4a7fd1dec7277c8ab71aa11aa08df86b diff --git a/build_tools/azure/pylatest_pip_openblas_pandas_linux-64_conda.lock b/build_tools/azure/pylatest_pip_openblas_pandas_linux-64_conda.lock index d0f9fc7ddfdfb..764d7be1044d2 100644 --- a/build_tools/azure/pylatest_pip_openblas_pandas_linux-64_conda.lock +++ b/build_tools/azure/pylatest_pip_openblas_pandas_linux-64_conda.lock @@ -49,7 +49,7 @@ https://repo.anaconda.com/pkgs/main/linux-64/pip-25.0-py313h06a4308_0.conda#cbe2 # pip ninja @ https://files.pythonhosted.org/packages/eb/7a/455d2877fe6cf99886849c7f9755d897df32eaf3a0fba47b56e615f880f7/ninja-1.11.1.4-py3-none-manylinux_2_12_x86_64.manylinux2010_x86_64.whl#sha256=096487995473320de7f65d622c3f1d16c3ad174797602218ca8c967f51ec38a0 # pip numpy @ https://files.pythonhosted.org/packages/4b/04/e208ff3ae3ddfbafc05910f89546382f15a3f10186b1f56bd99f159689c2/numpy-2.2.4-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl#sha256=bce43e386c16898b91e162e5baaad90c4b06f9dcbe36282490032cec98dc8ae7 # pip packaging @ https://files.pythonhosted.org/packages/88/ef/eb23f262cca3c0c4eb7ab1933c3b1f03d021f2c48f54763065b6f0e321be/packaging-24.2-py3-none-any.whl#sha256=09abb1bccd265c01f4a3aa3f7a7db064b36514d2cba19a2f694fe6150451a759 -# pip pillow @ https://files.pythonhosted.org/packages/b4/d8/20a183f52b2703afb1243aa1cb80b3bbcfe32f75507615ca93889de24e71/pillow-11.2.0-cp313-cp313-manylinux_2_28_x86_64.whl#sha256=676461578f605c8e56ea108c371632e4bf40697996d80b5899c592043432e5f1 +# pip pillow @ https://files.pythonhosted.org/packages/13/eb/2552ecebc0b887f539111c2cd241f538b8ff5891b8903dfe672e997529be/pillow-11.2.1-cp313-cp313-manylinux_2_28_x86_64.whl#sha256=ad275964d52e2243430472fc5d2c2334b4fc3ff9c16cb0a19254e25efa03a155 # pip pluggy @ https://files.pythonhosted.org/packages/88/5f/e351af9a41f866ac3f1fac4ca0613908d9a41741cfcf2228f4ad853b697d/pluggy-1.5.0-py3-none-any.whl#sha256=44e1ad92c8ca002de6377e165f3e0f1be63266ab4d554740532335b9d75ea669 # pip pygments @ https://files.pythonhosted.org/packages/8a/0b/9fcc47d19c48b59121088dd6da2488a49d5f72dacf8262e2790a1d2c7d15/pygments-2.19.1-py3-none-any.whl#sha256=9ea1544ad55cecf4b8242fab6dd35a93bbce657034b0611ee383099054ab6d8c # pip pyparsing @ https://files.pythonhosted.org/packages/05/e7/df2285f3d08fee213f2d041540fa4fc9ca6c2d44cf36d3a035bf2a8d2bcc/pyparsing-3.2.3-py3-none-any.whl#sha256=a749938e02d6fd0b59b356ca504a24982314bb090c383e3cf201c95ef7e2bfcf @@ -66,7 +66,7 @@ https://repo.anaconda.com/pkgs/main/linux-64/pip-25.0-py313h06a4308_0.conda#cbe2 # pip tabulate @ https://files.pythonhosted.org/packages/40/44/4a5f08c96eb108af5cb50b41f76142f0afa346dfa99d5296fe7202a11854/tabulate-0.9.0-py3-none-any.whl#sha256=024ca478df22e9340661486f85298cff5f6dcdba14f3813e8830015b9ed1948f # pip threadpoolctl @ https://files.pythonhosted.org/packages/32/d5/f9a850d79b0851d1d4ef6456097579a9005b31fea68726a4ae5f2d82ddd9/threadpoolctl-3.6.0-py3-none-any.whl#sha256=43a0b8fd5a2928500110039e43a5eed8480b918967083ea48dc3ab9f13c4a7fb # pip tzdata @ https://files.pythonhosted.org/packages/5c/23/c7abc0ca0a1526a0774eca151daeb8de62ec457e77262b66b359c3c7679e/tzdata-2025.2-py2.py3-none-any.whl#sha256=1a403fada01ff9221ca8044d701868fa132215d84beb92242d9acd2147f667a8 -# pip urllib3 @ https://files.pythonhosted.org/packages/c8/19/4ec628951a74043532ca2cf5d97b7b14863931476d117c471e8e2b1eb39f/urllib3-2.3.0-py3-none-any.whl#sha256=1cee9ad369867bfdbbb48b7dd50374c0967a0bb7710050facf0dd6911440e3df +# pip urllib3 @ https://files.pythonhosted.org/packages/6b/11/cc635220681e93a0183390e26485430ca2c7b5f9d33b15c74c2861cb8091/urllib3-2.4.0-py3-none-any.whl#sha256=4e16665048960a0900c702d4a66415956a584919c03361cac9f1df5c5dd7e813 # pip array-api-strict @ https://files.pythonhosted.org/packages/fe/c7/a97e26083985b49a7a54006364348cf1c26e5523850b8522a39b02b19715/array_api_strict-2.3.1-py3-none-any.whl#sha256=0ca6988be1c82d2f05b6cd44bc7e14cb390555d1455deb50f431d6d0cf468ded # pip contourpy @ https://files.pythonhosted.org/packages/9a/e2/30ca086c692691129849198659bf0556d72a757fe2769eb9620a27169296/contourpy-1.3.1-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl#sha256=3ea9924d28fc5586bf0b42d15f590b10c224117e74409dd7a0be3b62b74a501c # pip imageio @ https://files.pythonhosted.org/packages/cb/bd/b394387b598ed84d8d0fa90611a90bee0adc2021820ad5729f7ced74a8e2/imageio-2.37.0-py3-none-any.whl#sha256=11efa15b87bc7871b61590326b2d635439acc321cf7f8ce996f812543ce10eed diff --git a/build_tools/azure/pymin_conda_forge_mkl_win-64_conda.lock b/build_tools/azure/pymin_conda_forge_mkl_win-64_conda.lock index d7488dccc0d05..01d522f9bfdeb 100644 --- a/build_tools/azure/pymin_conda_forge_mkl_win-64_conda.lock +++ b/build_tools/azure/pymin_conda_forge_mkl_win-64_conda.lock @@ -36,7 +36,7 @@ https://conda.anaconda.org/conda-forge/win-64/libsqlite-3.49.1-h67fdade_2.conda# https://conda.anaconda.org/conda-forge/win-64/libwebp-base-1.5.0-h3b0e114_0.conda#33f7313967072c6e6d8f865f5493c7ae https://conda.anaconda.org/conda-forge/win-64/libzlib-1.3.1-h2466b09_2.conda#41fbfac52c601159df6c01f875de31b9 https://conda.anaconda.org/conda-forge/win-64/ninja-1.12.1-hc790b64_0.conda#a557dde55343e03c68cd7e29e7f87279 -https://conda.anaconda.org/conda-forge/win-64/openssl-3.4.1-ha4e3fda_0.conda#0730f8094f7088592594f9bf3ae62b3f +https://conda.anaconda.org/conda-forge/win-64/openssl-3.5.0-ha4e3fda_0.conda#4ea7db75035eb8c13fa680bb90171e08 https://conda.anaconda.org/conda-forge/win-64/pixman-0.44.2-had0cd8c_0.conda#c720ac9a3bd825bf8b4dc7523ea49be4 https://conda.anaconda.org/conda-forge/win-64/qhull-2020.2-hc790b64_5.conda#854fbdff64b572b5c0b470f334d34c11 https://conda.anaconda.org/conda-forge/win-64/tk-8.6.13-h5226925_1.conda#fc048363eb8f03cd1737600a5d08aafe @@ -48,7 +48,7 @@ https://conda.anaconda.org/conda-forge/win-64/libintl-0.22.5-h5728263_3.conda#2c https://conda.anaconda.org/conda-forge/win-64/libpng-1.6.47-had7236b_0.conda#7d717163d9dab337c65f2bf21a676b8f https://conda.anaconda.org/conda-forge/win-64/libxml2-2.13.7-h442d1da_1.conda#c14ff7f05e57489df9244917d2b55763 https://conda.anaconda.org/conda-forge/win-64/pcre2-10.44-h3d7b363_2.conda#a3a3baddcfb8c80db84bec3cb7746fb8 -https://conda.anaconda.org/conda-forge/win-64/python-3.10.16-hfdde91d_2_cpython.conda#d4d056da0f59dc89bf5155901f096428 +https://conda.anaconda.org/conda-forge/win-64/python-3.10.17-h8c5b53a_0_cpython.conda#0c59918f056ab2e9c7bb45970d32b2ea https://conda.anaconda.org/conda-forge/win-64/zstd-1.5.7-hbeecb71_2.conda#21f56217d6125fb30c3c3f10c786d751 https://conda.anaconda.org/conda-forge/win-64/brotli-bin-1.1.0-h2466b09_2.conda#d22534a9be5771fc58eb7564947f669d https://conda.anaconda.org/conda-forge/noarch/colorama-0.4.6-pyhd8ed1ab_1.conda#962b9857ee8e7018c22f2776ffa0b2d7 @@ -99,12 +99,12 @@ https://conda.anaconda.org/conda-forge/win-64/mkl-2024.2.2-h66d3029_15.conda#302 https://conda.anaconda.org/conda-forge/win-64/pillow-11.1.0-py310h9595edc_0.conda#67a38507ac20bd85226fe6dd7ed87462 https://conda.anaconda.org/conda-forge/noarch/pytest-cov-6.1.1-pyhd8ed1ab_0.conda#1e35d8f975bc0e984a19819aa91c440a https://conda.anaconda.org/conda-forge/noarch/pytest-xdist-3.6.1-pyhd8ed1ab_1.conda#59aad4fb37cabc0bacc73cf344612ddd -https://conda.anaconda.org/conda-forge/win-64/harfbuzz-11.0.0-h9e37d49_0.conda#b7648427f5b6797ae3904ad76e4c7f19 +https://conda.anaconda.org/conda-forge/win-64/harfbuzz-11.0.1-h078c0c3_0.conda#81b86b68c534852535acc9c5cfce7469 https://conda.anaconda.org/conda-forge/win-64/libblas-3.9.0-31_h641d27c_mkl.conda#d05563c577fe2f37693a554b3f271e8f https://conda.anaconda.org/conda-forge/win-64/mkl-devel-2024.2.2-h57928b3_15.conda#a85f53093da069c7c657f090e388f3ef https://conda.anaconda.org/conda-forge/win-64/libcblas-3.9.0-31_h5e41251_mkl.conda#43c100b94ad2607382b0cf0f3a6b0bf3 https://conda.anaconda.org/conda-forge/win-64/liblapack-3.9.0-31_h1aa476e_mkl.conda#40b47ee720a185289760960fc6185750 -https://conda.anaconda.org/conda-forge/win-64/qt6-main-6.9.0-h83cda92_0.conda#d92e5a0de3263315551d54d5574f5193 +https://conda.anaconda.org/conda-forge/win-64/qt6-main-6.9.0-h83cda92_1.conda#412f970fc305449b6ee626fe9c6638a8 https://conda.anaconda.org/conda-forge/win-64/liblapacke-3.9.0-31_h845c4fa_mkl.conda#003a2041cb07a7cf698f48dd26301273 https://conda.anaconda.org/conda-forge/win-64/numpy-2.2.4-py310h4987827_0.conda#f345b8969677cf68503d28ce0c28e756 https://conda.anaconda.org/conda-forge/win-64/pyside6-6.9.0-py310hc1b6536_0.conda#e90c8d8a817b5d63b7785d7d18c99ae0 diff --git a/build_tools/azure/pymin_conda_forge_openblas_min_dependencies_linux-64_conda.lock b/build_tools/azure/pymin_conda_forge_openblas_min_dependencies_linux-64_conda.lock index c37b2b2e1c6e7..5e4e600dc28d0 100644 --- a/build_tools/azure/pymin_conda_forge_openblas_min_dependencies_linux-64_conda.lock +++ b/build_tools/azure/pymin_conda_forge_openblas_min_dependencies_linux-64_conda.lock @@ -12,7 +12,7 @@ https://conda.anaconda.org/conda-forge/noarch/tzdata-2025b-h78e105d_0.conda#4222 https://conda.anaconda.org/conda-forge/noarch/fonts-conda-forge-1-0.tar.bz2#f766549260d6815b0c52253f1fb1bb29 https://conda.anaconda.org/conda-forge/linux-64/ld_impl_linux-64-2.43-h712a8e2_4.conda#01f8d123c96816249efd255a31ad7712 https://conda.anaconda.org/conda-forge/linux-64/libglvnd-1.7.0-ha4b6fd6_2.conda#434ca7e50e40f4918ab701e3facd59a0 -https://conda.anaconda.org/conda-forge/linux-64/llvm-openmp-20.1.2-h024ca30_0.conda#322da3c0641a7f0dafd5be6d3ea23d96 +https://conda.anaconda.org/conda-forge/linux-64/llvm-openmp-20.1.2-h024ca30_1.conda#39a3992c2624b8d8e6b4994dedf3102a https://conda.anaconda.org/conda-forge/linux-64/_openmp_mutex-4.5-3_kmp_llvm.conda#ee5c2118262e30b972bc0b4db8ef0ba5 https://conda.anaconda.org/conda-forge/noarch/fonts-conda-ecosystem-1-0.tar.bz2#fee5683a3f04bd15cbd8318b096a27ab https://conda.anaconda.org/conda-forge/linux-64/libegl-1.7.0-ha4b6fd6_2.conda#c151d5eb730e9b7480e6d48c0fc44048 @@ -29,11 +29,12 @@ https://conda.anaconda.org/conda-forge/linux-64/libgfortran5-14.2.0-hf1ad2bd_2.c https://conda.anaconda.org/conda-forge/linux-64/libiconv-1.18-h4ce23a2_1.conda#e796ff8ddc598affdf7c173d6145f087 https://conda.anaconda.org/conda-forge/linux-64/liblzma-5.8.1-hb9d3cd8_0.conda#0e87378639676987af32fee53ba32258 https://conda.anaconda.org/conda-forge/linux-64/libntlm-1.8-hb9d3cd8_0.conda#7c7927b404672409d9917d49bff5f2d6 +https://conda.anaconda.org/conda-forge/linux-64/libopus-1.5.2-hd0c01bc_0.conda#b64523fb87ac6f87f0790f324ad43046 https://conda.anaconda.org/conda-forge/linux-64/libstdcxx-14.2.0-h8f9b012_2.conda#a78c856b6dc6bf4ea8daeb9beaaa3fb0 https://conda.anaconda.org/conda-forge/linux-64/libwebp-base-1.5.0-h851e524_0.conda#63f790534398730f59e1b899c3644d4a https://conda.anaconda.org/conda-forge/linux-64/libzlib-1.3.1-hb9d3cd8_2.conda#edb0dca6bc32e4f4789199455a1dbeb8 https://conda.anaconda.org/conda-forge/linux-64/ncurses-6.5-h2d0b736_3.conda#47e340acb35de30501a76c7c799c41d7 -https://conda.anaconda.org/conda-forge/linux-64/openssl-3.4.1-h7b32b05_0.conda#41adf927e746dc75ecf0ef841c454e48 +https://conda.anaconda.org/conda-forge/linux-64/openssl-3.5.0-h7b32b05_0.conda#bb539841f2a3fde210f387d00ed4bb9d https://conda.anaconda.org/conda-forge/linux-64/pthread-stubs-0.4-hb9d3cd8_1002.conda#b3c17d95b5a10c6e64a21fa17573e70e https://conda.anaconda.org/conda-forge/linux-64/xorg-libice-1.1.2-hb9d3cd8_0.conda#fb901ff28063514abb6046c9ec2c4a45 https://conda.anaconda.org/conda-forge/linux-64/xorg-libxau-1.0.12-hb9d3cd8_0.conda#f6ebe2cb3f82ba6c057dde5d9debe4f7 @@ -50,11 +51,10 @@ https://conda.anaconda.org/conda-forge/linux-64/libedit-3.1.20250104-pl5321h7949 https://conda.anaconda.org/conda-forge/linux-64/libevent-2.1.12-hf998b51_1.conda#a1cfcc585f0c42bf8d5546bb1dfb668d https://conda.anaconda.org/conda-forge/linux-64/libgettextpo-devel-0.23.1-h5888daf_0.conda#7a5d5c245a6807deab87558e9efd3ef0 https://conda.anaconda.org/conda-forge/linux-64/libgfortran-14.2.0-h69a702a_2.conda#fb54c4ea68b460c278d26eea89cfbcc3 -https://conda.anaconda.org/conda-forge/linux-64/libgpg-error-1.51-hbd13f7d_1.conda#168cc19c031482f83b23c4eebbb94e26 +https://conda.anaconda.org/conda-forge/linux-64/libgpg-error-1.53-hbd13f7d_0.conda#95c5d6d9342880f326dec08ab4cd6253 https://conda.anaconda.org/conda-forge/linux-64/libjpeg-turbo-3.0.0-hd590300_1.conda#ea25936bb4080d843790b586850f82b8 https://conda.anaconda.org/conda-forge/linux-64/libnsl-2.0.1-hd590300_0.conda#30fd6e37fe21f86f4bd26d6ee73eeec7 https://conda.anaconda.org/conda-forge/linux-64/libogg-1.3.5-h4ab18f5_0.conda#601bfb4b3c6f0b844443bb81a56651e0 -https://conda.anaconda.org/conda-forge/linux-64/libopus-1.3.1-h7f98852_1.tar.bz2#15345e56d527b330e1cacbdf58676e8f https://conda.anaconda.org/conda-forge/linux-64/libpciaccess-0.18-hd590300_0.conda#48f4330bfcd959c3cfb704d424903c82 https://conda.anaconda.org/conda-forge/linux-64/libpng-1.6.47-h943b412_0.conda#55199e2ae2c3651f6f9b2a447b47bdc9 https://conda.anaconda.org/conda-forge/linux-64/libsqlite-3.49.1-hee588c1_2.conda#962d6ac93c30b1dfc54c9cccafd1003e @@ -64,7 +64,7 @@ https://conda.anaconda.org/conda-forge/linux-64/libxcb-1.17.0-h8a09558_0.conda#9 https://conda.anaconda.org/conda-forge/linux-64/libxcrypt-4.4.36-hd590300_1.conda#5aa797f8787fe7a17d1b0821485b5adc https://conda.anaconda.org/conda-forge/linux-64/lz4-c-1.10.0-h5888daf_1.conda#9de5350a85c4a20c685259b889aa6393 https://conda.anaconda.org/conda-forge/linux-64/mpg123-1.32.9-hc50e24c_0.conda#c7f302fd11eeb0987a6a5e1f3aed6a21 -https://conda.anaconda.org/conda-forge/linux-64/mysql-common-9.0.1-h266115a_5.conda#6cf2f0c19b0b7ff3d5349c9826c26a9e +https://conda.anaconda.org/conda-forge/linux-64/mysql-common-9.0.1-h266115a_6.conda#94116b69829e90b72d566e64421e1bff https://conda.anaconda.org/conda-forge/linux-64/nspr-4.36-h5888daf_0.conda#de9cd5bca9e4918527b9b72b6e2e1409 https://conda.anaconda.org/conda-forge/linux-64/pixman-0.44.2-h29eaf8c_0.conda#5e2a7acfa2c24188af39e7944e1b3604 https://conda.anaconda.org/conda-forge/linux-64/readline-8.2-h8c095d6_2.conda#283b96675859b20a825f8fa30f311446 @@ -82,11 +82,11 @@ https://conda.anaconda.org/conda-forge/linux-64/libdrm-2.4.124-hb9d3cd8_0.conda# https://conda.anaconda.org/conda-forge/linux-64/libgcrypt-lib-1.11.0-hb9d3cd8_2.conda#e55712ff40a054134d51b89afca57dbc https://conda.anaconda.org/conda-forge/linux-64/libgfortran-ng-14.2.0-h69a702a_2.conda#4056c857af1a99ee50589a941059ec55 https://conda.anaconda.org/conda-forge/linux-64/libvorbis-1.3.7-h9c3ff4c_0.tar.bz2#309dec04b70a3cc0f1e84a4013683bc0 -https://conda.anaconda.org/conda-forge/linux-64/mysql-libs-9.0.1-he0572af_5.conda#d13932a2a61de7c0fb7864b592034a6e +https://conda.anaconda.org/conda-forge/linux-64/mysql-libs-9.0.1-he0572af_6.conda#9802ae6d20982f42c0f5d69008988763 https://conda.anaconda.org/conda-forge/linux-64/ninja-1.12.1-h297d8ca_0.conda#3aa1c7e292afeff25a0091ddd7c69b72 https://conda.anaconda.org/conda-forge/linux-64/nss-3.110-h159eef7_0.conda#945659af183e87429c8aa7e0be3cc91d https://conda.anaconda.org/conda-forge/linux-64/pcre2-10.44-hba22ea6_2.conda#df359c09c41cd186fffb93a2d87aa6f5 -https://conda.anaconda.org/conda-forge/linux-64/python-3.10.16-habfa6aa_2_cpython.conda#35e864ff2ec654d09fdc189706dfd139 +https://conda.anaconda.org/conda-forge/linux-64/python-3.10.17-hd6af730_0_cpython.conda#7bb89638dae9ce1b8e051d0b721e83c2 https://conda.anaconda.org/conda-forge/linux-64/xcb-util-0.4.1-hb711507_2.conda#8637c3e5821654d0edf97e2b0404b443 https://conda.anaconda.org/conda-forge/linux-64/xcb-util-keysyms-0.4.1-hb711507_0.conda#ad748ccca349aec3e91743e08b5e2b50 https://conda.anaconda.org/conda-forge/linux-64/xcb-util-renderutil-0.3.10-hb711507_0.conda#0e0cbe0564d03a99afd5fd7b362feecd @@ -125,7 +125,7 @@ https://conda.anaconda.org/conda-forge/noarch/threadpoolctl-3.1.0-pyh8a188c0_0.t https://conda.anaconda.org/conda-forge/noarch/toml-0.10.2-pyhd8ed1ab_1.conda#b0dd904de08b7db706167240bf37b164 https://conda.anaconda.org/conda-forge/noarch/tomli-2.2.1-pyhd8ed1ab_1.conda#ac944244f1fed2eb49bae07193ae8215 https://conda.anaconda.org/conda-forge/linux-64/tornado-6.4.2-py310ha75aee5_0.conda#166d59aab40b9c607b4cc21c03924e9d -https://conda.anaconda.org/conda-forge/noarch/typing_extensions-4.13.1-pyh29332c3_0.conda#5710c79a5fb0a6bfdba0a887f90583b1 +https://conda.anaconda.org/conda-forge/noarch/typing_extensions-4.13.2-pyh29332c3_0.conda#83fc6ae00127671e301c9f44254c31b8 https://conda.anaconda.org/conda-forge/linux-64/unicodedata2-16.0.0-py310ha75aee5_0.conda#1d7a4b9202cdd10d56ecdd7f6c347190 https://conda.anaconda.org/conda-forge/noarch/wheel-0.45.1-pyhd8ed1ab_1.conda#75cb7132eb58d97896e173ef12ac9986 https://conda.anaconda.org/conda-forge/linux-64/xcb-util-image-0.4.0-hb711507_2.conda#a0901183f08b6c7107aab109733a3c91 @@ -154,11 +154,11 @@ https://conda.anaconda.org/conda-forge/noarch/pip-25.0.1-pyh8b19718_0.conda#79b5 https://conda.anaconda.org/conda-forge/noarch/pyproject-metadata-0.9.1-pyhd8ed1ab_0.conda#22ae7c6ea81e0c8661ef32168dda929b https://conda.anaconda.org/conda-forge/noarch/pytest-8.3.5-pyhd8ed1ab_0.conda#c3c9316209dec74a705a36797970c6be https://conda.anaconda.org/conda-forge/noarch/python-dateutil-2.9.0.post0-pyhff2d567_1.conda#5ba79d7c71f03c678c8ead841f347d6e -https://conda.anaconda.org/conda-forge/linux-64/sip-6.7.12-py310hc6cd4ac_0.conda#68d5bfccaba2d89a7812098dd3966d9b +https://conda.anaconda.org/conda-forge/linux-64/sip-6.8.6-py310hf71b8c6_2.conda#a50d1007fecaff3f98b19034a8e0b2e7 https://conda.anaconda.org/conda-forge/linux-64/xorg-libxdamage-1.1.6-hb9d3cd8_0.conda#b5fcc7172d22516e1f965490e65e33a4 https://conda.anaconda.org/conda-forge/linux-64/xorg-libxxf86vm-1.1.6-hb9d3cd8_0.conda#5efa5fa6243a622445fdfd72aee15efa https://conda.anaconda.org/conda-forge/linux-64/glib-2.84.1-h07242d1_0.conda#2c2357f18073331d4aefe7252b9fad17 -https://conda.anaconda.org/conda-forge/linux-64/harfbuzz-11.0.0-h76408a6_0.conda#347cb348bfc8d77062daee11c326e518 +https://conda.anaconda.org/conda-forge/linux-64/harfbuzz-11.0.1-h2c12942_0.conda#c90105cecb8bf8248f6666f1f5a40bbb https://conda.anaconda.org/conda-forge/linux-64/libcblas-3.9.0-20_linux64_openblas.conda#36d486d72ab64ffea932329a1d3729a3 https://conda.anaconda.org/conda-forge/linux-64/libclang-cpp20.1-20.1.2-default_hb5137d0_0.conda#729198eae19e9dbf8e0ffe355d416bde https://conda.anaconda.org/conda-forge/linux-64/libclang13-20.1.2-default_h9c6a7e4_0.conda#c5fe177150aecc6ec46609b0a6123f39 @@ -167,7 +167,7 @@ https://conda.anaconda.org/conda-forge/linux-64/libpq-17.4-h27ae623_1.conda#37fb https://conda.anaconda.org/conda-forge/linux-64/libsndfile-1.2.2-hc60ed4a_1.conda#ef1910918dd895516a769ed36b5b3a4e https://conda.anaconda.org/conda-forge/noarch/meson-python-0.16.0-pyh0c530f3_0.conda#e16f0dbf502da873be9f9adb0dc52547 https://conda.anaconda.org/conda-forge/linux-64/pillow-11.1.0-py310h7e6dc6c_0.conda#14d300b9e1504748e70cc6499a7b4d25 -https://conda.anaconda.org/conda-forge/linux-64/pyqt5-sip-12.12.2-py310hc6cd4ac_5.conda#ef5333594a958b25912002886b82b253 +https://conda.anaconda.org/conda-forge/linux-64/pyqt5-sip-12.13.0-py310hf71b8c6_1.conda#0c8cbfbe70f4c8a47b040a14615e6f1f https://conda.anaconda.org/conda-forge/noarch/pytest-cov-6.1.1-pyhd8ed1ab_0.conda#1e35d8f975bc0e984a19819aa91c440a https://conda.anaconda.org/conda-forge/noarch/pytest-xdist-3.6.1-pyhd8ed1ab_1.conda#59aad4fb37cabc0bacc73cf344612ddd https://conda.anaconda.org/conda-forge/linux-64/gstreamer-1.24.7-hf3bb09a_0.conda#c78bc4ef0afb3cd2365d9973c71fc876 @@ -183,5 +183,5 @@ https://conda.anaconda.org/conda-forge/linux-64/scipy-1.8.0-py310hea5193d_1.tar. https://conda.anaconda.org/conda-forge/linux-64/blas-2.120-openblas.conda#c8f6916a81a340650078171b1d852574 https://conda.anaconda.org/conda-forge/linux-64/pyamg-4.2.1-py310h7c3ba0c_0.tar.bz2#89f5a48e1f23b5cf3163a6094903d181 https://conda.anaconda.org/conda-forge/linux-64/qt-main-5.15.15-h993ce98_3.conda#aa49f5308f39277477d47cd6687eb8f3 -https://conda.anaconda.org/conda-forge/linux-64/pyqt-5.15.9-py310h04931ad_5.conda#f4fe7a6e3d7c78c9de048ea9dda21690 +https://conda.anaconda.org/conda-forge/linux-64/pyqt-5.15.10-py310hb3b5edb_1.conda#c370972fc4557cb54d265c9c1f71bd20 https://conda.anaconda.org/conda-forge/linux-64/matplotlib-3.5.0-py310hff52083_0.tar.bz2#1b2f3b135d5d9c594b5e0e6150c03b7b diff --git a/build_tools/azure/pymin_conda_forge_openblas_ubuntu_2204_linux-64_conda.lock b/build_tools/azure/pymin_conda_forge_openblas_ubuntu_2204_linux-64_conda.lock index 599a71068d167..f038f7831f489 100644 --- a/build_tools/azure/pymin_conda_forge_openblas_ubuntu_2204_linux-64_conda.lock +++ b/build_tools/azure/pymin_conda_forge_openblas_ubuntu_2204_linux-64_conda.lock @@ -11,6 +11,7 @@ https://conda.anaconda.org/conda-forge/linux-64/libgomp-14.2.0-h767d61c_2.conda# https://conda.anaconda.org/conda-forge/linux-64/_openmp_mutex-4.5-2_gnu.tar.bz2#73aaf86a425cc6e73fcf236a5a46396d https://conda.anaconda.org/conda-forge/linux-64/libgcc-14.2.0-h767d61c_2.conda#ef504d1acbd74b7cc6849ef8af47dd03 https://conda.anaconda.org/conda-forge/linux-64/libdeflate-1.23-h4ddbbb0_0.conda#8dfae1d2e74767e9ce36d5fa0d8605db +https://conda.anaconda.org/conda-forge/linux-64/libexpat-2.7.0-h5888daf_0.conda#db0bfbe7dd197b68ad5f30333bae6ce0 https://conda.anaconda.org/conda-forge/linux-64/libffi-3.4.6-h2dba641_1.conda#ede4673863426c0883c0063d853bbd85 https://conda.anaconda.org/conda-forge/linux-64/libgcc-ng-14.2.0-h69a702a_2.conda#a2222a6ada71fb478682efe483ce0f92 https://conda.anaconda.org/conda-forge/linux-64/libgfortran5-14.2.0-hf1ad2bd_2.conda#556a4fdfac7287d349b8f09aba899693 @@ -19,7 +20,7 @@ https://conda.anaconda.org/conda-forge/linux-64/libstdcxx-14.2.0-h8f9b012_2.cond https://conda.anaconda.org/conda-forge/linux-64/libwebp-base-1.5.0-h851e524_0.conda#63f790534398730f59e1b899c3644d4a https://conda.anaconda.org/conda-forge/linux-64/libzlib-1.3.1-hb9d3cd8_2.conda#edb0dca6bc32e4f4789199455a1dbeb8 https://conda.anaconda.org/conda-forge/linux-64/ncurses-6.5-h2d0b736_3.conda#47e340acb35de30501a76c7c799c41d7 -https://conda.anaconda.org/conda-forge/linux-64/openssl-3.4.1-h7b32b05_0.conda#41adf927e746dc75ecf0ef841c454e48 +https://conda.anaconda.org/conda-forge/linux-64/openssl-3.5.0-h7b32b05_0.conda#bb539841f2a3fde210f387d00ed4bb9d https://conda.anaconda.org/conda-forge/linux-64/pthread-stubs-0.4-hb9d3cd8_1002.conda#b3c17d95b5a10c6e64a21fa17573e70e https://conda.anaconda.org/conda-forge/linux-64/xorg-libxau-1.0.12-hb9d3cd8_0.conda#f6ebe2cb3f82ba6c057dde5d9debe4f7 https://conda.anaconda.org/conda-forge/linux-64/xorg-libxdmcp-1.1.5-hb9d3cd8_0.conda#8035c64cb77ed555e3f150b7b3972480 @@ -41,7 +42,7 @@ https://conda.anaconda.org/conda-forge/linux-64/lerc-4.0.0-h27087fc_0.tar.bz2#76 https://conda.anaconda.org/conda-forge/linux-64/libgfortran-ng-14.2.0-h69a702a_2.conda#4056c857af1a99ee50589a941059ec55 https://conda.anaconda.org/conda-forge/linux-64/libopenblas-0.3.29-pthreads_h94d23a6_0.conda#0a4d0252248ef9a0f88f2ba8b8a08e12 https://conda.anaconda.org/conda-forge/linux-64/ninja-1.12.1-h297d8ca_0.conda#3aa1c7e292afeff25a0091ddd7c69b72 -https://conda.anaconda.org/conda-forge/linux-64/python-3.10.16-habfa6aa_2_cpython.conda#35e864ff2ec654d09fdc189706dfd139 +https://conda.anaconda.org/conda-forge/linux-64/python-3.10.17-hd6af730_0_cpython.conda#7bb89638dae9ce1b8e051d0b721e83c2 https://conda.anaconda.org/conda-forge/noarch/alabaster-1.0.0-pyhd8ed1ab_1.conda#1fd9696649f65fd6611fcdb4ffec738a https://conda.anaconda.org/conda-forge/linux-64/brotli-python-1.1.0-py310hf71b8c6_2.conda#bf502c169c71e3c6ac0d6175addfacc2 https://conda.anaconda.org/conda-forge/noarch/certifi-2025.1.31-pyhd8ed1ab_0.conda#c207fa5ac7ea99b149344385a9c0880d @@ -67,7 +68,7 @@ https://conda.anaconda.org/conda-forge/noarch/pycparser-2.22-pyh29332c3_1.conda# https://conda.anaconda.org/conda-forge/noarch/pygments-2.19.1-pyhd8ed1ab_0.conda#232fb4577b6687b2d503ef8e254270c9 https://conda.anaconda.org/conda-forge/noarch/pysocks-1.7.1-pyha55dd90_7.conda#461219d1a5bd61342293efa2c0c90eac https://conda.anaconda.org/conda-forge/noarch/python-tzdata-2025.2-pyhd8ed1ab_0.conda#88476ae6ebd24f39261e0854ac244f33 -https://conda.anaconda.org/conda-forge/noarch/pytz-2024.1-pyhd8ed1ab_0.conda#3eeeeb9e4827ace8c0c1419c85d590ad +https://conda.anaconda.org/conda-forge/noarch/pytz-2025.2-pyhd8ed1ab_0.conda#bc8e3267d44011051f2eb14d22fb0960 https://conda.anaconda.org/conda-forge/noarch/setuptools-78.1.0-pyhff2d567_0.conda#a42da9837e46c53494df0044c3eb1f53 https://conda.anaconda.org/conda-forge/noarch/six-1.17.0-pyhd8ed1ab_0.conda#a451d576819089b0d672f18768be0f65 https://conda.anaconda.org/conda-forge/noarch/snowballstemmer-2.2.0-pyhd8ed1ab_0.tar.bz2#4d22a9315e78c6827f806065957d566e @@ -98,9 +99,9 @@ https://conda.anaconda.org/conda-forge/linux-64/pillow-11.1.0-py310h7e6dc6c_0.co https://conda.anaconda.org/conda-forge/noarch/pytest-xdist-3.6.1-pyhd8ed1ab_1.conda#59aad4fb37cabc0bacc73cf344612ddd https://conda.anaconda.org/conda-forge/linux-64/zstandard-0.23.0-py310ha75aee5_1.conda#0316e8d0e00c00631a6de89207db5b09 https://conda.anaconda.org/conda-forge/linux-64/blas-devel-3.9.0-31_h1ea3ea9_openblas.conda#ba652ee0576396d4765e567f043c57f9 -https://conda.anaconda.org/conda-forge/linux-64/pandas-2.2.3-py310h5eaa309_1.conda#e67778e1cac3bca3b3300f6164f7ffb9 +https://conda.anaconda.org/conda-forge/linux-64/pandas-2.2.3-py310h5eaa309_3.conda#07697a584fab513ce895c4511f7a2403 https://conda.anaconda.org/conda-forge/linux-64/scipy-1.15.2-py310h1d65ade_0.conda#8c29cd33b64b2eb78597fa28b5595c8d -https://conda.anaconda.org/conda-forge/noarch/urllib3-2.3.0-pyhd8ed1ab_0.conda#32674f8dbfb7b26410ed580dd3c10a29 +https://conda.anaconda.org/conda-forge/noarch/urllib3-2.4.0-pyhd8ed1ab_0.conda#c1e349028e0052c4eea844e94f773065 https://conda.anaconda.org/conda-forge/linux-64/blas-2.131-openblas.conda#38b2ec894c69bb4be0e66d2ef7fc60bf https://conda.anaconda.org/conda-forge/linux-64/pyamg-5.2.1-py310ha2bacc8_1.conda#817d32861729e14f474249f1036291c4 https://conda.anaconda.org/conda-forge/noarch/requests-2.32.3-pyhd8ed1ab_1.conda#a9b9368f3701a417eac9edbcae7cb737 diff --git a/build_tools/circle/doc_linux-64_conda.lock b/build_tools/circle/doc_linux-64_conda.lock index a80c44c33d7fc..4177ea5dce11a 100644 --- a/build_tools/circle/doc_linux-64_conda.lock +++ b/build_tools/circle/doc_linux-64_conda.lock @@ -40,7 +40,7 @@ https://conda.anaconda.org/conda-forge/linux-64/libstdcxx-14.2.0-h8f9b012_2.cond https://conda.anaconda.org/conda-forge/linux-64/libwebp-base-1.5.0-h851e524_0.conda#63f790534398730f59e1b899c3644d4a https://conda.anaconda.org/conda-forge/linux-64/libzlib-1.3.1-hb9d3cd8_2.conda#edb0dca6bc32e4f4789199455a1dbeb8 https://conda.anaconda.org/conda-forge/linux-64/ncurses-6.5-h2d0b736_3.conda#47e340acb35de30501a76c7c799c41d7 -https://conda.anaconda.org/conda-forge/linux-64/openssl-3.4.1-h7b32b05_0.conda#41adf927e746dc75ecf0ef841c454e48 +https://conda.anaconda.org/conda-forge/linux-64/openssl-3.5.0-h7b32b05_0.conda#bb539841f2a3fde210f387d00ed4bb9d https://conda.anaconda.org/conda-forge/linux-64/pthread-stubs-0.4-hb9d3cd8_1002.conda#b3c17d95b5a10c6e64a21fa17573e70e https://conda.anaconda.org/conda-forge/linux-64/xorg-libice-1.1.2-hb9d3cd8_0.conda#fb901ff28063514abb6046c9ec2c4a45 https://conda.anaconda.org/conda-forge/linux-64/xorg-libxau-1.0.12-hb9d3cd8_0.conda#f6ebe2cb3f82ba6c057dde5d9debe4f7 @@ -67,7 +67,7 @@ https://conda.anaconda.org/conda-forge/linux-64/libuuid-2.38.1-h0b41bf4_0.conda# https://conda.anaconda.org/conda-forge/linux-64/libxcb-1.17.0-h8a09558_0.conda#92ed62436b625154323d40d5f2f11dd7 https://conda.anaconda.org/conda-forge/linux-64/libxcrypt-4.4.36-hd590300_1.conda#5aa797f8787fe7a17d1b0821485b5adc https://conda.anaconda.org/conda-forge/linux-64/lz4-c-1.10.0-h5888daf_1.conda#9de5350a85c4a20c685259b889aa6393 -https://conda.anaconda.org/conda-forge/linux-64/mysql-common-9.0.1-h266115a_5.conda#6cf2f0c19b0b7ff3d5349c9826c26a9e +https://conda.anaconda.org/conda-forge/linux-64/mysql-common-9.2.0-h266115a_0.conda#db22a0962c953e81a2a679ecb1fc6027 https://conda.anaconda.org/conda-forge/linux-64/pixman-0.44.2-h29eaf8c_0.conda#5e2a7acfa2c24188af39e7944e1b3604 https://conda.anaconda.org/conda-forge/linux-64/rav1e-0.6.6-he8a937b_2.conda#77d9955b4abddb811cb8ab1aa7d743e4 https://conda.anaconda.org/conda-forge/linux-64/readline-8.2-h8c095d6_2.conda#283b96675859b20a825f8fa30f311446 @@ -93,10 +93,10 @@ https://conda.anaconda.org/conda-forge/linux-64/libdrm-2.4.124-hb9d3cd8_0.conda# https://conda.anaconda.org/conda-forge/linux-64/libhwy-1.1.0-h00ab1b0_0.conda#88928158ccfe797eac29ef5e03f7d23d https://conda.anaconda.org/conda-forge/linux-64/libopenblas-0.3.29-pthreads_h94d23a6_0.conda#0a4d0252248ef9a0f88f2ba8b8a08e12 https://conda.anaconda.org/conda-forge/linux-64/libzopfli-1.0.3-h9c3ff4c_0.tar.bz2#c66fe2d123249af7651ebde8984c51c2 -https://conda.anaconda.org/conda-forge/linux-64/mysql-libs-9.0.1-he0572af_5.conda#d13932a2a61de7c0fb7864b592034a6e +https://conda.anaconda.org/conda-forge/linux-64/mysql-libs-9.2.0-he0572af_0.conda#93340b072c393d23c4700a1d40565dca https://conda.anaconda.org/conda-forge/linux-64/ninja-1.12.1-h297d8ca_0.conda#3aa1c7e292afeff25a0091ddd7c69b72 https://conda.anaconda.org/conda-forge/linux-64/pcre2-10.44-hba22ea6_2.conda#df359c09c41cd186fffb93a2d87aa6f5 -https://conda.anaconda.org/conda-forge/linux-64/python-3.10.16-habfa6aa_2_cpython.conda#35e864ff2ec654d09fdc189706dfd139 +https://conda.anaconda.org/conda-forge/linux-64/python-3.10.17-hd6af730_0_cpython.conda#7bb89638dae9ce1b8e051d0b721e83c2 https://conda.anaconda.org/conda-forge/linux-64/qhull-2020.2-h434a139_5.conda#353823361b1d27eb3960efb076dfcaf6 https://conda.anaconda.org/conda-forge/linux-64/wayland-1.23.1-h3e06ad9_0.conda#0a732427643ae5e0486a727927791da1 https://conda.anaconda.org/conda-forge/linux-64/xcb-util-0.4.1-hb711507_2.conda#8637c3e5821654d0edf97e2b0404b443 @@ -139,7 +139,7 @@ https://conda.anaconda.org/conda-forge/linux-64/libtiff-4.7.0-hd9ff511_3.conda#0 https://conda.anaconda.org/conda-forge/linux-64/libxml2-2.13.7-h4bc477f_1.conda#ad1f1f8238834cd3c88ceeaee8da444a https://conda.anaconda.org/conda-forge/linux-64/markupsafe-3.0.2-py310h89163eb_1.conda#8ce3f0332fd6de0d737e2911d329523f https://conda.anaconda.org/conda-forge/noarch/munkres-1.1.4-pyh9f0ad1d_0.tar.bz2#2ba8498c1018c1e9c61eb99b973dfe19 -https://conda.anaconda.org/conda-forge/noarch/narwhals-1.33.0-pyhd8ed1ab_0.conda#54a495cf873b193aa17fb9517d0487c1 +https://conda.anaconda.org/conda-forge/noarch/narwhals-1.34.1-pyhd8ed1ab_0.conda#38ee2961b442f786de810610de6f6b0e https://conda.anaconda.org/conda-forge/noarch/networkx-3.4.2-pyh267e887_2.conda#fd40bf7f7f4bc4b647dc8512053d9873 https://conda.anaconda.org/conda-forge/linux-64/openblas-0.3.29-pthreads_h6ec200e_0.conda#7e4d48870b3258bea920d51b7f495a81 https://conda.anaconda.org/conda-forge/noarch/packaging-24.2-pyhd8ed1ab_2.conda#3bfed7e6228ebf2f7b9eaa47f1b4e2aa @@ -151,7 +151,7 @@ https://conda.anaconda.org/conda-forge/noarch/pygments-2.19.1-pyhd8ed1ab_0.conda https://conda.anaconda.org/conda-forge/noarch/pyparsing-3.2.3-pyhd8ed1ab_1.conda#513d3c262ee49b54a8fec85c5bc99764 https://conda.anaconda.org/conda-forge/noarch/pysocks-1.7.1-pyha55dd90_7.conda#461219d1a5bd61342293efa2c0c90eac https://conda.anaconda.org/conda-forge/noarch/python-tzdata-2025.2-pyhd8ed1ab_0.conda#88476ae6ebd24f39261e0854ac244f33 -https://conda.anaconda.org/conda-forge/noarch/pytz-2024.1-pyhd8ed1ab_0.conda#3eeeeb9e4827ace8c0c1419c85d590ad +https://conda.anaconda.org/conda-forge/noarch/pytz-2025.2-pyhd8ed1ab_0.conda#bc8e3267d44011051f2eb14d22fb0960 https://conda.anaconda.org/conda-forge/noarch/setuptools-78.1.0-pyhff2d567_0.conda#a42da9837e46c53494df0044c3eb1f53 https://conda.anaconda.org/conda-forge/noarch/six-1.17.0-pyhd8ed1ab_0.conda#a451d576819089b0d672f18768be0f65 https://conda.anaconda.org/conda-forge/noarch/snowballstemmer-2.2.0-pyhd8ed1ab_0.tar.bz2#4d22a9315e78c6827f806065957d566e @@ -161,7 +161,7 @@ https://conda.anaconda.org/conda-forge/noarch/tabulate-0.9.0-pyhd8ed1ab_2.conda# https://conda.anaconda.org/conda-forge/noarch/threadpoolctl-3.6.0-pyhecae5ae_0.conda#9d64911b31d57ca443e9f1e36b04385f https://conda.anaconda.org/conda-forge/noarch/tomli-2.2.1-pyhd8ed1ab_1.conda#ac944244f1fed2eb49bae07193ae8215 https://conda.anaconda.org/conda-forge/linux-64/tornado-6.4.2-py310ha75aee5_0.conda#166d59aab40b9c607b4cc21c03924e9d -https://conda.anaconda.org/conda-forge/noarch/typing_extensions-4.13.1-pyh29332c3_0.conda#5710c79a5fb0a6bfdba0a887f90583b1 +https://conda.anaconda.org/conda-forge/noarch/typing_extensions-4.13.2-pyh29332c3_0.conda#83fc6ae00127671e301c9f44254c31b8 https://conda.anaconda.org/conda-forge/linux-64/unicodedata2-16.0.0-py310ha75aee5_0.conda#1d7a4b9202cdd10d56ecdd7f6c347190 https://conda.anaconda.org/conda-forge/noarch/wheel-0.45.1-pyhd8ed1ab_1.conda#75cb7132eb58d97896e173ef12ac9986 https://conda.anaconda.org/conda-forge/linux-64/xcb-util-image-0.4.0-hb711507_2.conda#a0901183f08b6c7107aab109733a3c91 @@ -203,7 +203,7 @@ https://conda.anaconda.org/conda-forge/noarch/plotly-6.0.1-pyhd8ed1ab_0.conda#37 https://conda.anaconda.org/conda-forge/noarch/pyproject-metadata-0.9.1-pyhd8ed1ab_0.conda#22ae7c6ea81e0c8661ef32168dda929b https://conda.anaconda.org/conda-forge/noarch/pytest-8.3.5-pyhd8ed1ab_0.conda#c3c9316209dec74a705a36797970c6be https://conda.anaconda.org/conda-forge/noarch/python-dateutil-2.9.0.post0-pyhff2d567_1.conda#5ba79d7c71f03c678c8ead841f347d6e -https://conda.anaconda.org/conda-forge/noarch/typing-extensions-4.13.1-hf5ce1d7_0.conda#e37cf790f710cf72fd13dcb6b2d4370c +https://conda.anaconda.org/conda-forge/noarch/typing-extensions-4.13.2-h0e9735f_0.conda#568ed1300869dca0ba09fb750cda5dbb https://conda.anaconda.org/conda-forge/linux-64/xcb-util-cursor-0.1.5-hb9d3cd8_0.conda#eb44b3b6deb1cab08d72cb61686fe64c https://conda.anaconda.org/conda-forge/linux-64/xorg-libxcomposite-0.4.6-hb9d3cd8_2.conda#d3c295b50f092ab525ffe3c2aa4b7413 https://conda.anaconda.org/conda-forge/linux-64/xorg-libxcursor-1.2.3-hb9d3cd8_0.conda#2ccd714aa2242315acaf0a67faea780b @@ -214,7 +214,7 @@ https://conda.anaconda.org/conda-forge/linux-64/xorg-libxxf86vm-1.1.6-hb9d3cd8_0 https://conda.anaconda.org/conda-forge/noarch/beautifulsoup4-4.13.3-pyha770c72_0.conda#373374a3ed20141090504031dc7b693e https://conda.anaconda.org/conda-forge/linux-64/cxx-compiler-1.9.0-h1a2810e_0.conda#1ce8b218d359d9ed0ab481f2a3f3c512 https://conda.anaconda.org/conda-forge/linux-64/fortran-compiler-1.9.0-h36df796_0.conda#cc0cf942201f9d3b0e9654ea02e12486 -https://conda.anaconda.org/conda-forge/linux-64/harfbuzz-11.0.0-h76408a6_0.conda#347cb348bfc8d77062daee11c326e518 +https://conda.anaconda.org/conda-forge/linux-64/harfbuzz-11.0.1-h2c12942_0.conda#c90105cecb8bf8248f6666f1f5a40bbb https://conda.anaconda.org/conda-forge/noarch/importlib-resources-6.5.2-pyhd8ed1ab_0.conda#e376ea42e9ae40f3278b0f79c9bf9826 https://conda.anaconda.org/conda-forge/noarch/lazy-loader-0.4-pyhd8ed1ab_2.conda#d10d9393680734a8febc4b362a4c94f2 https://conda.anaconda.org/conda-forge/linux-64/libclang-cpp20.1-20.1.2-default_hb5137d0_0.conda#729198eae19e9dbf8e0ffe355d416bde @@ -233,14 +233,14 @@ https://conda.anaconda.org/conda-forge/linux-64/contourpy-1.3.1-py310h3788b33_0. https://conda.anaconda.org/conda-forge/linux-64/imagecodecs-2024.12.30-py310h78a9a29_0.conda#e0c50079904122427bcf52e1afcd1cdb https://conda.anaconda.org/conda-forge/noarch/imageio-2.37.0-pyhfb79c49_0.conda#b5577bc2212219566578fd5af9993af6 https://conda.anaconda.org/conda-forge/noarch/lazy_loader-0.4-pyhd8ed1ab_2.conda#bb0230917e2473c77d615104dbe8a49d -https://conda.anaconda.org/conda-forge/linux-64/pandas-2.2.3-py310h5eaa309_1.conda#e67778e1cac3bca3b3300f6164f7ffb9 +https://conda.anaconda.org/conda-forge/linux-64/pandas-2.2.3-py310h5eaa309_3.conda#07697a584fab513ce895c4511f7a2403 https://conda.anaconda.org/conda-forge/noarch/patsy-1.0.1-pyhd8ed1ab_1.conda#ee23fabfd0a8c6b8d6f3729b47b2859d -https://conda.anaconda.org/conda-forge/linux-64/polars-1.26.0-py310hc556931_0.conda#cc98853d8d0f75ee4676c008b4148468 +https://conda.anaconda.org/conda-forge/linux-64/polars-1.27.1-py310hc556931_0.conda#1dad3dbffc95810e4cabca888e2dffab https://conda.anaconda.org/conda-forge/linux-64/pywavelets-1.8.0-py310hf462985_0.conda#4c441eff2be2e65bd67765c5642051c5 -https://conda.anaconda.org/conda-forge/linux-64/qt6-main-6.9.0-h6441bc3_0.conda#d3df16592e15a3f833cfc4d19ae58677 +https://conda.anaconda.org/conda-forge/linux-64/qt6-main-6.9.0-h6441bc3_1.conda#4029a8dcb1d97ea241dbe5abfda1fad6 https://conda.anaconda.org/conda-forge/linux-64/scipy-1.15.2-py310h1d65ade_0.conda#8c29cd33b64b2eb78597fa28b5595c8d https://conda.anaconda.org/conda-forge/noarch/towncrier-24.8.0-pyhd8ed1ab_1.conda#820b6a1ddf590fba253f8204f7200d82 -https://conda.anaconda.org/conda-forge/noarch/urllib3-2.3.0-pyhd8ed1ab_0.conda#32674f8dbfb7b26410ed580dd3c10a29 +https://conda.anaconda.org/conda-forge/noarch/urllib3-2.4.0-pyhd8ed1ab_0.conda#c1e349028e0052c4eea844e94f773065 https://conda.anaconda.org/conda-forge/linux-64/blas-2.131-openblas.conda#38b2ec894c69bb4be0e66d2ef7fc60bf https://conda.anaconda.org/conda-forge/linux-64/matplotlib-base-3.10.1-py310h68603db_0.conda#29cf3f5959afb841eda926541f26b0fb https://conda.anaconda.org/conda-forge/linux-64/pyamg-5.2.1-py310ha2bacc8_1.conda#817d32861729e14f474249f1036291c4 diff --git a/build_tools/circle/doc_min_dependencies_linux-64_conda.lock b/build_tools/circle/doc_min_dependencies_linux-64_conda.lock index 5d63dbc0de3cf..272568c1ef1e0 100644 --- a/build_tools/circle/doc_min_dependencies_linux-64_conda.lock +++ b/build_tools/circle/doc_min_dependencies_linux-64_conda.lock @@ -16,7 +16,7 @@ https://conda.anaconda.org/conda-forge/noarch/libgcc-devel_linux-64-13.3.0-hc03c https://conda.anaconda.org/conda-forge/linux-64/libglvnd-1.7.0-ha4b6fd6_2.conda#434ca7e50e40f4918ab701e3facd59a0 https://conda.anaconda.org/conda-forge/linux-64/libgomp-14.2.0-h767d61c_2.conda#06d02030237f4d5b3d9a7e7d348fe3c6 https://conda.anaconda.org/conda-forge/noarch/libstdcxx-devel_linux-64-13.3.0-hc03c837_102.conda#aa38de2738c5f4a72a880e3d31ffe8b4 -https://conda.anaconda.org/conda-forge/linux-64/llvm-openmp-20.1.2-h024ca30_0.conda#322da3c0641a7f0dafd5be6d3ea23d96 +https://conda.anaconda.org/conda-forge/linux-64/llvm-openmp-20.1.2-h024ca30_1.conda#39a3992c2624b8d8e6b4994dedf3102a https://conda.anaconda.org/conda-forge/noarch/sysroot_linux-64-2.17-h0157908_18.conda#460eba7851277ec1fd80a1a24080787a https://conda.anaconda.org/conda-forge/linux-64/_openmp_mutex-4.5-3_kmp_llvm.conda#ee5c2118262e30b972bc0b4db8ef0ba5 https://conda.anaconda.org/conda-forge/linux-64/binutils_impl_linux-64-2.43-h4bf12b8_4.conda#ef67db625ad0d2dce398837102f875ed @@ -37,11 +37,12 @@ https://conda.anaconda.org/conda-forge/linux-64/libgfortran5-14.2.0-hf1ad2bd_2.c https://conda.anaconda.org/conda-forge/linux-64/libiconv-1.18-h4ce23a2_1.conda#e796ff8ddc598affdf7c173d6145f087 https://conda.anaconda.org/conda-forge/linux-64/liblzma-5.8.1-hb9d3cd8_0.conda#0e87378639676987af32fee53ba32258 https://conda.anaconda.org/conda-forge/linux-64/libntlm-1.8-hb9d3cd8_0.conda#7c7927b404672409d9917d49bff5f2d6 +https://conda.anaconda.org/conda-forge/linux-64/libopus-1.5.2-hd0c01bc_0.conda#b64523fb87ac6f87f0790f324ad43046 https://conda.anaconda.org/conda-forge/linux-64/libstdcxx-14.2.0-h8f9b012_2.conda#a78c856b6dc6bf4ea8daeb9beaaa3fb0 https://conda.anaconda.org/conda-forge/linux-64/libwebp-base-1.5.0-h851e524_0.conda#63f790534398730f59e1b899c3644d4a https://conda.anaconda.org/conda-forge/linux-64/libzlib-1.3.1-hb9d3cd8_2.conda#edb0dca6bc32e4f4789199455a1dbeb8 https://conda.anaconda.org/conda-forge/linux-64/ncurses-6.5-h2d0b736_3.conda#47e340acb35de30501a76c7c799c41d7 -https://conda.anaconda.org/conda-forge/linux-64/openssl-3.4.1-h7b32b05_0.conda#41adf927e746dc75ecf0ef841c454e48 +https://conda.anaconda.org/conda-forge/linux-64/openssl-3.5.0-h7b32b05_0.conda#bb539841f2a3fde210f387d00ed4bb9d https://conda.anaconda.org/conda-forge/linux-64/pthread-stubs-0.4-hb9d3cd8_1002.conda#b3c17d95b5a10c6e64a21fa17573e70e https://conda.anaconda.org/conda-forge/linux-64/xorg-libice-1.1.2-hb9d3cd8_0.conda#fb901ff28063514abb6046c9ec2c4a45 https://conda.anaconda.org/conda-forge/linux-64/xorg-libxau-1.0.12-hb9d3cd8_0.conda#f6ebe2cb3f82ba6c057dde5d9debe4f7 @@ -62,11 +63,10 @@ https://conda.anaconda.org/conda-forge/linux-64/libedit-3.1.20250104-pl5321h7949 https://conda.anaconda.org/conda-forge/linux-64/libevent-2.1.12-hf998b51_1.conda#a1cfcc585f0c42bf8d5546bb1dfb668d https://conda.anaconda.org/conda-forge/linux-64/libgettextpo-devel-0.23.1-h5888daf_0.conda#7a5d5c245a6807deab87558e9efd3ef0 https://conda.anaconda.org/conda-forge/linux-64/libgfortran-14.2.0-h69a702a_2.conda#fb54c4ea68b460c278d26eea89cfbcc3 -https://conda.anaconda.org/conda-forge/linux-64/libgpg-error-1.51-hbd13f7d_1.conda#168cc19c031482f83b23c4eebbb94e26 +https://conda.anaconda.org/conda-forge/linux-64/libgpg-error-1.53-hbd13f7d_0.conda#95c5d6d9342880f326dec08ab4cd6253 https://conda.anaconda.org/conda-forge/linux-64/libjpeg-turbo-3.0.0-hd590300_1.conda#ea25936bb4080d843790b586850f82b8 https://conda.anaconda.org/conda-forge/linux-64/libnsl-2.0.1-hd590300_0.conda#30fd6e37fe21f86f4bd26d6ee73eeec7 https://conda.anaconda.org/conda-forge/linux-64/libogg-1.3.5-h4ab18f5_0.conda#601bfb4b3c6f0b844443bb81a56651e0 -https://conda.anaconda.org/conda-forge/linux-64/libopus-1.3.1-h7f98852_1.tar.bz2#15345e56d527b330e1cacbdf58676e8f https://conda.anaconda.org/conda-forge/linux-64/libpciaccess-0.18-hd590300_0.conda#48f4330bfcd959c3cfb704d424903c82 https://conda.anaconda.org/conda-forge/linux-64/libpng-1.6.47-h943b412_0.conda#55199e2ae2c3651f6f9b2a447b47bdc9 https://conda.anaconda.org/conda-forge/linux-64/libsanitizer-13.3.0-he8ea267_2.conda#2b6cdf7bb95d3d10ef4e38ce0bc95dba @@ -77,7 +77,7 @@ https://conda.anaconda.org/conda-forge/linux-64/libxcb-1.17.0-h8a09558_0.conda#9 https://conda.anaconda.org/conda-forge/linux-64/libxcrypt-4.4.36-hd590300_1.conda#5aa797f8787fe7a17d1b0821485b5adc https://conda.anaconda.org/conda-forge/linux-64/lz4-c-1.10.0-h5888daf_1.conda#9de5350a85c4a20c685259b889aa6393 https://conda.anaconda.org/conda-forge/linux-64/mpg123-1.32.9-hc50e24c_0.conda#c7f302fd11eeb0987a6a5e1f3aed6a21 -https://conda.anaconda.org/conda-forge/linux-64/mysql-common-9.0.1-h266115a_5.conda#6cf2f0c19b0b7ff3d5349c9826c26a9e +https://conda.anaconda.org/conda-forge/linux-64/mysql-common-9.0.1-h266115a_6.conda#94116b69829e90b72d566e64421e1bff https://conda.anaconda.org/conda-forge/linux-64/nspr-4.36-h5888daf_0.conda#de9cd5bca9e4918527b9b72b6e2e1409 https://conda.anaconda.org/conda-forge/linux-64/pixman-0.44.2-h29eaf8c_0.conda#5e2a7acfa2c24188af39e7944e1b3604 https://conda.anaconda.org/conda-forge/linux-64/rav1e-0.6.6-he8a937b_2.conda#77d9955b4abddb811cb8ab1aa7d743e4 @@ -110,11 +110,11 @@ https://conda.anaconda.org/conda-forge/linux-64/libgfortran-ng-14.2.0-h69a702a_2 https://conda.anaconda.org/conda-forge/linux-64/libhwy-1.1.0-h00ab1b0_0.conda#88928158ccfe797eac29ef5e03f7d23d https://conda.anaconda.org/conda-forge/linux-64/libvorbis-1.3.7-h9c3ff4c_0.tar.bz2#309dec04b70a3cc0f1e84a4013683bc0 https://conda.anaconda.org/conda-forge/linux-64/libzopfli-1.0.3-h9c3ff4c_0.tar.bz2#c66fe2d123249af7651ebde8984c51c2 -https://conda.anaconda.org/conda-forge/linux-64/mysql-libs-9.0.1-he0572af_5.conda#d13932a2a61de7c0fb7864b592034a6e +https://conda.anaconda.org/conda-forge/linux-64/mysql-libs-9.0.1-he0572af_6.conda#9802ae6d20982f42c0f5d69008988763 https://conda.anaconda.org/conda-forge/linux-64/ninja-1.12.1-h297d8ca_0.conda#3aa1c7e292afeff25a0091ddd7c69b72 https://conda.anaconda.org/conda-forge/linux-64/nss-3.110-h159eef7_0.conda#945659af183e87429c8aa7e0be3cc91d https://conda.anaconda.org/conda-forge/linux-64/pcre2-10.44-hba22ea6_2.conda#df359c09c41cd186fffb93a2d87aa6f5 -https://conda.anaconda.org/conda-forge/linux-64/python-3.10.16-habfa6aa_2_cpython.conda#35e864ff2ec654d09fdc189706dfd139 +https://conda.anaconda.org/conda-forge/linux-64/python-3.10.17-hd6af730_0_cpython.conda#7bb89638dae9ce1b8e051d0b721e83c2 https://conda.anaconda.org/conda-forge/linux-64/xcb-util-0.4.1-hb711507_2.conda#8637c3e5821654d0edf97e2b0404b443 https://conda.anaconda.org/conda-forge/linux-64/xcb-util-keysyms-0.4.1-hb711507_0.conda#ad748ccca349aec3e91743e08b5e2b50 https://conda.anaconda.org/conda-forge/linux-64/xcb-util-renderutil-0.3.10-hb711507_0.conda#0e0cbe0564d03a99afd5fd7b362feecd @@ -183,7 +183,7 @@ https://conda.anaconda.org/conda-forge/noarch/toml-0.10.2-pyhd8ed1ab_1.conda#b0d https://conda.anaconda.org/conda-forge/noarch/tomli-2.2.1-pyhd8ed1ab_1.conda#ac944244f1fed2eb49bae07193ae8215 https://conda.anaconda.org/conda-forge/noarch/toolz-1.0.0-pyhd8ed1ab_1.conda#40d0ed782a8aaa16ef248e68c06c168d https://conda.anaconda.org/conda-forge/linux-64/tornado-6.4.2-py310ha75aee5_0.conda#166d59aab40b9c607b4cc21c03924e9d -https://conda.anaconda.org/conda-forge/noarch/typing_extensions-4.13.1-pyh29332c3_0.conda#5710c79a5fb0a6bfdba0a887f90583b1 +https://conda.anaconda.org/conda-forge/noarch/typing_extensions-4.13.2-pyh29332c3_0.conda#83fc6ae00127671e301c9f44254c31b8 https://conda.anaconda.org/conda-forge/linux-64/unicodedata2-16.0.0-py310ha75aee5_0.conda#1d7a4b9202cdd10d56ecdd7f6c347190 https://conda.anaconda.org/conda-forge/noarch/wheel-0.45.1-pyhd8ed1ab_1.conda#75cb7132eb58d97896e173ef12ac9986 https://conda.anaconda.org/conda-forge/linux-64/xcb-util-image-0.4.0-hb711507_2.conda#a0901183f08b6c7107aab109733a3c91 @@ -227,8 +227,8 @@ https://conda.anaconda.org/conda-forge/noarch/plotly-5.14.0-pyhd8ed1ab_0.conda#6 https://conda.anaconda.org/conda-forge/noarch/pyproject-metadata-0.9.1-pyhd8ed1ab_0.conda#22ae7c6ea81e0c8661ef32168dda929b https://conda.anaconda.org/conda-forge/noarch/pytest-8.3.5-pyhd8ed1ab_0.conda#c3c9316209dec74a705a36797970c6be https://conda.anaconda.org/conda-forge/noarch/python-dateutil-2.9.0.post0-pyhff2d567_1.conda#5ba79d7c71f03c678c8ead841f347d6e -https://conda.anaconda.org/conda-forge/linux-64/sip-6.7.12-py310hc6cd4ac_0.conda#68d5bfccaba2d89a7812098dd3966d9b -https://conda.anaconda.org/conda-forge/noarch/typing-extensions-4.13.1-hf5ce1d7_0.conda#e37cf790f710cf72fd13dcb6b2d4370c +https://conda.anaconda.org/conda-forge/linux-64/sip-6.8.6-py310hf71b8c6_2.conda#a50d1007fecaff3f98b19034a8e0b2e7 +https://conda.anaconda.org/conda-forge/noarch/typing-extensions-4.13.2-h0e9735f_0.conda#568ed1300869dca0ba09fb750cda5dbb https://conda.anaconda.org/conda-forge/linux-64/xorg-libxdamage-1.1.6-hb9d3cd8_0.conda#b5fcc7172d22516e1f965490e65e33a4 https://conda.anaconda.org/conda-forge/linux-64/xorg-libxxf86vm-1.1.6-hb9d3cd8_0.conda#5efa5fa6243a622445fdfd72aee15efa https://conda.anaconda.org/conda-forge/noarch/beautifulsoup4-4.13.3-pyha770c72_0.conda#373374a3ed20141090504031dc7b693e @@ -236,7 +236,7 @@ https://conda.anaconda.org/conda-forge/linux-64/cxx-compiler-1.9.0-h1a2810e_0.co https://conda.anaconda.org/conda-forge/noarch/dask-core-2025.3.0-pyhd8ed1ab_0.conda#36f6cc22457e3d6a6051c5370832f96c https://conda.anaconda.org/conda-forge/linux-64/fortran-compiler-1.9.0-h36df796_0.conda#cc0cf942201f9d3b0e9654ea02e12486 https://conda.anaconda.org/conda-forge/linux-64/glib-2.84.1-h07242d1_0.conda#2c2357f18073331d4aefe7252b9fad17 -https://conda.anaconda.org/conda-forge/linux-64/harfbuzz-11.0.0-h76408a6_0.conda#347cb348bfc8d77062daee11c326e518 +https://conda.anaconda.org/conda-forge/linux-64/harfbuzz-11.0.1-h2c12942_0.conda#c90105cecb8bf8248f6666f1f5a40bbb https://conda.anaconda.org/conda-forge/noarch/importlib-resources-6.5.2-pyhd8ed1ab_0.conda#e376ea42e9ae40f3278b0f79c9bf9826 https://conda.anaconda.org/conda-forge/linux-64/libclang-cpp20.1-20.1.2-default_hb5137d0_0.conda#729198eae19e9dbf8e0ffe355d416bde https://conda.anaconda.org/conda-forge/linux-64/libclang13-20.1.2-default_h9c6a7e4_0.conda#c5fe177150aecc6ec46609b0a6123f39 @@ -244,7 +244,7 @@ https://conda.anaconda.org/conda-forge/linux-64/libpq-17.4-h27ae623_1.conda#37fb https://conda.anaconda.org/conda-forge/linux-64/libsndfile-1.2.2-hc60ed4a_1.conda#ef1910918dd895516a769ed36b5b3a4e https://conda.anaconda.org/conda-forge/noarch/meson-python-0.17.1-pyh70fd9c4_1.conda#7a02679229c6c2092571b4c025055440 https://conda.anaconda.org/conda-forge/linux-64/pillow-11.1.0-py310h7e6dc6c_0.conda#14d300b9e1504748e70cc6499a7b4d25 -https://conda.anaconda.org/conda-forge/linux-64/pyqt5-sip-12.12.2-py310hc6cd4ac_5.conda#ef5333594a958b25912002886b82b253 +https://conda.anaconda.org/conda-forge/linux-64/pyqt5-sip-12.13.0-py310hf71b8c6_1.conda#0c8cbfbe70f4c8a47b040a14615e6f1f https://conda.anaconda.org/conda-forge/noarch/pytest-xdist-3.6.1-pyhd8ed1ab_1.conda#59aad4fb37cabc0bacc73cf344612ddd https://conda.anaconda.org/conda-forge/linux-64/tbb-2021.13.0-hceb3a55_1.conda#ba7726b8df7b9d34ea80e82b097a4893 https://conda.anaconda.org/conda-forge/linux-64/zstandard-0.23.0-py310ha75aee5_1.conda#0316e8d0e00c00631a6de89207db5b09 @@ -253,7 +253,7 @@ https://conda.anaconda.org/conda-forge/linux-64/gstreamer-1.24.7-hf3bb09a_0.cond https://conda.anaconda.org/conda-forge/linux-64/mkl-2024.2.2-ha957f24_16.conda#1459379c79dda834673426504d52b319 https://conda.anaconda.org/conda-forge/linux-64/pulseaudio-client-17.0-hac146a9_1.conda#66b1fa9608d8836e25f9919159adc9c6 https://conda.anaconda.org/conda-forge/noarch/towncrier-24.8.0-pyhd8ed1ab_1.conda#820b6a1ddf590fba253f8204f7200d82 -https://conda.anaconda.org/conda-forge/noarch/urllib3-2.3.0-pyhd8ed1ab_0.conda#32674f8dbfb7b26410ed580dd3c10a29 +https://conda.anaconda.org/conda-forge/noarch/urllib3-2.4.0-pyhd8ed1ab_0.conda#c1e349028e0052c4eea844e94f773065 https://conda.anaconda.org/conda-forge/linux-64/gst-plugins-base-1.24.7-h0a52356_0.conda#d368425fbd031a2f8e801a40c3415c72 https://conda.anaconda.org/conda-forge/linux-64/liblapack-3.9.0-11_h9f1adc1_netlib.conda#fb4e3a141e4be1caf354a9d81780245b https://conda.anaconda.org/conda-forge/noarch/requests-2.32.3-pyhd8ed1ab_1.conda#a9b9368f3701a417eac9edbcae7cb737 @@ -268,7 +268,7 @@ https://conda.anaconda.org/conda-forge/linux-64/matplotlib-base-3.5.0-py310h23f4 https://conda.anaconda.org/conda-forge/linux-64/pandas-1.4.0-py310hb5077e9_0.tar.bz2#43e920bc9856daa7d8d18fcbfb244c4e https://conda.anaconda.org/conda-forge/noarch/patsy-1.0.1-pyhd8ed1ab_1.conda#ee23fabfd0a8c6b8d6f3729b47b2859d https://conda.anaconda.org/conda-forge/linux-64/polars-0.20.30-py310h031f9ce_0.conda#0743f5db9f978b6df92d412935ff8371 -https://conda.anaconda.org/conda-forge/linux-64/pyqt-5.15.9-py310h04931ad_5.conda#f4fe7a6e3d7c78c9de048ea9dda21690 +https://conda.anaconda.org/conda-forge/linux-64/pyqt-5.15.10-py310hb3b5edb_1.conda#c370972fc4557cb54d265c9c1f71bd20 https://conda.anaconda.org/conda-forge/linux-64/pywavelets-1.6.0-py310h261611a_0.conda#04a405ee0bccb4de8d1ed0c87704f5f6 https://conda.anaconda.org/conda-forge/linux-64/scipy-1.8.0-py310hea5193d_1.tar.bz2#664d80ddeb51241629b3ada5ea926e4d https://conda.anaconda.org/conda-forge/linux-64/blas-2.131-blis.conda#87829e6b9fe49a926280e100959b7d2b diff --git a/build_tools/github/pymin_conda_forge_arm_linux-aarch64_conda.lock b/build_tools/github/pymin_conda_forge_arm_linux-aarch64_conda.lock index de98371205a57..37f445a152de7 100644 --- a/build_tools/github/pymin_conda_forge_arm_linux-aarch64_conda.lock +++ b/build_tools/github/pymin_conda_forge_arm_linux-aarch64_conda.lock @@ -31,7 +31,7 @@ https://conda.anaconda.org/conda-forge/linux-aarch64/libstdcxx-14.2.0-h3f4de04_2 https://conda.anaconda.org/conda-forge/linux-aarch64/libwebp-base-1.5.0-h0886dbf_0.conda#95ef4a689b8cc1b7e18b53784d88f96b https://conda.anaconda.org/conda-forge/linux-aarch64/libzlib-1.3.1-h86ecc28_2.conda#08aad7cbe9f5a6b460d0976076b6ae64 https://conda.anaconda.org/conda-forge/linux-aarch64/ncurses-6.5-ha32ae93_3.conda#182afabe009dc78d8b73100255ee6868 -https://conda.anaconda.org/conda-forge/linux-aarch64/openssl-3.4.1-hd08dc88_0.conda#09036190605c57eaecf01218e0e9542d +https://conda.anaconda.org/conda-forge/linux-aarch64/openssl-3.5.0-hd08dc88_0.conda#26af4dcecaf373c31ae91f403ae98259 https://conda.anaconda.org/conda-forge/linux-aarch64/pthread-stubs-0.4-h86ecc28_1002.conda#bb5a90c93e3bac3d5690acf76b4a6386 https://conda.anaconda.org/conda-forge/linux-aarch64/xorg-libice-1.1.2-h86ecc28_0.conda#c8d8ec3e00cd0fd8a231789b91a7c5b7 https://conda.anaconda.org/conda-forge/linux-aarch64/xorg-libxau-1.0.12-h86ecc28_0.conda#d5397424399a66d33c80b1f2345a36a6 @@ -54,7 +54,7 @@ https://conda.anaconda.org/conda-forge/linux-aarch64/libstdcxx-ng-14.2.0-hf1166c https://conda.anaconda.org/conda-forge/linux-aarch64/libuuid-2.38.1-hb4cce97_0.conda#000e30b09db0b7c775b21695dff30969 https://conda.anaconda.org/conda-forge/linux-aarch64/libxcb-1.17.0-h262b8f6_0.conda#cd14ee5cca2464a425b1dbfc24d90db2 https://conda.anaconda.org/conda-forge/linux-aarch64/libxcrypt-4.4.36-h31becfc_1.conda#b4df5d7d4b63579d081fd3a4cf99740e -https://conda.anaconda.org/conda-forge/linux-aarch64/mysql-common-9.0.1-h3f5c77f_5.conda#bdc934577bc277924815fbfcba632822 +https://conda.anaconda.org/conda-forge/linux-aarch64/mysql-common-9.2.0-h3f5c77f_0.conda#f9db1ad1a8897483edb3ac321d662e7b https://conda.anaconda.org/conda-forge/linux-aarch64/pixman-0.44.2-h86a87f0_0.conda#95689fc369832398e82d17c56ff5df8a https://conda.anaconda.org/conda-forge/linux-aarch64/readline-8.2-h8382b9d_2.conda#c0f08fc2737967edde1a272d4bf41ed9 https://conda.anaconda.org/conda-forge/linux-aarch64/tk-8.6.13-h194ca79_0.conda#f75105e0585851f818e0009dd1dde4dc @@ -68,10 +68,10 @@ https://conda.anaconda.org/conda-forge/linux-aarch64/lerc-4.0.0-h4de3ea5_0.tar.b https://conda.anaconda.org/conda-forge/linux-aarch64/libdrm-2.4.124-h86ecc28_0.conda#a8058bcb6b4fa195aaa20452437c7727 https://conda.anaconda.org/conda-forge/linux-aarch64/libgfortran-ng-14.2.0-he9431aa_2.conda#0980d7d931474a6a037ae66f1da4d2fe https://conda.anaconda.org/conda-forge/linux-aarch64/libopenblas-0.3.29-pthreads_h9d3fd7e_0.conda#a99e2bfcb1ad6362544c71281eb617e9 -https://conda.anaconda.org/conda-forge/linux-aarch64/mysql-libs-9.0.1-h11569fd_5.conda#bbee9b7b1fb37bd1d9c5df0fc50fda84 +https://conda.anaconda.org/conda-forge/linux-aarch64/mysql-libs-9.2.0-h11569fd_0.conda#72f21962b1205535d810b82f8f0fa342 https://conda.anaconda.org/conda-forge/linux-aarch64/ninja-1.12.1-h70be974_0.conda#216635cea46498d8045c7cf0f03eaf72 https://conda.anaconda.org/conda-forge/linux-aarch64/pcre2-10.44-h070dd5b_2.conda#94022de9682cb1a0bb18a99cbc3541b3 -https://conda.anaconda.org/conda-forge/linux-aarch64/python-3.10.16-hee626be_2_cpython.conda#e199431c5f250b8bc812cf4d6630715c +https://conda.anaconda.org/conda-forge/linux-aarch64/python-3.10.17-h256493d_0_cpython.conda#c496213b6ede3c5a30ce1bf02bebf382 https://conda.anaconda.org/conda-forge/linux-aarch64/qhull-2020.2-h70be974_5.conda#bb138086d938e2b64f5f364945793ebf https://conda.anaconda.org/conda-forge/linux-aarch64/wayland-1.23.1-h698ed42_0.conda#2661f9252065051914f1cdf5835e7430 https://conda.anaconda.org/conda-forge/linux-aarch64/xcb-util-0.4.1-h5c728e9_2.conda#b4cf8ba6cff9cdf1249bcfe1314222b0 @@ -140,7 +140,7 @@ https://conda.anaconda.org/conda-forge/linux-aarch64/xorg-libxdamage-1.1.6-h86ec https://conda.anaconda.org/conda-forge/linux-aarch64/xorg-libxi-1.8.2-h57736b2_0.conda#eeee3bdb31c6acde2b81ad1b8c287087 https://conda.anaconda.org/conda-forge/linux-aarch64/xorg-libxrandr-1.5.4-h86ecc28_0.conda#dd3e74283a082381aa3860312e3c721e https://conda.anaconda.org/conda-forge/linux-aarch64/xorg-libxxf86vm-1.1.6-h86ecc28_0.conda#d745faa2d7c15092652e40a22bb261ed -https://conda.anaconda.org/conda-forge/linux-aarch64/harfbuzz-11.0.0-hb5e3f52_0.conda#05aafde71043cefa7aa045d02d13a121 +https://conda.anaconda.org/conda-forge/linux-aarch64/harfbuzz-11.0.1-h4b4994d_0.conda#25049801f7464aecad6dcd1e4cd4830c https://conda.anaconda.org/conda-forge/linux-aarch64/libclang-cpp20.1-20.1.2-default_he324ac1_0.conda#92c39738e932a6e56f4f8e79cf90cbca https://conda.anaconda.org/conda-forge/linux-aarch64/libclang13-20.1.2-default_h4390ef5_0.conda#1b6fe4be5192efb10a7e8578d29f4cb4 https://conda.anaconda.org/conda-forge/linux-aarch64/liblapacke-3.9.0-31_hc659ca5_openblas.conda#256bb281d78e5b8927ff13a1cde9f6f5 @@ -152,7 +152,7 @@ https://conda.anaconda.org/conda-forge/noarch/pytest-xdist-3.6.1-pyhd8ed1ab_1.co https://conda.anaconda.org/conda-forge/linux-aarch64/xorg-libxtst-1.2.5-h57736b2_3.conda#c05698071b5c8e0da82a282085845860 https://conda.anaconda.org/conda-forge/linux-aarch64/blas-devel-3.9.0-31_h9678261_openblas.conda#a2cc143d7e25e52a915cb320e5b0d592 https://conda.anaconda.org/conda-forge/linux-aarch64/contourpy-1.3.1-py310hf54e67a_0.conda#4dd4efc74373cb53f9c1191f768a9b45 -https://conda.anaconda.org/conda-forge/linux-aarch64/qt6-main-6.9.0-ha483c8b_0.conda#0790eb2e015cb32391cac90f68b39a40 +https://conda.anaconda.org/conda-forge/linux-aarch64/qt6-main-6.9.0-ha483c8b_1.conda#fb32973c68de1f23a7e4de3651442b15 https://conda.anaconda.org/conda-forge/linux-aarch64/scipy-1.15.2-py310hf37559f_0.conda#5c9b72f10d2118d943a5eaaf2f396891 https://conda.anaconda.org/conda-forge/linux-aarch64/blas-2.131-openblas.conda#51c5f346e1ebee750f76066490059df9 https://conda.anaconda.org/conda-forge/linux-aarch64/matplotlib-base-3.10.1-py310h2cc5e2d_0.conda#5652e355346f4823f6b4bfdd4860359d From d99c7cf8e8c6ef159e1a4e1f1e92308d4245e13b Mon Sep 17 00:00:00 2001 From: Lucy Liu Date: Mon, 14 Apr 2025 19:33:55 +1000 Subject: [PATCH 049/182] DOC Add comment about input checking in `pairwise_distances` (#31170) --- sklearn/metrics/pairwise.py | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/sklearn/metrics/pairwise.py b/sklearn/metrics/pairwise.py index cca8f2b6ae1c7..1a70d2e4fbcea 100644 --- a/sklearn/metrics/pairwise.py +++ b/sklearn/metrics/pairwise.py @@ -1982,6 +1982,7 @@ def _pairwise_callable(X, Y, metric, ensure_all_finite=True, **kwds): Y, dtype=None, ensure_all_finite=ensure_all_finite, + # No input dimension checking done for custom metrics (left to user) ensure_2d=False, ) @@ -2411,6 +2412,10 @@ def pairwise_distances( sklearn.metrics.pairwise.paired_distances : Computes the distances between corresponding elements of two arrays. + Notes + ----- + If metric is a callable, no restrictions are placed on `X` and `Y` dimensions. + Examples -------- >>> from sklearn.metrics.pairwise import pairwise_distances @@ -2637,7 +2642,7 @@ def pairwise_kernels( Notes ----- - If metric is 'precomputed', Y is ignored and X is returned. + If metric is a callable, no restrictions are placed on `X` and `Y` dimensions. Examples -------- From fae33fa866055bcabfd3538b58e8b56054f4baea Mon Sep 17 00:00:00 2001 From: Arjun S <68005051+Nujra40@users.noreply.github.com> Date: Tue, 15 Apr 2025 00:49:27 +0530 Subject: [PATCH 050/182] DOC add link to plot_confusion_matrix example in confusion_matrix.py (#30949) Co-authored-by: Maren Westermann --- sklearn/metrics/_plot/confusion_matrix.py | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/sklearn/metrics/_plot/confusion_matrix.py b/sklearn/metrics/_plot/confusion_matrix.py index ad0821344661e..63a5382f3fa2b 100644 --- a/sklearn/metrics/_plot/confusion_matrix.py +++ b/sklearn/metrics/_plot/confusion_matrix.py @@ -316,6 +316,10 @@ def from_estimator( ... clf, X_test, y_test) <...> >>> plt.show() + + For a detailed example of using a confusion matrix to evaluate a + Support Vector Classifier, please see + :ref:`sphx_glr_auto_examples_model_selection_plot_confusion_matrix.py` """ method_name = f"{cls.__name__}.from_estimator" check_matplotlib_support(method_name) From dcfb52b5f3e1e270e8a5925215ad13cfb7174b96 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?J=C3=A9r=C3=A9mie=20du=20Boisberranger?= Date: Tue, 15 Apr 2025 11:45:18 +0200 Subject: [PATCH 051/182] MNT Clean-up deprecations for 1.7: sample_weight as positional arg when not consumed (#31119) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Co-authored-by: Adrin Jalali Co-authored-by: Loïc Estève --- sklearn/ensemble/_bagging.py | 29 +++++++++------- sklearn/ensemble/_stacking.py | 50 ++++++--------------------- sklearn/ensemble/_voting.py | 37 ++++---------------- sklearn/ensemble/tests/test_voting.py | 4 +-- sklearn/linear_model/_ransac.py | 7 +--- sklearn/utils/_metadata_requests.py | 11 ++++-- 6 files changed, 46 insertions(+), 92 deletions(-) diff --git a/sklearn/ensemble/_bagging.py b/sklearn/ensemble/_bagging.py index 901c63c9250bc..d110c8bd613d6 100644 --- a/sklearn/ensemble/_bagging.py +++ b/sklearn/ensemble/_bagging.py @@ -40,7 +40,6 @@ from ..utils.validation import ( _check_method_params, _check_sample_weight, - _deprecate_positional_args, _estimator_has, check_is_fitted, has_fit_parameter, @@ -338,15 +337,11 @@ def __init__( self.random_state = random_state self.verbose = verbose - # TODO(1.7): remove `sample_weight` from the signature after deprecation - # cycle; pop it from `fit_params` before the `_raise_for_params` check and - # reinsert later, for backwards compatibility - @_deprecate_positional_args(version="1.7") @_fit_context( # BaseBagging.estimator is not validated yet prefer_skip_nested_validation=False ) - def fit(self, X, y, *, sample_weight=None, **fit_params): + def fit(self, X, y, sample_weight=None, **fit_params): """Build a Bagging ensemble of estimators from the training set (X, y). Parameters @@ -363,7 +358,6 @@ def fit(self, X, y, *, sample_weight=None, **fit_params): Sample weights. If None, then samples are equally weighted. Note that this is supported only if the base estimator supports sample weighting. - **fit_params : dict Parameters to pass to the underlying estimators. @@ -393,11 +387,13 @@ def fit(self, X, y, *, sample_weight=None, **fit_params): multi_output=True, ) - if sample_weight is not None: - sample_weight = _check_sample_weight(sample_weight, X, dtype=None) - fit_params["sample_weight"] = sample_weight - - return self._fit(X, y, max_samples=self.max_samples, **fit_params) + return self._fit( + X, + y, + max_samples=self.max_samples, + sample_weight=sample_weight, + **fit_params, + ) def _parallel_args(self): return {} @@ -409,6 +405,7 @@ def _fit( max_samples=None, max_depth=None, check_input=True, + sample_weight=None, **fit_params, ): """Build a Bagging ensemble of estimators from the training @@ -437,6 +434,11 @@ def _fit( If the meta-estimator already checks the input, set this value to False to prevent redundant input validation. + sample_weight : array-like of shape (n_samples,), default=None + Sample weights. If None, then samples are equally weighted. + Note that this is supported only if the base estimator supports + sample weighting. + **fit_params : dict, default=None Parameters to pass to the :term:`fit` method of the underlying estimator. @@ -456,6 +458,9 @@ def _fit( # Check parameters self._validate_estimator(self._get_estimator()) + if sample_weight is not None: + fit_params["sample_weight"] = sample_weight + if _routing_enabled(): routed_params = process_routing(self, "fit", **fit_params) else: diff --git a/sklearn/ensemble/_stacking.py b/sklearn/ensemble/_stacking.py index bf5ff39c13165..d7491be2f666f 100644 --- a/sklearn/ensemble/_stacking.py +++ b/sklearn/ensemble/_stacking.py @@ -39,7 +39,6 @@ from ..utils.validation import ( _check_feature_names_in, _check_response_method, - _deprecate_positional_args, _estimator_has, check_is_fitted, column_or_1d, @@ -657,11 +656,7 @@ def _validate_estimators(self): return names, estimators - # TODO(1.7): remove `sample_weight` from the signature after deprecation - # cycle; pop it from `fit_params` before the `_raise_for_params` check and - # reinsert afterwards, for backwards compatibility - @_deprecate_positional_args(version="1.7") - def fit(self, X, y, *, sample_weight=None, **fit_params): + def fit(self, X, y, **fit_params): """Fit the estimators. Parameters @@ -676,11 +671,6 @@ def fit(self, X, y, *, sample_weight=None, **fit_params): matter (e.g. for ordinal regression), one should numerically encode the target `y` before calling :term:`fit`. - sample_weight : array-like of shape (n_samples,), default=None - Sample weights. If None, then samples are equally weighted. - Note that this is supported only if all underlying estimators - support sample weights. - **fit_params : dict Parameters to pass to the underlying estimators. @@ -696,7 +686,8 @@ def fit(self, X, y, *, sample_weight=None, **fit_params): self : object Returns a fitted instance of estimator. """ - _raise_for_params(fit_params, self, "fit") + _raise_for_params(fit_params, self, "fit", allow=["sample_weight"]) + check_classification_targets(y) if type_of_target(y) == "multilabel-indicator": self._label_encoder = [LabelEncoder().fit(yk) for yk in y.T] @@ -712,8 +703,6 @@ def fit(self, X, y, *, sample_weight=None, **fit_params): self.classes_ = self._label_encoder.classes_ y_encoded = self._label_encoder.transform(y) - if sample_weight is not None: - fit_params["sample_weight"] = sample_weight return super().fit(X, y_encoded, **fit_params) @available_if( @@ -1020,11 +1009,7 @@ def _validate_final_estimator(self): ) ) - # TODO(1.7): remove `sample_weight` from the signature after deprecation - # cycle; pop it from `fit_params` before the `_raise_for_params` check and - # reinsert afterwards, for backwards compatibility - @_deprecate_positional_args(version="1.7") - def fit(self, X, y, *, sample_weight=None, **fit_params): + def fit(self, X, y, **fit_params): """Fit the estimators. Parameters @@ -1036,11 +1021,6 @@ def fit(self, X, y, *, sample_weight=None, **fit_params): y : array-like of shape (n_samples,) Target values. - sample_weight : array-like of shape (n_samples,), default=None - Sample weights. If None, then samples are equally weighted. - Note that this is supported only if all underlying estimators - support sample weights. - **fit_params : dict Parameters to pass to the underlying estimators. @@ -1056,10 +1036,10 @@ def fit(self, X, y, *, sample_weight=None, **fit_params): self : object Returns a fitted instance. """ - _raise_for_params(fit_params, self, "fit") + _raise_for_params(fit_params, self, "fit", allow=["sample_weight"]) + y = column_or_1d(y, warn=True) - if sample_weight is not None: - fit_params["sample_weight"] = sample_weight + return super().fit(X, y, **fit_params) def transform(self, X): @@ -1078,11 +1058,7 @@ def transform(self, X): """ return self._transform(X) - # TODO(1.7): remove `sample_weight` from the signature after deprecation - # cycle; pop it from `fit_params` before the `_raise_for_params` check and - # reinsert afterwards, for backwards compatibility - @_deprecate_positional_args(version="1.7") - def fit_transform(self, X, y, *, sample_weight=None, **fit_params): + def fit_transform(self, X, y, **fit_params): """Fit the estimators and return the predictions for X for each estimator. Parameters @@ -1094,11 +1070,6 @@ def fit_transform(self, X, y, *, sample_weight=None, **fit_params): y : array-like of shape (n_samples,) Target values. - sample_weight : array-like of shape (n_samples,), default=None - Sample weights. If None, then samples are equally weighted. - Note that this is supported only if all underlying estimators - support sample weights. - **fit_params : dict Parameters to pass to the underlying estimators. @@ -1114,9 +1085,8 @@ def fit_transform(self, X, y, *, sample_weight=None, **fit_params): y_preds : ndarray of shape (n_samples, n_estimators) Prediction outputs for each estimator. """ - _raise_for_params(fit_params, self, "fit") - if sample_weight is not None: - fit_params["sample_weight"] = sample_weight + _raise_for_params(fit_params, self, "fit", allow=["sample_weight"]) + return super().fit_transform(X, y, **fit_params) @available_if( diff --git a/sklearn/ensemble/_voting.py b/sklearn/ensemble/_voting.py index f5325c89de18d..d72e5806bbae0 100644 --- a/sklearn/ensemble/_voting.py +++ b/sklearn/ensemble/_voting.py @@ -38,7 +38,6 @@ from ..utils.parallel import Parallel, delayed from ..utils.validation import ( _check_feature_names_in, - _deprecate_positional_args, check_is_fitted, column_or_1d, ) @@ -352,11 +351,7 @@ def __init__( # estimators in VotingClassifier.estimators are not validated yet prefer_skip_nested_validation=False ) - # TODO(1.7): remove `sample_weight` from the signature after deprecation - # cycle; pop it from `fit_params` before the `_raise_for_params` check and - # reinsert later, for backwards compatibility - @_deprecate_positional_args(version="1.7") - def fit(self, X, y, *, sample_weight=None, **fit_params): + def fit(self, X, y, **fit_params): """Fit the estimators. Parameters @@ -368,13 +363,6 @@ def fit(self, X, y, *, sample_weight=None, **fit_params): y : array-like of shape (n_samples,) Target values. - sample_weight : array-like of shape (n_samples,), default=None - Sample weights. If None, then samples are equally weighted. - Note that this is supported only if all underlying estimators - support sample weights. - - .. versionadded:: 0.18 - **fit_params : dict Parameters to pass to the underlying estimators. @@ -391,7 +379,8 @@ def fit(self, X, y, *, sample_weight=None, **fit_params): self : object Returns the instance itself. """ - _raise_for_params(fit_params, self, "fit") + _raise_for_params(fit_params, self, "fit", allow=["sample_weight"]) + y_type = type_of_target(y, input_name="y") if y_type in ("unknown", "continuous"): # raise a specific ValueError for non-classification tasks @@ -413,9 +402,6 @@ def fit(self, X, y, *, sample_weight=None, **fit_params): self.classes_ = self.le_.classes_ transformed_y = self.le_.transform(y) - if sample_weight is not None: - fit_params["sample_weight"] = sample_weight - return super().fit(X, transformed_y, **fit_params) def predict(self, X): @@ -657,11 +643,7 @@ def __init__(self, estimators, *, weights=None, n_jobs=None, verbose=False): # estimators in VotingRegressor.estimators are not validated yet prefer_skip_nested_validation=False ) - # TODO(1.7): remove `sample_weight` from the signature after deprecation cycle; - # pop it from `fit_params` before the `_raise_for_params` check and reinsert later, - # for backwards compatibility - @_deprecate_positional_args(version="1.7") - def fit(self, X, y, *, sample_weight=None, **fit_params): + def fit(self, X, y, **fit_params): """Fit the estimators. Parameters @@ -673,11 +655,6 @@ def fit(self, X, y, *, sample_weight=None, **fit_params): y : array-like of shape (n_samples,) Target values. - sample_weight : array-like of shape (n_samples,), default=None - Sample weights. If None, then samples are equally weighted. - Note that this is supported only if all underlying estimators - support sample weights. - **fit_params : dict Parameters to pass to the underlying estimators. @@ -694,10 +671,10 @@ def fit(self, X, y, *, sample_weight=None, **fit_params): self : object Fitted estimator. """ - _raise_for_params(fit_params, self, "fit") + _raise_for_params(fit_params, self, "fit", allow=["sample_weight"]) + y = column_or_1d(y, warn=True) - if sample_weight is not None: - fit_params["sample_weight"] = sample_weight + return super().fit(X, y, **fit_params) def predict(self, X): diff --git a/sklearn/ensemble/tests/test_voting.py b/sklearn/ensemble/tests/test_voting.py index 797dd9bdd5989..632ca73479623 100644 --- a/sklearn/ensemble/tests/test_voting.py +++ b/sklearn/ensemble/tests/test_voting.py @@ -340,7 +340,7 @@ def test_sample_weight(global_random_seed): ) sample_weight = np.random.RandomState(global_random_seed).uniform(size=(len(y),)) eclf3 = VotingClassifier(estimators=[("lr", clf1)], voting="soft") - eclf3.fit(X_scaled, y, sample_weight) + eclf3.fit(X_scaled, y, sample_weight=sample_weight) clf1.fit(X_scaled, y, sample_weight) assert_array_equal(eclf3.predict(X_scaled), clf1.predict(X_scaled)) assert_array_almost_equal( @@ -355,7 +355,7 @@ def test_sample_weight(global_random_seed): ) msg = "Underlying estimator KNeighborsClassifier does not support sample weights." with pytest.raises(TypeError, match=msg): - eclf3.fit(X_scaled, y, sample_weight) + eclf3.fit(X_scaled, y, sample_weight=sample_weight) # check that _fit_single_estimator will raise the right error # it should raise the original error if this is not linked to sample_weight diff --git a/sklearn/linear_model/_ransac.py b/sklearn/linear_model/_ransac.py index e58696d4d8296..30e5b4ff39613 100644 --- a/sklearn/linear_model/_ransac.py +++ b/sklearn/linear_model/_ransac.py @@ -35,7 +35,6 @@ from ..utils.validation import ( _check_method_params, _check_sample_weight, - _deprecate_positional_args, check_is_fitted, has_fit_parameter, validate_data, @@ -319,11 +318,7 @@ def __init__( # RansacRegressor.estimator is not validated yet prefer_skip_nested_validation=False ) - # TODO(1.7): remove `sample_weight` from the signature after deprecation - # cycle; for backwards compatibility: pop it from `fit_params` before the - # `_raise_for_params` check and reinsert it after the check - @_deprecate_positional_args(version="1.7") - def fit(self, X, y, *, sample_weight=None, **fit_params): + def fit(self, X, y, sample_weight=None, **fit_params): """Fit estimator using RANSAC algorithm. Parameters diff --git a/sklearn/utils/_metadata_requests.py b/sklearn/utils/_metadata_requests.py index d7d77a74c6fa8..7bf84511a67d2 100644 --- a/sklearn/utils/_metadata_requests.py +++ b/sklearn/utils/_metadata_requests.py @@ -130,7 +130,7 @@ def _routing_enabled(): return get_config().get("enable_metadata_routing", False) -def _raise_for_params(params, owner, method): +def _raise_for_params(params, owner, method, allow=None): """Raise an error if metadata routing is not enabled and params are passed. .. versionadded:: 1.4 @@ -146,6 +146,10 @@ def _raise_for_params(params, owner, method): method : str The name of the method, e.g. "fit". + allow : list of str, default=None + A list of parameters which are allowed to be passed even if metadata + routing is not enabled. + Raises ------ ValueError @@ -154,7 +158,10 @@ def _raise_for_params(params, owner, method): caller = ( f"{owner.__class__.__name__}.{method}" if method else owner.__class__.__name__ ) - if not _routing_enabled() and params: + + allow = allow if allow is not None else {} + + if not _routing_enabled() and (params.keys() - allow): raise ValueError( f"Passing extra keyword arguments to {caller} is only supported if" " enable_metadata_routing=True, which you can set using" From ff78e258ccf11068e2b3a433c51517ae56234f88 Mon Sep 17 00:00:00 2001 From: Dimitri Papadopoulos Orfanos <3234522+DimitriPapadopoulos@users.noreply.github.com> Date: Tue, 15 Apr 2025 13:11:52 +0200 Subject: [PATCH 052/182] MNT Use ruff format rather than black (#31015) --- .circleci/config.yml | 2 +- .github/workflows/arm-unit-tests.yml | 2 +- .github/workflows/lint.yml | 3 +- .pre-commit-config.yaml | 7 +-- README.rst | 8 +-- azure-pipelines.yml | 2 +- .../bench_hist_gradient_boosting_adult.py | 2 +- ...bench_hist_gradient_boosting_higgsboson.py | 2 +- build_tools/get_comment.py | 42 ++++++-------- build_tools/linting.sh | 17 +++--- doc/developers/contributing.rst | 4 +- .../plot_species_distribution_modeling.py | 2 +- .../plot_time_series_lagged_features.py | 2 +- .../plot_topics_extraction_with_nmf_lda.py | 2 +- .../covariance/plot_mahalanobis_distances.py | 2 +- examples/ensemble/plot_bias_variance.py | 4 +- examples/feature_selection/plot_rfe_digits.py | 2 +- .../plot_select_from_model_diabetes.py | 2 +- ...lot_tweedie_regression_insurance_claims.py | 5 +- examples/manifold/plot_lle_digits.py | 1 - examples/manifold/plot_manifold_sphere.py | 2 +- ...ot_partial_dependence_visualization_api.py | 2 +- .../model_selection/plot_likelihood_ratios.py | 2 +- examples/model_selection/plot_roc.py | 6 +- ...ot_document_classification_20newsgroups.py | 2 +- maint_tools/bump-dependencies-versions.py | 2 +- pyproject.toml | 47 ++++++--------- sklearn/_loss/tests/test_loss.py | 8 ++- sklearn/_min_dependencies.py | 3 +- sklearn/cluster/_feature_agglomeration.py | 1 - sklearn/cross_decomposition/tests/test_pls.py | 4 +- sklearn/datasets/tests/test_openml.py | 14 ++--- .../datasets/tests/test_samples_generator.py | 36 ++++++------ sklearn/ensemble/_bagging.py | 1 - sklearn/ensemble/_forest.py | 1 - sklearn/ensemble/tests/test_forest.py | 19 +++--- .../enable_hist_gradient_boosting.py | 1 - .../_univariate_selection.py | 1 - sklearn/gaussian_process/tests/test_gpc.py | 5 +- sklearn/gaussian_process/tests/test_gpr.py | 5 +- .../tests/test_plot_partial_dependence.py | 12 ++-- sklearn/kernel_approximation.py | 4 +- sklearn/linear_model/_glm/_newton_solver.py | 4 +- sklearn/linear_model/_linear_loss.py | 8 +-- sklearn/linear_model/_ridge.py | 1 - sklearn/linear_model/_theil_sen.py | 1 - sklearn/linear_model/tests/test_ridge.py | 12 ++-- sklearn/manifold/_spectral_embedding.py | 1 - sklearn/manifold/_t_sne.py | 6 +- sklearn/metrics/_ranking.py | 1 - sklearn/metrics/cluster/_supervised.py | 1 - sklearn/metrics/cluster/_unsupervised.py | 1 - sklearn/metrics/tests/test_common.py | 5 +- .../test_pairwise_distances_reduction.py | 6 +- .../mixture/tests/test_bayesian_mixture.py | 2 +- sklearn/model_selection/_validation.py | 5 +- sklearn/model_selection/tests/test_search.py | 6 +- sklearn/model_selection/tests/test_split.py | 6 +- sklearn/multioutput.py | 2 - sklearn/neighbors/_classification.py | 4 +- sklearn/neighbors/tests/test_neighbors.py | 2 +- .../tests/test_function_transformer.py | 24 ++++---- sklearn/semi_supervised/_self_training.py | 3 +- sklearn/tests/metadata_routing_common.py | 12 ++-- sklearn/tests/test_common.py | 1 - sklearn/tests/test_discriminant_analysis.py | 12 ++-- sklearn/tests/test_metaestimators.py | 22 +++---- sklearn/tree/tests/test_monotonic_tree.py | 6 +- sklearn/tree/tests/test_tree.py | 58 +++++++++---------- sklearn/utils/_array_api.py | 2 +- sklearn/utils/_metadata_requests.py | 5 +- .../utils/_test_common/instance_generator.py | 6 +- sklearn/utils/estimator_checks.py | 16 +++-- sklearn/utils/fixes.py | 2 +- sklearn/utils/tests/test_indexing.py | 1 - sklearn/utils/tests/test_multiclass.py | 31 +++++----- sklearn/utils/tests/test_pprint.py | 12 ++-- sklearn/utils/tests/test_seq_dataset.py | 8 +-- sklearn/utils/tests/test_tags.py | 1 - sklearn/utils/tests/test_validation.py | 6 +- sklearn/utils/validation.py | 3 +- 81 files changed, 279 insertions(+), 317 deletions(-) diff --git a/.circleci/config.yml b/.circleci/config.yml index e0ec9a85978f2..bd4914056fe10 100644 --- a/.circleci/config.yml +++ b/.circleci/config.yml @@ -11,7 +11,7 @@ jobs: command: | source build_tools/shared.sh # Include pytest compatibility with mypy - pip install pytest $(get_dep ruff min) $(get_dep mypy min) $(get_dep black min) cython-lint + pip install pytest $(get_dep ruff min) $(get_dep mypy min) cython-lint - run: name: linting command: ./build_tools/linting.sh diff --git a/.github/workflows/arm-unit-tests.yml b/.github/workflows/arm-unit-tests.yml index 1702177b7a718..e7636d55d7945 100644 --- a/.github/workflows/arm-unit-tests.yml +++ b/.github/workflows/arm-unit-tests.yml @@ -27,7 +27,7 @@ jobs: run: | source build_tools/shared.sh # Include pytest compatibility with mypy - pip install pytest $(get_dep ruff min) $(get_dep mypy min) $(get_dep black min) cython-lint + pip install pytest $(get_dep ruff min) $(get_dep mypy min) cython-lint - name: Run linters run: ./build_tools/linting.sh - name: Run Meson OpenMP checks diff --git a/.github/workflows/lint.yml b/.github/workflows/lint.yml index 0ef75cdcce660..9fe670caef441 100644 --- a/.github/workflows/lint.yml +++ b/.github/workflows/lint.yml @@ -34,11 +34,10 @@ jobs: curl https://raw.githubusercontent.com/${{ github.repository }}/main/build_tools/shared.sh --retry 5 -o ./build_tools/shared.sh source build_tools/shared.sh # Include pytest compatibility with mypy - pip install pytest $(get_dep ruff min) $(get_dep mypy min) $(get_dep black min) cython-lint + pip install pytest $(get_dep ruff min) $(get_dep mypy min) # we save the versions of the linters to be used in the error message later. python -c "from importlib.metadata import version; print(f\"ruff={version('ruff')}\")" >> /tmp/versions.txt python -c "from importlib.metadata import version; print(f\"mypy={version('mypy')}\")" >> /tmp/versions.txt - python -c "from importlib.metadata import version; print(f\"black={version('black')}\")" >> /tmp/versions.txt python -c "from importlib.metadata import version; print(f\"cython-lint={version('cython-lint')}\")" >> /tmp/versions.txt - name: Run linting diff --git a/.pre-commit-config.yaml b/.pre-commit-config.yaml index 98e902e622822..42f2445728028 100644 --- a/.pre-commit-config.yaml +++ b/.pre-commit-config.yaml @@ -7,14 +7,11 @@ repos: - id: end-of-file-fixer - id: trailing-whitespace - repo: https://github.com/astral-sh/ruff-pre-commit - rev: v0.11.0 + rev: v0.11.2 hooks: - id: ruff args: ["--fix", "--output-format=full"] -- repo: https://github.com/psf/black - rev: 24.3.0 - hooks: - - id: black + - id: ruff-format - repo: https://github.com/pre-commit/mirrors-mypy rev: v1.15.0 hooks: diff --git a/README.rst b/README.rst index 031b724b5545c..4f4741a090dee 100644 --- a/README.rst +++ b/README.rst @@ -1,6 +1,6 @@ .. -*- mode: rst -*- -|Azure| |Codecov| |CircleCI| |Nightly wheels| |Black| |PythonVersion| |PyPi| |DOI| |Benchmark| +|Azure| |Codecov| |CircleCI| |Nightly wheels| |Ruff| |PythonVersion| |PyPi| |DOI| |Benchmark| .. |Azure| image:: https://dev.azure.com/scikit-learn/scikit-learn/_apis/build/status/scikit-learn.scikit-learn?branchName=main :target: https://dev.azure.com/scikit-learn/scikit-learn/_build/latest?definitionId=1&branchName=main @@ -14,15 +14,15 @@ .. |Nightly wheels| image:: https://github.com/scikit-learn/scikit-learn/workflows/Wheel%20builder/badge.svg?event=schedule :target: https://github.com/scikit-learn/scikit-learn/actions?query=workflow%3A%22Wheel+builder%22+event%3Aschedule +.. |Ruff| image:: https://img.shields.io/badge/code%20style-ruff-000000.svg + :target: https://github.com/astral-sh/ruff + .. |PythonVersion| image:: https://img.shields.io/pypi/pyversions/scikit-learn.svg :target: https://pypi.org/project/scikit-learn/ .. |PyPi| image:: https://img.shields.io/pypi/v/scikit-learn :target: https://pypi.org/project/scikit-learn -.. |Black| image:: https://img.shields.io/badge/code%20style-black-000000.svg - :target: https://github.com/psf/black - .. |DOI| image:: https://zenodo.org/badge/21369/scikit-learn/scikit-learn.svg :target: https://zenodo.org/badge/latestdoi/21369/scikit-learn/scikit-learn diff --git a/azure-pipelines.yml b/azure-pipelines.yml index 2caa7846994d6..c4d856e42b6b8 100644 --- a/azure-pipelines.yml +++ b/azure-pipelines.yml @@ -35,7 +35,7 @@ jobs: - bash: | source build_tools/shared.sh # Include pytest compatibility with mypy - pip install pytest $(get_dep ruff min) $(get_dep mypy min) $(get_dep black min) cython-lint + pip install pytest $(get_dep ruff min) $(get_dep mypy min) cython-lint displayName: Install linters - bash: | ./build_tools/linting.sh diff --git a/benchmarks/bench_hist_gradient_boosting_adult.py b/benchmarks/bench_hist_gradient_boosting_adult.py index 97c762e8e9230..4d5ce48cded81 100644 --- a/benchmarks/bench_hist_gradient_boosting_adult.py +++ b/benchmarks/bench_hist_gradient_boosting_adult.py @@ -46,7 +46,7 @@ def predict(est, data_test, target_test): toc = time() roc_auc = roc_auc_score(target_test, predicted_proba_test[:, 1]) acc = accuracy_score(target_test, predicted_test) - print(f"predicted in {toc - tic:.3f}s, ROC AUC: {roc_auc:.4f}, ACC: {acc :.4f}") + print(f"predicted in {toc - tic:.3f}s, ROC AUC: {roc_auc:.4f}, ACC: {acc:.4f}") data = fetch_openml(data_id=179, as_frame=True) # adult dataset diff --git a/benchmarks/bench_hist_gradient_boosting_higgsboson.py b/benchmarks/bench_hist_gradient_boosting_higgsboson.py index 20057c50dc810..ceab576bc0a52 100644 --- a/benchmarks/bench_hist_gradient_boosting_higgsboson.py +++ b/benchmarks/bench_hist_gradient_boosting_higgsboson.py @@ -74,7 +74,7 @@ def predict(est, data_test, target_test): toc = time() roc_auc = roc_auc_score(target_test, predicted_proba_test[:, 1]) acc = accuracy_score(target_test, predicted_test) - print(f"predicted in {toc - tic:.3f}s, ROC AUC: {roc_auc:.4f}, ACC: {acc :.4f}") + print(f"predicted in {toc - tic:.3f}s, ROC AUC: {roc_auc:.4f}, ACC: {acc:.4f}") df = load_data() diff --git a/build_tools/get_comment.py b/build_tools/get_comment.py index b47a29e065619..48ff14a058c9a 100644 --- a/build_tools/get_comment.py +++ b/build_tools/get_comment.py @@ -55,9 +55,7 @@ def get_step_message(log, start, end, title, message, details): if end not in log: return "" res = ( - "-----------------------------------------------\n" - f"### {title}\n\n" - f"{message}\n\n" + f"-----------------------------------------------\n### {title}\n\n{message}\n\n" ) if details: res += ( @@ -92,33 +90,31 @@ def get_message(log_file, repo, pr_number, sha, run_id, details, versions): message = "" - # black + # ruff check message += get_step_message( log, - start="### Running black ###", - end="Problems detected by black", - title="`black`", + start="### Running the ruff linter ###", + end="Problems detected by ruff check", + title="`ruff check`", message=( - "`black` detected issues. Please run `black .` locally and push " - "the changes. Here you can see the detected issues. Note that " - "running black might also fix some of the issues which might be " - "detected by `ruff`. Note that the installed `black` version is " - f"`black={versions['black']}`." + "`ruff` detected issues. Please run " + "`ruff check --fix --output-format=full` locally, fix the remaining " + "issues, and push the changes. Here you can see the detected issues. Note " + f"that the installed `ruff` version is `ruff={versions['ruff']}`." ), details=details, ) - # ruff + # ruff format message += get_step_message( log, - start="### Running ruff ###", - end="Problems detected by ruff", - title="`ruff`", + start="### Running the ruff formatter ###", + end="Problems detected by ruff format", + title="`ruff format`", message=( - "`ruff` detected issues. Please run " - "`ruff check --fix --output-format=full` locally, fix the remaining " - "issues, and push the changes. Here you can see the detected issues. Note " - f"that the installed `ruff` version is `ruff={versions['ruff']}`." + "`ruff` detected issues. Please run `ruff format` locally and push " + "the changes. Here you can see the detected issues. Note that the " + f"installed `ruff` version is `ruff={versions['ruff']}`." ), details=details, ) @@ -239,7 +235,7 @@ def get_headers(token): def find_lint_bot_comments(repo, token, pr_number): """Get the comment from the linting bot.""" # repo is in the form of "org/repo" - # API doc: https://docs.github.com/en/rest/issues/comments?apiVersion=2022-11-28#list-issue-comments # noqa + # API doc: https://docs.github.com/en/rest/issues/comments?apiVersion=2022-11-28#list-issue-comments response = requests.get( f"https://api.github.com/repos/{repo}/issues/{pr_number}/comments", headers=get_headers(token), @@ -274,7 +270,7 @@ def create_or_update_comment(comment, message, repo, pr_number, token): # repo is in the form of "org/repo" if comment is not None: print("updating existing comment") - # API doc: https://docs.github.com/en/rest/issues/comments?apiVersion=2022-11-28#update-an-issue-comment # noqa + # API doc: https://docs.github.com/en/rest/issues/comments?apiVersion=2022-11-28#update-an-issue-comment response = requests.patch( f"https://api.github.com/repos/{repo}/issues/comments/{comment['id']}", headers=get_headers(token), @@ -282,7 +278,7 @@ def create_or_update_comment(comment, message, repo, pr_number, token): ) else: print("creating new comment") - # API doc: https://docs.github.com/en/rest/issues/comments?apiVersion=2022-11-28#create-an-issue-comment # noqa + # API doc: https://docs.github.com/en/rest/issues/comments?apiVersion=2022-11-28#create-an-issue-comment response = requests.post( f"https://api.github.com/repos/{repo}/issues/{pr_number}/comments", headers=get_headers(token), diff --git a/build_tools/linting.sh b/build_tools/linting.sh index 67450ad8bed74..34b37530e10ff 100755 --- a/build_tools/linting.sh +++ b/build_tools/linting.sh @@ -10,26 +10,25 @@ set -o pipefail global_status=0 -echo -e "### Running black ###\n" -black --check --diff . +echo -e "### Running the ruff linter ###\n" +ruff check --output-format=full status=$? - if [[ $status -eq 0 ]] then - echo -e "No problem detected by black\n" + echo -e "No problem detected by the ruff linter\n" else - echo -e "Problems detected by black, please run black and commit the result\n" + echo -e "Problems detected by ruff check, please fix them\n" global_status=1 fi -echo -e "### Running ruff ###\n" -ruff check --output-format=full +echo -e "### Running the ruff formatter ###\n" +ruff format --diff status=$? if [[ $status -eq 0 ]] then - echo -e "No problem detected by ruff\n" + echo -e "No problem detected by the ruff formatter\n" else - echo -e "Problems detected by ruff, please fix them\n" + echo -e "Problems detected by ruff format, please run ruff format and commit the result\n" global_status=1 fi diff --git a/doc/developers/contributing.rst b/doc/developers/contributing.rst index 49ec027be1388..34e8e6d3e2aca 100644 --- a/doc/developers/contributing.rst +++ b/doc/developers/contributing.rst @@ -269,7 +269,7 @@ how to set up your git repository: .. prompt:: bash - pip install pytest pytest-cov ruff mypy numpydoc black==24.3.0 + pip install pytest pytest-cov ruff==0.11.2 mypy numpydoc .. _upstream: @@ -1565,7 +1565,7 @@ make this task easier and faster (in no particular order). variable) in the code base. - Configure `git blame` to ignore the commit that migrated the code style to - `black`. + `black` and then `ruff`. .. prompt:: bash diff --git a/examples/applications/plot_species_distribution_modeling.py b/examples/applications/plot_species_distribution_modeling.py index dc3bd7591a11a..e2edda813c25d 100644 --- a/examples/applications/plot_species_distribution_modeling.py +++ b/examples/applications/plot_species_distribution_modeling.py @@ -109,7 +109,7 @@ def create_species_bunch(species_name, train, test, coverages, xgrid, ygrid): def plot_species_distribution( - species=("bradypus_variegatus_0", "microryzomys_minutus_0") + species=("bradypus_variegatus_0", "microryzomys_minutus_0"), ): """ Plot the species distribution. diff --git a/examples/applications/plot_time_series_lagged_features.py b/examples/applications/plot_time_series_lagged_features.py index f2eb039e35fe0..7c5b75e12ccfd 100644 --- a/examples/applications/plot_time_series_lagged_features.py +++ b/examples/applications/plot_time_series_lagged_features.py @@ -265,7 +265,7 @@ def consolidate_scores(cv_results, scores, metric): time = cv_results["fit_time"] scores["fit_time"].append(f"{time.mean():.2f} ± {time.std():.2f} s") - scores["loss"].append(f"quantile {int(quantile*100)}") + scores["loss"].append(f"quantile {int(quantile * 100)}") for key, value in cv_results.items(): if key.startswith("test_"): metric = key.split("test_")[1] diff --git a/examples/applications/plot_topics_extraction_with_nmf_lda.py b/examples/applications/plot_topics_extraction_with_nmf_lda.py index faeef5ae15a11..a6f774d01e2de 100644 --- a/examples/applications/plot_topics_extraction_with_nmf_lda.py +++ b/examples/applications/plot_topics_extraction_with_nmf_lda.py @@ -50,7 +50,7 @@ def plot_top_words(model, feature_names, n_top_words, title): ax = axes[topic_idx] ax.barh(top_features, weights, height=0.7) - ax.set_title(f"Topic {topic_idx +1}", fontdict={"fontsize": 30}) + ax.set_title(f"Topic {topic_idx + 1}", fontdict={"fontsize": 30}) ax.tick_params(axis="both", which="major", labelsize=20) for i in "top right left".split(): ax.spines[i].set_visible(False) diff --git a/examples/covariance/plot_mahalanobis_distances.py b/examples/covariance/plot_mahalanobis_distances.py index a1507c3ef162e..99ae29ceeb106 100644 --- a/examples/covariance/plot_mahalanobis_distances.py +++ b/examples/covariance/plot_mahalanobis_distances.py @@ -60,7 +60,7 @@ Proceedings of the National Academy of Sciences of the United States of America, 17, 684-688. -""" # noqa: E501 +""" # Authors: The scikit-learn developers # SPDX-License-Identifier: BSD-3-Clause diff --git a/examples/ensemble/plot_bias_variance.py b/examples/ensemble/plot_bias_variance.py index e1b37c03360f6..72134841c78ea 100644 --- a/examples/ensemble/plot_bias_variance.py +++ b/examples/ensemble/plot_bias_variance.py @@ -177,8 +177,8 @@ def generate(n_samples, noise, n_repeat=1): plt.subplot(2, n_estimators, n_estimators + n + 1) plt.plot(X_test, y_error, "r", label="$error(x)$") - plt.plot(X_test, y_bias, "b", label="$bias^2(x)$"), - plt.plot(X_test, y_var, "g", label="$variance(x)$"), + plt.plot(X_test, y_bias, "b", label="$bias^2(x)$") + plt.plot(X_test, y_var, "g", label="$variance(x)$") plt.plot(X_test, y_noise, "c", label="$noise(x)$") plt.xlim([-5, 5]) diff --git a/examples/feature_selection/plot_rfe_digits.py b/examples/feature_selection/plot_rfe_digits.py index 360a9bd92837f..749cb52e4a72d 100644 --- a/examples/feature_selection/plot_rfe_digits.py +++ b/examples/feature_selection/plot_rfe_digits.py @@ -16,7 +16,7 @@ See also :ref:`sphx_glr_auto_examples_feature_selection_plot_rfe_with_cross_validation.py` -""" # noqa: E501 +""" # Authors: The scikit-learn developers # SPDX-License-Identifier: BSD-3-Clause diff --git a/examples/feature_selection/plot_select_from_model_diabetes.py b/examples/feature_selection/plot_select_from_model_diabetes.py index 793a6916e8969..6c3f32d07cfb0 100644 --- a/examples/feature_selection/plot_select_from_model_diabetes.py +++ b/examples/feature_selection/plot_select_from_model_diabetes.py @@ -40,7 +40,7 @@ # were already standardized. # For a more complete example on the interpretations of the coefficients of # linear models, you may refer to -# :ref:`sphx_glr_auto_examples_inspection_plot_linear_model_coefficient_interpretation.py`. # noqa: E501 +# :ref:`sphx_glr_auto_examples_inspection_plot_linear_model_coefficient_interpretation.py`. import matplotlib.pyplot as plt import numpy as np diff --git a/examples/linear_model/plot_tweedie_regression_insurance_claims.py b/examples/linear_model/plot_tweedie_regression_insurance_claims.py index 3acc2b5f1472f..ea2365a71d48a 100644 --- a/examples/linear_model/plot_tweedie_regression_insurance_claims.py +++ b/examples/linear_model/plot_tweedie_regression_insurance_claims.py @@ -606,8 +606,9 @@ def score_estimator( "predicted, frequency*severity model": np.sum( exposure * glm_freq.predict(X) * glm_sev.predict(X) ), - "predicted, tweedie, power=%.2f" - % glm_pure_premium.power: np.sum(exposure * glm_pure_premium.predict(X)), + "predicted, tweedie, power=%.2f" % glm_pure_premium.power: np.sum( + exposure * glm_pure_premium.predict(X) + ), } ) diff --git a/examples/manifold/plot_lle_digits.py b/examples/manifold/plot_lle_digits.py index 34b221ca0cd1d..45298c944aaee 100644 --- a/examples/manifold/plot_lle_digits.py +++ b/examples/manifold/plot_lle_digits.py @@ -10,7 +10,6 @@ # Authors: The scikit-learn developers # SPDX-License-Identifier: BSD-3-Clause - # %% # Load digits dataset # ------------------- diff --git a/examples/manifold/plot_manifold_sphere.py b/examples/manifold/plot_manifold_sphere.py index 7c666c4b7fb7b..d52d99be4d087 100644 --- a/examples/manifold/plot_manifold_sphere.py +++ b/examples/manifold/plot_manifold_sphere.py @@ -50,7 +50,7 @@ t = random_state.rand(n_samples) * np.pi # Sever the poles from the sphere. -indices = (t < (np.pi - (np.pi / 8))) & (t > ((np.pi / 8))) +indices = (t < (np.pi - (np.pi / 8))) & (t > (np.pi / 8)) colors = p[indices] x, y, z = ( np.sin(t[indices]) * np.cos(p[indices]), diff --git a/examples/miscellaneous/plot_partial_dependence_visualization_api.py b/examples/miscellaneous/plot_partial_dependence_visualization_api.py index 8c98b40816496..f941505733579 100644 --- a/examples/miscellaneous/plot_partial_dependence_visualization_api.py +++ b/examples/miscellaneous/plot_partial_dependence_visualization_api.py @@ -11,7 +11,7 @@ See also :ref:`sphx_glr_auto_examples_miscellaneous_plot_roc_curve_visualization_api.py` -""" # noqa: E501 +""" # Authors: The scikit-learn developers # SPDX-License-Identifier: BSD-3-Clause diff --git a/examples/model_selection/plot_likelihood_ratios.py b/examples/model_selection/plot_likelihood_ratios.py index 24a8f2ef1759e..e4c1a6662ffa3 100644 --- a/examples/model_selection/plot_likelihood_ratios.py +++ b/examples/model_selection/plot_likelihood_ratios.py @@ -40,7 +40,7 @@ class proportion than the target application. from sklearn.datasets import make_classification X, y = make_classification(n_samples=10_000, weights=[0.9, 0.1], random_state=0) -print(f"Percentage of people carrying the disease: {100*y.mean():.2f}%") +print(f"Percentage of people carrying the disease: {100 * y.mean():.2f}%") # %% # A machine learning model is built to diagnose if a person with some given diff --git a/examples/model_selection/plot_roc.py b/examples/model_selection/plot_roc.py index 1fc2dedf2943e..a482ad5f4ab95 100644 --- a/examples/model_selection/plot_roc.py +++ b/examples/model_selection/plot_roc.py @@ -152,9 +152,9 @@ # # We can briefly demo the effect of :func:`numpy.ravel`: -print(f"y_score:\n{y_score[0:2,:]}") +print(f"y_score:\n{y_score[0:2, :]}") print() -print(f"y_score.ravel():\n{y_score[0:2,:].ravel()}") +print(f"y_score.ravel():\n{y_score[0:2, :].ravel()}") # %% # In a multi-class classification setup with highly imbalanced classes, @@ -359,7 +359,7 @@ plt.plot( fpr_grid, mean_tpr[ix], - label=f"Mean {label_a} vs {label_b} (AUC = {mean_score :.2f})", + label=f"Mean {label_a} vs {label_b} (AUC = {mean_score:.2f})", linestyle=":", linewidth=4, ) diff --git a/examples/text/plot_document_classification_20newsgroups.py b/examples/text/plot_document_classification_20newsgroups.py index aa80b7c1b630b..ce11377e7531f 100644 --- a/examples/text/plot_document_classification_20newsgroups.py +++ b/examples/text/plot_document_classification_20newsgroups.py @@ -356,7 +356,7 @@ def benchmark(clf, custom_name=False): # Notice that the most important hyperparameters values were tuned using a grid # search procedure not shown in this notebook for the sake of simplicity. See # the example script -# :ref:`sphx_glr_auto_examples_model_selection_plot_grid_search_text_feature_extraction.py` # noqa: E501 +# :ref:`sphx_glr_auto_examples_model_selection_plot_grid_search_text_feature_extraction.py` # for a demo on how such tuning can be done. from sklearn.ensemble import RandomForestClassifier diff --git a/maint_tools/bump-dependencies-versions.py b/maint_tools/bump-dependencies-versions.py index 1ae1f69be2720..58be1816f71a3 100644 --- a/maint_tools/bump-dependencies-versions.py +++ b/maint_tools/bump-dependencies-versions.py @@ -43,7 +43,7 @@ def get_min_version_with_wheel(package_name, python_version): for file_info in release_info: if ( file_info["packagetype"] == "bdist_wheel" - and f'cp{python_version.replace(".", "")}' in file_info["filename"] + and f"cp{python_version.replace('.', '')}" in file_info["filename"] and not file_info["yanked"] ): compatible_versions.append(ver) diff --git a/pyproject.toml b/pyproject.toml index 6aa9c81bfaca9..1ba3ba2255af4 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -83,8 +83,7 @@ tests = [ "pandas>=1.4.0", "pytest>=7.1.2", "pytest-cov>=2.9.0", - "ruff>=0.11.0", - "black>=24.3.0", + "ruff>=0.11.2", "mypy>=1.15", "pyamg>=4.2.1", "polars>=0.20.30", @@ -112,36 +111,19 @@ addopts = [ "--color=yes", ] -[tool.black] -line-length = 88 -target-version = ['py310', 'py311'] -preview = true -exclude = ''' -/( - \.eggs # exclude a few common directories in the - | \.git # root of the project - | \.mypy_cache - | \.vscode - | build - | dist - | doc/_build - | doc/auto_examples - | sklearn/externals - | asv_benchmarks/env -)/ -''' - [tool.ruff] -# max line length for black line-length = 88 exclude=[ + ".eggs", ".git", + ".mypy_cache", + ".vscode", "__pycache__", + "build", "dist", "sklearn/externals", "doc/_build", "doc/auto_examples", - "build", "asv_benchmarks/env", "asv_benchmarks/html", "asv_benchmarks/results", @@ -154,10 +136,8 @@ preview = true # This enables us to use the explicit preview rules that we want only explicit-preview-rules = true # all rules can be found here: https://docs.astral.sh/ruff/rules/ -select = ["E", "F", "W", "I", "CPY001", "RUF"] +extend-select = ["W", "I", "CPY001", "RUF"] ignore=[ - # space before : (needed for how black formats slicing) - "E203", # do not assign a lambda expression, use a def "E731", # do not use variables named 'l', 'O', or 'I' @@ -176,6 +156,19 @@ ignore=[ "RUF012", "RUF015", "RUF021", + # https://docs.astral.sh/ruff/formatter/#conflicting-lint-rules + "W191", + "E111", + "E114", + "E117", + "D206", + "D300", + "Q000", + "Q001", + "Q002", + "Q003", + "COM812", + "COM819", ] [tool.ruff.lint.flake8-copyright] @@ -217,8 +210,6 @@ follow_imports = "skip" ignore = [ # multiple spaces/tab after comma 'E24', - # space before : (needed for how black formats slicing) - 'E203', # line too long 'E501', # do not assign a lambda expression, use a def diff --git a/sklearn/_loss/tests/test_loss.py b/sklearn/_loss/tests/test_loss.py index 99a89b6226aec..810ca4bde6869 100644 --- a/sklearn/_loss/tests/test_loss.py +++ b/sklearn/_loss/tests/test_loss.py @@ -203,7 +203,8 @@ def test_loss_boundary(loss): @pytest.mark.parametrize( - "loss, y_true_success, y_true_fail", Y_COMMON_PARAMS + Y_TRUE_PARAMS # type: ignore[operator] + "loss, y_true_success, y_true_fail", + Y_COMMON_PARAMS + Y_TRUE_PARAMS, # type: ignore[operator] ) def test_loss_boundary_y_true(loss, y_true_success, y_true_fail): """Test boundaries of y_true for loss functions.""" @@ -214,7 +215,8 @@ def test_loss_boundary_y_true(loss, y_true_success, y_true_fail): @pytest.mark.parametrize( - "loss, y_pred_success, y_pred_fail", Y_COMMON_PARAMS + Y_PRED_PARAMS # type: ignore[operator] + "loss, y_pred_success, y_pred_fail", + Y_COMMON_PARAMS + Y_PRED_PARAMS, # type: ignore[operator] ) def test_loss_boundary_y_pred(loss, y_pred_success, y_pred_fail): """Test boundaries of y_pred for loss functions.""" @@ -502,7 +504,7 @@ def test_loss_same_as_C_functions(loss, sample_weight): raw_prediction=raw_prediction, sample_weight=sample_weight, loss_out=out_l2, - ), + ) assert_allclose(out_l1, out_l2) loss.gradient( y_true=y_true, diff --git a/sklearn/_min_dependencies.py b/sklearn/_min_dependencies.py index 03fd53d047249..7e7229d6350e5 100644 --- a/sklearn/_min_dependencies.py +++ b/sklearn/_min_dependencies.py @@ -32,8 +32,7 @@ "memory_profiler": ("0.57.0", "benchmark, docs"), "pytest": (PYTEST_MIN_VERSION, "tests"), "pytest-cov": ("2.9.0", "tests"), - "ruff": ("0.11.0", "tests"), - "black": ("24.3.0", "tests"), + "ruff": ("0.11.2", "tests"), "mypy": ("1.15", "tests"), "pyamg": ("4.2.1", "tests"), "polars": ("0.20.30", "docs, tests"), diff --git a/sklearn/cluster/_feature_agglomeration.py b/sklearn/cluster/_feature_agglomeration.py index 3471329cb1472..cbde0e37de824 100644 --- a/sklearn/cluster/_feature_agglomeration.py +++ b/sklearn/cluster/_feature_agglomeration.py @@ -6,7 +6,6 @@ # Authors: The scikit-learn developers # SPDX-License-Identifier: BSD-3-Clause - import numpy as np from scipy.sparse import issparse diff --git a/sklearn/cross_decomposition/tests/test_pls.py b/sklearn/cross_decomposition/tests/test_pls.py index c107a6a1a76dd..7e516d71b6f98 100644 --- a/sklearn/cross_decomposition/tests/test_pls.py +++ b/sklearn/cross_decomposition/tests/test_pls.py @@ -404,12 +404,12 @@ def test_copy(Est): X_orig = X.copy() with pytest.raises(AssertionError): - pls.transform(X, y, copy=False), + pls.transform(X, y, copy=False) assert_array_almost_equal(X, X_orig) X_orig = X.copy() with pytest.raises(AssertionError): - pls.predict(X, copy=False), + pls.predict(X, copy=False) assert_array_almost_equal(X, X_orig) # Make sure copy=True gives same transform and predictions as predict=False diff --git a/sklearn/datasets/tests/test_openml.py b/sklearn/datasets/tests/test_openml.py index b12af847c0cda..d2b170e62c99a 100644 --- a/sklearn/datasets/tests/test_openml.py +++ b/sklearn/datasets/tests/test_openml.py @@ -105,9 +105,9 @@ def _file_name(url, suffix): ) def _mock_urlopen_shared(url, has_gzip_header, expected_prefix, suffix): - assert url.startswith( - expected_prefix - ), f"{expected_prefix!r} does not match {url!r}" + assert url.startswith(expected_prefix), ( + f"{expected_prefix!r} does not match {url!r}" + ) data_file_name = _file_name(url, suffix) data_file_path = resources.files(data_module) / data_file_name @@ -141,7 +141,7 @@ def _mock_urlopen_download_data(url, has_gzip_header): # For simplicity the mock filenames don't contain the filename, i.e. # the last part of the data description url after the last /. # For example for id_1, data description download url is: - # gunzip -c sklearn/datasets/tests/data/openml/id_1/api-v1-jd-1.json.gz | grep '"url" # noqa: E501 + # gunzip -c sklearn/datasets/tests/data/openml/id_1/api-v1-jd-1.json.gz | grep '"url" # "https:\/\/www.openml.org\/data\/v1\/download\/1\/anneal.arff" # but the mock filename does not contain anneal.arff and is: # sklearn/datasets/tests/data/openml/id_1/data-v1-dl-1.arff.gz. @@ -156,9 +156,9 @@ def _mock_urlopen_download_data(url, has_gzip_header): ) def _mock_urlopen_data_list(url, has_gzip_header): - assert url.startswith( - url_prefix_data_list - ), f"{url_prefix_data_list!r} does not match {url!r}" + assert url.startswith(url_prefix_data_list), ( + f"{url_prefix_data_list!r} does not match {url!r}" + ) data_file_name = _file_name(url, ".json") data_file_path = resources.files(data_module) / data_file_name diff --git a/sklearn/datasets/tests/test_samples_generator.py b/sklearn/datasets/tests/test_samples_generator.py index c1a7cca3141ad..81e8183c6722e 100644 --- a/sklearn/datasets/tests/test_samples_generator.py +++ b/sklearn/datasets/tests/test_samples_generator.py @@ -138,17 +138,17 @@ def test_make_classification_informative_features(): signs = signs.view(dtype="|S{0}".format(signs.strides[0])).ravel() unique_signs, cluster_index = np.unique(signs, return_inverse=True) - assert ( - len(unique_signs) == n_clusters - ), "Wrong number of clusters, or not in distinct quadrants" + assert len(unique_signs) == n_clusters, ( + "Wrong number of clusters, or not in distinct quadrants" + ) clusters_by_class = defaultdict(set) for cluster, cls in zip(cluster_index, y): clusters_by_class[cls].add(cluster) for clusters in clusters_by_class.values(): - assert ( - len(clusters) == n_clusters_per_class - ), "Wrong number of clusters per class" + assert len(clusters) == n_clusters_per_class, ( + "Wrong number of clusters per class" + ) assert len(clusters_by_class) == n_classes, "Wrong number of classes" assert_array_almost_equal( @@ -412,9 +412,9 @@ def test_make_blobs_n_samples_list(): X, y = make_blobs(n_samples=n_samples, n_features=2, random_state=0) assert X.shape == (sum(n_samples), 2), "X shape mismatch" - assert all( - np.bincount(y, minlength=len(n_samples)) == n_samples - ), "Incorrect number of samples per blob" + assert all(np.bincount(y, minlength=len(n_samples)) == n_samples), ( + "Incorrect number of samples per blob" + ) def test_make_blobs_n_samples_list_with_centers(global_random_seed): @@ -429,9 +429,9 @@ def test_make_blobs_n_samples_list_with_centers(global_random_seed): ) assert X.shape == (sum(n_samples), 2), "X shape mismatch" - assert all( - np.bincount(y, minlength=len(n_samples)) == n_samples - ), "Incorrect number of samples per blob" + assert all(np.bincount(y, minlength=len(n_samples)) == n_samples), ( + "Incorrect number of samples per blob" + ) for i, (ctr, std) in enumerate(zip(centers, cluster_stds)): assert_almost_equal((X[y == i] - ctr).std(), std, 1, "Unexpected std") @@ -444,9 +444,9 @@ def test_make_blobs_n_samples_centers_none(n_samples): X, y = make_blobs(n_samples=n_samples, centers=centers, random_state=0) assert X.shape == (sum(n_samples), 2), "X shape mismatch" - assert all( - np.bincount(y, minlength=len(n_samples)) == n_samples - ), "Incorrect number of samples per blob" + assert all(np.bincount(y, minlength=len(n_samples)) == n_samples), ( + "Incorrect number of samples per blob" + ) def test_make_blobs_return_centers(): @@ -688,9 +688,9 @@ def test_make_moons(global_random_seed): def test_make_moons_unbalanced(): X, y = make_moons(n_samples=(7, 5)) - assert ( - np.sum(y == 0) == 7 and np.sum(y == 1) == 5 - ), "Number of samples in a moon is wrong" + assert np.sum(y == 0) == 7 and np.sum(y == 1) == 5, ( + "Number of samples in a moon is wrong" + ) assert X.shape == (12, 2), "X shape mismatch" assert y.shape == (12,), "y shape mismatch" diff --git a/sklearn/ensemble/_bagging.py b/sklearn/ensemble/_bagging.py index d110c8bd613d6..94c89b9841ef8 100644 --- a/sklearn/ensemble/_bagging.py +++ b/sklearn/ensemble/_bagging.py @@ -3,7 +3,6 @@ # Authors: The scikit-learn developers # SPDX-License-Identifier: BSD-3-Clause - import itertools import numbers from abc import ABCMeta, abstractmethod diff --git a/sklearn/ensemble/_forest.py b/sklearn/ensemble/_forest.py index 86f4255f1785a..5def6ac60816b 100644 --- a/sklearn/ensemble/_forest.py +++ b/sklearn/ensemble/_forest.py @@ -35,7 +35,6 @@ class calls the ``fit`` method of each sub-estimator on random samples # Authors: The scikit-learn developers # SPDX-License-Identifier: BSD-3-Clause - import threading from abc import ABCMeta, abstractmethod from numbers import Integral, Real diff --git a/sklearn/ensemble/tests/test_forest.py b/sklearn/ensemble/tests/test_forest.py index fcefa31db097c..65906dec99316 100644 --- a/sklearn/ensemble/tests/test_forest.py +++ b/sklearn/ensemble/tests/test_forest.py @@ -168,11 +168,12 @@ def test_regression_criterion(name, criterion): reg = ForestRegressor(n_estimators=5, criterion=criterion, random_state=1) reg.fit(X_reg, y_reg) score = reg.score(X_reg, y_reg) - assert ( - score > 0.93 - ), "Failed with max_features=None, criterion %s and score = %f" % ( - criterion, - score, + assert score > 0.93, ( + "Failed with max_features=None, criterion %s and score = %f" + % ( + criterion, + score, + ) ) reg = ForestRegressor( @@ -1068,10 +1069,10 @@ def test_min_weight_fraction_leaf(name): node_weights = np.bincount(out, weights=weights) # drop inner nodes leaf_weights = node_weights[node_weights != 0] - assert ( - np.min(leaf_weights) >= total_weight * est.min_weight_fraction_leaf - ), "Failed with {0} min_weight_fraction_leaf={1}".format( - name, est.min_weight_fraction_leaf + assert np.min(leaf_weights) >= total_weight * est.min_weight_fraction_leaf, ( + "Failed with {0} min_weight_fraction_leaf={1}".format( + name, est.min_weight_fraction_leaf + ) ) diff --git a/sklearn/experimental/enable_hist_gradient_boosting.py b/sklearn/experimental/enable_hist_gradient_boosting.py index 9269b2d0b6d6c..589348fe9bc21 100644 --- a/sklearn/experimental/enable_hist_gradient_boosting.py +++ b/sklearn/experimental/enable_hist_gradient_boosting.py @@ -13,7 +13,6 @@ # Don't remove this file, we don't want to break users code just because the # feature isn't experimental anymore. - import warnings warnings.warn( diff --git a/sklearn/feature_selection/_univariate_selection.py b/sklearn/feature_selection/_univariate_selection.py index 855ba5ad70f12..fe07b48f4fc2e 100644 --- a/sklearn/feature_selection/_univariate_selection.py +++ b/sklearn/feature_selection/_univariate_selection.py @@ -3,7 +3,6 @@ # Authors: The scikit-learn developers # SPDX-License-Identifier: BSD-3-Clause - import warnings from numbers import Integral, Real diff --git a/sklearn/gaussian_process/tests/test_gpc.py b/sklearn/gaussian_process/tests/test_gpc.py index 3ce2229f9e80f..4bd437df34967 100644 --- a/sklearn/gaussian_process/tests/test_gpc.py +++ b/sklearn/gaussian_process/tests/test_gpc.py @@ -147,8 +147,9 @@ def test_custom_optimizer(kernel, global_random_seed): # Define a dummy optimizer that simply tests 10 random hyperparameters def optimizer(obj_func, initial_theta, bounds): rng = np.random.RandomState(global_random_seed) - theta_opt, func_min = initial_theta, obj_func( - initial_theta, eval_gradient=False + theta_opt, func_min = ( + initial_theta, + obj_func(initial_theta, eval_gradient=False), ) for _ in range(10): theta = np.atleast_1d( diff --git a/sklearn/gaussian_process/tests/test_gpr.py b/sklearn/gaussian_process/tests/test_gpr.py index f49ed71231ad9..f43cc3613b3ff 100644 --- a/sklearn/gaussian_process/tests/test_gpr.py +++ b/sklearn/gaussian_process/tests/test_gpr.py @@ -394,8 +394,9 @@ def test_custom_optimizer(kernel): # Define a dummy optimizer that simply tests 50 random hyperparameters def optimizer(obj_func, initial_theta, bounds): rng = np.random.RandomState(0) - theta_opt, func_min = initial_theta, obj_func( - initial_theta, eval_gradient=False + theta_opt, func_min = ( + initial_theta, + obj_func(initial_theta, eval_gradient=False), ) for _ in range(50): theta = np.atleast_1d( diff --git a/sklearn/inspection/_plot/tests/test_plot_partial_dependence.py b/sklearn/inspection/_plot/tests/test_plot_partial_dependence.py index 597b34a2a30e0..75869079be9cc 100644 --- a/sklearn/inspection/_plot/tests/test_plot_partial_dependence.py +++ b/sklearn/inspection/_plot/tests/test_plot_partial_dependence.py @@ -1186,9 +1186,9 @@ def test_plot_partial_dependence_lines_kw( ) line = disp.lines_[0, 0, -1] - assert ( - line.get_color() == expected_colors[0] - ), f"{line.get_color()}!={expected_colors[0]}\n{line_kw} and {pd_line_kw}" + assert line.get_color() == expected_colors[0], ( + f"{line.get_color()}!={expected_colors[0]}\n{line_kw} and {pd_line_kw}" + ) if pd_line_kw is not None: if "linestyle" in pd_line_kw: assert line.get_linestyle() == pd_line_kw["linestyle"] @@ -1198,9 +1198,9 @@ def test_plot_partial_dependence_lines_kw( assert line.get_linestyle() == "--" line = disp.lines_[0, 0, 0] - assert ( - line.get_color() == expected_colors[1] - ), f"{line.get_color()}!={expected_colors[1]}" + assert line.get_color() == expected_colors[1], ( + f"{line.get_color()}!={expected_colors[1]}" + ) if ice_lines_kw is not None: if "linestyle" in ice_lines_kw: assert line.get_linestyle() == ice_lines_kw["linestyle"] diff --git a/sklearn/kernel_approximation.py b/sklearn/kernel_approximation.py index 35da4d08dcbf4..02c8af755baea 100644 --- a/sklearn/kernel_approximation.py +++ b/sklearn/kernel_approximation.py @@ -716,9 +716,9 @@ def transform(self, X): sparse = sp.issparse(X) if self.sample_interval is None: - # See figure 2 c) of "Efficient additive kernels via explicit feature maps" # noqa + # See figure 2 c) of "Efficient additive kernels via explicit feature maps" # - # A. Vedaldi and A. Zisserman, Pattern Analysis and Machine Intelligence, # noqa + # A. Vedaldi and A. Zisserman, Pattern Analysis and Machine Intelligence, # 2011 if self.sample_steps == 1: sample_interval = 0.8 diff --git a/sklearn/linear_model/_glm/_newton_solver.py b/sklearn/linear_model/_glm/_newton_solver.py index a5c72ba3f51b1..d7c8ed8f0943d 100644 --- a/sklearn/linear_model/_glm/_newton_solver.py +++ b/sklearn/linear_model/_glm/_newton_solver.py @@ -254,7 +254,7 @@ def line_search(self, X, y, sample_weight): check = loss_improvement <= t * armijo_term if is_verbose: print( - f" line search iteration={i+1}, step size={t}\n" + f" line search iteration={i + 1}, step size={t}\n" f" check loss improvement <= armijo term: {loss_improvement} " f"<= {t * armijo_term} {check}" ) @@ -300,7 +300,7 @@ def line_search(self, X, y, sample_weight): self.raw_prediction = raw if is_verbose: print( - f" line search successful after {i+1} iterations with " + f" line search successful after {i + 1} iterations with " f"loss={self.loss_value}." ) diff --git a/sklearn/linear_model/_linear_loss.py b/sklearn/linear_model/_linear_loss.py index 3bfd5fcd09491..9213008a19841 100644 --- a/sklearn/linear_model/_linear_loss.py +++ b/sklearn/linear_model/_linear_loss.py @@ -537,9 +537,9 @@ def gradient_hessian( # The L2 penalty enters the Hessian on the diagonal only. To add those # terms, we use a flattened view of the array. order = "C" if hess.flags.c_contiguous else "F" - hess.reshape(-1, order=order)[ - : (n_features * n_dof) : (n_dof + 1) - ] += l2_reg_strength + hess.reshape(-1, order=order)[: (n_features * n_dof) : (n_dof + 1)] += ( + l2_reg_strength + ) if self.fit_intercept: # With intercept included as added column to X, the hessian becomes @@ -795,7 +795,7 @@ def hessp(s): # = sum_{i, m} (X')_{ji} * p_i_k # * (X_{im} * s_k_m - sum_l p_i_l * X_{im} * s_l_m) # - # See also https://github.com/scikit-learn/scikit-learn/pull/3646#discussion_r17461411 # noqa + # See also https://github.com/scikit-learn/scikit-learn/pull/3646#discussion_r17461411 def hessp(s): s = s.reshape((n_classes, -1), order="F") # shape = (n_classes, n_dof) if self.fit_intercept: diff --git a/sklearn/linear_model/_ridge.py b/sklearn/linear_model/_ridge.py index c22690b2b01c6..27bc81c095d7b 100644 --- a/sklearn/linear_model/_ridge.py +++ b/sklearn/linear_model/_ridge.py @@ -5,7 +5,6 @@ # Authors: The scikit-learn developers # SPDX-License-Identifier: BSD-3-Clause - import numbers import warnings from abc import ABCMeta, abstractmethod diff --git a/sklearn/linear_model/_theil_sen.py b/sklearn/linear_model/_theil_sen.py index e6a4fba57401d..88afc17fcf5ff 100644 --- a/sklearn/linear_model/_theil_sen.py +++ b/sklearn/linear_model/_theil_sen.py @@ -5,7 +5,6 @@ # Authors: The scikit-learn developers # SPDX-License-Identifier: BSD-3-Clause - import warnings from itertools import combinations from numbers import Integral, Real diff --git a/sklearn/linear_model/tests/test_ridge.py b/sklearn/linear_model/tests/test_ridge.py index a7e02c7afb561..60b8a8bb3e144 100644 --- a/sklearn/linear_model/tests/test_ridge.py +++ b/sklearn/linear_model/tests/test_ridge.py @@ -860,9 +860,9 @@ def test_ridge_loo_cv_asym_scoring(): loo_ridge.fit(X, y) gcv_ridge.fit(X, y) - assert gcv_ridge.alpha_ == pytest.approx( - loo_ridge.alpha_ - ), f"{gcv_ridge.alpha_=}, {loo_ridge.alpha_=}" + assert gcv_ridge.alpha_ == pytest.approx(loo_ridge.alpha_), ( + f"{gcv_ridge.alpha_=}, {loo_ridge.alpha_=}" + ) assert_allclose(gcv_ridge.coef_, loo_ridge.coef_, rtol=1e-3) assert_allclose(gcv_ridge.intercept_, loo_ridge.intercept_, rtol=1e-3) @@ -1522,9 +1522,9 @@ def test_ridgecv_alphas_conversion(Estimator): X = rng.randn(n_samples, n_features) ridge_est = Estimator(alphas=alphas) - assert ( - ridge_est.alphas is alphas - ), f"`alphas` was mutated in `{Estimator.__name__}.__init__`" + assert ridge_est.alphas is alphas, ( + f"`alphas` was mutated in `{Estimator.__name__}.__init__`" + ) ridge_est.fit(X, y) assert_array_equal(ridge_est.alphas, np.asarray(alphas)) diff --git a/sklearn/manifold/_spectral_embedding.py b/sklearn/manifold/_spectral_embedding.py index 06a2ffbf27a36..1a3b95e023897 100644 --- a/sklearn/manifold/_spectral_embedding.py +++ b/sklearn/manifold/_spectral_embedding.py @@ -3,7 +3,6 @@ # Authors: The scikit-learn developers # SPDX-License-Identifier: BSD-3-Clause - import warnings from numbers import Integral, Real diff --git a/sklearn/manifold/_t_sne.py b/sklearn/manifold/_t_sne.py index 5944749d6df6f..94a845f756196 100644 --- a/sklearn/manifold/_t_sne.py +++ b/sklearn/manifold/_t_sne.py @@ -949,9 +949,9 @@ def _fit(self, X, skip_num_points=0): P = _joint_probabilities(distances, self.perplexity, self.verbose) assert np.all(np.isfinite(P)), "All probabilities should be finite" assert np.all(P >= 0), "All probabilities should be non-negative" - assert np.all( - P <= 1 - ), "All probabilities should be less or then equal to one" + assert np.all(P <= 1), ( + "All probabilities should be less or then equal to one" + ) else: # Compute the number of nearest neighbors to find. diff --git a/sklearn/metrics/_ranking.py b/sklearn/metrics/_ranking.py index b2d0bbf5eec78..79674e244776a 100644 --- a/sklearn/metrics/_ranking.py +++ b/sklearn/metrics/_ranking.py @@ -10,7 +10,6 @@ # Authors: The scikit-learn developers # SPDX-License-Identifier: BSD-3-Clause - import warnings from functools import partial from numbers import Integral, Real diff --git a/sklearn/metrics/cluster/_supervised.py b/sklearn/metrics/cluster/_supervised.py index bb903b70749dd..cb325ac3addbd 100644 --- a/sklearn/metrics/cluster/_supervised.py +++ b/sklearn/metrics/cluster/_supervised.py @@ -7,7 +7,6 @@ # Authors: The scikit-learn developers # SPDX-License-Identifier: BSD-3-Clause - import warnings from math import log from numbers import Real diff --git a/sklearn/metrics/cluster/_unsupervised.py b/sklearn/metrics/cluster/_unsupervised.py index 21dd22bc17a93..38cec419e73f7 100644 --- a/sklearn/metrics/cluster/_unsupervised.py +++ b/sklearn/metrics/cluster/_unsupervised.py @@ -3,7 +3,6 @@ # Authors: The scikit-learn developers # SPDX-License-Identifier: BSD-3-Clause - import functools from numbers import Integral diff --git a/sklearn/metrics/tests/test_common.py b/sklearn/metrics/tests/test_common.py index 6f9e11d4f4780..b31b186054e11 100644 --- a/sklearn/metrics/tests/test_common.py +++ b/sklearn/metrics/tests/test_common.py @@ -641,7 +641,6 @@ def test_symmetric_metric(name): @pytest.mark.parametrize("name", sorted(NOT_SYMMETRIC_METRICS)) def test_not_symmetric_metric(name): - # Test the symmetry of score and loss functions random_state = check_random_state(0) metric = ALL_METRICS[name] @@ -1005,7 +1004,8 @@ def test_regression_thresholded_inf_nan_input(metric, y_true, y_score): @pytest.mark.parametrize("metric", CLASSIFICATION_METRICS.values()) @pytest.mark.parametrize( "y_true, y_score", - invalids_nan_inf + + invalids_nan_inf + + # Add an additional case for classification only # non-regression test for: # https://github.com/scikit-learn/scikit-learn/issues/6809 @@ -2104,7 +2104,6 @@ def check_array_api_regression_metric_multioutput( def check_array_api_metric_pairwise(metric, array_namespace, device, dtype_name): - X_np = np.array([[0.1, 0.2, 0.3], [0.4, 0.5, 0.6]], dtype=dtype_name) Y_np = np.array([[0.2, 0.3, 0.4], [0.5, 0.6, 0.7]], dtype=dtype_name) diff --git a/sklearn/metrics/tests/test_pairwise_distances_reduction.py b/sklearn/metrics/tests/test_pairwise_distances_reduction.py index af055a2091790..0ea6d5d094d56 100644 --- a/sklearn/metrics/tests/test_pairwise_distances_reduction.py +++ b/sklearn/metrics/tests/test_pairwise_distances_reduction.py @@ -228,9 +228,9 @@ def _non_trivial_radius( # on average. Yielding too many results would make the test slow (because # checking the results is expensive for large result sets), yielding 0 most # of the time would make the test useless. - assert ( - precomputed_dists is not None or metric is not None - ), "Either metric or precomputed_dists must be provided." + assert precomputed_dists is not None or metric is not None, ( + "Either metric or precomputed_dists must be provided." + ) if precomputed_dists is None: assert X is not None diff --git a/sklearn/mixture/tests/test_bayesian_mixture.py b/sklearn/mixture/tests/test_bayesian_mixture.py index d17e6710ee5a7..d36543903cb87 100644 --- a/sklearn/mixture/tests/test_bayesian_mixture.py +++ b/sklearn/mixture/tests/test_bayesian_mixture.py @@ -118,7 +118,7 @@ def test_bayesian_mixture_precisions_prior_initialisation(): ) msg = ( "The parameter 'degrees_of_freedom_prior' should be greater than" - f" {n_features -1}, but got {bad_degrees_of_freedom_prior_:.3f}." + f" {n_features - 1}, but got {bad_degrees_of_freedom_prior_:.3f}." ) with pytest.raises(ValueError, match=msg): bgmm.fit(X) diff --git a/sklearn/model_selection/_validation.py b/sklearn/model_selection/_validation.py index 22d4df2fd81c5..5275cab66b3f7 100644 --- a/sklearn/model_selection/_validation.py +++ b/sklearn/model_selection/_validation.py @@ -6,7 +6,6 @@ # Authors: The scikit-learn developers # SPDX-License-Identifier: BSD-3-Clause - import numbers import time import warnings @@ -819,9 +818,9 @@ def _fit_and_score( progress_msg = "" if verbose > 2: if split_progress is not None: - progress_msg = f" {split_progress[0]+1}/{split_progress[1]}" + progress_msg = f" {split_progress[0] + 1}/{split_progress[1]}" if candidate_progress and verbose > 9: - progress_msg += f"; {candidate_progress[0]+1}/{candidate_progress[1]}" + progress_msg += f"; {candidate_progress[0] + 1}/{candidate_progress[1]}" if verbose > 1: if parameters is None: diff --git a/sklearn/model_selection/tests/test_search.py b/sklearn/model_selection/tests/test_search.py index e87bb440c9563..7459d71ea2bd1 100644 --- a/sklearn/model_selection/tests/test_search.py +++ b/sklearn/model_selection/tests/test_search.py @@ -2422,9 +2422,9 @@ def __sklearn_tags__(self): for _pairwise_setting in [True, False]: est.set_params(pairwise=_pairwise_setting) cv = GridSearchCV(est, {"n_neighbors": [10]}) - assert ( - _pairwise_setting == cv.__sklearn_tags__().input_tags.pairwise - ), attr_message + assert _pairwise_setting == cv.__sklearn_tags__().input_tags.pairwise, ( + attr_message + ) def test_search_cv_pairwise_property_equivalence_of_precomputed(): diff --git a/sklearn/model_selection/tests/test_split.py b/sklearn/model_selection/tests/test_split.py index 2286c0ff2573e..39698a8e17b80 100644 --- a/sklearn/model_selection/tests/test_split.py +++ b/sklearn/model_selection/tests/test_split.py @@ -886,9 +886,9 @@ def assert_counts_are_ok(idx_counts, p): bf = stats.binom(n_splits, p) for count in idx_counts: prob = bf.pmf(count) - assert ( - prob > threshold - ), "An index is not drawn with chance corresponding to even draws" + assert prob > threshold, ( + "An index is not drawn with chance corresponding to even draws" + ) for n_samples in (6, 22): groups = np.array((n_samples // 2) * [0, 1]) diff --git a/sklearn/multioutput.py b/sklearn/multioutput.py index 86a33d3d8d0b8..48b9fbd3bdf9a 100644 --- a/sklearn/multioutput.py +++ b/sklearn/multioutput.py @@ -8,7 +8,6 @@ # Authors: The scikit-learn developers # SPDX-License-Identifier: BSD-3-Clause - import warnings from abc import ABCMeta, abstractmethod from numbers import Integral @@ -687,7 +686,6 @@ def _get_estimator(self): ) if self.base_estimator != "deprecated": - warning_msg = ( "`base_estimator` as an argument was deprecated in 1.7 and will be" " removed in 1.9. Use `estimator` instead." diff --git a/sklearn/neighbors/_classification.py b/sklearn/neighbors/_classification.py index cc20af7432914..6ef690eb8bbe4 100644 --- a/sklearn/neighbors/_classification.py +++ b/sklearn/neighbors/_classification.py @@ -359,7 +359,7 @@ def predict_proba(self, X): # on many combination of datasets. # Hence, we choose to enforce it here. # For more information, see: - # https://github.com/scikit-learn/scikit-learn/pull/24076#issuecomment-1445258342 # noqa + # https://github.com/scikit-learn/scikit-learn/pull/24076#issuecomment-1445258342 # TODO: adapt the heuristic for `strategy="auto"` for # `ArgKminClassMode` and use `strategy="auto"`. strategy="parallel_on_X", @@ -807,7 +807,7 @@ def predict_proba(self, X): # on many combination of datasets. # Hence, we choose to enforce it here. # For more information, see: - # https://github.com/scikit-learn/scikit-learn/pull/26828/files#r1282398471 # noqa + # https://github.com/scikit-learn/scikit-learn/pull/26828/files#r1282398471 ) return probabilities diff --git a/sklearn/neighbors/tests/test_neighbors.py b/sklearn/neighbors/tests/test_neighbors.py index f947eb2e0c2b5..6f42fdea4819e 100644 --- a/sklearn/neighbors/tests/test_neighbors.py +++ b/sklearn/neighbors/tests/test_neighbors.py @@ -656,7 +656,7 @@ def test_unsupervised_radius_neighbors( assert_allclose( np.concatenate(list(results[i][0])), np.concatenate(list(results[i + 1][0])), - ), + ) assert_allclose( np.concatenate(list(results[i][1])), np.concatenate(list(results[i + 1][1])), diff --git a/sklearn/preprocessing/tests/test_function_transformer.py b/sklearn/preprocessing/tests/test_function_transformer.py index 81d9d0b8eb843..6bfb5d1367c8d 100644 --- a/sklearn/preprocessing/tests/test_function_transformer.py +++ b/sklearn/preprocessing/tests/test_function_transformer.py @@ -36,13 +36,13 @@ def test_delegate_to_func(): ) # The function should only have received X. - assert args_store == [ - X - ], "Incorrect positional arguments passed to func: {args}".format(args=args_store) + assert args_store == [X], ( + "Incorrect positional arguments passed to func: {args}".format(args=args_store) + ) - assert ( - not kwargs_store - ), "Unexpected keyword arguments passed to func: {args}".format(args=kwargs_store) + assert not kwargs_store, ( + "Unexpected keyword arguments passed to func: {args}".format(args=kwargs_store) + ) # reset the argument stores. args_store[:] = [] @@ -56,13 +56,13 @@ def test_delegate_to_func(): ) # The function should have received X - assert args_store == [ - X - ], "Incorrect positional arguments passed to func: {args}".format(args=args_store) + assert args_store == [X], ( + "Incorrect positional arguments passed to func: {args}".format(args=args_store) + ) - assert ( - not kwargs_store - ), "Unexpected keyword arguments passed to func: {args}".format(args=kwargs_store) + assert not kwargs_store, ( + "Unexpected keyword arguments passed to func: {args}".format(args=kwargs_store) + ) def test_np_log(): diff --git a/sklearn/semi_supervised/_self_training.py b/sklearn/semi_supervised/_self_training.py index 4b469a2e9f8d8..0fe6f57d6c1ed 100644 --- a/sklearn/semi_supervised/_self_training.py +++ b/sklearn/semi_supervised/_self_training.py @@ -217,8 +217,7 @@ def _get_estimator(self): # TODO(1.8) remove elif self.estimator is None and self.base_estimator == "deprecated": raise ValueError( - "You must pass an estimator to SelfTrainingClassifier." - " Use `estimator`." + "You must pass an estimator to SelfTrainingClassifier. Use `estimator`." ) elif self.estimator is not None and self.base_estimator != "deprecated": raise ValueError( diff --git a/sklearn/tests/metadata_routing_common.py b/sklearn/tests/metadata_routing_common.py index c4af13ef66344..f4dd79581db90 100644 --- a/sklearn/tests/metadata_routing_common.py +++ b/sklearn/tests/metadata_routing_common.py @@ -74,9 +74,9 @@ def check_recorded_metadata(obj, method, parent, split_params=tuple(), **kwargs) for record in all_records: # first check that the names of the metadata passed are the same as # expected. The names are stored as keys in `record`. - assert set(kwargs.keys()) == set( - record.keys() - ), f"Expected {kwargs.keys()} vs {record.keys()}" + assert set(kwargs.keys()) == set(record.keys()), ( + f"Expected {kwargs.keys()} vs {record.keys()}" + ) for key, value in kwargs.items(): recorded_value = record[key] # The following condition is used to check for any specified parameters @@ -87,9 +87,9 @@ def check_recorded_metadata(obj, method, parent, split_params=tuple(), **kwargs) if isinstance(recorded_value, np.ndarray): assert_array_equal(recorded_value, value) else: - assert ( - recorded_value is value - ), f"Expected {recorded_value} vs {value}. Method: {method}" + assert recorded_value is value, ( + f"Expected {recorded_value} vs {value}. Method: {method}" + ) record_metadata_not_default = partial(record_metadata, record_default=False) diff --git a/sklearn/tests/test_common.py b/sklearn/tests/test_common.py index 7acf8b47f1cd7..f916f7e9862a5 100644 --- a/sklearn/tests/test_common.py +++ b/sklearn/tests/test_common.py @@ -296,7 +296,6 @@ def _include_in_get_feature_names_out_check(transformer): "transformer", GET_FEATURES_OUT_ESTIMATORS, ids=_get_check_estimator_ids ) def test_transformers_get_feature_names_out(transformer): - with ignore_warnings(category=(FutureWarning)): check_transformer_get_feature_names_out( transformer.__class__.__name__, transformer diff --git a/sklearn/tests/test_discriminant_analysis.py b/sklearn/tests/test_discriminant_analysis.py index e44e2946cb2bb..3a74ccf3b35c3 100644 --- a/sklearn/tests/test_discriminant_analysis.py +++ b/sklearn/tests/test_discriminant_analysis.py @@ -304,16 +304,16 @@ def test_lda_explained_variance_ratio(): clf_lda_eigen = LinearDiscriminantAnalysis(solver="eigen") clf_lda_eigen.fit(X, y) assert_almost_equal(clf_lda_eigen.explained_variance_ratio_.sum(), 1.0, 3) - assert clf_lda_eigen.explained_variance_ratio_.shape == ( - 2, - ), "Unexpected length for explained_variance_ratio_" + assert clf_lda_eigen.explained_variance_ratio_.shape == (2,), ( + "Unexpected length for explained_variance_ratio_" + ) clf_lda_svd = LinearDiscriminantAnalysis(solver="svd") clf_lda_svd.fit(X, y) assert_almost_equal(clf_lda_svd.explained_variance_ratio_.sum(), 1.0, 3) - assert clf_lda_svd.explained_variance_ratio_.shape == ( - 2, - ), "Unexpected length for explained_variance_ratio_" + assert clf_lda_svd.explained_variance_ratio_.shape == (2,), ( + "Unexpected length for explained_variance_ratio_" + ) assert_array_almost_equal( clf_lda_svd.explained_variance_ratio_, clf_lda_eigen.explained_variance_ratio_ diff --git a/sklearn/tests/test_metaestimators.py b/sklearn/tests/test_metaestimators.py index 214fc75a68364..3dbc8f96c10a7 100644 --- a/sklearn/tests/test_metaestimators.py +++ b/sklearn/tests/test_metaestimators.py @@ -157,11 +157,12 @@ def score(self, X, y, *args, **kwargs): if method in delegator_data.skip_methods: continue assert hasattr(delegate, method) - assert hasattr( - delegator, method - ), "%s does not have method %r when its delegate does" % ( - delegator_data.name, - method, + assert hasattr(delegator, method), ( + "%s does not have method %r when its delegate does" + % ( + delegator_data.name, + method, + ) ) # delegation before fit raises a NotFittedError if method == "score": @@ -191,11 +192,12 @@ def score(self, X, y, *args, **kwargs): delegate = SubEstimator(hidden_method=method) delegator = delegator_data.construct(delegate) assert not hasattr(delegate, method) - assert not hasattr( - delegator, method - ), "%s has method %r when its delegate does not" % ( - delegator_data.name, - method, + assert not hasattr(delegator, method), ( + "%s has method %r when its delegate does not" + % ( + delegator_data.name, + method, + ) ) diff --git a/sklearn/tree/tests/test_monotonic_tree.py b/sklearn/tree/tests/test_monotonic_tree.py index 6d89c4ae3f8bb..dfe39720df224 100644 --- a/sklearn/tree/tests/test_monotonic_tree.py +++ b/sklearn/tree/tests/test_monotonic_tree.py @@ -80,9 +80,9 @@ def test_monotonic_constraints_classifications( est.fit(X_train, y_train) proba_test = est.predict_proba(X_test) - assert np.logical_and( - proba_test >= 0.0, proba_test <= 1.0 - ).all(), "Probability should always be in [0, 1] range." + assert np.logical_and(proba_test >= 0.0, proba_test <= 1.0).all(), ( + "Probability should always be in [0, 1] range." + ) assert_allclose(proba_test.sum(axis=1), 1.0) # Monotonic increase constraint, it applies to the positive class diff --git a/sklearn/tree/tests/test_tree.py b/sklearn/tree/tests/test_tree.py index 8348cd29e1c8e..790ebdcea1127 100644 --- a/sklearn/tree/tests/test_tree.py +++ b/sklearn/tree/tests/test_tree.py @@ -198,10 +198,10 @@ def assert_tree_equal(d, s, message): - assert ( - s.node_count == d.node_count - ), "{0}: inequal number of node ({1} != {2})".format( - message, s.node_count, d.node_count + assert s.node_count == d.node_count, ( + "{0}: inequal number of node ({1} != {2})".format( + message, s.node_count, d.node_count + ) ) assert_array_equal( @@ -330,9 +330,9 @@ def test_diabetes_overfit(name, Tree, criterion): reg = Tree(criterion=criterion, random_state=0) reg.fit(diabetes.data, diabetes.target) score = mean_squared_error(diabetes.target, reg.predict(diabetes.data)) - assert score == pytest.approx( - 0 - ), f"Failed with {name}, criterion = {criterion} and score = {score}" + assert score == pytest.approx(0), ( + f"Failed with {name}, criterion = {criterion} and score = {score}" + ) @skip_if_32bit @@ -697,10 +697,10 @@ def check_min_weight_fraction_leaf(name, datasets, sparse_container=None): node_weights = np.bincount(out, weights=weights) # drop inner nodes leaf_weights = node_weights[node_weights != 0] - assert ( - np.min(leaf_weights) >= total_weight * est.min_weight_fraction_leaf - ), "Failed with {0} min_weight_fraction_leaf={1}".format( - name, est.min_weight_fraction_leaf + assert np.min(leaf_weights) >= total_weight * est.min_weight_fraction_leaf, ( + "Failed with {0} min_weight_fraction_leaf={1}".format( + name, est.min_weight_fraction_leaf + ) ) # test case with no weights passed in @@ -720,10 +720,10 @@ def check_min_weight_fraction_leaf(name, datasets, sparse_container=None): node_weights = np.bincount(out) # drop inner nodes leaf_weights = node_weights[node_weights != 0] - assert ( - np.min(leaf_weights) >= total_weight * est.min_weight_fraction_leaf - ), "Failed with {0} min_weight_fraction_leaf={1}".format( - name, est.min_weight_fraction_leaf + assert np.min(leaf_weights) >= total_weight * est.min_weight_fraction_leaf, ( + "Failed with {0} min_weight_fraction_leaf={1}".format( + name, est.min_weight_fraction_leaf + ) ) @@ -845,10 +845,10 @@ def test_min_impurity_decrease(global_random_seed): (est3, 0.0001), (est4, 0.1), ): - assert ( - est.min_impurity_decrease <= expected_decrease - ), "Failed, min_impurity_decrease = {0} > {1}".format( - est.min_impurity_decrease, expected_decrease + assert est.min_impurity_decrease <= expected_decrease, ( + "Failed, min_impurity_decrease = {0} > {1}".format( + est.min_impurity_decrease, expected_decrease + ) ) est.fit(X, y) for node in range(est.tree_.node_count): @@ -879,10 +879,10 @@ def test_min_impurity_decrease(global_random_seed): imp_parent - wtd_avg_left_right_imp ) - assert ( - actual_decrease >= expected_decrease - ), "Failed with {0} expected min_impurity_decrease={1}".format( - actual_decrease, expected_decrease + assert actual_decrease >= expected_decrease, ( + "Failed with {0} expected min_impurity_decrease={1}".format( + actual_decrease, expected_decrease + ) ) @@ -923,9 +923,9 @@ def test_pickle(): assert type(est2) == est.__class__ score2 = est2.score(X, y) - assert ( - score == score2 - ), "Failed to generate same score after pickling with {0}".format(name) + assert score == score2, ( + "Failed to generate same score after pickling with {0}".format(name) + ) for attribute in fitted_attribute: assert_array_equal( getattr(est2.tree_, attribute), @@ -2614,9 +2614,9 @@ def test_missing_value_is_predictive(Tree, expected_score, global_random_seed): # Check that the tree can learn the predictive feature # over an average of cross-validation fits. tree_cv_score = cross_val_score(tree, X, y, cv=5).mean() - assert ( - tree_cv_score >= expected_score - ), f"Expected CV score: {expected_score} but got {tree_cv_score}" + assert tree_cv_score >= expected_score, ( + f"Expected CV score: {expected_score} but got {tree_cv_score}" + ) @pytest.mark.parametrize( diff --git a/sklearn/utils/_array_api.py b/sklearn/utils/_array_api.py index 48c941f3c6e85..eb5b4128782e1 100644 --- a/sklearn/utils/_array_api.py +++ b/sklearn/utils/_array_api.py @@ -854,7 +854,7 @@ def _searchsorted(a, v, *, side="left", sorter=None, xp=None): # Temporary workaround needed as long as searchsorted is not widely # adopted by implementers of the Array API spec. This is a quite # recent addition to the spec: - # https://data-apis.org/array-api/latest/API_specification/generated/array_api.searchsorted.html # noqa + # https://data-apis.org/array-api/latest/API_specification/generated/array_api.searchsorted.html xp, _ = get_namespace(a, v, xp=xp) if hasattr(xp, "searchsorted"): return xp.searchsorted(a, v, side=side, sorter=sorter) diff --git a/sklearn/utils/_metadata_requests.py b/sklearn/utils/_metadata_requests.py index 7bf84511a67d2..2c7e650b133d6 100644 --- a/sklearn/utils/_metadata_requests.py +++ b/sklearn/utils/_metadata_requests.py @@ -1108,8 +1108,9 @@ def __iter__(self): method_mapping = MethodMapping() for method in METHODS: method_mapping.add(caller=method, callee=method) - yield "$self_request", RouterMappingPair( - mapping=method_mapping, router=self._self_request + yield ( + "$self_request", + RouterMappingPair(mapping=method_mapping, router=self._self_request), ) for name, route_mapping in self._route_mappings.items(): yield (name, route_mapping) diff --git a/sklearn/utils/_test_common/instance_generator.py b/sklearn/utils/_test_common/instance_generator.py index 18fb70da7d942..ea995b8116339 100644 --- a/sklearn/utils/_test_common/instance_generator.py +++ b/sklearn/utils/_test_common/instance_generator.py @@ -961,8 +961,7 @@ def _yield_instances_for_check(check, estimator_orig): }, HalvingGridSearchCV: { "check_fit2d_1sample": ( - "Fail during parameter check since min/max resources requires" - " more samples" + "Fail during parameter check since min/max resources requires more samples" ), "check_estimators_nan_inf": "FIXME", "check_classifiers_one_label_sample_weights": "FIXME", @@ -972,8 +971,7 @@ def _yield_instances_for_check(check, estimator_orig): }, HalvingRandomSearchCV: { "check_fit2d_1sample": ( - "Fail during parameter check since min/max resources requires" - " more samples" + "Fail during parameter check since min/max resources requires more samples" ), "check_estimators_nan_inf": "FIXME", "check_classifiers_one_label_sample_weights": "FIXME", diff --git a/sklearn/utils/estimator_checks.py b/sklearn/utils/estimator_checks.py index 5142de2348e2a..6c3d16d98d7fb 100644 --- a/sklearn/utils/estimator_checks.py +++ b/sklearn/utils/estimator_checks.py @@ -4759,9 +4759,9 @@ def check_transformer_get_feature_names_out(name, transformer_orig): else: n_features_out = X_transform.shape[1] - assert ( - len(feature_names_out) == n_features_out - ), f"Expected {n_features_out} feature names, got {len(feature_names_out)}" + assert len(feature_names_out) == n_features_out, ( + f"Expected {n_features_out} feature names, got {len(feature_names_out)}" + ) def check_transformer_get_feature_names_out_pandas(name, transformer_orig): @@ -4816,9 +4816,9 @@ def check_transformer_get_feature_names_out_pandas(name, transformer_orig): else: n_features_out = X_transform.shape[1] - assert ( - len(feature_names_out_default) == n_features_out - ), f"Expected {n_features_out} feature names, got {len(feature_names_out_default)}" + assert len(feature_names_out_default) == n_features_out, ( + f"Expected {n_features_out} feature names, got {len(feature_names_out_default)}" + ) def check_param_validation(name, estimator_orig): @@ -5329,9 +5329,7 @@ def check_classifier_not_supporting_multiclass(name, estimator_orig): 'Only binary classification is supported. The type of the target ' f'is {{y_type}}.' ) - """.format( - name=name - ) + """.format(name=name) err_msg = textwrap.dedent(err_msg) with raises( diff --git a/sklearn/utils/fixes.py b/sklearn/utils/fixes.py index e228825d3d449..bbe7e75d188de 100644 --- a/sklearn/utils/fixes.py +++ b/sklearn/utils/fixes.py @@ -337,7 +337,7 @@ def _in_unstable_openblas_configuration(): return False # OpenBLAS 0.3.16 fixed instability for arm64, see: - # https://github.com/xianyi/OpenBLAS/blob/1b6db3dbba672b4f8af935bd43a1ff6cff4d20b7/Changelog.txt#L56-L58 # noqa + # https://github.com/xianyi/OpenBLAS/blob/1b6db3dbba672b4f8af935bd43a1ff6cff4d20b7/Changelog.txt#L56-L58 openblas_arm64_stable_version = parse_version("0.3.16") for info in modules_info: if info["internal_api"] != "openblas": diff --git a/sklearn/utils/tests/test_indexing.py b/sklearn/utils/tests/test_indexing.py index 27b51da5ff962..61feee2304723 100644 --- a/sklearn/utils/tests/test_indexing.py +++ b/sklearn/utils/tests/test_indexing.py @@ -583,7 +583,6 @@ def test_resample_stratify_2dy(): def test_notimplementederror(): - with pytest.raises( NotImplementedError, match="Resampling with sample_weight is only implemented for replace=True.", diff --git a/sklearn/utils/tests/test_multiclass.py b/sklearn/utils/tests/test_multiclass.py index e361a93e41b10..9a9cbb1f60bdd 100644 --- a/sklearn/utils/tests/test_multiclass.py +++ b/sklearn/utils/tests/test_multiclass.py @@ -369,17 +369,17 @@ def test_is_multilabel(): ) ] for exmpl_sparse in examples_sparse: - assert sparse_exp == is_multilabel( - exmpl_sparse - ), f"is_multilabel({exmpl_sparse!r}) should be {sparse_exp}" + assert sparse_exp == is_multilabel(exmpl_sparse), ( + f"is_multilabel({exmpl_sparse!r}) should be {sparse_exp}" + ) # Densify sparse examples before testing if issparse(example): example = example.toarray() - assert dense_exp == is_multilabel( - example - ), f"is_multilabel({example!r}) should be {dense_exp}" + assert dense_exp == is_multilabel(example), ( + f"is_multilabel({example!r}) should be {dense_exp}" + ) @pytest.mark.parametrize( @@ -400,9 +400,9 @@ def test_is_multilabel_array_api_compliance(array_namespace, device, dtype_name) example = xp.asarray(example, device=device) with config_context(array_api_dispatch=True): - assert dense_exp == is_multilabel( - example - ), f"is_multilabel({example!r}) should be {dense_exp}" + assert dense_exp == is_multilabel(example), ( + f"is_multilabel({example!r}) should be {dense_exp}" + ) def test_check_classification_targets(): @@ -420,12 +420,13 @@ def test_check_classification_targets(): def test_type_of_target(): for group, group_examples in EXAMPLES.items(): for example in group_examples: - assert ( - type_of_target(example) == group - ), "type_of_target(%r) should be %r, got %r" % ( - example, - group, - type_of_target(example), + assert type_of_target(example) == group, ( + "type_of_target(%r) should be %r, got %r" + % ( + example, + group, + type_of_target(example), + ) ) for example in NON_ARRAY_LIKE_EXAMPLES: diff --git a/sklearn/utils/tests/test_pprint.py b/sklearn/utils/tests/test_pprint.py index b3df08732d798..e8026ae36d54c 100644 --- a/sklearn/utils/tests/test_pprint.py +++ b/sklearn/utils/tests/test_pprint.py @@ -4,16 +4,12 @@ import numpy as np import pytest -from sklearn.utils._pprint import _EstimatorPrettyPrinter -from sklearn.linear_model import LogisticRegressionCV -from sklearn.pipeline import make_pipeline +from sklearn import config_context from sklearn.base import BaseEstimator, TransformerMixin from sklearn.feature_selection import SelectKBest, chi2 -from sklearn import config_context - - -# Ignore flake8 (lots of line too long issues) -# ruff: noqa +from sklearn.linear_model import LogisticRegressionCV +from sklearn.pipeline import make_pipeline +from sklearn.utils._pprint import _EstimatorPrettyPrinter # Constructors excerpted to test pprinting diff --git a/sklearn/utils/tests/test_seq_dataset.py b/sklearn/utils/tests/test_seq_dataset.py index 0e6f182e7c71b..7c3420aeb83c2 100644 --- a/sklearn/utils/tests/test_seq_dataset.py +++ b/sklearn/utils/tests/test_seq_dataset.py @@ -154,10 +154,10 @@ def test_fused_types_consistency(dataset_32, dataset_64): def test_buffer_dtype_mismatch_error(): with pytest.raises(ValueError, match="Buffer dtype mismatch"): - ArrayDataset64(X32, y32, sample_weight32, seed=42), + ArrayDataset64(X32, y32, sample_weight32, seed=42) with pytest.raises(ValueError, match="Buffer dtype mismatch"): - ArrayDataset32(X64, y64, sample_weight64, seed=42), + ArrayDataset32(X64, y64, sample_weight64, seed=42) for csr_container in CSR_CONTAINERS: X_csr32 = csr_container(X32) @@ -170,7 +170,7 @@ def test_buffer_dtype_mismatch_error(): y32, sample_weight32, seed=42, - ), + ) with pytest.raises(ValueError, match="Buffer dtype mismatch"): CSRDataset32( @@ -180,4 +180,4 @@ def test_buffer_dtype_mismatch_error(): y64, sample_weight64, seed=42, - ), + ) diff --git a/sklearn/utils/tests/test_tags.py b/sklearn/utils/tests/test_tags.py index 72a811c8470ef..88d5593e26d47 100644 --- a/sklearn/utils/tests/test_tags.py +++ b/sklearn/utils/tests/test_tags.py @@ -565,7 +565,6 @@ def __sklearn_tags__(self): assert _to_new_tags(_to_old_tags(new_tags), estimator=estimator) == new_tags class MyClass: - def fit(self, X, y=None): return self # pragma: no cover diff --git a/sklearn/utils/tests/test_validation.py b/sklearn/utils/tests/test_validation.py index ae12f13624055..1aaf7c346b1d3 100644 --- a/sklearn/utils/tests/test_validation.py +++ b/sklearn/utils/tests/test_validation.py @@ -852,9 +852,9 @@ class TestClassWithDeprecatedFitMethod: def fit(self, X, y, sample_weight=None): pass - assert has_fit_parameter( - TestClassWithDeprecatedFitMethod, "sample_weight" - ), "has_fit_parameter fails for class with deprecated fit method." + assert has_fit_parameter(TestClassWithDeprecatedFitMethod, "sample_weight"), ( + "has_fit_parameter fails for class with deprecated fit method." + ) def test_check_symmetric(): diff --git a/sklearn/utils/validation.py b/sklearn/utils/validation.py index 116d12fc5e8ad..8173c431bd930 100644 --- a/sklearn/utils/validation.py +++ b/sklearn/utils/validation.py @@ -1547,8 +1547,7 @@ def has_fit_parameter(estimator, parameter): # hasattr(estimator, "fit") makes it so that we don't fail for an estimator # that does not have a `fit` method during collection of checks. The right # checks will fail later. - hasattr(estimator, "fit") - and parameter in signature(estimator.fit).parameters + hasattr(estimator, "fit") and parameter in signature(estimator.fit).parameters ) From 603720d6a2c2d0ed1162d1ee1663f31e3ceba771 Mon Sep 17 00:00:00 2001 From: Dimitri Papadopoulos Orfanos <3234522+DimitriPapadopoulos@users.noreply.github.com> Date: Tue, 15 Apr 2025 14:44:25 +0200 Subject: [PATCH 053/182] MNT Add missing cython-lint install in lint workflow (#31208) --- .github/workflows/lint.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/lint.yml b/.github/workflows/lint.yml index 9fe670caef441..f8075e779c56b 100644 --- a/.github/workflows/lint.yml +++ b/.github/workflows/lint.yml @@ -34,7 +34,7 @@ jobs: curl https://raw.githubusercontent.com/${{ github.repository }}/main/build_tools/shared.sh --retry 5 -o ./build_tools/shared.sh source build_tools/shared.sh # Include pytest compatibility with mypy - pip install pytest $(get_dep ruff min) $(get_dep mypy min) + pip install pytest $(get_dep ruff min) $(get_dep mypy min) cython-lint # we save the versions of the linters to be used in the error message later. python -c "from importlib.metadata import version; print(f\"ruff={version('ruff')}\")" >> /tmp/versions.txt python -c "from importlib.metadata import version; print(f\"mypy={version('mypy')}\")" >> /tmp/versions.txt From 4bf49d0c5bffcec8e1f81b8d8d9a98469b0bf371 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Lo=C3=AFc=20Est=C3=A8ve?= Date: Tue, 15 Apr 2025 15:55:25 +0200 Subject: [PATCH 054/182] DOC Simplify Windows build instructions (#31202) --- doc/developers/advanced_installation.rst | 37 ++---------------------- 1 file changed, 3 insertions(+), 34 deletions(-) diff --git a/doc/developers/advanced_installation.rst b/doc/developers/advanced_installation.rst index 09b335ecee1ed..1a0c58de77f4e 100644 --- a/doc/developers/advanced_installation.rst +++ b/doc/developers/advanced_installation.rst @@ -168,43 +168,12 @@ screenshot: .. image:: ../images/visual-studio-build-tools-selection.png -Secondly, find out if you are running 64-bit or 32-bit Python. The building -command depends on the architecture of the Python interpreter. You can check -the architecture by running the following in ``cmd`` or ``powershell`` -console: +Build scikit-learn by running the following command in your `sklearn-env` conda environment +or virtualenv: .. prompt:: bash $ - python -c "import struct; print(struct.calcsize('P') * 8)" - -For 64-bit Python, configure the build environment by running the following -commands in ``cmd`` or an Anaconda Prompt (if you use Anaconda): - -.. sphinx-prompt 1.3.0 (used in doc-min-dependencies CI task) does not support `batch` prompt type, -.. so we work around by using a known prompt type and an explicit prompt text. -.. -.. prompt:: bash C:\> - - SET DISTUTILS_USE_SDK=1 - "C:\Program Files (x86)\Microsoft Visual Studio\2022\BuildTools\VC\Auxiliary\Build\vcvarsall.bat" x64 - -.. note:: - The previous command is for the 2022 version of Visual Studio. If you - have a different version, you will need to adjust the year in the path accordingly. - -Replace ``x64`` by ``x86`` to build for 32-bit Python. - -Please be aware that the path above might be different from user to user. The -aim is to point to the "vcvarsall.bat" file that will set the necessary -environment variables in the current command prompt. - -Finally, build scikit-learn with this command prompt: - -.. prompt:: bash $ - - pip install --editable . \ - --verbose --no-build-isolation \ - --config-settings editable-verbose=true + pip install --editable . --verbose --no-build-isolation --config-settings editable-verbose=true .. _compiler_macos: From 42e09b3206a417506ba7c116a8831167eb5f68f1 Mon Sep 17 00:00:00 2001 From: Dimitri Papadopoulos Orfanos <3234522+DimitriPapadopoulos@users.noreply.github.com> Date: Tue, 15 Apr 2025 16:05:48 +0200 Subject: [PATCH 055/182] DOC Fix typos (#31207) --- sklearn/manifold/tests/test_mds.py | 2 +- sklearn/neural_network/tests/test_mlp.py | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/sklearn/manifold/tests/test_mds.py b/sklearn/manifold/tests/test_mds.py index b34f030b79895..8a465f0d3c2ab 100644 --- a/sklearn/manifold/tests/test_mds.py +++ b/sklearn/manifold/tests/test_mds.py @@ -22,7 +22,7 @@ def test_smacof(): def test_nonmetric_lower_normalized_stress(): - # Testing that nonmetric MDS results in lower normalized stess compared + # Testing that nonmetric MDS results in lower normalized stress compared # compared to metric MDS (non-regression test for issue 27028) sim = np.array([[0, 5, 3, 4], [5, 0, 2, 2], [3, 2, 0, 1], [4, 2, 1, 0]]) Z = np.array([[-0.266, -0.539], [0.451, 0.252], [0.016, -0.238], [-0.200, 0.524]]) diff --git a/sklearn/neural_network/tests/test_mlp.py b/sklearn/neural_network/tests/test_mlp.py index 417d15b0f6cf2..9dddb78223ea7 100644 --- a/sklearn/neural_network/tests/test_mlp.py +++ b/sklearn/neural_network/tests/test_mlp.py @@ -1073,7 +1073,7 @@ def test_mlp_vs_poisson_glm_equivalent(global_random_seed): assert_allclose(mlp.predict(X), glm.predict(X), rtol=1e-4) # The same does not work with the squared error because the output activation is - # the idendity instead of the exponential. + # the identity instead of the exponential. mlp = MLPRegressor( loss="squared_error", hidden_layer_sizes=(1,), From cd119bb24293bb8bfcbef97d8b53c992c75286b2 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Dea=20Mar=C3=ADa=20L=C3=A9on?= Date: Tue, 15 Apr 2025 16:11:27 +0200 Subject: [PATCH 056/182] TST Use global_random_seed in `sklearn/decomposition/tests/test_fastica.py` (#31203) --- sklearn/decomposition/tests/test_fastica.py | 16 ++++++++-------- 1 file changed, 8 insertions(+), 8 deletions(-) diff --git a/sklearn/decomposition/tests/test_fastica.py b/sklearn/decomposition/tests/test_fastica.py index 4d3319c0ee32b..6f8c9c55db621 100644 --- a/sklearn/decomposition/tests/test_fastica.py +++ b/sklearn/decomposition/tests/test_fastica.py @@ -32,10 +32,10 @@ def center_and_norm(x, axis=-1): x /= x.std(axis=0) -def test_gs(): +def test_gs(global_random_seed): # Test gram schmidt orthonormalization # generate a random orthogonal matrix - rng = np.random.RandomState(0) + rng = np.random.RandomState(global_random_seed) W, _, _ = np.linalg.svd(rng.randn(10, 10)) w = rng.randn(10) _gs_decorrelation(w, W, 10) @@ -188,11 +188,11 @@ def test_fastica_nowhiten(): assert hasattr(ica, "mixing_") -def test_fastica_convergence_fail(): +def test_fastica_convergence_fail(global_random_seed): # Test the FastICA algorithm on very simple data # (see test_non_square_fastica). # Ensure a ConvergenceWarning raised if the tolerance is sufficiently low. - rng = np.random.RandomState(0) + rng = np.random.RandomState(global_random_seed) n_samples = 1000 # Generate two sources: @@ -219,9 +219,9 @@ def test_fastica_convergence_fail(): @pytest.mark.parametrize("add_noise", [True, False]) -def test_non_square_fastica(add_noise): +def test_non_square_fastica(global_random_seed, add_noise): # Test the FastICA algorithm on very simple data. - rng = np.random.RandomState(0) + rng = np.random.RandomState(global_random_seed) n_samples = 1000 # Generate two sources: @@ -372,12 +372,12 @@ def test_fastica_errors(): fastica(X, w_init=w_init) -def test_fastica_whiten_unit_variance(): +def test_fastica_whiten_unit_variance(global_random_seed): """Test unit variance of transformed data using FastICA algorithm. Bug #13056 """ - rng = np.random.RandomState(0) + rng = np.random.RandomState(global_random_seed) X = rng.random_sample((100, 10)) n_components = X.shape[1] ica = FastICA(n_components=n_components, whiten="unit-variance", random_state=0) From 1ef751b0f879e1d0ef79d7842c1587ddac46e6f0 Mon Sep 17 00:00:00 2001 From: Vassilis Margonis <43297684+vmargonis@users.noreply.github.com> Date: Tue, 15 Apr 2025 17:45:36 +0300 Subject: [PATCH 057/182] FIX Error in d2_log_loss_score multiclass when one of the classes is missing in y_true. (#30903) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Co-authored-by: Jérémie du Boisberranger --- .../sklearn.metrics/30903.fix.rst | 3 ++ sklearn/metrics/_classification.py | 15 ++++++- sklearn/metrics/tests/test_classification.py | 40 +++++++++++++++++++ 3 files changed, 56 insertions(+), 2 deletions(-) create mode 100644 doc/whats_new/upcoming_changes/sklearn.metrics/30903.fix.rst diff --git a/doc/whats_new/upcoming_changes/sklearn.metrics/30903.fix.rst b/doc/whats_new/upcoming_changes/sklearn.metrics/30903.fix.rst new file mode 100644 index 0000000000000..90250f427dc20 --- /dev/null +++ b/doc/whats_new/upcoming_changes/sklearn.metrics/30903.fix.rst @@ -0,0 +1,3 @@ +- :func:`~metrics.d2_log_loss_score` now properly handles the case when `labels` is + passed and not all of the labels are present in `y_true`. + By :user:`Vassilis Margonis ` diff --git a/sklearn/metrics/_classification.py b/sklearn/metrics/_classification.py index 30dd53bc16109..6ac1adec0d44f 100644 --- a/sklearn/metrics/_classification.py +++ b/sklearn/metrics/_classification.py @@ -3690,8 +3690,19 @@ def d2_log_loss_score(y_true, y_pred, *, sample_weight=None, labels=None): # Proportion of labels in the dataset weights = _check_sample_weight(sample_weight, y_true) - _, y_value_indices = np.unique(y_true, return_inverse=True) - counts = np.bincount(y_value_indices, weights=weights) + # If labels is passed, augment y_true to ensure that all labels are represented + # Use 0 weight for the new samples to not affect the counts + y_true_, weights_ = ( + ( + np.concatenate([y_true, labels]), + np.concatenate([weights, np.zeros_like(weights, shape=len(labels))]), + ) + if labels is not None + else (y_true, weights) + ) + + _, y_value_indices = np.unique(y_true_, return_inverse=True) + counts = np.bincount(y_value_indices, weights=weights_) y_prob = counts / weights.sum() y_pred_null = np.tile(y_prob, (len(y_true), 1)) diff --git a/sklearn/metrics/tests/test_classification.py b/sklearn/metrics/tests/test_classification.py index 13fe8b3deb88e..86be624b91344 100644 --- a/sklearn/metrics/tests/test_classification.py +++ b/sklearn/metrics/tests/test_classification.py @@ -3316,6 +3316,46 @@ def test_d2_log_loss_score(): assert d2_score < 0 +def test_d2_log_loss_score_missing_labels(): + """Check that d2_log_loss_score works when not all labels are present in y_true + + non-regression test for https://github.com/scikit-learn/scikit-learn/issues/30713 + """ + y_true = [2, 0, 2, 0] + labels = [0, 1, 2] + sample_weight = [1.4, 0.6, 0.7, 0.3] + y_pred = np.tile([1, 0, 0], (4, 1)) + + log_loss_obs = log_loss(y_true, y_pred, sample_weight=sample_weight, labels=labels) + + # Null model consists of weighted average of the classes. + # Given that the sum of the weights is 3, + # - weighted average of 0s is (0.6 + 0.3) / 3 = 0.3 + # - weighted average of 1s is 0 + # - weighted average of 2s is (1.4 + 0.7) / 3 = 0.7 + y_pred_null = np.tile([0.3, 0, 0.7], (4, 1)) + log_loss_null = log_loss( + y_true, y_pred_null, sample_weight=sample_weight, labels=labels + ) + + expected_d2_score = 1 - log_loss_obs / log_loss_null + d2_score = d2_log_loss_score( + y_true, y_pred, sample_weight=sample_weight, labels=labels + ) + assert_allclose(d2_score, expected_d2_score) + + +def test_d2_log_loss_score_label_order(): + """Check that d2_log_loss_score doesn't depend on the order of the labels.""" + y_true = [2, 0, 2, 0] + y_pred = np.tile([1, 0, 0], (4, 1)) + + d2_score = d2_log_loss_score(y_true, y_pred, labels=[0, 1, 2]) + d2_score_other = d2_log_loss_score(y_true, y_pred, labels=[0, 2, 1]) + + assert_allclose(d2_score, d2_score_other) + + def test_d2_log_loss_score_raises(): """Test that d2_log_loss_score raises the appropriate errors on invalid inputs.""" From 1ed6943436981a5598c5f7d36a80a606579664b4 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Lo=C3=AFc=20Est=C3=A8ve?= Date: Tue, 15 Apr 2025 23:06:11 +0200 Subject: [PATCH 058/182] MNT Use pytest --import-mode=importlib (#31209) --- pyproject.toml | 1 + 1 file changed, 1 insertion(+) diff --git a/pyproject.toml b/pyproject.toml index 1ba3ba2255af4..1d5459ca0bd76 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -109,6 +109,7 @@ testpaths = "sklearn" addopts = [ "--disable-pytest-warnings", "--color=yes", + "--import-mode=importlib", ] [tool.ruff] From e47b7c0f49450cbbcdb5abcc198cf07719567f34 Mon Sep 17 00:00:00 2001 From: Dimitri Papadopoulos Orfanos <3234522+DimitriPapadopoulos@users.noreply.github.com> Date: Tue, 15 Apr 2025 23:32:42 +0200 Subject: [PATCH 059/182] MNT use fstring (#31205) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Co-authored-by: Jérémie du Boisberranger --- examples/linear_model/plot_sparse_logistic_regression_mnist.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/examples/linear_model/plot_sparse_logistic_regression_mnist.py b/examples/linear_model/plot_sparse_logistic_regression_mnist.py index 22e4e9cd48e60..e4a44e989b565 100644 --- a/examples/linear_model/plot_sparse_logistic_regression_mnist.py +++ b/examples/linear_model/plot_sparse_logistic_regression_mnist.py @@ -75,7 +75,7 @@ ) l1_plot.set_xticks(()) l1_plot.set_yticks(()) - l1_plot.set_xlabel("Class %i" % i) + l1_plot.set_xlabel(f"Class {i}") plt.suptitle("Classification vector for...") run_time = time.time() - t0 From 853b34d935f85d1744ea2186ca0dfef2dcd3121a Mon Sep 17 00:00:00 2001 From: Lucy Liu Date: Wed, 16 Apr 2025 19:06:47 +1000 Subject: [PATCH 060/182] DOC Improve `pairwise_distances` docstring (#31176) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Co-authored-by: Jérémie du Boisberranger --- sklearn/metrics/pairwise.py | 37 +++++++++++++++++++++---------------- 1 file changed, 21 insertions(+), 16 deletions(-) diff --git a/sklearn/metrics/pairwise.py b/sklearn/metrics/pairwise.py index 1a70d2e4fbcea..fa90dedb06da7 100644 --- a/sklearn/metrics/pairwise.py +++ b/sklearn/metrics/pairwise.py @@ -284,7 +284,7 @@ def euclidean_distances( X, Y=None, *, Y_norm_squared=None, squared=False, X_norm_squared=None ): """ - Compute the distance matrix between each pair from a vector array X and Y. + Compute the distance matrix between each pair from a feature array X and Y. For efficiency reasons, the euclidean distance between a pair of row vector x and y is computed as:: @@ -2276,12 +2276,21 @@ def pairwise_distances( ensure_all_finite=None, **kwds, ): - """Compute the distance matrix from a vector array X and optional Y. + """Compute the distance matrix from a feature array X and optional Y. - This method takes either a vector array or a distance matrix, and returns + This function takes one or two feature arrays or a distance matrix, and returns a distance matrix. - If the input is a vector array, the distances are computed. - If the input is a distances matrix, it is returned instead. + + - If `X` is a feature array, of shape (n_samples_X, n_features), and: + + - `Y` is `None` and `metric` is not 'precomputed', the pairwise distances + between `X` and itself are returned. + - `Y` is a feature array of shape (n_samples_Y, n_features), the pairwise + distances between `X` and `Y` is returned. + + - If `X` is a distance matrix, of shape (n_samples_X, n_samples_X), `metric` + should be 'precomputed'. `Y` is thus ignored and `X` is returned as is. + If the input is a collection of non-numeric data (e.g. a list of strings or a boolean array), a custom metric must be passed. @@ -2289,15 +2298,11 @@ def pairwise_distances( preserving compatibility with many other algorithms that take a vector array. - If Y is given (default is None), then the returned matrix is the pairwise - distance between the arrays from both X and Y. - Valid values for metric are: - From scikit-learn: ['cityblock', 'cosine', 'euclidean', 'l1', 'l2', - 'manhattan']. These metrics support sparse matrix - inputs. - ['nan_euclidean'] but it does not yet support sparse matrices. + 'manhattan', 'nan_euclidean']. All metrics support sparse matrix + inputs except 'nan_euclidean'. - From scipy.spatial.distance: ['braycurtis', 'canberra', 'chebyshev', 'correlation', 'dice', 'hamming', 'jaccard', 'kulsinski', 'mahalanobis', @@ -2570,15 +2575,15 @@ def pairwise_kernels( ): """Compute the kernel between arrays X and optional array Y. - This method takes one or two vector arrays or a kernel matrix, and returns + This function takes one or two feature arrays or a kernel matrix, and returns a kernel matrix. - - If `X` is a vector array, of shape (n_samples_X, n_features), and: + - If `X` is a feature array, of shape (n_samples_X, n_features), and: - `Y` is `None` and `metric` is not 'precomputed', the pairwise kernels - between `X` and itself are computed. - - `Y` is a vector array of shape (n_samples_Y, n_features), the pairwise - kernels between arrays `X` and `Y` is returned. + between `X` and itself are returned. + - `Y` is a feature array of shape (n_samples_Y, n_features), the pairwise + kernels between `X` and `Y` is returned. - If `X` is a kernel matrix, of shape (n_samples_X, n_samples_X), `metric` should be 'precomputed'. `Y` is thus ignored and `X` is returned as is. From 13e7ffbdfdedcca93bc9cc423a154a1218953722 Mon Sep 17 00:00:00 2001 From: Dimitri Papadopoulos Orfanos <3234522+DimitriPapadopoulos@users.noreply.github.com> Date: Wed, 16 Apr 2025 12:24:52 +0200 Subject: [PATCH 061/182] MNT git ignore recent black/ruff updates (#31026) --- .git-blame-ignore-revs | 11 ++++++++++- 1 file changed, 10 insertions(+), 1 deletion(-) diff --git a/.git-blame-ignore-revs b/.git-blame-ignore-revs index b261320543fa7..ce83f716e73e3 100644 --- a/.git-blame-ignore-revs +++ b/.git-blame-ignore-revs @@ -32,5 +32,14 @@ d4aad64b1eb2e42e76f49db2ccfbe4b4660d092b # PR 26649: Add isort and ruff rules 42173fdb34b5aded79664e045cada719dfbe39dc -# PR #28802: Update black to 24.3.0 +# PR 28802: Update black to 24.3.0 c4c546355667b070edd5c892b206aa4a97af9a0b + +# PR 30694: Enforce ruff rules (RUF) +fe7c4176828af5231f526e76683fb9bdb9ea0367 + +# PR 30695: Apply ruff/flake8-implicit-str-concat rules (ISC) +5cdbbf15e3fade7cc2462ef66dc4ea0f37f390e3 + +# PR 31015: black -> ruff format +ff78e258ccf11068e2b3a433c51517ae56234f88 From ce8f23df3de9659efe146308b0639f5bc681b244 Mon Sep 17 00:00:00 2001 From: Arturo Amor <86408019+ArturoAmorQ@users.noreply.github.com> Date: Wed, 16 Apr 2025 17:05:35 +0200 Subject: [PATCH 062/182] ENH/FIX add drop_intermediate to DET curve and add threshold at infinity (#29151) Co-authored-by: ArturoAmorQ Co-authored-by: Christian Lorentzen Co-authored-by: Olivier Grisel Co-authored-by: Guillaume Lemaitre --- .../sklearn.metrics/29151.enhancement.rst | 6 ++ .../sklearn.metrics/29151.fix.rst | 4 ++ examples/model_selection/plot_det.py | 63 +++++++++++++++---- sklearn/metrics/_plot/det_curve.py | 31 +++++++-- .../_plot/tests/test_det_curve_display.py | 14 ++++- sklearn/metrics/_ranking.py | 52 ++++++++++++--- sklearn/metrics/tests/test_ranking.py | 61 ++++++++++++------ 7 files changed, 187 insertions(+), 44 deletions(-) create mode 100644 doc/whats_new/upcoming_changes/sklearn.metrics/29151.enhancement.rst create mode 100644 doc/whats_new/upcoming_changes/sklearn.metrics/29151.fix.rst diff --git a/doc/whats_new/upcoming_changes/sklearn.metrics/29151.enhancement.rst b/doc/whats_new/upcoming_changes/sklearn.metrics/29151.enhancement.rst new file mode 100644 index 0000000000000..26fbb92e1c9a9 --- /dev/null +++ b/doc/whats_new/upcoming_changes/sklearn.metrics/29151.enhancement.rst @@ -0,0 +1,6 @@ +- :func:`metrics.det_curve`, :class:`metrics.DetCurveDisplay.from_estimator`, + and :class:`metrics.DetCurveDisplay.from_estimator` now accept a + `drop_intermediate` option to drop thresholds where true positives (tp) do not + change from the previous or subsequent thresholds. All points with the same tp + value have the same `fnr` and thus same y coordinate in a DET curve. + :pr:`29151` by :user:`Arturo Amor `. diff --git a/doc/whats_new/upcoming_changes/sklearn.metrics/29151.fix.rst b/doc/whats_new/upcoming_changes/sklearn.metrics/29151.fix.rst new file mode 100644 index 0000000000000..5312aee72d7c2 --- /dev/null +++ b/doc/whats_new/upcoming_changes/sklearn.metrics/29151.fix.rst @@ -0,0 +1,4 @@ +- :func:`metrics.det_curve` and :class:`metrics.DetCurveDisplay` now return an + extra threshold at infinity where the classifier always predicts the negative + class i.e. tps = fps = 0. + :pr:`29151` by :user:`Arturo Amor `. diff --git a/examples/model_selection/plot_det.py b/examples/model_selection/plot_det.py index bf72fc8ade61f..873d00d696d95 100644 --- a/examples/model_selection/plot_det.py +++ b/examples/model_selection/plot_det.py @@ -60,10 +60,9 @@ # ---------------------- # # Here we define two different classifiers. The goal is to visually compare their -# statistical performance across thresholds using the ROC and DET curves. There -# is no particular reason why these classifiers are chosen other classifiers -# available in scikit-learn. +# statistical performance across thresholds using the ROC and DET curves. +from sklearn.dummy import DummyClassifier from sklearn.ensemble import RandomForestClassifier from sklearn.pipeline import make_pipeline from sklearn.svm import LinearSVC @@ -71,13 +70,14 @@ classifiers = { "Linear SVM": make_pipeline(StandardScaler(), LinearSVC(C=0.025)), "Random Forest": RandomForestClassifier( - max_depth=5, n_estimators=10, max_features=1 + max_depth=5, n_estimators=10, max_features=1, random_state=0 ), + "Non-informative baseline": DummyClassifier(), } # %% -# Plot ROC and DET curves -# ----------------------- +# Compare ROC and DET curves +# -------------------------- # # DET curves are commonly plotted in normal deviate scale. To achieve this the # DET display transforms the error rates as returned by the @@ -86,22 +86,29 @@ import matplotlib.pyplot as plt +from sklearn.dummy import DummyClassifier from sklearn.metrics import DetCurveDisplay, RocCurveDisplay fig, [ax_roc, ax_det] = plt.subplots(1, 2, figsize=(11, 5)) -for name, clf in classifiers.items(): - clf.fit(X_train, y_train) - - RocCurveDisplay.from_estimator(clf, X_test, y_test, ax=ax_roc, name=name) - DetCurveDisplay.from_estimator(clf, X_test, y_test, ax=ax_det, name=name) - ax_roc.set_title("Receiver Operating Characteristic (ROC) curves") ax_det.set_title("Detection Error Tradeoff (DET) curves") ax_roc.grid(linestyle="--") ax_det.grid(linestyle="--") +for name, clf in classifiers.items(): + (color, linestyle) = ( + ("black", "--") if name == "Non-informative baseline" else (None, None) + ) + clf.fit(X_train, y_train) + RocCurveDisplay.from_estimator( + clf, X_test, y_test, ax=ax_roc, name=name, color=color, linestyle=linestyle + ) + DetCurveDisplay.from_estimator( + clf, X_test, y_test, ax=ax_det, name=name, color=color, linestyle=linestyle + ) + plt.legend() plt.show() @@ -117,3 +124,35 @@ # DET curves give direct feedback of the detection error tradeoff to aid in # operating point analysis. The user can then decide the FNR they are willing to # accept at the expense of the FPR (or vice-versa). +# +# Non-informative classifier baseline for the ROC and DET curves +# -------------------------------------------------------------- +# +# The diagonal black-dotted lines in the plots above correspond to a +# :class:`~sklearn.dummy.DummyClassifier` using the default "prior" strategy, to +# serve as baseline for comparison with other classifiers. This classifier makes +# constant predictions, independent of the input features in `X`, making it a +# non-informative classifier. +# +# To further understand the non-informative baseline of the ROC and DET curves, +# we recall the following mathematical definitions: +# +# :math:`\text{FPR} = \frac{\text{FP}}{\text{FP} + \text{TN}}` +# +# :math:`\text{FNR} = \frac{\text{FN}}{\text{TP} + \text{FN}}` +# +# :math:`\text{TPR} = \frac{\text{TP}}{\text{TP} + \text{FN}}` +# +# A classifier that always predict the positive class would have no true +# negatives nor false negatives, giving :math:`\text{FPR} = \text{TPR} = 1` and +# :math:`\text{FNR} = 0`, i.e.: +# +# - a single point in the upper right corner of the ROC plane, +# - a single point in the lower right corner of the DET plane. +# +# Similarly, a classifier that always predict the negative class would have no +# true positives nor false positives, thus :math:`\text{FPR} = \text{TPR} = 0` +# and :math:`\text{FNR} = 1`, i.e.: +# +# - a single point in the lower left corner of the ROC plane, +# - a single point in the upper left corner of the DET plane. diff --git a/sklearn/metrics/_plot/det_curve.py b/sklearn/metrics/_plot/det_curve.py index 7a9b68fb2e7e9..9f7937e6106af 100644 --- a/sklearn/metrics/_plot/det_curve.py +++ b/sklearn/metrics/_plot/det_curve.py @@ -1,6 +1,7 @@ # Authors: The scikit-learn developers # SPDX-License-Identifier: BSD-3-Clause +import numpy as np import scipy as sp from ...utils._plotting import _BinaryClassifierCurveDisplayMixin @@ -8,13 +9,13 @@ class DetCurveDisplay(_BinaryClassifierCurveDisplayMixin): - """DET curve visualization. + """Detection Error Tradeoff (DET) curve visualization. It is recommend to use :func:`~sklearn.metrics.DetCurveDisplay.from_estimator` or :func:`~sklearn.metrics.DetCurveDisplay.from_predictions` to create a visualizer. All parameters are stored as attributes. - Read more in the :ref:`User Guide `. + Read more in the :ref:`User Guide `. .. versionadded:: 0.24 @@ -86,6 +87,7 @@ def from_estimator( y, *, sample_weight=None, + drop_intermediate=True, response_method="auto", pos_label=None, name=None, @@ -94,7 +96,7 @@ def from_estimator( ): """Plot DET curve given an estimator and data. - Read more in the :ref:`User Guide `. + Read more in the :ref:`User Guide `. .. versionadded:: 1.0 @@ -113,6 +115,11 @@ def from_estimator( sample_weight : array-like of shape (n_samples,), default=None Sample weights. + drop_intermediate : bool, default=True + Whether to drop thresholds where true positives (tp) do not change + from the previous or subsequent threshold. All points with the same + tp value have the same `fnr` and thus same y coordinate. + response_method : {'predict_proba', 'decision_function', 'auto'} \ default='auto' Specifies whether to use :term:`predict_proba` or @@ -176,6 +183,7 @@ def from_estimator( y_true=y, y_pred=y_pred, sample_weight=sample_weight, + drop_intermediate=drop_intermediate, name=name, ax=ax, pos_label=pos_label, @@ -189,6 +197,7 @@ def from_predictions( y_pred, *, sample_weight=None, + drop_intermediate=True, pos_label=None, name=None, ax=None, @@ -196,7 +205,7 @@ def from_predictions( ): """Plot the DET curve given the true and predicted labels. - Read more in the :ref:`User Guide `. + Read more in the :ref:`User Guide `. .. versionadded:: 1.0 @@ -213,6 +222,11 @@ def from_predictions( sample_weight : array-like of shape (n_samples,), default=None Sample weights. + drop_intermediate : bool, default=True + Whether to drop thresholds where true positives (tp) do not change + from the previous or subsequent threshold. All points with the same + tp value have the same `fnr` and thus same y coordinate. + pos_label : int, float, bool or str, default=None The label of the positive class. When `pos_label=None`, if `y_true` is in {-1, 1} or {0, 1}, `pos_label` is set to 1, otherwise an @@ -266,6 +280,7 @@ def from_predictions( y_pred, pos_label=pos_label, sample_weight=sample_weight, + drop_intermediate=drop_intermediate, ) viz = cls( @@ -303,6 +318,14 @@ def plot(self, ax=None, *, name=None, **kwargs): line_kwargs = {} if name is None else {"label": name} line_kwargs.update(**kwargs) + # We have the following bounds: + # sp.stats.norm.ppf(0.0) = -np.inf + # sp.stats.norm.ppf(1.0) = np.inf + # We therefore clip to eps and 1 - eps to not provide infinity to matplotlib. + eps = np.finfo(self.fpr.dtype).eps + self.fpr = self.fpr.clip(eps, 1 - eps) + self.fnr = self.fnr.clip(eps, 1 - eps) + (self.line_,) = self.ax_.plot( sp.stats.norm.ppf(self.fpr), sp.stats.norm.ppf(self.fnr), diff --git a/sklearn/metrics/_plot/tests/test_det_curve_display.py b/sklearn/metrics/_plot/tests/test_det_curve_display.py index 242468d177bfa..105778c631030 100644 --- a/sklearn/metrics/_plot/tests/test_det_curve_display.py +++ b/sklearn/metrics/_plot/tests/test_det_curve_display.py @@ -10,9 +10,15 @@ @pytest.mark.parametrize("constructor_name", ["from_estimator", "from_predictions"]) @pytest.mark.parametrize("response_method", ["predict_proba", "decision_function"]) @pytest.mark.parametrize("with_sample_weight", [True, False]) +@pytest.mark.parametrize("drop_intermediate", [True, False]) @pytest.mark.parametrize("with_strings", [True, False]) def test_det_curve_display( - pyplot, constructor_name, response_method, with_sample_weight, with_strings + pyplot, + constructor_name, + response_method, + with_sample_weight, + drop_intermediate, + with_strings, ): X, y = load_iris(return_X_y=True) # Binarize the data with only the two first classes @@ -42,6 +48,7 @@ def test_det_curve_display( "name": lr.__class__.__name__, "alpha": 0.8, "sample_weight": sample_weight, + "drop_intermediate": drop_intermediate, "pos_label": pos_label, } if constructor_name == "from_estimator": @@ -53,11 +60,12 @@ def test_det_curve_display( y, y_pred, sample_weight=sample_weight, + drop_intermediate=drop_intermediate, pos_label=pos_label, ) - assert_allclose(disp.fpr, fpr) - assert_allclose(disp.fnr, fnr) + assert_allclose(disp.fpr, fpr, atol=1e-7) + assert_allclose(disp.fnr, fnr, atol=1e-7) assert disp.estimator_name == "LogisticRegression" diff --git a/sklearn/metrics/_ranking.py b/sklearn/metrics/_ranking.py index 79674e244776a..4fd253fb70997 100644 --- a/sklearn/metrics/_ranking.py +++ b/sklearn/metrics/_ranking.py @@ -270,11 +270,14 @@ def _binary_uninterpolated_average_precision( "y_score": ["array-like"], "pos_label": [Real, str, "boolean", None], "sample_weight": ["array-like", None], + "drop_intermediate": ["boolean"], }, prefer_skip_nested_validation=True, ) -def det_curve(y_true, y_score, pos_label=None, sample_weight=None): - """Compute error rates for different probability thresholds. +def det_curve( + y_true, y_score, pos_label=None, sample_weight=None, drop_intermediate=False +): + """Compute Detection Error Tradeoff (DET) for different probability thresholds. .. note:: This metric is used for evaluation of ranking and error tradeoffs of @@ -284,6 +287,11 @@ def det_curve(y_true, y_score, pos_label=None, sample_weight=None): .. versionadded:: 0.24 + .. versionchanged:: 1.7 + An arbitrary threshold at infinity is added to represent a classifier + that always predicts the negative class, i.e. `fpr=0` and `fnr=1`, unless + `fpr=0` is already reached at a finite threshold. + Parameters ---------- y_true : ndarray of shape (n_samples,) @@ -305,6 +313,13 @@ def det_curve(y_true, y_score, pos_label=None, sample_weight=None): sample_weight : array-like of shape (n_samples,), default=None Sample weights. + drop_intermediate : bool, default=False + Whether to drop thresholds where true positives (tp) do not change from + the previous or subsequent threshold. All points with the same tp value + have the same `fnr` and thus same y coordinate. + + .. versionadded:: 1.7 + Returns ------- fpr : ndarray of shape (n_thresholds,) @@ -318,7 +333,9 @@ def det_curve(y_true, y_score, pos_label=None, sample_weight=None): referred to as false rejection or miss rate. thresholds : ndarray of shape (n_thresholds,) - Decreasing score values. + Decreasing thresholds on the decision function (either `predict_proba` + or `decision_function`) used to compute FPR and FNR. An arbitrary + threshold at infinity is added for the case `fpr=0` and `fnr=1`. See Also -------- @@ -348,6 +365,28 @@ def det_curve(y_true, y_score, pos_label=None, sample_weight=None): y_true, y_score, pos_label=pos_label, sample_weight=sample_weight ) + # add a threshold at inf where the clf always predicts the negative class + # i.e. tps = fps = 0 + tps = np.concatenate(([0], tps)) + fps = np.concatenate(([0], fps)) + thresholds = np.concatenate(([np.inf], thresholds)) + + if drop_intermediate and len(fps) > 2: + # Drop thresholds where true positives (tp) do not change from the + # previous or subsequent threshold. As tp + fn, is fixed for a dataset, + # this means the false negative rate (fnr) remains constant while the + # false positive rate (fpr) changes, producing horizontal line segments + # in the transformed (normal deviate) scale. These intermediate points + # can be dropped to create lighter DET curve plots. + optimal_idxs = np.where( + np.concatenate( + [[True], np.logical_or(np.diff(tps[:-1]), np.diff(tps[1:])), [True]] + ) + )[0] + fps = fps[optimal_idxs] + tps = tps[optimal_idxs] + thresholds = thresholds[optimal_idxs] + if len(np.unique(y_true)) != 2: raise ValueError( "Only one class is present in y_true. Detection error " @@ -358,7 +397,7 @@ def det_curve(y_true, y_score, pos_label=None, sample_weight=None): p_count = tps[-1] n_count = fps[-1] - # start with false positives zero + # start with false positives zero, which may be at a finite threshold first_ind = ( fps.searchsorted(fps[0], side="right") - 1 if fps.searchsorted(fps[0], side="right") > 0 @@ -1088,9 +1127,8 @@ def roc_curve( are reversed upon returning them to ensure they correspond to both ``fpr`` and ``tpr``, which are sorted in reversed order during their calculation. - An arbitrary threshold is added for the case `tpr=0` and `fpr=0` to - ensure that the curve starts at `(0, 0)`. This threshold corresponds to the - `np.inf`. + An arbritrary threshold at infinity is added to represent a classifier + that always predicts the negative class, i.e. `fpr=0` and `tpr=0`. References ---------- diff --git a/sklearn/metrics/tests/test_ranking.py b/sklearn/metrics/tests/test_ranking.py index 9f9b4301a7190..745f12243fa21 100644 --- a/sklearn/metrics/tests/test_ranking.py +++ b/sklearn/metrics/tests/test_ranking.py @@ -1244,18 +1244,18 @@ def test_score_scale_invariance(): ([0, 0, 1], [0, 0.25, 0.5], [0], [0]), ([0, 0, 1], [0.5, 0.75, 1], [0], [0]), ([0, 0, 1], [0.25, 0.5, 0.75], [0], [0]), - ([0, 1, 0], [0, 0.5, 1], [0.5], [0]), - ([0, 1, 0], [0, 0.25, 0.5], [0.5], [0]), - ([0, 1, 0], [0.5, 0.75, 1], [0.5], [0]), - ([0, 1, 0], [0.25, 0.5, 0.75], [0.5], [0]), + ([0, 1, 0], [0, 0.5, 1], [0.5, 0.5, 0], [0, 1, 1]), + ([0, 1, 0], [0, 0.25, 0.5], [0.5, 0.5, 0], [0, 1, 1]), + ([0, 1, 0], [0.5, 0.75, 1], [0.5, 0.5, 0], [0, 1, 1]), + ([0, 1, 0], [0.25, 0.5, 0.75], [0.5, 0.5, 0], [0, 1, 1]), ([0, 1, 1], [0, 0.5, 1], [0.0], [0]), ([0, 1, 1], [0, 0.25, 0.5], [0], [0]), ([0, 1, 1], [0.5, 0.75, 1], [0], [0]), ([0, 1, 1], [0.25, 0.5, 0.75], [0], [0]), - ([1, 0, 0], [0, 0.5, 1], [1, 1, 0.5], [0, 1, 1]), - ([1, 0, 0], [0, 0.25, 0.5], [1, 1, 0.5], [0, 1, 1]), - ([1, 0, 0], [0.5, 0.75, 1], [1, 1, 0.5], [0, 1, 1]), - ([1, 0, 0], [0.25, 0.5, 0.75], [1, 1, 0.5], [0, 1, 1]), + ([1, 0, 0], [0, 0.5, 1], [1, 1, 0.5, 0], [0, 1, 1, 1]), + ([1, 0, 0], [0, 0.25, 0.5], [1, 1, 0.5, 0], [0, 1, 1, 1]), + ([1, 0, 0], [0.5, 0.75, 1], [1, 1, 0.5, 0], [0, 1, 1, 1]), + ([1, 0, 0], [0.25, 0.5, 0.75], [1, 1, 0.5, 0], [0, 1, 1, 1]), ([1, 0, 1], [0, 0.5, 1], [1, 1, 0], [0, 0.5, 0.5]), ([1, 0, 1], [0, 0.25, 0.5], [1, 1, 0], [0, 0.5, 0.5]), ([1, 0, 1], [0.5, 0.75, 1], [1, 1, 0], [0, 0.5, 0.5]), @@ -1270,17 +1270,42 @@ def test_det_curve_toydata(y_true, y_score, expected_fpr, expected_fnr): assert_allclose(fnr, expected_fnr) +@pytest.mark.parametrize( + ["y_true", "y_score", "expected_fpr", "expected_fnr", "drop_intermediate"], + [ + # drop when true positives do not change from the previous or subsequent point + ([1, 0, 0], [0, 0.5, 1], [1, 1, 0.5, 0.0], [0, 1, 1, 1], False), + ([1, 0, 0], [0, 0.5, 1], [1, 1, 0.0], [0, 1, 1], True), + ([1, 0, 0], [0, 0.25, 0.5], [1, 1, 0.5, 0.0], [0, 1, 1, 1], False), + ([1, 0, 0], [0, 0.25, 0.5], [1, 1, 0.0], [0, 1, 1], True), + # do nothing otherwise + ([1, 0, 1], [0, 0.5, 1], [1, 1, 0], [0, 0.5, 0.5], False), + ([1, 0, 1], [0, 0.5, 1], [1, 1, 0], [0, 0.5, 0.5], True), + ([1, 0, 1], [0, 0.25, 0.5], [1, 1, 0], [0, 0.5, 0.5], False), + ([1, 0, 1], [0, 0.25, 0.5], [1, 1, 0], [0, 0.5, 0.5], True), + ], +) +def test_det_curve_drop_intermediate( + y_true, y_score, expected_fpr, expected_fnr, drop_intermediate +): + # Check on a batch of small examples. + fpr, fnr, _ = det_curve(y_true, y_score, drop_intermediate=drop_intermediate) + + assert_allclose(fpr, expected_fpr) + assert_allclose(fnr, expected_fnr) + + @pytest.mark.parametrize( "y_true,y_score,expected_fpr,expected_fnr", [ - ([1, 0], [0.5, 0.5], [1], [0]), - ([0, 1], [0.5, 0.5], [1], [0]), - ([0, 0, 1], [0.25, 0.5, 0.5], [0.5], [0]), - ([0, 1, 0], [0.25, 0.5, 0.5], [0.5], [0]), + ([1, 0], [0.5, 0.5], [1, 0], [0, 1]), + ([0, 1], [0.5, 0.5], [1, 0], [0, 1]), + ([0, 0, 1], [0.25, 0.5, 0.5], [0.5, 0], [0, 1]), + ([0, 1, 0], [0.25, 0.5, 0.5], [0.5, 0], [0, 1]), ([0, 1, 1], [0.25, 0.5, 0.5], [0], [0]), - ([1, 0, 0], [0.25, 0.5, 0.5], [1], [0]), - ([1, 0, 1], [0.25, 0.5, 0.5], [1], [0]), - ([1, 1, 0], [0.25, 0.5, 0.5], [1], [0]), + ([1, 0, 0], [0.25, 0.5, 0.5], [1, 1, 0], [0, 1, 1]), + ([1, 0, 1], [0.25, 0.5, 0.5], [1, 1, 0], [0, 0.5, 1]), + ([1, 1, 0], [0.25, 0.5, 0.5], [1, 1, 0], [0, 0.5, 1]), ], ) def test_det_curve_tie_handling(y_true, y_score, expected_fpr, expected_fnr): @@ -1304,9 +1329,9 @@ def test_det_curve_constant_scores(y_score): y_true=[0, 1, 0, 1, 0, 1], y_score=np.full(6, y_score) ) - assert_allclose(fpr, [1]) - assert_allclose(fnr, [0]) - assert_allclose(threshold, [y_score]) + assert_allclose(fpr, [1, 0]) + assert_allclose(fnr, [0, 1]) + assert_allclose(threshold, [y_score, np.inf]) @pytest.mark.parametrize( From 5059058e134ef7938350603054c6497055c3f39b Mon Sep 17 00:00:00 2001 From: Stefanie Senger <91849487+StefanieSenger@users.noreply.github.com> Date: Thu, 17 Apr 2025 06:08:14 +0200 Subject: [PATCH 063/182] DOC add metadata_routing.rst to User Guide sidebar (#31184) --- doc/conf.py | 4 ---- doc/metadata_routing.rst | 2 -- doc/user_guide.rst | 10 +--------- 3 files changed, 1 insertion(+), 15 deletions(-) diff --git a/doc/conf.py b/doc/conf.py index daf815628e030..ccf721ec8ca2c 100644 --- a/doc/conf.py +++ b/doc/conf.py @@ -943,10 +943,6 @@ def setup(app): "consistently-create-same-random-numpy-array/5837352#comment6712034_5837352", ] -# Config for sphinx-remove-toctrees - -remove_from_toctrees = ["metadata_routing.rst"] - # Use a browser-like user agent to avoid some "403 Client Error: Forbidden for # url" errors. This is taken from the variable navigator.userAgent inside a # browser console. diff --git a/doc/metadata_routing.rst b/doc/metadata_routing.rst index b7f95f3d608d7..d302b84c5de68 100644 --- a/doc/metadata_routing.rst +++ b/doc/metadata_routing.rst @@ -1,7 +1,5 @@ .. currentmodule:: sklearn -.. TODO: update doc/conftest.py once document is updated and examples run. - .. _metadata_routing: Metadata Routing diff --git a/doc/user_guide.rst b/doc/user_guide.rst index 81ce774a5155e..0c1a6ee66ebf9 100644 --- a/doc/user_guide.rst +++ b/doc/user_guide.rst @@ -11,6 +11,7 @@ User Guide supervised_learning.rst unsupervised_learning.rst model_selection.rst + metadata_routing.rst inspection.rst visualizations.rst data_transforms.rst @@ -21,12 +22,3 @@ User Guide dispatching.rst machine_learning_map.rst presentations.rst - -Under Development ------------------ - -.. toctree:: - :numbered: - :maxdepth: 1 - - metadata_routing.rst From 9f3ca07560c5d0757b4093488f8a180b189f9d56 Mon Sep 17 00:00:00 2001 From: Connor Lane Date: Thu, 17 Apr 2025 05:28:03 -0400 Subject: [PATCH 064/182] FIX Add input array check to `randomized_svd` and `randomized_range_finder` (#30819) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Co-authored-by: Adrin Jalali Co-authored-by: Jérémie du Boisberranger --- .../array-api/30819.feature.rst | 2 + .../sklearn.utils/30819.fix.rst | 4 ++ sklearn/cluster/_bicluster.py | 4 +- sklearn/decomposition/_dict_learning.py | 4 +- sklearn/decomposition/_factor_analysis.py | 4 +- sklearn/decomposition/_nmf.py | 4 +- sklearn/decomposition/_pca.py | 4 +- sklearn/decomposition/_truncated_svd.py | 4 +- sklearn/utils/extmath.py | 59 ++++++++++++++++--- sklearn/utils/tests/test_extmath.py | 59 +++++++++++++++++++ 10 files changed, 128 insertions(+), 20 deletions(-) create mode 100644 doc/whats_new/upcoming_changes/array-api/30819.feature.rst create mode 100644 doc/whats_new/upcoming_changes/sklearn.utils/30819.fix.rst diff --git a/doc/whats_new/upcoming_changes/array-api/30819.feature.rst b/doc/whats_new/upcoming_changes/array-api/30819.feature.rst new file mode 100644 index 0000000000000..fac6d32b00375 --- /dev/null +++ b/doc/whats_new/upcoming_changes/array-api/30819.feature.rst @@ -0,0 +1,2 @@ +- :func:`sklearn.utils.extmath.randomized_svd` now support Array API compatible inputs. + By :user:`Connor Lane ` and :user:`Jérémie du Boisberranger `. \ No newline at end of file diff --git a/doc/whats_new/upcoming_changes/sklearn.utils/30819.fix.rst b/doc/whats_new/upcoming_changes/sklearn.utils/30819.fix.rst new file mode 100644 index 0000000000000..81c7564023ac1 --- /dev/null +++ b/doc/whats_new/upcoming_changes/sklearn.utils/30819.fix.rst @@ -0,0 +1,4 @@ +- :func:`utils.extmath.randomized_svd` and :func:`utils.extmath.randomized_range_finder` + now validate their input array to fail early with an informative error message on + invalid input. + By :user:`Connor Lane `. diff --git a/sklearn/cluster/_bicluster.py b/sklearn/cluster/_bicluster.py index 387820cf37282..e7ffc72870dca 100644 --- a/sklearn/cluster/_bicluster.py +++ b/sklearn/cluster/_bicluster.py @@ -14,7 +14,7 @@ from ..base import BaseEstimator, BiclusterMixin, _fit_context from ..utils import check_random_state, check_scalar from ..utils._param_validation import Interval, StrOptions -from ..utils.extmath import make_nonnegative, randomized_svd, safe_sparse_dot +from ..utils.extmath import _randomized_svd, make_nonnegative, safe_sparse_dot from ..utils.validation import assert_all_finite, validate_data from ._kmeans import KMeans, MiniBatchKMeans @@ -144,7 +144,7 @@ def _svd(self, array, n_components, n_discard): kwargs = {} if self.n_svd_vecs is not None: kwargs["n_oversamples"] = self.n_svd_vecs - u, _, vt = randomized_svd( + u, _, vt = _randomized_svd( array, n_components, random_state=self.random_state, **kwargs ) diff --git a/sklearn/decomposition/_dict_learning.py b/sklearn/decomposition/_dict_learning.py index 282376550de24..0ef03183f1f5c 100644 --- a/sklearn/decomposition/_dict_learning.py +++ b/sklearn/decomposition/_dict_learning.py @@ -21,7 +21,7 @@ from ..linear_model import Lars, Lasso, LassoLars, orthogonal_mp_gram from ..utils import check_array, check_random_state, gen_batches, gen_even_slices from ..utils._param_validation import Interval, StrOptions, validate_params -from ..utils.extmath import randomized_svd, row_norms, svd_flip +from ..utils.extmath import _randomized_svd, row_norms, svd_flip from ..utils.parallel import Parallel, delayed from ..utils.validation import check_is_fitted, validate_data @@ -2049,7 +2049,7 @@ def _initialize_dict(self, X, random_state): dictionary = self.dict_init else: # Init V with SVD of X - _, S, dictionary = randomized_svd( + _, S, dictionary = _randomized_svd( X, self._n_components, random_state=random_state ) dictionary = S[:, np.newaxis] * dictionary diff --git a/sklearn/decomposition/_factor_analysis.py b/sklearn/decomposition/_factor_analysis.py index 043d22de9b215..d6d5e72a5b7d3 100644 --- a/sklearn/decomposition/_factor_analysis.py +++ b/sklearn/decomposition/_factor_analysis.py @@ -32,7 +32,7 @@ from ..exceptions import ConvergenceWarning from ..utils import check_random_state from ..utils._param_validation import Interval, StrOptions -from ..utils.extmath import fast_logdet, randomized_svd, squared_norm +from ..utils.extmath import _randomized_svd, fast_logdet, squared_norm from ..utils.validation import check_is_fitted, validate_data @@ -264,7 +264,7 @@ def my_svd(X): random_state = check_random_state(self.random_state) def my_svd(X): - _, s, Vt = randomized_svd( + _, s, Vt = _randomized_svd( X, n_components, random_state=random_state, diff --git a/sklearn/decomposition/_nmf.py b/sklearn/decomposition/_nmf.py index 78c394ad7f90b..45586370a042c 100644 --- a/sklearn/decomposition/_nmf.py +++ b/sklearn/decomposition/_nmf.py @@ -28,7 +28,7 @@ StrOptions, validate_params, ) -from ..utils.extmath import randomized_svd, safe_sparse_dot, squared_norm +from ..utils.extmath import _randomized_svd, safe_sparse_dot, squared_norm from ..utils.validation import ( check_is_fitted, check_non_negative, @@ -314,7 +314,7 @@ def _initialize_nmf(X, n_components, init=None, eps=1e-6, random_state=None): return W, H # NNDSVD initialization - U, S, V = randomized_svd(X, n_components, random_state=random_state) + U, S, V = _randomized_svd(X, n_components, random_state=random_state) W = np.zeros_like(U) H = np.zeros_like(V) diff --git a/sklearn/decomposition/_pca.py b/sklearn/decomposition/_pca.py index 543af09415a30..41b0ac5394be1 100644 --- a/sklearn/decomposition/_pca.py +++ b/sklearn/decomposition/_pca.py @@ -16,7 +16,7 @@ from ..utils._arpack import _init_arpack_v0 from ..utils._array_api import _convert_to_numpy, get_namespace from ..utils._param_validation import Interval, RealNotInt, StrOptions -from ..utils.extmath import fast_logdet, randomized_svd, stable_cumsum, svd_flip +from ..utils.extmath import _randomized_svd, fast_logdet, stable_cumsum, svd_flip from ..utils.sparsefuncs import _implicit_column_offset, mean_variance_axis from ..utils.validation import check_is_fitted, validate_data from ._base import _BasePCA @@ -754,7 +754,7 @@ def _fit_truncated(self, X, n_components, xp): elif svd_solver == "randomized": # sign flipping is done inside - U, S, Vt = randomized_svd( + U, S, Vt = _randomized_svd( X_centered, n_components=n_components, n_oversamples=self.n_oversamples, diff --git a/sklearn/decomposition/_truncated_svd.py b/sklearn/decomposition/_truncated_svd.py index b77882f5da78d..26127b2b522fd 100644 --- a/sklearn/decomposition/_truncated_svd.py +++ b/sklearn/decomposition/_truncated_svd.py @@ -18,7 +18,7 @@ from ..utils import check_array, check_random_state from ..utils._arpack import _init_arpack_v0 from ..utils._param_validation import Interval, StrOptions -from ..utils.extmath import randomized_svd, safe_sparse_dot, svd_flip +from ..utils.extmath import _randomized_svd, safe_sparse_dot, svd_flip from ..utils.sparsefuncs import mean_variance_axis from ..utils.validation import check_is_fitted, validate_data @@ -241,7 +241,7 @@ def fit_transform(self, X, y=None): f"n_components({self.n_components}) must be <=" f" n_features({X.shape[1]})." ) - U, Sigma, VT = randomized_svd( + U, Sigma, VT = _randomized_svd( X, self.n_components, n_iter=self.n_iter, diff --git a/sklearn/utils/extmath.py b/sklearn/utils/extmath.py index b4af090344d74..535505e77c010 100644 --- a/sklearn/utils/extmath.py +++ b/sklearn/utils/extmath.py @@ -219,7 +219,7 @@ def randomized_range_finder( Parameters ---------- - A : 2D array + A : {array-like, sparse matrix} of shape (n_samples, n_features) The input data matrix. size : int @@ -246,9 +246,9 @@ def randomized_range_finder( Returns ------- - Q : ndarray - A (size x size) projection matrix, the range of which - approximates well the range of the input matrix A. + Q : ndarray of shape (size, size) + A projection matrix, the range of which approximates well the range of the + input matrix A. Notes ----- @@ -273,6 +273,21 @@ def randomized_range_finder( [-0.52..., 0.24...], [-0.82..., -0.38...]]) """ + A = check_array(A, accept_sparse=True) + + return _randomized_range_finder( + A, + size=size, + n_iter=n_iter, + power_iteration_normalizer=power_iteration_normalizer, + random_state=random_state, + ) + + +def _randomized_range_finder( + A, *, size, n_iter, power_iteration_normalizer="auto", random_state=None +): + """Body of randomized_range_finder without input validation.""" xp, is_array_api_compliant = get_namespace(A) random_state = check_random_state(random_state) @@ -344,7 +359,7 @@ def randomized_range_finder( @validate_params( { - "M": [np.ndarray, "sparse matrix"], + "M": ["array-like", "sparse matrix"], "n_components": [Interval(Integral, 1, None, closed="left")], "n_oversamples": [Interval(Integral, 0, None, closed="left")], "n_iter": [Interval(Integral, 0, None, closed="left"), StrOptions({"auto"})], @@ -381,7 +396,7 @@ def randomized_svd( Parameters ---------- - M : {ndarray, sparse matrix} + M : {array-like, sparse matrix} of shape (n_samples, n_features) Matrix to decompose. n_components : int @@ -499,6 +514,35 @@ def randomized_svd( >>> U.shape, s.shape, Vh.shape ((3, 2), (2,), (2, 4)) """ + M = check_array(M, accept_sparse=True) + return _randomized_svd( + M, + n_components=n_components, + n_oversamples=n_oversamples, + n_iter=n_iter, + power_iteration_normalizer=power_iteration_normalizer, + transpose=transpose, + flip_sign=flip_sign, + random_state=random_state, + svd_lapack_driver=svd_lapack_driver, + ) + + +def _randomized_svd( + M, + n_components, + *, + n_oversamples=10, + n_iter="auto", + power_iteration_normalizer="auto", + transpose="auto", + flip_sign=True, + random_state=None, + svd_lapack_driver="gesdd", +): + """Body of randomized_svd without input validation.""" + xp, is_array_api_compliant = get_namespace(M) + if sparse.issparse(M) and M.format in ("lil", "dok"): warnings.warn( "Calculating SVD of a {} is expensive. " @@ -521,7 +565,7 @@ def randomized_svd( # this implementation is a bit faster with smaller shape[1] M = M.T - Q = randomized_range_finder( + Q = _randomized_range_finder( M, size=n_random, n_iter=n_iter, @@ -533,7 +577,6 @@ def randomized_svd( B = Q.T @ M # compute the SVD on the thin matrix: (k + p) wide - xp, is_array_api_compliant = get_namespace(B) if is_array_api_compliant: Uhat, s, Vt = xp.linalg.svd(B, full_matrices=False) else: diff --git a/sklearn/utils/tests/test_extmath.py b/sklearn/utils/tests/test_extmath.py index 74cb47388692f..907de11702af2 100644 --- a/sklearn/utils/tests/test_extmath.py +++ b/sklearn/utils/tests/test_extmath.py @@ -9,10 +9,18 @@ from scipy.linalg import eigh from scipy.sparse.linalg import eigsh +from sklearn import config_context from sklearn.datasets import make_low_rank_matrix, make_sparse_spd_matrix from sklearn.utils import gen_batches from sklearn.utils._arpack import _init_arpack_v0 +from sklearn.utils._array_api import ( + _convert_to_numpy, + _get_namespace_device_dtype_ids, + get_namespace, + yield_namespace_device_dtype_combinations, +) from sklearn.utils._testing import ( + _array_api_for_tests, assert_allclose, assert_allclose_dense_sparse, assert_almost_equal, @@ -28,6 +36,7 @@ _safe_accumulator_op, cartesian, density, + randomized_range_finder, randomized_svd, row_norms, safe_sparse_dot, @@ -1060,3 +1069,53 @@ def test_approximate_mode(): # 25% * 99.000 = 24.750 # 25% * 1.000 = 250 assert_array_equal(ret, [24750, 250]) + + +@pytest.mark.parametrize( + "array_namespace, device, dtype", + yield_namespace_device_dtype_combinations(), + ids=_get_namespace_device_dtype_ids, +) +def test_randomized_svd_array_api_compliance(array_namespace, device, dtype): + xp = _array_api_for_tests(array_namespace, device) + + rng = np.random.RandomState(0) + X = rng.normal(size=(30, 10)).astype(dtype) + X_xp = xp.asarray(X, device=device) + n_components = 5 + atol = 1e-5 if dtype == "float32" else 0 + + with config_context(array_api_dispatch=True): + u_np, s_np, vt_np = randomized_svd(X, n_components, random_state=0) + u_xp, s_xp, vt_xp = randomized_svd(X_xp, n_components, random_state=0) + + assert get_namespace(u_xp)[0].__name__ == xp.__name__ + assert get_namespace(s_xp)[0].__name__ == xp.__name__ + assert get_namespace(vt_xp)[0].__name__ == xp.__name__ + + assert_allclose(_convert_to_numpy(u_xp, xp), u_np, atol=atol) + assert_allclose(_convert_to_numpy(s_xp, xp), s_np, atol=atol) + assert_allclose(_convert_to_numpy(vt_xp, xp), vt_np, atol=atol) + + +@pytest.mark.parametrize( + "array_namespace, device, dtype", + yield_namespace_device_dtype_combinations(), + ids=_get_namespace_device_dtype_ids, +) +def test_randomized_range_finder_array_api_compliance(array_namespace, device, dtype): + xp = _array_api_for_tests(array_namespace, device) + + rng = np.random.RandomState(0) + X = rng.normal(size=(30, 10)).astype(dtype) + X_xp = xp.asarray(X, device=device) + size = 5 + n_iter = 10 + atol = 1e-5 if dtype == "float32" else 0 + + with config_context(array_api_dispatch=True): + Q_np = randomized_range_finder(X, size=size, n_iter=n_iter, random_state=0) + Q_xp = randomized_range_finder(X_xp, size=size, n_iter=n_iter, random_state=0) + + assert get_namespace(Q_xp)[0].__name__ == xp.__name__ + assert_allclose(_convert_to_numpy(Q_xp, xp), Q_np, atol=atol) From 32aa82d25725d4bc0dfd7707e5c0f8d1387a1ea6 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?J=C3=A9r=C3=A9mie=20du=20Boisberranger?= Date: Thu, 17 Apr 2025 13:50:35 +0200 Subject: [PATCH 065/182] MNT Clean-up deprecations for 1.7: old tags (#31134) --- sklearn/base.py | 59 --- sklearn/pipeline.py | 2 +- sklearn/tests/test_common.py | 35 -- sklearn/utils/_tags.py | 313 ++-------------- sklearn/utils/tests/test_tags.py | 591 ++----------------------------- 5 files changed, 59 insertions(+), 941 deletions(-) diff --git a/sklearn/base.py b/sklearn/base.py index bff0bf18bed37..94aa51828aae5 100644 --- a/sklearn/base.py +++ b/sklearn/base.py @@ -30,14 +30,11 @@ ) from .utils.fixes import _IS_32BIT from .utils.validation import ( - _check_feature_names, _check_feature_names_in, - _check_n_features, _generate_get_feature_names_out, _is_fitted, check_array, check_is_fitted, - validate_data, ) @@ -389,33 +386,6 @@ def __setstate__(self, state): except AttributeError: self.__dict__.update(state) - # TODO(1.7): Remove this method - def _more_tags(self): - """This code should never be reached since our `get_tags` will fallback on - `__sklearn_tags__` implemented below. We keep it for backward compatibility. - It is tested in `test_base_estimator_more_tags` in - `sklearn/utils/testing/test_tags.py`.""" - from sklearn.utils._tags import _to_old_tags, default_tags - - warnings.warn( - "The `_more_tags` method is deprecated in 1.6 and will be removed in " - "1.7. Please implement the `__sklearn_tags__` method.", - category=DeprecationWarning, - ) - return _to_old_tags(default_tags(self)) - - # TODO(1.7): Remove this method - def _get_tags(self): - from sklearn.utils._tags import _to_old_tags, get_tags - - warnings.warn( - "The `_get_tags` method is deprecated in 1.6 and will be removed in " - "1.7. Please implement the `__sklearn_tags__` method.", - category=DeprecationWarning, - ) - - return _to_old_tags(get_tags(self)) - def __sklearn_tags__(self): return Tags( estimator_type=None, @@ -469,35 +439,6 @@ def _repr_mimebundle_(self, **kwargs): output["text/html"] = estimator_html_repr(self) return output - # TODO(1.7): Remove this method - def _validate_data(self, *args, **kwargs): - warnings.warn( - "`BaseEstimator._validate_data` is deprecated in 1.6 and will be removed " - "in 1.7. Use `sklearn.utils.validation.validate_data` instead. This " - "function becomes public and is part of the scikit-learn developer API.", - FutureWarning, - ) - return validate_data(self, *args, **kwargs) - - # TODO(1.7): Remove this method - def _check_n_features(self, *args, **kwargs): - warnings.warn( - "`BaseEstimator._check_n_features` is deprecated in 1.6 and will be " - "removed in 1.7. Use `sklearn.utils.validation._check_n_features` instead.", - FutureWarning, - ) - _check_n_features(self, *args, **kwargs) - - # TODO(1.7): Remove this method - def _check_feature_names(self, *args, **kwargs): - warnings.warn( - "`BaseEstimator._check_feature_names` is deprecated in 1.6 and will be " - "removed in 1.7. Use `sklearn.utils.validation._check_feature_names` " - "instead.", - FutureWarning, - ) - _check_feature_names(self, *args, **kwargs) - class ClassifierMixin: """Mixin class for all classifiers in scikit-learn. diff --git a/sklearn/pipeline.py b/sklearn/pipeline.py index 13b9599ffc5e0..122b9508da86a 100644 --- a/sklearn/pipeline.py +++ b/sklearn/pipeline.py @@ -1221,7 +1221,7 @@ def __sklearn_tags__(self): tags.input_tags.sparse = all( get_tags(step).input_tags.sparse for name, step in self.steps - if step != "passthrough" + if step is not None and step != "passthrough" ) except (ValueError, AttributeError, TypeError): # This happens when the `steps` is not a list of (name, estimator) diff --git a/sklearn/tests/test_common.py b/sklearn/tests/test_common.py index f916f7e9862a5..227e2d7663500 100644 --- a/sklearn/tests/test_common.py +++ b/sklearn/tests/test_common.py @@ -19,7 +19,6 @@ import sklearn from sklearn.base import BaseEstimator from sklearn.compose import ColumnTransformer -from sklearn.datasets import make_classification from sklearn.exceptions import ConvergenceWarning # make it possible to discover experimental estimators when calling `all_estimators` @@ -401,37 +400,3 @@ def test_check_inplace_ensure_writeable(estimator): estimator.set_params(kernel="precomputed") check_inplace_ensure_writeable(name, estimator) - - -# TODO(1.7): Remove this test when the deprecation cycle is over -def test_transition_public_api_deprecations(): - """This test checks that we raised deprecation warning explaining how to transition - to the new developer public API from 1.5 to 1.6. - """ - - class OldEstimator(BaseEstimator): - def fit(self, X, y=None): - X = self._validate_data(X) - self._check_n_features(X, reset=True) - self._check_feature_names(X, reset=True) - return self - - def transform(self, X): - return X # pragma: no cover - - X, y = make_classification(n_samples=10, n_features=5, random_state=0) - - old_estimator = OldEstimator() - with pytest.warns(FutureWarning) as warning_list: - old_estimator.fit(X) - - assert len(warning_list) == 3 - assert str(warning_list[0].message).startswith( - "`BaseEstimator._validate_data` is deprecated" - ) - assert str(warning_list[1].message).startswith( - "`BaseEstimator._check_n_features` is deprecated" - ) - assert str(warning_list[2].message).startswith( - "`BaseEstimator._check_feature_names` is deprecated" - ) diff --git a/sklearn/utils/_tags.py b/sklearn/utils/_tags.py index f63d7b3bd008c..44b3eb64523c9 100644 --- a/sklearn/utils/_tags.py +++ b/sklearn/utils/_tags.py @@ -1,9 +1,7 @@ from __future__ import annotations import warnings -from collections import OrderedDict from dataclasses import dataclass, field -from itertools import chain, pairwise # Authors: The scikit-learn developers # SPDX-License-Identifier: BSD-3-Clause @@ -297,71 +295,6 @@ def default_tags(estimator) -> Tags: ) -# TODO(1.7): Remove this function -def _find_tags_provider(estimator, warn=True): - """Find the tags provider for an estimator. - - Parameters - ---------- - estimator : estimator object - The estimator to find the tags provider for. - - warn : bool, default=True - Whether to warn if the tags provider is not found. - - Returns - ------- - tag_provider : str - The tags provider for the estimator. Can be one of: - - "_get_tags": to use the old tags infrastructure - - "__sklearn_tags__": to use the new tags infrastructure - """ - mro_model = type(estimator).mro() - tags_mro = OrderedDict() - for klass in mro_model: - tags_provider = [] - if "_more_tags" in vars(klass): - tags_provider.append("_more_tags") - if "_get_tags" in vars(klass): - tags_provider.append("_get_tags") - if "__sklearn_tags__" in vars(klass): - tags_provider.append("__sklearn_tags__") - tags_mro[klass.__name__] = tags_provider - - all_providers = set(chain.from_iterable(tags_mro.values())) - if "__sklearn_tags__" not in all_providers: - # default on the old tags infrastructure - return "_get_tags" - - tag_provider = "__sklearn_tags__" - for klass in tags_mro: - has_get_or_more_tags = any( - provider in tags_mro[klass] for provider in ("_get_tags", "_more_tags") - ) - has_sklearn_tags = "__sklearn_tags__" in tags_mro[klass] - - if tags_mro[klass] and tag_provider == "__sklearn_tags__": # is it empty - if has_get_or_more_tags and not has_sklearn_tags: - # Case where a class does not implement __sklearn_tags__ and we fallback - # to _get_tags. We should therefore warn for implementing - # __sklearn_tags__. - tag_provider = "_get_tags" - break - - if warn and tag_provider == "_get_tags": - warnings.warn( - f"The {estimator.__class__.__name__} or classes from which it inherits " - "use `_get_tags` and `_more_tags`. Please define the " - "`__sklearn_tags__` method, or inherit from `sklearn.base.BaseEstimator` " - "and/or other appropriate mixins such as `sklearn.base.TransformerMixin`, " - "`sklearn.base.ClassifierMixin`, `sklearn.base.RegressorMixin`, and " - "`sklearn.base.OutlierMixin`. From scikit-learn 1.7, not defining " - "`__sklearn_tags__` will raise an error.", - category=DeprecationWarning, - ) - return tag_provider - - def get_tags(estimator) -> Tags: """Get estimator tags. @@ -388,223 +321,35 @@ def get_tags(estimator) -> Tags: The estimator tags. """ - tag_provider = _find_tags_provider(estimator) - - if tag_provider == "__sklearn_tags__": - # TODO(1.7): turn the warning into an error - try: - tags = estimator.__sklearn_tags__() - except AttributeError as exc: - if str(exc) == "'super' object has no attribute '__sklearn_tags__'": - # workaround the regression reported in - # https://github.com/scikit-learn/scikit-learn/issues/30479 - # `__sklearn_tags__` is implemented by calling - # `super().__sklearn_tags__()` but there is no `__sklearn_tags__` - # method in the base class. - warnings.warn( - f"The following error was raised: {exc}. It seems that " - "there are no classes that implement `__sklearn_tags__` " - "in the MRO and/or all classes in the MRO call " - "`super().__sklearn_tags__()`. Make sure to inherit from " - "`BaseEstimator` which implements `__sklearn_tags__` (or " - "alternatively define `__sklearn_tags__` but we don't recommend " - "this approach). Note that `BaseEstimator` needs to be on the " - "right side of other Mixins in the inheritance order. The " - "default are now used instead since retrieving tags failed. " - "This warning will be replaced by an error in 1.7.", - category=DeprecationWarning, - ) - tags = default_tags(estimator) - else: - raise - else: - # TODO(1.7): Remove this branch of the code - # Let's go through the MRO and patch each class implementing _more_tags - sklearn_tags_provider = {} - more_tags_provider = {} - class_order = [] - for klass in reversed(type(estimator).mro()): - if "__sklearn_tags__" in vars(klass): - sklearn_tags_provider[klass] = klass.__sklearn_tags__(estimator) # type: ignore[attr-defined] - class_order.append(klass) - elif "_more_tags" in vars(klass): - more_tags_provider[klass] = klass._more_tags(estimator) # type: ignore[attr-defined] - class_order.append(klass) - - # Find differences between consecutive in the case of __sklearn_tags__ - # inheritance - sklearn_tags_diff = {} - items = list(sklearn_tags_provider.items()) - for current_item, next_item in pairwise(items): - current_name, current_tags = current_item - next_name, next_tags = next_item - current_tags = _to_old_tags(current_tags) - next_tags = _to_old_tags(next_tags) - - # Compare tags and store differences - diff = {} - for key in current_tags: - if current_tags[key] != next_tags[key]: - diff[key] = next_tags[key] - - sklearn_tags_diff[next_name] = diff - - tags = {} - for klass in class_order: - if klass in sklearn_tags_diff: - tags.update(sklearn_tags_diff[klass]) - elif klass in more_tags_provider: - tags.update(more_tags_provider[klass]) - - tags = _to_new_tags( - {**_to_old_tags(default_tags(estimator)), **tags}, estimator - ) - - return tags - - -# TODO(1.7): Remove this function -def _safe_tags(estimator, key=None): - warnings.warn( - "The `_safe_tags` function is deprecated in 1.6 and will be removed in " - "1.7. Use the public `get_tags` function instead and make sure to implement " - "the `__sklearn_tags__` method.", - category=DeprecationWarning, - ) - tags = _to_old_tags(get_tags(estimator)) - - if key is not None: - if key not in tags: - raise ValueError( - f"The key {key} is not defined for the class " - f"{estimator.__class__.__name__}." + try: + tags = estimator.__sklearn_tags__() + except AttributeError as exc: + # TODO(1.8): turn the warning into an error + if "object has no attribute '__sklearn_tags__'" in str(exc): + # Fall back to the default tags if the estimator does not + # implement __sklearn_tags__. + # In particular, workaround the regression reported in + # https://github.com/scikit-learn/scikit-learn/issues/30479 + # `__sklearn_tags__` is implemented by calling + # `super().__sklearn_tags__()` but there is no `__sklearn_tags__` + # method in the base class. Typically happens when only inheriting + # from Mixins. + + warnings.warn( + f"The following error was raised: {exc}. It seems that " + "there are no classes that implement `__sklearn_tags__` " + "in the MRO and/or all classes in the MRO call " + "`super().__sklearn_tags__()`. Make sure to inherit from " + "`BaseEstimator` which implements `__sklearn_tags__` (or " + "alternatively define `__sklearn_tags__` but we don't recommend " + "this approach). Note that `BaseEstimator` needs to be on the " + "right side of other Mixins in the inheritance order. The " + "default are now used instead since retrieving tags failed. " + "This warning will be replaced by an error in 1.8.", + category=DeprecationWarning, ) - return tags[key] - return tags - + tags = default_tags(estimator) + else: + raise -# TODO(1.7): Remove this function -def _to_new_tags(old_tags, estimator=None): - """Utility function convert old tags (dictionary) to new tags (dataclass).""" - input_tags = InputTags( - one_d_array="1darray" in old_tags["X_types"], - two_d_array="2darray" in old_tags["X_types"], - three_d_array="3darray" in old_tags["X_types"], - sparse="sparse" in old_tags["X_types"], - categorical="categorical" in old_tags["X_types"], - string="string" in old_tags["X_types"], - dict="dict" in old_tags["X_types"], - positive_only=old_tags["requires_positive_X"], - allow_nan=old_tags["allow_nan"], - pairwise=old_tags["pairwise"], - ) - target_tags = TargetTags( - required=old_tags["requires_y"], - one_d_labels="1dlabels" in old_tags["X_types"], - two_d_labels="2dlabels" in old_tags["X_types"], - positive_only=old_tags["requires_positive_y"], - multi_output=old_tags["multioutput"] or old_tags["multioutput_only"], - single_output=not old_tags["multioutput_only"], - ) - if estimator is not None and ( - hasattr(estimator, "transform") or hasattr(estimator, "fit_transform") - ): - transformer_tags = TransformerTags( - preserves_dtype=old_tags["preserves_dtype"], - ) - else: - transformer_tags = None - estimator_type = getattr(estimator, "_estimator_type", None) - if estimator_type == "classifier": - classifier_tags = ClassifierTags( - poor_score=old_tags["poor_score"], - multi_class=not old_tags["binary_only"], - multi_label=old_tags["multilabel"], - ) - else: - classifier_tags = None - if estimator_type == "regressor": - regressor_tags = RegressorTags( - poor_score=old_tags["poor_score"], - ) - else: - regressor_tags = None - return Tags( - estimator_type=estimator_type, - target_tags=target_tags, - transformer_tags=transformer_tags, - classifier_tags=classifier_tags, - regressor_tags=regressor_tags, - input_tags=input_tags, - array_api_support=old_tags["array_api_support"], - no_validation=old_tags["no_validation"], - non_deterministic=old_tags["non_deterministic"], - requires_fit=old_tags["requires_fit"], - _skip_test=old_tags["_skip_test"], - ) - - -# TODO(1.7): Remove this function -def _to_old_tags(new_tags): - """Utility function convert old tags (dictionary) to new tags (dataclass).""" - if new_tags.classifier_tags: - binary_only = not new_tags.classifier_tags.multi_class - multilabel = new_tags.classifier_tags.multi_label - poor_score_clf = new_tags.classifier_tags.poor_score - else: - binary_only = False - multilabel = False - poor_score_clf = False - - if new_tags.regressor_tags: - poor_score_reg = new_tags.regressor_tags.poor_score - else: - poor_score_reg = False - - if new_tags.transformer_tags: - preserves_dtype = new_tags.transformer_tags.preserves_dtype - else: - preserves_dtype = ["float64"] - - tags = { - "allow_nan": new_tags.input_tags.allow_nan, - "array_api_support": new_tags.array_api_support, - "binary_only": binary_only, - "multilabel": multilabel, - "multioutput": new_tags.target_tags.multi_output, - "multioutput_only": ( - not new_tags.target_tags.single_output and new_tags.target_tags.multi_output - ), - "no_validation": new_tags.no_validation, - "non_deterministic": new_tags.non_deterministic, - "pairwise": new_tags.input_tags.pairwise, - "preserves_dtype": preserves_dtype, - "poor_score": poor_score_clf or poor_score_reg, - "requires_fit": new_tags.requires_fit, - "requires_positive_X": new_tags.input_tags.positive_only, - "requires_y": new_tags.target_tags.required, - "requires_positive_y": new_tags.target_tags.positive_only, - "_skip_test": new_tags._skip_test, - "stateless": new_tags.requires_fit, - } - X_types = [] - if new_tags.input_tags.one_d_array: - X_types.append("1darray") - if new_tags.input_tags.two_d_array: - X_types.append("2darray") - if new_tags.input_tags.three_d_array: - X_types.append("3darray") - if new_tags.input_tags.sparse: - X_types.append("sparse") - if new_tags.input_tags.categorical: - X_types.append("categorical") - if new_tags.input_tags.string: - X_types.append("string") - if new_tags.input_tags.dict: - X_types.append("dict") - if new_tags.target_tags.one_d_labels: - X_types.append("1dlabels") - if new_tags.target_tags.two_d_labels: - X_types.append("2dlabels") - tags["X_types"] = X_types return tags diff --git a/sklearn/utils/tests/test_tags.py b/sklearn/utils/tests/test_tags.py index 88d5593e26d47..f08dfad1a2fb1 100644 --- a/sklearn/utils/tests/test_tags.py +++ b/sklearn/utils/tests/test_tags.py @@ -11,15 +11,9 @@ ) from sklearn.pipeline import Pipeline from sklearn.utils import ( - ClassifierTags, - InputTags, - RegressorTags, Tags, - TargetTags, - TransformerTags, get_tags, ) -from sklearn.utils._tags import _safe_tags, _to_new_tags, _to_old_tags, default_tags from sklearn.utils.estimator_checks import ( check_estimator_tags_renamed, check_valid_tag_types, @@ -43,8 +37,9 @@ class EmptyRegressor(RegressorMixin, BaseEstimator): pass +# TODO(1.8): Update when implementing __sklearn_tags__ is required @pytest.mark.filterwarnings( - "ignore:.*no __sklearn_tags__ attribute.*:DeprecationWarning" + "ignore:.*no attribute '__sklearn_tags__'.*:DeprecationWarning" ) @pytest.mark.parametrize( "estimator, value", @@ -94,563 +89,22 @@ def __sklearn_tags__(self): check_valid_tag_types("MyEstimator", MyEstimator()) -######################################################################################## -# Test for the deprecation -# TODO(1.7): Remove this -######################################################################################## - - -class MixinAllowNanOldTags: - def _more_tags(self): - return {"allow_nan": True} - - -class MixinAllowNanNewTags: - def __sklearn_tags__(self): - tags = super().__sklearn_tags__() - tags.input_tags.allow_nan = True - return tags - - -class MixinAllowNanOldNewTags: - def _more_tags(self): - return {"allow_nan": True} # pragma: no cover - - def __sklearn_tags__(self): - tags = super().__sklearn_tags__() - tags.input_tags.allow_nan = True - return tags - - -class MixinArrayApiSupportOldTags: - def _more_tags(self): - return {"array_api_support": True} - - -class MixinArrayApiSupportNewTags: - def __sklearn_tags__(self): - tags = super().__sklearn_tags__() - tags.array_api_support = True - return tags - - -class MixinArrayApiSupportOldNewTags: - def _more_tags(self): - return {"array_api_support": True} # pragma: no cover - - def __sklearn_tags__(self): - tags = super().__sklearn_tags__() - tags.array_api_support = True - return tags - - -class PredictorOldTags(BaseEstimator): - def _more_tags(self): - return {"requires_fit": True} - - -class PredictorNewTags(BaseEstimator): - def __sklearn_tags__(self): - tags = super().__sklearn_tags__() - tags.requires_fit = True - return tags - - -class PredictorOldNewTags(BaseEstimator): - def _more_tags(self): - return {"requires_fit": True} # pragma: no cover - - def __sklearn_tags__(self): - tags = super().__sklearn_tags__() - tags.requires_fit = True - return tags - - -def test_get_tags_backward_compatibility(): - warn_msg = "Please define the `__sklearn_tags__` method" - - #################################################################################### - # only predictor inheriting from BaseEstimator - predictor_classes = [PredictorNewTags, PredictorOldNewTags, PredictorOldTags] - for predictor_cls in predictor_classes: - if predictor_cls.__name__.endswith("OldTags"): - with pytest.warns(DeprecationWarning, match=warn_msg): - tags = get_tags(predictor_cls()) - else: - tags = get_tags(predictor_cls()) - assert tags.requires_fit - - #################################################################################### - # one mixin and one predictor all inheriting from BaseEstimator - predictor_classes = [PredictorNewTags, PredictorOldNewTags, PredictorOldTags] - allow_nan_classes = [ - MixinAllowNanNewTags, - MixinAllowNanOldNewTags, - MixinAllowNanOldTags, - ] - - for allow_nan_cls in allow_nan_classes: - for predictor_cls in predictor_classes: - - class ChildClass(allow_nan_cls, predictor_cls): - pass - - if any( - base_cls.__name__.endswith("OldTags") - for base_cls in (predictor_cls, allow_nan_cls) - ): - with pytest.warns(DeprecationWarning, match=warn_msg): - tags = get_tags(ChildClass()) - else: - tags = get_tags(ChildClass()) - - assert tags.input_tags.allow_nan - assert tags.requires_fit - - #################################################################################### - # two mixins and one predictor all inheriting from BaseEstimator - predictor_classes = [PredictorNewTags, PredictorOldNewTags, PredictorOldTags] - array_api_classes = [ - MixinArrayApiSupportNewTags, - MixinArrayApiSupportOldNewTags, - MixinArrayApiSupportOldTags, - ] - allow_nan_classes = [ - MixinAllowNanNewTags, - MixinAllowNanOldNewTags, - MixinAllowNanOldTags, - ] - - for predictor_cls in predictor_classes: - for array_api_cls in array_api_classes: - for allow_nan_cls in allow_nan_classes: - - class ChildClass(allow_nan_cls, array_api_cls, predictor_cls): - pass - - if any( - base_cls.__name__.endswith("OldTags") - for base_cls in (predictor_cls, array_api_cls, allow_nan_cls) - ): - with pytest.warns(DeprecationWarning, match=warn_msg): - tags = get_tags(ChildClass()) - else: - tags = get_tags(ChildClass()) - - assert tags.input_tags.allow_nan - assert tags.array_api_support - assert tags.requires_fit - - -@pytest.mark.filterwarnings( - "ignore:.*Please define the `__sklearn_tags__` method.*:DeprecationWarning" -) -def test_safe_tags_backward_compatibility(): - warn_msg = "The `_safe_tags` function is deprecated in 1.6" - - #################################################################################### - # only predictor inheriting from BaseEstimator - predictor_classes = [PredictorNewTags, PredictorOldNewTags, PredictorOldTags] - for predictor_cls in predictor_classes: - with pytest.warns(DeprecationWarning, match=warn_msg): - tags = _safe_tags(predictor_cls()) - assert tags["requires_fit"] - - #################################################################################### - # one mixin and one predictor all inheriting from BaseEstimator - predictor_classes = [PredictorNewTags, PredictorOldNewTags, PredictorOldTags] - allow_nan_classes = [ - MixinAllowNanNewTags, - MixinAllowNanOldNewTags, - MixinAllowNanOldTags, - ] - - for allow_nan_cls in allow_nan_classes: - for predictor_cls in predictor_classes: - - class ChildClass(allow_nan_cls, predictor_cls): - pass - - with pytest.warns(DeprecationWarning, match=warn_msg): - tags = _safe_tags(ChildClass()) - - assert tags["allow_nan"] - assert tags["requires_fit"] - - #################################################################################### - # two mixins and one predictor all inheriting from BaseEstimator - predictor_classes = [PredictorNewTags, PredictorOldNewTags, PredictorOldTags] - array_api_classes = [ - MixinArrayApiSupportNewTags, - MixinArrayApiSupportOldNewTags, - MixinArrayApiSupportOldTags, - ] - allow_nan_classes = [ - MixinAllowNanNewTags, - MixinAllowNanOldNewTags, - MixinAllowNanOldTags, - ] - - for predictor_cls in predictor_classes: - for array_api_cls in array_api_classes: - for allow_nan_cls in allow_nan_classes: - - class ChildClass(allow_nan_cls, array_api_cls, predictor_cls): - pass - - with pytest.warns(DeprecationWarning, match=warn_msg): - tags = _safe_tags(ChildClass()) - - assert tags["allow_nan"] - assert tags["array_api_support"] - assert tags["requires_fit"] - - -@pytest.mark.filterwarnings( - "ignore:.*Please define the `__sklearn_tags__` method.*:DeprecationWarning" -) -def test__get_tags_backward_compatibility(): - warn_msg = "The `_get_tags` method is deprecated in 1.6" - - #################################################################################### - # only predictor inheriting from BaseEstimator - predictor_classes = [PredictorNewTags, PredictorOldNewTags, PredictorOldTags] - for predictor_cls in predictor_classes: - with pytest.warns(DeprecationWarning, match=warn_msg): - tags = predictor_cls()._get_tags() - assert tags["requires_fit"] - - #################################################################################### - # one mixin and one predictor all inheriting from BaseEstimator - predictor_classes = [PredictorNewTags, PredictorOldNewTags, PredictorOldTags] - allow_nan_classes = [ - MixinAllowNanNewTags, - MixinAllowNanOldNewTags, - MixinAllowNanOldTags, - ] - - for allow_nan_cls in allow_nan_classes: - for predictor_cls in predictor_classes: - - class ChildClass(allow_nan_cls, predictor_cls): - pass - - with pytest.warns(DeprecationWarning, match=warn_msg): - tags = ChildClass()._get_tags() - - assert tags["allow_nan"] - assert tags["requires_fit"] - - #################################################################################### - # two mixins and one predictor all inheriting from BaseEstimator - predictor_classes = [PredictorNewTags, PredictorOldNewTags, PredictorOldTags] - array_api_classes = [ - MixinArrayApiSupportNewTags, - MixinArrayApiSupportOldNewTags, - MixinArrayApiSupportOldTags, - ] - allow_nan_classes = [ - MixinAllowNanNewTags, - MixinAllowNanOldNewTags, - MixinAllowNanOldTags, - ] - - for predictor_cls in predictor_classes: - for array_api_cls in array_api_classes: - for allow_nan_cls in allow_nan_classes: - - class ChildClass(allow_nan_cls, array_api_cls, predictor_cls): - pass - - with pytest.warns(DeprecationWarning, match=warn_msg): - tags = ChildClass()._get_tags() - - assert tags["allow_nan"] - assert tags["array_api_support"] - assert tags["requires_fit"] - - -def test_roundtrip_tags(): - estimator = PredictorNewTags() - tags = default_tags(estimator) - assert _to_new_tags(_to_old_tags(tags), estimator=estimator) == tags - - -def test_base_estimator_more_tags(): - """Test that the `_more_tags` and `_get_tags` methods are equivalent for - `BaseEstimator`. - """ - estimator = BaseEstimator() - with pytest.warns( - DeprecationWarning, match="The `_more_tags` method is deprecated" - ): - more_tags = BaseEstimator._more_tags(estimator) - - with pytest.warns(DeprecationWarning, match="The `_get_tags` method is deprecated"): - get_tags = BaseEstimator._get_tags(estimator) - - assert more_tags == get_tags - - -def test_safe_tags(): - estimator = PredictorNewTags() - with pytest.warns( - DeprecationWarning, match="The `_safe_tags` function is deprecated" - ): - tags = _safe_tags(estimator) - - with pytest.warns( - DeprecationWarning, match="The `_safe_tags` function is deprecated" - ): - tags_requires_fit = _safe_tags(estimator, key="requires_fit") - - assert tags_requires_fit == tags["requires_fit"] - - err_msg = "The key unknown_key is not defined" - with pytest.raises(ValueError, match=err_msg): - with pytest.warns( - DeprecationWarning, match="The `_safe_tags` function is deprecated" - ): - _safe_tags(estimator, key="unknown_key") - - -def test_old_tags(): - """Set to non-default values and check that we get the expected old tags.""" - - class MyClass: - _estimator_type = "regressor" - - def __sklearn_tags__(self): - input_tags = InputTags( - one_d_array=True, - two_d_array=False, - three_d_array=True, - sparse=True, - categorical=True, - string=True, - dict=True, - positive_only=True, - allow_nan=True, - pairwise=True, - ) - target_tags = TargetTags( - required=False, - one_d_labels=True, - two_d_labels=True, - positive_only=True, - multi_output=True, - single_output=False, - ) - transformer_tags = None - classifier_tags = None - regressor_tags = RegressorTags( - poor_score=True, - ) - return Tags( - estimator_type=self._estimator_type, - input_tags=input_tags, - target_tags=target_tags, - transformer_tags=transformer_tags, - classifier_tags=classifier_tags, - regressor_tags=regressor_tags, - ) - - estimator = MyClass() - new_tags = get_tags(estimator) - old_tags = _to_old_tags(new_tags) - expected_tags = { - "allow_nan": True, - "array_api_support": False, - "binary_only": False, - "multilabel": False, - "multioutput": True, - "multioutput_only": True, - "no_validation": False, - "non_deterministic": False, - "pairwise": True, - "preserves_dtype": ["float64"], - "poor_score": True, - "requires_fit": True, - "requires_positive_X": True, - "requires_y": False, - "requires_positive_y": True, - "_skip_test": False, - "stateless": True, - "X_types": [ - "1darray", - "3darray", - "sparse", - "categorical", - "string", - "dict", - "1dlabels", - "2dlabels", - ], - } - assert old_tags == expected_tags - assert _to_new_tags(_to_old_tags(new_tags), estimator=estimator) == new_tags - - class MyClass: - _estimator_type = "classifier" - - def __sklearn_tags__(self): - input_tags = InputTags( - one_d_array=True, - two_d_array=False, - three_d_array=True, - sparse=True, - categorical=True, - string=True, - dict=True, - positive_only=True, - allow_nan=True, - pairwise=True, - ) - target_tags = TargetTags( - required=False, - one_d_labels=True, - two_d_labels=False, - positive_only=True, - multi_output=True, - single_output=False, - ) - transformer_tags = None - classifier_tags = ClassifierTags( - poor_score=True, - multi_class=False, - multi_label=True, - ) - regressor_tags = None - return Tags( - estimator_type=self._estimator_type, - input_tags=input_tags, - target_tags=target_tags, - transformer_tags=transformer_tags, - classifier_tags=classifier_tags, - regressor_tags=regressor_tags, - ) - - estimator = MyClass() - new_tags = get_tags(estimator) - old_tags = _to_old_tags(new_tags) - expected_tags = { - "allow_nan": True, - "array_api_support": False, - "binary_only": True, - "multilabel": True, - "multioutput": True, - "multioutput_only": True, - "no_validation": False, - "non_deterministic": False, - "pairwise": True, - "preserves_dtype": ["float64"], - "poor_score": True, - "requires_fit": True, - "requires_positive_X": True, - "requires_y": False, - "requires_positive_y": True, - "_skip_test": False, - "stateless": True, - "X_types": [ - "1darray", - "3darray", - "sparse", - "categorical", - "string", - "dict", - "1dlabels", - ], - } - assert old_tags == expected_tags - assert _to_new_tags(_to_old_tags(new_tags), estimator=estimator) == new_tags - - class MyClass: - def fit(self, X, y=None): - return self # pragma: no cover - - def transform(self, X): - return X # pragma: no cover - - def __sklearn_tags__(self): - input_tags = InputTags( - one_d_array=True, - two_d_array=False, - three_d_array=True, - sparse=True, - categorical=True, - string=True, - dict=True, - positive_only=True, - allow_nan=True, - pairwise=True, - ) - target_tags = TargetTags( - required=False, - one_d_labels=True, - two_d_labels=False, - positive_only=True, - multi_output=True, - single_output=False, - ) - transformer_tags = TransformerTags( - preserves_dtype=["float64"], - ) - classifier_tags = None - regressor_tags = None - return Tags( - estimator_type=None, - input_tags=input_tags, - target_tags=target_tags, - transformer_tags=transformer_tags, - classifier_tags=classifier_tags, - regressor_tags=regressor_tags, - ) - - estimator = MyClass() - new_tags = get_tags(estimator) - old_tags = _to_old_tags(new_tags) - expected_tags = { - "allow_nan": True, - "array_api_support": False, - "binary_only": False, - "multilabel": False, - "multioutput": True, - "multioutput_only": True, - "no_validation": False, - "non_deterministic": False, - "pairwise": True, - "preserves_dtype": ["float64"], - "poor_score": False, - "requires_fit": True, - "requires_positive_X": True, - "requires_y": False, - "requires_positive_y": True, - "_skip_test": False, - "stateless": True, - "X_types": [ - "1darray", - "3darray", - "sparse", - "categorical", - "string", - "dict", - "1dlabels", - ], - } - assert old_tags == expected_tags - assert _to_new_tags(_to_old_tags(new_tags), estimator=estimator) == new_tags - - -# TODO(1.7): Remove this test +# TODO(1.8): Update this test to check for errors def test_tags_no_sklearn_tags_concrete_implementation(): """Non-regression test for: https://github.com/scikit-learn/scikit-learn/issues/30479 - There is no class implementing `__sklearn_tags__` without calling - `super().__sklearn_tags__()`. Thus, we raise a warning and request to inherit from + Either the estimator doesn't implement `__sklearn_tags` or there is no class + implementing `__sklearn_tags__` without calling `super().__sklearn_tags__()` in + its mro. Thus, we raise a warning and request to inherit from `BaseEstimator` that implements `__sklearn_tags__`. """ + X = np.array([[1, 2], [2, 3], [3, 4]]) + y = np.array([1, 0, 1]) + + # 1st case, the estimator inherits from a class that only implements + # `__sklearn_tags__` by calling `super().__sklearn_tags__()`. class MyEstimator(ClassifierMixin): def __init__(self, *, param=1): self.param = param @@ -662,16 +116,29 @@ def fit(self, X, y=None): def predict(self, X): return np.full(shape=X.shape[0], fill_value=self.param) - X = np.array([[1, 2], [2, 3], [3, 4]]) - y = np.array([1, 0, 1]) - my_pipeline = Pipeline([("estimator", MyEstimator(param=1))]) with pytest.warns(DeprecationWarning, match="The following error was raised"): my_pipeline.fit(X, y).predict(X) + # 2nd case, the estimator doesn't implement `__sklearn_tags__` at all. + class MyEstimator2: + def __init__(self, *, param=1): + self.param = param + + def fit(self, X, y=None): + self.is_fitted_ = True + return self + + def predict(self, X): + return np.full(shape=X.shape[0], fill_value=self.param) + + my_pipeline = Pipeline([("estimator", MyEstimator2(param=1))]) + with pytest.warns(DeprecationWarning, match="The following error was raised"): + my_pipeline.fit(X, y).predict(X) + # check that we still raise an error if it is not a AttributeError or related to # __sklearn_tags__ - class MyEstimator2(MyEstimator, BaseEstimator): + class MyEstimator3(MyEstimator, BaseEstimator): def __init__(self, *, param=1, error_type=AttributeError): self.param = param self.error_type = error_type @@ -681,6 +148,6 @@ def __sklearn_tags__(self): raise self.error_type("test") for error_type in (AttributeError, TypeError, ValueError): - estimator = MyEstimator2(param=1, error_type=error_type) + estimator = MyEstimator3(param=1, error_type=error_type) with pytest.raises(error_type): get_tags(estimator) From 5fee5ad33c2a3857422ed950b32add46243339ce Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Lo=C3=AFc=20Est=C3=A8ve?= Date: Thu, 17 Apr 2025 18:26:13 +0200 Subject: [PATCH 066/182] MNT Make ruff check line-too-long (E501) (#31214) --- examples/covariance/plot_mahalanobis_distances.py | 2 +- examples/feature_selection/plot_rfe_digits.py | 2 +- examples/feature_selection/plot_select_from_model_diabetes.py | 2 +- .../miscellaneous/plot_partial_dependence_visualization_api.py | 2 +- examples/text/plot_document_classification_20newsgroups.py | 2 +- pyproject.toml | 2 +- sklearn/datasets/tests/test_openml.py | 2 +- sklearn/utils/tests/test_pprint.py | 2 +- 8 files changed, 8 insertions(+), 8 deletions(-) diff --git a/examples/covariance/plot_mahalanobis_distances.py b/examples/covariance/plot_mahalanobis_distances.py index 99ae29ceeb106..a1507c3ef162e 100644 --- a/examples/covariance/plot_mahalanobis_distances.py +++ b/examples/covariance/plot_mahalanobis_distances.py @@ -60,7 +60,7 @@ Proceedings of the National Academy of Sciences of the United States of America, 17, 684-688. -""" +""" # noqa: E501 # Authors: The scikit-learn developers # SPDX-License-Identifier: BSD-3-Clause diff --git a/examples/feature_selection/plot_rfe_digits.py b/examples/feature_selection/plot_rfe_digits.py index 749cb52e4a72d..360a9bd92837f 100644 --- a/examples/feature_selection/plot_rfe_digits.py +++ b/examples/feature_selection/plot_rfe_digits.py @@ -16,7 +16,7 @@ See also :ref:`sphx_glr_auto_examples_feature_selection_plot_rfe_with_cross_validation.py` -""" +""" # noqa: E501 # Authors: The scikit-learn developers # SPDX-License-Identifier: BSD-3-Clause diff --git a/examples/feature_selection/plot_select_from_model_diabetes.py b/examples/feature_selection/plot_select_from_model_diabetes.py index 6c3f32d07cfb0..793a6916e8969 100644 --- a/examples/feature_selection/plot_select_from_model_diabetes.py +++ b/examples/feature_selection/plot_select_from_model_diabetes.py @@ -40,7 +40,7 @@ # were already standardized. # For a more complete example on the interpretations of the coefficients of # linear models, you may refer to -# :ref:`sphx_glr_auto_examples_inspection_plot_linear_model_coefficient_interpretation.py`. +# :ref:`sphx_glr_auto_examples_inspection_plot_linear_model_coefficient_interpretation.py`. # noqa: E501 import matplotlib.pyplot as plt import numpy as np diff --git a/examples/miscellaneous/plot_partial_dependence_visualization_api.py b/examples/miscellaneous/plot_partial_dependence_visualization_api.py index f941505733579..8c98b40816496 100644 --- a/examples/miscellaneous/plot_partial_dependence_visualization_api.py +++ b/examples/miscellaneous/plot_partial_dependence_visualization_api.py @@ -11,7 +11,7 @@ See also :ref:`sphx_glr_auto_examples_miscellaneous_plot_roc_curve_visualization_api.py` -""" +""" # noqa: E501 # Authors: The scikit-learn developers # SPDX-License-Identifier: BSD-3-Clause diff --git a/examples/text/plot_document_classification_20newsgroups.py b/examples/text/plot_document_classification_20newsgroups.py index ce11377e7531f..aa80b7c1b630b 100644 --- a/examples/text/plot_document_classification_20newsgroups.py +++ b/examples/text/plot_document_classification_20newsgroups.py @@ -356,7 +356,7 @@ def benchmark(clf, custom_name=False): # Notice that the most important hyperparameters values were tuned using a grid # search procedure not shown in this notebook for the sake of simplicity. See # the example script -# :ref:`sphx_glr_auto_examples_model_selection_plot_grid_search_text_feature_extraction.py` +# :ref:`sphx_glr_auto_examples_model_selection_plot_grid_search_text_feature_extraction.py` # noqa: E501 # for a demo on how such tuning can be done. from sklearn.ensemble import RandomForestClassifier diff --git a/pyproject.toml b/pyproject.toml index 1d5459ca0bd76..4178a9212e2a4 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -137,7 +137,7 @@ preview = true # This enables us to use the explicit preview rules that we want only explicit-preview-rules = true # all rules can be found here: https://docs.astral.sh/ruff/rules/ -extend-select = ["W", "I", "CPY001", "RUF"] +extend-select = ["E501", "W", "I", "CPY001", "RUF"] ignore=[ # do not assign a lambda expression, use a def "E731", diff --git a/sklearn/datasets/tests/test_openml.py b/sklearn/datasets/tests/test_openml.py index d2b170e62c99a..40e086ec6f6d3 100644 --- a/sklearn/datasets/tests/test_openml.py +++ b/sklearn/datasets/tests/test_openml.py @@ -141,7 +141,7 @@ def _mock_urlopen_download_data(url, has_gzip_header): # For simplicity the mock filenames don't contain the filename, i.e. # the last part of the data description url after the last /. # For example for id_1, data description download url is: - # gunzip -c sklearn/datasets/tests/data/openml/id_1/api-v1-jd-1.json.gz | grep '"url" + # gunzip -c sklearn/datasets/tests/data/openml/id_1/api-v1-jd-1.json.gz | grep '"url" # noqa: E501 # "https:\/\/www.openml.org\/data\/v1\/download\/1\/anneal.arff" # but the mock filename does not contain anneal.arff and is: # sklearn/datasets/tests/data/openml/id_1/data-v1-dl-1.arff.gz. diff --git a/sklearn/utils/tests/test_pprint.py b/sklearn/utils/tests/test_pprint.py index e8026ae36d54c..ee3e267dd5cbe 100644 --- a/sklearn/utils/tests/test_pprint.py +++ b/sklearn/utils/tests/test_pprint.py @@ -444,7 +444,7 @@ def test_gridsearch_pipeline(print_changed_only_false): score_func=)], 'reduce_dim__k': [2, 4, 8]}], pre_dispatch='2*n_jobs', refit=True, return_train_score=False, - scoring=None, verbose=0)""" + scoring=None, verbose=0)""" # noqa: E501 expected = expected[1:] # remove first \n repr_ = pp.pformat(gspipline) From ceac4a89fdee613657582b1745ed633a717b3045 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Dea=20Mar=C3=ADa=20L=C3=A9on?= Date: Thu, 17 Apr 2025 20:50:25 +0200 Subject: [PATCH 067/182] TST use global_random_seed in `sklearn/decomposition/tests/test_sparse_pca.py` (#31213) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Co-authored-by: Jérémie du Boisberranger --- .../decomposition/tests/test_sparse_pca.py | 138 ++++++++---------- 1 file changed, 63 insertions(+), 75 deletions(-) diff --git a/sklearn/decomposition/tests/test_sparse_pca.py b/sklearn/decomposition/tests/test_sparse_pca.py index 4edf7df86a3e2..f8c71a5d0e752 100644 --- a/sklearn/decomposition/tests/test_sparse_pca.py +++ b/sklearn/decomposition/tests/test_sparse_pca.py @@ -1,12 +1,12 @@ # Authors: The scikit-learn developers # SPDX-License-Identifier: BSD-3-Clause -import sys import numpy as np import pytest from numpy.testing import assert_array_equal +from sklearn.datasets import make_low_rank_matrix from sklearn.decomposition import PCA, MiniBatchSparsePCA, SparsePCA from sklearn.utils import check_random_state from sklearn.utils._testing import ( @@ -57,48 +57,58 @@ def test_correct_shapes(): assert U.shape == (12, 13) -def test_fit_transform(): +def test_fit_transform(global_random_seed): alpha = 1 - rng = np.random.RandomState(0) + rng = np.random.RandomState(global_random_seed) Y, _, _ = generate_toy_data(3, 10, (8, 8), random_state=rng) # wide array - spca_lars = SparsePCA(n_components=3, method="lars", alpha=alpha, random_state=0) + spca_lars = SparsePCA( + n_components=3, method="lars", alpha=alpha, random_state=global_random_seed + ) spca_lars.fit(Y) # Test that CD gives similar results - spca_lasso = SparsePCA(n_components=3, method="cd", random_state=0, alpha=alpha) + spca_lasso = SparsePCA( + n_components=3, method="cd", random_state=global_random_seed, alpha=alpha + ) spca_lasso.fit(Y) assert_array_almost_equal(spca_lasso.components_, spca_lars.components_) @if_safe_multiprocessing_with_blas -def test_fit_transform_parallel(): +def test_fit_transform_parallel(global_random_seed): alpha = 1 - rng = np.random.RandomState(0) + rng = np.random.RandomState(global_random_seed) Y, _, _ = generate_toy_data(3, 10, (8, 8), random_state=rng) # wide array - spca_lars = SparsePCA(n_components=3, method="lars", alpha=alpha, random_state=0) + spca_lars = SparsePCA( + n_components=3, method="lars", alpha=alpha, random_state=global_random_seed + ) spca_lars.fit(Y) U1 = spca_lars.transform(Y) # Test multiple CPUs spca = SparsePCA( - n_components=3, n_jobs=2, method="lars", alpha=alpha, random_state=0 + n_components=3, + n_jobs=2, + method="lars", + alpha=alpha, + random_state=global_random_seed, ).fit(Y) U2 = spca.transform(Y) assert not np.all(spca_lars.components_ == 0) assert_array_almost_equal(U1, U2) -def test_transform_nan(): +def test_transform_nan(global_random_seed): # Test that SparsePCA won't return NaN when there is 0 feature in all # samples. - rng = np.random.RandomState(0) + rng = np.random.RandomState(global_random_seed) Y, _, _ = generate_toy_data(3, 10, (8, 8), random_state=rng) # wide array Y[:, 0] = 0 - estimator = SparsePCA(n_components=8) + estimator = SparsePCA(n_components=8, random_state=global_random_seed) assert not np.any(np.isnan(estimator.fit_transform(Y))) -def test_fit_transform_tall(): - rng = np.random.RandomState(0) +def test_fit_transform_tall(global_random_seed): + rng = np.random.RandomState(global_random_seed) Y, _, _ = generate_toy_data(3, 65, (8, 8), random_state=rng) # tall array spca_lars = SparsePCA(n_components=3, method="lars", random_state=rng) U1 = spca_lars.fit_transform(Y) @@ -107,8 +117,8 @@ def test_fit_transform_tall(): assert_array_almost_equal(U1, U2) -def test_initialization(): - rng = np.random.RandomState(0) +def test_initialization(global_random_seed): + rng = np.random.RandomState(global_random_seed) U_init = rng.randn(5, 3) V_init = rng.randn(3, 4) model = SparsePCA( @@ -135,42 +145,9 @@ def test_mini_batch_correct_shapes(): assert U.shape == (12, 13) -# XXX: test always skipped -@pytest.mark.skipif(True, reason="skipping mini_batch_fit_transform.") -def test_mini_batch_fit_transform(): - alpha = 1 - rng = np.random.RandomState(0) - Y, _, _ = generate_toy_data(3, 10, (8, 8), random_state=rng) # wide array - spca_lars = MiniBatchSparsePCA(n_components=3, random_state=0, alpha=alpha).fit(Y) - U1 = spca_lars.transform(Y) - # Test multiple CPUs - if sys.platform == "win32": # fake parallelism for win32 - import joblib - - _mp = joblib.parallel.multiprocessing - joblib.parallel.multiprocessing = None - try: - spca = MiniBatchSparsePCA( - n_components=3, n_jobs=2, alpha=alpha, random_state=0 - ) - U2 = spca.fit(Y).transform(Y) - finally: - joblib.parallel.multiprocessing = _mp - else: # we can efficiently use parallelism - spca = MiniBatchSparsePCA(n_components=3, n_jobs=2, alpha=alpha, random_state=0) - U2 = spca.fit(Y).transform(Y) - assert not np.all(spca_lars.components_ == 0) - assert_array_almost_equal(U1, U2) - # Test that CD gives similar results - spca_lasso = MiniBatchSparsePCA( - n_components=3, method="cd", alpha=alpha, random_state=0 - ).fit(Y) - assert_array_almost_equal(spca_lasso.components_, spca_lars.components_) - - -def test_scaling_fit_transform(): +def test_scaling_fit_transform(global_random_seed): alpha = 1 - rng = np.random.RandomState(0) + rng = np.random.RandomState(global_random_seed) Y, _, _ = generate_toy_data(3, 1000, (8, 8), random_state=rng) spca_lars = SparsePCA(n_components=3, method="lars", alpha=alpha, random_state=rng) results_train = spca_lars.fit_transform(Y) @@ -178,22 +155,22 @@ def test_scaling_fit_transform(): assert_allclose(results_train[0], results_test[0]) -def test_pca_vs_spca(): - rng = np.random.RandomState(0) +def test_pca_vs_spca(global_random_seed): + rng = np.random.RandomState(global_random_seed) Y, _, _ = generate_toy_data(3, 1000, (8, 8), random_state=rng) Z, _, _ = generate_toy_data(3, 10, (8, 8), random_state=rng) - spca = SparsePCA(alpha=0, ridge_alpha=0, n_components=2) - pca = PCA(n_components=2) + spca = SparsePCA(alpha=0, ridge_alpha=0, n_components=2, random_state=rng) + pca = PCA(n_components=2, random_state=rng) pca.fit(Y) spca.fit(Y) results_test_pca = pca.transform(Z) results_test_spca = spca.transform(Z) assert_allclose( - np.abs(spca.components_.dot(pca.components_.T)), np.eye(2), atol=1e-5 + np.abs(spca.components_.dot(pca.components_.T)), np.eye(2), atol=1e-4 ) results_test_pca *= np.sign(results_test_pca[0, :]) results_test_spca *= np.sign(results_test_spca[0, :]) - assert_allclose(results_test_pca, results_test_spca) + assert_allclose(results_test_pca, results_test_spca, atol=1e-4) @pytest.mark.parametrize("SPCA", [SparsePCA, MiniBatchSparsePCA]) @@ -236,26 +213,31 @@ def test_sparse_pca_dtype_match(SPCA, method, data_type, expected_type): @pytest.mark.parametrize("SPCA", (SparsePCA, MiniBatchSparsePCA)) @pytest.mark.parametrize("method", ("lars", "cd")) -def test_sparse_pca_numerical_consistency(SPCA, method): +def test_sparse_pca_numerical_consistency(SPCA, method, global_random_seed): # Verify numericall consistentency among np.float32 and np.float64 - rtol = 1e-3 - alpha = 2 - n_samples, n_features, n_components = 12, 10, 3 - rng = np.random.RandomState(0) - input_array = rng.randn(n_samples, n_features) + n_samples, n_features, n_components = 20, 20, 5 + input_array = make_low_rank_matrix( + n_samples=n_samples, + n_features=n_features, + effective_rank=n_components, + random_state=global_random_seed, + ) model_32 = SPCA( - n_components=n_components, alpha=alpha, method=method, random_state=0 + n_components=n_components, + method=method, + random_state=global_random_seed, ) transformed_32 = model_32.fit_transform(input_array.astype(np.float32)) model_64 = SPCA( - n_components=n_components, alpha=alpha, method=method, random_state=0 + n_components=n_components, + method=method, + random_state=global_random_seed, ) transformed_64 = model_64.fit_transform(input_array.astype(np.float64)) - - assert_allclose(transformed_64, transformed_32, rtol=rtol) - assert_allclose(model_64.components_, model_32.components_, rtol=rtol) + assert_allclose(transformed_64, transformed_32) + assert_allclose(model_64.components_, model_32.components_) @pytest.mark.parametrize("SPCA", [SparsePCA, MiniBatchSparsePCA]) @@ -324,17 +306,20 @@ def test_equivalence_components_pca_spca(global_random_seed): assert_allclose(pca.components_, spca.components_) -def test_sparse_pca_inverse_transform(): +def test_sparse_pca_inverse_transform(global_random_seed): """Check that `inverse_transform` in `SparsePCA` and `PCA` are similar.""" - rng = np.random.RandomState(0) + rng = np.random.RandomState(global_random_seed) n_samples, n_features = 10, 5 X = rng.randn(n_samples, n_features) n_components = 2 spca = SparsePCA( - n_components=n_components, alpha=1e-12, ridge_alpha=1e-12, random_state=0 + n_components=n_components, + alpha=1e-12, + ridge_alpha=1e-12, + random_state=global_random_seed, ) - pca = PCA(n_components=n_components, random_state=0) + pca = PCA(n_components=n_components, random_state=global_random_seed) X_trans_spca = spca.fit_transform(X) X_trans_pca = pca.fit_transform(X) assert_allclose( @@ -343,17 +328,20 @@ def test_sparse_pca_inverse_transform(): @pytest.mark.parametrize("SPCA", [SparsePCA, MiniBatchSparsePCA]) -def test_transform_inverse_transform_round_trip(SPCA): +def test_transform_inverse_transform_round_trip(SPCA, global_random_seed): """Check the `transform` and `inverse_transform` round trip with no loss of information. """ - rng = np.random.RandomState(0) + rng = np.random.RandomState(global_random_seed) n_samples, n_features = 10, 5 X = rng.randn(n_samples, n_features) n_components = n_features spca = SPCA( - n_components=n_components, alpha=1e-12, ridge_alpha=1e-12, random_state=0 + n_components=n_components, + alpha=1e-12, + ridge_alpha=1e-12, + random_state=global_random_seed, ) X_trans_spca = spca.fit_transform(X) assert_allclose(spca.inverse_transform(X_trans_spca), X) From 86d099ec1b5c157adf841b9c51560e3c65546f11 Mon Sep 17 00:00:00 2001 From: Christian Veenhuis <124370897+ChVeen@users.noreply.github.com> Date: Fri, 18 Apr 2025 00:27:51 +0200 Subject: [PATCH 068/182] MNT remove unused local var in `sklearn.utils.estimator_checks.py` (#31221) --- sklearn/utils/estimator_checks.py | 1 - sklearn/utils/tests/test_estimator_checks.py | 4 ++-- 2 files changed, 2 insertions(+), 3 deletions(-) diff --git a/sklearn/utils/estimator_checks.py b/sklearn/utils/estimator_checks.py index 6c3d16d98d7fb..d1c8d5d3fb610 100644 --- a/sklearn/utils/estimator_checks.py +++ b/sklearn/utils/estimator_checks.py @@ -889,7 +889,6 @@ def callback( # as xfail. check_result["status"] = "xfail" else: - failed = True check_result["status"] = "failed" if on_fail == "warn": diff --git a/sklearn/utils/tests/test_estimator_checks.py b/sklearn/utils/tests/test_estimator_checks.py index 4e573c8d1793f..c010a007d7525 100644 --- a/sklearn/utils/tests/test_estimator_checks.py +++ b/sklearn/utils/tests/test_estimator_checks.py @@ -1373,8 +1373,8 @@ def callback( expected_failed_checks = _get_expected_failed_checks(est) # This is to make sure we test a class that has some expected failures assert len(expected_failed_checks) > 0 - with warnings.catch_warnings(record=True) as records: - logs = check_estimator( + with warnings.catch_warnings(record=True): + check_estimator( est, expected_failed_checks=expected_failed_checks, on_fail=None, From 2f078bf4f8b2683b4dfbb50544e1727582951b2d Mon Sep 17 00:00:00 2001 From: Stefanie Senger <91849487+StefanieSenger@users.noreply.github.com> Date: Fri, 18 Apr 2025 15:28:00 +0200 Subject: [PATCH 069/182] MNT Improve exception handling for invalid labels in cohen_kappa_score (#31175) Co-authored-by: Olivier Grisel Co-authored-by: Christian Lorentzen Co-authored-by: Lucy Liu --- sklearn/metrics/_classification.py | 17 +++++++++++++++-- sklearn/metrics/tests/test_classification.py | 11 +++++++++++ 2 files changed, 26 insertions(+), 2 deletions(-) diff --git a/sklearn/metrics/_classification.py b/sklearn/metrics/_classification.py index 6ac1adec0d44f..13f2f5dc89208 100644 --- a/sklearn/metrics/_classification.py +++ b/sklearn/metrics/_classification.py @@ -832,7 +832,9 @@ class labels [2]_. labels : array-like of shape (n_classes,), default=None List of labels to index the matrix. This may be used to select a subset of labels. If `None`, all labels that appear at least once in - ``y1`` or ``y2`` are used. + ``y1`` or ``y2`` are used. Note that at least one label in `labels` must be + present in `y1`, even though this function is otherwise agnostic to the order + of `y1` and `y2`. weights : {'linear', 'quadratic'}, default=None Weighting type to calculate the score. `None` means not weighted; @@ -866,7 +868,18 @@ class labels [2]_. >>> cohen_kappa_score(y1, y2) 0.6875 """ - confusion = confusion_matrix(y1, y2, labels=labels, sample_weight=sample_weight) + try: + confusion = confusion_matrix(y1, y2, labels=labels, sample_weight=sample_weight) + except ValueError as e: + if "At least one label specified must be in y_true" in str(e): + msg = ( + "At least one label in `labels` must be present in `y1` (even though " + "`cohen_kappa_score` is otherwise agnostic to the order of `y1` and " + "`y2`)." + ) + raise ValueError(msg) from e + raise + n_classes = confusion.shape[0] sum0 = np.sum(confusion, axis=0) sum1 = np.sum(confusion, axis=1) diff --git a/sklearn/metrics/tests/test_classification.py b/sklearn/metrics/tests/test_classification.py index 86be624b91344..19a326ff184f8 100644 --- a/sklearn/metrics/tests/test_classification.py +++ b/sklearn/metrics/tests/test_classification.py @@ -926,6 +926,17 @@ def test_cohen_kappa(): ) +def test_cohen_kappa_score_error_wrong_label(): + """Test that correct error is raised when users pass labels that are not in y1.""" + labels = [1, 2] + y1 = np.array(["a"] * 5 + ["b"] * 5) + y2 = np.array(["b"] * 10) + with pytest.raises( + ValueError, match="At least one label in `labels` must be present in `y1`" + ): + cohen_kappa_score(y1, y2, labels=labels) + + @pytest.mark.parametrize("zero_division", [0, 1, np.nan]) @pytest.mark.parametrize("y_true, y_pred", [([0], [0])]) @pytest.mark.parametrize( From 4af26a797d22f70f7507d6c5011d9bd086dfef0c Mon Sep 17 00:00:00 2001 From: Arturo Amor <86408019+ArturoAmorQ@users.noreply.github.com> Date: Fri, 18 Apr 2025 22:12:58 +0200 Subject: [PATCH 070/182] DOC Add missing directives to det_curve-related docstrings (#31225) Co-authored-by: ArturoAmorQ --- sklearn/metrics/_plot/det_curve.py | 4 ++++ sklearn/metrics/_ranking.py | 7 +++++-- 2 files changed, 9 insertions(+), 2 deletions(-) diff --git a/sklearn/metrics/_plot/det_curve.py b/sklearn/metrics/_plot/det_curve.py index 9f7937e6106af..f15fe0ae9e889 100644 --- a/sklearn/metrics/_plot/det_curve.py +++ b/sklearn/metrics/_plot/det_curve.py @@ -120,6 +120,8 @@ def from_estimator( from the previous or subsequent threshold. All points with the same tp value have the same `fnr` and thus same y coordinate. + .. versionadded:: 1.7 + response_method : {'predict_proba', 'decision_function', 'auto'} \ default='auto' Specifies whether to use :term:`predict_proba` or @@ -227,6 +229,8 @@ def from_predictions( from the previous or subsequent threshold. All points with the same tp value have the same `fnr` and thus same y coordinate. + .. versionadded:: 1.7 + pos_label : int, float, bool or str, default=None The label of the positive class. When `pos_label=None`, if `y_true` is in {-1, 1} or {0, 1}, `pos_label` is set to 1, otherwise an diff --git a/sklearn/metrics/_ranking.py b/sklearn/metrics/_ranking.py index 4fd253fb70997..1f22f687c6a66 100644 --- a/sklearn/metrics/_ranking.py +++ b/sklearn/metrics/_ranking.py @@ -334,8 +334,11 @@ def det_curve( thresholds : ndarray of shape (n_thresholds,) Decreasing thresholds on the decision function (either `predict_proba` - or `decision_function`) used to compute FPR and FNR. An arbitrary - threshold at infinity is added for the case `fpr=0` and `fnr=1`. + or `decision_function`) used to compute FPR and FNR. + + .. versionchanged:: 1.7 + An arbitrary threshold at infinity is added for the case `fpr=0` + and `fnr=1`. See Also -------- From 9a6e90a945f319495941869c3ba94ff71a3c010a Mon Sep 17 00:00:00 2001 From: Marc Bresson <50196352+MarcBresson@users.noreply.github.com> Date: Sat, 19 Apr 2025 01:39:55 +0200 Subject: [PATCH 071/182] ENH: improve validation for SGD models to accept l1_ratio=None when penalty is not `elasticnet` (#30730) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Co-authored-by: Jérémie du Boisberranger Co-authored-by: Omar Salman --- .../30730.enhancement.rst | 3 ++ sklearn/linear_model/_stochastic_gradient.py | 29 +++++++++++++++---- sklearn/linear_model/tests/test_sgd.py | 21 ++++++++++++++ 3 files changed, 47 insertions(+), 6 deletions(-) create mode 100644 doc/whats_new/upcoming_changes/sklearn.linear_model/30730.enhancement.rst diff --git a/doc/whats_new/upcoming_changes/sklearn.linear_model/30730.enhancement.rst b/doc/whats_new/upcoming_changes/sklearn.linear_model/30730.enhancement.rst new file mode 100644 index 0000000000000..91638cbcd9c7a --- /dev/null +++ b/doc/whats_new/upcoming_changes/sklearn.linear_model/30730.enhancement.rst @@ -0,0 +1,3 @@ +- :class:`linear_model.SGDClassifier` and :class:`linear_model.SGDRegressor` now accept + `l1_ratio=None` when `penalty` is not `"elasticnet"`. + By :user:`Marc Bresson `. diff --git a/sklearn/linear_model/_stochastic_gradient.py b/sklearn/linear_model/_stochastic_gradient.py index 89463f65ede98..8f7c814000614 100644 --- a/sklearn/linear_model/_stochastic_gradient.py +++ b/sklearn/linear_model/_stochastic_gradient.py @@ -154,11 +154,20 @@ def _more_validate_params(self, for_partial_fit=False): "learning_rate is 'optimal'. alpha is used " "to compute the optimal learning rate." ) + if self.penalty == "elasticnet" and self.l1_ratio is None: + raise ValueError("l1_ratio must be set when penalty is 'elasticnet'") # raises ValueError if not registered self._get_penalty_type(self.penalty) self._get_learning_rate_type(self.learning_rate) + def _get_l1_ratio(self): + if self.l1_ratio is None: + # plain_sgd expects a float. Any value is fine since at this point + # penalty can't be "elsaticnet" so l1_ratio is not used. + return 0.0 + return self.l1_ratio + def _get_loss_function(self, loss): """Get concrete ``LossFunction`` object for str ``loss``.""" loss_ = self.loss_functions[loss] @@ -462,7 +471,7 @@ def fit_binary( penalty_type, alpha, C, - est.l1_ratio, + est._get_l1_ratio(), dataset, validation_mask, est.early_stopping, @@ -993,7 +1002,11 @@ class SGDClassifier(BaseSGDClassifier): The Elastic Net mixing parameter, with 0 <= l1_ratio <= 1. l1_ratio=0 corresponds to L2 penalty, l1_ratio=1 to L1. Only used if `penalty` is 'elasticnet'. - Values must be in the range `[0.0, 1.0]`. + Values must be in the range `[0.0, 1.0]` or can be `None` if + `penalty` is not `elasticnet`. + + .. versionchanged:: 1.7 + `l1_ratio` can be `None` when `penalty` is not "elasticnet". fit_intercept : bool, default=True Whether the intercept should be estimated or not. If False, the @@ -1194,7 +1207,7 @@ class SGDClassifier(BaseSGDClassifier): **BaseSGDClassifier._parameter_constraints, "penalty": [StrOptions({"l2", "l1", "elasticnet"}), None], "alpha": [Interval(Real, 0, None, closed="left")], - "l1_ratio": [Interval(Real, 0, 1, closed="both")], + "l1_ratio": [Interval(Real, 0, 1, closed="both"), None], "power_t": [Interval(Real, None, None, closed="neither")], "epsilon": [Interval(Real, 0, None, closed="left")], "learning_rate": [ @@ -1695,7 +1708,7 @@ def _fit_regressor( penalty_type, alpha, C, - self.l1_ratio, + self._get_l1_ratio(), dataset, validation_mask, self.early_stopping, @@ -1796,7 +1809,11 @@ class SGDRegressor(BaseSGDRegressor): The Elastic Net mixing parameter, with 0 <= l1_ratio <= 1. l1_ratio=0 corresponds to L2 penalty, l1_ratio=1 to L1. Only used if `penalty` is 'elasticnet'. - Values must be in the range `[0.0, 1.0]`. + Values must be in the range `[0.0, 1.0]` or can be `None` if + `penalty` is not `elasticnet`. + + .. versionchanged:: 1.7 + `l1_ratio` can be `None` when `penalty` is not "elasticnet". fit_intercept : bool, default=True Whether the intercept should be estimated or not. If False, the @@ -1976,7 +1993,7 @@ class SGDRegressor(BaseSGDRegressor): **BaseSGDRegressor._parameter_constraints, "penalty": [StrOptions({"l2", "l1", "elasticnet"}), None], "alpha": [Interval(Real, 0, None, closed="left")], - "l1_ratio": [Interval(Real, 0, 1, closed="both")], + "l1_ratio": [Interval(Real, 0, 1, closed="both"), None], "power_t": [Interval(Real, None, None, closed="neither")], "learning_rate": [ StrOptions({"constant", "optimal", "invscaling", "adaptive"}), diff --git a/sklearn/linear_model/tests/test_sgd.py b/sklearn/linear_model/tests/test_sgd.py index 6252237ebf514..26d138ae3649b 100644 --- a/sklearn/linear_model/tests/test_sgd.py +++ b/sklearn/linear_model/tests/test_sgd.py @@ -486,6 +486,27 @@ def test_not_enough_sample_for_early_stopping(klass): clf.fit(X3, Y3) +@pytest.mark.parametrize("Estimator", [SGDClassifier, SGDRegressor]) +@pytest.mark.parametrize("l1_ratio", [0, 0.7, 1]) +def test_sgd_l1_ratio_not_used(Estimator, l1_ratio): + """Check that l1_ratio is not used when penalty is not 'elasticnet'""" + clf1 = Estimator(penalty="l1", l1_ratio=None, random_state=0).fit(X, Y) + clf2 = Estimator(penalty="l1", l1_ratio=l1_ratio, random_state=0).fit(X, Y) + + assert_allclose(clf1.coef_, clf2.coef_) + + +@pytest.mark.parametrize( + "Estimator", [SGDClassifier, SparseSGDClassifier, SGDRegressor, SparseSGDRegressor] +) +def test_sgd_failing_penalty_validation(Estimator): + clf = Estimator(penalty="elasticnet", l1_ratio=None) + with pytest.raises( + ValueError, match="l1_ratio must be set when penalty is 'elasticnet'" + ): + clf.fit(X, Y) + + ############################################################################### # Classification Test Case From e020a819516508e80c799966ddf2bdf5662230a8 Mon Sep 17 00:00:00 2001 From: scikit-learn-bot Date: Mon, 21 Apr 2025 14:59:23 +0200 Subject: [PATCH 072/182] :lock: :robot: CI Update lock files for free-threaded CI build(s) :lock: :robot: (#31231) Co-authored-by: Lock file bot --- .../azure/pylatest_free_threaded_linux-64_conda.lock | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/build_tools/azure/pylatest_free_threaded_linux-64_conda.lock b/build_tools/azure/pylatest_free_threaded_linux-64_conda.lock index 8b54191a48903..cc5513991717c 100644 --- a/build_tools/azure/pylatest_free_threaded_linux-64_conda.lock +++ b/build_tools/azure/pylatest_free_threaded_linux-64_conda.lock @@ -31,18 +31,18 @@ https://conda.anaconda.org/conda-forge/linux-64/zstd-1.5.7-hb8e6e7a_2.conda#6432 https://conda.anaconda.org/conda-forge/linux-64/libgfortran-ng-14.2.0-h69a702a_2.conda#4056c857af1a99ee50589a941059ec55 https://conda.anaconda.org/conda-forge/linux-64/libopenblas-0.3.29-pthreads_h94d23a6_0.conda#0a4d0252248ef9a0f88f2ba8b8a08e12 https://conda.anaconda.org/conda-forge/linux-64/ninja-1.12.1-h297d8ca_0.conda#3aa1c7e292afeff25a0091ddd7c69b72 -https://conda.anaconda.org/conda-forge/linux-64/python-3.13.3-h4724d56_0_cp313t.conda#014d41d8e12e2bfe51dfed268ad56415 +https://conda.anaconda.org/conda-forge/linux-64/python-3.13.3-h4724d56_1_cp313t.conda#8193603fe48ace3d8801cfb246f44491 https://conda.anaconda.org/conda-forge/noarch/colorama-0.4.6-pyhd8ed1ab_1.conda#962b9857ee8e7018c22f2776ffa0b2d7 -https://conda.anaconda.org/conda-forge/noarch/cpython-3.13.3-py313hd8ed1ab_0.conda#583ad91b845b5ec8916c57d386f55eb1 +https://conda.anaconda.org/conda-forge/noarch/cpython-3.13.3-py313hd8ed1ab_1.conda#6ba9ba47b91b7758cb963d0f0eaf3422 https://conda.anaconda.org/conda-forge/noarch/exceptiongroup-1.2.2-pyhd8ed1ab_1.conda#a16662747cdeb9abbac74d0057cc976e https://conda.anaconda.org/conda-forge/noarch/execnet-2.1.1-pyhd8ed1ab_1.conda#a71efeae2c160f6789900ba2631a2c90 https://conda.anaconda.org/conda-forge/noarch/iniconfig-2.0.0-pyhd8ed1ab_1.conda#6837f3eff7dcea42ecd714ce1ac2b108 https://conda.anaconda.org/conda-forge/linux-64/libblas-3.9.0-31_h59b9bed_openblas.conda#728dbebd0f7a20337218beacffd37916 https://conda.anaconda.org/conda-forge/linux-64/libhiredis-1.0.2-h2cc385e_0.tar.bz2#b34907d3a81a3cd8095ee83d174c074a -https://conda.anaconda.org/conda-forge/noarch/packaging-24.2-pyhd8ed1ab_2.conda#3bfed7e6228ebf2f7b9eaa47f1b4e2aa +https://conda.anaconda.org/conda-forge/noarch/packaging-25.0-pyhd8ed1ab_0.conda#4088c0d078e2f5092ddf824495186229 https://conda.anaconda.org/conda-forge/noarch/pip-25.0.1-pyh145f28c_0.conda#9ba21d75dc722c29827988a575a65707 https://conda.anaconda.org/conda-forge/noarch/pluggy-1.5.0-pyhd8ed1ab_1.conda#e9dcbce5f45f9ee500e728ae58b605b6 -https://conda.anaconda.org/conda-forge/noarch/setuptools-78.1.0-pyhff2d567_0.conda#a42da9837e46c53494df0044c3eb1f53 +https://conda.anaconda.org/conda-forge/noarch/setuptools-78.1.1-pyhff2d567_0.conda#72437384f9364b6baf20b6dd68d282c2 https://conda.anaconda.org/conda-forge/noarch/threadpoolctl-3.6.0-pyhecae5ae_0.conda#9d64911b31d57ca443e9f1e36b04385f https://conda.anaconda.org/conda-forge/noarch/tomli-2.2.1-pyhd8ed1ab_1.conda#ac944244f1fed2eb49bae07193ae8215 https://conda.anaconda.org/conda-forge/linux-64/ccache-4.11.2-hd714d17_0.conda#35ae7ce74089ab05fdb1cb9746c0fbe4 @@ -52,7 +52,7 @@ https://conda.anaconda.org/conda-forge/linux-64/liblapack-3.9.0-31_h7ac8fdf_open https://conda.anaconda.org/conda-forge/noarch/meson-1.7.1-pyhd8ed1ab_0.conda#90018ee73b8741268027421ceac2809a https://conda.anaconda.org/conda-forge/noarch/pyproject-metadata-0.9.1-pyhd8ed1ab_0.conda#22ae7c6ea81e0c8661ef32168dda929b https://conda.anaconda.org/conda-forge/noarch/pytest-8.3.5-pyhd8ed1ab_0.conda#c3c9316209dec74a705a36797970c6be -https://conda.anaconda.org/conda-forge/noarch/python-freethreading-3.13.3-h92d6c8b_0.conda#7ac86a40ad1d4605171b44b37b221d6f +https://conda.anaconda.org/conda-forge/noarch/python-freethreading-3.13.3-h92d6c8b_1.conda#4fa25290aec662a01642ba4b3c0ff5c1 https://conda.anaconda.org/conda-forge/noarch/meson-python-0.17.1-pyh70fd9c4_1.conda#7a02679229c6c2092571b4c025055440 -https://conda.anaconda.org/conda-forge/linux-64/numpy-2.2.4-py313h103f029_0.conda#cb377445eaf9e539629c8249bbf324f4 +https://conda.anaconda.org/conda-forge/linux-64/numpy-2.2.5-py313h103f029_0.conda#7dcbd568d6f8a4ffba5ace28915f1230 https://conda.anaconda.org/conda-forge/noarch/pytest-xdist-3.6.1-pyhd8ed1ab_1.conda#59aad4fb37cabc0bacc73cf344612ddd From 6ca502945479e50e16b68deceb96ad88991ed56b Mon Sep 17 00:00:00 2001 From: scikit-learn-bot Date: Mon, 21 Apr 2025 14:59:44 +0200 Subject: [PATCH 073/182] :lock: :robot: CI Update lock files for scipy-dev CI build(s) :lock: :robot: (#31232) Co-authored-by: Lock file bot --- build_tools/azure/pylatest_pip_scipy_dev_linux-64_conda.lock | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/build_tools/azure/pylatest_pip_scipy_dev_linux-64_conda.lock b/build_tools/azure/pylatest_pip_scipy_dev_linux-64_conda.lock index 588febeb58cd2..398ccd2132b71 100644 --- a/build_tools/azure/pylatest_pip_scipy_dev_linux-64_conda.lock +++ b/build_tools/azure/pylatest_pip_scipy_dev_linux-64_conda.lock @@ -12,7 +12,7 @@ https://repo.anaconda.com/pkgs/main/linux-64/libstdcxx-ng-11.2.0-h1234567_1.cond https://repo.anaconda.com/pkgs/main/linux-64/_openmp_mutex-5.1-1_gnu.conda#71d281e9c2192cb3fa425655a8defb85 https://repo.anaconda.com/pkgs/main/linux-64/libgcc-ng-11.2.0-h1234567_1.conda#a87728dabf3151fb9cfa990bd2eb0464 https://repo.anaconda.com/pkgs/main/linux-64/bzip2-1.0.8-h5eee18b_6.conda#f21a3ff51c1b271977f53ce956a69297 -https://repo.anaconda.com/pkgs/main/linux-64/expat-2.6.4-h6a678d5_0.conda#3ec804f5b85a66e64b262cc2341dd004 +https://repo.anaconda.com/pkgs/main/linux-64/expat-2.7.1-h6a678d5_0.conda#269942a9f3f943e2e5d8a2516a861f7c https://repo.anaconda.com/pkgs/main/linux-64/libffi-3.4.4-h6a678d5_1.conda#70646cc713f0c43926cfdcfe9b695fe0 https://repo.anaconda.com/pkgs/main/linux-64/libmpdec-4.0.0-h5eee18b_0.conda#feb10f42b1a7b523acbf85461be41a3e https://repo.anaconda.com/pkgs/main/linux-64/libuuid-1.41.5-h5eee18b_0.conda#4a6a2354414c9080327274aa514e5299 @@ -41,7 +41,7 @@ https://repo.anaconda.com/pkgs/main/linux-64/pip-25.0-py313h06a4308_0.conda#cbe2 # pip markupsafe @ https://files.pythonhosted.org/packages/0c/91/96cf928db8236f1bfab6ce15ad070dfdd02ed88261c2afafd4b43575e9e9/MarkupSafe-3.0.2-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl#sha256=15ab75ef81add55874e7ab7055e9c397312385bd9ced94920f2802310c930396 # pip meson @ https://files.pythonhosted.org/packages/e5/2b/46bda4ef5a7ae4135dbfe27fc0368c44e5a349a897a54fdf2cedb8dcb66e/meson-1.7.2-py3-none-any.whl#sha256=82c6818dc81743c96de3a458f06175776ebfde4081195ea31ea6971838f25e38 # pip ninja @ https://files.pythonhosted.org/packages/eb/7a/455d2877fe6cf99886849c7f9755d897df32eaf3a0fba47b56e615f880f7/ninja-1.11.1.4-py3-none-manylinux_2_12_x86_64.manylinux2010_x86_64.whl#sha256=096487995473320de7f65d622c3f1d16c3ad174797602218ca8c967f51ec38a0 -# pip packaging @ https://files.pythonhosted.org/packages/88/ef/eb23f262cca3c0c4eb7ab1933c3b1f03d021f2c48f54763065b6f0e321be/packaging-24.2-py3-none-any.whl#sha256=09abb1bccd265c01f4a3aa3f7a7db064b36514d2cba19a2f694fe6150451a759 +# pip packaging @ https://files.pythonhosted.org/packages/20/12/38679034af332785aac8774540895e234f4d07f7545804097de4b666afd8/packaging-25.0-py3-none-any.whl#sha256=29572ef2b1f17581046b3a2227d5c611fb25ec70ca1ba8554b24b0e69331a484 # pip platformdirs @ https://files.pythonhosted.org/packages/6d/45/59578566b3275b8fd9157885918fcd0c4d74162928a5310926887b856a51/platformdirs-4.3.7-py3-none-any.whl#sha256=a03875334331946f13c549dbd8f4bac7a13a50a895a0eb1e8c6a8ace80d40a94 # pip pluggy @ https://files.pythonhosted.org/packages/88/5f/e351af9a41f866ac3f1fac4ca0613908d9a41741cfcf2228f4ad853b697d/pluggy-1.5.0-py3-none-any.whl#sha256=44e1ad92c8ca002de6377e165f3e0f1be63266ab4d554740532335b9d75ea669 # pip pygments @ https://files.pythonhosted.org/packages/8a/0b/9fcc47d19c48b59121088dd6da2488a49d5f72dacf8262e2790a1d2c7d15/pygments-2.19.1-py3-none-any.whl#sha256=9ea1544ad55cecf4b8242fab6dd35a93bbce657034b0611ee383099054ab6d8c From cb002f4f8b046629a19de6e8f7e6b3f1b3fd08af Mon Sep 17 00:00:00 2001 From: scikit-learn-bot Date: Mon, 21 Apr 2025 15:00:21 +0200 Subject: [PATCH 074/182] :lock: :robot: CI Update lock files for array-api CI build(s) :lock: :robot: (#31233) Co-authored-by: Lock file bot --- ...a_forge_cuda_array-api_linux-64_conda.lock | 22 +++++++++---------- 1 file changed, 11 insertions(+), 11 deletions(-) diff --git a/build_tools/github/pylatest_conda_forge_cuda_array-api_linux-64_conda.lock b/build_tools/github/pylatest_conda_forge_cuda_array-api_linux-64_conda.lock index d005cc1946107..5af04cbc78694 100644 --- a/build_tools/github/pylatest_conda_forge_cuda_array-api_linux-64_conda.lock +++ b/build_tools/github/pylatest_conda_forge_cuda_array-api_linux-64_conda.lock @@ -14,14 +14,14 @@ https://conda.anaconda.org/conda-forge/noarch/tzdata-2025b-h78e105d_0.conda#4222 https://conda.anaconda.org/conda-forge/noarch/fonts-conda-forge-1-0.tar.bz2#f766549260d6815b0c52253f1fb1bb29 https://conda.anaconda.org/conda-forge/linux-64/ld_impl_linux-64-2.43-h712a8e2_4.conda#01f8d123c96816249efd255a31ad7712 https://conda.anaconda.org/conda-forge/linux-64/libglvnd-1.7.0-ha4b6fd6_2.conda#434ca7e50e40f4918ab701e3facd59a0 -https://conda.anaconda.org/conda-forge/linux-64/llvm-openmp-20.1.2-h024ca30_1.conda#39a3992c2624b8d8e6b4994dedf3102a +https://conda.anaconda.org/conda-forge/linux-64/llvm-openmp-20.1.3-h024ca30_0.conda#c721339ea8746513e42b1233b4bbdfb0 https://conda.anaconda.org/conda-forge/noarch/sysroot_linux-64-2.17-h0157908_18.conda#460eba7851277ec1fd80a1a24080787a https://conda.anaconda.org/conda-forge/linux-64/_openmp_mutex-4.5-3_kmp_llvm.conda#ee5c2118262e30b972bc0b4db8ef0ba5 https://conda.anaconda.org/conda-forge/noarch/fonts-conda-ecosystem-1-0.tar.bz2#fee5683a3f04bd15cbd8318b096a27ab https://conda.anaconda.org/conda-forge/linux-64/libegl-1.7.0-ha4b6fd6_2.conda#c151d5eb730e9b7480e6d48c0fc44048 https://conda.anaconda.org/conda-forge/linux-64/libopengl-1.7.0-ha4b6fd6_2.conda#7df50d44d4a14d6c31a2c54f2cd92157 https://conda.anaconda.org/conda-forge/linux-64/libgcc-14.2.0-h767d61c_2.conda#ef504d1acbd74b7cc6849ef8af47dd03 -https://conda.anaconda.org/conda-forge/linux-64/alsa-lib-1.2.13-hb9d3cd8_0.conda#ae1370588aa6a5157c34c73e9bbb36a0 +https://conda.anaconda.org/conda-forge/linux-64/alsa-lib-1.2.14-hb9d3cd8_0.conda#76df83c2a9035c54df5d04ff81bcc02d https://conda.anaconda.org/conda-forge/linux-64/aws-c-common-0.10.6-hb9d3cd8_0.conda#d7d4680337a14001b0e043e96529409b https://conda.anaconda.org/conda-forge/linux-64/c-ares-1.34.5-hb9d3cd8_0.conda#f7f0d6cc2dc986d42ac2689ec88192be https://conda.anaconda.org/conda-forge/linux-64/libbrotlicommon-1.1.0-hb9d3cd8_2.conda#41b599ed2b02abcfdd84302bff174b23 @@ -100,7 +100,7 @@ https://conda.anaconda.org/conda-forge/linux-64/mysql-libs-9.2.0-he0572af_0.cond https://conda.anaconda.org/conda-forge/linux-64/nccl-2.26.2.1-h03a54cd_1.conda#07f874246d0987e94f8b94685bcc754c https://conda.anaconda.org/conda-forge/linux-64/ninja-1.12.1-h297d8ca_0.conda#3aa1c7e292afeff25a0091ddd7c69b72 https://conda.anaconda.org/conda-forge/linux-64/pcre2-10.44-hba22ea6_2.conda#df359c09c41cd186fffb93a2d87aa6f5 -https://conda.anaconda.org/conda-forge/linux-64/python-3.13.3-hf636f53_100_cp313.conda#6092d3c7241e67614af8e4d7b1fdf3ee +https://conda.anaconda.org/conda-forge/linux-64/python-3.13.3-hf636f53_101_cp313.conda#10622e12d649154af0bd76bcf33a7c5c https://conda.anaconda.org/conda-forge/linux-64/qhull-2020.2-h434a139_5.conda#353823361b1d27eb3960efb076dfcaf6 https://conda.anaconda.org/conda-forge/linux-64/wayland-1.23.1-h3e06ad9_0.conda#0a732427643ae5e0486a727927791da1 https://conda.anaconda.org/conda-forge/linux-64/xcb-util-0.4.1-hb711507_2.conda#8637c3e5821654d0edf97e2b0404b443 @@ -113,7 +113,7 @@ https://conda.anaconda.org/conda-forge/linux-64/aws-c-event-stream-0.5.0-h7959bf https://conda.anaconda.org/conda-forge/linux-64/aws-c-http-0.9.2-hefd7a92_4.conda#5ce4df662d32d3123ea8da15571b6f51 https://conda.anaconda.org/conda-forge/linux-64/brotli-1.1.0-hb9d3cd8_2.conda#98514fe74548d768907ce7a13f680e8f https://conda.anaconda.org/conda-forge/noarch/colorama-0.4.6-pyhd8ed1ab_1.conda#962b9857ee8e7018c22f2776ffa0b2d7 -https://conda.anaconda.org/conda-forge/noarch/cpython-3.13.3-py313hd8ed1ab_100.conda#488690e9d736c1273ca839d853ca883b +https://conda.anaconda.org/conda-forge/noarch/cpython-3.13.3-py313hd8ed1ab_101.conda#904a822cbd380adafb9070debf8579a8 https://conda.anaconda.org/conda-forge/linux-64/cudnn-9.8.0.87-hf36481c_1.conda#988b6d0f8a2660fdee429d3d0f761ed3 https://conda.anaconda.org/conda-forge/noarch/cycler-0.12.1-pyhd8ed1ab_1.conda#44600c4667a319d67dbe0681fc0bc833 https://conda.anaconda.org/conda-forge/linux-64/cyrus-sasl-2.1.27-h54b06d7_7.conda#dce22f70b4e5a407ce88f2be046f4ceb @@ -176,7 +176,7 @@ https://conda.anaconda.org/conda-forge/linux-64/libgl-1.7.0-ha4b6fd6_2.conda#928 https://conda.anaconda.org/conda-forge/linux-64/libgrpc-1.67.1-hc2c308b_0.conda#4606a4647bfe857e3cfe21ca12ac3afb https://conda.anaconda.org/conda-forge/linux-64/libhwloc-2.11.2-default_h0d58e46_1001.conda#804ca9e91bcaea0824a341d55b1684f2 https://conda.anaconda.org/conda-forge/linux-64/liblapack-3.9.0-31_h7ac8fdf_openblas.conda#452b98eafe050ecff932f0ec832dd03f -https://conda.anaconda.org/conda-forge/linux-64/libllvm20-20.1.2-ha7bfdaf_0.conda#8354769527f9f441a3a04aa1c19188d9 +https://conda.anaconda.org/conda-forge/linux-64/libllvm20-20.1.3-he9d0ab4_0.conda#74c14fe2ab88e352ab6e4fedf5ecb527 https://conda.anaconda.org/conda-forge/linux-64/libxkbcommon-1.8.1-hc4a0caf_0.conda#e7e5b0652227d646b44abdcbd989da7b https://conda.anaconda.org/conda-forge/linux-64/libxslt-1.1.39-h76b75d6_0.conda#e71f31f8cfb0a91439f2086fc8aa0461 https://conda.anaconda.org/conda-forge/noarch/meson-1.7.1-pyhd8ed1ab_0.conda#90018ee73b8741268027421ceac2809a @@ -197,15 +197,15 @@ https://conda.anaconda.org/conda-forge/linux-64/aws-c-s3-0.7.7-hf454442_0.conda# https://conda.anaconda.org/conda-forge/linux-64/azure-identity-cpp-1.10.0-h113e628_0.conda#73f73f60854f325a55f1d31459f2ab73 https://conda.anaconda.org/conda-forge/linux-64/azure-storage-common-cpp-12.8.0-h736e048_1.conda#13de36be8de3ae3f05ba127631599213 https://conda.anaconda.org/conda-forge/linux-64/gmpy2-2.1.5-py313h11186cd_3.conda#846a773cdc154eda7b86d7f4427432f2 -https://conda.anaconda.org/conda-forge/linux-64/harfbuzz-11.0.1-h2c12942_0.conda#c90105cecb8bf8248f6666f1f5a40bbb -https://conda.anaconda.org/conda-forge/linux-64/libclang-cpp20.1-20.1.2-default_hb5137d0_0.conda#729198eae19e9dbf8e0ffe355d416bde -https://conda.anaconda.org/conda-forge/linux-64/libclang13-20.1.2-default_h9c6a7e4_0.conda#c5fe177150aecc6ec46609b0a6123f39 +https://conda.anaconda.org/conda-forge/linux-64/harfbuzz-11.1.0-h3beb420_0.conda#95e3bb97f9cdc251c0c68640e9c10ed3 +https://conda.anaconda.org/conda-forge/linux-64/libclang-cpp20.1-20.1.3-default_h1df26ce_0.conda#bbce8ba7f25af8b0928f13fca1eb7405 +https://conda.anaconda.org/conda-forge/linux-64/libclang13-20.1.3-default_he06ed0a_0.conda#1bb2ec3c550f7589b2d16e271aeaeddb https://conda.anaconda.org/conda-forge/linux-64/libgoogle-cloud-2.32.0-h804f50b_0.conda#3d96df4d6b1c88455e05b94ce8a14a53 https://conda.anaconda.org/conda-forge/linux-64/liblapacke-3.9.0-31_he2f377e_openblas.conda#7e5fff7d0db69be3a266f7e79a3bb0e2 https://conda.anaconda.org/conda-forge/linux-64/libmagma-2.8.0-h9ddd185_2.conda#8de40c4f75d36bb00a5870f682457f1d https://conda.anaconda.org/conda-forge/linux-64/libpq-17.4-h27ae623_1.conda#37fba334855ef3b51549308e61ed7a3d https://conda.anaconda.org/conda-forge/noarch/meson-python-0.17.1-pyh70fd9c4_1.conda#7a02679229c6c2092571b4c025055440 -https://conda.anaconda.org/conda-forge/linux-64/numpy-2.2.4-py313h17eae1a_0.conda#6c905a8f170edd64f3a390c76572e331 +https://conda.anaconda.org/conda-forge/linux-64/numpy-2.2.5-py313h17eae1a_0.conda#6ceeff9ed72e54e4a2f9a1c88f47bdde https://conda.anaconda.org/conda-forge/linux-64/pillow-11.1.0-py313h8db990d_0.conda#1e86810c6c3fb6d6aebdba26564eb2e8 https://conda.anaconda.org/conda-forge/noarch/pytest-cov-6.1.1-pyhd8ed1ab_0.conda#1e35d8f975bc0e984a19819aa91c440a https://conda.anaconda.org/conda-forge/noarch/pytest-xdist-3.6.1-pyhd8ed1ab_1.conda#59aad4fb37cabc0bacc73cf344612ddd @@ -215,13 +215,13 @@ https://conda.anaconda.org/conda-forge/noarch/array-api-strict-2.3.1-pyhd8ed1ab_ https://conda.anaconda.org/conda-forge/linux-64/aws-crt-cpp-0.29.7-hd92328a_7.conda#02b95564257d5c3db9c06beccf711f95 https://conda.anaconda.org/conda-forge/linux-64/azure-storage-blobs-cpp-12.13.0-h3cf044e_1.conda#7eb66060455c7a47d9dcdbfa9f46579b https://conda.anaconda.org/conda-forge/linux-64/blas-devel-3.9.0-31_h1ea3ea9_openblas.conda#ba652ee0576396d4765e567f043c57f9 -https://conda.anaconda.org/conda-forge/linux-64/contourpy-1.3.1-py313h33d0bda_0.conda#6b6768e7c585d7029f79a04cbc4cbff0 +https://conda.anaconda.org/conda-forge/linux-64/contourpy-1.3.2-py313h33d0bda_0.conda#5dc81fffe102f63045225007a33d6199 https://conda.anaconda.org/conda-forge/linux-64/cupy-core-13.4.1-py313hc2a895b_0.conda#46dd595e816b278b178e3bef8a6acf71 https://conda.anaconda.org/conda-forge/linux-64/libgoogle-cloud-storage-2.32.0-h0121fbd_0.conda#877a5ec0431a5af83bf0cd0522bfe661 https://conda.anaconda.org/conda-forge/linux-64/libmagma_sparse-2.8.0-h9ddd185_0.conda#f4eb3cfeaf9d91e72d5b2b8706bf059f https://conda.anaconda.org/conda-forge/linux-64/mkl-2024.2.2-ha957f24_16.conda#1459379c79dda834673426504d52b319 https://conda.anaconda.org/conda-forge/linux-64/pandas-2.2.3-py313ha87cce1_3.conda#6248b529e537b1d4cb5ab3ef7f537795 -https://conda.anaconda.org/conda-forge/linux-64/polars-1.27.1-py313hae41bca_0.conda#acd55ae120e730edf3eb24de04b9d6f8 +https://conda.anaconda.org/conda-forge/linux-64/polars-1.27.1-py313h96101dc_1.conda#f5c18ddf7723234bc0ebc8272df2e73c https://conda.anaconda.org/conda-forge/linux-64/qt6-main-6.9.0-h6441bc3_1.conda#4029a8dcb1d97ea241dbe5abfda1fad6 https://conda.anaconda.org/conda-forge/linux-64/scipy-1.15.2-py313h86fcf2b_0.conda#ca68acd9febc86448eeed68d0c6c8643 https://conda.anaconda.org/conda-forge/noarch/sympy-1.13.3-pyh2585a3b_105.conda#254cd5083ffa04d96e3173397a3d30f4 From 0b6883610424923222a512a37076c4c1f9741da5 Mon Sep 17 00:00:00 2001 From: scikit-learn-bot Date: Mon, 21 Apr 2025 15:01:01 +0200 Subject: [PATCH 075/182] :lock: :robot: CI Update lock files for main CI build(s) :lock: :robot: (#31234) Co-authored-by: Lock file bot --- build_tools/azure/debian_32bit_lock.txt | 2 +- ...latest_conda_forge_mkl_linux-64_conda.lock | 62 +++++++++---------- ...pylatest_conda_forge_mkl_osx-64_conda.lock | 12 ++-- ...test_conda_mkl_no_openmp_osx-64_conda.lock | 10 +-- ...st_pip_openblas_pandas_linux-64_conda.lock | 8 +-- .../pymin_conda_forge_mkl_win-64_conda.lock | 8 +-- ...nblas_min_dependencies_linux-64_conda.lock | 19 +++--- ...e_openblas_ubuntu_2204_linux-64_conda.lock | 2 +- build_tools/azure/ubuntu_atlas_lock.txt | 2 +- build_tools/circle/doc_linux-64_conda.lock | 30 ++++----- .../doc_min_dependencies_linux-64_conda.lock | 31 +++++----- ...n_conda_forge_arm_linux-aarch64_conda.lock | 14 ++--- 12 files changed, 101 insertions(+), 99 deletions(-) diff --git a/build_tools/azure/debian_32bit_lock.txt b/build_tools/azure/debian_32bit_lock.txt index 1b990ab021db0..654cbcc78a382 100644 --- a/build_tools/azure/debian_32bit_lock.txt +++ b/build_tools/azure/debian_32bit_lock.txt @@ -18,7 +18,7 @@ meson-python==0.17.1 # via -r build_tools/azure/debian_32bit_requirements.txt ninja==1.11.1.4 # via -r build_tools/azure/debian_32bit_requirements.txt -packaging==24.2 +packaging==25.0 # via # meson-python # pyproject-metadata diff --git a/build_tools/azure/pylatest_conda_forge_mkl_linux-64_conda.lock b/build_tools/azure/pylatest_conda_forge_mkl_linux-64_conda.lock index 27240ccac9a54..88f98c018135c 100644 --- a/build_tools/azure/pylatest_conda_forge_mkl_linux-64_conda.lock +++ b/build_tools/azure/pylatest_conda_forge_mkl_linux-64_conda.lock @@ -15,14 +15,14 @@ https://conda.anaconda.org/conda-forge/noarch/tzdata-2025b-h78e105d_0.conda#4222 https://conda.anaconda.org/conda-forge/noarch/fonts-conda-forge-1-0.tar.bz2#f766549260d6815b0c52253f1fb1bb29 https://conda.anaconda.org/conda-forge/linux-64/ld_impl_linux-64-2.43-h712a8e2_4.conda#01f8d123c96816249efd255a31ad7712 https://conda.anaconda.org/conda-forge/linux-64/libglvnd-1.7.0-ha4b6fd6_2.conda#434ca7e50e40f4918ab701e3facd59a0 -https://conda.anaconda.org/conda-forge/linux-64/llvm-openmp-20.1.2-h024ca30_1.conda#39a3992c2624b8d8e6b4994dedf3102a +https://conda.anaconda.org/conda-forge/linux-64/llvm-openmp-20.1.3-h024ca30_0.conda#c721339ea8746513e42b1233b4bbdfb0 https://conda.anaconda.org/conda-forge/linux-64/_openmp_mutex-4.5-3_kmp_llvm.conda#ee5c2118262e30b972bc0b4db8ef0ba5 https://conda.anaconda.org/conda-forge/noarch/fonts-conda-ecosystem-1-0.tar.bz2#fee5683a3f04bd15cbd8318b096a27ab https://conda.anaconda.org/conda-forge/linux-64/libegl-1.7.0-ha4b6fd6_2.conda#c151d5eb730e9b7480e6d48c0fc44048 https://conda.anaconda.org/conda-forge/linux-64/libopengl-1.7.0-ha4b6fd6_2.conda#7df50d44d4a14d6c31a2c54f2cd92157 https://conda.anaconda.org/conda-forge/linux-64/libgcc-14.2.0-h767d61c_2.conda#ef504d1acbd74b7cc6849ef8af47dd03 -https://conda.anaconda.org/conda-forge/linux-64/alsa-lib-1.2.13-hb9d3cd8_0.conda#ae1370588aa6a5157c34c73e9bbb36a0 -https://conda.anaconda.org/conda-forge/linux-64/aws-c-common-0.12.1-hb9d3cd8_0.conda#eac0ac2d6cf8c0aba9d2028bff9a4374 +https://conda.anaconda.org/conda-forge/linux-64/alsa-lib-1.2.14-hb9d3cd8_0.conda#76df83c2a9035c54df5d04ff81bcc02d +https://conda.anaconda.org/conda-forge/linux-64/aws-c-common-0.12.2-hb9d3cd8_0.conda#bd52f376d1d34d7823a7bf0773be86e8 https://conda.anaconda.org/conda-forge/linux-64/c-ares-1.34.5-hb9d3cd8_0.conda#f7f0d6cc2dc986d42ac2689ec88192be https://conda.anaconda.org/conda-forge/linux-64/libbrotlicommon-1.1.0-hb9d3cd8_2.conda#41b599ed2b02abcfdd84302bff174b23 https://conda.anaconda.org/conda-forge/linux-64/libdeflate-1.23-h4ddbbb0_0.conda#8dfae1d2e74767e9ce36d5fa0d8605db @@ -44,10 +44,10 @@ https://conda.anaconda.org/conda-forge/linux-64/pthread-stubs-0.4-hb9d3cd8_1002. https://conda.anaconda.org/conda-forge/linux-64/xorg-libice-1.1.2-hb9d3cd8_0.conda#fb901ff28063514abb6046c9ec2c4a45 https://conda.anaconda.org/conda-forge/linux-64/xorg-libxau-1.0.12-hb9d3cd8_0.conda#f6ebe2cb3f82ba6c057dde5d9debe4f7 https://conda.anaconda.org/conda-forge/linux-64/xorg-libxdmcp-1.1.5-hb9d3cd8_0.conda#8035c64cb77ed555e3f150b7b3972480 -https://conda.anaconda.org/conda-forge/linux-64/aws-c-cal-0.8.7-h7d555fd_1.conda#84de42a656bc56eb19218525fd5a7b5f -https://conda.anaconda.org/conda-forge/linux-64/aws-c-compression-0.3.1-hcbd9e4e_3.conda#2e01a03cfc3f90d1bdf9e0f5a0b3ddcd -https://conda.anaconda.org/conda-forge/linux-64/aws-c-sdkutils-0.2.3-hcbd9e4e_3.conda#5d6e5bc1d183d02a35f209bfdd71559f -https://conda.anaconda.org/conda-forge/linux-64/aws-checksums-0.2.3-hcbd9e4e_3.conda#42f28750f17fd7fa4a8942f300211bf6 +https://conda.anaconda.org/conda-forge/linux-64/aws-c-cal-0.8.9-hada3f3f_0.conda#f1bc1f3925e2ff734d4a8a5bb3552b1d +https://conda.anaconda.org/conda-forge/linux-64/aws-c-compression-0.3.1-hc2d532b_4.conda#4cc4dcd582b2f087d62c70b2d6daa59f +https://conda.anaconda.org/conda-forge/linux-64/aws-c-sdkutils-0.2.3-hc2d532b_4.conda#15a1f6fb713b4cd3fee74588b996a846 +https://conda.anaconda.org/conda-forge/linux-64/aws-checksums-0.2.5-hc2d532b_1.conda#47e378813c3451a9eb0948625a18418a https://conda.anaconda.org/conda-forge/linux-64/bzip2-1.0.8-h4bc722e_7.conda#62ee74e96c5ebb0af99386de58cf9553 https://conda.anaconda.org/conda-forge/linux-64/double-conversion-3.3.1-h5888daf_0.conda#bfd56492d8346d669010eccafe0ba058 https://conda.anaconda.org/conda-forge/linux-64/expat-2.7.0-h5888daf_0.conda#d6845ae4dea52a2f90178bf1829a21f8 @@ -73,13 +73,13 @@ https://conda.anaconda.org/conda-forge/linux-64/lz4-c-1.10.0-h5888daf_1.conda#9d https://conda.anaconda.org/conda-forge/linux-64/mysql-common-9.2.0-h266115a_0.conda#db22a0962c953e81a2a679ecb1fc6027 https://conda.anaconda.org/conda-forge/linux-64/pixman-0.44.2-h29eaf8c_0.conda#5e2a7acfa2c24188af39e7944e1b3604 https://conda.anaconda.org/conda-forge/linux-64/readline-8.2-h8c095d6_2.conda#283b96675859b20a825f8fa30f311446 -https://conda.anaconda.org/conda-forge/linux-64/s2n-1.5.15-hd830067_0.conda#81bde3ad0187adf0dd37fe86e84aff46 +https://conda.anaconda.org/conda-forge/linux-64/s2n-1.5.16-hba75a32_1.conda#71ba0cc1e20a573588ea8a4540b56f5b https://conda.anaconda.org/conda-forge/linux-64/sleef-3.8-h1b44611_0.conda#aec4dba5d4c2924730088753f6fa164b https://conda.anaconda.org/conda-forge/linux-64/snappy-1.2.1-h8bd8927_1.conda#3b3e64af585eadfb52bb90b553db5edf https://conda.anaconda.org/conda-forge/linux-64/tk-8.6.13-noxft_h4845f30_101.conda#d453b98d9c83e71da0741bb0ff4d76bc https://conda.anaconda.org/conda-forge/linux-64/zlib-1.3.1-hb9d3cd8_2.conda#c9f075ab2f33b3bbee9e62d4ad0a6cd8 https://conda.anaconda.org/conda-forge/linux-64/zstd-1.5.7-hb8e6e7a_2.conda#6432cb5d4ac0046c3ac0a8a0f95842f9 -https://conda.anaconda.org/conda-forge/linux-64/aws-c-io-0.17.0-ha855f32_8.conda#310a7a7bc53c1e00f938ee2e8c219930 +https://conda.anaconda.org/conda-forge/linux-64/aws-c-io-0.18.0-h7b13e6b_1.conda#0344e7cd6658502b7cab405637db97a2 https://conda.anaconda.org/conda-forge/linux-64/brotli-bin-1.1.0-hb9d3cd8_2.conda#c63b5e52939e795ba8d26e35d767a843 https://conda.anaconda.org/conda-forge/linux-64/freetype-2.13.3-h48d6fc4_0.conda#9ecfd6f2ca17077dd9c2d24770bb9ccd https://conda.anaconda.org/conda-forge/linux-64/glog-0.7.1-hbabe93e_0.conda#ff862eebdfeb2fd048ae9dc92510baca @@ -92,13 +92,13 @@ https://conda.anaconda.org/conda-forge/linux-64/libcrc32c-1.1.2-h9c3ff4c_0.tar.b https://conda.anaconda.org/conda-forge/linux-64/libdrm-2.4.124-hb9d3cd8_0.conda#8bc89311041d7fcb510238cf0848ccae https://conda.anaconda.org/conda-forge/linux-64/libgfortran-ng-14.2.0-h69a702a_2.conda#4056c857af1a99ee50589a941059ec55 https://conda.anaconda.org/conda-forge/linux-64/libnghttp2-1.64.0-h161d5f1_0.conda#19e57602824042dfd0446292ef90488b -https://conda.anaconda.org/conda-forge/linux-64/libprotobuf-5.29.3-h501fc15_0.conda#452518a9744fbac05fb45531979bdf29 +https://conda.anaconda.org/conda-forge/linux-64/libprotobuf-5.29.3-h501fc15_1.conda#edb86556cf4a0c133e7932a1597ff236 https://conda.anaconda.org/conda-forge/linux-64/libre2-11-2024.07.02-hba17884_3.conda#545e93a513c10603327c76c15485e946 https://conda.anaconda.org/conda-forge/linux-64/libthrift-0.21.0-h0e7cc3e_0.conda#dcb95c0a98ba9ff737f7ae482aef7833 https://conda.anaconda.org/conda-forge/linux-64/mysql-libs-9.2.0-he0572af_0.conda#93340b072c393d23c4700a1d40565dca https://conda.anaconda.org/conda-forge/linux-64/ninja-1.12.1-h297d8ca_0.conda#3aa1c7e292afeff25a0091ddd7c69b72 https://conda.anaconda.org/conda-forge/linux-64/pcre2-10.44-hba22ea6_2.conda#df359c09c41cd186fffb93a2d87aa6f5 -https://conda.anaconda.org/conda-forge/linux-64/python-3.13.3-hf636f53_100_cp313.conda#6092d3c7241e67614af8e4d7b1fdf3ee +https://conda.anaconda.org/conda-forge/linux-64/python-3.13.3-hf636f53_101_cp313.conda#10622e12d649154af0bd76bcf33a7c5c https://conda.anaconda.org/conda-forge/linux-64/qhull-2020.2-h434a139_5.conda#353823361b1d27eb3960efb076dfcaf6 https://conda.anaconda.org/conda-forge/linux-64/wayland-1.23.1-h3e06ad9_0.conda#0a732427643ae5e0486a727927791da1 https://conda.anaconda.org/conda-forge/linux-64/xcb-util-0.4.1-hb711507_2.conda#8637c3e5821654d0edf97e2b0404b443 @@ -107,11 +107,11 @@ https://conda.anaconda.org/conda-forge/linux-64/xcb-util-renderutil-0.3.10-hb711 https://conda.anaconda.org/conda-forge/linux-64/xcb-util-wm-0.4.2-hb711507_0.conda#608e0ef8256b81d04456e8d211eee3e8 https://conda.anaconda.org/conda-forge/linux-64/xorg-libsm-1.2.6-he73a12e_0.conda#1c74ff8c35dcadf952a16f752ca5aa49 https://conda.anaconda.org/conda-forge/linux-64/xorg-libx11-1.8.12-h4f16b4b_0.conda#db038ce880f100acc74dba10302b5630 -https://conda.anaconda.org/conda-forge/linux-64/aws-c-event-stream-0.5.4-h286e7e7_3.conda#aac4138e5fe70061b0e4126ee71e3a9f -https://conda.anaconda.org/conda-forge/linux-64/aws-c-http-0.9.5-hbca0721_0.conda#9cb70e8f68551738d478117fe973c114 +https://conda.anaconda.org/conda-forge/linux-64/aws-c-event-stream-0.5.4-h8170a11_5.conda#68614c9a3b3fb09cb1b4e8c4ed9333fb +https://conda.anaconda.org/conda-forge/linux-64/aws-c-http-0.9.5-hca9d837_2.conda#2c3fdcb5a1bf40fd7b6b5598718e5929 https://conda.anaconda.org/conda-forge/linux-64/brotli-1.1.0-hb9d3cd8_2.conda#98514fe74548d768907ce7a13f680e8f https://conda.anaconda.org/conda-forge/noarch/colorama-0.4.6-pyhd8ed1ab_1.conda#962b9857ee8e7018c22f2776ffa0b2d7 -https://conda.anaconda.org/conda-forge/noarch/cpython-3.13.3-py313hd8ed1ab_100.conda#488690e9d736c1273ca839d853ca883b +https://conda.anaconda.org/conda-forge/noarch/cpython-3.13.3-py313hd8ed1ab_101.conda#904a822cbd380adafb9070debf8579a8 https://conda.anaconda.org/conda-forge/noarch/cycler-0.12.1-pyhd8ed1ab_1.conda#44600c4667a319d67dbe0681fc0bc833 https://conda.anaconda.org/conda-forge/linux-64/cyrus-sasl-2.1.27-h54b06d7_7.conda#dce22f70b4e5a407ce88f2be046f4ceb https://conda.anaconda.org/conda-forge/linux-64/cython-3.0.12-py313h5dec8f5_0.conda#24a42a0c1cc33743e33572d63d489b54 @@ -155,8 +155,8 @@ https://conda.anaconda.org/conda-forge/linux-64/xkeyboard-config-2.43-hb9d3cd8_0 https://conda.anaconda.org/conda-forge/linux-64/xorg-libxext-1.3.6-hb9d3cd8_0.conda#febbab7d15033c913d53c7a2c102309d https://conda.anaconda.org/conda-forge/linux-64/xorg-libxfixes-6.0.1-hb9d3cd8_0.conda#4bdb303603e9821baf5fe5fdff1dc8f8 https://conda.anaconda.org/conda-forge/linux-64/xorg-libxrender-0.9.12-hb9d3cd8_0.conda#96d57aba173e878a2089d5638016dc5e -https://conda.anaconda.org/conda-forge/linux-64/aws-c-auth-0.8.7-h7743f02_1.conda#185af639e073ef45fbd75f9d4f30605b -https://conda.anaconda.org/conda-forge/linux-64/aws-c-mqtt-0.12.2-hffac463_3.conda#18d498ed5cd14ab8d7d745a18303edf4 +https://conda.anaconda.org/conda-forge/linux-64/aws-c-auth-0.9.0-h094d708_2.conda#9b1e62c9d7b158cf1a234ee49ef6232f +https://conda.anaconda.org/conda-forge/linux-64/aws-c-mqtt-0.12.3-h773eac8_2.conda#53e040407719cf505b7753a6450e4d03 https://conda.anaconda.org/conda-forge/linux-64/azure-core-cpp-1.14.0-h5cfcd09_0.conda#0a8838771cc2e985cd295e01ae83baf1 https://conda.anaconda.org/conda-forge/linux-64/cairo-1.18.4-h3394656_0.conda#09262e66b19567aff4f592fb53b28760 https://conda.anaconda.org/conda-forge/linux-64/ccache-4.11.2-hd714d17_0.conda#35ae7ce74089ab05fdb1cb9746c0fbe4 @@ -169,7 +169,7 @@ https://conda.anaconda.org/conda-forge/linux-64/lcms2-2.17-h717163a_0.conda#000e https://conda.anaconda.org/conda-forge/linux-64/libgl-1.7.0-ha4b6fd6_2.conda#928b8be80851f5d8ffb016f9c81dae7a https://conda.anaconda.org/conda-forge/linux-64/libgrpc-1.71.0-he753a82_0.conda#65e3fc5e73aa153bb069c1baec51fc12 https://conda.anaconda.org/conda-forge/linux-64/libhwloc-2.11.2-default_h0d58e46_1001.conda#804ca9e91bcaea0824a341d55b1684f2 -https://conda.anaconda.org/conda-forge/linux-64/libllvm20-20.1.2-ha7bfdaf_0.conda#8354769527f9f441a3a04aa1c19188d9 +https://conda.anaconda.org/conda-forge/linux-64/libllvm20-20.1.3-he9d0ab4_0.conda#74c14fe2ab88e352ab6e4fedf5ecb527 https://conda.anaconda.org/conda-forge/linux-64/libxkbcommon-1.8.1-hc4a0caf_0.conda#e7e5b0652227d646b44abdcbd989da7b https://conda.anaconda.org/conda-forge/linux-64/libxslt-1.1.39-h76b75d6_0.conda#e71f31f8cfb0a91439f2086fc8aa0461 https://conda.anaconda.org/conda-forge/noarch/meson-1.7.1-pyhd8ed1ab_0.conda#90018ee73b8741268027421ceac2809a @@ -189,13 +189,13 @@ https://conda.anaconda.org/conda-forge/linux-64/xorg-libxdamage-1.1.6-hb9d3cd8_0 https://conda.anaconda.org/conda-forge/linux-64/xorg-libxi-1.8.2-hb9d3cd8_0.conda#17dcc85db3c7886650b8908b183d6876 https://conda.anaconda.org/conda-forge/linux-64/xorg-libxrandr-1.5.4-hb9d3cd8_0.conda#2de7f99d6581a4a7adbff607b5c278ca https://conda.anaconda.org/conda-forge/linux-64/xorg-libxxf86vm-1.1.6-hb9d3cd8_0.conda#5efa5fa6243a622445fdfd72aee15efa -https://conda.anaconda.org/conda-forge/linux-64/aws-c-s3-0.7.13-h4c9fe3b_3.conda#207518c1b938d5ca2a970c24e342d98f +https://conda.anaconda.org/conda-forge/linux-64/aws-c-s3-0.7.15-h46af1f8_1.conda#4b91da7a394cb7c0a5bd9bb8dd8dcc76 https://conda.anaconda.org/conda-forge/linux-64/azure-identity-cpp-1.10.0-h113e628_0.conda#73f73f60854f325a55f1d31459f2ab73 https://conda.anaconda.org/conda-forge/linux-64/azure-storage-common-cpp-12.8.0-h736e048_1.conda#13de36be8de3ae3f05ba127631599213 https://conda.anaconda.org/conda-forge/linux-64/gmpy2-2.1.5-py313h11186cd_3.conda#846a773cdc154eda7b86d7f4427432f2 -https://conda.anaconda.org/conda-forge/linux-64/harfbuzz-11.0.1-h2c12942_0.conda#c90105cecb8bf8248f6666f1f5a40bbb -https://conda.anaconda.org/conda-forge/linux-64/libclang-cpp20.1-20.1.2-default_hb5137d0_0.conda#729198eae19e9dbf8e0ffe355d416bde -https://conda.anaconda.org/conda-forge/linux-64/libclang13-20.1.2-default_h9c6a7e4_0.conda#c5fe177150aecc6ec46609b0a6123f39 +https://conda.anaconda.org/conda-forge/linux-64/harfbuzz-11.1.0-h3beb420_0.conda#95e3bb97f9cdc251c0c68640e9c10ed3 +https://conda.anaconda.org/conda-forge/linux-64/libclang-cpp20.1-20.1.3-default_h1df26ce_0.conda#bbce8ba7f25af8b0928f13fca1eb7405 +https://conda.anaconda.org/conda-forge/linux-64/libclang13-20.1.3-default_he06ed0a_0.conda#1bb2ec3c550f7589b2d16e271aeaeddb https://conda.anaconda.org/conda-forge/linux-64/libgoogle-cloud-2.36.0-hc4361e1_1.conda#ae36e6296a8dd8e8a9a8375965bf6398 https://conda.anaconda.org/conda-forge/linux-64/libopentelemetry-cpp-1.20.0-hd1b1c89_0.conda#e1185384cc23e3bbf85486987835df94 https://conda.anaconda.org/conda-forge/linux-64/libpq-17.4-h27ae623_1.conda#37fba334855ef3b51549308e61ed7a3d @@ -206,37 +206,37 @@ https://conda.anaconda.org/conda-forge/noarch/pytest-cov-6.1.1-pyhd8ed1ab_0.cond https://conda.anaconda.org/conda-forge/noarch/pytest-xdist-3.6.1-pyhd8ed1ab_1.conda#59aad4fb37cabc0bacc73cf344612ddd https://conda.anaconda.org/conda-forge/linux-64/tbb-2021.13.0-hceb3a55_1.conda#ba7726b8df7b9d34ea80e82b097a4893 https://conda.anaconda.org/conda-forge/linux-64/xorg-libxtst-1.2.5-hb9d3cd8_3.conda#7bbe9a0cc0df0ac5f5a8ad6d6a11af2f -https://conda.anaconda.org/conda-forge/linux-64/aws-crt-cpp-0.31.1-h46b750d_1.conda#df4a6731864b1d6e125c0b94328262fe +https://conda.anaconda.org/conda-forge/linux-64/aws-crt-cpp-0.32.4-h7d42c6f_0.conda#e39cbe02d737ce074a59af9d86015c2a https://conda.anaconda.org/conda-forge/linux-64/azure-storage-blobs-cpp-12.13.0-h3cf044e_1.conda#7eb66060455c7a47d9dcdbfa9f46579b https://conda.anaconda.org/conda-forge/linux-64/libgoogle-cloud-storage-2.36.0-h0121fbd_1.conda#a0f7588c1f0a26d550e7bae4fb49427a https://conda.anaconda.org/conda-forge/linux-64/mkl-2024.2.2-ha957f24_16.conda#1459379c79dda834673426504d52b319 https://conda.anaconda.org/conda-forge/linux-64/qt6-main-6.9.0-h6441bc3_1.conda#4029a8dcb1d97ea241dbe5abfda1fad6 https://conda.anaconda.org/conda-forge/noarch/sympy-1.13.3-pyh2585a3b_105.conda#254cd5083ffa04d96e3173397a3d30f4 -https://conda.anaconda.org/conda-forge/linux-64/aws-sdk-cpp-1.11.510-h1fa5cb7_4.conda#b2269aa463cefee750c73da2baf8d583 +https://conda.anaconda.org/conda-forge/linux-64/aws-sdk-cpp-1.11.510-h5b777a2_5.conda#860ec2d406d3956b1a8f8cc8ac18faa4 https://conda.anaconda.org/conda-forge/linux-64/azure-storage-files-datalake-cpp-12.12.0-ha633028_1.conda#7c1980f89dd41b097549782121a73490 https://conda.anaconda.org/conda-forge/linux-64/libblas-3.9.0-31_hfdb39a5_mkl.conda#bdf4a57254e8248222cb631db4393ff1 https://conda.anaconda.org/conda-forge/linux-64/mkl-devel-2024.2.2-ha770c72_16.conda#140891ea14285fc634353b31e9e40a95 https://conda.anaconda.org/conda-forge/linux-64/pyside6-6.9.0-py313h5f61773_0.conda#f51f25ec8fcbf777f8b186bb5deeed40 -https://conda.anaconda.org/conda-forge/linux-64/libarrow-19.0.1-hb90904d_7_cpu.conda#cb63f3394929ba771ac798bbda23dfc9 +https://conda.anaconda.org/conda-forge/linux-64/libarrow-19.0.1-h27f8bab_8_cpu.conda#adabf9b45433d7465041140051dfdaa1 https://conda.anaconda.org/conda-forge/linux-64/libcblas-3.9.0-31_h372d94f_mkl.conda#2a06a6c16b45bd3d10002927ca204b67 https://conda.anaconda.org/conda-forge/linux-64/liblapack-3.9.0-31_hc41d3b0_mkl.conda#10d012ddd7cc1c7ff9093d4974a34e53 -https://conda.anaconda.org/conda-forge/linux-64/libarrow-acero-19.0.1-hcb10f89_7_cpu.conda#90382dd59eecda17d7c639b8c921d5d4 +https://conda.anaconda.org/conda-forge/linux-64/libarrow-acero-19.0.1-hcb10f89_8_cpu.conda#e96553170bbc67aa151a7194f450e698 https://conda.anaconda.org/conda-forge/linux-64/liblapacke-3.9.0-31_hbc6e62b_mkl.conda#562026e418363dc346ad5a9e18cce73c -https://conda.anaconda.org/conda-forge/linux-64/libparquet-19.0.1-h081d1f1_7_cpu.conda#9fa0679126b39a5b9d77063430fe9607 +https://conda.anaconda.org/conda-forge/linux-64/libparquet-19.0.1-h081d1f1_8_cpu.conda#874cbb160bf4b8f3155b1165f4186585 https://conda.anaconda.org/conda-forge/linux-64/libtorch-2.6.0-cpu_mkl_hf6ddc5a_104.conda#828146bb6100e9a4217e8351b18c8e83 -https://conda.anaconda.org/conda-forge/linux-64/numpy-2.2.4-py313h17eae1a_0.conda#6c905a8f170edd64f3a390c76572e331 +https://conda.anaconda.org/conda-forge/linux-64/numpy-2.2.5-py313h17eae1a_0.conda#6ceeff9ed72e54e4a2f9a1c88f47bdde https://conda.anaconda.org/conda-forge/linux-64/pyarrow-core-19.0.1-py313he5f92c8_0_cpu.conda#7d8649531c807b24295c8f9a0a396a78 https://conda.anaconda.org/conda-forge/noarch/array-api-strict-2.3.1-pyhd8ed1ab_0.conda#11107d0aeb8c590a34fee0894909816b https://conda.anaconda.org/conda-forge/linux-64/blas-devel-3.9.0-31_hcf00494_mkl.conda#368c93bde87a67d24a74de15bf4c49fd -https://conda.anaconda.org/conda-forge/linux-64/contourpy-1.3.1-py313h33d0bda_0.conda#6b6768e7c585d7029f79a04cbc4cbff0 -https://conda.anaconda.org/conda-forge/linux-64/libarrow-dataset-19.0.1-hcb10f89_7_cpu.conda#14adc5f9f5f602e03538a16540c05784 +https://conda.anaconda.org/conda-forge/linux-64/contourpy-1.3.2-py313h33d0bda_0.conda#5dc81fffe102f63045225007a33d6199 +https://conda.anaconda.org/conda-forge/linux-64/libarrow-dataset-19.0.1-hcb10f89_8_cpu.conda#3bb1fd3f721c4542ed26ba9bfc036619 https://conda.anaconda.org/conda-forge/linux-64/pandas-2.2.3-py313ha87cce1_3.conda#6248b529e537b1d4cb5ab3ef7f537795 -https://conda.anaconda.org/conda-forge/linux-64/polars-1.27.1-py313hae41bca_0.conda#acd55ae120e730edf3eb24de04b9d6f8 +https://conda.anaconda.org/conda-forge/linux-64/polars-1.27.1-py313h96101dc_1.conda#f5c18ddf7723234bc0ebc8272df2e73c https://conda.anaconda.org/conda-forge/linux-64/pytorch-2.6.0-cpu_mkl_py313_hea9ba1b_104.conda#5544fa15f47f4c53222f263eb51dd6b3 https://conda.anaconda.org/conda-forge/linux-64/scipy-1.15.2-py313h86fcf2b_0.conda#ca68acd9febc86448eeed68d0c6c8643 https://conda.anaconda.org/conda-forge/noarch/scipy-doctest-1.7.1-pyh29332c3_0.conda#d3b3b7b88385648eff6ae39694692f27 https://conda.anaconda.org/conda-forge/linux-64/blas-2.131-mkl.conda#9bb865b7e01104255ca54e61a58ded15 -https://conda.anaconda.org/conda-forge/linux-64/libarrow-substrait-19.0.1-h1bed206_7_cpu.conda#f75ac4838bdca785c0ab3339911704ee +https://conda.anaconda.org/conda-forge/linux-64/libarrow-substrait-19.0.1-h1bed206_8_cpu.conda#7832ea7b3c0e1269ef8990d774c9b6b1 https://conda.anaconda.org/conda-forge/linux-64/matplotlib-base-3.10.1-py313h129903b_0.conda#4e23b3fabf434b418e0d9c6975a6453f https://conda.anaconda.org/conda-forge/linux-64/pyamg-5.2.1-py313hf0ab243_1.conda#4c769bf3858f424cb2ecf952175ec600 https://conda.anaconda.org/conda-forge/linux-64/pytorch-cpu-2.6.0-cpu_mkl_hc60beec_104.conda#ccdc8b6254649dd4ed448b94fe80070e diff --git a/build_tools/azure/pylatest_conda_forge_mkl_osx-64_conda.lock b/build_tools/azure/pylatest_conda_forge_mkl_osx-64_conda.lock index bdf929a58486a..43135137cbe6b 100644 --- a/build_tools/azure/pylatest_conda_forge_mkl_osx-64_conda.lock +++ b/build_tools/azure/pylatest_conda_forge_mkl_osx-64_conda.lock @@ -12,7 +12,7 @@ https://conda.anaconda.org/conda-forge/noarch/tzdata-2025b-h78e105d_0.conda#4222 https://conda.anaconda.org/conda-forge/osx-64/bzip2-1.0.8-hfdf4475_7.conda#7ed4301d437b59045be7e051a0308211 https://conda.anaconda.org/conda-forge/osx-64/icu-75.1-h120a0e1_0.conda#d68d48a3060eb5abdc1cdc8e2a3a5966 https://conda.anaconda.org/conda-forge/osx-64/libbrotlicommon-1.1.0-h00291cd_2.conda#58f2c4bdd56c46cc7451596e4ae68e0b -https://conda.anaconda.org/conda-forge/osx-64/libcxx-20.1.2-hf95d169_0.conda#25cc3210a5a8a1b332e12d20db11c6dd +https://conda.anaconda.org/conda-forge/osx-64/libcxx-20.1.3-hf95d169_0.conda#022f109787a9624301ddbeb39519ff13 https://conda.anaconda.org/conda-forge/osx-64/libdeflate-1.23-he65b83e_0.conda#120f8f7ba6a8defb59f4253447db4bb4 https://conda.anaconda.org/conda-forge/osx-64/libexpat-2.7.0-h240833e_0.conda#026d0a1056ba2a3dbbea6d4b08188676 https://conda.anaconda.org/conda-forge/osx-64/libffi-3.4.6-h281671d_1.conda#4ca9ea59839a9ca8df84170fab4ceb41 @@ -21,7 +21,7 @@ https://conda.anaconda.org/conda-forge/osx-64/liblzma-5.8.1-hd471939_0.conda#8e1 https://conda.anaconda.org/conda-forge/osx-64/libmpdec-4.0.0-hfdf4475_0.conda#ed625b2e59dff82859c23dd24774156b https://conda.anaconda.org/conda-forge/osx-64/libwebp-base-1.5.0-h6cf52b4_0.conda#5e0cefc99a231ac46ba21e27ae44689f https://conda.anaconda.org/conda-forge/osx-64/libzlib-1.3.1-hd23fc13_2.conda#003a54a4e32b02f7355b50a837e699da -https://conda.anaconda.org/conda-forge/osx-64/llvm-openmp-20.1.2-ha54dae1_1.conda#0919db81cb42375dd9f2ab1ec032af94 +https://conda.anaconda.org/conda-forge/osx-64/llvm-openmp-20.1.3-ha54dae1_0.conda#16b29a91c8177de8910477ded0f80191 https://conda.anaconda.org/conda-forge/osx-64/ncurses-6.5-h0622a9a_3.conda#ced34dd9929f491ca6dab6a2927aff25 https://conda.anaconda.org/conda-forge/osx-64/openssl-3.5.0-hc426f3f_0.conda#e06e13c34056b6334a7a1188b0f4c83c https://conda.anaconda.org/conda-forge/osx-64/pthread-stubs-0.4-h00291cd_1002.conda#8bcf980d2c6b17094961198284b8e862 @@ -37,7 +37,7 @@ https://conda.anaconda.org/conda-forge/osx-64/libgfortran5-14.2.0-h58528f3_105.c https://conda.anaconda.org/conda-forge/osx-64/libpng-1.6.47-h3c4a55f_0.conda#8461ab86d2cdb76d6e971aab225be73f https://conda.anaconda.org/conda-forge/osx-64/libsqlite-3.49.1-hdb6dae5_2.conda#1819e770584a7e83a81541d8253cbabe https://conda.anaconda.org/conda-forge/osx-64/libxcb-1.17.0-hf1f96e2_0.conda#bbeca862892e2898bdb45792a61c4afc -https://conda.anaconda.org/conda-forge/osx-64/libxml2-2.14.0-hebb159f_1.conda#513da8e60b2bb7ea377095f86e262dd0 +https://conda.anaconda.org/conda-forge/osx-64/libxml2-2.14.2-h8c082e5_0.conda#4adac80accf99fa253f0620444ad01fb https://conda.anaconda.org/conda-forge/osx-64/mkl-2023.2.0-h54c2260_50500.conda#0a342ccdc79e4fcd359245ac51941e7b https://conda.anaconda.org/conda-forge/osx-64/ninja-1.12.1-h3c5361c_0.conda#a0ebabd021c8191aeb82793fe43cfdcb https://conda.anaconda.org/conda-forge/osx-64/qhull-2020.2-h3c5361c_5.conda#dd1ea9ff27c93db7c01a7b7656bd4ad4 @@ -55,7 +55,7 @@ https://conda.anaconda.org/conda-forge/osx-64/libllvm18-18.1.8-default_h3571c67_ https://conda.anaconda.org/conda-forge/osx-64/libtiff-4.7.0-hb77a491_3.conda#6f2f9df7b093d6b33bc0c334acc7d2d9 https://conda.anaconda.org/conda-forge/osx-64/mkl-devel-2023.2.0-h694c41f_50500.conda#1b4d0235ef253a1e19459351badf4f9f https://conda.anaconda.org/conda-forge/osx-64/mpfr-4.2.1-haed47dc_3.conda#d511e58aaaabfc23136880d9956fa7a6 -https://conda.anaconda.org/conda-forge/osx-64/python-3.13.3-h534c281_100_cp313.conda#b2da8b48105d2fa3eff867f5a07f8e3d +https://conda.anaconda.org/conda-forge/osx-64/python-3.13.3-h534c281_101_cp313.conda#ebcc7c42561d8d8b01477020b63218c0 https://conda.anaconda.org/conda-forge/osx-64/brotli-1.1.0-h00291cd_2.conda#2db0c38a7f2321c5bdaf32b181e832c7 https://conda.anaconda.org/conda-forge/noarch/colorama-0.4.6-pyhd8ed1ab_1.conda#962b9857ee8e7018c22f2776ffa0b2d7 https://conda.anaconda.org/conda-forge/noarch/cycler-0.12.1-pyhd8ed1ab_1.conda#44600c4667a319d67dbe0681fc0bc833 @@ -96,7 +96,7 @@ https://conda.anaconda.org/conda-forge/osx-64/ld64-951.9-h4e51db5_6.conda#45bf52 https://conda.anaconda.org/conda-forge/osx-64/liblapacke-3.9.0-20_osx64_mkl.conda#124ae8e384268a8da66f1d64114a1eda https://conda.anaconda.org/conda-forge/osx-64/llvm-tools-18.1.8-default_h3571c67_5.conda#cc07ff74d2547da1f1452c42b67bafd6 https://conda.anaconda.org/conda-forge/noarch/meson-1.7.1-pyhd8ed1ab_0.conda#90018ee73b8741268027421ceac2809a -https://conda.anaconda.org/conda-forge/osx-64/numpy-2.2.4-py313hc518a0f_0.conda#df79d8538f8677bd8a3b6b179e388f48 +https://conda.anaconda.org/conda-forge/osx-64/numpy-2.2.5-py313hc518a0f_0.conda#eba644ccc203cfde2fa1f450f528c70d https://conda.anaconda.org/conda-forge/osx-64/pillow-11.1.0-py313h0c4f865_0.conda#11b4dd7a814202f2a0b655420f1c1c3a https://conda.anaconda.org/conda-forge/noarch/pyproject-metadata-0.9.1-pyhd8ed1ab_0.conda#22ae7c6ea81e0c8661ef32168dda929b https://conda.anaconda.org/conda-forge/noarch/pytest-8.3.5-pyhd8ed1ab_0.conda#c3c9316209dec74a705a36797970c6be @@ -104,7 +104,7 @@ https://conda.anaconda.org/conda-forge/noarch/python-dateutil-2.9.0.post0-pyhff2 https://conda.anaconda.org/conda-forge/osx-64/blas-devel-3.9.0-20_osx64_mkl.conda#cc3260179093918b801e373c6e888e02 https://conda.anaconda.org/conda-forge/osx-64/cctools_osx-64-1010.6-hd19c6af_6.conda#4694e9e497454a8ce5b9fb61e50d9c5d https://conda.anaconda.org/conda-forge/osx-64/clang-18.1.8-default_h576c50e_9.conda#266e7e8fa2190df09e6f236571c91511 -https://conda.anaconda.org/conda-forge/osx-64/contourpy-1.3.1-py313ha0b1807_0.conda#5ae850f4b044294bd7d655228fc236f9 +https://conda.anaconda.org/conda-forge/osx-64/contourpy-1.3.2-py313ha0b1807_0.conda#2c2d1f840df1c512b34e0537ef928169 https://conda.anaconda.org/conda-forge/noarch/meson-python-0.17.1-pyh70fd9c4_1.conda#7a02679229c6c2092571b4c025055440 https://conda.anaconda.org/conda-forge/osx-64/pandas-2.2.3-py313h2e7108f_3.conda#5c37fc7549913fc4895d7d2e097091ed https://conda.anaconda.org/conda-forge/noarch/pytest-cov-6.1.1-pyhd8ed1ab_0.conda#1e35d8f975bc0e984a19819aa91c440a diff --git a/build_tools/azure/pylatest_conda_mkl_no_openmp_osx-64_conda.lock b/build_tools/azure/pylatest_conda_mkl_no_openmp_osx-64_conda.lock index 59c4c570255da..c0d3ba892c505 100644 --- a/build_tools/azure/pylatest_conda_mkl_no_openmp_osx-64_conda.lock +++ b/build_tools/azure/pylatest_conda_mkl_no_openmp_osx-64_conda.lock @@ -16,7 +16,7 @@ https://repo.anaconda.com/pkgs/main/noarch/tzdata-2025a-h04d1e81_0.conda#885caf4 https://repo.anaconda.com/pkgs/main/osx-64/xz-5.6.4-h46256e1_1.conda#ce989a528575ad332a650bb7c7f7e5d5 https://repo.anaconda.com/pkgs/main/osx-64/zlib-1.2.13-h4b97444_1.conda#38e35f7c817fac0973034bfce6706ec2 https://repo.anaconda.com/pkgs/main/osx-64/ccache-3.7.9-hf120daa_0.conda#a01515a32e721c51d631283f991bc8ea -https://repo.anaconda.com/pkgs/main/osx-64/expat-2.6.4-h6d0c2b6_0.conda#337f85e792486001ba7aed0fa2f93e64 +https://repo.anaconda.com/pkgs/main/osx-64/expat-2.7.1-h6d0c2b6_0.conda#6cdc93776b7551083854e7f106a62720 https://repo.anaconda.com/pkgs/main/osx-64/intel-openmp-2023.1.0-ha357a0b_43548.conda#ba8a89ffe593eb88e4c01334753c40c3 https://repo.anaconda.com/pkgs/main/osx-64/lerc-4.0.0-h6d0c2b6_0.conda#824f87854c58df1525557c8639ce7f93 https://repo.anaconda.com/pkgs/main/osx-64/libgfortran5-11.3.0-h9dfd629_28.conda#1fa1a27ee100b1918c3021dbfa3895a3 @@ -32,7 +32,7 @@ https://repo.anaconda.com/pkgs/main/osx-64/libgfortran-5.0.0-11_3_0_hecd8cb5_28. https://repo.anaconda.com/pkgs/main/osx-64/mkl-2023.1.0-h8e150cf_43560.conda#85d0f3431dd5c6ae44f8725fdd3d3e59 https://repo.anaconda.com/pkgs/main/osx-64/sqlite-3.45.3-h6c40b1e_0.conda#2edf909b937b3aad48322c9cb2e8f1a0 https://repo.anaconda.com/pkgs/main/osx-64/zstd-1.5.6-h138b38a_0.conda#f4d15d7d0054d39e6a24fe8d7d1e37c5 -https://repo.anaconda.com/pkgs/main/osx-64/libtiff-4.5.1-h6fa9cd1_1.conda#3d7e2cea5c733721750160acb997a90b +https://repo.anaconda.com/pkgs/main/osx-64/libtiff-4.7.0-h2dfa3ea_0.conda#82a118ce0139e2bf6f7a99c4cfbd4749 https://repo.anaconda.com/pkgs/main/osx-64/python-3.12.9-hcd54a6c_0.conda#1bf9af06f3e476df1f72e8674a9224df https://repo.anaconda.com/pkgs/main/osx-64/brotli-python-1.0.9-py312h6d0c2b6_9.conda#425936421fe402074163ac3ffe33a060 https://repo.anaconda.com/pkgs/main/osx-64/coverage-7.6.9-py312h46256e1_0.conda#f8c1547bbf522a600ee795901240a7b0 @@ -41,10 +41,10 @@ https://repo.anaconda.com/pkgs/main/noarch/execnet-2.1.1-pyhd3eb1b0_0.conda#b3cb https://repo.anaconda.com/pkgs/main/noarch/iniconfig-1.1.1-pyhd3eb1b0_0.tar.bz2#e40edff2c5708f342cef43c7f280c507 https://repo.anaconda.com/pkgs/main/osx-64/joblib-1.4.2-py312hecd8cb5_0.conda#8ab03dfa447b4e0bfa0bd3d25930f3b6 https://repo.anaconda.com/pkgs/main/osx-64/kiwisolver-1.4.8-py312h6d0c2b6_0.conda#060d4498fcc967a640829cb7e55c95f2 -https://repo.anaconda.com/pkgs/main/osx-64/lcms2-2.16-h4f63f0c_0.conda#2cd61d3449b21735ccca2e09ca2f93ef +https://repo.anaconda.com/pkgs/main/osx-64/lcms2-2.16-h31d93a5_1.conda#42450b66e91caf9ab0672a599e2a7bd0 https://repo.anaconda.com/pkgs/main/osx-64/mkl-service-2.4.0-py312h46256e1_2.conda#04297cb766cabf38613ed6eb4eec85c3 https://repo.anaconda.com/pkgs/main/osx-64/ninja-1.12.1-hecd8cb5_0.conda#ee3b660616ef0fbcbd0096a67c11c94b -https://repo.anaconda.com/pkgs/main/osx-64/openjpeg-2.5.2-hbf2204d_0.conda#8463f11309271a93d615450382761470 +https://repo.anaconda.com/pkgs/main/osx-64/openjpeg-2.5.2-h2d09ccc_1.conda#0f2e221843154b436b5982c695df627b https://repo.anaconda.com/pkgs/main/osx-64/packaging-24.2-py312hecd8cb5_0.conda#76512e47c9c37443444ef0624769f620 https://repo.anaconda.com/pkgs/main/osx-64/pluggy-1.5.0-py312hecd8cb5_0.conda#ca381e438f1dbd7986ac0fa0da70c9d8 https://repo.anaconda.com/pkgs/main/osx-64/pyparsing-3.2.0-py312hecd8cb5_0.conda#e4086daaaed13f68cc8d5b9da7db73cc @@ -58,7 +58,7 @@ https://repo.anaconda.com/pkgs/main/osx-64/unicodedata2-15.1.0-py312h46256e1_1.c https://repo.anaconda.com/pkgs/main/osx-64/wheel-0.45.1-py312hecd8cb5_0.conda#fafb8687668467d8624d2ddd0909bce9 https://repo.anaconda.com/pkgs/main/osx-64/fonttools-4.55.3-py312h46256e1_0.conda#f7680dd6b8b1c2f8aab17cf6630c6deb https://repo.anaconda.com/pkgs/main/osx-64/numpy-base-1.26.4-py312h6f81483_0.conda#87f73efbf26ab2e2ea7c32481a71bd47 -https://repo.anaconda.com/pkgs/main/osx-64/pillow-11.1.0-py312h47bf62f_0.conda#56484cc67963212898552539482aa6b5 +https://repo.anaconda.com/pkgs/main/osx-64/pillow-11.1.0-py312h935ef2f_1.conda#c2f7a3f027cc93a3626d50b765b75dc5 https://repo.anaconda.com/pkgs/main/osx-64/pip-25.0-py312hecd8cb5_0.conda#ece07a868514de9803e7a3c8aec1909f https://repo.anaconda.com/pkgs/main/osx-64/pytest-8.3.4-py312hecd8cb5_0.conda#b15ee02022967632dfa1672669228bee https://repo.anaconda.com/pkgs/main/osx-64/python-dateutil-2.9.0post0-py312hecd8cb5_2.conda#1047dde28f78127dd9f6121e882926dd diff --git a/build_tools/azure/pylatest_pip_openblas_pandas_linux-64_conda.lock b/build_tools/azure/pylatest_pip_openblas_pandas_linux-64_conda.lock index 764d7be1044d2..85bec89daa016 100644 --- a/build_tools/azure/pylatest_pip_openblas_pandas_linux-64_conda.lock +++ b/build_tools/azure/pylatest_pip_openblas_pandas_linux-64_conda.lock @@ -12,7 +12,7 @@ https://repo.anaconda.com/pkgs/main/linux-64/libstdcxx-ng-11.2.0-h1234567_1.cond https://repo.anaconda.com/pkgs/main/linux-64/_openmp_mutex-5.1-1_gnu.conda#71d281e9c2192cb3fa425655a8defb85 https://repo.anaconda.com/pkgs/main/linux-64/libgcc-ng-11.2.0-h1234567_1.conda#a87728dabf3151fb9cfa990bd2eb0464 https://repo.anaconda.com/pkgs/main/linux-64/bzip2-1.0.8-h5eee18b_6.conda#f21a3ff51c1b271977f53ce956a69297 -https://repo.anaconda.com/pkgs/main/linux-64/expat-2.6.4-h6a678d5_0.conda#3ec804f5b85a66e64b262cc2341dd004 +https://repo.anaconda.com/pkgs/main/linux-64/expat-2.7.1-h6a678d5_0.conda#269942a9f3f943e2e5d8a2516a861f7c https://repo.anaconda.com/pkgs/main/linux-64/libffi-3.4.4-h6a678d5_1.conda#70646cc713f0c43926cfdcfe9b695fe0 https://repo.anaconda.com/pkgs/main/linux-64/libmpdec-4.0.0-h5eee18b_0.conda#feb10f42b1a7b523acbf85461be41a3e https://repo.anaconda.com/pkgs/main/linux-64/libuuid-1.41.5-h5eee18b_0.conda#4a6a2354414c9080327274aa514e5299 @@ -47,8 +47,8 @@ https://repo.anaconda.com/pkgs/main/linux-64/pip-25.0-py313h06a4308_0.conda#cbe2 # pip meson @ https://files.pythonhosted.org/packages/e5/2b/46bda4ef5a7ae4135dbfe27fc0368c44e5a349a897a54fdf2cedb8dcb66e/meson-1.7.2-py3-none-any.whl#sha256=82c6818dc81743c96de3a458f06175776ebfde4081195ea31ea6971838f25e38 # pip networkx @ https://files.pythonhosted.org/packages/b9/54/dd730b32ea14ea797530a4479b2ed46a6fb250f682a9cfb997e968bf0261/networkx-3.4.2-py3-none-any.whl#sha256=df5d4365b724cf81b8c6a7312509d0c22386097011ad1abe274afd5e9d3bbc5f # pip ninja @ https://files.pythonhosted.org/packages/eb/7a/455d2877fe6cf99886849c7f9755d897df32eaf3a0fba47b56e615f880f7/ninja-1.11.1.4-py3-none-manylinux_2_12_x86_64.manylinux2010_x86_64.whl#sha256=096487995473320de7f65d622c3f1d16c3ad174797602218ca8c967f51ec38a0 -# pip numpy @ https://files.pythonhosted.org/packages/4b/04/e208ff3ae3ddfbafc05910f89546382f15a3f10186b1f56bd99f159689c2/numpy-2.2.4-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl#sha256=bce43e386c16898b91e162e5baaad90c4b06f9dcbe36282490032cec98dc8ae7 -# pip packaging @ https://files.pythonhosted.org/packages/88/ef/eb23f262cca3c0c4eb7ab1933c3b1f03d021f2c48f54763065b6f0e321be/packaging-24.2-py3-none-any.whl#sha256=09abb1bccd265c01f4a3aa3f7a7db064b36514d2cba19a2f694fe6150451a759 +# pip numpy @ https://files.pythonhosted.org/packages/aa/fc/ebfd32c3e124e6a1043e19c0ab0769818aa69050ce5589b63d05ff185526/numpy-2.2.5-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl#sha256=2ba321813a00e508d5421104464510cc962a6f791aa2fca1c97b1e65027da80d +# pip packaging @ https://files.pythonhosted.org/packages/20/12/38679034af332785aac8774540895e234f4d07f7545804097de4b666afd8/packaging-25.0-py3-none-any.whl#sha256=29572ef2b1f17581046b3a2227d5c611fb25ec70ca1ba8554b24b0e69331a484 # pip pillow @ https://files.pythonhosted.org/packages/13/eb/2552ecebc0b887f539111c2cd241f538b8ff5891b8903dfe672e997529be/pillow-11.2.1-cp313-cp313-manylinux_2_28_x86_64.whl#sha256=ad275964d52e2243430472fc5d2c2334b4fc3ff9c16cb0a19254e25efa03a155 # pip pluggy @ https://files.pythonhosted.org/packages/88/5f/e351af9a41f866ac3f1fac4ca0613908d9a41741cfcf2228f4ad853b697d/pluggy-1.5.0-py3-none-any.whl#sha256=44e1ad92c8ca002de6377e165f3e0f1be63266ab4d554740532335b9d75ea669 # pip pygments @ https://files.pythonhosted.org/packages/8a/0b/9fcc47d19c48b59121088dd6da2488a49d5f72dacf8262e2790a1d2c7d15/pygments-2.19.1-py3-none-any.whl#sha256=9ea1544ad55cecf4b8242fab6dd35a93bbce657034b0611ee383099054ab6d8c @@ -68,7 +68,7 @@ https://repo.anaconda.com/pkgs/main/linux-64/pip-25.0-py313h06a4308_0.conda#cbe2 # pip tzdata @ https://files.pythonhosted.org/packages/5c/23/c7abc0ca0a1526a0774eca151daeb8de62ec457e77262b66b359c3c7679e/tzdata-2025.2-py2.py3-none-any.whl#sha256=1a403fada01ff9221ca8044d701868fa132215d84beb92242d9acd2147f667a8 # pip urllib3 @ https://files.pythonhosted.org/packages/6b/11/cc635220681e93a0183390e26485430ca2c7b5f9d33b15c74c2861cb8091/urllib3-2.4.0-py3-none-any.whl#sha256=4e16665048960a0900c702d4a66415956a584919c03361cac9f1df5c5dd7e813 # pip array-api-strict @ https://files.pythonhosted.org/packages/fe/c7/a97e26083985b49a7a54006364348cf1c26e5523850b8522a39b02b19715/array_api_strict-2.3.1-py3-none-any.whl#sha256=0ca6988be1c82d2f05b6cd44bc7e14cb390555d1455deb50f431d6d0cf468ded -# pip contourpy @ https://files.pythonhosted.org/packages/9a/e2/30ca086c692691129849198659bf0556d72a757fe2769eb9620a27169296/contourpy-1.3.1-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl#sha256=3ea9924d28fc5586bf0b42d15f590b10c224117e74409dd7a0be3b62b74a501c +# pip contourpy @ https://files.pythonhosted.org/packages/c8/65/5245ce8c548a8422236c13ffcdcdada6a2a812c361e9e0c70548bb40b661/contourpy-1.3.2-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl#sha256=434f0adf84911c924519d2b08fc10491dd282b20bdd3fa8f60fd816ea0b48841 # pip imageio @ https://files.pythonhosted.org/packages/cb/bd/b394387b598ed84d8d0fa90611a90bee0adc2021820ad5729f7ced74a8e2/imageio-2.37.0-py3-none-any.whl#sha256=11efa15b87bc7871b61590326b2d635439acc321cf7f8ce996f812543ce10eed # pip jinja2 @ https://files.pythonhosted.org/packages/62/a1/3d680cbfd5f4b8f15abc1d571870c5fc3e594bb582bc3b64ea099db13e56/jinja2-3.1.6-py3-none-any.whl#sha256=85ece4451f492d0c13c5dd7c13a64681a86afae63a5f347908daf103ce6d2f67 # pip lazy-loader @ https://files.pythonhosted.org/packages/83/60/d497a310bde3f01cb805196ac61b7ad6dc5dcf8dce66634dc34364b20b4f/lazy_loader-0.4-py3-none-any.whl#sha256=342aa8e14d543a154047afb4ba8ef17f5563baad3fc610d7b15b213b0f119efc diff --git a/build_tools/azure/pymin_conda_forge_mkl_win-64_conda.lock b/build_tools/azure/pymin_conda_forge_mkl_win-64_conda.lock index 01d522f9bfdeb..8864953ff84e2 100644 --- a/build_tools/azure/pymin_conda_forge_mkl_win-64_conda.lock +++ b/build_tools/azure/pymin_conda_forge_mkl_win-64_conda.lock @@ -59,7 +59,7 @@ https://conda.anaconda.org/conda-forge/noarch/execnet-2.1.1-pyhd8ed1ab_1.conda#a https://conda.anaconda.org/conda-forge/win-64/freetype-2.13.3-h0b5ce68_0.conda#9c461ed7b07fb360d2c8cfe726c7d521 https://conda.anaconda.org/conda-forge/noarch/iniconfig-2.0.0-pyhd8ed1ab_1.conda#6837f3eff7dcea42ecd714ce1ac2b108 https://conda.anaconda.org/conda-forge/win-64/kiwisolver-1.4.7-py310hc19bc0b_0.conda#50d96539497fc7493cbe469fbb6b8b6e -https://conda.anaconda.org/conda-forge/win-64/libclang13-20.1.2-default_ha5278ca_0.conda#4270e55ba56854c5098a51592e45809a +https://conda.anaconda.org/conda-forge/win-64/libclang13-20.1.3-default_h6e92b77_0.conda#e7530cd4a3b5e3d2348be3d836cb196c https://conda.anaconda.org/conda-forge/win-64/libglib-2.84.1-h7025463_0.conda#6cbaea9075a4f007eb7d0a90bb9a2a09 https://conda.anaconda.org/conda-forge/win-64/libhwloc-2.11.2-default_ha69328c_1001.conda#b87a0ac5ab6495d8225db5dc72dd21cd https://conda.anaconda.org/conda-forge/win-64/libtiff-4.7.0-h797046b_3.conda#defed79ff7a9164ad40320e3f116a138 @@ -99,17 +99,17 @@ https://conda.anaconda.org/conda-forge/win-64/mkl-2024.2.2-h66d3029_15.conda#302 https://conda.anaconda.org/conda-forge/win-64/pillow-11.1.0-py310h9595edc_0.conda#67a38507ac20bd85226fe6dd7ed87462 https://conda.anaconda.org/conda-forge/noarch/pytest-cov-6.1.1-pyhd8ed1ab_0.conda#1e35d8f975bc0e984a19819aa91c440a https://conda.anaconda.org/conda-forge/noarch/pytest-xdist-3.6.1-pyhd8ed1ab_1.conda#59aad4fb37cabc0bacc73cf344612ddd -https://conda.anaconda.org/conda-forge/win-64/harfbuzz-11.0.1-h078c0c3_0.conda#81b86b68c534852535acc9c5cfce7469 +https://conda.anaconda.org/conda-forge/win-64/harfbuzz-11.1.0-h8796e6f_0.conda#dcc4a63f231cc52197c558f5e07e0a69 https://conda.anaconda.org/conda-forge/win-64/libblas-3.9.0-31_h641d27c_mkl.conda#d05563c577fe2f37693a554b3f271e8f https://conda.anaconda.org/conda-forge/win-64/mkl-devel-2024.2.2-h57928b3_15.conda#a85f53093da069c7c657f090e388f3ef https://conda.anaconda.org/conda-forge/win-64/libcblas-3.9.0-31_h5e41251_mkl.conda#43c100b94ad2607382b0cf0f3a6b0bf3 https://conda.anaconda.org/conda-forge/win-64/liblapack-3.9.0-31_h1aa476e_mkl.conda#40b47ee720a185289760960fc6185750 https://conda.anaconda.org/conda-forge/win-64/qt6-main-6.9.0-h83cda92_1.conda#412f970fc305449b6ee626fe9c6638a8 https://conda.anaconda.org/conda-forge/win-64/liblapacke-3.9.0-31_h845c4fa_mkl.conda#003a2041cb07a7cf698f48dd26301273 -https://conda.anaconda.org/conda-forge/win-64/numpy-2.2.4-py310h4987827_0.conda#f345b8969677cf68503d28ce0c28e756 +https://conda.anaconda.org/conda-forge/win-64/numpy-2.2.5-py310h4987827_0.conda#19e9c5868faa8046020ce870a9a9d0fc https://conda.anaconda.org/conda-forge/win-64/pyside6-6.9.0-py310hc1b6536_0.conda#e90c8d8a817b5d63b7785d7d18c99ae0 https://conda.anaconda.org/conda-forge/win-64/blas-devel-3.9.0-31_hfb1a452_mkl.conda#0deeb3d9d6f0e56393c55ef382899010 -https://conda.anaconda.org/conda-forge/win-64/contourpy-1.3.1-py310hc19bc0b_0.conda#741bcc6a07e77d3102aa23c580cad4f0 +https://conda.anaconda.org/conda-forge/win-64/contourpy-1.3.2-py310hc19bc0b_0.conda#039416813b5290e7d100a05bb4326110 https://conda.anaconda.org/conda-forge/win-64/scipy-1.15.2-py310h15c175c_0.conda#81798168111d1021e3d815217c444418 https://conda.anaconda.org/conda-forge/win-64/blas-2.131-mkl.conda#1842bfaa4e349875c47bde1d9871bda6 https://conda.anaconda.org/conda-forge/win-64/matplotlib-base-3.10.1-py310h37e0a56_0.conda#1b78c5c0741473537e39e425ff30ea80 diff --git a/build_tools/azure/pymin_conda_forge_openblas_min_dependencies_linux-64_conda.lock b/build_tools/azure/pymin_conda_forge_openblas_min_dependencies_linux-64_conda.lock index 5e4e600dc28d0..59a692a4ee985 100644 --- a/build_tools/azure/pymin_conda_forge_openblas_min_dependencies_linux-64_conda.lock +++ b/build_tools/azure/pymin_conda_forge_openblas_min_dependencies_linux-64_conda.lock @@ -12,12 +12,12 @@ https://conda.anaconda.org/conda-forge/noarch/tzdata-2025b-h78e105d_0.conda#4222 https://conda.anaconda.org/conda-forge/noarch/fonts-conda-forge-1-0.tar.bz2#f766549260d6815b0c52253f1fb1bb29 https://conda.anaconda.org/conda-forge/linux-64/ld_impl_linux-64-2.43-h712a8e2_4.conda#01f8d123c96816249efd255a31ad7712 https://conda.anaconda.org/conda-forge/linux-64/libglvnd-1.7.0-ha4b6fd6_2.conda#434ca7e50e40f4918ab701e3facd59a0 -https://conda.anaconda.org/conda-forge/linux-64/llvm-openmp-20.1.2-h024ca30_1.conda#39a3992c2624b8d8e6b4994dedf3102a +https://conda.anaconda.org/conda-forge/linux-64/llvm-openmp-20.1.3-h024ca30_0.conda#c721339ea8746513e42b1233b4bbdfb0 https://conda.anaconda.org/conda-forge/linux-64/_openmp_mutex-4.5-3_kmp_llvm.conda#ee5c2118262e30b972bc0b4db8ef0ba5 https://conda.anaconda.org/conda-forge/noarch/fonts-conda-ecosystem-1-0.tar.bz2#fee5683a3f04bd15cbd8318b096a27ab https://conda.anaconda.org/conda-forge/linux-64/libegl-1.7.0-ha4b6fd6_2.conda#c151d5eb730e9b7480e6d48c0fc44048 https://conda.anaconda.org/conda-forge/linux-64/libgcc-14.2.0-h767d61c_2.conda#ef504d1acbd74b7cc6849ef8af47dd03 -https://conda.anaconda.org/conda-forge/linux-64/alsa-lib-1.2.13-hb9d3cd8_0.conda#ae1370588aa6a5157c34c73e9bbb36a0 +https://conda.anaconda.org/conda-forge/linux-64/alsa-lib-1.2.14-hb9d3cd8_0.conda#76df83c2a9035c54df5d04ff81bcc02d https://conda.anaconda.org/conda-forge/linux-64/gettext-tools-0.23.1-h5888daf_0.conda#2f659535feef3cfb782f7053c8775a32 https://conda.anaconda.org/conda-forge/linux-64/libbrotlicommon-1.1.0-hb9d3cd8_2.conda#41b599ed2b02abcfdd84302bff174b23 https://conda.anaconda.org/conda-forge/linux-64/libdeflate-1.23-h4ddbbb0_0.conda#8dfae1d2e74767e9ce36d5fa0d8605db @@ -39,6 +39,7 @@ https://conda.anaconda.org/conda-forge/linux-64/pthread-stubs-0.4-hb9d3cd8_1002. https://conda.anaconda.org/conda-forge/linux-64/xorg-libice-1.1.2-hb9d3cd8_0.conda#fb901ff28063514abb6046c9ec2c4a45 https://conda.anaconda.org/conda-forge/linux-64/xorg-libxau-1.0.12-hb9d3cd8_0.conda#f6ebe2cb3f82ba6c057dde5d9debe4f7 https://conda.anaconda.org/conda-forge/linux-64/xorg-libxdmcp-1.1.5-hb9d3cd8_0.conda#8035c64cb77ed555e3f150b7b3972480 +https://conda.anaconda.org/conda-forge/linux-64/xorg-libxshmfence-1.3.3-hb9d3cd8_0.conda#9a809ce9f65460195777f2f2116bae02 https://conda.anaconda.org/conda-forge/linux-64/attr-2.5.1-h166bdaf_1.tar.bz2#d9c69a24ad678ffce24c6543a0176b00 https://conda.anaconda.org/conda-forge/linux-64/bzip2-1.0.8-h4bc722e_7.conda#62ee74e96c5ebb0af99386de58cf9553 https://conda.anaconda.org/conda-forge/linux-64/expat-2.7.0-h5888daf_0.conda#d6845ae4dea52a2f90178bf1829a21f8 @@ -51,7 +52,7 @@ https://conda.anaconda.org/conda-forge/linux-64/libedit-3.1.20250104-pl5321h7949 https://conda.anaconda.org/conda-forge/linux-64/libevent-2.1.12-hf998b51_1.conda#a1cfcc585f0c42bf8d5546bb1dfb668d https://conda.anaconda.org/conda-forge/linux-64/libgettextpo-devel-0.23.1-h5888daf_0.conda#7a5d5c245a6807deab87558e9efd3ef0 https://conda.anaconda.org/conda-forge/linux-64/libgfortran-14.2.0-h69a702a_2.conda#fb54c4ea68b460c278d26eea89cfbcc3 -https://conda.anaconda.org/conda-forge/linux-64/libgpg-error-1.53-hbd13f7d_0.conda#95c5d6d9342880f326dec08ab4cd6253 +https://conda.anaconda.org/conda-forge/linux-64/libgpg-error-1.54-hbd13f7d_0.conda#53fab32c797ccdb5bb7a4c147ea154d8 https://conda.anaconda.org/conda-forge/linux-64/libjpeg-turbo-3.0.0-hd590300_1.conda#ea25936bb4080d843790b586850f82b8 https://conda.anaconda.org/conda-forge/linux-64/libnsl-2.0.1-hd590300_0.conda#30fd6e37fe21f86f4bd26d6ee73eeec7 https://conda.anaconda.org/conda-forge/linux-64/libogg-1.3.5-h4ab18f5_0.conda#601bfb4b3c6f0b844443bb81a56651e0 @@ -144,7 +145,7 @@ https://conda.anaconda.org/conda-forge/linux-64/lcms2-2.17-h717163a_0.conda#000e https://conda.anaconda.org/conda-forge/linux-64/libblas-3.9.0-20_linux64_openblas.conda#2b7bb4f7562c8cf334fc2e20c2d28abc https://conda.anaconda.org/conda-forge/linux-64/libflac-1.4.3-h59595ed_0.conda#ee48bf17cc83a00f59ca1494d5646869 https://conda.anaconda.org/conda-forge/linux-64/libgl-1.7.0-ha4b6fd6_2.conda#928b8be80851f5d8ffb016f9c81dae7a -https://conda.anaconda.org/conda-forge/linux-64/libllvm20-20.1.2-ha7bfdaf_0.conda#8354769527f9f441a3a04aa1c19188d9 +https://conda.anaconda.org/conda-forge/linux-64/libllvm20-20.1.3-he9d0ab4_0.conda#74c14fe2ab88e352ab6e4fedf5ecb527 https://conda.anaconda.org/conda-forge/linux-64/libxkbcommon-1.8.1-hc4a0caf_0.conda#e7e5b0652227d646b44abdcbd989da7b https://conda.anaconda.org/conda-forge/noarch/meson-1.7.1-pyhd8ed1ab_0.conda#90018ee73b8741268027421ceac2809a https://conda.anaconda.org/conda-forge/linux-64/openblas-0.3.25-pthreads_h7a3da1a_0.conda#87661673941b5e702275fdf0fc095ad0 @@ -158,10 +159,10 @@ https://conda.anaconda.org/conda-forge/linux-64/sip-6.8.6-py310hf71b8c6_2.conda# https://conda.anaconda.org/conda-forge/linux-64/xorg-libxdamage-1.1.6-hb9d3cd8_0.conda#b5fcc7172d22516e1f965490e65e33a4 https://conda.anaconda.org/conda-forge/linux-64/xorg-libxxf86vm-1.1.6-hb9d3cd8_0.conda#5efa5fa6243a622445fdfd72aee15efa https://conda.anaconda.org/conda-forge/linux-64/glib-2.84.1-h07242d1_0.conda#2c2357f18073331d4aefe7252b9fad17 -https://conda.anaconda.org/conda-forge/linux-64/harfbuzz-11.0.1-h2c12942_0.conda#c90105cecb8bf8248f6666f1f5a40bbb +https://conda.anaconda.org/conda-forge/linux-64/harfbuzz-11.1.0-h3beb420_0.conda#95e3bb97f9cdc251c0c68640e9c10ed3 https://conda.anaconda.org/conda-forge/linux-64/libcblas-3.9.0-20_linux64_openblas.conda#36d486d72ab64ffea932329a1d3729a3 -https://conda.anaconda.org/conda-forge/linux-64/libclang-cpp20.1-20.1.2-default_hb5137d0_0.conda#729198eae19e9dbf8e0ffe355d416bde -https://conda.anaconda.org/conda-forge/linux-64/libclang13-20.1.2-default_h9c6a7e4_0.conda#c5fe177150aecc6ec46609b0a6123f39 +https://conda.anaconda.org/conda-forge/linux-64/libclang-cpp20.1-20.1.3-default_h1df26ce_0.conda#bbce8ba7f25af8b0928f13fca1eb7405 +https://conda.anaconda.org/conda-forge/linux-64/libclang13-20.1.3-default_he06ed0a_0.conda#1bb2ec3c550f7589b2d16e271aeaeddb https://conda.anaconda.org/conda-forge/linux-64/liblapack-3.9.0-20_linux64_openblas.conda#6fabc51f5e647d09cc010c40061557e0 https://conda.anaconda.org/conda-forge/linux-64/libpq-17.4-h27ae623_1.conda#37fba334855ef3b51549308e61ed7a3d https://conda.anaconda.org/conda-forge/linux-64/libsndfile-1.2.2-hc60ed4a_1.conda#ef1910918dd895516a769ed36b5b3a4e @@ -170,12 +171,12 @@ https://conda.anaconda.org/conda-forge/linux-64/pillow-11.1.0-py310h7e6dc6c_0.co https://conda.anaconda.org/conda-forge/linux-64/pyqt5-sip-12.13.0-py310hf71b8c6_1.conda#0c8cbfbe70f4c8a47b040a14615e6f1f https://conda.anaconda.org/conda-forge/noarch/pytest-cov-6.1.1-pyhd8ed1ab_0.conda#1e35d8f975bc0e984a19819aa91c440a https://conda.anaconda.org/conda-forge/noarch/pytest-xdist-3.6.1-pyhd8ed1ab_1.conda#59aad4fb37cabc0bacc73cf344612ddd -https://conda.anaconda.org/conda-forge/linux-64/gstreamer-1.24.7-hf3bb09a_0.conda#c78bc4ef0afb3cd2365d9973c71fc876 +https://conda.anaconda.org/conda-forge/linux-64/gstreamer-1.24.11-hc37bda9_0.conda#056d86cacf2b48c79c6a562a2486eb8c https://conda.anaconda.org/conda-forge/linux-64/liblapacke-3.9.0-20_linux64_openblas.conda#05c5862c7dc25e65ba6c471d96429dae https://conda.anaconda.org/conda-forge/linux-64/numpy-1.22.0-py310h454958d_1.tar.bz2#607c66f0cce2986515a8fe9e136b2b57 https://conda.anaconda.org/conda-forge/linux-64/pulseaudio-client-17.0-hac146a9_1.conda#66b1fa9608d8836e25f9919159adc9c6 https://conda.anaconda.org/conda-forge/linux-64/blas-devel-3.9.0-20_linux64_openblas.conda#9932a1d4e9ecf2d35fb19475446e361e -https://conda.anaconda.org/conda-forge/linux-64/gst-plugins-base-1.24.7-h0a52356_0.conda#d368425fbd031a2f8e801a40c3415c72 +https://conda.anaconda.org/conda-forge/linux-64/gst-plugins-base-1.24.11-h651a532_0.conda#d8d8894f8ced2c9be76dc9ad1ae531ce https://conda.anaconda.org/conda-forge/linux-64/matplotlib-base-3.5.0-py310h23f4a51_0.tar.bz2#9911225650b298776c8e8c083b5cacf1 https://conda.anaconda.org/conda-forge/linux-64/pandas-1.4.0-py310hb5077e9_0.tar.bz2#43e920bc9856daa7d8d18fcbfb244c4e https://conda.anaconda.org/conda-forge/linux-64/polars-0.20.30-py310h031f9ce_0.conda#0743f5db9f978b6df92d412935ff8371 diff --git a/build_tools/azure/pymin_conda_forge_openblas_ubuntu_2204_linux-64_conda.lock b/build_tools/azure/pymin_conda_forge_openblas_ubuntu_2204_linux-64_conda.lock index f038f7831f489..2d03ea55105b4 100644 --- a/build_tools/azure/pymin_conda_forge_openblas_ubuntu_2204_linux-64_conda.lock +++ b/build_tools/azure/pymin_conda_forge_openblas_ubuntu_2204_linux-64_conda.lock @@ -94,7 +94,7 @@ https://conda.anaconda.org/conda-forge/noarch/pytest-8.3.5-pyhd8ed1ab_0.conda#c3 https://conda.anaconda.org/conda-forge/noarch/python-dateutil-2.9.0.post0-pyhff2d567_1.conda#5ba79d7c71f03c678c8ead841f347d6e https://conda.anaconda.org/conda-forge/linux-64/liblapacke-3.9.0-31_he2f377e_openblas.conda#7e5fff7d0db69be3a266f7e79a3bb0e2 https://conda.anaconda.org/conda-forge/noarch/meson-python-0.17.1-pyh70fd9c4_1.conda#7a02679229c6c2092571b4c025055440 -https://conda.anaconda.org/conda-forge/linux-64/numpy-2.2.4-py310hefbff90_0.conda#b3a99849aa14b78d32250c0709e8792a +https://conda.anaconda.org/conda-forge/linux-64/numpy-2.2.5-py310hefbff90_0.conda#5526bc875ec897f0d335e38da832b6ee https://conda.anaconda.org/conda-forge/linux-64/pillow-11.1.0-py310h7e6dc6c_0.conda#14d300b9e1504748e70cc6499a7b4d25 https://conda.anaconda.org/conda-forge/noarch/pytest-xdist-3.6.1-pyhd8ed1ab_1.conda#59aad4fb37cabc0bacc73cf344612ddd https://conda.anaconda.org/conda-forge/linux-64/zstandard-0.23.0-py310ha75aee5_1.conda#0316e8d0e00c00631a6de89207db5b09 diff --git a/build_tools/azure/ubuntu_atlas_lock.txt b/build_tools/azure/ubuntu_atlas_lock.txt index f35c2b1928f52..7e8638c24f938 100644 --- a/build_tools/azure/ubuntu_atlas_lock.txt +++ b/build_tools/azure/ubuntu_atlas_lock.txt @@ -20,7 +20,7 @@ meson-python==0.17.1 # via -r build_tools/azure/ubuntu_atlas_requirements.txt ninja==1.11.1.4 # via -r build_tools/azure/ubuntu_atlas_requirements.txt -packaging==24.2 +packaging==25.0 # via # meson-python # pyproject-metadata diff --git a/build_tools/circle/doc_linux-64_conda.lock b/build_tools/circle/doc_linux-64_conda.lock index 4177ea5dce11a..e5072e7fb278e 100644 --- a/build_tools/circle/doc_linux-64_conda.lock +++ b/build_tools/circle/doc_linux-64_conda.lock @@ -26,7 +26,7 @@ https://conda.anaconda.org/conda-forge/linux-64/libopengl-1.7.0-ha4b6fd6_2.conda https://conda.anaconda.org/conda-forge/linux-64/binutils-2.43-h4852527_4.conda#29782348a527eda3ecfc673109d28e93 https://conda.anaconda.org/conda-forge/linux-64/binutils_linux-64-2.43-h4852527_4.conda#c87e146f5b685672d4aa6b527c6d3b5e https://conda.anaconda.org/conda-forge/linux-64/libgcc-14.2.0-h767d61c_2.conda#ef504d1acbd74b7cc6849ef8af47dd03 -https://conda.anaconda.org/conda-forge/linux-64/alsa-lib-1.2.13-hb9d3cd8_0.conda#ae1370588aa6a5157c34c73e9bbb36a0 +https://conda.anaconda.org/conda-forge/linux-64/alsa-lib-1.2.14-hb9d3cd8_0.conda#76df83c2a9035c54df5d04ff81bcc02d https://conda.anaconda.org/conda-forge/linux-64/libbrotlicommon-1.1.0-hb9d3cd8_2.conda#41b599ed2b02abcfdd84302bff174b23 https://conda.anaconda.org/conda-forge/linux-64/libdeflate-1.23-h4ddbbb0_0.conda#8dfae1d2e74767e9ce36d5fa0d8605db https://conda.anaconda.org/conda-forge/linux-64/libexpat-2.7.0-h5888daf_0.conda#db0bfbe7dd197b68ad5f30333bae6ce0 @@ -56,6 +56,7 @@ https://conda.anaconda.org/conda-forge/linux-64/libbrotlidec-1.1.0-hb9d3cd8_2.co https://conda.anaconda.org/conda-forge/linux-64/libbrotlienc-1.1.0-hb9d3cd8_2.conda#06f70867945ea6a84d35836af780f1de https://conda.anaconda.org/conda-forge/linux-64/libedit-3.1.20250104-pl5321h7949ede_0.conda#c277e0a4d549b03ac1e9d6cbbe3d017b https://conda.anaconda.org/conda-forge/linux-64/libgfortran-14.2.0-h69a702a_2.conda#fb54c4ea68b460c278d26eea89cfbcc3 +https://conda.anaconda.org/conda-forge/linux-64/libhwy-1.2.0-hf40a0c7_0.conda#2f433d593a66044c3f163cb25f0a09de https://conda.anaconda.org/conda-forge/linux-64/libjpeg-turbo-3.0.0-hd590300_1.conda#ea25936bb4080d843790b586850f82b8 https://conda.anaconda.org/conda-forge/linux-64/libnsl-2.0.1-hd590300_0.conda#30fd6e37fe21f86f4bd26d6ee73eeec7 https://conda.anaconda.org/conda-forge/linux-64/libpciaccess-0.18-hd590300_0.conda#48f4330bfcd959c3cfb704d424903c82 @@ -90,7 +91,7 @@ https://conda.anaconda.org/conda-forge/linux-64/krb5-1.21.3-h659f571_0.conda#3f4 https://conda.anaconda.org/conda-forge/linux-64/lerc-4.0.0-h27087fc_0.tar.bz2#76bbff344f0134279f225174e9064c8f https://conda.anaconda.org/conda-forge/linux-64/libaec-1.1.3-h59595ed_0.conda#5e97e271911b8b2001a8b71860c32faa https://conda.anaconda.org/conda-forge/linux-64/libdrm-2.4.124-hb9d3cd8_0.conda#8bc89311041d7fcb510238cf0848ccae -https://conda.anaconda.org/conda-forge/linux-64/libhwy-1.1.0-h00ab1b0_0.conda#88928158ccfe797eac29ef5e03f7d23d +https://conda.anaconda.org/conda-forge/linux-64/libjxl-0.11.1-h7b0646d_1.conda#959fc2b6c0df7883e070b3fe525219a5 https://conda.anaconda.org/conda-forge/linux-64/libopenblas-0.3.29-pthreads_h94d23a6_0.conda#0a4d0252248ef9a0f88f2ba8b8a08e12 https://conda.anaconda.org/conda-forge/linux-64/libzopfli-1.0.3-h9c3ff4c_0.tar.bz2#c66fe2d123249af7651ebde8984c51c2 https://conda.anaconda.org/conda-forge/linux-64/mysql-libs-9.2.0-he0572af_0.conda#93340b072c393d23c4700a1d40565dca @@ -120,7 +121,7 @@ https://conda.anaconda.org/conda-forge/noarch/exceptiongroup-1.2.2-pyhd8ed1ab_1. https://conda.anaconda.org/conda-forge/noarch/execnet-2.1.1-pyhd8ed1ab_1.conda#a71efeae2c160f6789900ba2631a2c90 https://conda.anaconda.org/conda-forge/linux-64/fontconfig-2.15.0-h7e30c49_1.conda#8f5b0b297b59e1ac160ad4beec99dbee https://conda.anaconda.org/conda-forge/linux-64/gcc-13.3.0-h9576a4e_2.conda#d92e51bf4b6bdbfe45e5884fb0755afe -https://conda.anaconda.org/conda-forge/linux-64/gcc_linux-64-13.3.0-hc28eda2_8.conda#0c56ca4bfe2b04e71fe67652d5aa3079 +https://conda.anaconda.org/conda-forge/linux-64/gcc_linux-64-13.3.0-hc28eda2_10.conda#d151142bbafe5e68ec7fc065c5e6f80c https://conda.anaconda.org/conda-forge/linux-64/gfortran_impl_linux-64-13.3.0-h84c1745_2.conda#4e21ed177b76537067736f20f54fee0a https://conda.anaconda.org/conda-forge/linux-64/gxx_impl_linux-64-13.3.0-hae580e1_2.conda#b55f02540605c322a47719029f8404cc https://conda.anaconda.org/conda-forge/noarch/hpack-4.1.0-pyhd8ed1ab_0.conda#0a802cb9888dd14eeefc611f05c40b6e @@ -134,12 +135,11 @@ https://conda.anaconda.org/conda-forge/linux-64/libblas-3.9.0-31_h59b9bed_openbl https://conda.anaconda.org/conda-forge/linux-64/libcups-2.3.3-h4637d8d_4.conda#d4529f4dff3057982a7617c7ac58fde3 https://conda.anaconda.org/conda-forge/linux-64/libglib-2.84.1-h2ff4ddf_0.conda#0305434da649d4fb48a425e588b79ea6 https://conda.anaconda.org/conda-forge/linux-64/libglx-1.7.0-ha4b6fd6_2.conda#c8013e438185f33b13814c5c488acd5c -https://conda.anaconda.org/conda-forge/linux-64/libjxl-0.11.1-hdb8da77_0.conda#32b23f3487beae7e81495fbc1099ae9e https://conda.anaconda.org/conda-forge/linux-64/libtiff-4.7.0-hd9ff511_3.conda#0ea6510969e1296cc19966fad481f6de https://conda.anaconda.org/conda-forge/linux-64/libxml2-2.13.7-h4bc477f_1.conda#ad1f1f8238834cd3c88ceeaee8da444a https://conda.anaconda.org/conda-forge/linux-64/markupsafe-3.0.2-py310h89163eb_1.conda#8ce3f0332fd6de0d737e2911d329523f https://conda.anaconda.org/conda-forge/noarch/munkres-1.1.4-pyh9f0ad1d_0.tar.bz2#2ba8498c1018c1e9c61eb99b973dfe19 -https://conda.anaconda.org/conda-forge/noarch/narwhals-1.34.1-pyhd8ed1ab_0.conda#38ee2961b442f786de810610de6f6b0e +https://conda.anaconda.org/conda-forge/noarch/narwhals-1.35.0-pyh29332c3_0.conda#86a90869622c2257d2f38be54820109c https://conda.anaconda.org/conda-forge/noarch/networkx-3.4.2-pyh267e887_2.conda#fd40bf7f7f4bc4b647dc8512053d9873 https://conda.anaconda.org/conda-forge/linux-64/openblas-0.3.29-pthreads_h6ec200e_0.conda#7e4d48870b3258bea920d51b7f495a81 https://conda.anaconda.org/conda-forge/noarch/packaging-24.2-pyhd8ed1ab_2.conda#3bfed7e6228ebf2f7b9eaa47f1b4e2aa @@ -179,9 +179,9 @@ https://conda.anaconda.org/conda-forge/linux-64/cffi-1.17.1-py310h8deb56e_0.cond https://conda.anaconda.org/conda-forge/linux-64/dbus-1.13.6-h5008d03_3.tar.bz2#ecfff944ba3960ecb334b9a2663d708d https://conda.anaconda.org/conda-forge/linux-64/fonttools-4.57.0-py310h89163eb_0.conda#34378af82141b3c1725dcdf898b28fc6 https://conda.anaconda.org/conda-forge/linux-64/gfortran-13.3.0-h9576a4e_2.conda#19e6d3c9cde10a0a9a170a684082588e -https://conda.anaconda.org/conda-forge/linux-64/gfortran_linux-64-13.3.0-hb919d3a_8.conda#5fa84c74a45687350aa5d468f64d8024 +https://conda.anaconda.org/conda-forge/linux-64/gfortran_linux-64-13.3.0-hb919d3a_10.conda#7ce070e3329cd10bf79dbed562a21bd4 https://conda.anaconda.org/conda-forge/linux-64/gxx-13.3.0-h9576a4e_2.conda#07e8df00b7cd3084ad3ef598ce32a71c -https://conda.anaconda.org/conda-forge/linux-64/gxx_linux-64-13.3.0-h6834431_8.conda#e66a842289d61d859d6df8589159b07b +https://conda.anaconda.org/conda-forge/linux-64/gxx_linux-64-13.3.0-h6834431_10.conda#9a8ebde471cec5cc9c48f8682f434f92 https://conda.anaconda.org/conda-forge/noarch/h2-4.2.0-pyhd8ed1ab_0.conda#b4754fb1bdcb70c8fd54f918301582c6 https://conda.anaconda.org/conda-forge/noarch/importlib-metadata-8.6.1-pyha770c72_0.conda#f4b39bf00c69f56ac01e020ebfac066c https://conda.anaconda.org/conda-forge/noarch/importlib_resources-6.5.2-pyhd8ed1ab_0.conda#c85c76dc67d75619a92f51dfbce06992 @@ -191,7 +191,7 @@ https://conda.anaconda.org/conda-forge/linux-64/lcms2-2.17-h717163a_0.conda#000e https://conda.anaconda.org/conda-forge/linux-64/libcblas-3.9.0-31_he106b2a_openblas.conda#abb32c727da370c481a1c206f5159ce9 https://conda.anaconda.org/conda-forge/linux-64/libgl-1.7.0-ha4b6fd6_2.conda#928b8be80851f5d8ffb016f9c81dae7a https://conda.anaconda.org/conda-forge/linux-64/liblapack-3.9.0-31_h7ac8fdf_openblas.conda#452b98eafe050ecff932f0ec832dd03f -https://conda.anaconda.org/conda-forge/linux-64/libllvm20-20.1.2-ha7bfdaf_0.conda#8354769527f9f441a3a04aa1c19188d9 +https://conda.anaconda.org/conda-forge/linux-64/libllvm20-20.1.3-he9d0ab4_0.conda#74c14fe2ab88e352ab6e4fedf5ecb527 https://conda.anaconda.org/conda-forge/linux-64/libxkbcommon-1.8.1-hc4a0caf_0.conda#e7e5b0652227d646b44abdcbd989da7b https://conda.anaconda.org/conda-forge/linux-64/libxslt-1.1.39-h76b75d6_0.conda#e71f31f8cfb0a91439f2086fc8aa0461 https://conda.anaconda.org/conda-forge/noarch/memory_profiler-0.61.0-pyhd8ed1ab_1.conda#71abbefb6f3b95e1668cd5e0af3affb9 @@ -211,31 +211,31 @@ https://conda.anaconda.org/conda-forge/linux-64/xorg-libxdamage-1.1.6-hb9d3cd8_0 https://conda.anaconda.org/conda-forge/linux-64/xorg-libxi-1.8.2-hb9d3cd8_0.conda#17dcc85db3c7886650b8908b183d6876 https://conda.anaconda.org/conda-forge/linux-64/xorg-libxrandr-1.5.4-hb9d3cd8_0.conda#2de7f99d6581a4a7adbff607b5c278ca https://conda.anaconda.org/conda-forge/linux-64/xorg-libxxf86vm-1.1.6-hb9d3cd8_0.conda#5efa5fa6243a622445fdfd72aee15efa -https://conda.anaconda.org/conda-forge/noarch/beautifulsoup4-4.13.3-pyha770c72_0.conda#373374a3ed20141090504031dc7b693e +https://conda.anaconda.org/conda-forge/noarch/beautifulsoup4-4.13.4-pyha770c72_0.conda#9f07c4fc992adb2d6c30da7fab3959a7 https://conda.anaconda.org/conda-forge/linux-64/cxx-compiler-1.9.0-h1a2810e_0.conda#1ce8b218d359d9ed0ab481f2a3f3c512 https://conda.anaconda.org/conda-forge/linux-64/fortran-compiler-1.9.0-h36df796_0.conda#cc0cf942201f9d3b0e9654ea02e12486 -https://conda.anaconda.org/conda-forge/linux-64/harfbuzz-11.0.1-h2c12942_0.conda#c90105cecb8bf8248f6666f1f5a40bbb +https://conda.anaconda.org/conda-forge/linux-64/harfbuzz-11.1.0-h3beb420_0.conda#95e3bb97f9cdc251c0c68640e9c10ed3 https://conda.anaconda.org/conda-forge/noarch/importlib-resources-6.5.2-pyhd8ed1ab_0.conda#e376ea42e9ae40f3278b0f79c9bf9826 https://conda.anaconda.org/conda-forge/noarch/lazy-loader-0.4-pyhd8ed1ab_2.conda#d10d9393680734a8febc4b362a4c94f2 -https://conda.anaconda.org/conda-forge/linux-64/libclang-cpp20.1-20.1.2-default_hb5137d0_0.conda#729198eae19e9dbf8e0ffe355d416bde -https://conda.anaconda.org/conda-forge/linux-64/libclang13-20.1.2-default_h9c6a7e4_0.conda#c5fe177150aecc6ec46609b0a6123f39 +https://conda.anaconda.org/conda-forge/linux-64/libclang-cpp20.1-20.1.3-default_h1df26ce_0.conda#bbce8ba7f25af8b0928f13fca1eb7405 +https://conda.anaconda.org/conda-forge/linux-64/libclang13-20.1.3-default_he06ed0a_0.conda#1bb2ec3c550f7589b2d16e271aeaeddb https://conda.anaconda.org/conda-forge/linux-64/liblapacke-3.9.0-31_he2f377e_openblas.conda#7e5fff7d0db69be3a266f7e79a3bb0e2 https://conda.anaconda.org/conda-forge/linux-64/libpq-17.4-h27ae623_1.conda#37fba334855ef3b51549308e61ed7a3d https://conda.anaconda.org/conda-forge/noarch/meson-python-0.17.1-pyh70fd9c4_1.conda#7a02679229c6c2092571b4c025055440 -https://conda.anaconda.org/conda-forge/linux-64/numpy-2.2.4-py310hefbff90_0.conda#b3a99849aa14b78d32250c0709e8792a +https://conda.anaconda.org/conda-forge/linux-64/numpy-2.2.5-py310hefbff90_0.conda#5526bc875ec897f0d335e38da832b6ee https://conda.anaconda.org/conda-forge/linux-64/pillow-11.1.0-py310h7e6dc6c_0.conda#14d300b9e1504748e70cc6499a7b4d25 https://conda.anaconda.org/conda-forge/noarch/pytest-xdist-3.6.1-pyhd8ed1ab_1.conda#59aad4fb37cabc0bacc73cf344612ddd https://conda.anaconda.org/conda-forge/linux-64/xorg-libxtst-1.2.5-hb9d3cd8_3.conda#7bbe9a0cc0df0ac5f5a8ad6d6a11af2f https://conda.anaconda.org/conda-forge/linux-64/zstandard-0.23.0-py310ha75aee5_1.conda#0316e8d0e00c00631a6de89207db5b09 https://conda.anaconda.org/conda-forge/linux-64/blas-devel-3.9.0-31_h1ea3ea9_openblas.conda#ba652ee0576396d4765e567f043c57f9 https://conda.anaconda.org/conda-forge/linux-64/compilers-1.9.0-ha770c72_0.conda#5859096e397aba423340d0bbbb11ec64 -https://conda.anaconda.org/conda-forge/linux-64/contourpy-1.3.1-py310h3788b33_0.conda#f993b13665fc2bb262b30217c815d137 +https://conda.anaconda.org/conda-forge/linux-64/contourpy-1.3.2-py310h3788b33_0.conda#b6420d29123c7c823de168f49ccdfe6a https://conda.anaconda.org/conda-forge/linux-64/imagecodecs-2024.12.30-py310h78a9a29_0.conda#e0c50079904122427bcf52e1afcd1cdb https://conda.anaconda.org/conda-forge/noarch/imageio-2.37.0-pyhfb79c49_0.conda#b5577bc2212219566578fd5af9993af6 https://conda.anaconda.org/conda-forge/noarch/lazy_loader-0.4-pyhd8ed1ab_2.conda#bb0230917e2473c77d615104dbe8a49d https://conda.anaconda.org/conda-forge/linux-64/pandas-2.2.3-py310h5eaa309_3.conda#07697a584fab513ce895c4511f7a2403 https://conda.anaconda.org/conda-forge/noarch/patsy-1.0.1-pyhd8ed1ab_1.conda#ee23fabfd0a8c6b8d6f3729b47b2859d -https://conda.anaconda.org/conda-forge/linux-64/polars-1.27.1-py310hc556931_0.conda#1dad3dbffc95810e4cabca888e2dffab +https://conda.anaconda.org/conda-forge/linux-64/polars-1.27.1-py310h5fb5f9c_1.conda#243bbc7d64dbe250cd5e4f07a61039a5 https://conda.anaconda.org/conda-forge/linux-64/pywavelets-1.8.0-py310hf462985_0.conda#4c441eff2be2e65bd67765c5642051c5 https://conda.anaconda.org/conda-forge/linux-64/qt6-main-6.9.0-h6441bc3_1.conda#4029a8dcb1d97ea241dbe5abfda1fad6 https://conda.anaconda.org/conda-forge/linux-64/scipy-1.15.2-py310h1d65ade_0.conda#8c29cd33b64b2eb78597fa28b5595c8d diff --git a/build_tools/circle/doc_min_dependencies_linux-64_conda.lock b/build_tools/circle/doc_min_dependencies_linux-64_conda.lock index 272568c1ef1e0..a036e24b39f95 100644 --- a/build_tools/circle/doc_min_dependencies_linux-64_conda.lock +++ b/build_tools/circle/doc_min_dependencies_linux-64_conda.lock @@ -16,7 +16,7 @@ https://conda.anaconda.org/conda-forge/noarch/libgcc-devel_linux-64-13.3.0-hc03c https://conda.anaconda.org/conda-forge/linux-64/libglvnd-1.7.0-ha4b6fd6_2.conda#434ca7e50e40f4918ab701e3facd59a0 https://conda.anaconda.org/conda-forge/linux-64/libgomp-14.2.0-h767d61c_2.conda#06d02030237f4d5b3d9a7e7d348fe3c6 https://conda.anaconda.org/conda-forge/noarch/libstdcxx-devel_linux-64-13.3.0-hc03c837_102.conda#aa38de2738c5f4a72a880e3d31ffe8b4 -https://conda.anaconda.org/conda-forge/linux-64/llvm-openmp-20.1.2-h024ca30_1.conda#39a3992c2624b8d8e6b4994dedf3102a +https://conda.anaconda.org/conda-forge/linux-64/llvm-openmp-20.1.3-h024ca30_0.conda#c721339ea8746513e42b1233b4bbdfb0 https://conda.anaconda.org/conda-forge/noarch/sysroot_linux-64-2.17-h0157908_18.conda#460eba7851277ec1fd80a1a24080787a https://conda.anaconda.org/conda-forge/linux-64/_openmp_mutex-4.5-3_kmp_llvm.conda#ee5c2118262e30b972bc0b4db8ef0ba5 https://conda.anaconda.org/conda-forge/linux-64/binutils_impl_linux-64-2.43-h4bf12b8_4.conda#ef67db625ad0d2dce398837102f875ed @@ -25,7 +25,7 @@ https://conda.anaconda.org/conda-forge/linux-64/libegl-1.7.0-ha4b6fd6_2.conda#c1 https://conda.anaconda.org/conda-forge/linux-64/binutils-2.43-h4852527_4.conda#29782348a527eda3ecfc673109d28e93 https://conda.anaconda.org/conda-forge/linux-64/binutils_linux-64-2.43-h4852527_4.conda#c87e146f5b685672d4aa6b527c6d3b5e https://conda.anaconda.org/conda-forge/linux-64/libgcc-14.2.0-h767d61c_2.conda#ef504d1acbd74b7cc6849ef8af47dd03 -https://conda.anaconda.org/conda-forge/linux-64/alsa-lib-1.2.13-hb9d3cd8_0.conda#ae1370588aa6a5157c34c73e9bbb36a0 +https://conda.anaconda.org/conda-forge/linux-64/alsa-lib-1.2.14-hb9d3cd8_0.conda#76df83c2a9035c54df5d04ff81bcc02d https://conda.anaconda.org/conda-forge/linux-64/gettext-tools-0.23.1-h5888daf_0.conda#2f659535feef3cfb782f7053c8775a32 https://conda.anaconda.org/conda-forge/linux-64/libbrotlicommon-1.1.0-hb9d3cd8_2.conda#41b599ed2b02abcfdd84302bff174b23 https://conda.anaconda.org/conda-forge/linux-64/libdeflate-1.23-h4ddbbb0_0.conda#8dfae1d2e74767e9ce36d5fa0d8605db @@ -47,6 +47,7 @@ https://conda.anaconda.org/conda-forge/linux-64/pthread-stubs-0.4-hb9d3cd8_1002. https://conda.anaconda.org/conda-forge/linux-64/xorg-libice-1.1.2-hb9d3cd8_0.conda#fb901ff28063514abb6046c9ec2c4a45 https://conda.anaconda.org/conda-forge/linux-64/xorg-libxau-1.0.12-hb9d3cd8_0.conda#f6ebe2cb3f82ba6c057dde5d9debe4f7 https://conda.anaconda.org/conda-forge/linux-64/xorg-libxdmcp-1.1.5-hb9d3cd8_0.conda#8035c64cb77ed555e3f150b7b3972480 +https://conda.anaconda.org/conda-forge/linux-64/xorg-libxshmfence-1.3.3-hb9d3cd8_0.conda#9a809ce9f65460195777f2f2116bae02 https://conda.anaconda.org/conda-forge/linux-64/attr-2.5.1-h166bdaf_1.tar.bz2#d9c69a24ad678ffce24c6543a0176b00 https://conda.anaconda.org/conda-forge/linux-64/blis-0.9.0-h4ab18f5_2.conda#6f77ba1352b69c4a6f8a6d20def30e4e https://conda.anaconda.org/conda-forge/linux-64/bzip2-1.0.8-h4bc722e_7.conda#62ee74e96c5ebb0af99386de58cf9553 @@ -63,7 +64,8 @@ https://conda.anaconda.org/conda-forge/linux-64/libedit-3.1.20250104-pl5321h7949 https://conda.anaconda.org/conda-forge/linux-64/libevent-2.1.12-hf998b51_1.conda#a1cfcc585f0c42bf8d5546bb1dfb668d https://conda.anaconda.org/conda-forge/linux-64/libgettextpo-devel-0.23.1-h5888daf_0.conda#7a5d5c245a6807deab87558e9efd3ef0 https://conda.anaconda.org/conda-forge/linux-64/libgfortran-14.2.0-h69a702a_2.conda#fb54c4ea68b460c278d26eea89cfbcc3 -https://conda.anaconda.org/conda-forge/linux-64/libgpg-error-1.53-hbd13f7d_0.conda#95c5d6d9342880f326dec08ab4cd6253 +https://conda.anaconda.org/conda-forge/linux-64/libgpg-error-1.54-hbd13f7d_0.conda#53fab32c797ccdb5bb7a4c147ea154d8 +https://conda.anaconda.org/conda-forge/linux-64/libhwy-1.2.0-hf40a0c7_0.conda#2f433d593a66044c3f163cb25f0a09de https://conda.anaconda.org/conda-forge/linux-64/libjpeg-turbo-3.0.0-hd590300_1.conda#ea25936bb4080d843790b586850f82b8 https://conda.anaconda.org/conda-forge/linux-64/libnsl-2.0.1-hd590300_0.conda#30fd6e37fe21f86f4bd26d6ee73eeec7 https://conda.anaconda.org/conda-forge/linux-64/libogg-1.3.5-h4ab18f5_0.conda#601bfb4b3c6f0b844443bb81a56651e0 @@ -107,7 +109,7 @@ https://conda.anaconda.org/conda-forge/linux-64/libcap-2.75-h39aace5_0.conda#c44 https://conda.anaconda.org/conda-forge/linux-64/libdrm-2.4.124-hb9d3cd8_0.conda#8bc89311041d7fcb510238cf0848ccae https://conda.anaconda.org/conda-forge/linux-64/libgcrypt-lib-1.11.0-hb9d3cd8_2.conda#e55712ff40a054134d51b89afca57dbc https://conda.anaconda.org/conda-forge/linux-64/libgfortran-ng-14.2.0-h69a702a_2.conda#4056c857af1a99ee50589a941059ec55 -https://conda.anaconda.org/conda-forge/linux-64/libhwy-1.1.0-h00ab1b0_0.conda#88928158ccfe797eac29ef5e03f7d23d +https://conda.anaconda.org/conda-forge/linux-64/libjxl-0.11.1-h7b0646d_1.conda#959fc2b6c0df7883e070b3fe525219a5 https://conda.anaconda.org/conda-forge/linux-64/libvorbis-1.3.7-h9c3ff4c_0.tar.bz2#309dec04b70a3cc0f1e84a4013683bc0 https://conda.anaconda.org/conda-forge/linux-64/libzopfli-1.0.3-h9c3ff4c_0.tar.bz2#c66fe2d123249af7651ebde8984c51c2 https://conda.anaconda.org/conda-forge/linux-64/mysql-libs-9.0.1-he0572af_6.conda#9802ae6d20982f42c0f5d69008988763 @@ -139,7 +141,7 @@ https://conda.anaconda.org/conda-forge/noarch/execnet-2.1.1-pyhd8ed1ab_1.conda#a https://conda.anaconda.org/conda-forge/linux-64/fontconfig-2.15.0-h7e30c49_1.conda#8f5b0b297b59e1ac160ad4beec99dbee https://conda.anaconda.org/conda-forge/noarch/fsspec-2025.3.2-pyhd8ed1ab_0.conda#9c40692c3d24c7aaf335f673ac09d308 https://conda.anaconda.org/conda-forge/linux-64/gcc-13.3.0-h9576a4e_2.conda#d92e51bf4b6bdbfe45e5884fb0755afe -https://conda.anaconda.org/conda-forge/linux-64/gcc_linux-64-13.3.0-hc28eda2_8.conda#0c56ca4bfe2b04e71fe67652d5aa3079 +https://conda.anaconda.org/conda-forge/linux-64/gcc_linux-64-13.3.0-hc28eda2_10.conda#d151142bbafe5e68ec7fc065c5e6f80c https://conda.anaconda.org/conda-forge/linux-64/gettext-0.23.1-h5888daf_0.conda#0754038c806eae440582da1c3af85577 https://conda.anaconda.org/conda-forge/linux-64/gfortran_impl_linux-64-13.3.0-h84c1745_2.conda#4e21ed177b76537067736f20f54fee0a https://conda.anaconda.org/conda-forge/linux-64/gxx_impl_linux-64-13.3.0-hae580e1_2.conda#b55f02540605c322a47719029f8404cc @@ -154,7 +156,6 @@ https://conda.anaconda.org/conda-forge/linux-64/libcblas-3.9.0-31_hba4ea11_blis. https://conda.anaconda.org/conda-forge/linux-64/libcups-2.3.3-h4637d8d_4.conda#d4529f4dff3057982a7617c7ac58fde3 https://conda.anaconda.org/conda-forge/linux-64/libglib-2.84.1-h2ff4ddf_0.conda#0305434da649d4fb48a425e588b79ea6 https://conda.anaconda.org/conda-forge/linux-64/libglx-1.7.0-ha4b6fd6_2.conda#c8013e438185f33b13814c5c488acd5c -https://conda.anaconda.org/conda-forge/linux-64/libjxl-0.11.1-hdb8da77_0.conda#32b23f3487beae7e81495fbc1099ae9e https://conda.anaconda.org/conda-forge/linux-64/libsystemd0-257.4-h4e0b6ca_1.conda#04bcf3055e51f8dde6fab9672fb9fca0 https://conda.anaconda.org/conda-forge/linux-64/libtiff-4.7.0-hd9ff511_3.conda#0ea6510969e1296cc19966fad481f6de https://conda.anaconda.org/conda-forge/linux-64/libxml2-2.13.7-h4bc477f_1.conda#ad1f1f8238834cd3c88ceeaee8da444a @@ -202,10 +203,10 @@ https://conda.anaconda.org/conda-forge/linux-64/cytoolz-1.0.1-py310ha75aee5_0.co https://conda.anaconda.org/conda-forge/linux-64/dbus-1.13.6-h5008d03_3.tar.bz2#ecfff944ba3960ecb334b9a2663d708d https://conda.anaconda.org/conda-forge/linux-64/fonttools-4.57.0-py310h89163eb_0.conda#34378af82141b3c1725dcdf898b28fc6 https://conda.anaconda.org/conda-forge/linux-64/gfortran-13.3.0-h9576a4e_2.conda#19e6d3c9cde10a0a9a170a684082588e -https://conda.anaconda.org/conda-forge/linux-64/gfortran_linux-64-13.3.0-hb919d3a_8.conda#5fa84c74a45687350aa5d468f64d8024 +https://conda.anaconda.org/conda-forge/linux-64/gfortran_linux-64-13.3.0-hb919d3a_10.conda#7ce070e3329cd10bf79dbed562a21bd4 https://conda.anaconda.org/conda-forge/linux-64/glib-tools-2.84.1-h4833e2c_0.conda#ddc06964296eee2b4070e65415b332fd https://conda.anaconda.org/conda-forge/linux-64/gxx-13.3.0-h9576a4e_2.conda#07e8df00b7cd3084ad3ef598ce32a71c -https://conda.anaconda.org/conda-forge/linux-64/gxx_linux-64-13.3.0-h6834431_8.conda#e66a842289d61d859d6df8589159b07b +https://conda.anaconda.org/conda-forge/linux-64/gxx_linux-64-13.3.0-h6834431_10.conda#9a8ebde471cec5cc9c48f8682f434f92 https://conda.anaconda.org/conda-forge/noarch/h2-4.2.0-pyhd8ed1ab_0.conda#b4754fb1bdcb70c8fd54f918301582c6 https://conda.anaconda.org/conda-forge/noarch/importlib-metadata-8.6.1-pyha770c72_0.conda#f4b39bf00c69f56ac01e020ebfac066c https://conda.anaconda.org/conda-forge/noarch/importlib_resources-6.5.2-pyhd8ed1ab_0.conda#c85c76dc67d75619a92f51dfbce06992 @@ -215,7 +216,7 @@ https://conda.anaconda.org/conda-forge/linux-64/lcms2-2.17-h717163a_0.conda#000e https://conda.anaconda.org/conda-forge/linux-64/libflac-1.4.3-h59595ed_0.conda#ee48bf17cc83a00f59ca1494d5646869 https://conda.anaconda.org/conda-forge/linux-64/libgl-1.7.0-ha4b6fd6_2.conda#928b8be80851f5d8ffb016f9c81dae7a https://conda.anaconda.org/conda-forge/linux-64/libhwloc-2.11.2-default_h0d58e46_1001.conda#804ca9e91bcaea0824a341d55b1684f2 -https://conda.anaconda.org/conda-forge/linux-64/libllvm20-20.1.2-ha7bfdaf_0.conda#8354769527f9f441a3a04aa1c19188d9 +https://conda.anaconda.org/conda-forge/linux-64/libllvm20-20.1.3-he9d0ab4_0.conda#74c14fe2ab88e352ab6e4fedf5ecb527 https://conda.anaconda.org/conda-forge/linux-64/libxkbcommon-1.8.1-hc4a0caf_0.conda#e7e5b0652227d646b44abdcbd989da7b https://conda.anaconda.org/conda-forge/noarch/memory_profiler-0.61.0-pyhd8ed1ab_1.conda#71abbefb6f3b95e1668cd5e0af3affb9 https://conda.anaconda.org/conda-forge/noarch/meson-1.7.1-pyhd8ed1ab_0.conda#90018ee73b8741268027421ceac2809a @@ -231,15 +232,15 @@ https://conda.anaconda.org/conda-forge/linux-64/sip-6.8.6-py310hf71b8c6_2.conda# https://conda.anaconda.org/conda-forge/noarch/typing-extensions-4.13.2-h0e9735f_0.conda#568ed1300869dca0ba09fb750cda5dbb https://conda.anaconda.org/conda-forge/linux-64/xorg-libxdamage-1.1.6-hb9d3cd8_0.conda#b5fcc7172d22516e1f965490e65e33a4 https://conda.anaconda.org/conda-forge/linux-64/xorg-libxxf86vm-1.1.6-hb9d3cd8_0.conda#5efa5fa6243a622445fdfd72aee15efa -https://conda.anaconda.org/conda-forge/noarch/beautifulsoup4-4.13.3-pyha770c72_0.conda#373374a3ed20141090504031dc7b693e +https://conda.anaconda.org/conda-forge/noarch/beautifulsoup4-4.13.4-pyha770c72_0.conda#9f07c4fc992adb2d6c30da7fab3959a7 https://conda.anaconda.org/conda-forge/linux-64/cxx-compiler-1.9.0-h1a2810e_0.conda#1ce8b218d359d9ed0ab481f2a3f3c512 https://conda.anaconda.org/conda-forge/noarch/dask-core-2025.3.0-pyhd8ed1ab_0.conda#36f6cc22457e3d6a6051c5370832f96c https://conda.anaconda.org/conda-forge/linux-64/fortran-compiler-1.9.0-h36df796_0.conda#cc0cf942201f9d3b0e9654ea02e12486 https://conda.anaconda.org/conda-forge/linux-64/glib-2.84.1-h07242d1_0.conda#2c2357f18073331d4aefe7252b9fad17 -https://conda.anaconda.org/conda-forge/linux-64/harfbuzz-11.0.1-h2c12942_0.conda#c90105cecb8bf8248f6666f1f5a40bbb +https://conda.anaconda.org/conda-forge/linux-64/harfbuzz-11.1.0-h3beb420_0.conda#95e3bb97f9cdc251c0c68640e9c10ed3 https://conda.anaconda.org/conda-forge/noarch/importlib-resources-6.5.2-pyhd8ed1ab_0.conda#e376ea42e9ae40f3278b0f79c9bf9826 -https://conda.anaconda.org/conda-forge/linux-64/libclang-cpp20.1-20.1.2-default_hb5137d0_0.conda#729198eae19e9dbf8e0ffe355d416bde -https://conda.anaconda.org/conda-forge/linux-64/libclang13-20.1.2-default_h9c6a7e4_0.conda#c5fe177150aecc6ec46609b0a6123f39 +https://conda.anaconda.org/conda-forge/linux-64/libclang-cpp20.1-20.1.3-default_h1df26ce_0.conda#bbce8ba7f25af8b0928f13fca1eb7405 +https://conda.anaconda.org/conda-forge/linux-64/libclang13-20.1.3-default_he06ed0a_0.conda#1bb2ec3c550f7589b2d16e271aeaeddb https://conda.anaconda.org/conda-forge/linux-64/libpq-17.4-h27ae623_1.conda#37fba334855ef3b51549308e61ed7a3d https://conda.anaconda.org/conda-forge/linux-64/libsndfile-1.2.2-hc60ed4a_1.conda#ef1910918dd895516a769ed36b5b3a4e https://conda.anaconda.org/conda-forge/noarch/meson-python-0.17.1-pyh70fd9c4_1.conda#7a02679229c6c2092571b4c025055440 @@ -249,12 +250,12 @@ https://conda.anaconda.org/conda-forge/noarch/pytest-xdist-3.6.1-pyhd8ed1ab_1.co https://conda.anaconda.org/conda-forge/linux-64/tbb-2021.13.0-hceb3a55_1.conda#ba7726b8df7b9d34ea80e82b097a4893 https://conda.anaconda.org/conda-forge/linux-64/zstandard-0.23.0-py310ha75aee5_1.conda#0316e8d0e00c00631a6de89207db5b09 https://conda.anaconda.org/conda-forge/linux-64/compilers-1.9.0-ha770c72_0.conda#5859096e397aba423340d0bbbb11ec64 -https://conda.anaconda.org/conda-forge/linux-64/gstreamer-1.24.7-hf3bb09a_0.conda#c78bc4ef0afb3cd2365d9973c71fc876 +https://conda.anaconda.org/conda-forge/linux-64/gstreamer-1.24.11-hc37bda9_0.conda#056d86cacf2b48c79c6a562a2486eb8c https://conda.anaconda.org/conda-forge/linux-64/mkl-2024.2.2-ha957f24_16.conda#1459379c79dda834673426504d52b319 https://conda.anaconda.org/conda-forge/linux-64/pulseaudio-client-17.0-hac146a9_1.conda#66b1fa9608d8836e25f9919159adc9c6 https://conda.anaconda.org/conda-forge/noarch/towncrier-24.8.0-pyhd8ed1ab_1.conda#820b6a1ddf590fba253f8204f7200d82 https://conda.anaconda.org/conda-forge/noarch/urllib3-2.4.0-pyhd8ed1ab_0.conda#c1e349028e0052c4eea844e94f773065 -https://conda.anaconda.org/conda-forge/linux-64/gst-plugins-base-1.24.7-h0a52356_0.conda#d368425fbd031a2f8e801a40c3415c72 +https://conda.anaconda.org/conda-forge/linux-64/gst-plugins-base-1.24.11-h651a532_0.conda#d8d8894f8ced2c9be76dc9ad1ae531ce https://conda.anaconda.org/conda-forge/linux-64/liblapack-3.9.0-11_h9f1adc1_netlib.conda#fb4e3a141e4be1caf354a9d81780245b https://conda.anaconda.org/conda-forge/noarch/requests-2.32.3-pyhd8ed1ab_1.conda#a9b9368f3701a417eac9edbcae7cb737 https://conda.anaconda.org/conda-forge/linux-64/liblapacke-3.9.0-11_h0ad7b2f_netlib.conda#06dacf1374982882a6ca02e1fa13efbd diff --git a/build_tools/github/pymin_conda_forge_arm_linux-aarch64_conda.lock b/build_tools/github/pymin_conda_forge_arm_linux-aarch64_conda.lock index 37f445a152de7..2e8387ed491a6 100644 --- a/build_tools/github/pymin_conda_forge_arm_linux-aarch64_conda.lock +++ b/build_tools/github/pymin_conda_forge_arm_linux-aarch64_conda.lock @@ -18,7 +18,7 @@ https://conda.anaconda.org/conda-forge/linux-aarch64/libegl-1.7.0-hd24410f_2.con https://conda.anaconda.org/conda-forge/linux-aarch64/libopengl-1.7.0-hd24410f_2.conda#cf9d12bfab305e48d095a4c79002c922 https://conda.anaconda.org/conda-forge/noarch/fonts-conda-ecosystem-1-0.tar.bz2#fee5683a3f04bd15cbd8318b096a27ab https://conda.anaconda.org/conda-forge/linux-aarch64/libgcc-14.2.0-he277a41_2.conda#6b4268a60b10f29257b51b9b67ff8d76 -https://conda.anaconda.org/conda-forge/linux-aarch64/alsa-lib-1.2.13-h86ecc28_0.conda#f643bb02c4bbcfe7de161a8ca5df530b +https://conda.anaconda.org/conda-forge/linux-aarch64/alsa-lib-1.2.14-h86ecc28_0.conda#a696b24c1b473ecc4774bcb5a6ac6337 https://conda.anaconda.org/conda-forge/linux-aarch64/libbrotlicommon-1.1.0-h86ecc28_2.conda#3ee026955c688f551a9999840cff4c67 https://conda.anaconda.org/conda-forge/linux-aarch64/libdeflate-1.23-h5e3c512_0.conda#7e7ca2607b11b180120cefc2354fc0cb https://conda.anaconda.org/conda-forge/linux-aarch64/libexpat-2.7.0-h5ad3122_0.conda#d41a057e7968705dae8dcb7c8ba2c8dd @@ -123,7 +123,7 @@ https://conda.anaconda.org/conda-forge/linux-aarch64/lcms2-2.17-hc88f144_0.conda https://conda.anaconda.org/conda-forge/linux-aarch64/libcblas-3.9.0-31_hab92f65_openblas.conda#6b81dbae56a519f1ec2f25e0ee2f4334 https://conda.anaconda.org/conda-forge/linux-aarch64/libgl-1.7.0-hd24410f_2.conda#0d00176464ebb25af83d40736a2cd3bb https://conda.anaconda.org/conda-forge/linux-aarch64/liblapack-3.9.0-31_h411afd4_openblas.conda#41dbff5eb805a75c120a7b7a1c744dc2 -https://conda.anaconda.org/conda-forge/linux-aarch64/libllvm20-20.1.2-h2edbd07_0.conda#a6a01576192b8b535047f2aff6563170 +https://conda.anaconda.org/conda-forge/linux-aarch64/libllvm20-20.1.3-h07bd352_0.conda#72d693aa8786a9c14286d6bf6f4d0da7 https://conda.anaconda.org/conda-forge/linux-aarch64/libxkbcommon-1.8.1-h2ef6bd0_0.conda#8abc18afd93162a37d25fd244bf62ab5 https://conda.anaconda.org/conda-forge/linux-aarch64/libxslt-1.1.39-h1cc9640_0.conda#13e1d3f9188e85c6d59a98651aced002 https://conda.anaconda.org/conda-forge/noarch/meson-1.7.1-pyhd8ed1ab_0.conda#90018ee73b8741268027421ceac2809a @@ -140,18 +140,18 @@ https://conda.anaconda.org/conda-forge/linux-aarch64/xorg-libxdamage-1.1.6-h86ec https://conda.anaconda.org/conda-forge/linux-aarch64/xorg-libxi-1.8.2-h57736b2_0.conda#eeee3bdb31c6acde2b81ad1b8c287087 https://conda.anaconda.org/conda-forge/linux-aarch64/xorg-libxrandr-1.5.4-h86ecc28_0.conda#dd3e74283a082381aa3860312e3c721e https://conda.anaconda.org/conda-forge/linux-aarch64/xorg-libxxf86vm-1.1.6-h86ecc28_0.conda#d745faa2d7c15092652e40a22bb261ed -https://conda.anaconda.org/conda-forge/linux-aarch64/harfbuzz-11.0.1-h4b4994d_0.conda#25049801f7464aecad6dcd1e4cd4830c -https://conda.anaconda.org/conda-forge/linux-aarch64/libclang-cpp20.1-20.1.2-default_he324ac1_0.conda#92c39738e932a6e56f4f8e79cf90cbca -https://conda.anaconda.org/conda-forge/linux-aarch64/libclang13-20.1.2-default_h4390ef5_0.conda#1b6fe4be5192efb10a7e8578d29f4cb4 +https://conda.anaconda.org/conda-forge/linux-aarch64/harfbuzz-11.1.0-h405b6a2_0.conda#6fd48c127b76a95ed3858c47fa9db7b0 +https://conda.anaconda.org/conda-forge/linux-aarch64/libclang-cpp20.1-20.1.3-default_h7d4303a_0.conda#c8e8f4cb5f527bfae38e710459cb05a4 +https://conda.anaconda.org/conda-forge/linux-aarch64/libclang13-20.1.3-default_h9e36cb9_0.conda#409dd4c25c875b9b367fe6a203d96ff0 https://conda.anaconda.org/conda-forge/linux-aarch64/liblapacke-3.9.0-31_hc659ca5_openblas.conda#256bb281d78e5b8927ff13a1cde9f6f5 https://conda.anaconda.org/conda-forge/linux-aarch64/libpq-17.4-hf590da8_1.conda#10fdc78be541c9017e2144f86d092aa2 https://conda.anaconda.org/conda-forge/noarch/meson-python-0.17.1-pyh70fd9c4_1.conda#7a02679229c6c2092571b4c025055440 -https://conda.anaconda.org/conda-forge/linux-aarch64/numpy-2.2.4-py310h6e5608f_0.conda#3a7b45aaa7704194b823d2d34b75aad1 +https://conda.anaconda.org/conda-forge/linux-aarch64/numpy-2.2.5-py310h6e5608f_0.conda#5c521c566cbcf058769c613dee3a18d6 https://conda.anaconda.org/conda-forge/linux-aarch64/pillow-11.1.0-py310h34c99de_0.conda#c4fa80647a708505d65573c2353bc216 https://conda.anaconda.org/conda-forge/noarch/pytest-xdist-3.6.1-pyhd8ed1ab_1.conda#59aad4fb37cabc0bacc73cf344612ddd https://conda.anaconda.org/conda-forge/linux-aarch64/xorg-libxtst-1.2.5-h57736b2_3.conda#c05698071b5c8e0da82a282085845860 https://conda.anaconda.org/conda-forge/linux-aarch64/blas-devel-3.9.0-31_h9678261_openblas.conda#a2cc143d7e25e52a915cb320e5b0d592 -https://conda.anaconda.org/conda-forge/linux-aarch64/contourpy-1.3.1-py310hf54e67a_0.conda#4dd4efc74373cb53f9c1191f768a9b45 +https://conda.anaconda.org/conda-forge/linux-aarch64/contourpy-1.3.2-py310hf54e67a_0.conda#779694434d1f0a67c5260db76b7b7907 https://conda.anaconda.org/conda-forge/linux-aarch64/qt6-main-6.9.0-ha483c8b_1.conda#fb32973c68de1f23a7e4de3651442b15 https://conda.anaconda.org/conda-forge/linux-aarch64/scipy-1.15.2-py310hf37559f_0.conda#5c9b72f10d2118d943a5eaaf2f396891 https://conda.anaconda.org/conda-forge/linux-aarch64/blas-2.131-openblas.conda#51c5f346e1ebee750f76066490059df9 From af7df5ced0eb1124df12dd389cc4ef7a9042837e Mon Sep 17 00:00:00 2001 From: Pedro Lopes Date: Mon, 21 Apr 2025 17:16:26 +0100 Subject: [PATCH 076/182] Fix Improve error when categorical_features is an empty list (#31146) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: Pedro Lopes Co-authored-by: Jérémie du Boisberranger --- .../sklearn.inspection/31146.fix.rst | 4 ++++ sklearn/inspection/_partial_dependence.py | 6 ++++++ .../tests/test_partial_dependence.py | 19 +++++++++++++++++++ 3 files changed, 29 insertions(+) create mode 100644 doc/whats_new/upcoming_changes/sklearn.inspection/31146.fix.rst diff --git a/doc/whats_new/upcoming_changes/sklearn.inspection/31146.fix.rst b/doc/whats_new/upcoming_changes/sklearn.inspection/31146.fix.rst new file mode 100644 index 0000000000000..105a5e093e693 --- /dev/null +++ b/doc/whats_new/upcoming_changes/sklearn.inspection/31146.fix.rst @@ -0,0 +1,4 @@ +- :func:`inspection.partial_dependence` now raises an informative error when passing + an empty list as the `categorical_features` parameter. `None` should be used instead + to indicate that no categorical features are present. + By :user:`Pedro Lopes `. \ No newline at end of file diff --git a/sklearn/inspection/_partial_dependence.py b/sklearn/inspection/_partial_dependence.py index 3790eb8a9f78c..82bcc426c489f 100644 --- a/sklearn/inspection/_partial_dependence.py +++ b/sklearn/inspection/_partial_dependence.py @@ -673,6 +673,12 @@ def partial_dependence( is_categorical = [False] * len(features_indices) else: categorical_features = np.asarray(categorical_features) + if categorical_features.size == 0: + raise ValueError( + "Passing an empty list (`[]`) to `categorical_features` is not " + "supported. Use `None` instead to indicate that there are no " + "categorical features." + ) if categorical_features.dtype.kind == "b": # categorical features provided as a list of boolean if categorical_features.size != n_features: diff --git a/sklearn/inspection/tests/test_partial_dependence.py b/sklearn/inspection/tests/test_partial_dependence.py index 25cefe8d7e24f..816fe5512edc4 100644 --- a/sklearn/inspection/tests/test_partial_dependence.py +++ b/sklearn/inspection/tests/test_partial_dependence.py @@ -1196,3 +1196,22 @@ def test_reject_pandas_with_integer_dtype(): warnings.simplefilter("error") partial_dependence(clf, X, features=["a"]) partial_dependence(clf, X, features=["c"], categorical_features=["c"]) + + +def test_partial_dependence_empty_categorical_features(): + """Check that we raise the proper exception when `categorical_features` + is an empty list""" + clf = make_pipeline(StandardScaler(), LogisticRegression()) + clf.fit(iris.data, iris.target) + + with pytest.raises( + ValueError, + match=re.escape( + "Passing an empty list (`[]`) to `categorical_features` is not " + "supported. Use `None` instead to indicate that there are no " + "categorical features." + ), + ): + partial_dependence( + estimator=clf, X=iris.data, features=[0], categorical_features=[] + ) From d8095e67294b3089659606fcc8af13dc4c256cb8 Mon Sep 17 00:00:00 2001 From: Siddharth Bansal Date: Wed, 23 Apr 2025 05:50:11 -0700 Subject: [PATCH 077/182] API Deprecate n_alphas in LinearModelCV in favor of alphas (#30616) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Co-authored-by: Jérémie du Boisberranger --- .../sklearn.linear_model/30616.api.rst | 9 + sklearn/linear_model/_coordinate_descent.py | 156 ++++++++++++--- .../tests/test_coordinate_descent.py | 177 +++++++++++++++--- 3 files changed, 284 insertions(+), 58 deletions(-) create mode 100644 doc/whats_new/upcoming_changes/sklearn.linear_model/30616.api.rst diff --git a/doc/whats_new/upcoming_changes/sklearn.linear_model/30616.api.rst b/doc/whats_new/upcoming_changes/sklearn.linear_model/30616.api.rst new file mode 100644 index 0000000000000..8d0a032fd284f --- /dev/null +++ b/doc/whats_new/upcoming_changes/sklearn.linear_model/30616.api.rst @@ -0,0 +1,9 @@ +The parameter `n_alphas` has been deprecated in the following classes: +:class:`linear_model.ElasticNetCV` and :class:`linear_model.LassoCV` +and :class:`linear_model.MultiTaskElasticNetCV` +and :class:`linear_model.MultiTaskLassoCV`, and will be removed in 1.9. The parameter +`alphas` now supports both integers and array-likes, removing the need for `n_alphas`. +From now on, only `alphas` should be set to either indicate the number of alphas to +automatically generate (int) or to provide a list of alphas (array-like) to test along +the regularization path. +By :user:`Siddharth Bansal `. diff --git a/sklearn/linear_model/_coordinate_descent.py b/sklearn/linear_model/_coordinate_descent.py index 0d196ee2d23eb..4c12a73ead300 100644 --- a/sklearn/linear_model/_coordinate_descent.py +++ b/sklearn/linear_model/_coordinate_descent.py @@ -23,7 +23,7 @@ _raise_for_params, get_routing_for_object, ) -from ..utils._param_validation import Interval, StrOptions, validate_params +from ..utils._param_validation import Hidden, Interval, StrOptions, validate_params from ..utils.extmath import safe_sparse_dot from ..utils.metadata_routing import ( _routing_enabled, @@ -1493,8 +1493,17 @@ class LinearModelCV(MultiOutputMixin, LinearModel, ABC): _parameter_constraints: dict = { "eps": [Interval(Real, 0, None, closed="neither")], - "n_alphas": [Interval(Integral, 1, None, closed="left")], - "alphas": ["array-like", None], + "n_alphas": [ + Interval(Integral, 1, None, closed="left"), + Hidden(StrOptions({"deprecated"})), + ], + # TODO(1.9): remove "warn" and None options. + "alphas": [ + Interval(Integral, 1, None, closed="left"), + "array-like", + None, + Hidden(StrOptions({"warn"})), + ], "fit_intercept": ["boolean"], "precompute": [StrOptions({"auto"}), "array-like", "boolean"], "max_iter": [Interval(Integral, 1, None, closed="left")], @@ -1512,8 +1521,8 @@ class LinearModelCV(MultiOutputMixin, LinearModel, ABC): def __init__( self, eps=1e-3, - n_alphas=100, - alphas=None, + n_alphas="deprecated", + alphas="warn", fit_intercept=True, precompute="auto", max_iter=1000, @@ -1595,6 +1604,40 @@ def fit(self, X, y, sample_weight=None, **params): """ _raise_for_params(params, self, "fit") + # TODO(1.9): remove n_alphas and alphas={"warn", None}; set alphas=100 by + # default. Remove these deprecations messages and use self.alphas directly + # instead of self._alphas. + if self.n_alphas == "deprecated": + self._alphas = 100 + else: + warnings.warn( + "'n_alphas' was deprecated in 1.7 and will be removed in 1.9. " + "'alphas' now accepts an integer value which removes the need to pass " + "'n_alphas'. The default value of 'alphas' will change from None to " + "100 in 1.9. Pass an explicit value to 'alphas' and leave 'n_alphas' " + "to its default value to silence this warning.", + FutureWarning, + ) + self._alphas = self.n_alphas + + if isinstance(self.alphas, str) and self.alphas == "warn": + # - If self.n_alphas == "deprecated", both are left to their default values + # so we don't warn since the future default behavior will be the same as + # the current default behavior. + # - If self.n_alphas != "deprecated", then we already warned about it + # and the warning message mentions the future self.alphas default, so + # no need to warn a second time. + pass + elif self.alphas is None: + warnings.warn( + "'alphas=None' is deprecated and will be removed in 1.9, at which " + "point the default value will be set to 100. Set 'alphas=100' " + "to silence this warning.", + FutureWarning, + ) + else: + self._alphas = self.alphas + # This makes sure that there is no duplication in memory. # Dealing right with copy_X is important in the following: # Multiple functions touch X and subsamples of X and can induce a @@ -1692,7 +1735,6 @@ def fit(self, X, y, sample_weight=None, **params): path_params.pop("cv", None) path_params.pop("n_jobs", None) - alphas = self.alphas n_l1_ratio = len(l1_ratios) check_scalar_alpha = partial( @@ -1702,7 +1744,7 @@ def fit(self, X, y, sample_weight=None, **params): include_boundaries="left", ) - if alphas is None: + if isinstance(self._alphas, Integral): alphas = [ _alpha_grid( X, @@ -1710,7 +1752,7 @@ def fit(self, X, y, sample_weight=None, **params): l1_ratio=l1_ratio, fit_intercept=self.fit_intercept, eps=self.eps, - n_alphas=self.n_alphas, + n_alphas=self._alphas, copy_X=self.copy_X, sample_weight=sample_weight, ) @@ -1718,10 +1760,10 @@ def fit(self, X, y, sample_weight=None, **params): ] else: # Making sure alphas entries are scalars. - for index, alpha in enumerate(alphas): + for index, alpha in enumerate(self._alphas): check_scalar_alpha(alpha, f"alphas[{index}]") # Making sure alphas is properly ordered. - alphas = np.tile(np.sort(alphas)[::-1], (n_l1_ratio, 1)) + alphas = np.tile(np.sort(self._alphas)[::-1], (n_l1_ratio, 1)) # We want n_alphas to be the number of alphas used for each l1_ratio. n_alphas = len(alphas[0]) @@ -1807,7 +1849,7 @@ def fit(self, X, y, sample_weight=None, **params): self.l1_ratio_ = best_l1_ratio self.alpha_ = best_alpha - if self.alphas is None: + if isinstance(self._alphas, Integral): self.alphas_ = np.asarray(alphas) if n_l1_ratio == 1: self.alphas_ = self.alphas_[0] @@ -1897,9 +1939,22 @@ class LassoCV(RegressorMixin, LinearModelCV): n_alphas : int, default=100 Number of alphas along the regularization path. - alphas : array-like, default=None - List of alphas where to compute the models. - If ``None`` alphas are set automatically. + .. deprecated:: 1.7 + `n_alphas` was deprecated in 1.7 and will be removed in 1.9. Use `alphas` + instead. + + alphas : array-like or int, default=None + Values of alphas to test along the regularization path. + If int, `alphas` values are generated automatically. + If array-like, list of alpha values to use. + + .. versionchanged:: 1.7 + `alphas` accepts an integer value which removes the need to pass + `n_alphas`. + + .. deprecated:: 1.7 + `alphas=None` was deprecated in 1.7 and will be removed in 1.9, at which + point the default value will be set to 100. fit_intercept : bool, default=True Whether to calculate the intercept for this model. If set @@ -2049,8 +2104,8 @@ def __init__( self, *, eps=1e-3, - n_alphas=100, - alphas=None, + n_alphas="deprecated", + alphas="warn", fit_intercept=True, precompute="auto", max_iter=1000, @@ -2155,9 +2210,22 @@ class ElasticNetCV(RegressorMixin, LinearModelCV): n_alphas : int, default=100 Number of alphas along the regularization path, used for each l1_ratio. - alphas : array-like, default=None - List of alphas where to compute the models. - If None alphas are set automatically. + .. deprecated:: 1.7 + `n_alphas` was deprecated in 1.7 and will be removed in 1.9. Use `alphas` + instead. + + alphas : array-like or int, default=None + Values of alphas to test along the regularization path, used for each l1_ratio. + If int, `alphas` values are generated automatically. + If array-like, list of alpha values to use. + + .. versionchanged:: 1.7 + `alphas` accepts an integer value which removes the need to pass + `n_alphas`. + + .. deprecated:: 1.7 + `alphas=None` was deprecated in 1.7 and will be removed in 1.9, at which + point the default value will be set to 100. fit_intercept : bool, default=True Whether to calculate the intercept for this model. If set @@ -2326,8 +2394,8 @@ def __init__( *, l1_ratio=0.5, eps=1e-3, - n_alphas=100, - alphas=None, + n_alphas="deprecated", + alphas="warn", fit_intercept=True, precompute="auto", max_iter=1000, @@ -2845,9 +2913,22 @@ class MultiTaskElasticNetCV(RegressorMixin, LinearModelCV): n_alphas : int, default=100 Number of alphas along the regularization path. - alphas : array-like, default=None - List of alphas where to compute the models. - If not provided, set automatically. + .. deprecated:: 1.7 + `n_alphas` was deprecated in 1.7 and will be removed in 1.9. Use `alphas` + instead. + + alphas : array-like or int, default=None + Values of alphas to test along the regularization path, used for each l1_ratio. + If int, `alphas` values are generated automatically. + If array-like, list of alpha values to use. + + .. versionchanged:: 1.7 + `alphas` accepts an integer value which removes the need to pass + `n_alphas`. + + .. deprecated:: 1.7 + `alphas=None` was deprecated in 1.7 and will be removed in 1.9, at which + point the default value will be set to 100. fit_intercept : bool, default=True Whether to calculate the intercept for this model. If set @@ -2991,8 +3072,8 @@ def __init__( *, l1_ratio=0.5, eps=1e-3, - n_alphas=100, - alphas=None, + n_alphas="deprecated", + alphas="warn", fit_intercept=True, max_iter=1000, tol=1e-4, @@ -3088,9 +3169,22 @@ class MultiTaskLassoCV(RegressorMixin, LinearModelCV): n_alphas : int, default=100 Number of alphas along the regularization path. - alphas : array-like, default=None - List of alphas where to compute the models. - If not provided, set automatically. + .. deprecated:: 1.7 + `n_alphas` was deprecated in 1.7 and will be removed in 1.9. Use `alphas` + instead. + + alphas : array-like or int, default=None + Values of alphas to test along the regularization path. + If int, `alphas` values are generated automatically. + If array-like, list of alpha values to use. + + .. versionchanged:: 1.7 + `alphas` accepts an integer value which removes the need to pass + `n_alphas`. + + .. deprecated:: 1.7 + `alphas=None` was deprecated in 1.7 and will be removed in 1.9, at which + point the default value will be set to 100. fit_intercept : bool, default=True Whether to calculate the intercept for this model. If set @@ -3230,8 +3324,8 @@ def __init__( self, *, eps=1e-3, - n_alphas=100, - alphas=None, + n_alphas="deprecated", + alphas="warn", fit_intercept=True, max_iter=1000, tol=1e-4, diff --git a/sklearn/linear_model/tests/test_coordinate_descent.py b/sklearn/linear_model/tests/test_coordinate_descent.py index 2eefe45e068d3..70226210c010d 100644 --- a/sklearn/linear_model/tests/test_coordinate_descent.py +++ b/sklearn/linear_model/tests/test_coordinate_descent.py @@ -244,10 +244,10 @@ def build_dataset(n_samples=50, n_features=200, n_informative_features=10, n_tar def test_lasso_cv(): X, y, X_test, y_test = build_dataset() max_iter = 150 - clf = LassoCV(n_alphas=10, eps=1e-3, max_iter=max_iter, cv=3).fit(X, y) + clf = LassoCV(alphas=10, eps=1e-3, max_iter=max_iter, cv=3).fit(X, y) assert_almost_equal(clf.alpha_, 0.056, 2) - clf = LassoCV(n_alphas=10, eps=1e-3, max_iter=max_iter, precompute=True, cv=3) + clf = LassoCV(alphas=10, eps=1e-3, max_iter=max_iter, precompute=True, cv=3) clf.fit(X, y) assert_almost_equal(clf.alpha_, 0.056, 2) @@ -288,13 +288,13 @@ def test_lasso_cv_positive_constraint(): max_iter = 500 # Ensure the unconstrained fit has a negative coefficient - clf_unconstrained = LassoCV(n_alphas=3, eps=1e-1, max_iter=max_iter, cv=2, n_jobs=1) + clf_unconstrained = LassoCV(alphas=3, eps=1e-1, max_iter=max_iter, cv=2, n_jobs=1) clf_unconstrained.fit(X, y) assert min(clf_unconstrained.coef_) < 0 # On same data, constrained fit has non-negative coefficients clf_constrained = LassoCV( - n_alphas=3, eps=1e-1, max_iter=max_iter, positive=True, cv=2, n_jobs=1 + alphas=3, eps=1e-1, max_iter=max_iter, positive=True, cv=2, n_jobs=1 ) clf_constrained.fit(X, y) assert min(clf_constrained.coef_) >= 0 @@ -480,7 +480,7 @@ def test_enet_path(): # Multi-output/target case X, y, X_test, y_test = build_dataset(n_features=10, n_targets=3) clf = MultiTaskElasticNetCV( - n_alphas=5, eps=2e-3, l1_ratio=[0.5, 0.7], cv=3, max_iter=max_iter + alphas=5, eps=2e-3, l1_ratio=[0.5, 0.7], cv=3, max_iter=max_iter ) ignore_warnings(clf.fit)(X, y) # We are in well-conditioned settings with low noise: we should @@ -491,9 +491,9 @@ def test_enet_path(): # Mono-output should have same cross-validated alpha_ and l1_ratio_ # in both cases. X, y, _, _ = build_dataset(n_features=10) - clf1 = ElasticNetCV(n_alphas=5, eps=2e-3, l1_ratio=[0.5, 0.7]) + clf1 = ElasticNetCV(alphas=5, eps=2e-3, l1_ratio=[0.5, 0.7]) clf1.fit(X, y) - clf2 = MultiTaskElasticNetCV(n_alphas=5, eps=2e-3, l1_ratio=[0.5, 0.7]) + clf2 = MultiTaskElasticNetCV(alphas=5, eps=2e-3, l1_ratio=[0.5, 0.7]) clf2.fit(X, y[:, np.newaxis]) assert_almost_equal(clf1.l1_ratio_, clf2.l1_ratio_) assert_almost_equal(clf1.alpha_, clf2.alpha_) @@ -503,10 +503,10 @@ def test_path_parameters(): X, y, _, _ = build_dataset() max_iter = 100 - clf = ElasticNetCV(n_alphas=50, eps=1e-3, max_iter=max_iter, l1_ratio=0.5, tol=1e-3) + clf = ElasticNetCV(alphas=50, eps=1e-3, max_iter=max_iter, l1_ratio=0.5, tol=1e-3) clf.fit(X, y) # new params assert_almost_equal(0.5, clf.l1_ratio) - assert 50 == clf.n_alphas + assert 50 == clf._alphas assert 50 == len(clf.alphas_) @@ -563,24 +563,24 @@ def test_enet_cv_positive_constraint(): # Ensure the unconstrained fit has a negative coefficient enetcv_unconstrained = ElasticNetCV( - n_alphas=3, eps=1e-1, max_iter=max_iter, cv=2, n_jobs=1 + alphas=3, eps=1e-1, max_iter=max_iter, cv=2, n_jobs=1 ) enetcv_unconstrained.fit(X, y) assert min(enetcv_unconstrained.coef_) < 0 # On same data, constrained fit has non-negative coefficients enetcv_constrained = ElasticNetCV( - n_alphas=3, eps=1e-1, max_iter=max_iter, cv=2, positive=True, n_jobs=1 + alphas=3, eps=1e-1, max_iter=max_iter, cv=2, positive=True, n_jobs=1 ) enetcv_constrained.fit(X, y) assert min(enetcv_constrained.coef_) >= 0 def test_uniform_targets(): - enet = ElasticNetCV(n_alphas=3) - m_enet = MultiTaskElasticNetCV(n_alphas=3) - lasso = LassoCV(n_alphas=3) - m_lasso = MultiTaskLassoCV(n_alphas=3) + enet = ElasticNetCV(alphas=3) + m_enet = MultiTaskElasticNetCV(alphas=3) + lasso = LassoCV(alphas=3) + m_lasso = MultiTaskLassoCV(alphas=3) models_single_task = (enet, lasso) models_multi_task = (m_enet, m_lasso) @@ -691,7 +691,7 @@ def test_multitask_enet_and_lasso_cv(): X, y, _, _ = build_dataset(n_targets=3) clf = MultiTaskElasticNetCV( - n_alphas=10, eps=1e-3, max_iter=200, l1_ratio=[0.3, 0.5], tol=1e-3, cv=3 + alphas=10, eps=1e-3, max_iter=200, l1_ratio=[0.3, 0.5], tol=1e-3, cv=3 ) clf.fit(X, y) assert 0.5 == clf.l1_ratio_ @@ -701,7 +701,7 @@ def test_multitask_enet_and_lasso_cv(): assert (2, 10) == clf.alphas_.shape X, y, _, _ = build_dataset(n_targets=3) - clf = MultiTaskLassoCV(n_alphas=10, eps=1e-3, max_iter=500, tol=1e-3, cv=3) + clf = MultiTaskLassoCV(alphas=10, eps=1e-3, max_iter=500, tol=1e-3, cv=3) clf.fit(X, y) assert (3, X.shape[1]) == clf.coef_.shape assert (3,) == clf.intercept_.shape @@ -712,9 +712,9 @@ def test_multitask_enet_and_lasso_cv(): def test_1d_multioutput_enet_and_multitask_enet_cv(): X, y, _, _ = build_dataset(n_features=10) y = y[:, np.newaxis] - clf = ElasticNetCV(n_alphas=5, eps=2e-3, l1_ratio=[0.5, 0.7]) + clf = ElasticNetCV(alphas=5, eps=2e-3, l1_ratio=[0.5, 0.7]) clf.fit(X, y[:, 0]) - clf1 = MultiTaskElasticNetCV(n_alphas=5, eps=2e-3, l1_ratio=[0.5, 0.7]) + clf1 = MultiTaskElasticNetCV(alphas=5, eps=2e-3, l1_ratio=[0.5, 0.7]) clf1.fit(X, y) assert_almost_equal(clf.l1_ratio_, clf1.l1_ratio_) assert_almost_equal(clf.alpha_, clf1.alpha_) @@ -725,9 +725,9 @@ def test_1d_multioutput_enet_and_multitask_enet_cv(): def test_1d_multioutput_lasso_and_multitask_lasso_cv(): X, y, _, _ = build_dataset(n_features=10) y = y[:, np.newaxis] - clf = LassoCV(n_alphas=5, eps=2e-3) + clf = LassoCV(alphas=5, eps=2e-3) clf.fit(X, y[:, 0]) - clf1 = MultiTaskLassoCV(n_alphas=5, eps=2e-3) + clf1 = MultiTaskLassoCV(alphas=5, eps=2e-3) clf1.fit(X, y) assert_almost_equal(clf.alpha_, clf1.alpha_) assert_almost_equal(clf.coef_, clf1.coef_[0]) @@ -737,16 +737,16 @@ def test_1d_multioutput_lasso_and_multitask_lasso_cv(): @pytest.mark.parametrize("csr_container", CSR_CONTAINERS) def test_sparse_input_dtype_enet_and_lassocv(csr_container): X, y, _, _ = build_dataset(n_features=10) - clf = ElasticNetCV(n_alphas=5) + clf = ElasticNetCV(alphas=5) clf.fit(csr_container(X), y) - clf1 = ElasticNetCV(n_alphas=5) + clf1 = ElasticNetCV(alphas=5) clf1.fit(csr_container(X, dtype=np.float32), y) assert_almost_equal(clf.alpha_, clf1.alpha_, decimal=6) assert_almost_equal(clf.coef_, clf1.coef_, decimal=6) - clf = LassoCV(n_alphas=5) + clf = LassoCV(alphas=5) clf.fit(csr_container(X), y) - clf1 = LassoCV(n_alphas=5) + clf1 = LassoCV(alphas=5) clf1.fit(csr_container(X, dtype=np.float32), y) assert_almost_equal(clf.alpha_, clf1.alpha_, decimal=6) assert_almost_equal(clf.coef_, clf1.coef_, decimal=6) @@ -1210,7 +1210,7 @@ def test_multi_task_lasso_cv_dtype(): X = rng.binomial(1, 0.5, size=(n_samples, n_features)) X = X.astype(int) # make it explicit that X is int y = X[:, [0, 0]].copy() - est = MultiTaskLassoCV(n_alphas=5, fit_intercept=True).fit(X, y) + est = MultiTaskLassoCV(alphas=5, fit_intercept=True).fit(X, y) assert_array_almost_equal(est.coef_, [[1, 0, 0]] * 2, decimal=3) @@ -1478,7 +1478,7 @@ def test_enet_alpha_max_sample_weight(X_is_sparse, fit_intercept, sample_weight) if X_is_sparse: X = sparse.csc_matrix(X) # Test alpha_max makes coefs zero. - reg = ElasticNetCV(n_alphas=1, cv=2, eps=1, fit_intercept=fit_intercept) + reg = ElasticNetCV(alphas=1, cv=2, eps=1, fit_intercept=fit_intercept) reg.fit(X, y, sample_weight=sample_weight) assert_allclose(reg.coef_, 0, atol=1e-5) alpha_max = reg.alpha_ @@ -1680,3 +1680,126 @@ def split(self, X, y=None, groups=None, sample_weight=None): ) estimator = MultiTaskEstimatorCV(cv=splitter) estimator.fit(X, y, sample_weight=sample_weight) + + +# TODO(1.9): remove +@pytest.mark.parametrize( + "Estimator", [LassoCV, ElasticNetCV, MultiTaskLassoCV, MultiTaskElasticNetCV] +) +def test_linear_model_cv_deprecated_n_alphas(Estimator): + """Check the deprecation of n_alphas in favor of alphas.""" + X, y = make_regression(n_targets=2, random_state=42) + + # Asses warning message raised by LinearModelCV when n_alphas is used + with pytest.warns( + FutureWarning, + match="'n_alphas' was deprecated in 1.7 and will be removed in 1.9", + ): + clf = Estimator(n_alphas=5) + if clf._is_multitask(): + clf = clf.fit(X, y) + else: + clf = clf.fit(X, y[:, 0]) + + # Asses no warning message raised when n_alphas is not used + with warnings.catch_warnings(): + warnings.simplefilter("error") + clf = Estimator(alphas=5) + if clf._is_multitask(): + clf = clf.fit(X, y) + else: + clf = clf.fit(X, y[:, 0]) + + +# TODO(1.9): remove +@pytest.mark.parametrize( + "Estimator", [ElasticNetCV, LassoCV, MultiTaskLassoCV, MultiTaskElasticNetCV] +) +def test_linear_model_cv_deprecated_alphas_none(Estimator): + """Check the deprecation of alphas=None.""" + X, y = make_regression(n_targets=2, random_state=42) + + with pytest.warns( + FutureWarning, match="'alphas=None' is deprecated and will be removed in 1.9" + ): + clf = Estimator(alphas=None) + if clf._is_multitask(): + clf.fit(X, y) + else: + clf.fit(X, y[:, 0]) + + +# TODO(1.9): remove +@pytest.mark.parametrize( + "Estimator", [ElasticNetCV, LassoCV, MultiTaskLassoCV, MultiTaskElasticNetCV] +) +def test_linear_model_cv_alphas_n_alphas_unset(Estimator): + """Check that no warning is raised when both n_alphas and alphas are unset.""" + X, y = make_regression(n_targets=2, random_state=42) + + # Asses no warning message raised when n_alphas is not used + with warnings.catch_warnings(): + warnings.simplefilter("error") + clf = Estimator() + if clf._is_multitask(): + clf = clf.fit(X, y) + else: + clf = clf.fit(X, y[:, 0]) + + +# TODO(1.9): remove +@pytest.mark.filterwarnings("ignore:'n_alphas' was deprecated in 1.7") +@pytest.mark.parametrize( + "Estimator", [ElasticNetCV, LassoCV, MultiTaskLassoCV, MultiTaskElasticNetCV] +) +def test_linear_model_cv_alphas(Estimator): + """Check that the behavior of alphas is consistent with n_alphas.""" + X, y = make_regression(n_targets=2, random_state=42) + + # n_alphas is set, alphas is not => n_alphas is used + clf = Estimator(n_alphas=5) + if clf._is_multitask(): + clf.fit(X, y) + else: + clf.fit(X, y[:, 0]) + assert len(clf.alphas_) == 5 + + # n_alphas is set, alphas is set => alphas has priority + clf = Estimator(n_alphas=5, alphas=10) + if clf._is_multitask(): + clf.fit(X, y) + else: + clf.fit(X, y[:, 0]) + assert len(clf.alphas_) == 10 + + # same with alphas array-like + clf = Estimator(n_alphas=5, alphas=np.arange(10)) + if clf._is_multitask(): + clf.fit(X, y) + else: + clf.fit(X, y[:, 0]) + assert len(clf.alphas_) == 10 + + # n_alphas is not set, alphas is set => alphas is used + clf = Estimator(alphas=10) + if clf._is_multitask(): + clf.fit(X, y) + else: + clf.fit(X, y[:, 0]) + assert len(clf.alphas_) == 10 + + # same with alphas array-like + clf = Estimator(alphas=np.arange(10)) + if clf._is_multitask(): + clf.fit(X, y) + else: + clf.fit(X, y[:, 0]) + assert len(clf.alphas_) == 10 + + # both are not set => default = 100 + clf = Estimator() + if clf._is_multitask(): + clf.fit(X, y) + else: + clf.fit(X, y[:, 0]) + assert len(clf.alphas_) == 100 From 7cc6032940f88de614a34133cefea0c504f65c9f Mon Sep 17 00:00:00 2001 From: Luc Rocher Date: Wed, 23 Apr 2025 13:55:25 +0100 Subject: [PATCH 078/182] =?UTF-8?q?FIX=20=E2=80=98sparse=E2=80=99=20kwarg?= =?UTF-8?q?=20was=20not=20used=20by=20fowlkes=5Fmallows=5Fscore=20(#28981)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Co-authored-by: Jérémie du Boisberranger --- .../sklearn.metrics/28981.api.rst | 3 +++ sklearn/metrics/cluster/_supervised.py | 18 +++++++++++++++--- .../metrics/cluster/tests/test_supervised.py | 10 ++++++++++ 3 files changed, 28 insertions(+), 3 deletions(-) create mode 100644 doc/whats_new/upcoming_changes/sklearn.metrics/28981.api.rst diff --git a/doc/whats_new/upcoming_changes/sklearn.metrics/28981.api.rst b/doc/whats_new/upcoming_changes/sklearn.metrics/28981.api.rst new file mode 100644 index 0000000000000..6cc771d6a0d45 --- /dev/null +++ b/doc/whats_new/upcoming_changes/sklearn.metrics/28981.api.rst @@ -0,0 +1,3 @@ +- The `sparse` parameter of :func:`metrics.fowlkes_mallows_score` is deprecated and + will be removed in 1.9. It has no effect. + By :user:`Luc Rocher `. diff --git a/sklearn/metrics/cluster/_supervised.py b/sklearn/metrics/cluster/_supervised.py index cb325ac3addbd..b46c76f9feba6 100644 --- a/sklearn/metrics/cluster/_supervised.py +++ b/sklearn/metrics/cluster/_supervised.py @@ -15,7 +15,7 @@ from scipy import sparse as sp from ...utils._array_api import _max_precision_float_dtype, get_namespace_and_device -from ...utils._param_validation import Interval, StrOptions, validate_params +from ...utils._param_validation import Hidden, Interval, StrOptions, validate_params from ...utils.multiclass import type_of_target from ...utils.validation import check_array, check_consistent_length from ._expected_mutual_info_fast import expected_mutual_information @@ -1178,11 +1178,11 @@ def normalized_mutual_info_score( { "labels_true": ["array-like"], "labels_pred": ["array-like"], - "sparse": ["boolean"], + "sparse": ["boolean", Hidden(StrOptions({"deprecated"}))], }, prefer_skip_nested_validation=True, ) -def fowlkes_mallows_score(labels_true, labels_pred, *, sparse=False): +def fowlkes_mallows_score(labels_true, labels_pred, *, sparse="deprecated"): """Measure the similarity of two clusterings of a set of points. .. versionadded:: 0.18 @@ -1216,6 +1216,10 @@ def fowlkes_mallows_score(labels_true, labels_pred, *, sparse=False): sparse : bool, default=False Compute contingency matrix internally with sparse matrix. + .. deprecated:: 1.7 + The ``sparse`` parameter is deprecated and will be removed in 1.9. It has + no effect. + Returns ------- score : float @@ -1249,6 +1253,14 @@ def fowlkes_mallows_score(labels_true, labels_pred, *, sparse=False): >>> fowlkes_mallows_score([0, 0, 0, 0], [0, 1, 2, 3]) 0.0 """ + # TODO(1.9): remove the sparse parameter + if sparse != "deprecated": + warnings.warn( + "The 'sparse' parameter was deprecated in 1.7 and will be removed in 1.9. " + "It has no effect. Leave it to its default value to silence this warning.", + FutureWarning, + ) + labels_true, labels_pred = check_clusterings(labels_true, labels_pred) (n_samples,) = labels_true.shape diff --git a/sklearn/metrics/cluster/tests/test_supervised.py b/sklearn/metrics/cluster/tests/test_supervised.py index 6c68c0a85f698..7421b726ebe67 100644 --- a/sklearn/metrics/cluster/tests/test_supervised.py +++ b/sklearn/metrics/cluster/tests/test_supervised.py @@ -510,3 +510,13 @@ def test_normalized_mutual_info_score_bounded(average_method): # non constant, non perfect matching labels nmi = normalized_mutual_info_score(labels2, labels3, average_method=average_method) assert 0 <= nmi < 1 + + +# TODO(1.9): remove +@pytest.mark.parametrize("sparse", [True, False]) +def test_fowlkes_mallows_sparse_deprecated(sparse): + """Check deprecation warning for 'sparse' parameter of fowlkes_mallows_score.""" + with pytest.warns( + FutureWarning, match="The 'sparse' parameter was deprecated in 1.7" + ): + fowlkes_mallows_score([0, 1], [1, 1], sparse=sparse) From ec74b2a78a3365fb49b70c12dd4e305cb5ab6be0 Mon Sep 17 00:00:00 2001 From: Marie Sacksick <79304610+MarieSacksick@users.noreply.github.com> Date: Wed, 23 Apr 2025 15:22:58 +0200 Subject: [PATCH 079/182] FEAT rfecv: add support and ranking for each cv and step (#30179) Co-authored-by: MarieS-WiMLDS <79304610+MarieS-WiMLDS@users.noreply.github.com> Co-authored-by: Adrin Jalali --- .../30179.enhancement.rst | 3 ++ .../plot_rfe_with_cross_validation.py | 26 ++++++++++- sklearn/feature_selection/_rfe.py | 46 +++++++++++++++---- sklearn/feature_selection/tests/test_rfe.py | 34 +++++++++++++- 4 files changed, 96 insertions(+), 13 deletions(-) create mode 100644 doc/whats_new/upcoming_changes/sklearn.feature_selection/30179.enhancement.rst diff --git a/doc/whats_new/upcoming_changes/sklearn.feature_selection/30179.enhancement.rst b/doc/whats_new/upcoming_changes/sklearn.feature_selection/30179.enhancement.rst new file mode 100644 index 0000000000000..97e147d81db10 --- /dev/null +++ b/doc/whats_new/upcoming_changes/sklearn.feature_selection/30179.enhancement.rst @@ -0,0 +1,3 @@ +- :class:`feature_selection.RFECV` now gives access to the ranking and support in each + iteration and cv step of feature selection. + By :user:`Marie S. ` diff --git a/examples/feature_selection/plot_rfe_with_cross_validation.py b/examples/feature_selection/plot_rfe_with_cross_validation.py index 4e3e45384e026..16e4a0e9454c5 100644 --- a/examples/feature_selection/plot_rfe_with_cross_validation.py +++ b/examples/feature_selection/plot_rfe_with_cross_validation.py @@ -22,9 +22,12 @@ from sklearn.datasets import make_classification +n_features = 15 +feat_names = [f"feature_{i}" for i in range(15)] + X, y = make_classification( n_samples=500, - n_features=15, + n_features=n_features, n_informative=3, n_redundant=2, n_repeated=0, @@ -71,7 +74,12 @@ import matplotlib.pyplot as plt import pandas as pd -cv_results = pd.DataFrame(rfecv.cv_results_) +data = { + key: value + for key, value in rfecv.cv_results_.items() + if key in ["n_features", "mean_test_score", "std_test_score"] +} +cv_results = pd.DataFrame(data) plt.figure() plt.xlabel("Number of features selected") plt.ylabel("Mean test accuracy") @@ -91,3 +99,17 @@ # cross-validation technique. The test accuracy decreases above 5 selected # features, this is, keeping non-informative features leads to over-fitting and # is therefore detrimental for the statistical performance of the models. + +# %% +import numpy as np + +for i in range(cv.n_splits): + mask = rfecv.cv_results_[f"split{i}_support"][ + rfecv.n_features_ + ] # mask of features selected by the RFE + features_selected = np.ma.compressed(np.ma.masked_array(feat_names, mask=1 - mask)) + print(f"Features selected in fold {i}: {features_selected}") +# %% +# In the five folds, the selected features are consistant. This is good news, +# it means that the selection is stable accross folds, and it confirms that +# these features are the most informative ones. diff --git a/sklearn/feature_selection/_rfe.py b/sklearn/feature_selection/_rfe.py index 1c1a560c42dcf..d2bd78e225a54 100644 --- a/sklearn/feature_selection/_rfe.py +++ b/sklearn/feature_selection/_rfe.py @@ -62,7 +62,7 @@ def _rfe_single_fit(rfe, estimator, X, y, train, test, scorer, routed_params): **fit_params, ) - return rfe.step_scores_, rfe.step_n_features_ + return rfe.step_scores_, rfe.step_support_, rfe.step_ranking_, rfe.step_n_features_ class RFE(SelectorMixin, MetaEstimatorMixin, BaseEstimator): @@ -318,6 +318,8 @@ def _fit(self, X, y, step_score=None, **fit_params): if step_score: self.step_n_features_ = [] self.step_scores_ = [] + self.step_support_ = [] + self.step_ranking_ = [] # Elimination while np.sum(support_) > n_features_to_select: @@ -331,6 +333,14 @@ def _fit(self, X, y, step_score=None, **fit_params): estimator.fit(X[:, features], y, **fit_params) + # Compute step values on the previous selection iteration because + # 'estimator' must use features that have not been eliminated yet + if step_score: + self.step_n_features_.append(len(features)) + self.step_scores_.append(step_score(estimator, features)) + self.step_support_.append(list(support_)) + self.step_ranking_.append(list(ranking_)) + # Get importance and rank them importances = _get_feature_importances( estimator, @@ -345,12 +355,6 @@ def _fit(self, X, y, step_score=None, **fit_params): # Eliminate the worse features threshold = min(step, np.sum(support_) - n_features_to_select) - # Compute step score on the previous selection iteration - # because 'estimator' must use features - # that have not been eliminated yet - if step_score: - self.step_n_features_.append(len(features)) - self.step_scores_.append(step_score(estimator, features)) support_[features[ranks][:threshold]] = False ranking_[np.logical_not(support_)] += 1 @@ -359,10 +363,12 @@ def _fit(self, X, y, step_score=None, **fit_params): self.estimator_ = clone(self.estimator) self.estimator_.fit(X[:, features], y, **fit_params) - # Compute step score when only n_features_to_select features left + # Compute step values when only n_features_to_select features left if step_score: self.step_n_features_.append(len(features)) self.step_scores_.append(step_score(self.estimator_, features)) + self.step_support_.append(support_) + self.step_ranking_.append(ranking_) self.n_features_ = support_.sum() self.support_ = support_ self.ranking_ = ranking_ @@ -674,6 +680,20 @@ class RFECV(RFE): .. versionadded:: 1.5 + split(k)_ranking : ndarray of shape (n_subsets_of_features,) + The cross-validation rankings across (k)th fold. + Selected (i.e., estimated best) features are assigned rank 1. + Illustration in + :ref:`sphx_glr_auto_examples_feature_selection_plot_rfe_with_cross_validation.py` + + .. versionadded:: 1.7 + + split(k)_support : ndarray of shape (n_subsets_of_features,) + The cross-validation supports across (k)th fold. The support + is the mask of selected features. + + .. versionadded:: 1.7 + n_features_ : int The number of selected features with cross-validation. @@ -874,14 +894,16 @@ def fit(self, X, y, *, groups=None, **params): parallel = Parallel(n_jobs=self.n_jobs) func = delayed(_rfe_single_fit) - scores_features = parallel( + step_results = parallel( func(clone(rfe), self.estimator, X, y, train, test, scorer, routed_params) for train, test in cv.split(X, y, **routed_params.splitter.split) ) - scores, step_n_features = zip(*scores_features) + scores, supports, rankings, step_n_features = zip(*step_results) step_n_features_rev = np.array(step_n_features[0])[::-1] scores = np.array(scores) + rankings = np.array(rankings) + supports = np.array(supports) # Reverse order such that lowest number of features is selected in case of tie. scores_sum_rev = np.sum(scores, axis=0)[::-1] @@ -907,10 +929,14 @@ def fit(self, X, y, *, groups=None, **params): # reverse to stay consistent with before scores_rev = scores[:, ::-1] + supports_rev = supports[:, ::-1] + rankings_rev = rankings[:, ::-1] self.cv_results_ = { "mean_test_score": np.mean(scores_rev, axis=0), "std_test_score": np.std(scores_rev, axis=0), **{f"split{i}_test_score": scores_rev[i] for i in range(scores.shape[0])}, + **{f"split{i}_ranking": rankings_rev[i] for i in range(rankings.shape[0])}, + **{f"split{i}_support": supports_rev[i] for i in range(supports.shape[0])}, "n_features": step_n_features_rev, } return self diff --git a/sklearn/feature_selection/tests/test_rfe.py b/sklearn/feature_selection/tests/test_rfe.py index ae11de2fadf59..1f5672545874c 100644 --- a/sklearn/feature_selection/tests/test_rfe.py +++ b/sklearn/feature_selection/tests/test_rfe.py @@ -2,6 +2,7 @@ Testing Recursive feature elimination """ +import re from operator import attrgetter import numpy as np @@ -541,7 +542,11 @@ def test_rfecv_std_and_mean(global_random_seed): rfecv = RFECV(estimator=SVC(kernel="linear")) rfecv.fit(X, y) - split_keys = [key for key in rfecv.cv_results_.keys() if "split" in key] + split_keys = [ + key + for key in rfecv.cv_results_.keys() + if re.search(r"split\d+_test_score", key) + ] cv_scores = np.asarray([rfecv.cv_results_[key] for key in split_keys]) expected_mean = np.mean(cv_scores, axis=0) expected_std = np.std(cv_scores, axis=0) @@ -721,3 +726,30 @@ def test_rfe_with_joblib_threading_backend(global_random_seed): rfe.fit(X, y) assert_array_equal(ranking_ref, rfe.ranking_) + + +def test_results_per_cv_in_rfecv(global_random_seed): + """ + Test that the results of RFECV are consistent across the different folds + in terms of length of the arrays. + """ + X, y = make_classification(random_state=global_random_seed) + + clf = LogisticRegression() + rfecv = RFECV( + estimator=clf, + n_jobs=2, + cv=5, + ) + + rfecv.fit(X, y) + + assert len(rfecv.cv_results_["split1_test_score"]) == len( + rfecv.cv_results_["split2_test_score"] + ) + assert len(rfecv.cv_results_["split1_support"]) == len( + rfecv.cv_results_["split2_support"] + ) + assert len(rfecv.cv_results_["split1_ranking"]) == len( + rfecv.cv_results_["split2_ranking"] + ) From eb40a5f09865659ef1b564247a1b889ac2be5e53 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?J=C3=A9r=C3=A9mie=20du=20Boisberranger?= Date: Thu, 24 Apr 2025 09:51:53 +0200 Subject: [PATCH 080/182] MNT Clean-up deprecations for 1.7: byte labels (#31236) --- sklearn/metrics/tests/test_ranking.py | 9 ++------- sklearn/utils/multiclass.py | 13 ++++--------- sklearn/utils/tests/test_multiclass.py | 10 +++------- 3 files changed, 9 insertions(+), 23 deletions(-) diff --git a/sklearn/metrics/tests/test_ranking.py b/sklearn/metrics/tests/test_ranking.py index 745f12243fa21..7d740249f8aba 100644 --- a/sklearn/metrics/tests/test_ranking.py +++ b/sklearn/metrics/tests/test_ranking.py @@ -873,7 +873,6 @@ def test_binary_clf_curve_implicit_pos_label(curve_func): np.testing.assert_allclose(int_curve_part, float_curve_part) -# TODO(1.7): Update test to check for error when bytes support is removed. @pytest.mark.filterwarnings("ignore:Support for labels represented as bytes") @pytest.mark.parametrize("curve_func", [precision_recall_curve, roc_curve]) @pytest.mark.parametrize("labels_type", ["list", "array"]) @@ -881,12 +880,8 @@ def test_binary_clf_curve_implicit_bytes_pos_label(curve_func, labels_type): # Check that using bytes class labels raises an informative # error for any supported string dtype: labels = _convert_container([b"a", b"b"], labels_type) - msg = ( - "y_true takes value in {b'a', b'b'} and pos_label is not " - "specified: either make y_true take value in {0, 1} or " - "{-1, 1} or pass pos_label explicitly." - ) - with pytest.raises(ValueError, match=msg): + msg = "Support for labels represented as bytes is not supported" + with pytest.raises(TypeError, match=msg): curve_func(labels, [0.0, 1.0]) diff --git a/sklearn/utils/multiclass.py b/sklearn/utils/multiclass.py index 6c089069387be..15d1428ce2ad7 100644 --- a/sklearn/utils/multiclass.py +++ b/sklearn/utils/multiclass.py @@ -358,17 +358,12 @@ def _raise_or_return(): y = check_array(y, dtype=object, **check_y_kwargs) try: - # TODO(1.7): Change to ValueError when byte labels is deprecated. - # labels in bytes format first_row_or_val = y[[0], :] if issparse(y) else y[0] + # labels in bytes format if isinstance(first_row_or_val, bytes): - warnings.warn( - ( - "Support for labels represented as bytes is deprecated in v1.5 and" - " will error in v1.7. Convert the labels to a string or integer" - " format." - ), - FutureWarning, + raise TypeError( + "Support for labels represented as bytes is not supported. Convert " + "the labels to a string or integer format." ) # The old sequence of sequences format if ( diff --git a/sklearn/utils/tests/test_multiclass.py b/sklearn/utils/tests/test_multiclass.py index 9a9cbb1f60bdd..b400d675e5687 100644 --- a/sklearn/utils/tests/test_multiclass.py +++ b/sklearn/utils/tests/test_multiclass.py @@ -602,16 +602,12 @@ def test_ovr_decision_function(): assert_allclose(dec_values, dec_values_one, atol=1e-6) -# TODO(1.7): Change to ValueError when byte labels is deprecated. @pytest.mark.parametrize("input_type", ["list", "array"]) -def test_labels_in_bytes_format(input_type): +def test_labels_in_bytes_format_error(input_type): # check that we raise an error with bytes encoded labels # non-regression test for: # https://github.com/scikit-learn/scikit-learn/issues/16980 target = _convert_container([b"a", b"b"], input_type) - err_msg = ( - "Support for labels represented as bytes is deprecated in v1.5 and will" - " error in v1.7. Convert the labels to a string or integer format." - ) - with pytest.warns(FutureWarning, match=err_msg): + err_msg = "Support for labels represented as bytes is not supported" + with pytest.raises(TypeError, match=err_msg): type_of_target(target) From 5943ab2d304f0d2f9276c5db3c95ab0a68c4023a Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?J=C3=A9r=C3=A9mie=20du=20Boisberranger?= Date: Thu, 24 Apr 2025 09:52:27 +0200 Subject: [PATCH 081/182] MNT Clean-up some leftovers comments (#31237) --- sklearn/ensemble/tests/test_voting.py | 2 -- sklearn/tests/test_docstring_parameters.py | 2 -- 2 files changed, 4 deletions(-) diff --git a/sklearn/ensemble/tests/test_voting.py b/sklearn/ensemble/tests/test_voting.py index 632ca73479623..b9a4b4a55bebd 100644 --- a/sklearn/ensemble/tests/test_voting.py +++ b/sklearn/ensemble/tests/test_voting.py @@ -321,8 +321,6 @@ def test_parallel_fit(global_random_seed): assert_array_almost_equal(eclf1.predict_proba(X), eclf2.predict_proba(X)) -# TODO(1.7): remove warning filter when sample_weight is kwarg only -@pytest.mark.filterwarnings("ignore::FutureWarning") def test_sample_weight(global_random_seed): """Tests sample_weight parameter of VotingClassifier""" clf1 = LogisticRegression(random_state=global_random_seed) diff --git a/sklearn/tests/test_docstring_parameters.py b/sklearn/tests/test_docstring_parameters.py index 6f165f483c66e..b131a953f9a30 100644 --- a/sklearn/tests/test_docstring_parameters.py +++ b/sklearn/tests/test_docstring_parameters.py @@ -51,13 +51,11 @@ ) # functions to ignore args / docstring of -# TODO(1.7): remove "sklearn.utils._joblib" _DOCSTRING_IGNORES = [ "sklearn.utils.deprecation.load_mlcomp", "sklearn.pipeline.make_pipeline", "sklearn.pipeline.make_union", "sklearn.utils.extmath.safe_sparse_dot", - "sklearn.utils._joblib", "HalfBinomialLoss", ] From 7131d9488dfb8edd6ae042caca57dd76523f395b Mon Sep 17 00:00:00 2001 From: Lucy Liu Date: Fri, 25 Apr 2025 18:14:46 +1000 Subject: [PATCH 082/182] DOC Add note about using `_get_namespace_device_dtype_ids` (#31180) --- sklearn/utils/_array_api.py | 2 ++ 1 file changed, 2 insertions(+) diff --git a/sklearn/utils/_array_api.py b/sklearn/utils/_array_api.py index eb5b4128782e1..a9f35516f17b6 100644 --- a/sklearn/utils/_array_api.py +++ b/sklearn/utils/_array_api.py @@ -60,6 +60,8 @@ def yield_namespace_device_dtype_combinations(include_numpy_namespaces=True): """Yield supported namespace, device, dtype tuples for testing. Use this to test that an estimator works with all combinations. + Use in conjunction with `ids=_get_namespace_device_dtype_ids` to give + clearer pytest parametrization ID names. Parameters ---------- From 76eedf4cbe9652e86ed88b8fb201a2ceebdbc24e Mon Sep 17 00:00:00 2001 From: scikit-learn-bot Date: Mon, 28 Apr 2025 10:32:51 +0200 Subject: [PATCH 083/182] :lock: :robot: CI Update lock files for main CI build(s) :lock: :robot: (#31261) Co-authored-by: Lock file bot --- ...latest_conda_forge_mkl_linux-64_conda.lock | 74 ++++++++++--------- ...pylatest_conda_forge_mkl_osx-64_conda.lock | 30 ++++---- ...st_pip_openblas_pandas_linux-64_conda.lock | 2 +- .../pymin_conda_forge_mkl_win-64_conda.lock | 39 +++++----- ...nblas_min_dependencies_linux-64_conda.lock | 40 +++++----- ...e_openblas_ubuntu_2204_linux-64_conda.lock | 28 +++---- build_tools/circle/doc_linux-64_conda.lock | 57 +++++++------- .../doc_min_dependencies_linux-64_conda.lock | 42 ++++++----- ...n_conda_forge_arm_linux-aarch64_conda.lock | 42 ++++++----- 9 files changed, 187 insertions(+), 167 deletions(-) diff --git a/build_tools/azure/pylatest_conda_forge_mkl_linux-64_conda.lock b/build_tools/azure/pylatest_conda_forge_mkl_linux-64_conda.lock index 88f98c018135c..1ea82245f3772 100644 --- a/build_tools/azure/pylatest_conda_forge_mkl_linux-64_conda.lock +++ b/build_tools/azure/pylatest_conda_forge_mkl_linux-64_conda.lock @@ -2,7 +2,6 @@ # platform: linux-64 # input_hash: 15de7a0d1a0d046ada825ffa5ad3547c790bf903bd5d9b03e7c0e9a6a62c680d @EXPLICIT -https://conda.anaconda.org/conda-forge/linux-64/ca-certificates-2025.1.31-hbcca054_0.conda#19f3a56f68d2fd06c516076bff482c52 https://conda.anaconda.org/conda-forge/noarch/font-ttf-dejavu-sans-mono-2.37-hab24e00_0.tar.bz2#0c96522c6bdaed4b1566d11387caaf45 https://conda.anaconda.org/conda-forge/noarch/font-ttf-inconsolata-3.000-h77eed37_0.tar.bz2#34893075a5c9e55cdafac56607368fc6 https://conda.anaconda.org/conda-forge/noarch/font-ttf-source-code-pro-2.038-h77eed37_0.tar.bz2#4d59c254e01d9cde7957100457e2d5fb @@ -10,8 +9,9 @@ https://conda.anaconda.org/conda-forge/noarch/font-ttf-ubuntu-0.83-h77eed37_3.co https://conda.anaconda.org/conda-forge/linux-64/libopentelemetry-cpp-headers-1.20.0-ha770c72_0.conda#96806e6c31dc89253daff2134aeb58f3 https://conda.anaconda.org/conda-forge/linux-64/mkl-include-2024.2.2-ha957f24_16.conda#42b0d14354b5910a9f41e29289914f6b https://conda.anaconda.org/conda-forge/linux-64/nlohmann_json-3.12.0-h3f2d84a_0.conda#d76872d096d063e226482c99337209dc -https://conda.anaconda.org/conda-forge/linux-64/python_abi-3.13-6_cp313.conda#ef1d8e55d61220011cceed0b94a920d2 +https://conda.anaconda.org/conda-forge/noarch/python_abi-3.13-7_cp313.conda#e84b44e6300f1703cb25d29120c5b1d8 https://conda.anaconda.org/conda-forge/noarch/tzdata-2025b-h78e105d_0.conda#4222072737ccff51314b5ece9c7d6f5a +https://conda.anaconda.org/conda-forge/noarch/ca-certificates-2025.4.26-hbd8a1cb_0.conda#95db94f75ba080a22eb623590993167b https://conda.anaconda.org/conda-forge/noarch/fonts-conda-forge-1-0.tar.bz2#f766549260d6815b0c52253f1fb1bb29 https://conda.anaconda.org/conda-forge/linux-64/ld_impl_linux-64-2.43-h712a8e2_4.conda#01f8d123c96816249efd255a31ad7712 https://conda.anaconda.org/conda-forge/linux-64/libglvnd-1.7.0-ha4b6fd6_2.conda#434ca7e50e40f4918ab701e3facd59a0 @@ -25,12 +25,13 @@ https://conda.anaconda.org/conda-forge/linux-64/alsa-lib-1.2.14-hb9d3cd8_0.conda https://conda.anaconda.org/conda-forge/linux-64/aws-c-common-0.12.2-hb9d3cd8_0.conda#bd52f376d1d34d7823a7bf0773be86e8 https://conda.anaconda.org/conda-forge/linux-64/c-ares-1.34.5-hb9d3cd8_0.conda#f7f0d6cc2dc986d42ac2689ec88192be https://conda.anaconda.org/conda-forge/linux-64/libbrotlicommon-1.1.0-hb9d3cd8_2.conda#41b599ed2b02abcfdd84302bff174b23 -https://conda.anaconda.org/conda-forge/linux-64/libdeflate-1.23-h4ddbbb0_0.conda#8dfae1d2e74767e9ce36d5fa0d8605db +https://conda.anaconda.org/conda-forge/linux-64/libdeflate-1.23-h86f0d12_0.conda#27fe770decaf469a53f3e3a6d593067f https://conda.anaconda.org/conda-forge/linux-64/libexpat-2.7.0-h5888daf_0.conda#db0bfbe7dd197b68ad5f30333bae6ce0 https://conda.anaconda.org/conda-forge/linux-64/libffi-3.4.6-h2dba641_1.conda#ede4673863426c0883c0063d853bbd85 https://conda.anaconda.org/conda-forge/linux-64/libgcc-ng-14.2.0-h69a702a_2.conda#a2222a6ada71fb478682efe483ce0f92 https://conda.anaconda.org/conda-forge/linux-64/libgfortran5-14.2.0-hf1ad2bd_2.conda#556a4fdfac7287d349b8f09aba899693 https://conda.anaconda.org/conda-forge/linux-64/libiconv-1.18-h4ce23a2_1.conda#e796ff8ddc598affdf7c173d6145f087 +https://conda.anaconda.org/conda-forge/linux-64/libjpeg-turbo-3.1.0-hb9d3cd8_0.conda#9fa334557db9f63da6c9285fd2a48638 https://conda.anaconda.org/conda-forge/linux-64/liblzma-5.8.1-hb9d3cd8_0.conda#0e87378639676987af32fee53ba32258 https://conda.anaconda.org/conda-forge/linux-64/libntlm-1.8-hb9d3cd8_0.conda#7c7927b404672409d9917d49bff5f2d6 https://conda.anaconda.org/conda-forge/linux-64/libstdcxx-14.2.0-h8f9b012_2.conda#a78c856b6dc6bf4ea8daeb9beaaa3fb0 @@ -44,15 +45,16 @@ https://conda.anaconda.org/conda-forge/linux-64/pthread-stubs-0.4-hb9d3cd8_1002. https://conda.anaconda.org/conda-forge/linux-64/xorg-libice-1.1.2-hb9d3cd8_0.conda#fb901ff28063514abb6046c9ec2c4a45 https://conda.anaconda.org/conda-forge/linux-64/xorg-libxau-1.0.12-hb9d3cd8_0.conda#f6ebe2cb3f82ba6c057dde5d9debe4f7 https://conda.anaconda.org/conda-forge/linux-64/xorg-libxdmcp-1.1.5-hb9d3cd8_0.conda#8035c64cb77ed555e3f150b7b3972480 -https://conda.anaconda.org/conda-forge/linux-64/aws-c-cal-0.8.9-hada3f3f_0.conda#f1bc1f3925e2ff734d4a8a5bb3552b1d +https://conda.anaconda.org/conda-forge/linux-64/aws-c-cal-0.9.0-hada3f3f_0.conda#05a965f6def53dbcb5217945eb0b3689 https://conda.anaconda.org/conda-forge/linux-64/aws-c-compression-0.3.1-hc2d532b_4.conda#4cc4dcd582b2f087d62c70b2d6daa59f https://conda.anaconda.org/conda-forge/linux-64/aws-c-sdkutils-0.2.3-hc2d532b_4.conda#15a1f6fb713b4cd3fee74588b996a846 -https://conda.anaconda.org/conda-forge/linux-64/aws-checksums-0.2.5-hc2d532b_1.conda#47e378813c3451a9eb0948625a18418a +https://conda.anaconda.org/conda-forge/linux-64/aws-checksums-0.2.7-hc2d532b_0.conda#398521f53e58db246658e7cff56d669f https://conda.anaconda.org/conda-forge/linux-64/bzip2-1.0.8-h4bc722e_7.conda#62ee74e96c5ebb0af99386de58cf9553 https://conda.anaconda.org/conda-forge/linux-64/double-conversion-3.3.1-h5888daf_0.conda#bfd56492d8346d669010eccafe0ba058 https://conda.anaconda.org/conda-forge/linux-64/expat-2.7.0-h5888daf_0.conda#d6845ae4dea52a2f90178bf1829a21f8 https://conda.anaconda.org/conda-forge/linux-64/gflags-2.2.2-h5888daf_1005.conda#d411fc29e338efb48c5fd4576d71d881 https://conda.anaconda.org/conda-forge/linux-64/keyutils-1.6.1-h166bdaf_0.tar.bz2#30186d27e2c9fa62b45fb1476b7200e3 +https://conda.anaconda.org/conda-forge/linux-64/lerc-4.0.0-h0aef613_1.conda#9344155d33912347b37f0ae6c410a835 https://conda.anaconda.org/conda-forge/linux-64/libabseil-20250127.1-cxx17_hbbce691_0.conda#00290e549c5c8a32cc271020acc9ec6b https://conda.anaconda.org/conda-forge/linux-64/libbrotlidec-1.1.0-hb9d3cd8_2.conda#9566f0bd264fbd463002e759b8a82401 https://conda.anaconda.org/conda-forge/linux-64/libbrotlienc-1.1.0-hb9d3cd8_2.conda#06f70867945ea6a84d35836af780f1de @@ -60,55 +62,54 @@ https://conda.anaconda.org/conda-forge/linux-64/libedit-3.1.20250104-pl5321h7949 https://conda.anaconda.org/conda-forge/linux-64/libev-4.33-hd590300_2.conda#172bf1cd1ff8629f2b1179945ed45055 https://conda.anaconda.org/conda-forge/linux-64/libevent-2.1.12-hf998b51_1.conda#a1cfcc585f0c42bf8d5546bb1dfb668d https://conda.anaconda.org/conda-forge/linux-64/libgfortran-14.2.0-h69a702a_2.conda#fb54c4ea68b460c278d26eea89cfbcc3 -https://conda.anaconda.org/conda-forge/linux-64/libjpeg-turbo-3.0.0-hd590300_1.conda#ea25936bb4080d843790b586850f82b8 https://conda.anaconda.org/conda-forge/linux-64/libmpdec-4.0.0-h4bc722e_0.conda#aeb98fdeb2e8f25d43ef71fbacbeec80 https://conda.anaconda.org/conda-forge/linux-64/libpciaccess-0.18-hd590300_0.conda#48f4330bfcd959c3cfb704d424903c82 https://conda.anaconda.org/conda-forge/linux-64/libpng-1.6.47-h943b412_0.conda#55199e2ae2c3651f6f9b2a447b47bdc9 https://conda.anaconda.org/conda-forge/linux-64/libsqlite-3.49.1-hee588c1_2.conda#962d6ac93c30b1dfc54c9cccafd1003e -https://conda.anaconda.org/conda-forge/linux-64/libssh2-1.11.1-hf672d98_0.conda#be2de152d8073ef1c01b7728475f2fe7 +https://conda.anaconda.org/conda-forge/linux-64/libssh2-1.11.1-hcf80075_0.conda#eecce068c7e4eddeb169591baac20ac4 https://conda.anaconda.org/conda-forge/linux-64/libstdcxx-ng-14.2.0-h4852527_2.conda#c75da67f045c2627f59e6fcb5f4e3a9b https://conda.anaconda.org/conda-forge/linux-64/libuuid-2.38.1-h0b41bf4_0.conda#40b61aab5c7ba9ff276c41cfffe6b80b https://conda.anaconda.org/conda-forge/linux-64/libxcb-1.17.0-h8a09558_0.conda#92ed62436b625154323d40d5f2f11dd7 https://conda.anaconda.org/conda-forge/linux-64/lz4-c-1.10.0-h5888daf_1.conda#9de5350a85c4a20c685259b889aa6393 https://conda.anaconda.org/conda-forge/linux-64/mysql-common-9.2.0-h266115a_0.conda#db22a0962c953e81a2a679ecb1fc6027 +https://conda.anaconda.org/conda-forge/linux-64/ninja-1.12.1-hff21bea_1.conda#2322531904f27501ee19847b87ba7c64 https://conda.anaconda.org/conda-forge/linux-64/pixman-0.44.2-h29eaf8c_0.conda#5e2a7acfa2c24188af39e7944e1b3604 https://conda.anaconda.org/conda-forge/linux-64/readline-8.2-h8c095d6_2.conda#283b96675859b20a825f8fa30f311446 -https://conda.anaconda.org/conda-forge/linux-64/s2n-1.5.16-hba75a32_1.conda#71ba0cc1e20a573588ea8a4540b56f5b +https://conda.anaconda.org/conda-forge/linux-64/s2n-1.5.17-hba75a32_0.conda#dbb899164b5451c34969e67a35ca17a9 https://conda.anaconda.org/conda-forge/linux-64/sleef-3.8-h1b44611_0.conda#aec4dba5d4c2924730088753f6fa164b https://conda.anaconda.org/conda-forge/linux-64/snappy-1.2.1-h8bd8927_1.conda#3b3e64af585eadfb52bb90b553db5edf https://conda.anaconda.org/conda-forge/linux-64/tk-8.6.13-noxft_h4845f30_101.conda#d453b98d9c83e71da0741bb0ff4d76bc +https://conda.anaconda.org/conda-forge/linux-64/wayland-1.23.1-h3e06ad9_1.conda#a37843723437ba75f42c9270ffe800b1 https://conda.anaconda.org/conda-forge/linux-64/zlib-1.3.1-hb9d3cd8_2.conda#c9f075ab2f33b3bbee9e62d4ad0a6cd8 https://conda.anaconda.org/conda-forge/linux-64/zstd-1.5.7-hb8e6e7a_2.conda#6432cb5d4ac0046c3ac0a8a0f95842f9 -https://conda.anaconda.org/conda-forge/linux-64/aws-c-io-0.18.0-h7b13e6b_1.conda#0344e7cd6658502b7cab405637db97a2 +https://conda.anaconda.org/conda-forge/linux-64/aws-c-io-0.18.1-h1a9f769_2.conda#19221489bff45371c13b983848f79a24 https://conda.anaconda.org/conda-forge/linux-64/brotli-bin-1.1.0-hb9d3cd8_2.conda#c63b5e52939e795ba8d26e35d767a843 -https://conda.anaconda.org/conda-forge/linux-64/freetype-2.13.3-h48d6fc4_0.conda#9ecfd6f2ca17077dd9c2d24770bb9ccd https://conda.anaconda.org/conda-forge/linux-64/glog-0.7.1-hbabe93e_0.conda#ff862eebdfeb2fd048ae9dc92510baca https://conda.anaconda.org/conda-forge/linux-64/gmp-6.3.0-hac33072_2.conda#c94a5994ef49749880a8139cf9afcbe1 https://conda.anaconda.org/conda-forge/linux-64/graphite2-1.3.13-h59595ed_1003.conda#f87c7b7c2cb45f323ffbce941c78ab7c https://conda.anaconda.org/conda-forge/linux-64/icu-75.1-he02047a_0.conda#8b189310083baabfb622af68fd9d3ae3 https://conda.anaconda.org/conda-forge/linux-64/krb5-1.21.3-h659f571_0.conda#3f43953b7d3fb3aaa1d0d0723d91e368 -https://conda.anaconda.org/conda-forge/linux-64/lerc-4.0.0-h27087fc_0.tar.bz2#76bbff344f0134279f225174e9064c8f https://conda.anaconda.org/conda-forge/linux-64/libcrc32c-1.1.2-h9c3ff4c_0.tar.bz2#c965a5aa0d5c1c37ffc62dff36e28400 https://conda.anaconda.org/conda-forge/linux-64/libdrm-2.4.124-hb9d3cd8_0.conda#8bc89311041d7fcb510238cf0848ccae +https://conda.anaconda.org/conda-forge/linux-64/libfreetype6-2.13.3-h48d6fc4_1.conda#3c255be50a506c50765a93a6644f32fe https://conda.anaconda.org/conda-forge/linux-64/libgfortran-ng-14.2.0-h69a702a_2.conda#4056c857af1a99ee50589a941059ec55 https://conda.anaconda.org/conda-forge/linux-64/libnghttp2-1.64.0-h161d5f1_0.conda#19e57602824042dfd0446292ef90488b https://conda.anaconda.org/conda-forge/linux-64/libprotobuf-5.29.3-h501fc15_1.conda#edb86556cf4a0c133e7932a1597ff236 https://conda.anaconda.org/conda-forge/linux-64/libre2-11-2024.07.02-hba17884_3.conda#545e93a513c10603327c76c15485e946 https://conda.anaconda.org/conda-forge/linux-64/libthrift-0.21.0-h0e7cc3e_0.conda#dcb95c0a98ba9ff737f7ae482aef7833 +https://conda.anaconda.org/conda-forge/linux-64/libtiff-4.7.0-hd9ff511_4.conda#6c1028898cf3a2032d9af46689e1b81a https://conda.anaconda.org/conda-forge/linux-64/mysql-libs-9.2.0-he0572af_0.conda#93340b072c393d23c4700a1d40565dca -https://conda.anaconda.org/conda-forge/linux-64/ninja-1.12.1-h297d8ca_0.conda#3aa1c7e292afeff25a0091ddd7c69b72 https://conda.anaconda.org/conda-forge/linux-64/pcre2-10.44-hba22ea6_2.conda#df359c09c41cd186fffb93a2d87aa6f5 https://conda.anaconda.org/conda-forge/linux-64/python-3.13.3-hf636f53_101_cp313.conda#10622e12d649154af0bd76bcf33a7c5c https://conda.anaconda.org/conda-forge/linux-64/qhull-2020.2-h434a139_5.conda#353823361b1d27eb3960efb076dfcaf6 -https://conda.anaconda.org/conda-forge/linux-64/wayland-1.23.1-h3e06ad9_0.conda#0a732427643ae5e0486a727927791da1 https://conda.anaconda.org/conda-forge/linux-64/xcb-util-0.4.1-hb711507_2.conda#8637c3e5821654d0edf97e2b0404b443 https://conda.anaconda.org/conda-forge/linux-64/xcb-util-keysyms-0.4.1-hb711507_0.conda#ad748ccca349aec3e91743e08b5e2b50 https://conda.anaconda.org/conda-forge/linux-64/xcb-util-renderutil-0.3.10-hb711507_0.conda#0e0cbe0564d03a99afd5fd7b362feecd https://conda.anaconda.org/conda-forge/linux-64/xcb-util-wm-0.4.2-hb711507_0.conda#608e0ef8256b81d04456e8d211eee3e8 https://conda.anaconda.org/conda-forge/linux-64/xorg-libsm-1.2.6-he73a12e_0.conda#1c74ff8c35dcadf952a16f752ca5aa49 https://conda.anaconda.org/conda-forge/linux-64/xorg-libx11-1.8.12-h4f16b4b_0.conda#db038ce880f100acc74dba10302b5630 -https://conda.anaconda.org/conda-forge/linux-64/aws-c-event-stream-0.5.4-h8170a11_5.conda#68614c9a3b3fb09cb1b4e8c4ed9333fb -https://conda.anaconda.org/conda-forge/linux-64/aws-c-http-0.9.5-hca9d837_2.conda#2c3fdcb5a1bf40fd7b6b5598718e5929 +https://conda.anaconda.org/conda-forge/linux-64/aws-c-event-stream-0.5.4-hc5e5e9e_7.conda#eb339cb6cd7c881b3f0e7910e99c261b +https://conda.anaconda.org/conda-forge/linux-64/aws-c-http-0.9.7-h6884c39_1.conda#6b69d862d15b5753710e81e7a4a7226b https://conda.anaconda.org/conda-forge/linux-64/brotli-1.1.0-hb9d3cd8_2.conda#98514fe74548d768907ce7a13f680e8f https://conda.anaconda.org/conda-forge/noarch/colorama-0.4.6-pyhd8ed1ab_1.conda#962b9857ee8e7018c22f2776ffa0b2d7 https://conda.anaconda.org/conda-forge/noarch/cpython-3.13.3-py313hd8ed1ab_101.conda#904a822cbd380adafb9070debf8579a8 @@ -118,25 +119,26 @@ https://conda.anaconda.org/conda-forge/linux-64/cython-3.0.12-py313h5dec8f5_0.co https://conda.anaconda.org/conda-forge/noarch/exceptiongroup-1.2.2-pyhd8ed1ab_1.conda#a16662747cdeb9abbac74d0057cc976e https://conda.anaconda.org/conda-forge/noarch/execnet-2.1.1-pyhd8ed1ab_1.conda#a71efeae2c160f6789900ba2631a2c90 https://conda.anaconda.org/conda-forge/noarch/filelock-3.18.0-pyhd8ed1ab_0.conda#4547b39256e296bb758166893e909a7c -https://conda.anaconda.org/conda-forge/linux-64/fontconfig-2.15.0-h7e30c49_1.conda#8f5b0b297b59e1ac160ad4beec99dbee https://conda.anaconda.org/conda-forge/noarch/fsspec-2025.3.2-pyhd8ed1ab_0.conda#9c40692c3d24c7aaf335f673ac09d308 https://conda.anaconda.org/conda-forge/noarch/iniconfig-2.0.0-pyhd8ed1ab_1.conda#6837f3eff7dcea42ecd714ce1ac2b108 https://conda.anaconda.org/conda-forge/linux-64/kiwisolver-1.4.7-py313h33d0bda_0.conda#9862d13a5e466273d5a4738cffcb8d6c +https://conda.anaconda.org/conda-forge/linux-64/lcms2-2.17-h717163a_0.conda#000e85703f0fd9594c81710dd5066471 https://conda.anaconda.org/conda-forge/linux-64/libcups-2.3.3-h4637d8d_4.conda#d4529f4dff3057982a7617c7ac58fde3 https://conda.anaconda.org/conda-forge/linux-64/libcurl-8.13.0-h332b0f4_0.conda#cbdc92ac0d93fe3c796e36ad65c7905c +https://conda.anaconda.org/conda-forge/linux-64/libfreetype-2.13.3-ha770c72_1.conda#51f5be229d83ecd401fb369ab96ae669 https://conda.anaconda.org/conda-forge/linux-64/libglib-2.84.1-h2ff4ddf_0.conda#0305434da649d4fb48a425e588b79ea6 https://conda.anaconda.org/conda-forge/linux-64/libglx-1.7.0-ha4b6fd6_2.conda#c8013e438185f33b13814c5c488acd5c https://conda.anaconda.org/conda-forge/linux-64/libhiredis-1.0.2-h2cc385e_0.tar.bz2#b34907d3a81a3cd8095ee83d174c074a -https://conda.anaconda.org/conda-forge/linux-64/libtiff-4.7.0-hd9ff511_3.conda#0ea6510969e1296cc19966fad481f6de https://conda.anaconda.org/conda-forge/linux-64/libxml2-2.13.7-h4bc477f_1.conda#ad1f1f8238834cd3c88ceeaee8da444a https://conda.anaconda.org/conda-forge/linux-64/markupsafe-3.0.2-py313h8060acc_1.conda#21b62c55924f01b6eef6827167b46acb https://conda.anaconda.org/conda-forge/linux-64/mpfr-4.2.1-h90cbb55_3.conda#2eeb50cab6652538eee8fc0bc3340c81 https://conda.anaconda.org/conda-forge/noarch/mpmath-1.3.0-pyhd8ed1ab_1.conda#3585aa87c43ab15b167b574cd73b057b https://conda.anaconda.org/conda-forge/noarch/munkres-1.1.4-pyh9f0ad1d_0.tar.bz2#2ba8498c1018c1e9c61eb99b973dfe19 https://conda.anaconda.org/conda-forge/noarch/networkx-3.4.2-pyh267e887_2.conda#fd40bf7f7f4bc4b647dc8512053d9873 +https://conda.anaconda.org/conda-forge/linux-64/openjpeg-2.5.3-h5fbd93e_0.conda#9e5816bc95d285c115a3ebc2f8563564 https://conda.anaconda.org/conda-forge/linux-64/orc-2.1.1-h17f744e_1.conda#cfe9bc267c22b6d53438eff187649d43 -https://conda.anaconda.org/conda-forge/noarch/packaging-24.2-pyhd8ed1ab_2.conda#3bfed7e6228ebf2f7b9eaa47f1b4e2aa -https://conda.anaconda.org/conda-forge/noarch/pip-25.0.1-pyh145f28c_0.conda#9ba21d75dc722c29827988a575a65707 +https://conda.anaconda.org/conda-forge/noarch/packaging-25.0-pyh29332c3_1.conda#58335b26c38bf4a20f399384c33cbcf9 +https://conda.anaconda.org/conda-forge/noarch/pip-25.1-pyh145f28c_0.conda#4627e20c39e7340febed674c3bf05b16 https://conda.anaconda.org/conda-forge/noarch/pluggy-1.5.0-pyhd8ed1ab_1.conda#e9dcbce5f45f9ee500e728ae58b605b6 https://conda.anaconda.org/conda-forge/noarch/pybind11-global-2.13.6-pyh415d2e4_2.conda#120541563e520d12d8e39abd7de9092c https://conda.anaconda.org/conda-forge/noarch/pyparsing-3.2.3-pyhd8ed1ab_1.conda#513d3c262ee49b54a8fec85c5bc99764 @@ -151,36 +153,35 @@ https://conda.anaconda.org/conda-forge/noarch/tomli-2.2.1-pyhd8ed1ab_1.conda#ac9 https://conda.anaconda.org/conda-forge/linux-64/tornado-6.4.2-py313h536fd9c_0.conda#5f5cbdd527d2e74e270d8b6255ba714f https://conda.anaconda.org/conda-forge/noarch/typing_extensions-4.13.2-pyh29332c3_0.conda#83fc6ae00127671e301c9f44254c31b8 https://conda.anaconda.org/conda-forge/linux-64/xcb-util-image-0.4.0-hb711507_2.conda#a0901183f08b6c7107aab109733a3c91 -https://conda.anaconda.org/conda-forge/linux-64/xkeyboard-config-2.43-hb9d3cd8_0.conda#f725c7425d6d7c15e31f3b99a88ea02f +https://conda.anaconda.org/conda-forge/linux-64/xkeyboard-config-2.44-hb9d3cd8_0.conda#7c91bfc90672888259675ad2ad28af9c https://conda.anaconda.org/conda-forge/linux-64/xorg-libxext-1.3.6-hb9d3cd8_0.conda#febbab7d15033c913d53c7a2c102309d https://conda.anaconda.org/conda-forge/linux-64/xorg-libxfixes-6.0.1-hb9d3cd8_0.conda#4bdb303603e9821baf5fe5fdff1dc8f8 https://conda.anaconda.org/conda-forge/linux-64/xorg-libxrender-0.9.12-hb9d3cd8_0.conda#96d57aba173e878a2089d5638016dc5e -https://conda.anaconda.org/conda-forge/linux-64/aws-c-auth-0.9.0-h094d708_2.conda#9b1e62c9d7b158cf1a234ee49ef6232f -https://conda.anaconda.org/conda-forge/linux-64/aws-c-mqtt-0.12.3-h773eac8_2.conda#53e040407719cf505b7753a6450e4d03 +https://conda.anaconda.org/conda-forge/linux-64/aws-c-auth-0.9.0-h0a147a0_3.conda#d9239cbfec4e372206043ac623253c74 +https://conda.anaconda.org/conda-forge/linux-64/aws-c-mqtt-0.12.3-h27aa219_3.conda#138a54cfd9e73a13ff4e4f0c2a3a22c7 https://conda.anaconda.org/conda-forge/linux-64/azure-core-cpp-1.14.0-h5cfcd09_0.conda#0a8838771cc2e985cd295e01ae83baf1 -https://conda.anaconda.org/conda-forge/linux-64/cairo-1.18.4-h3394656_0.conda#09262e66b19567aff4f592fb53b28760 https://conda.anaconda.org/conda-forge/linux-64/ccache-4.11.2-hd714d17_0.conda#35ae7ce74089ab05fdb1cb9746c0fbe4 https://conda.anaconda.org/conda-forge/linux-64/coverage-7.8.0-py313h8060acc_0.conda#375064d30e709bf7c1d4580e70aaea61 https://conda.anaconda.org/conda-forge/linux-64/dbus-1.13.6-h5008d03_3.tar.bz2#ecfff944ba3960ecb334b9a2663d708d https://conda.anaconda.org/conda-forge/linux-64/fonttools-4.57.0-py313h8060acc_0.conda#76b3a3367ac578a7cc43f4b7814e7e87 +https://conda.anaconda.org/conda-forge/linux-64/freetype-2.13.3-ha770c72_1.conda#9ccd736d31e0c6e41f54e704e5312811 https://conda.anaconda.org/conda-forge/noarch/jinja2-3.1.6-pyhd8ed1ab_0.conda#446bd6c8cb26050d528881df495ce646 https://conda.anaconda.org/conda-forge/noarch/joblib-1.4.2-pyhd8ed1ab_1.conda#bf8243ee348f3a10a14ed0cae323e0c1 -https://conda.anaconda.org/conda-forge/linux-64/lcms2-2.17-h717163a_0.conda#000e85703f0fd9594c81710dd5066471 https://conda.anaconda.org/conda-forge/linux-64/libgl-1.7.0-ha4b6fd6_2.conda#928b8be80851f5d8ffb016f9c81dae7a -https://conda.anaconda.org/conda-forge/linux-64/libgrpc-1.71.0-he753a82_0.conda#65e3fc5e73aa153bb069c1baec51fc12 +https://conda.anaconda.org/conda-forge/linux-64/libgrpc-1.71.0-h8e591d7_1.conda#c3cfd72cbb14113abee7bbd86f44ad69 https://conda.anaconda.org/conda-forge/linux-64/libhwloc-2.11.2-default_h0d58e46_1001.conda#804ca9e91bcaea0824a341d55b1684f2 https://conda.anaconda.org/conda-forge/linux-64/libllvm20-20.1.3-he9d0ab4_0.conda#74c14fe2ab88e352ab6e4fedf5ecb527 -https://conda.anaconda.org/conda-forge/linux-64/libxkbcommon-1.8.1-hc4a0caf_0.conda#e7e5b0652227d646b44abdcbd989da7b +https://conda.anaconda.org/conda-forge/linux-64/libxkbcommon-1.9.0-h65c71a3_0.conda#14fbc598b68d4c6386978f7db09fc5ed https://conda.anaconda.org/conda-forge/linux-64/libxslt-1.1.39-h76b75d6_0.conda#e71f31f8cfb0a91439f2086fc8aa0461 https://conda.anaconda.org/conda-forge/noarch/meson-1.7.1-pyhd8ed1ab_0.conda#90018ee73b8741268027421ceac2809a https://conda.anaconda.org/conda-forge/linux-64/mpc-1.3.1-h24ddda3_1.conda#aa14b9a5196a6d8dd364164b7ce56acf -https://conda.anaconda.org/conda-forge/linux-64/openjpeg-2.5.3-h5fbd93e_0.conda#9e5816bc95d285c115a3ebc2f8563564 https://conda.anaconda.org/conda-forge/linux-64/openldap-2.6.9-he970967_0.conda#ca2de8bbdc871bce41dbf59e51324165 https://conda.anaconda.org/conda-forge/linux-64/prometheus-cpp-1.3.0-ha5d0236_0.conda#a83f6a2fdc079e643237887a37460668 https://conda.anaconda.org/conda-forge/noarch/pybind11-2.13.6-pyh1ec8472_2.conda#8088a5e7b2888c780738c3130f2a969d https://conda.anaconda.org/conda-forge/noarch/pyproject-metadata-0.9.1-pyhd8ed1ab_0.conda#22ae7c6ea81e0c8661ef32168dda929b https://conda.anaconda.org/conda-forge/noarch/pytest-8.3.5-pyhd8ed1ab_0.conda#c3c9316209dec74a705a36797970c6be https://conda.anaconda.org/conda-forge/noarch/python-dateutil-2.9.0.post0-pyhff2d567_1.conda#5ba79d7c71f03c678c8ead841f347d6e +https://conda.anaconda.org/conda-forge/noarch/python-gil-3.13.3-h4df99d1_101.conda#82c2641f2f0f513f7d2d1b847a2588e3 https://conda.anaconda.org/conda-forge/noarch/typing-extensions-4.13.2-h0e9735f_0.conda#568ed1300869dca0ba09fb750cda5dbb https://conda.anaconda.org/conda-forge/linux-64/xcb-util-cursor-0.1.5-hb9d3cd8_0.conda#eb44b3b6deb1cab08d72cb61686fe64c https://conda.anaconda.org/conda-forge/linux-64/xorg-libxcomposite-0.4.6-hb9d3cd8_2.conda#d3c295b50f092ab525ffe3c2aa4b7413 @@ -189,11 +190,12 @@ https://conda.anaconda.org/conda-forge/linux-64/xorg-libxdamage-1.1.6-hb9d3cd8_0 https://conda.anaconda.org/conda-forge/linux-64/xorg-libxi-1.8.2-hb9d3cd8_0.conda#17dcc85db3c7886650b8908b183d6876 https://conda.anaconda.org/conda-forge/linux-64/xorg-libxrandr-1.5.4-hb9d3cd8_0.conda#2de7f99d6581a4a7adbff607b5c278ca https://conda.anaconda.org/conda-forge/linux-64/xorg-libxxf86vm-1.1.6-hb9d3cd8_0.conda#5efa5fa6243a622445fdfd72aee15efa -https://conda.anaconda.org/conda-forge/linux-64/aws-c-s3-0.7.15-h46af1f8_1.conda#4b91da7a394cb7c0a5bd9bb8dd8dcc76 +https://conda.anaconda.org/conda-forge/noarch/_python_abi3_support-1.0-hd8ed1ab_2.conda#aaa2a381ccc56eac91d63b6c1240312f +https://conda.anaconda.org/conda-forge/linux-64/aws-c-s3-0.7.15-hea6d4b9_2.conda#b9a2a9ac3222c3ad1ad2533c9f5cd852 https://conda.anaconda.org/conda-forge/linux-64/azure-identity-cpp-1.10.0-h113e628_0.conda#73f73f60854f325a55f1d31459f2ab73 https://conda.anaconda.org/conda-forge/linux-64/azure-storage-common-cpp-12.8.0-h736e048_1.conda#13de36be8de3ae3f05ba127631599213 -https://conda.anaconda.org/conda-forge/linux-64/gmpy2-2.1.5-py313h11186cd_3.conda#846a773cdc154eda7b86d7f4427432f2 -https://conda.anaconda.org/conda-forge/linux-64/harfbuzz-11.1.0-h3beb420_0.conda#95e3bb97f9cdc251c0c68640e9c10ed3 +https://conda.anaconda.org/conda-forge/linux-64/fontconfig-2.15.0-h7e30c49_1.conda#8f5b0b297b59e1ac160ad4beec99dbee +https://conda.anaconda.org/conda-forge/linux-64/gmpy2-2.2.1-py313h11186cd_0.conda#54d020e0eaacf1e99bfb2410b9aa2e5e https://conda.anaconda.org/conda-forge/linux-64/libclang-cpp20.1-20.1.3-default_h1df26ce_0.conda#bbce8ba7f25af8b0928f13fca1eb7405 https://conda.anaconda.org/conda-forge/linux-64/libclang13-20.1.3-default_he06ed0a_0.conda#1bb2ec3c550f7589b2d16e271aeaeddb https://conda.anaconda.org/conda-forge/linux-64/libgoogle-cloud-2.36.0-hc4361e1_1.conda#ae36e6296a8dd8e8a9a8375965bf6398 @@ -206,32 +208,34 @@ https://conda.anaconda.org/conda-forge/noarch/pytest-cov-6.1.1-pyhd8ed1ab_0.cond https://conda.anaconda.org/conda-forge/noarch/pytest-xdist-3.6.1-pyhd8ed1ab_1.conda#59aad4fb37cabc0bacc73cf344612ddd https://conda.anaconda.org/conda-forge/linux-64/tbb-2021.13.0-hceb3a55_1.conda#ba7726b8df7b9d34ea80e82b097a4893 https://conda.anaconda.org/conda-forge/linux-64/xorg-libxtst-1.2.5-hb9d3cd8_3.conda#7bbe9a0cc0df0ac5f5a8ad6d6a11af2f -https://conda.anaconda.org/conda-forge/linux-64/aws-crt-cpp-0.32.4-h7d42c6f_0.conda#e39cbe02d737ce074a59af9d86015c2a +https://conda.anaconda.org/conda-forge/linux-64/aws-crt-cpp-0.32.4-h9a0fb62_1.conda#37b05aa860c197db33997ba5c53be659 https://conda.anaconda.org/conda-forge/linux-64/azure-storage-blobs-cpp-12.13.0-h3cf044e_1.conda#7eb66060455c7a47d9dcdbfa9f46579b +https://conda.anaconda.org/conda-forge/linux-64/cairo-1.18.4-h3394656_0.conda#09262e66b19567aff4f592fb53b28760 https://conda.anaconda.org/conda-forge/linux-64/libgoogle-cloud-storage-2.36.0-h0121fbd_1.conda#a0f7588c1f0a26d550e7bae4fb49427a https://conda.anaconda.org/conda-forge/linux-64/mkl-2024.2.2-ha957f24_16.conda#1459379c79dda834673426504d52b319 -https://conda.anaconda.org/conda-forge/linux-64/qt6-main-6.9.0-h6441bc3_1.conda#4029a8dcb1d97ea241dbe5abfda1fad6 https://conda.anaconda.org/conda-forge/noarch/sympy-1.13.3-pyh2585a3b_105.conda#254cd5083ffa04d96e3173397a3d30f4 -https://conda.anaconda.org/conda-forge/linux-64/aws-sdk-cpp-1.11.510-h5b777a2_5.conda#860ec2d406d3956b1a8f8cc8ac18faa4 +https://conda.anaconda.org/conda-forge/linux-64/aws-sdk-cpp-1.11.510-h5b777a2_6.conda#2fd0b0d4cc7fc86024b2965feedd628a https://conda.anaconda.org/conda-forge/linux-64/azure-storage-files-datalake-cpp-12.12.0-ha633028_1.conda#7c1980f89dd41b097549782121a73490 +https://conda.anaconda.org/conda-forge/linux-64/harfbuzz-11.1.0-h3beb420_0.conda#95e3bb97f9cdc251c0c68640e9c10ed3 https://conda.anaconda.org/conda-forge/linux-64/libblas-3.9.0-31_hfdb39a5_mkl.conda#bdf4a57254e8248222cb631db4393ff1 https://conda.anaconda.org/conda-forge/linux-64/mkl-devel-2024.2.2-ha770c72_16.conda#140891ea14285fc634353b31e9e40a95 -https://conda.anaconda.org/conda-forge/linux-64/pyside6-6.9.0-py313h5f61773_0.conda#f51f25ec8fcbf777f8b186bb5deeed40 https://conda.anaconda.org/conda-forge/linux-64/libarrow-19.0.1-h27f8bab_8_cpu.conda#adabf9b45433d7465041140051dfdaa1 https://conda.anaconda.org/conda-forge/linux-64/libcblas-3.9.0-31_h372d94f_mkl.conda#2a06a6c16b45bd3d10002927ca204b67 https://conda.anaconda.org/conda-forge/linux-64/liblapack-3.9.0-31_hc41d3b0_mkl.conda#10d012ddd7cc1c7ff9093d4974a34e53 +https://conda.anaconda.org/conda-forge/linux-64/qt6-main-6.9.0-h6441bc3_1.conda#4029a8dcb1d97ea241dbe5abfda1fad6 https://conda.anaconda.org/conda-forge/linux-64/libarrow-acero-19.0.1-hcb10f89_8_cpu.conda#e96553170bbc67aa151a7194f450e698 https://conda.anaconda.org/conda-forge/linux-64/liblapacke-3.9.0-31_hbc6e62b_mkl.conda#562026e418363dc346ad5a9e18cce73c https://conda.anaconda.org/conda-forge/linux-64/libparquet-19.0.1-h081d1f1_8_cpu.conda#874cbb160bf4b8f3155b1165f4186585 https://conda.anaconda.org/conda-forge/linux-64/libtorch-2.6.0-cpu_mkl_hf6ddc5a_104.conda#828146bb6100e9a4217e8351b18c8e83 https://conda.anaconda.org/conda-forge/linux-64/numpy-2.2.5-py313h17eae1a_0.conda#6ceeff9ed72e54e4a2f9a1c88f47bdde https://conda.anaconda.org/conda-forge/linux-64/pyarrow-core-19.0.1-py313he5f92c8_0_cpu.conda#7d8649531c807b24295c8f9a0a396a78 +https://conda.anaconda.org/conda-forge/linux-64/pyside6-6.9.0-py313h5f61773_0.conda#f51f25ec8fcbf777f8b186bb5deeed40 https://conda.anaconda.org/conda-forge/noarch/array-api-strict-2.3.1-pyhd8ed1ab_0.conda#11107d0aeb8c590a34fee0894909816b https://conda.anaconda.org/conda-forge/linux-64/blas-devel-3.9.0-31_hcf00494_mkl.conda#368c93bde87a67d24a74de15bf4c49fd https://conda.anaconda.org/conda-forge/linux-64/contourpy-1.3.2-py313h33d0bda_0.conda#5dc81fffe102f63045225007a33d6199 https://conda.anaconda.org/conda-forge/linux-64/libarrow-dataset-19.0.1-hcb10f89_8_cpu.conda#3bb1fd3f721c4542ed26ba9bfc036619 https://conda.anaconda.org/conda-forge/linux-64/pandas-2.2.3-py313ha87cce1_3.conda#6248b529e537b1d4cb5ab3ef7f537795 -https://conda.anaconda.org/conda-forge/linux-64/polars-1.27.1-py313h96101dc_1.conda#f5c18ddf7723234bc0ebc8272df2e73c +https://conda.anaconda.org/conda-forge/linux-64/polars-1.27.1-py39h2a4a510_3.conda#fba08963eaa1f954480045d033d1221e https://conda.anaconda.org/conda-forge/linux-64/pytorch-2.6.0-cpu_mkl_py313_hea9ba1b_104.conda#5544fa15f47f4c53222f263eb51dd6b3 https://conda.anaconda.org/conda-forge/linux-64/scipy-1.15.2-py313h86fcf2b_0.conda#ca68acd9febc86448eeed68d0c6c8643 https://conda.anaconda.org/conda-forge/noarch/scipy-doctest-1.7.1-pyh29332c3_0.conda#d3b3b7b88385648eff6ae39694692f27 diff --git a/build_tools/azure/pylatest_conda_forge_mkl_osx-64_conda.lock b/build_tools/azure/pylatest_conda_forge_mkl_osx-64_conda.lock index 43135137cbe6b..430be45730865 100644 --- a/build_tools/azure/pylatest_conda_forge_mkl_osx-64_conda.lock +++ b/build_tools/azure/pylatest_conda_forge_mkl_osx-64_conda.lock @@ -2,34 +2,33 @@ # platform: osx-64 # input_hash: b4e9eb0fbe1a7a6d067e4f4b43ca9e632309794c2a76d5c254ce023cb2fa2d99 @EXPLICIT -https://conda.anaconda.org/conda-forge/osx-64/ca-certificates-2025.1.31-h8857fd0_0.conda#3418b6c8cac3e71c0bc089fc5ea53042 https://conda.anaconda.org/conda-forge/noarch/libgfortran-devel_osx-64-13.3.0-h297be85_105.conda#c4967f8e797d0ffef3c5650fcdc2cdb5 -https://conda.anaconda.org/conda-forge/osx-64/libjpeg-turbo-3.0.0-h0dc2134_1.conda#72507f8e3961bc968af17435060b6dd6 https://conda.anaconda.org/conda-forge/osx-64/mkl-include-2023.2.0-h6bab518_50500.conda#835abb8ded5e26f23ea6996259c7972e -https://conda.anaconda.org/conda-forge/osx-64/python_abi-3.13-6_cp313.conda#1867172dd3044e5c3db5772b81d67796 +https://conda.anaconda.org/conda-forge/noarch/python_abi-3.13-7_cp313.conda#e84b44e6300f1703cb25d29120c5b1d8 https://conda.anaconda.org/conda-forge/osx-64/tbb-2021.10.0-h1c7c39f_2.conda#73434bcf87082942e938352afae9b0fa https://conda.anaconda.org/conda-forge/noarch/tzdata-2025b-h78e105d_0.conda#4222072737ccff51314b5ece9c7d6f5a https://conda.anaconda.org/conda-forge/osx-64/bzip2-1.0.8-hfdf4475_7.conda#7ed4301d437b59045be7e051a0308211 +https://conda.anaconda.org/conda-forge/noarch/ca-certificates-2025.4.26-hbd8a1cb_0.conda#95db94f75ba080a22eb623590993167b https://conda.anaconda.org/conda-forge/osx-64/icu-75.1-h120a0e1_0.conda#d68d48a3060eb5abdc1cdc8e2a3a5966 https://conda.anaconda.org/conda-forge/osx-64/libbrotlicommon-1.1.0-h00291cd_2.conda#58f2c4bdd56c46cc7451596e4ae68e0b https://conda.anaconda.org/conda-forge/osx-64/libcxx-20.1.3-hf95d169_0.conda#022f109787a9624301ddbeb39519ff13 -https://conda.anaconda.org/conda-forge/osx-64/libdeflate-1.23-he65b83e_0.conda#120f8f7ba6a8defb59f4253447db4bb4 +https://conda.anaconda.org/conda-forge/osx-64/libdeflate-1.23-hcc1b750_0.conda#5d3507f22dda24f7d9a79325ad313e44 https://conda.anaconda.org/conda-forge/osx-64/libexpat-2.7.0-h240833e_0.conda#026d0a1056ba2a3dbbea6d4b08188676 https://conda.anaconda.org/conda-forge/osx-64/libffi-3.4.6-h281671d_1.conda#4ca9ea59839a9ca8df84170fab4ceb41 https://conda.anaconda.org/conda-forge/osx-64/libiconv-1.18-h4b5e92a_1.conda#6283140d7b2b55b6b095af939b71b13f +https://conda.anaconda.org/conda-forge/osx-64/libjpeg-turbo-3.1.0-h6e16a3a_0.conda#87537967e6de2f885a9fcebd42b7cb10 https://conda.anaconda.org/conda-forge/osx-64/liblzma-5.8.1-hd471939_0.conda#8e1197f652c67e87a9ece738d82cef4f https://conda.anaconda.org/conda-forge/osx-64/libmpdec-4.0.0-hfdf4475_0.conda#ed625b2e59dff82859c23dd24774156b https://conda.anaconda.org/conda-forge/osx-64/libwebp-base-1.5.0-h6cf52b4_0.conda#5e0cefc99a231ac46ba21e27ae44689f https://conda.anaconda.org/conda-forge/osx-64/libzlib-1.3.1-hd23fc13_2.conda#003a54a4e32b02f7355b50a837e699da https://conda.anaconda.org/conda-forge/osx-64/llvm-openmp-20.1.3-ha54dae1_0.conda#16b29a91c8177de8910477ded0f80191 https://conda.anaconda.org/conda-forge/osx-64/ncurses-6.5-h0622a9a_3.conda#ced34dd9929f491ca6dab6a2927aff25 -https://conda.anaconda.org/conda-forge/osx-64/openssl-3.5.0-hc426f3f_0.conda#e06e13c34056b6334a7a1188b0f4c83c https://conda.anaconda.org/conda-forge/osx-64/pthread-stubs-0.4-h00291cd_1002.conda#8bcf980d2c6b17094961198284b8e862 https://conda.anaconda.org/conda-forge/osx-64/xorg-libxau-1.0.12-h6e16a3a_0.conda#4cf40e60b444d56512a64f39d12c20bd https://conda.anaconda.org/conda-forge/osx-64/xorg-libxdmcp-1.1.5-h00291cd_0.conda#9f438e1b6f4e73fd9e6d78bfe7c36743 https://conda.anaconda.org/conda-forge/osx-64/gmp-6.3.0-hf036a51_2.conda#427101d13f19c4974552a4e5b072eef1 https://conda.anaconda.org/conda-forge/osx-64/isl-0.26-imath32_h2e86a7b_101.conda#d06222822a9144918333346f145b68c6 -https://conda.anaconda.org/conda-forge/osx-64/lerc-4.0.0-hb486fe8_0.tar.bz2#f9d6a4c82889d5ecedec1d90eb673c55 +https://conda.anaconda.org/conda-forge/osx-64/lerc-4.0.0-hcca01a6_1.conda#21f765ced1a0ef4070df53cb425e1967 https://conda.anaconda.org/conda-forge/osx-64/libbrotlidec-1.1.0-h00291cd_2.conda#34709a1f5df44e054c4a12ab536c5459 https://conda.anaconda.org/conda-forge/osx-64/libbrotlienc-1.1.0-h00291cd_2.conda#691f0dcb36f1ae67f5c489f20ae987ea https://conda.anaconda.org/conda-forge/osx-64/libcxx-devel-18.1.8-h7c275be_8.conda#a9513c41f070a9e2d5c370ba5d6c0c00 @@ -39,23 +38,24 @@ https://conda.anaconda.org/conda-forge/osx-64/libsqlite-3.49.1-hdb6dae5_2.conda# https://conda.anaconda.org/conda-forge/osx-64/libxcb-1.17.0-hf1f96e2_0.conda#bbeca862892e2898bdb45792a61c4afc https://conda.anaconda.org/conda-forge/osx-64/libxml2-2.14.2-h8c082e5_0.conda#4adac80accf99fa253f0620444ad01fb https://conda.anaconda.org/conda-forge/osx-64/mkl-2023.2.0-h54c2260_50500.conda#0a342ccdc79e4fcd359245ac51941e7b -https://conda.anaconda.org/conda-forge/osx-64/ninja-1.12.1-h3c5361c_0.conda#a0ebabd021c8191aeb82793fe43cfdcb +https://conda.anaconda.org/conda-forge/osx-64/ninja-1.12.1-hd6aca1a_1.conda#1cf196736676270fa876001901e4e1db +https://conda.anaconda.org/conda-forge/osx-64/openssl-3.5.0-hc426f3f_0.conda#e06e13c34056b6334a7a1188b0f4c83c https://conda.anaconda.org/conda-forge/osx-64/qhull-2020.2-h3c5361c_5.conda#dd1ea9ff27c93db7c01a7b7656bd4ad4 https://conda.anaconda.org/conda-forge/osx-64/readline-8.2-h7cca4af_2.conda#342570f8e02f2f022147a7f841475784 -https://conda.anaconda.org/conda-forge/osx-64/sigtool-0.1.3-h88f4db0_0.tar.bz2#fbfb84b9de9a6939cb165c02c69b1865 https://conda.anaconda.org/conda-forge/osx-64/tapi-1300.6.5-h390ca13_0.conda#c6ee25eb54accb3f1c8fc39203acfaf1 https://conda.anaconda.org/conda-forge/osx-64/tk-8.6.13-h1abcd95_1.conda#bf830ba5afc507c6232d4ef0fb1a882d https://conda.anaconda.org/conda-forge/osx-64/zlib-1.3.1-hd23fc13_2.conda#c989e0295dcbdc08106fe5d9e935f0b9 https://conda.anaconda.org/conda-forge/osx-64/zstd-1.5.7-h8210216_2.conda#cd60a4a5a8d6a476b30d8aa4bb49251a https://conda.anaconda.org/conda-forge/osx-64/brotli-bin-1.1.0-h00291cd_2.conda#049933ecbf552479a12c7917f0a4ce59 -https://conda.anaconda.org/conda-forge/osx-64/freetype-2.13.3-h40dfd5c_0.conda#e391f0c2d07df272cf7c6df235e97bb9 https://conda.anaconda.org/conda-forge/osx-64/libblas-3.9.0-20_osx64_mkl.conda#160fdc97a51d66d51dc782fb67d35205 +https://conda.anaconda.org/conda-forge/osx-64/libfreetype6-2.13.3-h40dfd5c_1.conda#c76e6f421a0e95c282142f820835e186 https://conda.anaconda.org/conda-forge/osx-64/libgfortran-14.2.0-hef36b68_105.conda#6b27baf030f5d6603713c7e72d3f6b9a https://conda.anaconda.org/conda-forge/osx-64/libllvm18-18.1.8-default_h3571c67_5.conda#01dd8559b569ad39b64fef0a61ded1e9 -https://conda.anaconda.org/conda-forge/osx-64/libtiff-4.7.0-hb77a491_3.conda#6f2f9df7b093d6b33bc0c334acc7d2d9 +https://conda.anaconda.org/conda-forge/osx-64/libtiff-4.7.0-hb77a491_4.conda#b36d793dd65b28e3aeaa3a77abe71678 https://conda.anaconda.org/conda-forge/osx-64/mkl-devel-2023.2.0-h694c41f_50500.conda#1b4d0235ef253a1e19459351badf4f9f https://conda.anaconda.org/conda-forge/osx-64/mpfr-4.2.1-haed47dc_3.conda#d511e58aaaabfc23136880d9956fa7a6 https://conda.anaconda.org/conda-forge/osx-64/python-3.13.3-h534c281_101_cp313.conda#ebcc7c42561d8d8b01477020b63218c0 +https://conda.anaconda.org/conda-forge/osx-64/sigtool-0.1.3-h88f4db0_0.tar.bz2#fbfb84b9de9a6939cb165c02c69b1865 https://conda.anaconda.org/conda-forge/osx-64/brotli-1.1.0-h00291cd_2.conda#2db0c38a7f2321c5bdaf32b181e832c7 https://conda.anaconda.org/conda-forge/noarch/colorama-0.4.6-pyhd8ed1ab_1.conda#962b9857ee8e7018c22f2776ffa0b2d7 https://conda.anaconda.org/conda-forge/noarch/cycler-0.12.1-pyhd8ed1ab_1.conda#44600c4667a319d67dbe0681fc0bc833 @@ -68,19 +68,20 @@ https://conda.anaconda.org/conda-forge/osx-64/lcms2-2.17-h72f5680_0.conda#bf210d https://conda.anaconda.org/conda-forge/osx-64/ld64_osx-64-951.9-h33512f0_6.conda#6cd120f5c9dae65b858e1fad2b7959a0 https://conda.anaconda.org/conda-forge/osx-64/libcblas-3.9.0-20_osx64_mkl.conda#51089a4865eb4aec2bc5c7468bd07f9f https://conda.anaconda.org/conda-forge/osx-64/libclang-cpp18.1-18.1.8-default_h3571c67_9.conda#ef1a444913775b76f3391431967090a9 +https://conda.anaconda.org/conda-forge/osx-64/libfreetype-2.13.3-h694c41f_1.conda#07c8d3fbbe907f32014b121834b36dd5 https://conda.anaconda.org/conda-forge/osx-64/libhiredis-1.0.2-h2beb688_0.tar.bz2#524282b2c46c9dedf051b3bc2ae05494 https://conda.anaconda.org/conda-forge/osx-64/liblapack-3.9.0-20_osx64_mkl.conda#58f08e12ad487fac4a08f90ff0b87aec https://conda.anaconda.org/conda-forge/osx-64/llvm-tools-18-18.1.8-default_h3571c67_5.conda#4391981e855468ced32ca1940b3d7613 https://conda.anaconda.org/conda-forge/osx-64/mpc-1.3.1-h9d8efa1_1.conda#0520855aaae268ea413d6bc913f1384c https://conda.anaconda.org/conda-forge/noarch/munkres-1.1.4-pyh9f0ad1d_0.tar.bz2#2ba8498c1018c1e9c61eb99b973dfe19 https://conda.anaconda.org/conda-forge/osx-64/openjpeg-2.5.3-h7fd6d84_0.conda#025c711177fc3309228ca1a32374458d -https://conda.anaconda.org/conda-forge/noarch/packaging-24.2-pyhd8ed1ab_2.conda#3bfed7e6228ebf2f7b9eaa47f1b4e2aa -https://conda.anaconda.org/conda-forge/noarch/pip-25.0.1-pyh145f28c_0.conda#9ba21d75dc722c29827988a575a65707 +https://conda.anaconda.org/conda-forge/noarch/packaging-25.0-pyh29332c3_1.conda#58335b26c38bf4a20f399384c33cbcf9 +https://conda.anaconda.org/conda-forge/noarch/pip-25.1-pyh145f28c_0.conda#4627e20c39e7340febed674c3bf05b16 https://conda.anaconda.org/conda-forge/noarch/pluggy-1.5.0-pyhd8ed1ab_1.conda#e9dcbce5f45f9ee500e728ae58b605b6 https://conda.anaconda.org/conda-forge/noarch/pyparsing-3.2.3-pyhd8ed1ab_1.conda#513d3c262ee49b54a8fec85c5bc99764 https://conda.anaconda.org/conda-forge/noarch/python-tzdata-2025.2-pyhd8ed1ab_0.conda#88476ae6ebd24f39261e0854ac244f33 https://conda.anaconda.org/conda-forge/noarch/pytz-2025.2-pyhd8ed1ab_0.conda#bc8e3267d44011051f2eb14d22fb0960 -https://conda.anaconda.org/conda-forge/noarch/setuptools-78.1.0-pyhff2d567_0.conda#a42da9837e46c53494df0044c3eb1f53 +https://conda.anaconda.org/conda-forge/noarch/setuptools-79.0.1-pyhff2d567_0.conda#fa6669cc21abd4b7b6c5393b7bc71914 https://conda.anaconda.org/conda-forge/noarch/six-1.17.0-pyhd8ed1ab_0.conda#a451d576819089b0d672f18768be0f65 https://conda.anaconda.org/conda-forge/noarch/threadpoolctl-3.6.0-pyhecae5ae_0.conda#9d64911b31d57ca443e9f1e36b04385f https://conda.anaconda.org/conda-forge/noarch/toml-0.10.2-pyhd8ed1ab_1.conda#b0dd904de08b7db706167240bf37b164 @@ -90,6 +91,7 @@ https://conda.anaconda.org/conda-forge/osx-64/ccache-4.11.2-h30d2cd9_0.conda#941 https://conda.anaconda.org/conda-forge/osx-64/clang-18-18.1.8-default_h3571c67_9.conda#e29d8d2866f15f3b167938cc0e775b2f https://conda.anaconda.org/conda-forge/osx-64/coverage-7.8.0-py313h717bdf5_0.conda#1215b56c8d9915318d1714cbd004035f https://conda.anaconda.org/conda-forge/osx-64/fonttools-4.57.0-py313h717bdf5_0.conda#190b8625dd6c38afe4f10e3be50122e4 +https://conda.anaconda.org/conda-forge/osx-64/freetype-2.13.3-h694c41f_1.conda#126dba1baf5030cb6f34533718924577 https://conda.anaconda.org/conda-forge/osx-64/gfortran_impl_osx-64-13.3.0-hbf5bf67_105.conda#f56a107c8d1253346d01785ecece7977 https://conda.anaconda.org/conda-forge/noarch/joblib-1.4.2-pyhd8ed1ab_1.conda#bf8243ee348f3a10a14ed0cae323e0c1 https://conda.anaconda.org/conda-forge/osx-64/ld64-951.9-h4e51db5_6.conda#45bf526d53b1bc95bc0b932a91a41576 @@ -97,7 +99,6 @@ https://conda.anaconda.org/conda-forge/osx-64/liblapacke-3.9.0-20_osx64_mkl.cond https://conda.anaconda.org/conda-forge/osx-64/llvm-tools-18.1.8-default_h3571c67_5.conda#cc07ff74d2547da1f1452c42b67bafd6 https://conda.anaconda.org/conda-forge/noarch/meson-1.7.1-pyhd8ed1ab_0.conda#90018ee73b8741268027421ceac2809a https://conda.anaconda.org/conda-forge/osx-64/numpy-2.2.5-py313hc518a0f_0.conda#eba644ccc203cfde2fa1f450f528c70d -https://conda.anaconda.org/conda-forge/osx-64/pillow-11.1.0-py313h0c4f865_0.conda#11b4dd7a814202f2a0b655420f1c1c3a https://conda.anaconda.org/conda-forge/noarch/pyproject-metadata-0.9.1-pyhd8ed1ab_0.conda#22ae7c6ea81e0c8661ef32168dda929b https://conda.anaconda.org/conda-forge/noarch/pytest-8.3.5-pyhd8ed1ab_0.conda#c3c9316209dec74a705a36797970c6be https://conda.anaconda.org/conda-forge/noarch/python-dateutil-2.9.0.post0-pyhff2d567_1.conda#5ba79d7c71f03c678c8ead841f347d6e @@ -107,6 +108,7 @@ https://conda.anaconda.org/conda-forge/osx-64/clang-18.1.8-default_h576c50e_9.co https://conda.anaconda.org/conda-forge/osx-64/contourpy-1.3.2-py313ha0b1807_0.conda#2c2d1f840df1c512b34e0537ef928169 https://conda.anaconda.org/conda-forge/noarch/meson-python-0.17.1-pyh70fd9c4_1.conda#7a02679229c6c2092571b4c025055440 https://conda.anaconda.org/conda-forge/osx-64/pandas-2.2.3-py313h2e7108f_3.conda#5c37fc7549913fc4895d7d2e097091ed +https://conda.anaconda.org/conda-forge/osx-64/pillow-11.1.0-py313h0c4f865_0.conda#11b4dd7a814202f2a0b655420f1c1c3a https://conda.anaconda.org/conda-forge/noarch/pytest-cov-6.1.1-pyhd8ed1ab_0.conda#1e35d8f975bc0e984a19819aa91c440a https://conda.anaconda.org/conda-forge/noarch/pytest-xdist-3.6.1-pyhd8ed1ab_1.conda#59aad4fb37cabc0bacc73cf344612ddd https://conda.anaconda.org/conda-forge/osx-64/scipy-1.15.2-py313h7e69c36_0.conda#53c23f87aedf2d139d54c88894c8a07f diff --git a/build_tools/azure/pylatest_pip_openblas_pandas_linux-64_conda.lock b/build_tools/azure/pylatest_pip_openblas_pandas_linux-64_conda.lock index 85bec89daa016..e137fc315653d 100644 --- a/build_tools/azure/pylatest_pip_openblas_pandas_linux-64_conda.lock +++ b/build_tools/azure/pylatest_pip_openblas_pandas_linux-64_conda.lock @@ -30,7 +30,7 @@ https://repo.anaconda.com/pkgs/main/linux-64/wheel-0.45.1-py313h06a4308_0.conda# https://repo.anaconda.com/pkgs/main/linux-64/pip-25.0-py313h06a4308_0.conda#cbe254aa48f8c0f980a12976e7571e0e # pip alabaster @ https://files.pythonhosted.org/packages/7e/b3/6b4067be973ae96ba0d615946e314c5ae35f9f993eca561b356540bb0c2b/alabaster-1.0.0-py3-none-any.whl#sha256=fc6786402dc3fcb2de3cabd5fe455a2db534b371124f1f21de8731783dec828b # pip babel @ https://files.pythonhosted.org/packages/b7/b8/3fe70c75fe32afc4bb507f75563d39bc5642255d1d94f1f23604725780bf/babel-2.17.0-py3-none-any.whl#sha256=4d0b53093fdfb4b21c92b5213dba5a1b23885afa8383709427046b21c366e5f2 -# pip certifi @ https://files.pythonhosted.org/packages/38/fc/bce832fd4fd99766c04d1ee0eead6b0ec6486fb100ae5e74c1d91292b982/certifi-2025.1.31-py3-none-any.whl#sha256=ca78db4565a652026a4db2bcdf68f2fb589ea80d0be70e03929ed730746b84fe +# pip certifi @ https://files.pythonhosted.org/packages/4a/7e/3db2bd1b1f9e95f7cddca6d6e75e2f2bd9f51b1246e546d88addca0106bd/certifi-2025.4.26-py3-none-any.whl#sha256=30350364dfe371162649852c63336a15c70c6510c2ad5015b21c2345311805f3 # pip charset-normalizer @ https://files.pythonhosted.org/packages/52/ed/b7f4f07de100bdb95c1756d3a4d17b90c1a3c53715c1a476f8738058e0fa/charset_normalizer-3.4.1-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl#sha256=955f8851919303c92343d2f66165294848d57e9bba6cf6e3625485a70a038d11 # pip coverage @ https://files.pythonhosted.org/packages/cb/74/2f8cc196643b15bc096d60e073691dadb3dca48418f08bc78dd6e899383e/coverage-7.8.0-cp313-cp313-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl#sha256=5aaeb00761f985007b38cf463b1d160a14a22c34eb3f6a39d9ad6fc27cb73008 # pip cycler @ https://files.pythonhosted.org/packages/e7/05/c19819d5e3d95294a6f5947fb9b9629efb316b96de511b418c53d245aae6/cycler-0.12.1-py3-none-any.whl#sha256=85cef7cff222d8644161529808465972e51340599459b8ac3ccbac5a854e0d30 diff --git a/build_tools/azure/pymin_conda_forge_mkl_win-64_conda.lock b/build_tools/azure/pymin_conda_forge_mkl_win-64_conda.lock index 8864953ff84e2..e5d24cc45111c 100644 --- a/build_tools/azure/pymin_conda_forge_mkl_win-64_conda.lock +++ b/build_tools/azure/pymin_conda_forge_mkl_win-64_conda.lock @@ -2,40 +2,39 @@ # platform: win-64 # input_hash: b3869076628274fd49d96cadc2692c963f26cbed79ec7498ecbfd50011a55e67 @EXPLICIT -https://conda.anaconda.org/conda-forge/win-64/ca-certificates-2025.1.31-h56e8100_0.conda#5304a31607974dfc2110dfbb662ed092 https://conda.anaconda.org/conda-forge/noarch/font-ttf-dejavu-sans-mono-2.37-hab24e00_0.tar.bz2#0c96522c6bdaed4b1566d11387caaf45 https://conda.anaconda.org/conda-forge/noarch/font-ttf-inconsolata-3.000-h77eed37_0.tar.bz2#34893075a5c9e55cdafac56607368fc6 https://conda.anaconda.org/conda-forge/noarch/font-ttf-source-code-pro-2.038-h77eed37_0.tar.bz2#4d59c254e01d9cde7957100457e2d5fb https://conda.anaconda.org/conda-forge/noarch/font-ttf-ubuntu-0.83-h77eed37_3.conda#49023d73832ef61042f6a237cb2687e7 https://conda.anaconda.org/conda-forge/win-64/intel-openmp-2024.2.1-h57928b3_1083.conda#2d89243bfb53652c182a7c73182cce4f https://conda.anaconda.org/conda-forge/win-64/mkl-include-2024.2.2-h66d3029_15.conda#e2f516189b44b6e042199d13e7015361 -https://conda.anaconda.org/conda-forge/win-64/python_abi-3.10-6_cp310.conda#041cd0bfc8be015fbd78b5b2fe9b168e +https://conda.anaconda.org/conda-forge/noarch/python_abi-3.10-7_cp310.conda#44e871cba2b162368476a84b8d040b6c https://conda.anaconda.org/conda-forge/noarch/tzdata-2025b-h78e105d_0.conda#4222072737ccff51314b5ece9c7d6f5a https://conda.anaconda.org/conda-forge/win-64/ucrt-10.0.22621.0-h57928b3_1.conda#6797b005cd0f439c4c5c9ac565783700 +https://conda.anaconda.org/conda-forge/noarch/ca-certificates-2025.4.26-h4c7d964_0.conda#23c7fd5062b48d8294fc7f61bf157fba https://conda.anaconda.org/conda-forge/noarch/fonts-conda-forge-1-0.tar.bz2#f766549260d6815b0c52253f1fb1bb29 https://conda.anaconda.org/conda-forge/win-64/libwinpthread-12.0.0.r4.gg4f2fc60ca-h57928b3_9.conda#08bfa5da6e242025304b206d152479ef https://conda.anaconda.org/conda-forge/win-64/vc14_runtime-14.42.34438-hfd919c2_26.conda#91651a36d31aa20c7ba36299fb7068f4 https://conda.anaconda.org/conda-forge/noarch/fonts-conda-ecosystem-1-0.tar.bz2#fee5683a3f04bd15cbd8318b096a27ab https://conda.anaconda.org/conda-forge/win-64/libgomp-14.2.0-h1383e82_2.conda#dd6b1ab49e28bcb6154cd131acec985b https://conda.anaconda.org/conda-forge/win-64/vc-14.3-h2b53caa_26.conda#d3f0381e38093bde620a8d85f266ae55 -https://conda.anaconda.org/conda-forge/win-64/vs2015_runtime-14.42.34438-h7142326_26.conda#3357e4383dbce31eed332008ede242ab https://conda.anaconda.org/conda-forge/win-64/_openmp_mutex-4.5-2_gnu.conda#37e16618af5c4851a3f3d66dd0e11141 https://conda.anaconda.org/conda-forge/win-64/bzip2-1.0.8-h2466b09_7.conda#276e7ffe9ffe39688abc665ef0f45596 https://conda.anaconda.org/conda-forge/win-64/double-conversion-3.3.1-he0c23c2_0.conda#e9a1402439c18a4e3c7a52e4246e9e1c https://conda.anaconda.org/conda-forge/win-64/graphite2-1.3.13-h63175ca_1003.conda#3194499ee7d1a67404a87d0eefdd92c6 https://conda.anaconda.org/conda-forge/win-64/icu-75.1-he0c23c2_0.conda#8579b6bb8d18be7c0b27fb08adeeeb40 -https://conda.anaconda.org/conda-forge/win-64/lerc-4.0.0-h63175ca_0.tar.bz2#1900cb3cab5055833cfddb0ba233b074 +https://conda.anaconda.org/conda-forge/win-64/lerc-4.0.0-h6470a55_1.conda#c1b81da6d29a14b542da14a36c9fbf3f https://conda.anaconda.org/conda-forge/win-64/libbrotlicommon-1.1.0-h2466b09_2.conda#f7dc9a8f21d74eab46456df301da2972 -https://conda.anaconda.org/conda-forge/win-64/libdeflate-1.23-h9062f6e_0.conda#a9624935147a25b06013099d3038e467 +https://conda.anaconda.org/conda-forge/win-64/libdeflate-1.23-h76ddb4d_0.conda#34f03138e46543944d4d7f8538048842 https://conda.anaconda.org/conda-forge/win-64/libexpat-2.7.0-he0c23c2_0.conda#b6f5352fdb525662f4169a0431d2dd7a https://conda.anaconda.org/conda-forge/win-64/libffi-3.4.6-h537db12_1.conda#85d8fa5e55ed8f93f874b3b23ed54ec6 https://conda.anaconda.org/conda-forge/win-64/libiconv-1.18-h135ad9c_1.conda#21fc5dba2cbcd8e5e26ff976a312122c -https://conda.anaconda.org/conda-forge/win-64/libjpeg-turbo-3.0.0-hcfcfb64_1.conda#3f1b948619c45b1ca714d60c7389092c +https://conda.anaconda.org/conda-forge/win-64/libjpeg-turbo-3.1.0-h2466b09_0.conda#7c51d27540389de84852daa1cdb9c63c https://conda.anaconda.org/conda-forge/win-64/liblzma-5.8.1-h2466b09_0.conda#8d5cb0016b645d6688e2ff57c5d51302 https://conda.anaconda.org/conda-forge/win-64/libsqlite-3.49.1-h67fdade_2.conda#b58b66d4ad1aaf1c2543cbbd6afb1a59 https://conda.anaconda.org/conda-forge/win-64/libwebp-base-1.5.0-h3b0e114_0.conda#33f7313967072c6e6d8f865f5493c7ae https://conda.anaconda.org/conda-forge/win-64/libzlib-1.3.1-h2466b09_2.conda#41fbfac52c601159df6c01f875de31b9 -https://conda.anaconda.org/conda-forge/win-64/ninja-1.12.1-hc790b64_0.conda#a557dde55343e03c68cd7e29e7f87279 +https://conda.anaconda.org/conda-forge/win-64/ninja-1.12.1-hc790b64_1.conda#3974c522f3248d4a93e6940c463d2de7 https://conda.anaconda.org/conda-forge/win-64/openssl-3.5.0-ha4e3fda_0.conda#4ea7db75035eb8c13fa680bb90171e08 https://conda.anaconda.org/conda-forge/win-64/pixman-0.44.2-had0cd8c_0.conda#c720ac9a3bd825bf8b4dc7523ea49be4 https://conda.anaconda.org/conda-forge/win-64/qhull-2020.2-hc790b64_5.conda#854fbdff64b572b5c0b470f334d34c11 @@ -45,7 +44,7 @@ https://conda.anaconda.org/conda-forge/win-64/libbrotlidec-1.1.0-h2466b09_2.cond https://conda.anaconda.org/conda-forge/win-64/libbrotlienc-1.1.0-h2466b09_2.conda#85741a24d97954a991e55e34bc55990b https://conda.anaconda.org/conda-forge/win-64/libgcc-14.2.0-h1383e82_2.conda#4a74c1461a0ba47a3346c04bdccbe2ad https://conda.anaconda.org/conda-forge/win-64/libintl-0.22.5-h5728263_3.conda#2cf0cf76cc15d360dfa2f17fd6cf9772 -https://conda.anaconda.org/conda-forge/win-64/libpng-1.6.47-had7236b_0.conda#7d717163d9dab337c65f2bf21a676b8f +https://conda.anaconda.org/conda-forge/win-64/libpng-1.6.47-h7a4582a_0.conda#ad620e92b82d2948bc019e029c574ebb https://conda.anaconda.org/conda-forge/win-64/libxml2-2.13.7-h442d1da_1.conda#c14ff7f05e57489df9244917d2b55763 https://conda.anaconda.org/conda-forge/win-64/pcre2-10.44-h3d7b363_2.conda#a3a3baddcfb8c80db84bec3cb7746fb8 https://conda.anaconda.org/conda-forge/win-64/python-3.10.17-h8c5b53a_0_cpython.conda#0c59918f056ab2e9c7bb45970d32b2ea @@ -56,20 +55,20 @@ https://conda.anaconda.org/conda-forge/noarch/cycler-0.12.1-pyhd8ed1ab_1.conda#4 https://conda.anaconda.org/conda-forge/win-64/cython-3.0.12-py310h6bd2d47_0.conda#8b4e32766e91dfad20bdfd9747e66d54 https://conda.anaconda.org/conda-forge/noarch/exceptiongroup-1.2.2-pyhd8ed1ab_1.conda#a16662747cdeb9abbac74d0057cc976e https://conda.anaconda.org/conda-forge/noarch/execnet-2.1.1-pyhd8ed1ab_1.conda#a71efeae2c160f6789900ba2631a2c90 -https://conda.anaconda.org/conda-forge/win-64/freetype-2.13.3-h0b5ce68_0.conda#9c461ed7b07fb360d2c8cfe726c7d521 https://conda.anaconda.org/conda-forge/noarch/iniconfig-2.0.0-pyhd8ed1ab_1.conda#6837f3eff7dcea42ecd714ce1ac2b108 https://conda.anaconda.org/conda-forge/win-64/kiwisolver-1.4.7-py310hc19bc0b_0.conda#50d96539497fc7493cbe469fbb6b8b6e https://conda.anaconda.org/conda-forge/win-64/libclang13-20.1.3-default_h6e92b77_0.conda#e7530cd4a3b5e3d2348be3d836cb196c +https://conda.anaconda.org/conda-forge/win-64/libfreetype6-2.13.3-h0b5ce68_1.conda#a84b7d1a13060a9372bea961a8131dbc https://conda.anaconda.org/conda-forge/win-64/libglib-2.84.1-h7025463_0.conda#6cbaea9075a4f007eb7d0a90bb9a2a09 https://conda.anaconda.org/conda-forge/win-64/libhwloc-2.11.2-default_ha69328c_1001.conda#b87a0ac5ab6495d8225db5dc72dd21cd -https://conda.anaconda.org/conda-forge/win-64/libtiff-4.7.0-h797046b_3.conda#defed79ff7a9164ad40320e3f116a138 +https://conda.anaconda.org/conda-forge/win-64/libtiff-4.7.0-h797046b_4.conda#7d938ca70c64c5516767b4eae0a56172 https://conda.anaconda.org/conda-forge/win-64/libxslt-1.1.39-h3df6e99_0.conda#279ee338c9b34871d578cb3c7aa68f70 https://conda.anaconda.org/conda-forge/noarch/munkres-1.1.4-pyh9f0ad1d_0.tar.bz2#2ba8498c1018c1e9c61eb99b973dfe19 -https://conda.anaconda.org/conda-forge/noarch/packaging-24.2-pyhd8ed1ab_2.conda#3bfed7e6228ebf2f7b9eaa47f1b4e2aa +https://conda.anaconda.org/conda-forge/noarch/packaging-25.0-pyh29332c3_1.conda#58335b26c38bf4a20f399384c33cbcf9 https://conda.anaconda.org/conda-forge/noarch/pluggy-1.5.0-pyhd8ed1ab_1.conda#e9dcbce5f45f9ee500e728ae58b605b6 https://conda.anaconda.org/conda-forge/win-64/pthread-stubs-0.4-h0e40799_1002.conda#3c8f2573569bb816483e5cf57efbbe29 https://conda.anaconda.org/conda-forge/noarch/pyparsing-3.2.3-pyhd8ed1ab_1.conda#513d3c262ee49b54a8fec85c5bc99764 -https://conda.anaconda.org/conda-forge/noarch/setuptools-78.1.0-pyhff2d567_0.conda#a42da9837e46c53494df0044c3eb1f53 +https://conda.anaconda.org/conda-forge/noarch/setuptools-79.0.1-pyhff2d567_0.conda#fa6669cc21abd4b7b6c5393b7bc71914 https://conda.anaconda.org/conda-forge/noarch/six-1.17.0-pyhd8ed1ab_0.conda#a451d576819089b0d672f18768be0f65 https://conda.anaconda.org/conda-forge/noarch/threadpoolctl-3.6.0-pyhecae5ae_0.conda#9d64911b31d57ca443e9f1e36b04385f https://conda.anaconda.org/conda-forge/noarch/toml-0.10.2-pyhd8ed1ab_1.conda#b0dd904de08b7db706167240bf37b164 @@ -81,36 +80,38 @@ https://conda.anaconda.org/conda-forge/win-64/xorg-libxau-1.0.12-h0e40799_0.cond https://conda.anaconda.org/conda-forge/win-64/xorg-libxdmcp-1.1.5-h0e40799_0.conda#8393c0f7e7870b4eb45553326f81f0ff https://conda.anaconda.org/conda-forge/win-64/brotli-1.1.0-h2466b09_2.conda#378f1c9421775dfe644731cb121c8979 https://conda.anaconda.org/conda-forge/win-64/coverage-7.8.0-py310h38315fa_0.conda#30a825dae940c63c55bca8df4f806f3e -https://conda.anaconda.org/conda-forge/win-64/fontconfig-2.15.0-h765892d_1.conda#9bb0026a2131b09404c59c4290c697cd https://conda.anaconda.org/conda-forge/noarch/joblib-1.4.2-pyhd8ed1ab_1.conda#bf8243ee348f3a10a14ed0cae323e0c1 https://conda.anaconda.org/conda-forge/win-64/lcms2-2.17-hbcf6048_0.conda#3538827f77b82a837fa681a4579e37a1 +https://conda.anaconda.org/conda-forge/win-64/libfreetype-2.13.3-h57928b3_1.conda#410ba2c8e7bdb278dfbb5d40220e39d2 https://conda.anaconda.org/conda-forge/win-64/libxcb-1.17.0-h0e4246c_0.conda#a69bbf778a462da324489976c84cfc8c https://conda.anaconda.org/conda-forge/noarch/meson-1.7.1-pyhd8ed1ab_0.conda#90018ee73b8741268027421ceac2809a https://conda.anaconda.org/conda-forge/win-64/openjpeg-2.5.3-h4d64b90_0.conda#fc050366dd0b8313eb797ed1ffef3a29 -https://conda.anaconda.org/conda-forge/noarch/pip-25.0.1-pyh8b19718_0.conda#79b5c1440aedc5010f687048d9103628 +https://conda.anaconda.org/conda-forge/noarch/pip-25.1-pyh8b19718_0.conda#2247aa245832ea47e8b971bef73d7094 https://conda.anaconda.org/conda-forge/noarch/pyproject-metadata-0.9.1-pyhd8ed1ab_0.conda#22ae7c6ea81e0c8661ef32168dda929b https://conda.anaconda.org/conda-forge/noarch/pytest-8.3.5-pyhd8ed1ab_0.conda#c3c9316209dec74a705a36797970c6be https://conda.anaconda.org/conda-forge/noarch/python-dateutil-2.9.0.post0-pyhff2d567_1.conda#5ba79d7c71f03c678c8ead841f347d6e https://conda.anaconda.org/conda-forge/win-64/tbb-2021.13.0-h62715c5_1.conda#9190dd0a23d925f7602f9628b3aed511 -https://conda.anaconda.org/conda-forge/win-64/cairo-1.18.4-h5782bbf_0.conda#20e32ced54300292aff690a69c5e7b97 https://conda.anaconda.org/conda-forge/win-64/fonttools-4.57.0-py310h38315fa_0.conda#1f25f742c39582715cc058f5fe451975 +https://conda.anaconda.org/conda-forge/win-64/freetype-2.13.3-h57928b3_1.conda#633504fe3f96031192e40e3e6c18ef06 https://conda.anaconda.org/conda-forge/noarch/meson-python-0.17.1-pyh70fd9c4_1.conda#7a02679229c6c2092571b4c025055440 https://conda.anaconda.org/conda-forge/win-64/mkl-2024.2.2-h66d3029_15.conda#302dff2807f2927b3e9e0d19d60121de -https://conda.anaconda.org/conda-forge/win-64/pillow-11.1.0-py310h9595edc_0.conda#67a38507ac20bd85226fe6dd7ed87462 https://conda.anaconda.org/conda-forge/noarch/pytest-cov-6.1.1-pyhd8ed1ab_0.conda#1e35d8f975bc0e984a19819aa91c440a https://conda.anaconda.org/conda-forge/noarch/pytest-xdist-3.6.1-pyhd8ed1ab_1.conda#59aad4fb37cabc0bacc73cf344612ddd -https://conda.anaconda.org/conda-forge/win-64/harfbuzz-11.1.0-h8796e6f_0.conda#dcc4a63f231cc52197c558f5e07e0a69 +https://conda.anaconda.org/conda-forge/win-64/fontconfig-2.15.0-h765892d_1.conda#9bb0026a2131b09404c59c4290c697cd https://conda.anaconda.org/conda-forge/win-64/libblas-3.9.0-31_h641d27c_mkl.conda#d05563c577fe2f37693a554b3f271e8f https://conda.anaconda.org/conda-forge/win-64/mkl-devel-2024.2.2-h57928b3_15.conda#a85f53093da069c7c657f090e388f3ef +https://conda.anaconda.org/conda-forge/win-64/pillow-11.1.0-py310h9595edc_0.conda#67a38507ac20bd85226fe6dd7ed87462 +https://conda.anaconda.org/conda-forge/win-64/cairo-1.18.4-h5782bbf_0.conda#20e32ced54300292aff690a69c5e7b97 https://conda.anaconda.org/conda-forge/win-64/libcblas-3.9.0-31_h5e41251_mkl.conda#43c100b94ad2607382b0cf0f3a6b0bf3 https://conda.anaconda.org/conda-forge/win-64/liblapack-3.9.0-31_h1aa476e_mkl.conda#40b47ee720a185289760960fc6185750 -https://conda.anaconda.org/conda-forge/win-64/qt6-main-6.9.0-h83cda92_1.conda#412f970fc305449b6ee626fe9c6638a8 +https://conda.anaconda.org/conda-forge/win-64/harfbuzz-11.1.0-h8796e6f_0.conda#dcc4a63f231cc52197c558f5e07e0a69 https://conda.anaconda.org/conda-forge/win-64/liblapacke-3.9.0-31_h845c4fa_mkl.conda#003a2041cb07a7cf698f48dd26301273 https://conda.anaconda.org/conda-forge/win-64/numpy-2.2.5-py310h4987827_0.conda#19e9c5868faa8046020ce870a9a9d0fc -https://conda.anaconda.org/conda-forge/win-64/pyside6-6.9.0-py310hc1b6536_0.conda#e90c8d8a817b5d63b7785d7d18c99ae0 https://conda.anaconda.org/conda-forge/win-64/blas-devel-3.9.0-31_hfb1a452_mkl.conda#0deeb3d9d6f0e56393c55ef382899010 https://conda.anaconda.org/conda-forge/win-64/contourpy-1.3.2-py310hc19bc0b_0.conda#039416813b5290e7d100a05bb4326110 +https://conda.anaconda.org/conda-forge/win-64/qt6-main-6.9.0-h83cda92_1.conda#412f970fc305449b6ee626fe9c6638a8 https://conda.anaconda.org/conda-forge/win-64/scipy-1.15.2-py310h15c175c_0.conda#81798168111d1021e3d815217c444418 https://conda.anaconda.org/conda-forge/win-64/blas-2.131-mkl.conda#1842bfaa4e349875c47bde1d9871bda6 https://conda.anaconda.org/conda-forge/win-64/matplotlib-base-3.10.1-py310h37e0a56_0.conda#1b78c5c0741473537e39e425ff30ea80 +https://conda.anaconda.org/conda-forge/win-64/pyside6-6.9.0-py310hc1b6536_0.conda#e90c8d8a817b5d63b7785d7d18c99ae0 https://conda.anaconda.org/conda-forge/win-64/matplotlib-3.10.1-py310h5588dad_0.conda#246bfc9ca36dccad2d78a020ab8d2aab diff --git a/build_tools/azure/pymin_conda_forge_openblas_min_dependencies_linux-64_conda.lock b/build_tools/azure/pymin_conda_forge_openblas_min_dependencies_linux-64_conda.lock index 59a692a4ee985..0eae8d97f5a2b 100644 --- a/build_tools/azure/pymin_conda_forge_openblas_min_dependencies_linux-64_conda.lock +++ b/build_tools/azure/pymin_conda_forge_openblas_min_dependencies_linux-64_conda.lock @@ -2,13 +2,13 @@ # platform: linux-64 # input_hash: fbba4fe2a9e1ebfa6e5d79269f12618306ade6ba86f95bb43c9719cd8dbe0e38 @EXPLICIT -https://conda.anaconda.org/conda-forge/linux-64/ca-certificates-2025.1.31-hbcca054_0.conda#19f3a56f68d2fd06c516076bff482c52 https://conda.anaconda.org/conda-forge/noarch/font-ttf-dejavu-sans-mono-2.37-hab24e00_0.tar.bz2#0c96522c6bdaed4b1566d11387caaf45 https://conda.anaconda.org/conda-forge/noarch/font-ttf-inconsolata-3.000-h77eed37_0.tar.bz2#34893075a5c9e55cdafac56607368fc6 https://conda.anaconda.org/conda-forge/noarch/font-ttf-source-code-pro-2.038-h77eed37_0.tar.bz2#4d59c254e01d9cde7957100457e2d5fb https://conda.anaconda.org/conda-forge/noarch/font-ttf-ubuntu-0.83-h77eed37_3.conda#49023d73832ef61042f6a237cb2687e7 -https://conda.anaconda.org/conda-forge/linux-64/python_abi-3.10-6_cp310.conda#01f0f2104b8466714804a72e511de599 +https://conda.anaconda.org/conda-forge/noarch/python_abi-3.10-7_cp310.conda#44e871cba2b162368476a84b8d040b6c https://conda.anaconda.org/conda-forge/noarch/tzdata-2025b-h78e105d_0.conda#4222072737ccff51314b5ece9c7d6f5a +https://conda.anaconda.org/conda-forge/noarch/ca-certificates-2025.4.26-hbd8a1cb_0.conda#95db94f75ba080a22eb623590993167b https://conda.anaconda.org/conda-forge/noarch/fonts-conda-forge-1-0.tar.bz2#f766549260d6815b0c52253f1fb1bb29 https://conda.anaconda.org/conda-forge/linux-64/ld_impl_linux-64-2.43-h712a8e2_4.conda#01f8d123c96816249efd255a31ad7712 https://conda.anaconda.org/conda-forge/linux-64/libglvnd-1.7.0-ha4b6fd6_2.conda#434ca7e50e40f4918ab701e3facd59a0 @@ -20,13 +20,14 @@ https://conda.anaconda.org/conda-forge/linux-64/libgcc-14.2.0-h767d61c_2.conda#e https://conda.anaconda.org/conda-forge/linux-64/alsa-lib-1.2.14-hb9d3cd8_0.conda#76df83c2a9035c54df5d04ff81bcc02d https://conda.anaconda.org/conda-forge/linux-64/gettext-tools-0.23.1-h5888daf_0.conda#2f659535feef3cfb782f7053c8775a32 https://conda.anaconda.org/conda-forge/linux-64/libbrotlicommon-1.1.0-hb9d3cd8_2.conda#41b599ed2b02abcfdd84302bff174b23 -https://conda.anaconda.org/conda-forge/linux-64/libdeflate-1.23-h4ddbbb0_0.conda#8dfae1d2e74767e9ce36d5fa0d8605db +https://conda.anaconda.org/conda-forge/linux-64/libdeflate-1.23-h86f0d12_0.conda#27fe770decaf469a53f3e3a6d593067f https://conda.anaconda.org/conda-forge/linux-64/libexpat-2.7.0-h5888daf_0.conda#db0bfbe7dd197b68ad5f30333bae6ce0 https://conda.anaconda.org/conda-forge/linux-64/libffi-3.4.6-h2dba641_1.conda#ede4673863426c0883c0063d853bbd85 https://conda.anaconda.org/conda-forge/linux-64/libgcc-ng-14.2.0-h69a702a_2.conda#a2222a6ada71fb478682efe483ce0f92 https://conda.anaconda.org/conda-forge/linux-64/libgettextpo-0.23.1-h5888daf_0.conda#a09ce5decdef385bcce78c32809fa794 https://conda.anaconda.org/conda-forge/linux-64/libgfortran5-14.2.0-hf1ad2bd_2.conda#556a4fdfac7287d349b8f09aba899693 https://conda.anaconda.org/conda-forge/linux-64/libiconv-1.18-h4ce23a2_1.conda#e796ff8ddc598affdf7c173d6145f087 +https://conda.anaconda.org/conda-forge/linux-64/libjpeg-turbo-3.1.0-hb9d3cd8_0.conda#9fa334557db9f63da6c9285fd2a48638 https://conda.anaconda.org/conda-forge/linux-64/liblzma-5.8.1-hb9d3cd8_0.conda#0e87378639676987af32fee53ba32258 https://conda.anaconda.org/conda-forge/linux-64/libntlm-1.8-hb9d3cd8_0.conda#7c7927b404672409d9917d49bff5f2d6 https://conda.anaconda.org/conda-forge/linux-64/libopus-1.5.2-hd0c01bc_0.conda#b64523fb87ac6f87f0790f324ad43046 @@ -45,6 +46,7 @@ https://conda.anaconda.org/conda-forge/linux-64/bzip2-1.0.8-h4bc722e_7.conda#62e https://conda.anaconda.org/conda-forge/linux-64/expat-2.7.0-h5888daf_0.conda#d6845ae4dea52a2f90178bf1829a21f8 https://conda.anaconda.org/conda-forge/linux-64/keyutils-1.6.1-h166bdaf_0.tar.bz2#30186d27e2c9fa62b45fb1476b7200e3 https://conda.anaconda.org/conda-forge/linux-64/lame-3.100-h166bdaf_1003.tar.bz2#a8832b479f93521a9e7b5b743803be51 +https://conda.anaconda.org/conda-forge/linux-64/lerc-4.0.0-h0aef613_1.conda#9344155d33912347b37f0ae6c410a835 https://conda.anaconda.org/conda-forge/linux-64/libasprintf-0.23.1-h8e693c7_0.conda#988f4937281a66ca19d1adb3b5e3f859 https://conda.anaconda.org/conda-forge/linux-64/libbrotlidec-1.1.0-hb9d3cd8_2.conda#9566f0bd264fbd463002e759b8a82401 https://conda.anaconda.org/conda-forge/linux-64/libbrotlienc-1.1.0-hb9d3cd8_2.conda#06f70867945ea6a84d35836af780f1de @@ -52,8 +54,7 @@ https://conda.anaconda.org/conda-forge/linux-64/libedit-3.1.20250104-pl5321h7949 https://conda.anaconda.org/conda-forge/linux-64/libevent-2.1.12-hf998b51_1.conda#a1cfcc585f0c42bf8d5546bb1dfb668d https://conda.anaconda.org/conda-forge/linux-64/libgettextpo-devel-0.23.1-h5888daf_0.conda#7a5d5c245a6807deab87558e9efd3ef0 https://conda.anaconda.org/conda-forge/linux-64/libgfortran-14.2.0-h69a702a_2.conda#fb54c4ea68b460c278d26eea89cfbcc3 -https://conda.anaconda.org/conda-forge/linux-64/libgpg-error-1.54-hbd13f7d_0.conda#53fab32c797ccdb5bb7a4c147ea154d8 -https://conda.anaconda.org/conda-forge/linux-64/libjpeg-turbo-3.0.0-hd590300_1.conda#ea25936bb4080d843790b586850f82b8 +https://conda.anaconda.org/conda-forge/linux-64/libgpg-error-1.55-h3f2d84a_0.conda#2bd47db5807daade8500ed7ca4c512a4 https://conda.anaconda.org/conda-forge/linux-64/libnsl-2.0.1-hd590300_0.conda#30fd6e37fe21f86f4bd26d6ee73eeec7 https://conda.anaconda.org/conda-forge/linux-64/libogg-1.3.5-h4ab18f5_0.conda#601bfb4b3c6f0b844443bb81a56651e0 https://conda.anaconda.org/conda-forge/linux-64/libpciaccess-0.18-hd590300_0.conda#48f4330bfcd959c3cfb704d424903c82 @@ -66,25 +67,25 @@ https://conda.anaconda.org/conda-forge/linux-64/libxcrypt-4.4.36-hd590300_1.cond https://conda.anaconda.org/conda-forge/linux-64/lz4-c-1.10.0-h5888daf_1.conda#9de5350a85c4a20c685259b889aa6393 https://conda.anaconda.org/conda-forge/linux-64/mpg123-1.32.9-hc50e24c_0.conda#c7f302fd11eeb0987a6a5e1f3aed6a21 https://conda.anaconda.org/conda-forge/linux-64/mysql-common-9.0.1-h266115a_6.conda#94116b69829e90b72d566e64421e1bff +https://conda.anaconda.org/conda-forge/linux-64/ninja-1.12.1-hff21bea_1.conda#2322531904f27501ee19847b87ba7c64 https://conda.anaconda.org/conda-forge/linux-64/nspr-4.36-h5888daf_0.conda#de9cd5bca9e4918527b9b72b6e2e1409 https://conda.anaconda.org/conda-forge/linux-64/pixman-0.44.2-h29eaf8c_0.conda#5e2a7acfa2c24188af39e7944e1b3604 https://conda.anaconda.org/conda-forge/linux-64/readline-8.2-h8c095d6_2.conda#283b96675859b20a825f8fa30f311446 https://conda.anaconda.org/conda-forge/linux-64/tk-8.6.13-noxft_h4845f30_101.conda#d453b98d9c83e71da0741bb0ff4d76bc https://conda.anaconda.org/conda-forge/linux-64/zstd-1.5.7-hb8e6e7a_2.conda#6432cb5d4ac0046c3ac0a8a0f95842f9 https://conda.anaconda.org/conda-forge/linux-64/brotli-bin-1.1.0-hb9d3cd8_2.conda#c63b5e52939e795ba8d26e35d767a843 -https://conda.anaconda.org/conda-forge/linux-64/freetype-2.13.3-h48d6fc4_0.conda#9ecfd6f2ca17077dd9c2d24770bb9ccd https://conda.anaconda.org/conda-forge/linux-64/graphite2-1.3.13-h59595ed_1003.conda#f87c7b7c2cb45f323ffbce941c78ab7c https://conda.anaconda.org/conda-forge/linux-64/icu-75.1-he02047a_0.conda#8b189310083baabfb622af68fd9d3ae3 https://conda.anaconda.org/conda-forge/linux-64/krb5-1.21.3-h659f571_0.conda#3f43953b7d3fb3aaa1d0d0723d91e368 -https://conda.anaconda.org/conda-forge/linux-64/lerc-4.0.0-h27087fc_0.tar.bz2#76bbff344f0134279f225174e9064c8f https://conda.anaconda.org/conda-forge/linux-64/libasprintf-devel-0.23.1-h8e693c7_0.conda#2827e722a963b779ce878ef9b5474534 https://conda.anaconda.org/conda-forge/linux-64/libcap-2.75-h39aace5_0.conda#c44c16d6976d2aebbd65894d7741e67e https://conda.anaconda.org/conda-forge/linux-64/libdrm-2.4.124-hb9d3cd8_0.conda#8bc89311041d7fcb510238cf0848ccae +https://conda.anaconda.org/conda-forge/linux-64/libfreetype6-2.13.3-h48d6fc4_1.conda#3c255be50a506c50765a93a6644f32fe https://conda.anaconda.org/conda-forge/linux-64/libgcrypt-lib-1.11.0-hb9d3cd8_2.conda#e55712ff40a054134d51b89afca57dbc https://conda.anaconda.org/conda-forge/linux-64/libgfortran-ng-14.2.0-h69a702a_2.conda#4056c857af1a99ee50589a941059ec55 +https://conda.anaconda.org/conda-forge/linux-64/libtiff-4.7.0-hd9ff511_4.conda#6c1028898cf3a2032d9af46689e1b81a https://conda.anaconda.org/conda-forge/linux-64/libvorbis-1.3.7-h9c3ff4c_0.tar.bz2#309dec04b70a3cc0f1e84a4013683bc0 https://conda.anaconda.org/conda-forge/linux-64/mysql-libs-9.0.1-he0572af_6.conda#9802ae6d20982f42c0f5d69008988763 -https://conda.anaconda.org/conda-forge/linux-64/ninja-1.12.1-h297d8ca_0.conda#3aa1c7e292afeff25a0091ddd7c69b72 https://conda.anaconda.org/conda-forge/linux-64/nss-3.110-h159eef7_0.conda#945659af183e87429c8aa7e0be3cc91d https://conda.anaconda.org/conda-forge/linux-64/pcre2-10.44-hba22ea6_2.conda#df359c09c41cd186fffb93a2d87aa6f5 https://conda.anaconda.org/conda-forge/linux-64/python-3.10.17-hd6af730_0_cpython.conda#7bb89638dae9ce1b8e051d0b721e83c2 @@ -102,25 +103,26 @@ https://conda.anaconda.org/conda-forge/linux-64/cyrus-sasl-2.1.27-h54b06d7_7.con https://conda.anaconda.org/conda-forge/linux-64/cython-3.0.10-py310hc6cd4ac_0.conda#bd1d71ee240be36f1d85c86177d6964f https://conda.anaconda.org/conda-forge/noarch/exceptiongroup-1.2.2-pyhd8ed1ab_1.conda#a16662747cdeb9abbac74d0057cc976e https://conda.anaconda.org/conda-forge/noarch/execnet-2.1.1-pyhd8ed1ab_1.conda#a71efeae2c160f6789900ba2631a2c90 -https://conda.anaconda.org/conda-forge/linux-64/fontconfig-2.15.0-h7e30c49_1.conda#8f5b0b297b59e1ac160ad4beec99dbee https://conda.anaconda.org/conda-forge/linux-64/gettext-0.23.1-h5888daf_0.conda#0754038c806eae440582da1c3af85577 https://conda.anaconda.org/conda-forge/noarch/iniconfig-2.0.0-pyhd8ed1ab_1.conda#6837f3eff7dcea42ecd714ce1ac2b108 https://conda.anaconda.org/conda-forge/linux-64/kiwisolver-1.4.7-py310h3788b33_0.conda#4186d9b4d004b0fe0de6aa62496fb48a +https://conda.anaconda.org/conda-forge/linux-64/lcms2-2.17-h717163a_0.conda#000e85703f0fd9594c81710dd5066471 https://conda.anaconda.org/conda-forge/linux-64/libcups-2.3.3-h4637d8d_4.conda#d4529f4dff3057982a7617c7ac58fde3 +https://conda.anaconda.org/conda-forge/linux-64/libfreetype-2.13.3-ha770c72_1.conda#51f5be229d83ecd401fb369ab96ae669 https://conda.anaconda.org/conda-forge/linux-64/libglib-2.84.1-h2ff4ddf_0.conda#0305434da649d4fb48a425e588b79ea6 https://conda.anaconda.org/conda-forge/linux-64/libglx-1.7.0-ha4b6fd6_2.conda#c8013e438185f33b13814c5c488acd5c https://conda.anaconda.org/conda-forge/linux-64/libhiredis-1.0.2-h2cc385e_0.tar.bz2#b34907d3a81a3cd8095ee83d174c074a https://conda.anaconda.org/conda-forge/linux-64/libopenblas-0.3.25-pthreads_h413a1c8_0.conda#d172b34a443b95f86089e8229ddc9a17 https://conda.anaconda.org/conda-forge/linux-64/libsystemd0-257.4-h4e0b6ca_1.conda#04bcf3055e51f8dde6fab9672fb9fca0 -https://conda.anaconda.org/conda-forge/linux-64/libtiff-4.7.0-hd9ff511_3.conda#0ea6510969e1296cc19966fad481f6de https://conda.anaconda.org/conda-forge/linux-64/libxml2-2.13.7-h4bc477f_1.conda#ad1f1f8238834cd3c88ceeaee8da444a https://conda.anaconda.org/conda-forge/noarch/munkres-1.1.4-pyh9f0ad1d_0.tar.bz2#2ba8498c1018c1e9c61eb99b973dfe19 -https://conda.anaconda.org/conda-forge/noarch/packaging-24.2-pyhd8ed1ab_2.conda#3bfed7e6228ebf2f7b9eaa47f1b4e2aa +https://conda.anaconda.org/conda-forge/linux-64/openjpeg-2.5.3-h5fbd93e_0.conda#9e5816bc95d285c115a3ebc2f8563564 +https://conda.anaconda.org/conda-forge/noarch/packaging-25.0-pyh29332c3_1.conda#58335b26c38bf4a20f399384c33cbcf9 https://conda.anaconda.org/conda-forge/noarch/pluggy-1.5.0-pyhd8ed1ab_1.conda#e9dcbce5f45f9ee500e728ae58b605b6 https://conda.anaconda.org/conda-forge/noarch/ply-3.11-pyhd8ed1ab_3.conda#fd5062942bfa1b0bd5e0d2a4397b099e https://conda.anaconda.org/conda-forge/noarch/pyparsing-3.2.3-pyhd8ed1ab_1.conda#513d3c262ee49b54a8fec85c5bc99764 https://conda.anaconda.org/conda-forge/noarch/pytz-2025.2-pyhd8ed1ab_0.conda#bc8e3267d44011051f2eb14d22fb0960 -https://conda.anaconda.org/conda-forge/noarch/setuptools-78.1.0-pyhff2d567_0.conda#a42da9837e46c53494df0044c3eb1f53 +https://conda.anaconda.org/conda-forge/noarch/setuptools-79.0.1-pyhff2d567_0.conda#fa6669cc21abd4b7b6c5393b7bc71914 https://conda.anaconda.org/conda-forge/noarch/six-1.17.0-pyhd8ed1ab_0.conda#a451d576819089b0d672f18768be0f65 https://conda.anaconda.org/conda-forge/noarch/threadpoolctl-3.1.0-pyh8a188c0_0.tar.bz2#a2995ee828f65687ac5b1e71a2ab1e0c https://conda.anaconda.org/conda-forge/noarch/toml-0.10.2-pyhd8ed1ab_1.conda#b0dd904de08b7db706167240bf37b164 @@ -130,36 +132,34 @@ https://conda.anaconda.org/conda-forge/noarch/typing_extensions-4.13.2-pyh29332c https://conda.anaconda.org/conda-forge/linux-64/unicodedata2-16.0.0-py310ha75aee5_0.conda#1d7a4b9202cdd10d56ecdd7f6c347190 https://conda.anaconda.org/conda-forge/noarch/wheel-0.45.1-pyhd8ed1ab_1.conda#75cb7132eb58d97896e173ef12ac9986 https://conda.anaconda.org/conda-forge/linux-64/xcb-util-image-0.4.0-hb711507_2.conda#a0901183f08b6c7107aab109733a3c91 -https://conda.anaconda.org/conda-forge/linux-64/xkeyboard-config-2.43-hb9d3cd8_0.conda#f725c7425d6d7c15e31f3b99a88ea02f +https://conda.anaconda.org/conda-forge/linux-64/xkeyboard-config-2.44-hb9d3cd8_0.conda#7c91bfc90672888259675ad2ad28af9c https://conda.anaconda.org/conda-forge/linux-64/xorg-libxext-1.3.6-hb9d3cd8_0.conda#febbab7d15033c913d53c7a2c102309d https://conda.anaconda.org/conda-forge/linux-64/xorg-libxfixes-6.0.1-hb9d3cd8_0.conda#4bdb303603e9821baf5fe5fdff1dc8f8 https://conda.anaconda.org/conda-forge/linux-64/xorg-libxrender-0.9.12-hb9d3cd8_0.conda#96d57aba173e878a2089d5638016dc5e -https://conda.anaconda.org/conda-forge/linux-64/cairo-1.18.4-h3394656_0.conda#09262e66b19567aff4f592fb53b28760 https://conda.anaconda.org/conda-forge/linux-64/ccache-4.11.2-hd714d17_0.conda#35ae7ce74089ab05fdb1cb9746c0fbe4 https://conda.anaconda.org/conda-forge/linux-64/coverage-7.8.0-py310h89163eb_0.conda#9f7865c17117d16f804b687b498e35fa https://conda.anaconda.org/conda-forge/linux-64/dbus-1.13.6-h5008d03_3.tar.bz2#ecfff944ba3960ecb334b9a2663d708d https://conda.anaconda.org/conda-forge/linux-64/fonttools-4.57.0-py310h89163eb_0.conda#34378af82141b3c1725dcdf898b28fc6 +https://conda.anaconda.org/conda-forge/linux-64/freetype-2.13.3-ha770c72_1.conda#9ccd736d31e0c6e41f54e704e5312811 https://conda.anaconda.org/conda-forge/linux-64/glib-tools-2.84.1-h4833e2c_0.conda#ddc06964296eee2b4070e65415b332fd https://conda.anaconda.org/conda-forge/noarch/joblib-1.2.0-pyhd8ed1ab_0.tar.bz2#7583652522d71ad78ba536bba06940eb -https://conda.anaconda.org/conda-forge/linux-64/lcms2-2.17-h717163a_0.conda#000e85703f0fd9594c81710dd5066471 https://conda.anaconda.org/conda-forge/linux-64/libblas-3.9.0-20_linux64_openblas.conda#2b7bb4f7562c8cf334fc2e20c2d28abc https://conda.anaconda.org/conda-forge/linux-64/libflac-1.4.3-h59595ed_0.conda#ee48bf17cc83a00f59ca1494d5646869 https://conda.anaconda.org/conda-forge/linux-64/libgl-1.7.0-ha4b6fd6_2.conda#928b8be80851f5d8ffb016f9c81dae7a https://conda.anaconda.org/conda-forge/linux-64/libllvm20-20.1.3-he9d0ab4_0.conda#74c14fe2ab88e352ab6e4fedf5ecb527 -https://conda.anaconda.org/conda-forge/linux-64/libxkbcommon-1.8.1-hc4a0caf_0.conda#e7e5b0652227d646b44abdcbd989da7b +https://conda.anaconda.org/conda-forge/linux-64/libxkbcommon-1.9.0-h65c71a3_0.conda#14fbc598b68d4c6386978f7db09fc5ed https://conda.anaconda.org/conda-forge/noarch/meson-1.7.1-pyhd8ed1ab_0.conda#90018ee73b8741268027421ceac2809a https://conda.anaconda.org/conda-forge/linux-64/openblas-0.3.25-pthreads_h7a3da1a_0.conda#87661673941b5e702275fdf0fc095ad0 -https://conda.anaconda.org/conda-forge/linux-64/openjpeg-2.5.3-h5fbd93e_0.conda#9e5816bc95d285c115a3ebc2f8563564 https://conda.anaconda.org/conda-forge/linux-64/openldap-2.6.9-he970967_0.conda#ca2de8bbdc871bce41dbf59e51324165 -https://conda.anaconda.org/conda-forge/noarch/pip-25.0.1-pyh8b19718_0.conda#79b5c1440aedc5010f687048d9103628 +https://conda.anaconda.org/conda-forge/noarch/pip-25.1-pyh8b19718_0.conda#2247aa245832ea47e8b971bef73d7094 https://conda.anaconda.org/conda-forge/noarch/pyproject-metadata-0.9.1-pyhd8ed1ab_0.conda#22ae7c6ea81e0c8661ef32168dda929b https://conda.anaconda.org/conda-forge/noarch/pytest-8.3.5-pyhd8ed1ab_0.conda#c3c9316209dec74a705a36797970c6be https://conda.anaconda.org/conda-forge/noarch/python-dateutil-2.9.0.post0-pyhff2d567_1.conda#5ba79d7c71f03c678c8ead841f347d6e https://conda.anaconda.org/conda-forge/linux-64/sip-6.8.6-py310hf71b8c6_2.conda#a50d1007fecaff3f98b19034a8e0b2e7 https://conda.anaconda.org/conda-forge/linux-64/xorg-libxdamage-1.1.6-hb9d3cd8_0.conda#b5fcc7172d22516e1f965490e65e33a4 https://conda.anaconda.org/conda-forge/linux-64/xorg-libxxf86vm-1.1.6-hb9d3cd8_0.conda#5efa5fa6243a622445fdfd72aee15efa +https://conda.anaconda.org/conda-forge/linux-64/fontconfig-2.15.0-h7e30c49_1.conda#8f5b0b297b59e1ac160ad4beec99dbee https://conda.anaconda.org/conda-forge/linux-64/glib-2.84.1-h07242d1_0.conda#2c2357f18073331d4aefe7252b9fad17 -https://conda.anaconda.org/conda-forge/linux-64/harfbuzz-11.1.0-h3beb420_0.conda#95e3bb97f9cdc251c0c68640e9c10ed3 https://conda.anaconda.org/conda-forge/linux-64/libcblas-3.9.0-20_linux64_openblas.conda#36d486d72ab64ffea932329a1d3729a3 https://conda.anaconda.org/conda-forge/linux-64/libclang-cpp20.1-20.1.3-default_h1df26ce_0.conda#bbce8ba7f25af8b0928f13fca1eb7405 https://conda.anaconda.org/conda-forge/linux-64/libclang13-20.1.3-default_he06ed0a_0.conda#1bb2ec3c550f7589b2d16e271aeaeddb @@ -171,12 +171,14 @@ https://conda.anaconda.org/conda-forge/linux-64/pillow-11.1.0-py310h7e6dc6c_0.co https://conda.anaconda.org/conda-forge/linux-64/pyqt5-sip-12.13.0-py310hf71b8c6_1.conda#0c8cbfbe70f4c8a47b040a14615e6f1f https://conda.anaconda.org/conda-forge/noarch/pytest-cov-6.1.1-pyhd8ed1ab_0.conda#1e35d8f975bc0e984a19819aa91c440a https://conda.anaconda.org/conda-forge/noarch/pytest-xdist-3.6.1-pyhd8ed1ab_1.conda#59aad4fb37cabc0bacc73cf344612ddd +https://conda.anaconda.org/conda-forge/linux-64/cairo-1.18.4-h3394656_0.conda#09262e66b19567aff4f592fb53b28760 https://conda.anaconda.org/conda-forge/linux-64/gstreamer-1.24.11-hc37bda9_0.conda#056d86cacf2b48c79c6a562a2486eb8c https://conda.anaconda.org/conda-forge/linux-64/liblapacke-3.9.0-20_linux64_openblas.conda#05c5862c7dc25e65ba6c471d96429dae https://conda.anaconda.org/conda-forge/linux-64/numpy-1.22.0-py310h454958d_1.tar.bz2#607c66f0cce2986515a8fe9e136b2b57 https://conda.anaconda.org/conda-forge/linux-64/pulseaudio-client-17.0-hac146a9_1.conda#66b1fa9608d8836e25f9919159adc9c6 https://conda.anaconda.org/conda-forge/linux-64/blas-devel-3.9.0-20_linux64_openblas.conda#9932a1d4e9ecf2d35fb19475446e361e https://conda.anaconda.org/conda-forge/linux-64/gst-plugins-base-1.24.11-h651a532_0.conda#d8d8894f8ced2c9be76dc9ad1ae531ce +https://conda.anaconda.org/conda-forge/linux-64/harfbuzz-11.1.0-h3beb420_0.conda#95e3bb97f9cdc251c0c68640e9c10ed3 https://conda.anaconda.org/conda-forge/linux-64/matplotlib-base-3.5.0-py310h23f4a51_0.tar.bz2#9911225650b298776c8e8c083b5cacf1 https://conda.anaconda.org/conda-forge/linux-64/pandas-1.4.0-py310hb5077e9_0.tar.bz2#43e920bc9856daa7d8d18fcbfb244c4e https://conda.anaconda.org/conda-forge/linux-64/polars-0.20.30-py310h031f9ce_0.conda#0743f5db9f978b6df92d412935ff8371 diff --git a/build_tools/azure/pymin_conda_forge_openblas_ubuntu_2204_linux-64_conda.lock b/build_tools/azure/pymin_conda_forge_openblas_ubuntu_2204_linux-64_conda.lock index 2d03ea55105b4..6e22f28a387e8 100644 --- a/build_tools/azure/pymin_conda_forge_openblas_ubuntu_2204_linux-64_conda.lock +++ b/build_tools/azure/pymin_conda_forge_openblas_ubuntu_2204_linux-64_conda.lock @@ -3,18 +3,19 @@ # input_hash: ec41f4a9538671e542d266b999ea055a685df8323c3c879f7d01fb2c259197cb @EXPLICIT https://conda.anaconda.org/conda-forge/linux-64/_libgcc_mutex-0.1-conda_forge.tar.bz2#d7c89558ba9fa0495403155b64376d81 -https://conda.anaconda.org/conda-forge/linux-64/ca-certificates-2025.1.31-hbcca054_0.conda#19f3a56f68d2fd06c516076bff482c52 -https://conda.anaconda.org/conda-forge/linux-64/python_abi-3.10-6_cp310.conda#01f0f2104b8466714804a72e511de599 +https://conda.anaconda.org/conda-forge/noarch/python_abi-3.10-7_cp310.conda#44e871cba2b162368476a84b8d040b6c https://conda.anaconda.org/conda-forge/noarch/tzdata-2025b-h78e105d_0.conda#4222072737ccff51314b5ece9c7d6f5a +https://conda.anaconda.org/conda-forge/noarch/ca-certificates-2025.4.26-hbd8a1cb_0.conda#95db94f75ba080a22eb623590993167b https://conda.anaconda.org/conda-forge/linux-64/ld_impl_linux-64-2.43-h712a8e2_4.conda#01f8d123c96816249efd255a31ad7712 https://conda.anaconda.org/conda-forge/linux-64/libgomp-14.2.0-h767d61c_2.conda#06d02030237f4d5b3d9a7e7d348fe3c6 https://conda.anaconda.org/conda-forge/linux-64/_openmp_mutex-4.5-2_gnu.tar.bz2#73aaf86a425cc6e73fcf236a5a46396d https://conda.anaconda.org/conda-forge/linux-64/libgcc-14.2.0-h767d61c_2.conda#ef504d1acbd74b7cc6849ef8af47dd03 -https://conda.anaconda.org/conda-forge/linux-64/libdeflate-1.23-h4ddbbb0_0.conda#8dfae1d2e74767e9ce36d5fa0d8605db +https://conda.anaconda.org/conda-forge/linux-64/libdeflate-1.23-h86f0d12_0.conda#27fe770decaf469a53f3e3a6d593067f https://conda.anaconda.org/conda-forge/linux-64/libexpat-2.7.0-h5888daf_0.conda#db0bfbe7dd197b68ad5f30333bae6ce0 https://conda.anaconda.org/conda-forge/linux-64/libffi-3.4.6-h2dba641_1.conda#ede4673863426c0883c0063d853bbd85 https://conda.anaconda.org/conda-forge/linux-64/libgcc-ng-14.2.0-h69a702a_2.conda#a2222a6ada71fb478682efe483ce0f92 https://conda.anaconda.org/conda-forge/linux-64/libgfortran5-14.2.0-hf1ad2bd_2.conda#556a4fdfac7287d349b8f09aba899693 +https://conda.anaconda.org/conda-forge/linux-64/libjpeg-turbo-3.1.0-hb9d3cd8_0.conda#9fa334557db9f63da6c9285fd2a48638 https://conda.anaconda.org/conda-forge/linux-64/liblzma-5.8.1-hb9d3cd8_0.conda#0e87378639676987af32fee53ba32258 https://conda.anaconda.org/conda-forge/linux-64/libstdcxx-14.2.0-h8f9b012_2.conda#a78c856b6dc6bf4ea8daeb9beaaa3fb0 https://conda.anaconda.org/conda-forge/linux-64/libwebp-base-1.5.0-h851e524_0.conda#63f790534398730f59e1b899c3644d4a @@ -25,8 +26,8 @@ https://conda.anaconda.org/conda-forge/linux-64/pthread-stubs-0.4-hb9d3cd8_1002. https://conda.anaconda.org/conda-forge/linux-64/xorg-libxau-1.0.12-hb9d3cd8_0.conda#f6ebe2cb3f82ba6c057dde5d9debe4f7 https://conda.anaconda.org/conda-forge/linux-64/xorg-libxdmcp-1.1.5-hb9d3cd8_0.conda#8035c64cb77ed555e3f150b7b3972480 https://conda.anaconda.org/conda-forge/linux-64/bzip2-1.0.8-h4bc722e_7.conda#62ee74e96c5ebb0af99386de58cf9553 +https://conda.anaconda.org/conda-forge/linux-64/lerc-4.0.0-h0aef613_1.conda#9344155d33912347b37f0ae6c410a835 https://conda.anaconda.org/conda-forge/linux-64/libgfortran-14.2.0-h69a702a_2.conda#fb54c4ea68b460c278d26eea89cfbcc3 -https://conda.anaconda.org/conda-forge/linux-64/libjpeg-turbo-3.0.0-hd590300_1.conda#ea25936bb4080d843790b586850f82b8 https://conda.anaconda.org/conda-forge/linux-64/libnsl-2.0.1-hd590300_0.conda#30fd6e37fe21f86f4bd26d6ee73eeec7 https://conda.anaconda.org/conda-forge/linux-64/libpng-1.6.47-h943b412_0.conda#55199e2ae2c3651f6f9b2a447b47bdc9 https://conda.anaconda.org/conda-forge/linux-64/libsqlite-3.49.1-hee588c1_2.conda#962d6ac93c30b1dfc54c9cccafd1003e @@ -34,14 +35,14 @@ https://conda.anaconda.org/conda-forge/linux-64/libstdcxx-ng-14.2.0-h4852527_2.c https://conda.anaconda.org/conda-forge/linux-64/libuuid-2.38.1-h0b41bf4_0.conda#40b61aab5c7ba9ff276c41cfffe6b80b https://conda.anaconda.org/conda-forge/linux-64/libxcb-1.17.0-h8a09558_0.conda#92ed62436b625154323d40d5f2f11dd7 https://conda.anaconda.org/conda-forge/linux-64/libxcrypt-4.4.36-hd590300_1.conda#5aa797f8787fe7a17d1b0821485b5adc +https://conda.anaconda.org/conda-forge/linux-64/ninja-1.12.1-hff21bea_1.conda#2322531904f27501ee19847b87ba7c64 https://conda.anaconda.org/conda-forge/linux-64/readline-8.2-h8c095d6_2.conda#283b96675859b20a825f8fa30f311446 https://conda.anaconda.org/conda-forge/linux-64/tk-8.6.13-noxft_h4845f30_101.conda#d453b98d9c83e71da0741bb0ff4d76bc https://conda.anaconda.org/conda-forge/linux-64/zstd-1.5.7-hb8e6e7a_2.conda#6432cb5d4ac0046c3ac0a8a0f95842f9 -https://conda.anaconda.org/conda-forge/linux-64/freetype-2.13.3-h48d6fc4_0.conda#9ecfd6f2ca17077dd9c2d24770bb9ccd -https://conda.anaconda.org/conda-forge/linux-64/lerc-4.0.0-h27087fc_0.tar.bz2#76bbff344f0134279f225174e9064c8f +https://conda.anaconda.org/conda-forge/linux-64/libfreetype6-2.13.3-h48d6fc4_1.conda#3c255be50a506c50765a93a6644f32fe https://conda.anaconda.org/conda-forge/linux-64/libgfortran-ng-14.2.0-h69a702a_2.conda#4056c857af1a99ee50589a941059ec55 https://conda.anaconda.org/conda-forge/linux-64/libopenblas-0.3.29-pthreads_h94d23a6_0.conda#0a4d0252248ef9a0f88f2ba8b8a08e12 -https://conda.anaconda.org/conda-forge/linux-64/ninja-1.12.1-h297d8ca_0.conda#3aa1c7e292afeff25a0091ddd7c69b72 +https://conda.anaconda.org/conda-forge/linux-64/libtiff-4.7.0-hd9ff511_4.conda#6c1028898cf3a2032d9af46689e1b81a https://conda.anaconda.org/conda-forge/linux-64/python-3.10.17-hd6af730_0_cpython.conda#7bb89638dae9ce1b8e051d0b721e83c2 https://conda.anaconda.org/conda-forge/noarch/alabaster-1.0.0-pyhd8ed1ab_1.conda#1fd9696649f65fd6611fcdb4ffec738a https://conda.anaconda.org/conda-forge/linux-64/brotli-python-1.1.0-py310hf71b8c6_2.conda#bf502c169c71e3c6ac0d6175addfacc2 @@ -57,19 +58,21 @@ https://conda.anaconda.org/conda-forge/noarch/hyperframe-6.1.0-pyhd8ed1ab_0.cond https://conda.anaconda.org/conda-forge/noarch/idna-3.10-pyhd8ed1ab_1.conda#39a4f67be3286c86d696df570b1201b7 https://conda.anaconda.org/conda-forge/noarch/imagesize-1.4.1-pyhd8ed1ab_0.tar.bz2#7de5386c8fea29e76b303f37dde4c352 https://conda.anaconda.org/conda-forge/noarch/iniconfig-2.0.0-pyhd8ed1ab_1.conda#6837f3eff7dcea42ecd714ce1ac2b108 +https://conda.anaconda.org/conda-forge/linux-64/lcms2-2.17-h717163a_0.conda#000e85703f0fd9594c81710dd5066471 https://conda.anaconda.org/conda-forge/linux-64/libblas-3.9.0-31_h59b9bed_openblas.conda#728dbebd0f7a20337218beacffd37916 +https://conda.anaconda.org/conda-forge/linux-64/libfreetype-2.13.3-ha770c72_1.conda#51f5be229d83ecd401fb369ab96ae669 https://conda.anaconda.org/conda-forge/linux-64/libhiredis-1.0.2-h2cc385e_0.tar.bz2#b34907d3a81a3cd8095ee83d174c074a -https://conda.anaconda.org/conda-forge/linux-64/libtiff-4.7.0-hd9ff511_3.conda#0ea6510969e1296cc19966fad481f6de https://conda.anaconda.org/conda-forge/linux-64/markupsafe-3.0.2-py310h89163eb_1.conda#8ce3f0332fd6de0d737e2911d329523f https://conda.anaconda.org/conda-forge/linux-64/openblas-0.3.29-pthreads_h6ec200e_0.conda#7e4d48870b3258bea920d51b7f495a81 -https://conda.anaconda.org/conda-forge/noarch/packaging-24.2-pyhd8ed1ab_2.conda#3bfed7e6228ebf2f7b9eaa47f1b4e2aa +https://conda.anaconda.org/conda-forge/linux-64/openjpeg-2.5.3-h5fbd93e_0.conda#9e5816bc95d285c115a3ebc2f8563564 +https://conda.anaconda.org/conda-forge/noarch/packaging-25.0-pyh29332c3_1.conda#58335b26c38bf4a20f399384c33cbcf9 https://conda.anaconda.org/conda-forge/noarch/pluggy-1.5.0-pyhd8ed1ab_1.conda#e9dcbce5f45f9ee500e728ae58b605b6 https://conda.anaconda.org/conda-forge/noarch/pycparser-2.22-pyh29332c3_1.conda#12c566707c80111f9799308d9e265aef https://conda.anaconda.org/conda-forge/noarch/pygments-2.19.1-pyhd8ed1ab_0.conda#232fb4577b6687b2d503ef8e254270c9 https://conda.anaconda.org/conda-forge/noarch/pysocks-1.7.1-pyha55dd90_7.conda#461219d1a5bd61342293efa2c0c90eac https://conda.anaconda.org/conda-forge/noarch/python-tzdata-2025.2-pyhd8ed1ab_0.conda#88476ae6ebd24f39261e0854ac244f33 https://conda.anaconda.org/conda-forge/noarch/pytz-2025.2-pyhd8ed1ab_0.conda#bc8e3267d44011051f2eb14d22fb0960 -https://conda.anaconda.org/conda-forge/noarch/setuptools-78.1.0-pyhff2d567_0.conda#a42da9837e46c53494df0044c3eb1f53 +https://conda.anaconda.org/conda-forge/noarch/setuptools-79.0.1-pyhff2d567_0.conda#fa6669cc21abd4b7b6c5393b7bc71914 https://conda.anaconda.org/conda-forge/noarch/six-1.17.0-pyhd8ed1ab_0.conda#a451d576819089b0d672f18768be0f65 https://conda.anaconda.org/conda-forge/noarch/snowballstemmer-2.2.0-pyhd8ed1ab_0.tar.bz2#4d22a9315e78c6827f806065957d566e https://conda.anaconda.org/conda-forge/noarch/sphinxcontrib-jsmath-1.0.1-pyhd8ed1ab_1.conda#fa839b5ff59e192f411ccc7dae6588bb @@ -80,15 +83,14 @@ https://conda.anaconda.org/conda-forge/noarch/wheel-0.45.1-pyhd8ed1ab_1.conda#75 https://conda.anaconda.org/conda-forge/noarch/babel-2.17.0-pyhd8ed1ab_0.conda#0a01c169f0ab0f91b26e77a3301fbfe4 https://conda.anaconda.org/conda-forge/linux-64/ccache-4.11.2-hd714d17_0.conda#35ae7ce74089ab05fdb1cb9746c0fbe4 https://conda.anaconda.org/conda-forge/linux-64/cffi-1.17.1-py310h8deb56e_0.conda#1fc24a3196ad5ede2a68148be61894f4 +https://conda.anaconda.org/conda-forge/linux-64/freetype-2.13.3-ha770c72_1.conda#9ccd736d31e0c6e41f54e704e5312811 https://conda.anaconda.org/conda-forge/noarch/h2-4.2.0-pyhd8ed1ab_0.conda#b4754fb1bdcb70c8fd54f918301582c6 https://conda.anaconda.org/conda-forge/noarch/jinja2-3.1.6-pyhd8ed1ab_0.conda#446bd6c8cb26050d528881df495ce646 https://conda.anaconda.org/conda-forge/noarch/joblib-1.4.2-pyhd8ed1ab_1.conda#bf8243ee348f3a10a14ed0cae323e0c1 -https://conda.anaconda.org/conda-forge/linux-64/lcms2-2.17-h717163a_0.conda#000e85703f0fd9594c81710dd5066471 https://conda.anaconda.org/conda-forge/linux-64/libcblas-3.9.0-31_he106b2a_openblas.conda#abb32c727da370c481a1c206f5159ce9 https://conda.anaconda.org/conda-forge/linux-64/liblapack-3.9.0-31_h7ac8fdf_openblas.conda#452b98eafe050ecff932f0ec832dd03f https://conda.anaconda.org/conda-forge/noarch/meson-1.7.1-pyhd8ed1ab_0.conda#90018ee73b8741268027421ceac2809a -https://conda.anaconda.org/conda-forge/linux-64/openjpeg-2.5.3-h5fbd93e_0.conda#9e5816bc95d285c115a3ebc2f8563564 -https://conda.anaconda.org/conda-forge/noarch/pip-25.0.1-pyh8b19718_0.conda#79b5c1440aedc5010f687048d9103628 +https://conda.anaconda.org/conda-forge/noarch/pip-25.1-pyh8b19718_0.conda#2247aa245832ea47e8b971bef73d7094 https://conda.anaconda.org/conda-forge/noarch/pyproject-metadata-0.9.1-pyhd8ed1ab_0.conda#22ae7c6ea81e0c8661ef32168dda929b https://conda.anaconda.org/conda-forge/noarch/pytest-8.3.5-pyhd8ed1ab_0.conda#c3c9316209dec74a705a36797970c6be https://conda.anaconda.org/conda-forge/noarch/python-dateutil-2.9.0.post0-pyhff2d567_1.conda#5ba79d7c71f03c678c8ead841f347d6e diff --git a/build_tools/circle/doc_linux-64_conda.lock b/build_tools/circle/doc_linux-64_conda.lock index e5072e7fb278e..dc800de2b5148 100644 --- a/build_tools/circle/doc_linux-64_conda.lock +++ b/build_tools/circle/doc_linux-64_conda.lock @@ -3,14 +3,14 @@ # input_hash: 208134f3b8c140a6fe6fffe85293a731d77b7bf6cdcf0b12f7a44fdcf6e665d2 @EXPLICIT https://conda.anaconda.org/conda-forge/linux-64/_libgcc_mutex-0.1-conda_forge.tar.bz2#d7c89558ba9fa0495403155b64376d81 -https://conda.anaconda.org/conda-forge/linux-64/ca-certificates-2025.1.31-hbcca054_0.conda#19f3a56f68d2fd06c516076bff482c52 https://conda.anaconda.org/conda-forge/noarch/font-ttf-dejavu-sans-mono-2.37-hab24e00_0.tar.bz2#0c96522c6bdaed4b1566d11387caaf45 https://conda.anaconda.org/conda-forge/noarch/font-ttf-inconsolata-3.000-h77eed37_0.tar.bz2#34893075a5c9e55cdafac56607368fc6 https://conda.anaconda.org/conda-forge/noarch/font-ttf-source-code-pro-2.038-h77eed37_0.tar.bz2#4d59c254e01d9cde7957100457e2d5fb https://conda.anaconda.org/conda-forge/noarch/font-ttf-ubuntu-0.83-h77eed37_3.conda#49023d73832ef61042f6a237cb2687e7 https://conda.anaconda.org/conda-forge/noarch/kernel-headers_linux-64-3.10.0-he073ed8_18.conda#ad8527bf134a90e1c9ed35fa0b64318c -https://conda.anaconda.org/conda-forge/linux-64/python_abi-3.10-6_cp310.conda#01f0f2104b8466714804a72e511de599 +https://conda.anaconda.org/conda-forge/noarch/python_abi-3.10-7_cp310.conda#44e871cba2b162368476a84b8d040b6c https://conda.anaconda.org/conda-forge/noarch/tzdata-2025b-h78e105d_0.conda#4222072737ccff51314b5ece9c7d6f5a +https://conda.anaconda.org/conda-forge/noarch/ca-certificates-2025.4.26-hbd8a1cb_0.conda#95db94f75ba080a22eb623590993167b https://conda.anaconda.org/conda-forge/noarch/fonts-conda-forge-1-0.tar.bz2#f766549260d6815b0c52253f1fb1bb29 https://conda.anaconda.org/conda-forge/linux-64/ld_impl_linux-64-2.43-h712a8e2_4.conda#01f8d123c96816249efd255a31ad7712 https://conda.anaconda.org/conda-forge/noarch/libgcc-devel_linux-64-13.3.0-hc03c837_102.conda#4c1d6961a6a54f602ae510d9bf31fa60 @@ -28,12 +28,13 @@ https://conda.anaconda.org/conda-forge/linux-64/binutils_linux-64-2.43-h4852527_ https://conda.anaconda.org/conda-forge/linux-64/libgcc-14.2.0-h767d61c_2.conda#ef504d1acbd74b7cc6849ef8af47dd03 https://conda.anaconda.org/conda-forge/linux-64/alsa-lib-1.2.14-hb9d3cd8_0.conda#76df83c2a9035c54df5d04ff81bcc02d https://conda.anaconda.org/conda-forge/linux-64/libbrotlicommon-1.1.0-hb9d3cd8_2.conda#41b599ed2b02abcfdd84302bff174b23 -https://conda.anaconda.org/conda-forge/linux-64/libdeflate-1.23-h4ddbbb0_0.conda#8dfae1d2e74767e9ce36d5fa0d8605db +https://conda.anaconda.org/conda-forge/linux-64/libdeflate-1.23-h86f0d12_0.conda#27fe770decaf469a53f3e3a6d593067f https://conda.anaconda.org/conda-forge/linux-64/libexpat-2.7.0-h5888daf_0.conda#db0bfbe7dd197b68ad5f30333bae6ce0 https://conda.anaconda.org/conda-forge/linux-64/libffi-3.4.6-h2dba641_1.conda#ede4673863426c0883c0063d853bbd85 https://conda.anaconda.org/conda-forge/linux-64/libgcc-ng-14.2.0-h69a702a_2.conda#a2222a6ada71fb478682efe483ce0f92 https://conda.anaconda.org/conda-forge/linux-64/libgfortran5-14.2.0-hf1ad2bd_2.conda#556a4fdfac7287d349b8f09aba899693 https://conda.anaconda.org/conda-forge/linux-64/libiconv-1.18-h4ce23a2_1.conda#e796ff8ddc598affdf7c173d6145f087 +https://conda.anaconda.org/conda-forge/linux-64/libjpeg-turbo-3.1.0-hb9d3cd8_0.conda#9fa334557db9f63da6c9285fd2a48638 https://conda.anaconda.org/conda-forge/linux-64/liblzma-5.8.1-hb9d3cd8_0.conda#0e87378639676987af32fee53ba32258 https://conda.anaconda.org/conda-forge/linux-64/libntlm-1.8-hb9d3cd8_0.conda#7c7927b404672409d9917d49bff5f2d6 https://conda.anaconda.org/conda-forge/linux-64/libstdcxx-14.2.0-h8f9b012_2.conda#a78c856b6dc6bf4ea8daeb9beaaa3fb0 @@ -52,12 +53,12 @@ https://conda.anaconda.org/conda-forge/linux-64/expat-2.7.0-h5888daf_0.conda#d68 https://conda.anaconda.org/conda-forge/linux-64/giflib-5.2.2-hd590300_0.conda#3bf7b9fd5a7136126e0234db4b87c8b6 https://conda.anaconda.org/conda-forge/linux-64/jxrlib-1.1-hd590300_3.conda#5aeabe88534ea4169d4c49998f293d6c https://conda.anaconda.org/conda-forge/linux-64/keyutils-1.6.1-h166bdaf_0.tar.bz2#30186d27e2c9fa62b45fb1476b7200e3 +https://conda.anaconda.org/conda-forge/linux-64/lerc-4.0.0-h0aef613_1.conda#9344155d33912347b37f0ae6c410a835 https://conda.anaconda.org/conda-forge/linux-64/libbrotlidec-1.1.0-hb9d3cd8_2.conda#9566f0bd264fbd463002e759b8a82401 https://conda.anaconda.org/conda-forge/linux-64/libbrotlienc-1.1.0-hb9d3cd8_2.conda#06f70867945ea6a84d35836af780f1de https://conda.anaconda.org/conda-forge/linux-64/libedit-3.1.20250104-pl5321h7949ede_0.conda#c277e0a4d549b03ac1e9d6cbbe3d017b https://conda.anaconda.org/conda-forge/linux-64/libgfortran-14.2.0-h69a702a_2.conda#fb54c4ea68b460c278d26eea89cfbcc3 https://conda.anaconda.org/conda-forge/linux-64/libhwy-1.2.0-hf40a0c7_0.conda#2f433d593a66044c3f163cb25f0a09de -https://conda.anaconda.org/conda-forge/linux-64/libjpeg-turbo-3.0.0-hd590300_1.conda#ea25936bb4080d843790b586850f82b8 https://conda.anaconda.org/conda-forge/linux-64/libnsl-2.0.1-hd590300_0.conda#30fd6e37fe21f86f4bd26d6ee73eeec7 https://conda.anaconda.org/conda-forge/linux-64/libpciaccess-0.18-hd590300_0.conda#48f4330bfcd959c3cfb704d424903c82 https://conda.anaconda.org/conda-forge/linux-64/libpng-1.6.47-h943b412_0.conda#55199e2ae2c3651f6f9b2a447b47bdc9 @@ -69,12 +70,14 @@ https://conda.anaconda.org/conda-forge/linux-64/libxcb-1.17.0-h8a09558_0.conda#9 https://conda.anaconda.org/conda-forge/linux-64/libxcrypt-4.4.36-hd590300_1.conda#5aa797f8787fe7a17d1b0821485b5adc https://conda.anaconda.org/conda-forge/linux-64/lz4-c-1.10.0-h5888daf_1.conda#9de5350a85c4a20c685259b889aa6393 https://conda.anaconda.org/conda-forge/linux-64/mysql-common-9.2.0-h266115a_0.conda#db22a0962c953e81a2a679ecb1fc6027 +https://conda.anaconda.org/conda-forge/linux-64/ninja-1.12.1-hff21bea_1.conda#2322531904f27501ee19847b87ba7c64 https://conda.anaconda.org/conda-forge/linux-64/pixman-0.44.2-h29eaf8c_0.conda#5e2a7acfa2c24188af39e7944e1b3604 https://conda.anaconda.org/conda-forge/linux-64/rav1e-0.6.6-he8a937b_2.conda#77d9955b4abddb811cb8ab1aa7d743e4 https://conda.anaconda.org/conda-forge/linux-64/readline-8.2-h8c095d6_2.conda#283b96675859b20a825f8fa30f311446 https://conda.anaconda.org/conda-forge/linux-64/snappy-1.2.1-h8bd8927_1.conda#3b3e64af585eadfb52bb90b553db5edf https://conda.anaconda.org/conda-forge/linux-64/svt-av1-3.0.2-h5888daf_0.conda#0096882bd623e6cc09e8bf920fc8fb47 https://conda.anaconda.org/conda-forge/linux-64/tk-8.6.13-noxft_h4845f30_101.conda#d453b98d9c83e71da0741bb0ff4d76bc +https://conda.anaconda.org/conda-forge/linux-64/wayland-1.23.1-h3e06ad9_1.conda#a37843723437ba75f42c9270ffe800b1 https://conda.anaconda.org/conda-forge/linux-64/zfp-1.0.1-h5888daf_2.conda#e0409515c467b87176b070bff5d9442e https://conda.anaconda.org/conda-forge/linux-64/zlib-ng-2.2.4-h7955e40_0.conda#c8a816dbf59eb8ba6346a8f10014b302 https://conda.anaconda.org/conda-forge/linux-64/zstd-1.5.7-hb8e6e7a_2.conda#6432cb5d4ac0046c3ac0a8a0f95842f9 @@ -83,23 +86,21 @@ https://conda.anaconda.org/conda-forge/linux-64/blosc-1.21.6-he440d0b_1.conda#2c https://conda.anaconda.org/conda-forge/linux-64/brotli-bin-1.1.0-hb9d3cd8_2.conda#c63b5e52939e795ba8d26e35d767a843 https://conda.anaconda.org/conda-forge/linux-64/c-blosc2-2.15.2-h3122c55_1.conda#2bc8d76acd818d7e79229f5157d5c156 https://conda.anaconda.org/conda-forge/linux-64/charls-2.4.2-h59595ed_0.conda#4336bd67920dd504cd8c6761d6a99645 -https://conda.anaconda.org/conda-forge/linux-64/freetype-2.13.3-h48d6fc4_0.conda#9ecfd6f2ca17077dd9c2d24770bb9ccd https://conda.anaconda.org/conda-forge/linux-64/gcc_impl_linux-64-13.3.0-h1e990d8_2.conda#f46cf0acdcb6019397d37df1e407ab91 https://conda.anaconda.org/conda-forge/linux-64/graphite2-1.3.13-h59595ed_1003.conda#f87c7b7c2cb45f323ffbce941c78ab7c https://conda.anaconda.org/conda-forge/linux-64/icu-75.1-he02047a_0.conda#8b189310083baabfb622af68fd9d3ae3 https://conda.anaconda.org/conda-forge/linux-64/krb5-1.21.3-h659f571_0.conda#3f43953b7d3fb3aaa1d0d0723d91e368 -https://conda.anaconda.org/conda-forge/linux-64/lerc-4.0.0-h27087fc_0.tar.bz2#76bbff344f0134279f225174e9064c8f https://conda.anaconda.org/conda-forge/linux-64/libaec-1.1.3-h59595ed_0.conda#5e97e271911b8b2001a8b71860c32faa https://conda.anaconda.org/conda-forge/linux-64/libdrm-2.4.124-hb9d3cd8_0.conda#8bc89311041d7fcb510238cf0848ccae +https://conda.anaconda.org/conda-forge/linux-64/libfreetype6-2.13.3-h48d6fc4_1.conda#3c255be50a506c50765a93a6644f32fe https://conda.anaconda.org/conda-forge/linux-64/libjxl-0.11.1-h7b0646d_1.conda#959fc2b6c0df7883e070b3fe525219a5 https://conda.anaconda.org/conda-forge/linux-64/libopenblas-0.3.29-pthreads_h94d23a6_0.conda#0a4d0252248ef9a0f88f2ba8b8a08e12 +https://conda.anaconda.org/conda-forge/linux-64/libtiff-4.7.0-hd9ff511_4.conda#6c1028898cf3a2032d9af46689e1b81a https://conda.anaconda.org/conda-forge/linux-64/libzopfli-1.0.3-h9c3ff4c_0.tar.bz2#c66fe2d123249af7651ebde8984c51c2 https://conda.anaconda.org/conda-forge/linux-64/mysql-libs-9.2.0-he0572af_0.conda#93340b072c393d23c4700a1d40565dca -https://conda.anaconda.org/conda-forge/linux-64/ninja-1.12.1-h297d8ca_0.conda#3aa1c7e292afeff25a0091ddd7c69b72 https://conda.anaconda.org/conda-forge/linux-64/pcre2-10.44-hba22ea6_2.conda#df359c09c41cd186fffb93a2d87aa6f5 https://conda.anaconda.org/conda-forge/linux-64/python-3.10.17-hd6af730_0_cpython.conda#7bb89638dae9ce1b8e051d0b721e83c2 https://conda.anaconda.org/conda-forge/linux-64/qhull-2020.2-h434a139_5.conda#353823361b1d27eb3960efb076dfcaf6 -https://conda.anaconda.org/conda-forge/linux-64/wayland-1.23.1-h3e06ad9_0.conda#0a732427643ae5e0486a727927791da1 https://conda.anaconda.org/conda-forge/linux-64/xcb-util-0.4.1-hb711507_2.conda#8637c3e5821654d0edf97e2b0404b443 https://conda.anaconda.org/conda-forge/linux-64/xcb-util-keysyms-0.4.1-hb711507_0.conda#ad748ccca349aec3e91743e08b5e2b50 https://conda.anaconda.org/conda-forge/linux-64/xcb-util-renderutil-0.3.10-hb711507_0.conda#0e0cbe0564d03a99afd5fd7b362feecd @@ -113,13 +114,13 @@ https://conda.anaconda.org/conda-forge/noarch/certifi-2025.1.31-pyhd8ed1ab_0.con https://conda.anaconda.org/conda-forge/noarch/charset-normalizer-3.4.1-pyhd8ed1ab_0.conda#e83a31202d1c0a000fce3e9cf3825875 https://conda.anaconda.org/conda-forge/noarch/click-8.1.8-pyh707e725_0.conda#f22f4d4970e09d68a10b922cbb0408d3 https://conda.anaconda.org/conda-forge/noarch/colorama-0.4.6-pyhd8ed1ab_1.conda#962b9857ee8e7018c22f2776ffa0b2d7 +https://conda.anaconda.org/conda-forge/noarch/cpython-3.10.17-py310hd8ed1ab_0.conda#e2b81369f0473107784f8b7da8e6a8e9 https://conda.anaconda.org/conda-forge/noarch/cycler-0.12.1-pyhd8ed1ab_1.conda#44600c4667a319d67dbe0681fc0bc833 https://conda.anaconda.org/conda-forge/linux-64/cyrus-sasl-2.1.27-h54b06d7_7.conda#dce22f70b4e5a407ce88f2be046f4ceb https://conda.anaconda.org/conda-forge/linux-64/cython-3.0.12-py310had8cdd9_0.conda#b630fe36f0b621d23e74872dc4fd2bd7 https://conda.anaconda.org/conda-forge/noarch/docutils-0.21.2-pyhd8ed1ab_1.conda#24c1ca34138ee57de72a943237cde4cc https://conda.anaconda.org/conda-forge/noarch/exceptiongroup-1.2.2-pyhd8ed1ab_1.conda#a16662747cdeb9abbac74d0057cc976e https://conda.anaconda.org/conda-forge/noarch/execnet-2.1.1-pyhd8ed1ab_1.conda#a71efeae2c160f6789900ba2631a2c90 -https://conda.anaconda.org/conda-forge/linux-64/fontconfig-2.15.0-h7e30c49_1.conda#8f5b0b297b59e1ac160ad4beec99dbee https://conda.anaconda.org/conda-forge/linux-64/gcc-13.3.0-h9576a4e_2.conda#d92e51bf4b6bdbfe45e5884fb0755afe https://conda.anaconda.org/conda-forge/linux-64/gcc_linux-64-13.3.0-hc28eda2_10.conda#d151142bbafe5e68ec7fc065c5e6f80c https://conda.anaconda.org/conda-forge/linux-64/gfortran_impl_linux-64-13.3.0-h84c1745_2.conda#4e21ed177b76537067736f20f54fee0a @@ -130,19 +131,21 @@ https://conda.anaconda.org/conda-forge/noarch/idna-3.10-pyhd8ed1ab_1.conda#39a4f https://conda.anaconda.org/conda-forge/noarch/imagesize-1.4.1-pyhd8ed1ab_0.tar.bz2#7de5386c8fea29e76b303f37dde4c352 https://conda.anaconda.org/conda-forge/noarch/iniconfig-2.0.0-pyhd8ed1ab_1.conda#6837f3eff7dcea42ecd714ce1ac2b108 https://conda.anaconda.org/conda-forge/linux-64/kiwisolver-1.4.7-py310h3788b33_0.conda#4186d9b4d004b0fe0de6aa62496fb48a +https://conda.anaconda.org/conda-forge/linux-64/lcms2-2.17-h717163a_0.conda#000e85703f0fd9594c81710dd5066471 https://conda.anaconda.org/conda-forge/linux-64/libavif16-1.2.1-hbb36593_2.conda#971387a27e61235b97cacb440a37e991 https://conda.anaconda.org/conda-forge/linux-64/libblas-3.9.0-31_h59b9bed_openblas.conda#728dbebd0f7a20337218beacffd37916 https://conda.anaconda.org/conda-forge/linux-64/libcups-2.3.3-h4637d8d_4.conda#d4529f4dff3057982a7617c7ac58fde3 +https://conda.anaconda.org/conda-forge/linux-64/libfreetype-2.13.3-ha770c72_1.conda#51f5be229d83ecd401fb369ab96ae669 https://conda.anaconda.org/conda-forge/linux-64/libglib-2.84.1-h2ff4ddf_0.conda#0305434da649d4fb48a425e588b79ea6 https://conda.anaconda.org/conda-forge/linux-64/libglx-1.7.0-ha4b6fd6_2.conda#c8013e438185f33b13814c5c488acd5c -https://conda.anaconda.org/conda-forge/linux-64/libtiff-4.7.0-hd9ff511_3.conda#0ea6510969e1296cc19966fad481f6de https://conda.anaconda.org/conda-forge/linux-64/libxml2-2.13.7-h4bc477f_1.conda#ad1f1f8238834cd3c88ceeaee8da444a https://conda.anaconda.org/conda-forge/linux-64/markupsafe-3.0.2-py310h89163eb_1.conda#8ce3f0332fd6de0d737e2911d329523f https://conda.anaconda.org/conda-forge/noarch/munkres-1.1.4-pyh9f0ad1d_0.tar.bz2#2ba8498c1018c1e9c61eb99b973dfe19 -https://conda.anaconda.org/conda-forge/noarch/narwhals-1.35.0-pyh29332c3_0.conda#86a90869622c2257d2f38be54820109c +https://conda.anaconda.org/conda-forge/noarch/narwhals-1.36.0-pyh29332c3_0.conda#3def833a2e07af8713090bb484e1f0b1 https://conda.anaconda.org/conda-forge/noarch/networkx-3.4.2-pyh267e887_2.conda#fd40bf7f7f4bc4b647dc8512053d9873 https://conda.anaconda.org/conda-forge/linux-64/openblas-0.3.29-pthreads_h6ec200e_0.conda#7e4d48870b3258bea920d51b7f495a81 -https://conda.anaconda.org/conda-forge/noarch/packaging-24.2-pyhd8ed1ab_2.conda#3bfed7e6228ebf2f7b9eaa47f1b4e2aa +https://conda.anaconda.org/conda-forge/linux-64/openjpeg-2.5.3-h5fbd93e_0.conda#9e5816bc95d285c115a3ebc2f8563564 +https://conda.anaconda.org/conda-forge/noarch/packaging-25.0-pyh29332c3_1.conda#58335b26c38bf4a20f399384c33cbcf9 https://conda.anaconda.org/conda-forge/noarch/platformdirs-4.3.7-pyh29332c3_0.conda#e57da6fe54bb3a5556cf36d199ff07d8 https://conda.anaconda.org/conda-forge/noarch/pluggy-1.5.0-pyhd8ed1ab_1.conda#e9dcbce5f45f9ee500e728ae58b605b6 https://conda.anaconda.org/conda-forge/linux-64/psutil-7.0.0-py310ha75aee5_0.conda#da7d592394ff9084a23f62a1186451a2 @@ -152,7 +155,7 @@ https://conda.anaconda.org/conda-forge/noarch/pyparsing-3.2.3-pyhd8ed1ab_1.conda https://conda.anaconda.org/conda-forge/noarch/pysocks-1.7.1-pyha55dd90_7.conda#461219d1a5bd61342293efa2c0c90eac https://conda.anaconda.org/conda-forge/noarch/python-tzdata-2025.2-pyhd8ed1ab_0.conda#88476ae6ebd24f39261e0854ac244f33 https://conda.anaconda.org/conda-forge/noarch/pytz-2025.2-pyhd8ed1ab_0.conda#bc8e3267d44011051f2eb14d22fb0960 -https://conda.anaconda.org/conda-forge/noarch/setuptools-78.1.0-pyhff2d567_0.conda#a42da9837e46c53494df0044c3eb1f53 +https://conda.anaconda.org/conda-forge/noarch/setuptools-79.0.1-pyhff2d567_0.conda#fa6669cc21abd4b7b6c5393b7bc71914 https://conda.anaconda.org/conda-forge/noarch/six-1.17.0-pyhd8ed1ab_0.conda#a451d576819089b0d672f18768be0f65 https://conda.anaconda.org/conda-forge/noarch/snowballstemmer-2.2.0-pyhd8ed1ab_0.tar.bz2#4d22a9315e78c6827f806065957d566e https://conda.anaconda.org/conda-forge/noarch/soupsieve-2.5-pyhd8ed1ab_1.conda#3f144b2c34f8cb5a9abd9ed23a39c561 @@ -165,7 +168,7 @@ https://conda.anaconda.org/conda-forge/noarch/typing_extensions-4.13.2-pyh29332c https://conda.anaconda.org/conda-forge/linux-64/unicodedata2-16.0.0-py310ha75aee5_0.conda#1d7a4b9202cdd10d56ecdd7f6c347190 https://conda.anaconda.org/conda-forge/noarch/wheel-0.45.1-pyhd8ed1ab_1.conda#75cb7132eb58d97896e173ef12ac9986 https://conda.anaconda.org/conda-forge/linux-64/xcb-util-image-0.4.0-hb711507_2.conda#a0901183f08b6c7107aab109733a3c91 -https://conda.anaconda.org/conda-forge/linux-64/xkeyboard-config-2.43-hb9d3cd8_0.conda#f725c7425d6d7c15e31f3b99a88ea02f +https://conda.anaconda.org/conda-forge/linux-64/xkeyboard-config-2.44-hb9d3cd8_0.conda#7c91bfc90672888259675ad2ad28af9c https://conda.anaconda.org/conda-forge/linux-64/xorg-libxext-1.3.6-hb9d3cd8_0.conda#febbab7d15033c913d53c7a2c102309d https://conda.anaconda.org/conda-forge/linux-64/xorg-libxfixes-6.0.1-hb9d3cd8_0.conda#4bdb303603e9821baf5fe5fdff1dc8f8 https://conda.anaconda.org/conda-forge/linux-64/xorg-libxrender-0.9.12-hb9d3cd8_0.conda#96d57aba173e878a2089d5638016dc5e @@ -174,10 +177,10 @@ https://conda.anaconda.org/conda-forge/noarch/accessible-pygments-0.0.5-pyhd8ed1 https://conda.anaconda.org/conda-forge/noarch/babel-2.17.0-pyhd8ed1ab_0.conda#0a01c169f0ab0f91b26e77a3301fbfe4 https://conda.anaconda.org/conda-forge/linux-64/brunsli-0.1-h9c3ff4c_0.tar.bz2#c1ac6229d0bfd14f8354ff9ad2a26cad https://conda.anaconda.org/conda-forge/linux-64/c-compiler-1.9.0-h2b85faf_0.conda#3cb814f83f1f71ac1985013697f80cc1 -https://conda.anaconda.org/conda-forge/linux-64/cairo-1.18.4-h3394656_0.conda#09262e66b19567aff4f592fb53b28760 https://conda.anaconda.org/conda-forge/linux-64/cffi-1.17.1-py310h8deb56e_0.conda#1fc24a3196ad5ede2a68148be61894f4 https://conda.anaconda.org/conda-forge/linux-64/dbus-1.13.6-h5008d03_3.tar.bz2#ecfff944ba3960ecb334b9a2663d708d https://conda.anaconda.org/conda-forge/linux-64/fonttools-4.57.0-py310h89163eb_0.conda#34378af82141b3c1725dcdf898b28fc6 +https://conda.anaconda.org/conda-forge/linux-64/freetype-2.13.3-ha770c72_1.conda#9ccd736d31e0c6e41f54e704e5312811 https://conda.anaconda.org/conda-forge/linux-64/gfortran-13.3.0-h9576a4e_2.conda#19e6d3c9cde10a0a9a170a684082588e https://conda.anaconda.org/conda-forge/linux-64/gfortran_linux-64-13.3.0-hb919d3a_10.conda#7ce070e3329cd10bf79dbed562a21bd4 https://conda.anaconda.org/conda-forge/linux-64/gxx-13.3.0-h9576a4e_2.conda#07e8df00b7cd3084ad3ef598ce32a71c @@ -187,22 +190,21 @@ https://conda.anaconda.org/conda-forge/noarch/importlib-metadata-8.6.1-pyha770c7 https://conda.anaconda.org/conda-forge/noarch/importlib_resources-6.5.2-pyhd8ed1ab_0.conda#c85c76dc67d75619a92f51dfbce06992 https://conda.anaconda.org/conda-forge/noarch/jinja2-3.1.6-pyhd8ed1ab_0.conda#446bd6c8cb26050d528881df495ce646 https://conda.anaconda.org/conda-forge/noarch/joblib-1.4.2-pyhd8ed1ab_1.conda#bf8243ee348f3a10a14ed0cae323e0c1 -https://conda.anaconda.org/conda-forge/linux-64/lcms2-2.17-h717163a_0.conda#000e85703f0fd9594c81710dd5066471 https://conda.anaconda.org/conda-forge/linux-64/libcblas-3.9.0-31_he106b2a_openblas.conda#abb32c727da370c481a1c206f5159ce9 https://conda.anaconda.org/conda-forge/linux-64/libgl-1.7.0-ha4b6fd6_2.conda#928b8be80851f5d8ffb016f9c81dae7a https://conda.anaconda.org/conda-forge/linux-64/liblapack-3.9.0-31_h7ac8fdf_openblas.conda#452b98eafe050ecff932f0ec832dd03f https://conda.anaconda.org/conda-forge/linux-64/libllvm20-20.1.3-he9d0ab4_0.conda#74c14fe2ab88e352ab6e4fedf5ecb527 -https://conda.anaconda.org/conda-forge/linux-64/libxkbcommon-1.8.1-hc4a0caf_0.conda#e7e5b0652227d646b44abdcbd989da7b +https://conda.anaconda.org/conda-forge/linux-64/libxkbcommon-1.9.0-h65c71a3_0.conda#14fbc598b68d4c6386978f7db09fc5ed https://conda.anaconda.org/conda-forge/linux-64/libxslt-1.1.39-h76b75d6_0.conda#e71f31f8cfb0a91439f2086fc8aa0461 https://conda.anaconda.org/conda-forge/noarch/memory_profiler-0.61.0-pyhd8ed1ab_1.conda#71abbefb6f3b95e1668cd5e0af3affb9 https://conda.anaconda.org/conda-forge/noarch/meson-1.7.1-pyhd8ed1ab_0.conda#90018ee73b8741268027421ceac2809a -https://conda.anaconda.org/conda-forge/linux-64/openjpeg-2.5.3-h5fbd93e_0.conda#9e5816bc95d285c115a3ebc2f8563564 https://conda.anaconda.org/conda-forge/linux-64/openldap-2.6.9-he970967_0.conda#ca2de8bbdc871bce41dbf59e51324165 -https://conda.anaconda.org/conda-forge/noarch/pip-25.0.1-pyh8b19718_0.conda#79b5c1440aedc5010f687048d9103628 +https://conda.anaconda.org/conda-forge/noarch/pip-25.1-pyh8b19718_0.conda#2247aa245832ea47e8b971bef73d7094 https://conda.anaconda.org/conda-forge/noarch/plotly-6.0.1-pyhd8ed1ab_0.conda#37ce02c899ff42ac5c554257b1a5906e https://conda.anaconda.org/conda-forge/noarch/pyproject-metadata-0.9.1-pyhd8ed1ab_0.conda#22ae7c6ea81e0c8661ef32168dda929b https://conda.anaconda.org/conda-forge/noarch/pytest-8.3.5-pyhd8ed1ab_0.conda#c3c9316209dec74a705a36797970c6be https://conda.anaconda.org/conda-forge/noarch/python-dateutil-2.9.0.post0-pyhff2d567_1.conda#5ba79d7c71f03c678c8ead841f347d6e +https://conda.anaconda.org/conda-forge/noarch/python-gil-3.10.17-hd8ed1ab_0.conda#c856adbd93a57004e21cd26564f4f724 https://conda.anaconda.org/conda-forge/noarch/typing-extensions-4.13.2-h0e9735f_0.conda#568ed1300869dca0ba09fb750cda5dbb https://conda.anaconda.org/conda-forge/linux-64/xcb-util-cursor-0.1.5-hb9d3cd8_0.conda#eb44b3b6deb1cab08d72cb61686fe64c https://conda.anaconda.org/conda-forge/linux-64/xorg-libxcomposite-0.4.6-hb9d3cd8_2.conda#d3c295b50f092ab525ffe3c2aa4b7413 @@ -211,10 +213,11 @@ https://conda.anaconda.org/conda-forge/linux-64/xorg-libxdamage-1.1.6-hb9d3cd8_0 https://conda.anaconda.org/conda-forge/linux-64/xorg-libxi-1.8.2-hb9d3cd8_0.conda#17dcc85db3c7886650b8908b183d6876 https://conda.anaconda.org/conda-forge/linux-64/xorg-libxrandr-1.5.4-hb9d3cd8_0.conda#2de7f99d6581a4a7adbff607b5c278ca https://conda.anaconda.org/conda-forge/linux-64/xorg-libxxf86vm-1.1.6-hb9d3cd8_0.conda#5efa5fa6243a622445fdfd72aee15efa +https://conda.anaconda.org/conda-forge/noarch/_python_abi3_support-1.0-hd8ed1ab_2.conda#aaa2a381ccc56eac91d63b6c1240312f https://conda.anaconda.org/conda-forge/noarch/beautifulsoup4-4.13.4-pyha770c72_0.conda#9f07c4fc992adb2d6c30da7fab3959a7 https://conda.anaconda.org/conda-forge/linux-64/cxx-compiler-1.9.0-h1a2810e_0.conda#1ce8b218d359d9ed0ab481f2a3f3c512 +https://conda.anaconda.org/conda-forge/linux-64/fontconfig-2.15.0-h7e30c49_1.conda#8f5b0b297b59e1ac160ad4beec99dbee https://conda.anaconda.org/conda-forge/linux-64/fortran-compiler-1.9.0-h36df796_0.conda#cc0cf942201f9d3b0e9654ea02e12486 -https://conda.anaconda.org/conda-forge/linux-64/harfbuzz-11.1.0-h3beb420_0.conda#95e3bb97f9cdc251c0c68640e9c10ed3 https://conda.anaconda.org/conda-forge/noarch/importlib-resources-6.5.2-pyhd8ed1ab_0.conda#e376ea42e9ae40f3278b0f79c9bf9826 https://conda.anaconda.org/conda-forge/noarch/lazy-loader-0.4-pyhd8ed1ab_2.conda#d10d9393680734a8febc4b362a4c94f2 https://conda.anaconda.org/conda-forge/linux-64/libclang-cpp20.1-20.1.3-default_h1df26ce_0.conda#bbce8ba7f25af8b0928f13fca1eb7405 @@ -228,6 +231,7 @@ https://conda.anaconda.org/conda-forge/noarch/pytest-xdist-3.6.1-pyhd8ed1ab_1.co https://conda.anaconda.org/conda-forge/linux-64/xorg-libxtst-1.2.5-hb9d3cd8_3.conda#7bbe9a0cc0df0ac5f5a8ad6d6a11af2f https://conda.anaconda.org/conda-forge/linux-64/zstandard-0.23.0-py310ha75aee5_1.conda#0316e8d0e00c00631a6de89207db5b09 https://conda.anaconda.org/conda-forge/linux-64/blas-devel-3.9.0-31_h1ea3ea9_openblas.conda#ba652ee0576396d4765e567f043c57f9 +https://conda.anaconda.org/conda-forge/linux-64/cairo-1.18.4-h3394656_0.conda#09262e66b19567aff4f592fb53b28760 https://conda.anaconda.org/conda-forge/linux-64/compilers-1.9.0-ha770c72_0.conda#5859096e397aba423340d0bbbb11ec64 https://conda.anaconda.org/conda-forge/linux-64/contourpy-1.3.2-py310h3788b33_0.conda#b6420d29123c7c823de168f49ccdfe6a https://conda.anaconda.org/conda-forge/linux-64/imagecodecs-2024.12.30-py310h78a9a29_0.conda#e0c50079904122427bcf52e1afcd1cdb @@ -235,24 +239,25 @@ https://conda.anaconda.org/conda-forge/noarch/imageio-2.37.0-pyhfb79c49_0.conda# https://conda.anaconda.org/conda-forge/noarch/lazy_loader-0.4-pyhd8ed1ab_2.conda#bb0230917e2473c77d615104dbe8a49d https://conda.anaconda.org/conda-forge/linux-64/pandas-2.2.3-py310h5eaa309_3.conda#07697a584fab513ce895c4511f7a2403 https://conda.anaconda.org/conda-forge/noarch/patsy-1.0.1-pyhd8ed1ab_1.conda#ee23fabfd0a8c6b8d6f3729b47b2859d -https://conda.anaconda.org/conda-forge/linux-64/polars-1.27.1-py310h5fb5f9c_1.conda#243bbc7d64dbe250cd5e4f07a61039a5 +https://conda.anaconda.org/conda-forge/linux-64/polars-1.27.1-py39h2a4a510_3.conda#fba08963eaa1f954480045d033d1221e https://conda.anaconda.org/conda-forge/linux-64/pywavelets-1.8.0-py310hf462985_0.conda#4c441eff2be2e65bd67765c5642051c5 -https://conda.anaconda.org/conda-forge/linux-64/qt6-main-6.9.0-h6441bc3_1.conda#4029a8dcb1d97ea241dbe5abfda1fad6 https://conda.anaconda.org/conda-forge/linux-64/scipy-1.15.2-py310h1d65ade_0.conda#8c29cd33b64b2eb78597fa28b5595c8d https://conda.anaconda.org/conda-forge/noarch/towncrier-24.8.0-pyhd8ed1ab_1.conda#820b6a1ddf590fba253f8204f7200d82 https://conda.anaconda.org/conda-forge/noarch/urllib3-2.4.0-pyhd8ed1ab_0.conda#c1e349028e0052c4eea844e94f773065 https://conda.anaconda.org/conda-forge/linux-64/blas-2.131-openblas.conda#38b2ec894c69bb4be0e66d2ef7fc60bf +https://conda.anaconda.org/conda-forge/linux-64/harfbuzz-11.1.0-h3beb420_0.conda#95e3bb97f9cdc251c0c68640e9c10ed3 https://conda.anaconda.org/conda-forge/linux-64/matplotlib-base-3.10.1-py310h68603db_0.conda#29cf3f5959afb841eda926541f26b0fb https://conda.anaconda.org/conda-forge/linux-64/pyamg-5.2.1-py310ha2bacc8_1.conda#817d32861729e14f474249f1036291c4 -https://conda.anaconda.org/conda-forge/linux-64/pyside6-6.9.0-py310hfd10a26_0.conda#1610ccfe262ee519716bb69bd4395572 https://conda.anaconda.org/conda-forge/noarch/requests-2.32.3-pyhd8ed1ab_1.conda#a9b9368f3701a417eac9edbcae7cb737 https://conda.anaconda.org/conda-forge/linux-64/statsmodels-0.14.4-py310hf462985_0.conda#636d3c500d8a851e377360e88ec95372 https://conda.anaconda.org/conda-forge/noarch/tifffile-2025.3.30-pyhd8ed1ab_0.conda#14f46147fae19bb867f82a787c7059e9 -https://conda.anaconda.org/conda-forge/linux-64/matplotlib-3.10.1-py310hff52083_0.conda#45c1ad6a0351492b56d1b2bb5442cdfa https://conda.anaconda.org/conda-forge/noarch/pooch-1.8.2-pyhd8ed1ab_1.conda#b3e783e8e8ed7577cf0b6dee37d1fbac +https://conda.anaconda.org/conda-forge/linux-64/qt6-main-6.9.0-h6441bc3_1.conda#4029a8dcb1d97ea241dbe5abfda1fad6 https://conda.anaconda.org/conda-forge/linux-64/scikit-image-0.25.2-py310h5eaa309_0.conda#4cc3a231679ecb3c0ba20ebf3c27d12e https://conda.anaconda.org/conda-forge/noarch/seaborn-base-0.13.2-pyhd8ed1ab_3.conda#fd96da444e81f9e6fcaac38590f3dd42 +https://conda.anaconda.org/conda-forge/linux-64/pyside6-6.9.0-py310hfd10a26_0.conda#1610ccfe262ee519716bb69bd4395572 https://conda.anaconda.org/conda-forge/noarch/seaborn-0.13.2-hd8ed1ab_3.conda#62afb877ca2c2b4b6f9ecb37320085b6 +https://conda.anaconda.org/conda-forge/linux-64/matplotlib-3.10.1-py310hff52083_0.conda#45c1ad6a0351492b56d1b2bb5442cdfa https://conda.anaconda.org/conda-forge/noarch/numpydoc-1.8.0-pyhd8ed1ab_1.conda#5af206d64d18d6c8dfb3122b4d9e643b https://conda.anaconda.org/conda-forge/noarch/pydata-sphinx-theme-0.16.1-pyhd8ed1ab_0.conda#837aaf71ddf3b27acae0e7e9015eebc6 https://conda.anaconda.org/conda-forge/noarch/sphinx-copybutton-0.5.2-pyhd8ed1ab_1.conda#bf22cb9c439572760316ce0748af3713 @@ -310,7 +315,7 @@ https://conda.anaconda.org/conda-forge/noarch/sphinxext-opengraph-0.9.1-pyhd8ed1 # pip argon2-cffi @ https://files.pythonhosted.org/packages/a4/6a/e8a041599e78b6b3752da48000b14c8d1e8a04ded09c88c714ba047f34f5/argon2_cffi-23.1.0-py3-none-any.whl#sha256=c670642b78ba29641818ab2e68bd4e6a78ba53b7eff7b4c3815ae16abf91c7ea # pip bleach @ https://files.pythonhosted.org/packages/fc/55/96142937f66150805c25c4d0f31ee4132fd33497753400734f9dfdcbdc66/bleach-6.2.0-py3-none-any.whl#sha256=117d9c6097a7c3d22fd578fcd8d35ff1e125df6736f554da4e432fdd63f31e5e # pip isoduration @ https://files.pythonhosted.org/packages/7b/55/e5326141505c5d5e34c5e0935d2908a74e4561eca44108fbfb9c13d2911a/isoduration-20.11.0-py3-none-any.whl#sha256=b2904c2a4228c3d44f409c8ae8e2370eb21a26f7ac2ec5446df141dde3452042 -# pip jsonschema-specifications @ https://files.pythonhosted.org/packages/d1/0f/8910b19ac0670a0f80ce1008e5e751c4a57e14d2c4c13a482aa6079fa9d6/jsonschema_specifications-2024.10.1-py3-none-any.whl#sha256=a09a0680616357d9a0ecf05c12ad234479f549239d0f5b55f3deea67475da9bf +# pip jsonschema-specifications @ https://files.pythonhosted.org/packages/01/0e/b27cdbaccf30b890c40ed1da9fd4a3593a5cf94dae54fb34f8a4b74fcd3f/jsonschema_specifications-2025.4.1-py3-none-any.whl#sha256=4653bffbd6584f7de83a67e0d620ef16900b390ddc7939d56684d6c81e33f1af # pip jupyter-client @ https://files.pythonhosted.org/packages/11/85/b0394e0b6fcccd2c1eeefc230978a6f8cb0c5df1e4cd3e7625735a0d7d1e/jupyter_client-8.6.3-py3-none-any.whl#sha256=e8a19cc986cc45905ac3362915f410f3af85424b4c0905e94fa5f2cb08e8f23f # pip jupyter-server-terminals @ https://files.pythonhosted.org/packages/07/2d/2b32cdbe8d2a602f697a649798554e4f072115438e92249624e532e8aca6/jupyter_server_terminals-0.5.3-py3-none-any.whl#sha256=41ee0d7dc0ebf2809c668e0fc726dfaf258fcd3e769568996ca731b6194ae9aa # pip jupyterlite-core @ https://files.pythonhosted.org/packages/46/15/1d9160819d1e6e018d15de0e98b9297d0a09cfcfdc73add6e24ee3b2b83c/jupyterlite_core-0.5.1-py3-none-any.whl#sha256=76381619a632f06bf67fb47e5464af762ad8836df5ffe3d7e7ee0e316c1407ee @@ -319,7 +324,7 @@ https://conda.anaconda.org/conda-forge/noarch/sphinxext-opengraph-0.9.1-pyhd8ed1 # pip jupyterlite-pyodide-kernel @ https://files.pythonhosted.org/packages/1b/b5/959a03ca011d1031abac03c18af9e767c18d6a9beb443eb106dda609748c/jupyterlite_pyodide_kernel-0.5.2-py3-none-any.whl#sha256=63ba6ce28d32f2cd19f636c40c153e171369a24189e11e2235457bd7000c5907 # pip jupyter-events @ https://files.pythonhosted.org/packages/e2/48/577993f1f99c552f18a0428731a755e06171f9902fa118c379eb7c04ea22/jupyter_events-0.12.0-py3-none-any.whl#sha256=6464b2fa5ad10451c3d35fabc75eab39556ae1e2853ad0c0cc31b656731a97fb # pip nbformat @ https://files.pythonhosted.org/packages/a9/82/0340caa499416c78e5d8f5f05947ae4bc3cba53c9f038ab6e9ed964e22f1/nbformat-5.10.4-py3-none-any.whl#sha256=3b48d6c8fbca4b299bf3982ea7db1af21580e4fec269ad087b9e81588891200b -# pip jupytext @ https://files.pythonhosted.org/packages/dc/46/c2fb92e01eb0423bae7fe91c3bf2ca994069f299a6455919f4a9a12960ed/jupytext-1.17.0-py3-none-any.whl#sha256=d75b7cd198b3640a12f9cdf4d610bb80c9f27a8c3318b00372f90d21466d40e1 +# pip jupytext @ https://files.pythonhosted.org/packages/12/b7/e7e3d34c8095c19228874b1babedfb5d901374e40d51ae66f2a90203be53/jupytext-1.17.1-py3-none-any.whl#sha256=99145b1e1fa96520c21ba157de7d354ffa4904724dcebdcd70b8413688a312de # pip nbclient @ https://files.pythonhosted.org/packages/34/6d/e7fa07f03a4a7b221d94b4d586edb754a9b0dc3c9e2c93353e9fa4e0d117/nbclient-0.10.2-py3-none-any.whl#sha256=4ffee11e788b4a27fabeb7955547e4318a5298f34342a4bfd01f2e1faaeadc3d # pip nbconvert @ https://files.pythonhosted.org/packages/cc/9a/cd673b2f773a12c992f41309ef81b99da1690426bd2f96957a7ade0d3ed7/nbconvert-7.16.6-py3-none-any.whl#sha256=1375a7b67e0c2883678c48e506dc320febb57685e5ee67faa51b18a90f3a712b # pip jupyter-server @ https://files.pythonhosted.org/packages/e2/a2/89eeaf0bb954a123a909859fa507fa86f96eb61b62dc30667b60dbd5fdaf/jupyter_server-2.15.0-py3-none-any.whl#sha256=872d989becf83517012ee669f09604aa4a28097c0bd90b2f424310156c2cdae3 diff --git a/build_tools/circle/doc_min_dependencies_linux-64_conda.lock b/build_tools/circle/doc_min_dependencies_linux-64_conda.lock index a036e24b39f95..8aa95b7971683 100644 --- a/build_tools/circle/doc_min_dependencies_linux-64_conda.lock +++ b/build_tools/circle/doc_min_dependencies_linux-64_conda.lock @@ -2,14 +2,14 @@ # platform: linux-64 # input_hash: 1ff580fa5b39efc9a616b69d09ea9208049b15bb1bd5e42883b7295d717cc6ba @EXPLICIT -https://conda.anaconda.org/conda-forge/linux-64/ca-certificates-2025.1.31-hbcca054_0.conda#19f3a56f68d2fd06c516076bff482c52 https://conda.anaconda.org/conda-forge/noarch/font-ttf-dejavu-sans-mono-2.37-hab24e00_0.tar.bz2#0c96522c6bdaed4b1566d11387caaf45 https://conda.anaconda.org/conda-forge/noarch/font-ttf-inconsolata-3.000-h77eed37_0.tar.bz2#34893075a5c9e55cdafac56607368fc6 https://conda.anaconda.org/conda-forge/noarch/font-ttf-source-code-pro-2.038-h77eed37_0.tar.bz2#4d59c254e01d9cde7957100457e2d5fb https://conda.anaconda.org/conda-forge/noarch/font-ttf-ubuntu-0.83-h77eed37_3.conda#49023d73832ef61042f6a237cb2687e7 https://conda.anaconda.org/conda-forge/noarch/kernel-headers_linux-64-3.10.0-he073ed8_18.conda#ad8527bf134a90e1c9ed35fa0b64318c -https://conda.anaconda.org/conda-forge/linux-64/python_abi-3.10-6_cp310.conda#01f0f2104b8466714804a72e511de599 +https://conda.anaconda.org/conda-forge/noarch/python_abi-3.10-7_cp310.conda#44e871cba2b162368476a84b8d040b6c https://conda.anaconda.org/conda-forge/noarch/tzdata-2025b-h78e105d_0.conda#4222072737ccff51314b5ece9c7d6f5a +https://conda.anaconda.org/conda-forge/noarch/ca-certificates-2025.4.26-hbd8a1cb_0.conda#95db94f75ba080a22eb623590993167b https://conda.anaconda.org/conda-forge/noarch/fonts-conda-forge-1-0.tar.bz2#f766549260d6815b0c52253f1fb1bb29 https://conda.anaconda.org/conda-forge/linux-64/ld_impl_linux-64-2.43-h712a8e2_4.conda#01f8d123c96816249efd255a31ad7712 https://conda.anaconda.org/conda-forge/noarch/libgcc-devel_linux-64-13.3.0-hc03c837_102.conda#4c1d6961a6a54f602ae510d9bf31fa60 @@ -28,13 +28,14 @@ https://conda.anaconda.org/conda-forge/linux-64/libgcc-14.2.0-h767d61c_2.conda#e https://conda.anaconda.org/conda-forge/linux-64/alsa-lib-1.2.14-hb9d3cd8_0.conda#76df83c2a9035c54df5d04ff81bcc02d https://conda.anaconda.org/conda-forge/linux-64/gettext-tools-0.23.1-h5888daf_0.conda#2f659535feef3cfb782f7053c8775a32 https://conda.anaconda.org/conda-forge/linux-64/libbrotlicommon-1.1.0-hb9d3cd8_2.conda#41b599ed2b02abcfdd84302bff174b23 -https://conda.anaconda.org/conda-forge/linux-64/libdeflate-1.23-h4ddbbb0_0.conda#8dfae1d2e74767e9ce36d5fa0d8605db +https://conda.anaconda.org/conda-forge/linux-64/libdeflate-1.23-h86f0d12_0.conda#27fe770decaf469a53f3e3a6d593067f https://conda.anaconda.org/conda-forge/linux-64/libexpat-2.7.0-h5888daf_0.conda#db0bfbe7dd197b68ad5f30333bae6ce0 https://conda.anaconda.org/conda-forge/linux-64/libffi-3.4.6-h2dba641_1.conda#ede4673863426c0883c0063d853bbd85 https://conda.anaconda.org/conda-forge/linux-64/libgcc-ng-14.2.0-h69a702a_2.conda#a2222a6ada71fb478682efe483ce0f92 https://conda.anaconda.org/conda-forge/linux-64/libgettextpo-0.23.1-h5888daf_0.conda#a09ce5decdef385bcce78c32809fa794 https://conda.anaconda.org/conda-forge/linux-64/libgfortran5-14.2.0-hf1ad2bd_2.conda#556a4fdfac7287d349b8f09aba899693 https://conda.anaconda.org/conda-forge/linux-64/libiconv-1.18-h4ce23a2_1.conda#e796ff8ddc598affdf7c173d6145f087 +https://conda.anaconda.org/conda-forge/linux-64/libjpeg-turbo-3.1.0-hb9d3cd8_0.conda#9fa334557db9f63da6c9285fd2a48638 https://conda.anaconda.org/conda-forge/linux-64/liblzma-5.8.1-hb9d3cd8_0.conda#0e87378639676987af32fee53ba32258 https://conda.anaconda.org/conda-forge/linux-64/libntlm-1.8-hb9d3cd8_0.conda#7c7927b404672409d9917d49bff5f2d6 https://conda.anaconda.org/conda-forge/linux-64/libopus-1.5.2-hd0c01bc_0.conda#b64523fb87ac6f87f0790f324ad43046 @@ -57,6 +58,7 @@ https://conda.anaconda.org/conda-forge/linux-64/giflib-5.2.2-hd590300_0.conda#3b https://conda.anaconda.org/conda-forge/linux-64/jxrlib-1.1-hd590300_3.conda#5aeabe88534ea4169d4c49998f293d6c https://conda.anaconda.org/conda-forge/linux-64/keyutils-1.6.1-h166bdaf_0.tar.bz2#30186d27e2c9fa62b45fb1476b7200e3 https://conda.anaconda.org/conda-forge/linux-64/lame-3.100-h166bdaf_1003.tar.bz2#a8832b479f93521a9e7b5b743803be51 +https://conda.anaconda.org/conda-forge/linux-64/lerc-4.0.0-h0aef613_1.conda#9344155d33912347b37f0ae6c410a835 https://conda.anaconda.org/conda-forge/linux-64/libasprintf-0.23.1-h8e693c7_0.conda#988f4937281a66ca19d1adb3b5e3f859 https://conda.anaconda.org/conda-forge/linux-64/libbrotlidec-1.1.0-hb9d3cd8_2.conda#9566f0bd264fbd463002e759b8a82401 https://conda.anaconda.org/conda-forge/linux-64/libbrotlienc-1.1.0-hb9d3cd8_2.conda#06f70867945ea6a84d35836af780f1de @@ -64,9 +66,8 @@ https://conda.anaconda.org/conda-forge/linux-64/libedit-3.1.20250104-pl5321h7949 https://conda.anaconda.org/conda-forge/linux-64/libevent-2.1.12-hf998b51_1.conda#a1cfcc585f0c42bf8d5546bb1dfb668d https://conda.anaconda.org/conda-forge/linux-64/libgettextpo-devel-0.23.1-h5888daf_0.conda#7a5d5c245a6807deab87558e9efd3ef0 https://conda.anaconda.org/conda-forge/linux-64/libgfortran-14.2.0-h69a702a_2.conda#fb54c4ea68b460c278d26eea89cfbcc3 -https://conda.anaconda.org/conda-forge/linux-64/libgpg-error-1.54-hbd13f7d_0.conda#53fab32c797ccdb5bb7a4c147ea154d8 +https://conda.anaconda.org/conda-forge/linux-64/libgpg-error-1.55-h3f2d84a_0.conda#2bd47db5807daade8500ed7ca4c512a4 https://conda.anaconda.org/conda-forge/linux-64/libhwy-1.2.0-hf40a0c7_0.conda#2f433d593a66044c3f163cb25f0a09de -https://conda.anaconda.org/conda-forge/linux-64/libjpeg-turbo-3.0.0-hd590300_1.conda#ea25936bb4080d843790b586850f82b8 https://conda.anaconda.org/conda-forge/linux-64/libnsl-2.0.1-hd590300_0.conda#30fd6e37fe21f86f4bd26d6ee73eeec7 https://conda.anaconda.org/conda-forge/linux-64/libogg-1.3.5-h4ab18f5_0.conda#601bfb4b3c6f0b844443bb81a56651e0 https://conda.anaconda.org/conda-forge/linux-64/libpciaccess-0.18-hd590300_0.conda#48f4330bfcd959c3cfb704d424903c82 @@ -80,6 +81,7 @@ https://conda.anaconda.org/conda-forge/linux-64/libxcrypt-4.4.36-hd590300_1.cond https://conda.anaconda.org/conda-forge/linux-64/lz4-c-1.10.0-h5888daf_1.conda#9de5350a85c4a20c685259b889aa6393 https://conda.anaconda.org/conda-forge/linux-64/mpg123-1.32.9-hc50e24c_0.conda#c7f302fd11eeb0987a6a5e1f3aed6a21 https://conda.anaconda.org/conda-forge/linux-64/mysql-common-9.0.1-h266115a_6.conda#94116b69829e90b72d566e64421e1bff +https://conda.anaconda.org/conda-forge/linux-64/ninja-1.12.1-hff21bea_1.conda#2322531904f27501ee19847b87ba7c64 https://conda.anaconda.org/conda-forge/linux-64/nspr-4.36-h5888daf_0.conda#de9cd5bca9e4918527b9b72b6e2e1409 https://conda.anaconda.org/conda-forge/linux-64/pixman-0.44.2-h29eaf8c_0.conda#5e2a7acfa2c24188af39e7944e1b3604 https://conda.anaconda.org/conda-forge/linux-64/rav1e-0.6.6-he8a937b_2.conda#77d9955b4abddb811cb8ab1aa7d743e4 @@ -96,24 +98,23 @@ https://conda.anaconda.org/conda-forge/linux-64/blosc-1.21.6-he440d0b_1.conda#2c https://conda.anaconda.org/conda-forge/linux-64/brotli-bin-1.1.0-hb9d3cd8_2.conda#c63b5e52939e795ba8d26e35d767a843 https://conda.anaconda.org/conda-forge/linux-64/c-blosc2-2.15.2-h3122c55_1.conda#2bc8d76acd818d7e79229f5157d5c156 https://conda.anaconda.org/conda-forge/linux-64/charls-2.4.2-h59595ed_0.conda#4336bd67920dd504cd8c6761d6a99645 -https://conda.anaconda.org/conda-forge/linux-64/freetype-2.13.3-h48d6fc4_0.conda#9ecfd6f2ca17077dd9c2d24770bb9ccd https://conda.anaconda.org/conda-forge/linux-64/gcc_impl_linux-64-13.3.0-h1e990d8_2.conda#f46cf0acdcb6019397d37df1e407ab91 https://conda.anaconda.org/conda-forge/linux-64/graphite2-1.3.13-h59595ed_1003.conda#f87c7b7c2cb45f323ffbce941c78ab7c https://conda.anaconda.org/conda-forge/linux-64/icu-75.1-he02047a_0.conda#8b189310083baabfb622af68fd9d3ae3 https://conda.anaconda.org/conda-forge/linux-64/krb5-1.21.3-h659f571_0.conda#3f43953b7d3fb3aaa1d0d0723d91e368 -https://conda.anaconda.org/conda-forge/linux-64/lerc-4.0.0-h27087fc_0.tar.bz2#76bbff344f0134279f225174e9064c8f https://conda.anaconda.org/conda-forge/linux-64/libaec-1.1.3-h59595ed_0.conda#5e97e271911b8b2001a8b71860c32faa https://conda.anaconda.org/conda-forge/linux-64/libasprintf-devel-0.23.1-h8e693c7_0.conda#2827e722a963b779ce878ef9b5474534 https://conda.anaconda.org/conda-forge/linux-64/libblas-3.9.0-31_h66dfbfd_blis.conda#612d513ce8103e41dbcb4d941a325027 https://conda.anaconda.org/conda-forge/linux-64/libcap-2.75-h39aace5_0.conda#c44c16d6976d2aebbd65894d7741e67e https://conda.anaconda.org/conda-forge/linux-64/libdrm-2.4.124-hb9d3cd8_0.conda#8bc89311041d7fcb510238cf0848ccae +https://conda.anaconda.org/conda-forge/linux-64/libfreetype6-2.13.3-h48d6fc4_1.conda#3c255be50a506c50765a93a6644f32fe https://conda.anaconda.org/conda-forge/linux-64/libgcrypt-lib-1.11.0-hb9d3cd8_2.conda#e55712ff40a054134d51b89afca57dbc https://conda.anaconda.org/conda-forge/linux-64/libgfortran-ng-14.2.0-h69a702a_2.conda#4056c857af1a99ee50589a941059ec55 https://conda.anaconda.org/conda-forge/linux-64/libjxl-0.11.1-h7b0646d_1.conda#959fc2b6c0df7883e070b3fe525219a5 +https://conda.anaconda.org/conda-forge/linux-64/libtiff-4.7.0-hd9ff511_4.conda#6c1028898cf3a2032d9af46689e1b81a https://conda.anaconda.org/conda-forge/linux-64/libvorbis-1.3.7-h9c3ff4c_0.tar.bz2#309dec04b70a3cc0f1e84a4013683bc0 https://conda.anaconda.org/conda-forge/linux-64/libzopfli-1.0.3-h9c3ff4c_0.tar.bz2#c66fe2d123249af7651ebde8984c51c2 https://conda.anaconda.org/conda-forge/linux-64/mysql-libs-9.0.1-he0572af_6.conda#9802ae6d20982f42c0f5d69008988763 -https://conda.anaconda.org/conda-forge/linux-64/ninja-1.12.1-h297d8ca_0.conda#3aa1c7e292afeff25a0091ddd7c69b72 https://conda.anaconda.org/conda-forge/linux-64/nss-3.110-h159eef7_0.conda#945659af183e87429c8aa7e0be3cc91d https://conda.anaconda.org/conda-forge/linux-64/pcre2-10.44-hba22ea6_2.conda#df359c09c41cd186fffb93a2d87aa6f5 https://conda.anaconda.org/conda-forge/linux-64/python-3.10.17-hd6af730_0_cpython.conda#7bb89638dae9ce1b8e051d0b721e83c2 @@ -138,7 +139,6 @@ https://conda.anaconda.org/conda-forge/linux-64/cython-3.0.10-py310hc6cd4ac_0.co https://conda.anaconda.org/conda-forge/noarch/docutils-0.21.2-pyhd8ed1ab_1.conda#24c1ca34138ee57de72a943237cde4cc https://conda.anaconda.org/conda-forge/noarch/exceptiongroup-1.2.2-pyhd8ed1ab_1.conda#a16662747cdeb9abbac74d0057cc976e https://conda.anaconda.org/conda-forge/noarch/execnet-2.1.1-pyhd8ed1ab_1.conda#a71efeae2c160f6789900ba2631a2c90 -https://conda.anaconda.org/conda-forge/linux-64/fontconfig-2.15.0-h7e30c49_1.conda#8f5b0b297b59e1ac160ad4beec99dbee https://conda.anaconda.org/conda-forge/noarch/fsspec-2025.3.2-pyhd8ed1ab_0.conda#9c40692c3d24c7aaf335f673ac09d308 https://conda.anaconda.org/conda-forge/linux-64/gcc-13.3.0-h9576a4e_2.conda#d92e51bf4b6bdbfe45e5884fb0755afe https://conda.anaconda.org/conda-forge/linux-64/gcc_linux-64-13.3.0-hc28eda2_10.conda#d151142bbafe5e68ec7fc065c5e6f80c @@ -151,19 +151,21 @@ https://conda.anaconda.org/conda-forge/noarch/idna-3.10-pyhd8ed1ab_1.conda#39a4f https://conda.anaconda.org/conda-forge/noarch/imagesize-1.4.1-pyhd8ed1ab_0.tar.bz2#7de5386c8fea29e76b303f37dde4c352 https://conda.anaconda.org/conda-forge/noarch/iniconfig-2.0.0-pyhd8ed1ab_1.conda#6837f3eff7dcea42ecd714ce1ac2b108 https://conda.anaconda.org/conda-forge/linux-64/kiwisolver-1.4.7-py310h3788b33_0.conda#4186d9b4d004b0fe0de6aa62496fb48a +https://conda.anaconda.org/conda-forge/linux-64/lcms2-2.17-h717163a_0.conda#000e85703f0fd9594c81710dd5066471 https://conda.anaconda.org/conda-forge/linux-64/libavif16-1.2.1-hbb36593_2.conda#971387a27e61235b97cacb440a37e991 https://conda.anaconda.org/conda-forge/linux-64/libcblas-3.9.0-31_hba4ea11_blis.conda#1ea7ae3db0fea0c5222388d841583c51 https://conda.anaconda.org/conda-forge/linux-64/libcups-2.3.3-h4637d8d_4.conda#d4529f4dff3057982a7617c7ac58fde3 +https://conda.anaconda.org/conda-forge/linux-64/libfreetype-2.13.3-ha770c72_1.conda#51f5be229d83ecd401fb369ab96ae669 https://conda.anaconda.org/conda-forge/linux-64/libglib-2.84.1-h2ff4ddf_0.conda#0305434da649d4fb48a425e588b79ea6 https://conda.anaconda.org/conda-forge/linux-64/libglx-1.7.0-ha4b6fd6_2.conda#c8013e438185f33b13814c5c488acd5c https://conda.anaconda.org/conda-forge/linux-64/libsystemd0-257.4-h4e0b6ca_1.conda#04bcf3055e51f8dde6fab9672fb9fca0 -https://conda.anaconda.org/conda-forge/linux-64/libtiff-4.7.0-hd9ff511_3.conda#0ea6510969e1296cc19966fad481f6de https://conda.anaconda.org/conda-forge/linux-64/libxml2-2.13.7-h4bc477f_1.conda#ad1f1f8238834cd3c88ceeaee8da444a https://conda.anaconda.org/conda-forge/noarch/locket-1.0.0-pyhd8ed1ab_0.tar.bz2#91e27ef3d05cc772ce627e51cff111c4 https://conda.anaconda.org/conda-forge/linux-64/markupsafe-3.0.2-py310h89163eb_1.conda#8ce3f0332fd6de0d737e2911d329523f https://conda.anaconda.org/conda-forge/noarch/munkres-1.1.4-pyh9f0ad1d_0.tar.bz2#2ba8498c1018c1e9c61eb99b973dfe19 https://conda.anaconda.org/conda-forge/noarch/networkx-3.2-pyhd8ed1ab_0.conda#cec8cc498664cc00a070676aa89e69a7 -https://conda.anaconda.org/conda-forge/noarch/packaging-24.2-pyhd8ed1ab_2.conda#3bfed7e6228ebf2f7b9eaa47f1b4e2aa +https://conda.anaconda.org/conda-forge/linux-64/openjpeg-2.5.3-h5fbd93e_0.conda#9e5816bc95d285c115a3ebc2f8563564 +https://conda.anaconda.org/conda-forge/noarch/packaging-25.0-pyh29332c3_1.conda#58335b26c38bf4a20f399384c33cbcf9 https://conda.anaconda.org/conda-forge/noarch/pluggy-1.5.0-pyhd8ed1ab_1.conda#e9dcbce5f45f9ee500e728ae58b605b6 https://conda.anaconda.org/conda-forge/noarch/ply-3.11-pyhd8ed1ab_3.conda#fd5062942bfa1b0bd5e0d2a4397b099e https://conda.anaconda.org/conda-forge/linux-64/psutil-7.0.0-py310ha75aee5_0.conda#da7d592394ff9084a23f62a1186451a2 @@ -173,7 +175,7 @@ https://conda.anaconda.org/conda-forge/noarch/pyparsing-3.2.3-pyhd8ed1ab_1.conda https://conda.anaconda.org/conda-forge/noarch/pysocks-1.7.1-pyha55dd90_7.conda#461219d1a5bd61342293efa2c0c90eac https://conda.anaconda.org/conda-forge/noarch/pytz-2025.2-pyhd8ed1ab_0.conda#bc8e3267d44011051f2eb14d22fb0960 https://conda.anaconda.org/conda-forge/linux-64/pyyaml-6.0.2-py310h89163eb_2.conda#fd343408e64cf1e273ab7c710da374db -https://conda.anaconda.org/conda-forge/noarch/setuptools-78.1.0-pyhff2d567_0.conda#a42da9837e46c53494df0044c3eb1f53 +https://conda.anaconda.org/conda-forge/noarch/setuptools-79.0.1-pyhff2d567_0.conda#fa6669cc21abd4b7b6c5393b7bc71914 https://conda.anaconda.org/conda-forge/noarch/six-1.17.0-pyhd8ed1ab_0.conda#a451d576819089b0d672f18768be0f65 https://conda.anaconda.org/conda-forge/noarch/snowballstemmer-2.2.0-pyhd8ed1ab_0.tar.bz2#4d22a9315e78c6827f806065957d566e https://conda.anaconda.org/conda-forge/noarch/soupsieve-2.5-pyhd8ed1ab_1.conda#3f144b2c34f8cb5a9abd9ed23a39c561 @@ -188,7 +190,7 @@ https://conda.anaconda.org/conda-forge/noarch/typing_extensions-4.13.2-pyh29332c https://conda.anaconda.org/conda-forge/linux-64/unicodedata2-16.0.0-py310ha75aee5_0.conda#1d7a4b9202cdd10d56ecdd7f6c347190 https://conda.anaconda.org/conda-forge/noarch/wheel-0.45.1-pyhd8ed1ab_1.conda#75cb7132eb58d97896e173ef12ac9986 https://conda.anaconda.org/conda-forge/linux-64/xcb-util-image-0.4.0-hb711507_2.conda#a0901183f08b6c7107aab109733a3c91 -https://conda.anaconda.org/conda-forge/linux-64/xkeyboard-config-2.43-hb9d3cd8_0.conda#f725c7425d6d7c15e31f3b99a88ea02f +https://conda.anaconda.org/conda-forge/linux-64/xkeyboard-config-2.44-hb9d3cd8_0.conda#7c91bfc90672888259675ad2ad28af9c https://conda.anaconda.org/conda-forge/linux-64/xorg-libxext-1.3.6-hb9d3cd8_0.conda#febbab7d15033c913d53c7a2c102309d https://conda.anaconda.org/conda-forge/linux-64/xorg-libxfixes-6.0.1-hb9d3cd8_0.conda#4bdb303603e9821baf5fe5fdff1dc8f8 https://conda.anaconda.org/conda-forge/linux-64/xorg-libxrender-0.9.12-hb9d3cd8_0.conda#96d57aba173e878a2089d5638016dc5e @@ -197,11 +199,11 @@ https://conda.anaconda.org/conda-forge/noarch/accessible-pygments-0.0.5-pyhd8ed1 https://conda.anaconda.org/conda-forge/noarch/babel-2.17.0-pyhd8ed1ab_0.conda#0a01c169f0ab0f91b26e77a3301fbfe4 https://conda.anaconda.org/conda-forge/linux-64/brunsli-0.1-h9c3ff4c_0.tar.bz2#c1ac6229d0bfd14f8354ff9ad2a26cad https://conda.anaconda.org/conda-forge/linux-64/c-compiler-1.9.0-h2b85faf_0.conda#3cb814f83f1f71ac1985013697f80cc1 -https://conda.anaconda.org/conda-forge/linux-64/cairo-1.18.4-h3394656_0.conda#09262e66b19567aff4f592fb53b28760 https://conda.anaconda.org/conda-forge/linux-64/cffi-1.17.1-py310h8deb56e_0.conda#1fc24a3196ad5ede2a68148be61894f4 https://conda.anaconda.org/conda-forge/linux-64/cytoolz-1.0.1-py310ha75aee5_0.conda#d0be1adaa04a03aed745f3d02afb59ce https://conda.anaconda.org/conda-forge/linux-64/dbus-1.13.6-h5008d03_3.tar.bz2#ecfff944ba3960ecb334b9a2663d708d https://conda.anaconda.org/conda-forge/linux-64/fonttools-4.57.0-py310h89163eb_0.conda#34378af82141b3c1725dcdf898b28fc6 +https://conda.anaconda.org/conda-forge/linux-64/freetype-2.13.3-ha770c72_1.conda#9ccd736d31e0c6e41f54e704e5312811 https://conda.anaconda.org/conda-forge/linux-64/gfortran-13.3.0-h9576a4e_2.conda#19e6d3c9cde10a0a9a170a684082588e https://conda.anaconda.org/conda-forge/linux-64/gfortran_linux-64-13.3.0-hb919d3a_10.conda#7ce070e3329cd10bf79dbed562a21bd4 https://conda.anaconda.org/conda-forge/linux-64/glib-tools-2.84.1-h4833e2c_0.conda#ddc06964296eee2b4070e65415b332fd @@ -212,18 +214,16 @@ https://conda.anaconda.org/conda-forge/noarch/importlib-metadata-8.6.1-pyha770c7 https://conda.anaconda.org/conda-forge/noarch/importlib_resources-6.5.2-pyhd8ed1ab_0.conda#c85c76dc67d75619a92f51dfbce06992 https://conda.anaconda.org/conda-forge/noarch/jinja2-3.1.6-pyhd8ed1ab_0.conda#446bd6c8cb26050d528881df495ce646 https://conda.anaconda.org/conda-forge/noarch/joblib-1.4.2-pyhd8ed1ab_1.conda#bf8243ee348f3a10a14ed0cae323e0c1 -https://conda.anaconda.org/conda-forge/linux-64/lcms2-2.17-h717163a_0.conda#000e85703f0fd9594c81710dd5066471 https://conda.anaconda.org/conda-forge/linux-64/libflac-1.4.3-h59595ed_0.conda#ee48bf17cc83a00f59ca1494d5646869 https://conda.anaconda.org/conda-forge/linux-64/libgl-1.7.0-ha4b6fd6_2.conda#928b8be80851f5d8ffb016f9c81dae7a https://conda.anaconda.org/conda-forge/linux-64/libhwloc-2.11.2-default_h0d58e46_1001.conda#804ca9e91bcaea0824a341d55b1684f2 https://conda.anaconda.org/conda-forge/linux-64/libllvm20-20.1.3-he9d0ab4_0.conda#74c14fe2ab88e352ab6e4fedf5ecb527 -https://conda.anaconda.org/conda-forge/linux-64/libxkbcommon-1.8.1-hc4a0caf_0.conda#e7e5b0652227d646b44abdcbd989da7b +https://conda.anaconda.org/conda-forge/linux-64/libxkbcommon-1.9.0-h65c71a3_0.conda#14fbc598b68d4c6386978f7db09fc5ed https://conda.anaconda.org/conda-forge/noarch/memory_profiler-0.61.0-pyhd8ed1ab_1.conda#71abbefb6f3b95e1668cd5e0af3affb9 https://conda.anaconda.org/conda-forge/noarch/meson-1.7.1-pyhd8ed1ab_0.conda#90018ee73b8741268027421ceac2809a -https://conda.anaconda.org/conda-forge/linux-64/openjpeg-2.5.3-h5fbd93e_0.conda#9e5816bc95d285c115a3ebc2f8563564 https://conda.anaconda.org/conda-forge/linux-64/openldap-2.6.9-he970967_0.conda#ca2de8bbdc871bce41dbf59e51324165 https://conda.anaconda.org/conda-forge/noarch/partd-1.4.2-pyhd8ed1ab_0.conda#0badf9c54e24cecfb0ad2f99d680c163 -https://conda.anaconda.org/conda-forge/noarch/pip-25.0.1-pyh8b19718_0.conda#79b5c1440aedc5010f687048d9103628 +https://conda.anaconda.org/conda-forge/noarch/pip-25.1-pyh8b19718_0.conda#2247aa245832ea47e8b971bef73d7094 https://conda.anaconda.org/conda-forge/noarch/plotly-5.14.0-pyhd8ed1ab_0.conda#6a7bcc42ef58dd6cf3da9333ea102433 https://conda.anaconda.org/conda-forge/noarch/pyproject-metadata-0.9.1-pyhd8ed1ab_0.conda#22ae7c6ea81e0c8661ef32168dda929b https://conda.anaconda.org/conda-forge/noarch/pytest-8.3.5-pyhd8ed1ab_0.conda#c3c9316209dec74a705a36797970c6be @@ -234,10 +234,10 @@ https://conda.anaconda.org/conda-forge/linux-64/xorg-libxdamage-1.1.6-hb9d3cd8_0 https://conda.anaconda.org/conda-forge/linux-64/xorg-libxxf86vm-1.1.6-hb9d3cd8_0.conda#5efa5fa6243a622445fdfd72aee15efa https://conda.anaconda.org/conda-forge/noarch/beautifulsoup4-4.13.4-pyha770c72_0.conda#9f07c4fc992adb2d6c30da7fab3959a7 https://conda.anaconda.org/conda-forge/linux-64/cxx-compiler-1.9.0-h1a2810e_0.conda#1ce8b218d359d9ed0ab481f2a3f3c512 -https://conda.anaconda.org/conda-forge/noarch/dask-core-2025.3.0-pyhd8ed1ab_0.conda#36f6cc22457e3d6a6051c5370832f96c +https://conda.anaconda.org/conda-forge/noarch/dask-core-2025.4.1-pyhd8ed1ab_0.conda#0735ecef025a6c2d6eb61aae4785fc3f +https://conda.anaconda.org/conda-forge/linux-64/fontconfig-2.15.0-h7e30c49_1.conda#8f5b0b297b59e1ac160ad4beec99dbee https://conda.anaconda.org/conda-forge/linux-64/fortran-compiler-1.9.0-h36df796_0.conda#cc0cf942201f9d3b0e9654ea02e12486 https://conda.anaconda.org/conda-forge/linux-64/glib-2.84.1-h07242d1_0.conda#2c2357f18073331d4aefe7252b9fad17 -https://conda.anaconda.org/conda-forge/linux-64/harfbuzz-11.1.0-h3beb420_0.conda#95e3bb97f9cdc251c0c68640e9c10ed3 https://conda.anaconda.org/conda-forge/noarch/importlib-resources-6.5.2-pyhd8ed1ab_0.conda#e376ea42e9ae40f3278b0f79c9bf9826 https://conda.anaconda.org/conda-forge/linux-64/libclang-cpp20.1-20.1.3-default_h1df26ce_0.conda#bbce8ba7f25af8b0928f13fca1eb7405 https://conda.anaconda.org/conda-forge/linux-64/libclang13-20.1.3-default_he06ed0a_0.conda#1bb2ec3c550f7589b2d16e271aeaeddb @@ -249,6 +249,7 @@ https://conda.anaconda.org/conda-forge/linux-64/pyqt5-sip-12.13.0-py310hf71b8c6_ https://conda.anaconda.org/conda-forge/noarch/pytest-xdist-3.6.1-pyhd8ed1ab_1.conda#59aad4fb37cabc0bacc73cf344612ddd https://conda.anaconda.org/conda-forge/linux-64/tbb-2021.13.0-hceb3a55_1.conda#ba7726b8df7b9d34ea80e82b097a4893 https://conda.anaconda.org/conda-forge/linux-64/zstandard-0.23.0-py310ha75aee5_1.conda#0316e8d0e00c00631a6de89207db5b09 +https://conda.anaconda.org/conda-forge/linux-64/cairo-1.18.4-h3394656_0.conda#09262e66b19567aff4f592fb53b28760 https://conda.anaconda.org/conda-forge/linux-64/compilers-1.9.0-ha770c72_0.conda#5859096e397aba423340d0bbbb11ec64 https://conda.anaconda.org/conda-forge/linux-64/gstreamer-1.24.11-hc37bda9_0.conda#056d86cacf2b48c79c6a562a2486eb8c https://conda.anaconda.org/conda-forge/linux-64/mkl-2024.2.2-ha957f24_16.conda#1459379c79dda834673426504d52b319 @@ -256,6 +257,7 @@ https://conda.anaconda.org/conda-forge/linux-64/pulseaudio-client-17.0-hac146a9_ https://conda.anaconda.org/conda-forge/noarch/towncrier-24.8.0-pyhd8ed1ab_1.conda#820b6a1ddf590fba253f8204f7200d82 https://conda.anaconda.org/conda-forge/noarch/urllib3-2.4.0-pyhd8ed1ab_0.conda#c1e349028e0052c4eea844e94f773065 https://conda.anaconda.org/conda-forge/linux-64/gst-plugins-base-1.24.11-h651a532_0.conda#d8d8894f8ced2c9be76dc9ad1ae531ce +https://conda.anaconda.org/conda-forge/linux-64/harfbuzz-11.1.0-h3beb420_0.conda#95e3bb97f9cdc251c0c68640e9c10ed3 https://conda.anaconda.org/conda-forge/linux-64/liblapack-3.9.0-11_h9f1adc1_netlib.conda#fb4e3a141e4be1caf354a9d81780245b https://conda.anaconda.org/conda-forge/noarch/requests-2.32.3-pyhd8ed1ab_1.conda#a9b9368f3701a417eac9edbcae7cb737 https://conda.anaconda.org/conda-forge/linux-64/liblapacke-3.9.0-11_h0ad7b2f_netlib.conda#06dacf1374982882a6ca02e1fa13efbd diff --git a/build_tools/github/pymin_conda_forge_arm_linux-aarch64_conda.lock b/build_tools/github/pymin_conda_forge_arm_linux-aarch64_conda.lock index 2e8387ed491a6..2c023f3c775e0 100644 --- a/build_tools/github/pymin_conda_forge_arm_linux-aarch64_conda.lock +++ b/build_tools/github/pymin_conda_forge_arm_linux-aarch64_conda.lock @@ -2,7 +2,6 @@ # platform: linux-aarch64 # input_hash: 9226800dfe446f7b9ed783525101a7cf60f0da339c6c1fc6db00ea557831de1d @EXPLICIT -https://conda.anaconda.org/conda-forge/linux-aarch64/ca-certificates-2025.1.31-hcefe29a_0.conda#462cb166cd2e26a396f856510a3aff67 https://conda.anaconda.org/conda-forge/noarch/font-ttf-dejavu-sans-mono-2.37-hab24e00_0.tar.bz2#0c96522c6bdaed4b1566d11387caaf45 https://conda.anaconda.org/conda-forge/noarch/font-ttf-inconsolata-3.000-h77eed37_0.tar.bz2#34893075a5c9e55cdafac56607368fc6 https://conda.anaconda.org/conda-forge/noarch/font-ttf-source-code-pro-2.038-h77eed37_0.tar.bz2#4d59c254e01d9cde7957100457e2d5fb @@ -10,9 +9,10 @@ https://conda.anaconda.org/conda-forge/noarch/font-ttf-ubuntu-0.83-h77eed37_3.co https://conda.anaconda.org/conda-forge/linux-aarch64/ld_impl_linux-aarch64-2.43-h80caac9_4.conda#80c9ad5e05e91bb6c0967af3880c9742 https://conda.anaconda.org/conda-forge/linux-aarch64/libglvnd-1.7.0-hd24410f_2.conda#9e115653741810778c9a915a2f8439e7 https://conda.anaconda.org/conda-forge/linux-aarch64/libgomp-14.2.0-he277a41_2.conda#b11c09d9463daf4cae492d29806b1889 -https://conda.anaconda.org/conda-forge/linux-aarch64/python_abi-3.10-6_cp310.conda#19ea13732057398dc3d5d33bce751646 +https://conda.anaconda.org/conda-forge/noarch/python_abi-3.10-7_cp310.conda#44e871cba2b162368476a84b8d040b6c https://conda.anaconda.org/conda-forge/noarch/tzdata-2025b-h78e105d_0.conda#4222072737ccff51314b5ece9c7d6f5a https://conda.anaconda.org/conda-forge/linux-aarch64/_openmp_mutex-4.5-2_gnu.tar.bz2#6168d71addc746e8f2b8d57dfd2edcea +https://conda.anaconda.org/conda-forge/noarch/ca-certificates-2025.4.26-hbd8a1cb_0.conda#95db94f75ba080a22eb623590993167b https://conda.anaconda.org/conda-forge/noarch/fonts-conda-forge-1-0.tar.bz2#f766549260d6815b0c52253f1fb1bb29 https://conda.anaconda.org/conda-forge/linux-aarch64/libegl-1.7.0-hd24410f_2.conda#cf105bce884e4ef8c8ccdca9fe6695e7 https://conda.anaconda.org/conda-forge/linux-aarch64/libopengl-1.7.0-hd24410f_2.conda#cf9d12bfab305e48d095a4c79002c922 @@ -20,12 +20,13 @@ https://conda.anaconda.org/conda-forge/noarch/fonts-conda-ecosystem-1-0.tar.bz2# https://conda.anaconda.org/conda-forge/linux-aarch64/libgcc-14.2.0-he277a41_2.conda#6b4268a60b10f29257b51b9b67ff8d76 https://conda.anaconda.org/conda-forge/linux-aarch64/alsa-lib-1.2.14-h86ecc28_0.conda#a696b24c1b473ecc4774bcb5a6ac6337 https://conda.anaconda.org/conda-forge/linux-aarch64/libbrotlicommon-1.1.0-h86ecc28_2.conda#3ee026955c688f551a9999840cff4c67 -https://conda.anaconda.org/conda-forge/linux-aarch64/libdeflate-1.23-h5e3c512_0.conda#7e7ca2607b11b180120cefc2354fc0cb +https://conda.anaconda.org/conda-forge/linux-aarch64/libdeflate-1.23-he377734_0.conda#308ad7cbe9fd92add59ef3d547a42c17 https://conda.anaconda.org/conda-forge/linux-aarch64/libexpat-2.7.0-h5ad3122_0.conda#d41a057e7968705dae8dcb7c8ba2c8dd https://conda.anaconda.org/conda-forge/linux-aarch64/libffi-3.4.6-he21f813_1.conda#15a131f30cae36e9a655ca81fee9a285 https://conda.anaconda.org/conda-forge/linux-aarch64/libgcc-ng-14.2.0-he9431aa_2.conda#692c2bb75f32cfafb6799cf6d1c5d0e0 https://conda.anaconda.org/conda-forge/linux-aarch64/libgfortran5-14.2.0-hb6113d0_2.conda#cd754566661513808ef2408c4ab99a2f https://conda.anaconda.org/conda-forge/linux-aarch64/libiconv-1.18-hc99b53d_1.conda#81541d85a45fbf4d0a29346176f1f21c +https://conda.anaconda.org/conda-forge/linux-aarch64/libjpeg-turbo-3.1.0-h86ecc28_0.conda#a689388210d502364b79e8b19e7fa2cb https://conda.anaconda.org/conda-forge/linux-aarch64/liblzma-5.8.1-h86ecc28_0.conda#775d36ea4e469b0c049a6f2cd6253d82 https://conda.anaconda.org/conda-forge/linux-aarch64/libstdcxx-14.2.0-h3f4de04_2.conda#eadee2cda99697e29411c1013c187b92 https://conda.anaconda.org/conda-forge/linux-aarch64/libwebp-base-1.5.0-h0886dbf_0.conda#95ef4a689b8cc1b7e18b53784d88f96b @@ -40,11 +41,11 @@ https://conda.anaconda.org/conda-forge/linux-aarch64/bzip2-1.0.8-h68df207_7.cond https://conda.anaconda.org/conda-forge/linux-aarch64/double-conversion-3.3.1-h5ad3122_0.conda#399959d889e1a73fc99f12ce480e77e1 https://conda.anaconda.org/conda-forge/linux-aarch64/expat-2.7.0-h5ad3122_0.conda#c22e14e241ade3d3a74c0409c3d582a2 https://conda.anaconda.org/conda-forge/linux-aarch64/keyutils-1.6.1-h4e544f5_0.tar.bz2#1f24853e59c68892452ef94ddd8afd4b +https://conda.anaconda.org/conda-forge/linux-aarch64/lerc-4.0.0-hfdc4d58_1.conda#60dceb7e876f4d74a9cbd42bbbc6b9cf https://conda.anaconda.org/conda-forge/linux-aarch64/libbrotlidec-1.1.0-h86ecc28_2.conda#e64d0f3b59c7c4047446b97a8624a72d https://conda.anaconda.org/conda-forge/linux-aarch64/libbrotlienc-1.1.0-h86ecc28_2.conda#0e9bd365480c72b25c71a448257b537d https://conda.anaconda.org/conda-forge/linux-aarch64/libedit-3.1.20250104-pl5321h976ea20_0.conda#fb640d776fc92b682a14e001980825b1 https://conda.anaconda.org/conda-forge/linux-aarch64/libgfortran-14.2.0-he9431aa_2.conda#d8b9d9dc0c8cd97d375b48e55947ba70 -https://conda.anaconda.org/conda-forge/linux-aarch64/libjpeg-turbo-3.0.0-h31becfc_1.conda#ed24e702928be089d9ba3f05618515c6 https://conda.anaconda.org/conda-forge/linux-aarch64/libnsl-2.0.1-h31becfc_0.conda#c14f32510f694e3185704d89967ec422 https://conda.anaconda.org/conda-forge/linux-aarch64/libntlm-1.4-hf897c2e_1002.tar.bz2#835c7c4137821de5c309f4266a51ba89 https://conda.anaconda.org/conda-forge/linux-aarch64/libpciaccess-0.18-h31becfc_0.conda#6d48179630f00e8c9ad9e30879ce1e54 @@ -55,25 +56,25 @@ https://conda.anaconda.org/conda-forge/linux-aarch64/libuuid-2.38.1-hb4cce97_0.c https://conda.anaconda.org/conda-forge/linux-aarch64/libxcb-1.17.0-h262b8f6_0.conda#cd14ee5cca2464a425b1dbfc24d90db2 https://conda.anaconda.org/conda-forge/linux-aarch64/libxcrypt-4.4.36-h31becfc_1.conda#b4df5d7d4b63579d081fd3a4cf99740e https://conda.anaconda.org/conda-forge/linux-aarch64/mysql-common-9.2.0-h3f5c77f_0.conda#f9db1ad1a8897483edb3ac321d662e7b +https://conda.anaconda.org/conda-forge/linux-aarch64/ninja-1.12.1-h17cf362_1.conda#885414635e2a65ed06f284f6d569cdff https://conda.anaconda.org/conda-forge/linux-aarch64/pixman-0.44.2-h86a87f0_0.conda#95689fc369832398e82d17c56ff5df8a https://conda.anaconda.org/conda-forge/linux-aarch64/readline-8.2-h8382b9d_2.conda#c0f08fc2737967edde1a272d4bf41ed9 https://conda.anaconda.org/conda-forge/linux-aarch64/tk-8.6.13-h194ca79_0.conda#f75105e0585851f818e0009dd1dde4dc +https://conda.anaconda.org/conda-forge/linux-aarch64/wayland-1.23.1-h698ed42_1.conda#229b00f81a229af79547a7e4776ccf6e https://conda.anaconda.org/conda-forge/linux-aarch64/zstd-1.5.7-hbcf94c1_2.conda#5be90c5a3e4b43c53e38f50a85e11527 https://conda.anaconda.org/conda-forge/linux-aarch64/brotli-bin-1.1.0-h86ecc28_2.conda#7d48b185fe1f722f8cda4539bb931f85 -https://conda.anaconda.org/conda-forge/linux-aarch64/freetype-2.13.3-he93130f_0.conda#3743da39462f21956d6429a4a554ff4f https://conda.anaconda.org/conda-forge/linux-aarch64/graphite2-1.3.13-h2f0025b_1003.conda#f33009add6a08358bc12d114ceec1304 https://conda.anaconda.org/conda-forge/linux-aarch64/icu-75.1-hf9b3779_0.conda#268203e8b983fddb6412b36f2024e75c https://conda.anaconda.org/conda-forge/linux-aarch64/krb5-1.21.3-h50a48e9_0.conda#29c10432a2ca1472b53f299ffb2ffa37 -https://conda.anaconda.org/conda-forge/linux-aarch64/lerc-4.0.0-h4de3ea5_0.tar.bz2#1a0ffc65e03ce81559dbcb0695ad1476 https://conda.anaconda.org/conda-forge/linux-aarch64/libdrm-2.4.124-h86ecc28_0.conda#a8058bcb6b4fa195aaa20452437c7727 +https://conda.anaconda.org/conda-forge/linux-aarch64/libfreetype6-2.13.3-he93130f_1.conda#51eae9012d75b8f7e4b0adfe61a83330 https://conda.anaconda.org/conda-forge/linux-aarch64/libgfortran-ng-14.2.0-he9431aa_2.conda#0980d7d931474a6a037ae66f1da4d2fe https://conda.anaconda.org/conda-forge/linux-aarch64/libopenblas-0.3.29-pthreads_h9d3fd7e_0.conda#a99e2bfcb1ad6362544c71281eb617e9 +https://conda.anaconda.org/conda-forge/linux-aarch64/libtiff-4.7.0-h88f7998_4.conda#6edd78ac9bee9a972f25cb6e8c6e21ad https://conda.anaconda.org/conda-forge/linux-aarch64/mysql-libs-9.2.0-h11569fd_0.conda#72f21962b1205535d810b82f8f0fa342 -https://conda.anaconda.org/conda-forge/linux-aarch64/ninja-1.12.1-h70be974_0.conda#216635cea46498d8045c7cf0f03eaf72 https://conda.anaconda.org/conda-forge/linux-aarch64/pcre2-10.44-h070dd5b_2.conda#94022de9682cb1a0bb18a99cbc3541b3 https://conda.anaconda.org/conda-forge/linux-aarch64/python-3.10.17-h256493d_0_cpython.conda#c496213b6ede3c5a30ce1bf02bebf382 https://conda.anaconda.org/conda-forge/linux-aarch64/qhull-2020.2-h70be974_5.conda#bb138086d938e2b64f5f364945793ebf -https://conda.anaconda.org/conda-forge/linux-aarch64/wayland-1.23.1-h698ed42_0.conda#2661f9252065051914f1cdf5835e7430 https://conda.anaconda.org/conda-forge/linux-aarch64/xcb-util-0.4.1-h5c728e9_2.conda#b4cf8ba6cff9cdf1249bcfe1314222b0 https://conda.anaconda.org/conda-forge/linux-aarch64/xcb-util-keysyms-0.4.1-h5c728e9_0.conda#57ca8564599ddf8b633c4ea6afee6f3a https://conda.anaconda.org/conda-forge/linux-aarch64/xcb-util-renderutil-0.3.10-h5c728e9_0.conda#7beeda4223c5484ef72d89fb66b7e8c1 @@ -87,22 +88,23 @@ https://conda.anaconda.org/conda-forge/linux-aarch64/cyrus-sasl-2.1.27-hf6b2984_ https://conda.anaconda.org/conda-forge/linux-aarch64/cython-3.0.12-py310hc86cfe9_0.conda#4bd71650f315b643774841272d02911a https://conda.anaconda.org/conda-forge/noarch/exceptiongroup-1.2.2-pyhd8ed1ab_1.conda#a16662747cdeb9abbac74d0057cc976e https://conda.anaconda.org/conda-forge/noarch/execnet-2.1.1-pyhd8ed1ab_1.conda#a71efeae2c160f6789900ba2631a2c90 -https://conda.anaconda.org/conda-forge/linux-aarch64/fontconfig-2.15.0-h8dda3cd_1.conda#112b71b6af28b47c624bcbeefeea685b https://conda.anaconda.org/conda-forge/noarch/iniconfig-2.0.0-pyhd8ed1ab_1.conda#6837f3eff7dcea42ecd714ce1ac2b108 https://conda.anaconda.org/conda-forge/linux-aarch64/kiwisolver-1.4.7-py310h5d7f10c_0.conda#b86d594bf17c9ad7a291593368ae8ba7 +https://conda.anaconda.org/conda-forge/linux-aarch64/lcms2-2.17-hc88f144_0.conda#b87b1abd2542cf65a00ad2e2461a3083 https://conda.anaconda.org/conda-forge/linux-aarch64/libblas-3.9.0-31_h1a9f1db_openblas.conda#48bd5bf15ccf3e409840be9caafc0ad5 https://conda.anaconda.org/conda-forge/linux-aarch64/libcups-2.3.3-h405e4a8_4.conda#d42c670b0c96c1795fd859d5e0275a55 +https://conda.anaconda.org/conda-forge/linux-aarch64/libfreetype-2.13.3-h8af1aa0_1.conda#2d4a1c3dcabb80b4a56d5c34bdacea08 https://conda.anaconda.org/conda-forge/linux-aarch64/libglib-2.84.1-hc486b8e_0.conda#07cb059040220481ab9eda17cb86f644 https://conda.anaconda.org/conda-forge/linux-aarch64/libglx-1.7.0-hd24410f_2.conda#1d4269e233636148696a67e2d30dad2a https://conda.anaconda.org/conda-forge/linux-aarch64/libhiredis-1.0.2-h05efe27_0.tar.bz2#a87f068744fd20334cd41489eb163bee -https://conda.anaconda.org/conda-forge/linux-aarch64/libtiff-4.7.0-h88f7998_3.conda#36a0ea4a173338c8725dc0807e99cf22 https://conda.anaconda.org/conda-forge/linux-aarch64/libxml2-2.13.7-he060846_1.conda#b461618b5dafbc95c6f9492043cd991a https://conda.anaconda.org/conda-forge/noarch/munkres-1.1.4-pyh9f0ad1d_0.tar.bz2#2ba8498c1018c1e9c61eb99b973dfe19 https://conda.anaconda.org/conda-forge/linux-aarch64/openblas-0.3.29-pthreads_h3a8cbd8_0.conda#4ec5b6144709ced5e7933977675f61c6 -https://conda.anaconda.org/conda-forge/noarch/packaging-24.2-pyhd8ed1ab_2.conda#3bfed7e6228ebf2f7b9eaa47f1b4e2aa +https://conda.anaconda.org/conda-forge/linux-aarch64/openjpeg-2.5.3-h3f56577_0.conda#04231368e4af50d11184b50e14250993 +https://conda.anaconda.org/conda-forge/noarch/packaging-25.0-pyh29332c3_1.conda#58335b26c38bf4a20f399384c33cbcf9 https://conda.anaconda.org/conda-forge/noarch/pluggy-1.5.0-pyhd8ed1ab_1.conda#e9dcbce5f45f9ee500e728ae58b605b6 https://conda.anaconda.org/conda-forge/noarch/pyparsing-3.2.3-pyhd8ed1ab_1.conda#513d3c262ee49b54a8fec85c5bc99764 -https://conda.anaconda.org/conda-forge/noarch/setuptools-78.1.0-pyhff2d567_0.conda#a42da9837e46c53494df0044c3eb1f53 +https://conda.anaconda.org/conda-forge/noarch/setuptools-79.0.1-pyhff2d567_0.conda#fa6669cc21abd4b7b6c5393b7bc71914 https://conda.anaconda.org/conda-forge/noarch/six-1.17.0-pyhd8ed1ab_0.conda#a451d576819089b0d672f18768be0f65 https://conda.anaconda.org/conda-forge/noarch/threadpoolctl-3.6.0-pyhecae5ae_0.conda#9d64911b31d57ca443e9f1e36b04385f https://conda.anaconda.org/conda-forge/noarch/tomli-2.2.1-pyhd8ed1ab_1.conda#ac944244f1fed2eb49bae07193ae8215 @@ -110,26 +112,24 @@ https://conda.anaconda.org/conda-forge/linux-aarch64/tornado-6.4.2-py310h78583b1 https://conda.anaconda.org/conda-forge/linux-aarch64/unicodedata2-16.0.0-py310ha766c32_0.conda#2936ce19a675e162962f396c7b40b905 https://conda.anaconda.org/conda-forge/noarch/wheel-0.45.1-pyhd8ed1ab_1.conda#75cb7132eb58d97896e173ef12ac9986 https://conda.anaconda.org/conda-forge/linux-aarch64/xcb-util-image-0.4.0-h5c728e9_2.conda#b82e5c78dbbfa931980e8bfe83bce913 -https://conda.anaconda.org/conda-forge/linux-aarch64/xkeyboard-config-2.43-h86ecc28_0.conda#a809b8e3776fbc05696c82f8cf6f5a92 +https://conda.anaconda.org/conda-forge/linux-aarch64/xkeyboard-config-2.44-h86ecc28_0.conda#4d91bf5ccb5b31be8e070fda2ed13c50 https://conda.anaconda.org/conda-forge/linux-aarch64/xorg-libxext-1.3.6-h57736b2_0.conda#bd1e86dd8aa3afd78a4bfdb4ef918165 https://conda.anaconda.org/conda-forge/linux-aarch64/xorg-libxfixes-6.0.1-h57736b2_0.conda#78f8715c002cc66991d7c11e3cf66039 https://conda.anaconda.org/conda-forge/linux-aarch64/xorg-libxrender-0.9.12-h86ecc28_0.conda#ae2c2dd0e2d38d249887727db2af960e -https://conda.anaconda.org/conda-forge/linux-aarch64/cairo-1.18.4-h83712da_0.conda#cd55953a67ec727db5dc32b167201aa6 https://conda.anaconda.org/conda-forge/linux-aarch64/ccache-4.11.2-h3aba2e8_0.conda#a46293869605e4a6b0635f0bf9e0d492 https://conda.anaconda.org/conda-forge/linux-aarch64/dbus-1.13.6-h12b9eeb_3.tar.bz2#f3d63805602166bac09386741e00935e https://conda.anaconda.org/conda-forge/linux-aarch64/fonttools-4.57.0-py310heeae437_0.conda#548b750f1b3ec57d07b0014f8081e9c2 +https://conda.anaconda.org/conda-forge/linux-aarch64/freetype-2.13.3-h8af1aa0_1.conda#71c4cbe1b384a8e7b56993394a435343 https://conda.anaconda.org/conda-forge/noarch/joblib-1.4.2-pyhd8ed1ab_1.conda#bf8243ee348f3a10a14ed0cae323e0c1 -https://conda.anaconda.org/conda-forge/linux-aarch64/lcms2-2.17-hc88f144_0.conda#b87b1abd2542cf65a00ad2e2461a3083 https://conda.anaconda.org/conda-forge/linux-aarch64/libcblas-3.9.0-31_hab92f65_openblas.conda#6b81dbae56a519f1ec2f25e0ee2f4334 https://conda.anaconda.org/conda-forge/linux-aarch64/libgl-1.7.0-hd24410f_2.conda#0d00176464ebb25af83d40736a2cd3bb https://conda.anaconda.org/conda-forge/linux-aarch64/liblapack-3.9.0-31_h411afd4_openblas.conda#41dbff5eb805a75c120a7b7a1c744dc2 https://conda.anaconda.org/conda-forge/linux-aarch64/libllvm20-20.1.3-h07bd352_0.conda#72d693aa8786a9c14286d6bf6f4d0da7 -https://conda.anaconda.org/conda-forge/linux-aarch64/libxkbcommon-1.8.1-h2ef6bd0_0.conda#8abc18afd93162a37d25fd244bf62ab5 +https://conda.anaconda.org/conda-forge/linux-aarch64/libxkbcommon-1.9.0-hbab7b08_0.conda#d8f79e5786c1060e29c209c1c4c67a66 https://conda.anaconda.org/conda-forge/linux-aarch64/libxslt-1.1.39-h1cc9640_0.conda#13e1d3f9188e85c6d59a98651aced002 https://conda.anaconda.org/conda-forge/noarch/meson-1.7.1-pyhd8ed1ab_0.conda#90018ee73b8741268027421ceac2809a -https://conda.anaconda.org/conda-forge/linux-aarch64/openjpeg-2.5.3-h3f56577_0.conda#04231368e4af50d11184b50e14250993 https://conda.anaconda.org/conda-forge/linux-aarch64/openldap-2.6.9-h30c48ee_0.conda#c07822a5de65ce9797b9afa257faa917 -https://conda.anaconda.org/conda-forge/noarch/pip-25.0.1-pyh8b19718_0.conda#79b5c1440aedc5010f687048d9103628 +https://conda.anaconda.org/conda-forge/noarch/pip-25.1-pyh8b19718_0.conda#2247aa245832ea47e8b971bef73d7094 https://conda.anaconda.org/conda-forge/noarch/pyproject-metadata-0.9.1-pyhd8ed1ab_0.conda#22ae7c6ea81e0c8661ef32168dda929b https://conda.anaconda.org/conda-forge/noarch/pytest-8.3.5-pyhd8ed1ab_0.conda#c3c9316209dec74a705a36797970c6be https://conda.anaconda.org/conda-forge/noarch/python-dateutil-2.9.0.post0-pyhff2d567_1.conda#5ba79d7c71f03c678c8ead841f347d6e @@ -140,7 +140,7 @@ https://conda.anaconda.org/conda-forge/linux-aarch64/xorg-libxdamage-1.1.6-h86ec https://conda.anaconda.org/conda-forge/linux-aarch64/xorg-libxi-1.8.2-h57736b2_0.conda#eeee3bdb31c6acde2b81ad1b8c287087 https://conda.anaconda.org/conda-forge/linux-aarch64/xorg-libxrandr-1.5.4-h86ecc28_0.conda#dd3e74283a082381aa3860312e3c721e https://conda.anaconda.org/conda-forge/linux-aarch64/xorg-libxxf86vm-1.1.6-h86ecc28_0.conda#d745faa2d7c15092652e40a22bb261ed -https://conda.anaconda.org/conda-forge/linux-aarch64/harfbuzz-11.1.0-h405b6a2_0.conda#6fd48c127b76a95ed3858c47fa9db7b0 +https://conda.anaconda.org/conda-forge/linux-aarch64/fontconfig-2.15.0-h8dda3cd_1.conda#112b71b6af28b47c624bcbeefeea685b https://conda.anaconda.org/conda-forge/linux-aarch64/libclang-cpp20.1-20.1.3-default_h7d4303a_0.conda#c8e8f4cb5f527bfae38e710459cb05a4 https://conda.anaconda.org/conda-forge/linux-aarch64/libclang13-20.1.3-default_h9e36cb9_0.conda#409dd4c25c875b9b367fe6a203d96ff0 https://conda.anaconda.org/conda-forge/linux-aarch64/liblapacke-3.9.0-31_hc659ca5_openblas.conda#256bb281d78e5b8927ff13a1cde9f6f5 @@ -151,10 +151,12 @@ https://conda.anaconda.org/conda-forge/linux-aarch64/pillow-11.1.0-py310h34c99de https://conda.anaconda.org/conda-forge/noarch/pytest-xdist-3.6.1-pyhd8ed1ab_1.conda#59aad4fb37cabc0bacc73cf344612ddd https://conda.anaconda.org/conda-forge/linux-aarch64/xorg-libxtst-1.2.5-h57736b2_3.conda#c05698071b5c8e0da82a282085845860 https://conda.anaconda.org/conda-forge/linux-aarch64/blas-devel-3.9.0-31_h9678261_openblas.conda#a2cc143d7e25e52a915cb320e5b0d592 +https://conda.anaconda.org/conda-forge/linux-aarch64/cairo-1.18.4-h83712da_0.conda#cd55953a67ec727db5dc32b167201aa6 https://conda.anaconda.org/conda-forge/linux-aarch64/contourpy-1.3.2-py310hf54e67a_0.conda#779694434d1f0a67c5260db76b7b7907 -https://conda.anaconda.org/conda-forge/linux-aarch64/qt6-main-6.9.0-ha483c8b_1.conda#fb32973c68de1f23a7e4de3651442b15 https://conda.anaconda.org/conda-forge/linux-aarch64/scipy-1.15.2-py310hf37559f_0.conda#5c9b72f10d2118d943a5eaaf2f396891 https://conda.anaconda.org/conda-forge/linux-aarch64/blas-2.131-openblas.conda#51c5f346e1ebee750f76066490059df9 +https://conda.anaconda.org/conda-forge/linux-aarch64/harfbuzz-11.1.0-h405b6a2_0.conda#6fd48c127b76a95ed3858c47fa9db7b0 https://conda.anaconda.org/conda-forge/linux-aarch64/matplotlib-base-3.10.1-py310h2cc5e2d_0.conda#5652e355346f4823f6b4bfdd4860359d +https://conda.anaconda.org/conda-forge/linux-aarch64/qt6-main-6.9.0-ha483c8b_1.conda#fb32973c68de1f23a7e4de3651442b15 https://conda.anaconda.org/conda-forge/linux-aarch64/pyside6-6.9.0-py310hee8ad4f_0.conda#68f556281ac23f1780381f00de99d66d https://conda.anaconda.org/conda-forge/linux-aarch64/matplotlib-3.10.1-py310hbbe02a8_0.conda#c6aa0ea00ec104d0ad260c2ed2bb5582 From 4bc05cc9ba2794b940d3c4b70c58e4defafa1823 Mon Sep 17 00:00:00 2001 From: scikit-learn-bot Date: Mon, 28 Apr 2025 10:33:37 +0200 Subject: [PATCH 084/182] :lock: :robot: CI Update lock files for free-threaded CI build(s) :lock: :robot: (#31259) Co-authored-by: Lock file bot --- .../azure/pylatest_free_threaded_linux-64_conda.lock | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/build_tools/azure/pylatest_free_threaded_linux-64_conda.lock b/build_tools/azure/pylatest_free_threaded_linux-64_conda.lock index cc5513991717c..b0dd205cc6976 100644 --- a/build_tools/azure/pylatest_free_threaded_linux-64_conda.lock +++ b/build_tools/azure/pylatest_free_threaded_linux-64_conda.lock @@ -3,9 +3,9 @@ # input_hash: a4b2a317ef7733b7244b987f8b6b61126b9e647153cd112ba9565ae8eb5558e8 @EXPLICIT https://conda.anaconda.org/conda-forge/linux-64/_libgcc_mutex-0.1-conda_forge.tar.bz2#d7c89558ba9fa0495403155b64376d81 -https://conda.anaconda.org/conda-forge/linux-64/ca-certificates-2025.1.31-hbcca054_0.conda#19f3a56f68d2fd06c516076bff482c52 https://conda.anaconda.org/conda-forge/linux-64/python_abi-3.13-5_cp313t.conda#ea4c21b96e8280414d9e243da0ec3201 https://conda.anaconda.org/conda-forge/noarch/tzdata-2025b-h78e105d_0.conda#4222072737ccff51314b5ece9c7d6f5a +https://conda.anaconda.org/conda-forge/noarch/ca-certificates-2025.4.26-hbd8a1cb_0.conda#95db94f75ba080a22eb623590993167b https://conda.anaconda.org/conda-forge/linux-64/ld_impl_linux-64-2.43-h712a8e2_4.conda#01f8d123c96816249efd255a31ad7712 https://conda.anaconda.org/conda-forge/linux-64/libgomp-14.2.0-h767d61c_2.conda#06d02030237f4d5b3d9a7e7d348fe3c6 https://conda.anaconda.org/conda-forge/linux-64/_openmp_mutex-4.5-2_gnu.tar.bz2#73aaf86a425cc6e73fcf236a5a46396d @@ -25,12 +25,12 @@ https://conda.anaconda.org/conda-forge/linux-64/libmpdec-4.0.0-h4bc722e_0.conda# https://conda.anaconda.org/conda-forge/linux-64/libsqlite-3.49.1-hee588c1_2.conda#962d6ac93c30b1dfc54c9cccafd1003e https://conda.anaconda.org/conda-forge/linux-64/libstdcxx-ng-14.2.0-h4852527_2.conda#c75da67f045c2627f59e6fcb5f4e3a9b https://conda.anaconda.org/conda-forge/linux-64/libuuid-2.38.1-h0b41bf4_0.conda#40b61aab5c7ba9ff276c41cfffe6b80b +https://conda.anaconda.org/conda-forge/linux-64/ninja-1.12.1-hff21bea_1.conda#2322531904f27501ee19847b87ba7c64 https://conda.anaconda.org/conda-forge/linux-64/readline-8.2-h8c095d6_2.conda#283b96675859b20a825f8fa30f311446 https://conda.anaconda.org/conda-forge/linux-64/tk-8.6.13-noxft_h4845f30_101.conda#d453b98d9c83e71da0741bb0ff4d76bc https://conda.anaconda.org/conda-forge/linux-64/zstd-1.5.7-hb8e6e7a_2.conda#6432cb5d4ac0046c3ac0a8a0f95842f9 https://conda.anaconda.org/conda-forge/linux-64/libgfortran-ng-14.2.0-h69a702a_2.conda#4056c857af1a99ee50589a941059ec55 https://conda.anaconda.org/conda-forge/linux-64/libopenblas-0.3.29-pthreads_h94d23a6_0.conda#0a4d0252248ef9a0f88f2ba8b8a08e12 -https://conda.anaconda.org/conda-forge/linux-64/ninja-1.12.1-h297d8ca_0.conda#3aa1c7e292afeff25a0091ddd7c69b72 https://conda.anaconda.org/conda-forge/linux-64/python-3.13.3-h4724d56_1_cp313t.conda#8193603fe48ace3d8801cfb246f44491 https://conda.anaconda.org/conda-forge/noarch/colorama-0.4.6-pyhd8ed1ab_1.conda#962b9857ee8e7018c22f2776ffa0b2d7 https://conda.anaconda.org/conda-forge/noarch/cpython-3.13.3-py313hd8ed1ab_1.conda#6ba9ba47b91b7758cb963d0f0eaf3422 @@ -39,10 +39,10 @@ https://conda.anaconda.org/conda-forge/noarch/execnet-2.1.1-pyhd8ed1ab_1.conda#a https://conda.anaconda.org/conda-forge/noarch/iniconfig-2.0.0-pyhd8ed1ab_1.conda#6837f3eff7dcea42ecd714ce1ac2b108 https://conda.anaconda.org/conda-forge/linux-64/libblas-3.9.0-31_h59b9bed_openblas.conda#728dbebd0f7a20337218beacffd37916 https://conda.anaconda.org/conda-forge/linux-64/libhiredis-1.0.2-h2cc385e_0.tar.bz2#b34907d3a81a3cd8095ee83d174c074a -https://conda.anaconda.org/conda-forge/noarch/packaging-25.0-pyhd8ed1ab_0.conda#4088c0d078e2f5092ddf824495186229 -https://conda.anaconda.org/conda-forge/noarch/pip-25.0.1-pyh145f28c_0.conda#9ba21d75dc722c29827988a575a65707 +https://conda.anaconda.org/conda-forge/noarch/packaging-25.0-pyh29332c3_1.conda#58335b26c38bf4a20f399384c33cbcf9 +https://conda.anaconda.org/conda-forge/noarch/pip-25.1-pyh145f28c_0.conda#4627e20c39e7340febed674c3bf05b16 https://conda.anaconda.org/conda-forge/noarch/pluggy-1.5.0-pyhd8ed1ab_1.conda#e9dcbce5f45f9ee500e728ae58b605b6 -https://conda.anaconda.org/conda-forge/noarch/setuptools-78.1.1-pyhff2d567_0.conda#72437384f9364b6baf20b6dd68d282c2 +https://conda.anaconda.org/conda-forge/noarch/setuptools-79.0.1-pyhff2d567_0.conda#fa6669cc21abd4b7b6c5393b7bc71914 https://conda.anaconda.org/conda-forge/noarch/threadpoolctl-3.6.0-pyhecae5ae_0.conda#9d64911b31d57ca443e9f1e36b04385f https://conda.anaconda.org/conda-forge/noarch/tomli-2.2.1-pyhd8ed1ab_1.conda#ac944244f1fed2eb49bae07193ae8215 https://conda.anaconda.org/conda-forge/linux-64/ccache-4.11.2-hd714d17_0.conda#35ae7ce74089ab05fdb1cb9746c0fbe4 From ce47cbce5882aebc2babc3e8c1a53f3bfd5f0242 Mon Sep 17 00:00:00 2001 From: scikit-learn-bot Date: Mon, 28 Apr 2025 10:56:14 +0200 Subject: [PATCH 085/182] :lock: :robot: CI Update lock files for array-api CI build(s) :lock: :robot: (#31260) Co-authored-by: Lock file bot --- ...a_forge_cuda_array-api_linux-64_conda.lock | 119 ++++++++++-------- 1 file changed, 64 insertions(+), 55 deletions(-) diff --git a/build_tools/github/pylatest_conda_forge_cuda_array-api_linux-64_conda.lock b/build_tools/github/pylatest_conda_forge_cuda_array-api_linux-64_conda.lock index 5af04cbc78694..124b1948f0d6c 100644 --- a/build_tools/github/pylatest_conda_forge_cuda_array-api_linux-64_conda.lock +++ b/build_tools/github/pylatest_conda_forge_cuda_array-api_linux-64_conda.lock @@ -2,15 +2,17 @@ # platform: linux-64 # input_hash: e141e0789f4a2b4be527fb91bb83f873bd14718407fa58b8790d2198f61bc6f5 @EXPLICIT -https://conda.anaconda.org/conda-forge/linux-64/ca-certificates-2025.1.31-hbcca054_0.conda#19f3a56f68d2fd06c516076bff482c52 https://conda.anaconda.org/conda-forge/noarch/cuda-version-11.8-h70ddcb2_3.conda#670f0e1593b8c1d84f57ad5fe5256799 https://conda.anaconda.org/conda-forge/noarch/font-ttf-dejavu-sans-mono-2.37-hab24e00_0.tar.bz2#0c96522c6bdaed4b1566d11387caaf45 https://conda.anaconda.org/conda-forge/noarch/font-ttf-inconsolata-3.000-h77eed37_0.tar.bz2#34893075a5c9e55cdafac56607368fc6 https://conda.anaconda.org/conda-forge/noarch/font-ttf-source-code-pro-2.038-h77eed37_0.tar.bz2#4d59c254e01d9cde7957100457e2d5fb https://conda.anaconda.org/conda-forge/noarch/font-ttf-ubuntu-0.83-h77eed37_3.conda#49023d73832ef61042f6a237cb2687e7 https://conda.anaconda.org/conda-forge/noarch/kernel-headers_linux-64-3.10.0-he073ed8_18.conda#ad8527bf134a90e1c9ed35fa0b64318c -https://conda.anaconda.org/conda-forge/linux-64/python_abi-3.13-6_cp313.conda#ef1d8e55d61220011cceed0b94a920d2 +https://conda.anaconda.org/conda-forge/linux-64/libopentelemetry-cpp-headers-1.18.0-ha770c72_1.conda#4fb055f57404920a43b147031471e03b +https://conda.anaconda.org/conda-forge/linux-64/nlohmann_json-3.12.0-h3f2d84a_0.conda#d76872d096d063e226482c99337209dc +https://conda.anaconda.org/conda-forge/noarch/python_abi-3.13-7_cp313.conda#e84b44e6300f1703cb25d29120c5b1d8 https://conda.anaconda.org/conda-forge/noarch/tzdata-2025b-h78e105d_0.conda#4222072737ccff51314b5ece9c7d6f5a +https://conda.anaconda.org/conda-forge/noarch/ca-certificates-2025.4.26-hbd8a1cb_0.conda#95db94f75ba080a22eb623590993167b https://conda.anaconda.org/conda-forge/noarch/fonts-conda-forge-1-0.tar.bz2#f766549260d6815b0c52253f1fb1bb29 https://conda.anaconda.org/conda-forge/linux-64/ld_impl_linux-64-2.43-h712a8e2_4.conda#01f8d123c96816249efd255a31ad7712 https://conda.anaconda.org/conda-forge/linux-64/libglvnd-1.7.0-ha4b6fd6_2.conda#434ca7e50e40f4918ab701e3facd59a0 @@ -22,19 +24,20 @@ https://conda.anaconda.org/conda-forge/linux-64/libegl-1.7.0-ha4b6fd6_2.conda#c1 https://conda.anaconda.org/conda-forge/linux-64/libopengl-1.7.0-ha4b6fd6_2.conda#7df50d44d4a14d6c31a2c54f2cd92157 https://conda.anaconda.org/conda-forge/linux-64/libgcc-14.2.0-h767d61c_2.conda#ef504d1acbd74b7cc6849ef8af47dd03 https://conda.anaconda.org/conda-forge/linux-64/alsa-lib-1.2.14-hb9d3cd8_0.conda#76df83c2a9035c54df5d04ff81bcc02d -https://conda.anaconda.org/conda-forge/linux-64/aws-c-common-0.10.6-hb9d3cd8_0.conda#d7d4680337a14001b0e043e96529409b +https://conda.anaconda.org/conda-forge/linux-64/aws-c-common-0.12.0-hb9d3cd8_0.conda#f65c946f28f0518f41ced702f44c52b7 https://conda.anaconda.org/conda-forge/linux-64/c-ares-1.34.5-hb9d3cd8_0.conda#f7f0d6cc2dc986d42ac2689ec88192be https://conda.anaconda.org/conda-forge/linux-64/libbrotlicommon-1.1.0-hb9d3cd8_2.conda#41b599ed2b02abcfdd84302bff174b23 -https://conda.anaconda.org/conda-forge/linux-64/libdeflate-1.23-h4ddbbb0_0.conda#8dfae1d2e74767e9ce36d5fa0d8605db +https://conda.anaconda.org/conda-forge/linux-64/libdeflate-1.23-h86f0d12_0.conda#27fe770decaf469a53f3e3a6d593067f https://conda.anaconda.org/conda-forge/linux-64/libexpat-2.7.0-h5888daf_0.conda#db0bfbe7dd197b68ad5f30333bae6ce0 https://conda.anaconda.org/conda-forge/linux-64/libffi-3.4.6-h2dba641_1.conda#ede4673863426c0883c0063d853bbd85 https://conda.anaconda.org/conda-forge/linux-64/libgcc-ng-14.2.0-h69a702a_2.conda#a2222a6ada71fb478682efe483ce0f92 https://conda.anaconda.org/conda-forge/linux-64/libgfortran5-14.2.0-hf1ad2bd_2.conda#556a4fdfac7287d349b8f09aba899693 https://conda.anaconda.org/conda-forge/linux-64/libiconv-1.18-h4ce23a2_1.conda#e796ff8ddc598affdf7c173d6145f087 +https://conda.anaconda.org/conda-forge/linux-64/libjpeg-turbo-3.1.0-hb9d3cd8_0.conda#9fa334557db9f63da6c9285fd2a48638 https://conda.anaconda.org/conda-forge/linux-64/liblzma-5.8.1-hb9d3cd8_0.conda#0e87378639676987af32fee53ba32258 https://conda.anaconda.org/conda-forge/linux-64/libntlm-1.8-hb9d3cd8_0.conda#7c7927b404672409d9917d49bff5f2d6 https://conda.anaconda.org/conda-forge/linux-64/libstdcxx-14.2.0-h8f9b012_2.conda#a78c856b6dc6bf4ea8daeb9beaaa3fb0 -https://conda.anaconda.org/conda-forge/linux-64/libutf8proc-2.9.0-hb9d3cd8_1.conda#1e936bd23d737aac62a18e9a1e7f8b18 +https://conda.anaconda.org/conda-forge/linux-64/libutf8proc-2.10.0-h4c51ac1_0.conda#aeccfff2806ae38430638ffbb4be9610 https://conda.anaconda.org/conda-forge/linux-64/libuv-1.50.0-hb9d3cd8_0.conda#771ee65e13bc599b0b62af5359d80169 https://conda.anaconda.org/conda-forge/linux-64/libwebp-base-1.5.0-h851e524_0.conda#63f790534398730f59e1b899c3644d4a https://conda.anaconda.org/conda-forge/linux-64/libzlib-1.3.1-hb9d3cd8_2.conda#edb0dca6bc32e4f4789199455a1dbeb8 @@ -44,15 +47,16 @@ https://conda.anaconda.org/conda-forge/linux-64/pthread-stubs-0.4-hb9d3cd8_1002. https://conda.anaconda.org/conda-forge/linux-64/xorg-libice-1.1.2-hb9d3cd8_0.conda#fb901ff28063514abb6046c9ec2c4a45 https://conda.anaconda.org/conda-forge/linux-64/xorg-libxau-1.0.12-hb9d3cd8_0.conda#f6ebe2cb3f82ba6c057dde5d9debe4f7 https://conda.anaconda.org/conda-forge/linux-64/xorg-libxdmcp-1.1.5-hb9d3cd8_0.conda#8035c64cb77ed555e3f150b7b3972480 -https://conda.anaconda.org/conda-forge/linux-64/aws-c-cal-0.8.1-h1a47875_3.conda#55a8561fdbbbd34f50f57d9be12ed084 -https://conda.anaconda.org/conda-forge/linux-64/aws-c-compression-0.3.0-h4e1184b_5.conda#3f4c1197462a6df2be6dc8241828fe93 -https://conda.anaconda.org/conda-forge/linux-64/aws-c-sdkutils-0.2.1-h4e1184b_4.conda#a5126a90e74ac739b00564a4c7ddcc36 -https://conda.anaconda.org/conda-forge/linux-64/aws-checksums-0.2.2-h4e1184b_4.conda#74e8c3e4df4ceae34aa2959df4b28101 +https://conda.anaconda.org/conda-forge/linux-64/aws-c-cal-0.8.7-h043a21b_0.conda#4fdf835d66ea197e693125c64fbd4482 +https://conda.anaconda.org/conda-forge/linux-64/aws-c-compression-0.3.1-h3870646_2.conda#17ccde79d864e6183a83c5bbb8fff34d +https://conda.anaconda.org/conda-forge/linux-64/aws-c-sdkutils-0.2.3-h3870646_2.conda#06008b5ab42117c89c982aa2a32a5b25 +https://conda.anaconda.org/conda-forge/linux-64/aws-checksums-0.2.3-h3870646_2.conda#303d9e83e0518f1dcb66e90054635ca6 https://conda.anaconda.org/conda-forge/linux-64/bzip2-1.0.8-h4bc722e_7.conda#62ee74e96c5ebb0af99386de58cf9553 https://conda.anaconda.org/conda-forge/linux-64/double-conversion-3.3.1-h5888daf_0.conda#bfd56492d8346d669010eccafe0ba058 https://conda.anaconda.org/conda-forge/linux-64/expat-2.7.0-h5888daf_0.conda#d6845ae4dea52a2f90178bf1829a21f8 https://conda.anaconda.org/conda-forge/linux-64/gflags-2.2.2-h5888daf_1005.conda#d411fc29e338efb48c5fd4576d71d881 https://conda.anaconda.org/conda-forge/linux-64/keyutils-1.6.1-h166bdaf_0.tar.bz2#30186d27e2c9fa62b45fb1476b7200e3 +https://conda.anaconda.org/conda-forge/linux-64/lerc-4.0.0-h0aef613_1.conda#9344155d33912347b37f0ae6c410a835 https://conda.anaconda.org/conda-forge/linux-64/libabseil-20240722.0-cxx17_hbbce691_4.conda#488f260ccda0afaf08acb286db439c2f https://conda.anaconda.org/conda-forge/linux-64/libbrotlidec-1.1.0-hb9d3cd8_2.conda#9566f0bd264fbd463002e759b8a82401 https://conda.anaconda.org/conda-forge/linux-64/libbrotlienc-1.1.0-hb9d3cd8_2.conda#06f70867945ea6a84d35836af780f1de @@ -60,57 +64,57 @@ https://conda.anaconda.org/conda-forge/linux-64/libedit-3.1.20250104-pl5321h7949 https://conda.anaconda.org/conda-forge/linux-64/libev-4.33-hd590300_2.conda#172bf1cd1ff8629f2b1179945ed45055 https://conda.anaconda.org/conda-forge/linux-64/libevent-2.1.12-hf998b51_1.conda#a1cfcc585f0c42bf8d5546bb1dfb668d https://conda.anaconda.org/conda-forge/linux-64/libgfortran-14.2.0-h69a702a_2.conda#fb54c4ea68b460c278d26eea89cfbcc3 -https://conda.anaconda.org/conda-forge/linux-64/libjpeg-turbo-3.0.0-hd590300_1.conda#ea25936bb4080d843790b586850f82b8 https://conda.anaconda.org/conda-forge/linux-64/libmpdec-4.0.0-h4bc722e_0.conda#aeb98fdeb2e8f25d43ef71fbacbeec80 https://conda.anaconda.org/conda-forge/linux-64/libpciaccess-0.18-hd590300_0.conda#48f4330bfcd959c3cfb704d424903c82 https://conda.anaconda.org/conda-forge/linux-64/libpng-1.6.47-h943b412_0.conda#55199e2ae2c3651f6f9b2a447b47bdc9 https://conda.anaconda.org/conda-forge/linux-64/libsqlite-3.49.1-hee588c1_2.conda#962d6ac93c30b1dfc54c9cccafd1003e -https://conda.anaconda.org/conda-forge/linux-64/libssh2-1.11.1-hf672d98_0.conda#be2de152d8073ef1c01b7728475f2fe7 +https://conda.anaconda.org/conda-forge/linux-64/libssh2-1.11.1-hcf80075_0.conda#eecce068c7e4eddeb169591baac20ac4 https://conda.anaconda.org/conda-forge/linux-64/libstdcxx-ng-14.2.0-h4852527_2.conda#c75da67f045c2627f59e6fcb5f4e3a9b https://conda.anaconda.org/conda-forge/linux-64/libuuid-2.38.1-h0b41bf4_0.conda#40b61aab5c7ba9ff276c41cfffe6b80b https://conda.anaconda.org/conda-forge/linux-64/libxcb-1.17.0-h8a09558_0.conda#92ed62436b625154323d40d5f2f11dd7 https://conda.anaconda.org/conda-forge/linux-64/lz4-c-1.10.0-h5888daf_1.conda#9de5350a85c4a20c685259b889aa6393 https://conda.anaconda.org/conda-forge/linux-64/mysql-common-9.2.0-h266115a_0.conda#db22a0962c953e81a2a679ecb1fc6027 +https://conda.anaconda.org/conda-forge/linux-64/ninja-1.12.1-hff21bea_1.conda#2322531904f27501ee19847b87ba7c64 https://conda.anaconda.org/conda-forge/linux-64/pixman-0.44.2-h29eaf8c_0.conda#5e2a7acfa2c24188af39e7944e1b3604 https://conda.anaconda.org/conda-forge/linux-64/readline-8.2-h8c095d6_2.conda#283b96675859b20a825f8fa30f311446 -https://conda.anaconda.org/conda-forge/linux-64/s2n-1.5.11-h072c03f_0.conda#5e8060d52f676a40edef0006a75c718f +https://conda.anaconda.org/conda-forge/linux-64/s2n-1.5.14-h6c98b2b_0.conda#efab4ad81ba5731b2fefa0ab4359e884 https://conda.anaconda.org/conda-forge/linux-64/sleef-3.8-h1b44611_0.conda#aec4dba5d4c2924730088753f6fa164b https://conda.anaconda.org/conda-forge/linux-64/snappy-1.2.1-h8bd8927_1.conda#3b3e64af585eadfb52bb90b553db5edf https://conda.anaconda.org/conda-forge/linux-64/tk-8.6.13-noxft_h4845f30_101.conda#d453b98d9c83e71da0741bb0ff4d76bc +https://conda.anaconda.org/conda-forge/linux-64/wayland-1.23.1-h3e06ad9_1.conda#a37843723437ba75f42c9270ffe800b1 +https://conda.anaconda.org/conda-forge/linux-64/zlib-1.3.1-hb9d3cd8_2.conda#c9f075ab2f33b3bbee9e62d4ad0a6cd8 https://conda.anaconda.org/conda-forge/linux-64/zstd-1.5.7-hb8e6e7a_2.conda#6432cb5d4ac0046c3ac0a8a0f95842f9 -https://conda.anaconda.org/conda-forge/linux-64/aws-c-io-0.15.3-h173a860_6.conda#9a063178f1af0a898526cc24ba7be486 +https://conda.anaconda.org/conda-forge/linux-64/aws-c-io-0.17.0-h3dad3f2_6.conda#3a127d28266cdc0da93384d1f59fe8df https://conda.anaconda.org/conda-forge/linux-64/brotli-bin-1.1.0-hb9d3cd8_2.conda#c63b5e52939e795ba8d26e35d767a843 https://conda.anaconda.org/conda-forge/linux-64/cudatoolkit-11.8.0-h4ba93d1_13.conda#eb43f5f1f16e2fad2eba22219c3e499b -https://conda.anaconda.org/conda-forge/linux-64/freetype-2.13.3-h48d6fc4_0.conda#9ecfd6f2ca17077dd9c2d24770bb9ccd https://conda.anaconda.org/conda-forge/linux-64/glog-0.7.1-hbabe93e_0.conda#ff862eebdfeb2fd048ae9dc92510baca https://conda.anaconda.org/conda-forge/linux-64/gmp-6.3.0-hac33072_2.conda#c94a5994ef49749880a8139cf9afcbe1 https://conda.anaconda.org/conda-forge/linux-64/graphite2-1.3.13-h59595ed_1003.conda#f87c7b7c2cb45f323ffbce941c78ab7c https://conda.anaconda.org/conda-forge/linux-64/icu-75.1-he02047a_0.conda#8b189310083baabfb622af68fd9d3ae3 https://conda.anaconda.org/conda-forge/linux-64/krb5-1.21.3-h659f571_0.conda#3f43953b7d3fb3aaa1d0d0723d91e368 -https://conda.anaconda.org/conda-forge/linux-64/lerc-4.0.0-h27087fc_0.tar.bz2#76bbff344f0134279f225174e9064c8f https://conda.anaconda.org/conda-forge/linux-64/libcrc32c-1.1.2-h9c3ff4c_0.tar.bz2#c965a5aa0d5c1c37ffc62dff36e28400 https://conda.anaconda.org/conda-forge/linux-64/libdrm-2.4.124-hb9d3cd8_0.conda#8bc89311041d7fcb510238cf0848ccae +https://conda.anaconda.org/conda-forge/linux-64/libfreetype6-2.13.3-h48d6fc4_1.conda#3c255be50a506c50765a93a6644f32fe https://conda.anaconda.org/conda-forge/linux-64/libgfortran-ng-14.2.0-h69a702a_2.conda#4056c857af1a99ee50589a941059ec55 https://conda.anaconda.org/conda-forge/linux-64/libnghttp2-1.64.0-h161d5f1_0.conda#19e57602824042dfd0446292ef90488b https://conda.anaconda.org/conda-forge/linux-64/libopenblas-0.3.29-pthreads_h94d23a6_0.conda#0a4d0252248ef9a0f88f2ba8b8a08e12 -https://conda.anaconda.org/conda-forge/linux-64/libprotobuf-5.28.2-h5b01275_0.conda#ab0bff36363bec94720275a681af8b83 +https://conda.anaconda.org/conda-forge/linux-64/libprotobuf-5.28.3-h6128344_1.conda#d8703f1ffe5a06356f06467f1d0b9464 https://conda.anaconda.org/conda-forge/linux-64/libre2-11-2024.07.02-hbbce691_2.conda#b2fede24428726dd867611664fb372e8 https://conda.anaconda.org/conda-forge/linux-64/libthrift-0.21.0-h0e7cc3e_0.conda#dcb95c0a98ba9ff737f7ae482aef7833 +https://conda.anaconda.org/conda-forge/linux-64/libtiff-4.7.0-hd9ff511_4.conda#6c1028898cf3a2032d9af46689e1b81a https://conda.anaconda.org/conda-forge/linux-64/mysql-libs-9.2.0-he0572af_0.conda#93340b072c393d23c4700a1d40565dca https://conda.anaconda.org/conda-forge/linux-64/nccl-2.26.2.1-h03a54cd_1.conda#07f874246d0987e94f8b94685bcc754c -https://conda.anaconda.org/conda-forge/linux-64/ninja-1.12.1-h297d8ca_0.conda#3aa1c7e292afeff25a0091ddd7c69b72 https://conda.anaconda.org/conda-forge/linux-64/pcre2-10.44-hba22ea6_2.conda#df359c09c41cd186fffb93a2d87aa6f5 https://conda.anaconda.org/conda-forge/linux-64/python-3.13.3-hf636f53_101_cp313.conda#10622e12d649154af0bd76bcf33a7c5c https://conda.anaconda.org/conda-forge/linux-64/qhull-2020.2-h434a139_5.conda#353823361b1d27eb3960efb076dfcaf6 -https://conda.anaconda.org/conda-forge/linux-64/wayland-1.23.1-h3e06ad9_0.conda#0a732427643ae5e0486a727927791da1 https://conda.anaconda.org/conda-forge/linux-64/xcb-util-0.4.1-hb711507_2.conda#8637c3e5821654d0edf97e2b0404b443 https://conda.anaconda.org/conda-forge/linux-64/xcb-util-keysyms-0.4.1-hb711507_0.conda#ad748ccca349aec3e91743e08b5e2b50 https://conda.anaconda.org/conda-forge/linux-64/xcb-util-renderutil-0.3.10-hb711507_0.conda#0e0cbe0564d03a99afd5fd7b362feecd https://conda.anaconda.org/conda-forge/linux-64/xcb-util-wm-0.4.2-hb711507_0.conda#608e0ef8256b81d04456e8d211eee3e8 https://conda.anaconda.org/conda-forge/linux-64/xorg-libsm-1.2.6-he73a12e_0.conda#1c74ff8c35dcadf952a16f752ca5aa49 https://conda.anaconda.org/conda-forge/linux-64/xorg-libx11-1.8.12-h4f16b4b_0.conda#db038ce880f100acc74dba10302b5630 -https://conda.anaconda.org/conda-forge/linux-64/aws-c-event-stream-0.5.0-h7959bf6_11.conda#9b3fb60fe57925a92f399bc3fc42eccf -https://conda.anaconda.org/conda-forge/linux-64/aws-c-http-0.9.2-hefd7a92_4.conda#5ce4df662d32d3123ea8da15571b6f51 +https://conda.anaconda.org/conda-forge/linux-64/aws-c-event-stream-0.5.4-h04a3f94_2.conda#81096a80f03fc2f0fb2a230f5d028643 +https://conda.anaconda.org/conda-forge/linux-64/aws-c-http-0.9.4-hb9b18c6_4.conda#773c99d0dbe2b3704af165f97ff399e5 https://conda.anaconda.org/conda-forge/linux-64/brotli-1.1.0-hb9d3cd8_2.conda#98514fe74548d768907ce7a13f680e8f https://conda.anaconda.org/conda-forge/noarch/colorama-0.4.6-pyhd8ed1ab_1.conda#962b9857ee8e7018c22f2776ffa0b2d7 https://conda.anaconda.org/conda-forge/noarch/cpython-3.13.3-py313hd8ed1ab_101.conda#904a822cbd380adafb9070debf8579a8 @@ -122,17 +126,17 @@ https://conda.anaconda.org/conda-forge/noarch/exceptiongroup-1.2.2-pyhd8ed1ab_1. https://conda.anaconda.org/conda-forge/noarch/execnet-2.1.1-pyhd8ed1ab_1.conda#a71efeae2c160f6789900ba2631a2c90 https://conda.anaconda.org/conda-forge/linux-64/fastrlock-0.8.3-py313h9800cb9_1.conda#54dd71b3be2ed6ccc50f180347c901db https://conda.anaconda.org/conda-forge/noarch/filelock-3.18.0-pyhd8ed1ab_0.conda#4547b39256e296bb758166893e909a7c -https://conda.anaconda.org/conda-forge/linux-64/fontconfig-2.15.0-h7e30c49_1.conda#8f5b0b297b59e1ac160ad4beec99dbee https://conda.anaconda.org/conda-forge/noarch/fsspec-2025.3.2-pyhd8ed1ab_0.conda#9c40692c3d24c7aaf335f673ac09d308 https://conda.anaconda.org/conda-forge/noarch/iniconfig-2.0.0-pyhd8ed1ab_1.conda#6837f3eff7dcea42ecd714ce1ac2b108 https://conda.anaconda.org/conda-forge/linux-64/kiwisolver-1.4.7-py313h33d0bda_0.conda#9862d13a5e466273d5a4738cffcb8d6c +https://conda.anaconda.org/conda-forge/linux-64/lcms2-2.17-h717163a_0.conda#000e85703f0fd9594c81710dd5066471 https://conda.anaconda.org/conda-forge/linux-64/libblas-3.9.0-31_h59b9bed_openblas.conda#728dbebd0f7a20337218beacffd37916 https://conda.anaconda.org/conda-forge/linux-64/libcups-2.3.3-h4637d8d_4.conda#d4529f4dff3057982a7617c7ac58fde3 https://conda.anaconda.org/conda-forge/linux-64/libcurl-8.13.0-h332b0f4_0.conda#cbdc92ac0d93fe3c796e36ad65c7905c +https://conda.anaconda.org/conda-forge/linux-64/libfreetype-2.13.3-ha770c72_1.conda#51f5be229d83ecd401fb369ab96ae669 https://conda.anaconda.org/conda-forge/linux-64/libglib-2.84.1-h2ff4ddf_0.conda#0305434da649d4fb48a425e588b79ea6 https://conda.anaconda.org/conda-forge/linux-64/libglx-1.7.0-ha4b6fd6_2.conda#c8013e438185f33b13814c5c488acd5c https://conda.anaconda.org/conda-forge/linux-64/libhiredis-1.0.2-h2cc385e_0.tar.bz2#b34907d3a81a3cd8095ee83d174c074a -https://conda.anaconda.org/conda-forge/linux-64/libtiff-4.7.0-hd9ff511_3.conda#0ea6510969e1296cc19966fad481f6de https://conda.anaconda.org/conda-forge/linux-64/libxml2-2.13.7-h4bc477f_1.conda#ad1f1f8238834cd3c88ceeaee8da444a https://conda.anaconda.org/conda-forge/linux-64/markupsafe-3.0.2-py313h8060acc_1.conda#21b62c55924f01b6eef6827167b46acb https://conda.anaconda.org/conda-forge/linux-64/mpfr-4.2.1-h90cbb55_3.conda#2eeb50cab6652538eee8fc0bc3340c81 @@ -140,15 +144,16 @@ https://conda.anaconda.org/conda-forge/noarch/mpmath-1.3.0-pyhd8ed1ab_1.conda#35 https://conda.anaconda.org/conda-forge/noarch/munkres-1.1.4-pyh9f0ad1d_0.tar.bz2#2ba8498c1018c1e9c61eb99b973dfe19 https://conda.anaconda.org/conda-forge/noarch/networkx-3.4.2-pyh267e887_2.conda#fd40bf7f7f4bc4b647dc8512053d9873 https://conda.anaconda.org/conda-forge/linux-64/openblas-0.3.29-pthreads_h6ec200e_0.conda#7e4d48870b3258bea920d51b7f495a81 -https://conda.anaconda.org/conda-forge/linux-64/orc-2.0.3-h97ab989_1.conda#2f46eae652623114e112df13fae311cf -https://conda.anaconda.org/conda-forge/noarch/packaging-24.2-pyhd8ed1ab_2.conda#3bfed7e6228ebf2f7b9eaa47f1b4e2aa -https://conda.anaconda.org/conda-forge/noarch/pip-25.0.1-pyh145f28c_0.conda#9ba21d75dc722c29827988a575a65707 +https://conda.anaconda.org/conda-forge/linux-64/openjpeg-2.5.3-h5fbd93e_0.conda#9e5816bc95d285c115a3ebc2f8563564 +https://conda.anaconda.org/conda-forge/linux-64/orc-2.1.1-h2271f48_0.conda#67075ef2cb33079efee3abfe58127a3b +https://conda.anaconda.org/conda-forge/noarch/packaging-25.0-pyh29332c3_1.conda#58335b26c38bf4a20f399384c33cbcf9 +https://conda.anaconda.org/conda-forge/noarch/pip-25.1-pyh145f28c_0.conda#4627e20c39e7340febed674c3bf05b16 https://conda.anaconda.org/conda-forge/noarch/pluggy-1.5.0-pyhd8ed1ab_1.conda#e9dcbce5f45f9ee500e728ae58b605b6 https://conda.anaconda.org/conda-forge/noarch/pyparsing-3.2.3-pyhd8ed1ab_1.conda#513d3c262ee49b54a8fec85c5bc99764 https://conda.anaconda.org/conda-forge/noarch/python-tzdata-2025.2-pyhd8ed1ab_0.conda#88476ae6ebd24f39261e0854ac244f33 https://conda.anaconda.org/conda-forge/noarch/pytz-2025.2-pyhd8ed1ab_0.conda#bc8e3267d44011051f2eb14d22fb0960 https://conda.anaconda.org/conda-forge/linux-64/re2-2024.07.02-h9925aae_2.conda#e84ddf12bde691e8ec894b00ea829ddf -https://conda.anaconda.org/conda-forge/noarch/setuptools-78.1.0-pyhff2d567_0.conda#a42da9837e46c53494df0044c3eb1f53 +https://conda.anaconda.org/conda-forge/noarch/setuptools-79.0.1-pyhff2d567_0.conda#fa6669cc21abd4b7b6c5393b7bc71914 https://conda.anaconda.org/conda-forge/noarch/six-1.17.0-pyhd8ed1ab_0.conda#a451d576819089b0d672f18768be0f65 https://conda.anaconda.org/conda-forge/noarch/threadpoolctl-3.6.0-pyhecae5ae_0.conda#9d64911b31d57ca443e9f1e36b04385f https://conda.anaconda.org/conda-forge/noarch/toml-0.10.2-pyhd8ed1ab_1.conda#b0dd904de08b7db706167240bf37b164 @@ -156,36 +161,36 @@ https://conda.anaconda.org/conda-forge/noarch/tomli-2.2.1-pyhd8ed1ab_1.conda#ac9 https://conda.anaconda.org/conda-forge/linux-64/tornado-6.4.2-py313h536fd9c_0.conda#5f5cbdd527d2e74e270d8b6255ba714f https://conda.anaconda.org/conda-forge/noarch/typing_extensions-4.13.2-pyh29332c3_0.conda#83fc6ae00127671e301c9f44254c31b8 https://conda.anaconda.org/conda-forge/linux-64/xcb-util-image-0.4.0-hb711507_2.conda#a0901183f08b6c7107aab109733a3c91 -https://conda.anaconda.org/conda-forge/linux-64/xkeyboard-config-2.43-hb9d3cd8_0.conda#f725c7425d6d7c15e31f3b99a88ea02f +https://conda.anaconda.org/conda-forge/linux-64/xkeyboard-config-2.44-hb9d3cd8_0.conda#7c91bfc90672888259675ad2ad28af9c https://conda.anaconda.org/conda-forge/linux-64/xorg-libxext-1.3.6-hb9d3cd8_0.conda#febbab7d15033c913d53c7a2c102309d https://conda.anaconda.org/conda-forge/linux-64/xorg-libxfixes-6.0.1-hb9d3cd8_0.conda#4bdb303603e9821baf5fe5fdff1dc8f8 https://conda.anaconda.org/conda-forge/linux-64/xorg-libxrender-0.9.12-hb9d3cd8_0.conda#96d57aba173e878a2089d5638016dc5e -https://conda.anaconda.org/conda-forge/linux-64/aws-c-auth-0.8.0-hb921021_15.conda#c79d50f64cffa5ad51ecc1a81057962f -https://conda.anaconda.org/conda-forge/linux-64/aws-c-mqtt-0.11.0-h11f4f37_12.conda#96c3e0221fa2da97619ee82faa341a73 +https://conda.anaconda.org/conda-forge/linux-64/aws-c-auth-0.8.6-hd08a7f5_4.conda#f5a770ac1fd2cb34b21327fc513013a7 +https://conda.anaconda.org/conda-forge/linux-64/aws-c-mqtt-0.12.2-h108da3e_2.conda#90e07c8bac8da6378ee1882ef0a9374a https://conda.anaconda.org/conda-forge/linux-64/azure-core-cpp-1.14.0-h5cfcd09_0.conda#0a8838771cc2e985cd295e01ae83baf1 -https://conda.anaconda.org/conda-forge/linux-64/cairo-1.18.4-h3394656_0.conda#09262e66b19567aff4f592fb53b28760 https://conda.anaconda.org/conda-forge/linux-64/ccache-4.11.2-hd714d17_0.conda#35ae7ce74089ab05fdb1cb9746c0fbe4 https://conda.anaconda.org/conda-forge/linux-64/coverage-7.8.0-py313h8060acc_0.conda#375064d30e709bf7c1d4580e70aaea61 https://conda.anaconda.org/conda-forge/linux-64/dbus-1.13.6-h5008d03_3.tar.bz2#ecfff944ba3960ecb334b9a2663d708d https://conda.anaconda.org/conda-forge/linux-64/fonttools-4.57.0-py313h8060acc_0.conda#76b3a3367ac578a7cc43f4b7814e7e87 +https://conda.anaconda.org/conda-forge/linux-64/freetype-2.13.3-ha770c72_1.conda#9ccd736d31e0c6e41f54e704e5312811 https://conda.anaconda.org/conda-forge/noarch/jinja2-3.1.6-pyhd8ed1ab_0.conda#446bd6c8cb26050d528881df495ce646 https://conda.anaconda.org/conda-forge/noarch/joblib-1.4.2-pyhd8ed1ab_1.conda#bf8243ee348f3a10a14ed0cae323e0c1 -https://conda.anaconda.org/conda-forge/linux-64/lcms2-2.17-h717163a_0.conda#000e85703f0fd9594c81710dd5066471 https://conda.anaconda.org/conda-forge/linux-64/libcblas-3.9.0-31_he106b2a_openblas.conda#abb32c727da370c481a1c206f5159ce9 https://conda.anaconda.org/conda-forge/linux-64/libgl-1.7.0-ha4b6fd6_2.conda#928b8be80851f5d8ffb016f9c81dae7a -https://conda.anaconda.org/conda-forge/linux-64/libgrpc-1.67.1-hc2c308b_0.conda#4606a4647bfe857e3cfe21ca12ac3afb +https://conda.anaconda.org/conda-forge/linux-64/libgrpc-1.67.1-h25350d4_2.conda#bfcedaf5f9b003029cc6abe9431f66bf https://conda.anaconda.org/conda-forge/linux-64/libhwloc-2.11.2-default_h0d58e46_1001.conda#804ca9e91bcaea0824a341d55b1684f2 https://conda.anaconda.org/conda-forge/linux-64/liblapack-3.9.0-31_h7ac8fdf_openblas.conda#452b98eafe050ecff932f0ec832dd03f https://conda.anaconda.org/conda-forge/linux-64/libllvm20-20.1.3-he9d0ab4_0.conda#74c14fe2ab88e352ab6e4fedf5ecb527 -https://conda.anaconda.org/conda-forge/linux-64/libxkbcommon-1.8.1-hc4a0caf_0.conda#e7e5b0652227d646b44abdcbd989da7b +https://conda.anaconda.org/conda-forge/linux-64/libxkbcommon-1.9.0-h65c71a3_0.conda#14fbc598b68d4c6386978f7db09fc5ed https://conda.anaconda.org/conda-forge/linux-64/libxslt-1.1.39-h76b75d6_0.conda#e71f31f8cfb0a91439f2086fc8aa0461 https://conda.anaconda.org/conda-forge/noarch/meson-1.7.1-pyhd8ed1ab_0.conda#90018ee73b8741268027421ceac2809a https://conda.anaconda.org/conda-forge/linux-64/mpc-1.3.1-h24ddda3_1.conda#aa14b9a5196a6d8dd364164b7ce56acf -https://conda.anaconda.org/conda-forge/linux-64/openjpeg-2.5.3-h5fbd93e_0.conda#9e5816bc95d285c115a3ebc2f8563564 https://conda.anaconda.org/conda-forge/linux-64/openldap-2.6.9-he970967_0.conda#ca2de8bbdc871bce41dbf59e51324165 +https://conda.anaconda.org/conda-forge/linux-64/prometheus-cpp-1.3.0-ha5d0236_0.conda#a83f6a2fdc079e643237887a37460668 https://conda.anaconda.org/conda-forge/noarch/pyproject-metadata-0.9.1-pyhd8ed1ab_0.conda#22ae7c6ea81e0c8661ef32168dda929b https://conda.anaconda.org/conda-forge/noarch/pytest-8.3.5-pyhd8ed1ab_0.conda#c3c9316209dec74a705a36797970c6be https://conda.anaconda.org/conda-forge/noarch/python-dateutil-2.9.0.post0-pyhff2d567_1.conda#5ba79d7c71f03c678c8ead841f347d6e +https://conda.anaconda.org/conda-forge/noarch/python-gil-3.13.3-h4df99d1_101.conda#82c2641f2f0f513f7d2d1b847a2588e3 https://conda.anaconda.org/conda-forge/linux-64/xcb-util-cursor-0.1.5-hb9d3cd8_0.conda#eb44b3b6deb1cab08d72cb61686fe64c https://conda.anaconda.org/conda-forge/linux-64/xorg-libxcomposite-0.4.6-hb9d3cd8_2.conda#d3c295b50f092ab525ffe3c2aa4b7413 https://conda.anaconda.org/conda-forge/linux-64/xorg-libxcursor-1.2.3-hb9d3cd8_0.conda#2ccd714aa2242315acaf0a67faea780b @@ -193,16 +198,18 @@ https://conda.anaconda.org/conda-forge/linux-64/xorg-libxdamage-1.1.6-hb9d3cd8_0 https://conda.anaconda.org/conda-forge/linux-64/xorg-libxi-1.8.2-hb9d3cd8_0.conda#17dcc85db3c7886650b8908b183d6876 https://conda.anaconda.org/conda-forge/linux-64/xorg-libxrandr-1.5.4-hb9d3cd8_0.conda#2de7f99d6581a4a7adbff607b5c278ca https://conda.anaconda.org/conda-forge/linux-64/xorg-libxxf86vm-1.1.6-hb9d3cd8_0.conda#5efa5fa6243a622445fdfd72aee15efa -https://conda.anaconda.org/conda-forge/linux-64/aws-c-s3-0.7.7-hf454442_0.conda#947c82025693bebd557f782bb5d6b469 +https://conda.anaconda.org/conda-forge/noarch/_python_abi3_support-1.0-hd8ed1ab_2.conda#aaa2a381ccc56eac91d63b6c1240312f +https://conda.anaconda.org/conda-forge/linux-64/aws-c-s3-0.7.13-h822ba82_2.conda#9cf2c3c13468f2209ee814be2c88655f https://conda.anaconda.org/conda-forge/linux-64/azure-identity-cpp-1.10.0-h113e628_0.conda#73f73f60854f325a55f1d31459f2ab73 https://conda.anaconda.org/conda-forge/linux-64/azure-storage-common-cpp-12.8.0-h736e048_1.conda#13de36be8de3ae3f05ba127631599213 -https://conda.anaconda.org/conda-forge/linux-64/gmpy2-2.1.5-py313h11186cd_3.conda#846a773cdc154eda7b86d7f4427432f2 -https://conda.anaconda.org/conda-forge/linux-64/harfbuzz-11.1.0-h3beb420_0.conda#95e3bb97f9cdc251c0c68640e9c10ed3 +https://conda.anaconda.org/conda-forge/linux-64/fontconfig-2.15.0-h7e30c49_1.conda#8f5b0b297b59e1ac160ad4beec99dbee +https://conda.anaconda.org/conda-forge/linux-64/gmpy2-2.2.1-py313h11186cd_0.conda#54d020e0eaacf1e99bfb2410b9aa2e5e https://conda.anaconda.org/conda-forge/linux-64/libclang-cpp20.1-20.1.3-default_h1df26ce_0.conda#bbce8ba7f25af8b0928f13fca1eb7405 https://conda.anaconda.org/conda-forge/linux-64/libclang13-20.1.3-default_he06ed0a_0.conda#1bb2ec3c550f7589b2d16e271aeaeddb -https://conda.anaconda.org/conda-forge/linux-64/libgoogle-cloud-2.32.0-h804f50b_0.conda#3d96df4d6b1c88455e05b94ce8a14a53 +https://conda.anaconda.org/conda-forge/linux-64/libgoogle-cloud-2.36.0-h2b5623c_0.conda#c96ca58ad3352a964bfcb85de6cd1496 https://conda.anaconda.org/conda-forge/linux-64/liblapacke-3.9.0-31_he2f377e_openblas.conda#7e5fff7d0db69be3a266f7e79a3bb0e2 -https://conda.anaconda.org/conda-forge/linux-64/libmagma-2.8.0-h9ddd185_2.conda#8de40c4f75d36bb00a5870f682457f1d +https://conda.anaconda.org/conda-forge/linux-64/libmagma-2.9.0-h45b15fe_0.conda#703a1ab01e36111d8bb40bc7517e900b +https://conda.anaconda.org/conda-forge/linux-64/libopentelemetry-cpp-1.18.0-hfcad708_1.conda#1f5a5d66e77a39dc5bd639ec953705cf https://conda.anaconda.org/conda-forge/linux-64/libpq-17.4-h27ae623_1.conda#37fba334855ef3b51549308e61ed7a3d https://conda.anaconda.org/conda-forge/noarch/meson-python-0.17.1-pyh70fd9c4_1.conda#7a02679229c6c2092571b4c025055440 https://conda.anaconda.org/conda-forge/linux-64/numpy-2.2.5-py313h17eae1a_0.conda#6ceeff9ed72e54e4a2f9a1c88f47bdde @@ -212,34 +219,36 @@ https://conda.anaconda.org/conda-forge/noarch/pytest-xdist-3.6.1-pyhd8ed1ab_1.co https://conda.anaconda.org/conda-forge/linux-64/tbb-2021.13.0-hceb3a55_1.conda#ba7726b8df7b9d34ea80e82b097a4893 https://conda.anaconda.org/conda-forge/linux-64/xorg-libxtst-1.2.5-hb9d3cd8_3.conda#7bbe9a0cc0df0ac5f5a8ad6d6a11af2f https://conda.anaconda.org/conda-forge/noarch/array-api-strict-2.3.1-pyhd8ed1ab_0.conda#11107d0aeb8c590a34fee0894909816b -https://conda.anaconda.org/conda-forge/linux-64/aws-crt-cpp-0.29.7-hd92328a_7.conda#02b95564257d5c3db9c06beccf711f95 +https://conda.anaconda.org/conda-forge/linux-64/aws-crt-cpp-0.31.0-h55f77e1_4.conda#0627af705ed70681f5bede31e72348e5 https://conda.anaconda.org/conda-forge/linux-64/azure-storage-blobs-cpp-12.13.0-h3cf044e_1.conda#7eb66060455c7a47d9dcdbfa9f46579b https://conda.anaconda.org/conda-forge/linux-64/blas-devel-3.9.0-31_h1ea3ea9_openblas.conda#ba652ee0576396d4765e567f043c57f9 +https://conda.anaconda.org/conda-forge/linux-64/cairo-1.18.4-h3394656_0.conda#09262e66b19567aff4f592fb53b28760 https://conda.anaconda.org/conda-forge/linux-64/contourpy-1.3.2-py313h33d0bda_0.conda#5dc81fffe102f63045225007a33d6199 https://conda.anaconda.org/conda-forge/linux-64/cupy-core-13.4.1-py313hc2a895b_0.conda#46dd595e816b278b178e3bef8a6acf71 -https://conda.anaconda.org/conda-forge/linux-64/libgoogle-cloud-storage-2.32.0-h0121fbd_0.conda#877a5ec0431a5af83bf0cd0522bfe661 -https://conda.anaconda.org/conda-forge/linux-64/libmagma_sparse-2.8.0-h9ddd185_0.conda#f4eb3cfeaf9d91e72d5b2b8706bf059f +https://conda.anaconda.org/conda-forge/linux-64/libgoogle-cloud-storage-2.36.0-h0121fbd_0.conda#fc5efe1833a4d709953964037985bb72 +https://conda.anaconda.org/conda-forge/linux-64/libmagma_sparse-2.9.0-h45b15fe_0.conda#beac0a5bbe0af75db6b16d3d8fd24f7e https://conda.anaconda.org/conda-forge/linux-64/mkl-2024.2.2-ha957f24_16.conda#1459379c79dda834673426504d52b319 https://conda.anaconda.org/conda-forge/linux-64/pandas-2.2.3-py313ha87cce1_3.conda#6248b529e537b1d4cb5ab3ef7f537795 -https://conda.anaconda.org/conda-forge/linux-64/polars-1.27.1-py313h96101dc_1.conda#f5c18ddf7723234bc0ebc8272df2e73c -https://conda.anaconda.org/conda-forge/linux-64/qt6-main-6.9.0-h6441bc3_1.conda#4029a8dcb1d97ea241dbe5abfda1fad6 +https://conda.anaconda.org/conda-forge/linux-64/polars-1.27.1-py39h2a4a510_3.conda#fba08963eaa1f954480045d033d1221e https://conda.anaconda.org/conda-forge/linux-64/scipy-1.15.2-py313h86fcf2b_0.conda#ca68acd9febc86448eeed68d0c6c8643 https://conda.anaconda.org/conda-forge/noarch/sympy-1.13.3-pyh2585a3b_105.conda#254cd5083ffa04d96e3173397a3d30f4 -https://conda.anaconda.org/conda-forge/linux-64/aws-sdk-cpp-1.11.458-hc430e4a_4.conda#aeefac461bea1f126653c1285cf5af08 +https://conda.anaconda.org/conda-forge/linux-64/aws-sdk-cpp-1.11.510-h37a5c72_3.conda#beb8577571033140c6897d257acc7724 https://conda.anaconda.org/conda-forge/linux-64/azure-storage-files-datalake-cpp-12.12.0-ha633028_1.conda#7c1980f89dd41b097549782121a73490 https://conda.anaconda.org/conda-forge/linux-64/blas-2.131-openblas.conda#38b2ec894c69bb4be0e66d2ef7fc60bf https://conda.anaconda.org/conda-forge/linux-64/cupy-13.4.1-py313h66a2ee2_0.conda#784d6bd149ef2b5d9c733ea3dd4d15ad -https://conda.anaconda.org/conda-forge/linux-64/libtorch-2.5.1-cuda118_hb34f2e8_303.conda#da799bf557ff6376a1a58f40bddfb293 +https://conda.anaconda.org/conda-forge/linux-64/harfbuzz-11.1.0-h3beb420_0.conda#95e3bb97f9cdc251c0c68640e9c10ed3 +https://conda.anaconda.org/conda-forge/linux-64/libtorch-2.4.1-cuda118_mkl_hee7131c_306.conda#28b3b3da11973494ed0100aa50f47328 https://conda.anaconda.org/conda-forge/linux-64/matplotlib-base-3.10.1-py313h129903b_0.conda#4e23b3fabf434b418e0d9c6975a6453f https://conda.anaconda.org/conda-forge/linux-64/pyamg-5.2.1-py313hf0ab243_1.conda#4c769bf3858f424cb2ecf952175ec600 +https://conda.anaconda.org/conda-forge/linux-64/libarrow-19.0.1-hc7b3859_3_cpu.conda#9ed3ded6da29dec8417f2e1db68798f2 +https://conda.anaconda.org/conda-forge/linux-64/pytorch-2.4.1-cuda118_mkl_py313_h909c4c2_306.conda#de6e45613bbdb51127e9ff483c31bf41 +https://conda.anaconda.org/conda-forge/linux-64/qt6-main-6.9.0-h6441bc3_1.conda#4029a8dcb1d97ea241dbe5abfda1fad6 +https://conda.anaconda.org/conda-forge/linux-64/libarrow-acero-19.0.1-hcb10f89_3_cpu.conda#8f8dc214d89e06933f1bc1dcd2310b9c +https://conda.anaconda.org/conda-forge/linux-64/libparquet-19.0.1-h081d1f1_3_cpu.conda#1d04307cdb1d8aeb5f55b047d5d403ea +https://conda.anaconda.org/conda-forge/linux-64/pyarrow-core-19.0.1-py313he5f92c8_0_cpu.conda#7d8649531c807b24295c8f9a0a396a78 https://conda.anaconda.org/conda-forge/linux-64/pyside6-6.9.0-py313h5f61773_0.conda#f51f25ec8fcbf777f8b186bb5deeed40 -https://conda.anaconda.org/conda-forge/linux-64/libarrow-18.1.0-h44a453e_6_cpu.conda#2cf6d608d6e66506f69797d5c6944c35 +https://conda.anaconda.org/conda-forge/linux-64/pytorch-gpu-2.4.1-cuda118_mkl_hf8a3b2d_306.conda#b1802a39f1ca7ebed5f8c35755bffec1 +https://conda.anaconda.org/conda-forge/linux-64/libarrow-dataset-19.0.1-hcb10f89_3_cpu.conda#a28f04b6e68a1c76de76783108ad729d https://conda.anaconda.org/conda-forge/linux-64/matplotlib-3.10.1-py313h78bf25f_0.conda#d0c80dea550ca97fc0710b2ecef919ba -https://conda.anaconda.org/conda-forge/linux-64/pytorch-2.5.1-cuda118_py313h40cdc2d_303.conda#19ad990954a4ed89358d91d0a3e7016d -https://conda.anaconda.org/conda-forge/linux-64/libarrow-acero-18.1.0-hcb10f89_6_cpu.conda#143f9288b64759a6427563f058c62f2b -https://conda.anaconda.org/conda-forge/linux-64/libparquet-18.1.0-h081d1f1_6_cpu.conda#68788df49ce7480187eb6387f15b2b67 -https://conda.anaconda.org/conda-forge/linux-64/pyarrow-core-18.1.0-py313he5f92c8_0_cpu.conda#5380e12f4468e891911dbbd4248b521a -https://conda.anaconda.org/conda-forge/linux-64/pytorch-gpu-2.5.1-cuda126hf7c78f0_303.conda#afaf760e55725108ae78ed41198c49bb -https://conda.anaconda.org/conda-forge/linux-64/libarrow-dataset-18.1.0-hcb10f89_6_cpu.conda#20ca46a6bc714a6ab189d5b3f46e66d8 -https://conda.anaconda.org/conda-forge/linux-64/libarrow-substrait-18.1.0-h3ee7192_6_cpu.conda#aa313b3168caf98d00b3753f5ba27650 -https://conda.anaconda.org/conda-forge/linux-64/pyarrow-18.1.0-py313h78bf25f_0.conda#a11d880ceedc33993c6f5c14a80ea9d3 +https://conda.anaconda.org/conda-forge/linux-64/libarrow-substrait-19.0.1-h08228c5_3_cpu.conda#a58e4763af8293deaac77b63bc7804d8 +https://conda.anaconda.org/conda-forge/linux-64/pyarrow-19.0.1-py313h78bf25f_0.conda#e8efe6998a383dd149787c83d3d6a92e From 39aaf13b505096c1646c986d0c320ae82dee58c0 Mon Sep 17 00:00:00 2001 From: Thomas Li <47963215+lithomas1@users.noreply.github.com> Date: Mon, 28 Apr 2025 05:26:48 -0400 Subject: [PATCH 086/182] ENH Add Array API compatibility to Binarizer (#31190) Co-authored-by: Tialo Co-authored-by: Olivier Grisel Co-authored-by: Omar Salman Co-authored-by: Tialo <65392801+Tialo@users.noreply.github.com> --- doc/modules/array_api.rst | 1 + .../array-api/31190.feature.rst | 2 ++ sklearn/preprocessing/_data.py | 15 ++++++++++--- sklearn/preprocessing/tests/test_data.py | 22 +++++++++++++++++-- 4 files changed, 35 insertions(+), 5 deletions(-) create mode 100644 doc/whats_new/upcoming_changes/array-api/31190.feature.rst diff --git a/doc/modules/array_api.rst b/doc/modules/array_api.rst index b4940eccec2fc..e7261ea35cc7c 100644 --- a/doc/modules/array_api.rst +++ b/doc/modules/array_api.rst @@ -111,6 +111,7 @@ Estimators `svd_solver="randomized"` and `power_iteration_normalizer="QR"`) - :class:`linear_model.Ridge` (with `solver="svd"`) - :class:`discriminant_analysis.LinearDiscriminantAnalysis` (with `solver="svd"`) +- :class:`preprocessing.Binarizer` - :class:`preprocessing.KernelCenterer` - :class:`preprocessing.LabelEncoder` - :class:`preprocessing.MaxAbsScaler` diff --git a/doc/whats_new/upcoming_changes/array-api/31190.feature.rst b/doc/whats_new/upcoming_changes/array-api/31190.feature.rst new file mode 100644 index 0000000000000..15504c0e28fce --- /dev/null +++ b/doc/whats_new/upcoming_changes/array-api/31190.feature.rst @@ -0,0 +1,2 @@ +- :class:`preprocessing.Binarizer` now supports Array API compatible inputs. + By :user:`Yaroslav Korobko `, :user:`Olivier Grisel `, and :user:`Thomas Li `. diff --git a/sklearn/preprocessing/_data.py b/sklearn/preprocessing/_data.py index 74d7b1909c4e1..d671376b9330d 100644 --- a/sklearn/preprocessing/_data.py +++ b/sklearn/preprocessing/_data.py @@ -19,7 +19,13 @@ _fit_context, ) from ..utils import _array_api, check_array, resample -from ..utils._array_api import _modify_in_place_if_numpy, device, get_namespace +from ..utils._array_api import ( + _find_matching_floating_dtype, + _modify_in_place_if_numpy, + device, + get_namespace, + get_namespace_and_device, +) from ..utils._param_validation import Interval, Options, StrOptions, validate_params from ..utils.extmath import _incremental_mean_and_var, row_norms from ..utils.sparsefuncs import ( @@ -2209,8 +2215,10 @@ def binarize(X, *, threshold=0.0, copy=True): X.data[not_cond] = 0 X.eliminate_zeros() else: - cond = X > threshold - not_cond = np.logical_not(cond) + xp, _, device = get_namespace_and_device(X) + float_dtype = _find_matching_floating_dtype(X, threshold, xp=xp) + cond = xp.astype(X, float_dtype, copy=False) > threshold + not_cond = xp.logical_not(cond) X[cond] = 1 X[not_cond] = 0 return X @@ -2353,6 +2361,7 @@ def transform(self, X, copy=None): def __sklearn_tags__(self): tags = super().__sklearn_tags__() tags.requires_fit = False + tags.array_api_support = True tags.input_tags.sparse = True return tags diff --git a/sklearn/preprocessing/tests/test_data.py b/sklearn/preprocessing/tests/test_data.py index ac303a1c93e96..4732d2960360c 100644 --- a/sklearn/preprocessing/tests/test_data.py +++ b/sklearn/preprocessing/tests/test_data.py @@ -9,7 +9,7 @@ import pytest from scipy import sparse, stats -from sklearn import datasets +from sklearn import config_context, datasets from sklearn.base import clone from sklearn.exceptions import NotFittedError from sklearn.metrics.pairwise import linear_kernel @@ -38,11 +38,13 @@ from sklearn.svm import SVR from sklearn.utils import gen_batches, shuffle from sklearn.utils._array_api import ( + _convert_to_numpy, _get_namespace_device_dtype_ids, yield_namespace_device_dtype_combinations, ) from sklearn.utils._test_common.instance_generator import _get_check_estimator_ids from sklearn.utils._testing import ( + _array_api_for_tests, _convert_container, assert_allclose, assert_allclose_dense_sparse, @@ -709,10 +711,11 @@ def test_standard_check_array_of_inverse_transform(): Normalizer(norm="l1"), Normalizer(norm="l2"), Normalizer(norm="max"), + Binarizer(), ], ids=_get_check_estimator_ids, ) -def test_scaler_array_api_compliance( +def test_preprocessing_array_api_compliance( estimator, check, array_namespace, device, dtype_name ): name = estimator.__class__.__name__ @@ -2004,6 +2007,21 @@ def test_binarizer(constructor): binarizer.transform(constructor(X)) +@pytest.mark.parametrize( + "array_namespace, device, dtype_name", yield_namespace_device_dtype_combinations() +) +def test_binarizer_array_api_int(array_namespace, device, dtype_name): + # Checks that Binarizer works with integer elements and float threshold + xp = _array_api_for_tests(array_namespace, device) + for dtype_name_ in [dtype_name, "int32", "int64"]: + X_np = np.reshape(np.asarray([0, 1, 2, 3, 4], dtype=dtype_name_), (-1, 1)) + X_xp = xp.asarray(X_np, device=device) + binarized_np = Binarizer(threshold=2.5).fit_transform(X_np) + with config_context(array_api_dispatch=True): + binarized_xp = Binarizer(threshold=2.5).fit_transform(X_xp) + assert_array_equal(_convert_to_numpy(binarized_xp, xp), binarized_np) + + def test_center_kernel(): # Test that KernelCenterer is equivalent to StandardScaler # in feature space From b98dc797c480b1b9495f918e201d45ee07f29feb Mon Sep 17 00:00:00 2001 From: Dimitri Papadopoulos Orfanos <3234522+DimitriPapadopoulos@users.noreply.github.com> Date: Mon, 28 Apr 2025 11:33:18 +0200 Subject: [PATCH 087/182] MNT Enforce ruff/pygrep-hooks rules (PGH) (#31226) Co-authored-by: Adrin Jalali --- benchmarks/bench_plot_fastkmeans.py | 2 +- benchmarks/bench_plot_lasso_path.py | 2 +- benchmarks/bench_plot_svd.py | 2 +- doc/api_reference.py | 2 +- doc/conf.py | 6 ++-- doc/conftest.py | 14 +++++----- .../plot_gradient_boosting_quantile.py | 7 +++-- ...t_iterative_imputer_variants_comparison.py | 2 +- examples/impute/plot_missing_values.py | 2 +- examples/miscellaneous/plot_set_output.py | 2 +- .../plot_successive_halving_heatmap.py | 2 +- .../plot_successive_halving_iterations.py | 2 +- .../plot_release_highlights_0_23_0.py | 28 +++++++++++-------- .../plot_release_highlights_0_24_0.py | 25 +++++++++-------- .../plot_release_highlights_1_0_0.py | 9 ++++-- .../plot_release_highlights_1_1_0.py | 26 +++++++++-------- .../plot_release_highlights_1_2_0.py | 10 ++++--- .../plot_release_highlights_1_3_0.py | 11 ++++++-- .../plot_release_highlights_1_4_0.py | 22 +++++++++------ .../plot_release_highlights_1_5_0.py | 10 +++---- .../plot_release_highlights_1_6_0.py | 4 ++- pyproject.toml | 2 +- sklearn/__check_build/__init__.py | 2 +- sklearn/_loss/tests/test_loss.py | 2 +- sklearn/cluster/_agglomerative.py | 2 +- sklearn/cluster/tests/test_spectral.py | 2 +- sklearn/conftest.py | 6 ++-- sklearn/covariance/_graph_lasso.py | 2 +- sklearn/datasets/tests/test_base.py | 4 +-- sklearn/datasets/tests/test_common.py | 4 +-- sklearn/ensemble/tests/test_forest.py | 2 +- sklearn/impute/__init__.py | 2 +- sklearn/impute/tests/test_common.py | 2 +- sklearn/impute/tests/test_impute.py | 2 +- sklearn/inspection/_partial_dependence.py | 2 +- sklearn/linear_model/_coordinate_descent.py | 2 +- sklearn/linear_model/_least_angle.py | 2 +- sklearn/manifold/_t_sne.py | 2 +- .../manifold/tests/test_spectral_embedding.py | 2 +- sklearn/manifold/tests/test_t_sne.py | 2 +- sklearn/metrics/tests/test_common.py | 2 +- sklearn/model_selection/__init__.py | 2 +- sklearn/model_selection/tests/test_search.py | 4 +-- sklearn/model_selection/tests/test_split.py | 2 +- .../tests/test_successive_halving.py | 7 ++--- sklearn/neighbors/tests/test_neighbors.py | 6 ++-- sklearn/svm/_base.py | 6 ++-- sklearn/svm/tests/test_svm.py | 2 +- sklearn/tests/test_common.py | 4 +-- sklearn/tests/test_docstring_parameters.py | 4 +-- sklearn/tests/test_docstrings.py | 4 +-- sklearn/tests/test_init.py | 2 +- sklearn/tests/test_metadata_routing.py | 2 +- .../test_metaestimators_metadata_routing.py | 4 +-- sklearn/utils/__init__.py | 2 +- sklearn/utils/_mocking.py | 2 +- sklearn/utils/_optional_dependencies.py | 2 +- sklearn/utils/_pprint.py | 2 +- .../utils/_test_common/instance_generator.py | 2 +- sklearn/utils/_testing.py | 8 +++--- sklearn/utils/estimator_checks.py | 2 +- sklearn/utils/fixes.py | 17 +++++++---- sklearn/utils/metadata_routing.py | 26 +++++++++-------- sklearn/utils/tests/test_deprecation.py | 2 +- sklearn/utils/tests/test_estimator_checks.py | 2 +- sklearn/utils/tests/test_tags.py | 2 +- 66 files changed, 196 insertions(+), 160 deletions(-) diff --git a/benchmarks/bench_plot_fastkmeans.py b/benchmarks/bench_plot_fastkmeans.py index 1d420d1dabe5d..d5a2d10fbf22d 100644 --- a/benchmarks/bench_plot_fastkmeans.py +++ b/benchmarks/bench_plot_fastkmeans.py @@ -97,8 +97,8 @@ def compute_bench_2(chunks): if __name__ == "__main__": - from mpl_toolkits.mplot3d import axes3d # noqa register the 3d projection import matplotlib.pyplot as plt + from mpl_toolkits.mplot3d import axes3d # register the 3d projection # noqa: F401 samples_range = np.linspace(50, 150, 5).astype(int) features_range = np.linspace(150, 50000, 5).astype(int) diff --git a/benchmarks/bench_plot_lasso_path.py b/benchmarks/bench_plot_lasso_path.py index 3b46e447401cb..9acc1b4b35952 100644 --- a/benchmarks/bench_plot_lasso_path.py +++ b/benchmarks/bench_plot_lasso_path.py @@ -80,8 +80,8 @@ def compute_bench(samples_range, features_range): if __name__ == "__main__": - from mpl_toolkits.mplot3d import axes3d # noqa register the 3d projection import matplotlib.pyplot as plt + from mpl_toolkits.mplot3d import axes3d # register the 3d projection # noqa: F401 samples_range = np.linspace(10, 2000, 5).astype(int) features_range = np.linspace(10, 2000, 5).astype(int) diff --git a/benchmarks/bench_plot_svd.py b/benchmarks/bench_plot_svd.py index ed99d1c44e2fd..f93920cae5305 100644 --- a/benchmarks/bench_plot_svd.py +++ b/benchmarks/bench_plot_svd.py @@ -54,8 +54,8 @@ def compute_bench(samples_range, features_range, n_iter=3, rank=50): if __name__ == "__main__": - from mpl_toolkits.mplot3d import axes3d # noqa register the 3d projection import matplotlib.pyplot as plt + from mpl_toolkits.mplot3d import axes3d # register the 3d projection # noqa: F401 samples_range = np.linspace(2, 1000, 4).astype(int) features_range = np.linspace(2, 1000, 4).astype(int) diff --git a/doc/api_reference.py b/doc/api_reference.py index 5f482ff7e756d..c90b115746415 100644 --- a/doc/api_reference.py +++ b/doc/api_reference.py @@ -1349,4 +1349,4 @@ def _get_submodule(module_name, submodule_name): } """ -DEPRECATED_API_REFERENCE = {} # type: ignore +DEPRECATED_API_REFERENCE = {} # type: ignore[var-annotated] diff --git a/doc/conf.py b/doc/conf.py index ccf721ec8ca2c..aea5d52b53da4 100644 --- a/doc/conf.py +++ b/doc/conf.py @@ -769,8 +769,10 @@ def reset_sklearn_config(gallery_conf, fname): # enable experimental module so that experimental estimators can be # discovered properly by sphinx -from sklearn.experimental import enable_iterative_imputer # noqa -from sklearn.experimental import enable_halving_search_cv # noqa +from sklearn.experimental import ( # noqa: F401 + enable_halving_search_cv, + enable_iterative_imputer, +) def make_carousel_thumbs(app, exception): diff --git a/doc/conftest.py b/doc/conftest.py index 3ea4534d9d11d..ad8d6eb8cfb62 100644 --- a/doc/conftest.py +++ b/doc/conftest.py @@ -41,7 +41,7 @@ def setup_working_with_text_data(): def setup_loading_other_datasets(): try: - import pandas # noqa + import pandas # noqa: F401 except ImportError: raise SkipTest("Skipping loading_other_datasets.rst, pandas not installed") @@ -56,35 +56,35 @@ def setup_loading_other_datasets(): def setup_compose(): try: - import pandas # noqa + import pandas # noqa: F401 except ImportError: raise SkipTest("Skipping compose.rst, pandas not installed") def setup_impute(): try: - import pandas # noqa + import pandas # noqa: F401 except ImportError: raise SkipTest("Skipping impute.rst, pandas not installed") def setup_grid_search(): try: - import pandas # noqa + import pandas # noqa: F401 except ImportError: raise SkipTest("Skipping grid_search.rst, pandas not installed") def setup_preprocessing(): try: - import pandas # noqa + import pandas # noqa: F401 except ImportError: raise SkipTest("Skipping preprocessing.rst, pandas not installed") def skip_if_matplotlib_not_installed(fname): try: - import matplotlib # noqa + import matplotlib # noqa: F401 except ImportError: basename = os.path.basename(fname) raise SkipTest(f"Skipping doctests for {basename}, matplotlib not installed") @@ -92,7 +92,7 @@ def skip_if_matplotlib_not_installed(fname): def skip_if_cupy_not_installed(fname): try: - import cupy # noqa + import cupy # noqa: F401 except ImportError: basename = os.path.basename(fname) raise SkipTest(f"Skipping doctests for {basename}, cupy not installed") diff --git a/examples/ensemble/plot_gradient_boosting_quantile.py b/examples/ensemble/plot_gradient_boosting_quantile.py index 01ab647359c47..dbe3a99b045dd 100644 --- a/examples/ensemble/plot_gradient_boosting_quantile.py +++ b/examples/ensemble/plot_gradient_boosting_quantile.py @@ -241,11 +241,12 @@ def coverage_fraction(y, y_low, y_high): # cross-validation on the pinball loss with alpha=0.05: # %% -from sklearn.experimental import enable_halving_search_cv # noqa -from sklearn.model_selection import HalvingRandomSearchCV -from sklearn.metrics import make_scorer from pprint import pprint +from sklearn.experimental import enable_halving_search_cv # noqa: F401 +from sklearn.metrics import make_scorer +from sklearn.model_selection import HalvingRandomSearchCV + param_grid = dict( learning_rate=[0.05, 0.1, 0.2], max_depth=[2, 5, 10], diff --git a/examples/impute/plot_iterative_imputer_variants_comparison.py b/examples/impute/plot_iterative_imputer_variants_comparison.py index f06875a5f7fcd..d2a68d351ce8a 100644 --- a/examples/impute/plot_iterative_imputer_variants_comparison.py +++ b/examples/impute/plot_iterative_imputer_variants_comparison.py @@ -55,7 +55,7 @@ from sklearn.ensemble import RandomForestRegressor # To use this experimental feature, we need to explicitly ask for it: -from sklearn.experimental import enable_iterative_imputer # noqa +from sklearn.experimental import enable_iterative_imputer # noqa: F401 from sklearn.impute import IterativeImputer, SimpleImputer from sklearn.kernel_approximation import Nystroem from sklearn.linear_model import BayesianRidge, Ridge diff --git a/examples/impute/plot_missing_values.py b/examples/impute/plot_missing_values.py index 9d61ffc4964ee..851bfd419453b 100644 --- a/examples/impute/plot_missing_values.py +++ b/examples/impute/plot_missing_values.py @@ -92,7 +92,7 @@ def add_missing_values(X_full, y_full): from sklearn.ensemble import RandomForestRegressor # To use the experimental IterativeImputer, we need to explicitly ask for it: -from sklearn.experimental import enable_iterative_imputer # noqa +from sklearn.experimental import enable_iterative_imputer # noqa: F401 from sklearn.impute import IterativeImputer, KNNImputer, SimpleImputer from sklearn.model_selection import cross_val_score from sklearn.pipeline import make_pipeline diff --git a/examples/miscellaneous/plot_set_output.py b/examples/miscellaneous/plot_set_output.py index e74d94957c685..f3e5be13f5182 100644 --- a/examples/miscellaneous/plot_set_output.py +++ b/examples/miscellaneous/plot_set_output.py @@ -10,7 +10,7 @@ the `set_output` method or globally by setting `set_config(transform_output="pandas")`. For details, see `SLEP018 `__. -""" # noqa +""" # noqa: CPY001 # %% # First, we load the iris dataset as a DataFrame to demonstrate the `set_output` API. diff --git a/examples/model_selection/plot_successive_halving_heatmap.py b/examples/model_selection/plot_successive_halving_heatmap.py index 4d9b676443e5e..c46068532e52e 100644 --- a/examples/model_selection/plot_successive_halving_heatmap.py +++ b/examples/model_selection/plot_successive_halving_heatmap.py @@ -18,7 +18,7 @@ import pandas as pd from sklearn import datasets -from sklearn.experimental import enable_halving_search_cv # noqa +from sklearn.experimental import enable_halving_search_cv # noqa: F401 from sklearn.model_selection import GridSearchCV, HalvingGridSearchCV from sklearn.svm import SVC diff --git a/examples/model_selection/plot_successive_halving_iterations.py b/examples/model_selection/plot_successive_halving_iterations.py index 31c1a0b9d5b34..986be49ac0bef 100644 --- a/examples/model_selection/plot_successive_halving_iterations.py +++ b/examples/model_selection/plot_successive_halving_iterations.py @@ -20,7 +20,7 @@ from sklearn import datasets from sklearn.ensemble import RandomForestClassifier -from sklearn.experimental import enable_halving_search_cv # noqa +from sklearn.experimental import enable_halving_search_cv # noqa: F401 from sklearn.model_selection import HalvingRandomSearchCV # %% diff --git a/examples/release_highlights/plot_release_highlights_0_23_0.py b/examples/release_highlights/plot_release_highlights_0_23_0.py index be9b5fc3b257e..00c36969ec18b 100644 --- a/examples/release_highlights/plot_release_highlights_0_23_0.py +++ b/examples/release_highlights/plot_release_highlights_0_23_0.py @@ -1,4 +1,4 @@ -# ruff: noqa +# ruff: noqa: CPY001 """ ======================================== Release Highlights for scikit-learn 0.23 @@ -35,9 +35,10 @@ # 'poisson' loss as well. import numpy as np -from sklearn.model_selection import train_test_split -from sklearn.linear_model import PoissonRegressor + from sklearn.ensemble import HistGradientBoostingRegressor +from sklearn.linear_model import PoissonRegressor +from sklearn.model_selection import train_test_split n_samples, n_features = 1000, 20 rng = np.random.RandomState(0) @@ -63,11 +64,11 @@ # this feature. from sklearn import set_config -from sklearn.pipeline import make_pipeline -from sklearn.preprocessing import OneHotEncoder, StandardScaler -from sklearn.impute import SimpleImputer from sklearn.compose import make_column_transformer +from sklearn.impute import SimpleImputer from sklearn.linear_model import LogisticRegression +from sklearn.pipeline import make_pipeline +from sklearn.preprocessing import OneHotEncoder, StandardScaler set_config(display="diagram") @@ -94,12 +95,13 @@ # parallelism instead of relying on joblib, so the `n_jobs` parameter has no # effect anymore. For more details on how to control the number of threads, # please refer to our :ref:`parallelism` notes. -import scipy import numpy as np -from sklearn.model_selection import train_test_split +import scipy + from sklearn.cluster import KMeans from sklearn.datasets import make_blobs from sklearn.metrics import completeness_score +from sklearn.model_selection import train_test_split rng = np.random.RandomState(0) X, y = make_blobs(random_state=rng) @@ -126,11 +128,12 @@ # example, see :ref:`sphx_glr_auto_examples_ensemble_plot_hgbt_regression.py`. import numpy as np from matplotlib import pyplot as plt -from sklearn.model_selection import train_test_split + +from sklearn.ensemble import HistGradientBoostingRegressor # from sklearn.inspection import plot_partial_dependence from sklearn.inspection import PartialDependenceDisplay -from sklearn.ensemble import HistGradientBoostingRegressor +from sklearn.model_selection import train_test_split n_samples = 500 rng = np.random.RandomState(0) @@ -173,10 +176,11 @@ # The two linear regressors :class:`~sklearn.linear_model.Lasso` and # :class:`~sklearn.linear_model.ElasticNet` now support sample weights. -from sklearn.model_selection import train_test_split +import numpy as np + from sklearn.datasets import make_regression from sklearn.linear_model import Lasso -import numpy as np +from sklearn.model_selection import train_test_split n_samples, n_features = 1000, 20 rng = np.random.RandomState(0) diff --git a/examples/release_highlights/plot_release_highlights_0_24_0.py b/examples/release_highlights/plot_release_highlights_0_24_0.py index a7369317da3e0..d09250ba6ff64 100644 --- a/examples/release_highlights/plot_release_highlights_0_24_0.py +++ b/examples/release_highlights/plot_release_highlights_0_24_0.py @@ -1,4 +1,4 @@ -# ruff: noqa +# ruff: noqa: CPY001, E501 """ ======================================== Release Highlights for scikit-learn 0.24 @@ -51,10 +51,11 @@ import numpy as np from scipy.stats import randint -from sklearn.experimental import enable_halving_search_cv # noqa -from sklearn.model_selection import HalvingRandomSearchCV -from sklearn.ensemble import RandomForestClassifier + from sklearn.datasets import make_classification +from sklearn.ensemble import RandomForestClassifier +from sklearn.experimental import enable_halving_search_cv # noqa: F401 +from sklearn.model_selection import HalvingRandomSearchCV rng = np.random.RandomState(0) @@ -118,6 +119,7 @@ # Read more in the :ref:`User guide `. import numpy as np + from sklearn import datasets from sklearn.semi_supervised import SelfTrainingClassifier from sklearn.svm import SVC @@ -140,9 +142,9 @@ # (backward selection), based on a cross-validated score maximization. # See the :ref:`User Guide `. +from sklearn.datasets import load_iris from sklearn.feature_selection import SequentialFeatureSelector from sklearn.neighbors import KNeighborsClassifier -from sklearn.datasets import load_iris X, y = load_iris(return_X_y=True, as_frame=True) feature_names = X.columns @@ -163,11 +165,11 @@ # :class:`~sklearn.preprocessing.PolynomialFeatures`. from sklearn.datasets import fetch_covtype -from sklearn.pipeline import make_pipeline -from sklearn.model_selection import train_test_split -from sklearn.preprocessing import MinMaxScaler from sklearn.kernel_approximation import PolynomialCountSketch from sklearn.linear_model import LogisticRegression +from sklearn.model_selection import train_test_split +from sklearn.pipeline import make_pipeline +from sklearn.preprocessing import MinMaxScaler X, y = fetch_covtype(return_X_y=True) pipe = make_pipeline( @@ -194,8 +196,8 @@ # prediction on a feature for each sample separately, with one line per sample. # See the :ref:`User Guide ` -from sklearn.ensemble import RandomForestRegressor from sklearn.datasets import fetch_california_housing +from sklearn.ensemble import RandomForestRegressor # from sklearn.inspection import plot_partial_dependence from sklearn.inspection import PartialDependenceDisplay @@ -232,10 +234,11 @@ # splitting criterion. Setting `criterion="poisson"` might be a good choice # if your target is a count or a frequency. -from sklearn.tree import DecisionTreeRegressor -from sklearn.model_selection import train_test_split import numpy as np +from sklearn.model_selection import train_test_split +from sklearn.tree import DecisionTreeRegressor + n_samples, n_features = 1000, 20 rng = np.random.RandomState(0) X = rng.randn(n_samples, n_features) diff --git a/examples/release_highlights/plot_release_highlights_1_0_0.py b/examples/release_highlights/plot_release_highlights_1_0_0.py index 264cb1d5a557e..03213076b326e 100644 --- a/examples/release_highlights/plot_release_highlights_1_0_0.py +++ b/examples/release_highlights/plot_release_highlights_1_0_0.py @@ -1,4 +1,4 @@ -# ruff: noqa +# ruff: noqa: CPY001 """ ======================================= Release Highlights for scikit-learn 1.0 @@ -89,6 +89,7 @@ # refer to the :ref:`User Guide `. import numpy as np + from sklearn.preprocessing import SplineTransformer X = np.arange(5).reshape(5, 1) @@ -147,9 +148,10 @@ # is used to check that the column names of the dataframe passed in # non-:term:`fit`, such as :term:`predict`, are consistent with features in # :term:`fit`: -from sklearn.preprocessing import StandardScaler import pandas as pd +from sklearn.preprocessing import StandardScaler + X = pd.DataFrame([[1, 2, 3], [4, 5, 6]], columns=["a", "b", "c"]) scalar = StandardScaler().fit(X) scalar.feature_names_in_ @@ -162,9 +164,10 @@ # will be added to all other transformers in future releases. Additionally, # :meth:`compose.ColumnTransformer.get_feature_names_out` is available to # combine feature names of its transformers: +import pandas as pd + from sklearn.compose import ColumnTransformer from sklearn.preprocessing import OneHotEncoder -import pandas as pd X = pd.DataFrame({"pet": ["dog", "cat", "fish"], "age": [3, 7, 1]}) preprocessor = ColumnTransformer( diff --git a/examples/release_highlights/plot_release_highlights_1_1_0.py b/examples/release_highlights/plot_release_highlights_1_1_0.py index 2a529e9ccd269..da53ea6160894 100644 --- a/examples/release_highlights/plot_release_highlights_1_1_0.py +++ b/examples/release_highlights/plot_release_highlights_1_1_0.py @@ -1,4 +1,4 @@ -# ruff: noqa +# ruff: noqa: CPY001, E501 """ ======================================= Release Highlights for scikit-learn 1.1 @@ -28,9 +28,10 @@ # ----------------------------------------------------------------- # :class:`~ensemble.HistGradientBoostingRegressor` can model quantiles with # `loss="quantile"` and the new parameter `quantile`. -from sklearn.ensemble import HistGradientBoostingRegressor -import numpy as np import matplotlib.pyplot as plt +import numpy as np + +from sklearn.ensemble import HistGradientBoostingRegressor # Simple regression function for X * cos(X) rng = np.random.RandomState(42) @@ -66,12 +67,12 @@ # This enables :class:`~pipeline.Pipeline` to construct the output feature names for # more complex pipelines: from sklearn.compose import ColumnTransformer -from sklearn.preprocessing import OneHotEncoder, StandardScaler -from sklearn.pipeline import make_pipeline -from sklearn.impute import SimpleImputer -from sklearn.feature_selection import SelectKBest from sklearn.datasets import fetch_openml +from sklearn.feature_selection import SelectKBest +from sklearn.impute import SimpleImputer from sklearn.linear_model import LogisticRegression +from sklearn.pipeline import make_pipeline +from sklearn.preprocessing import OneHotEncoder, StandardScaler X, y = fetch_openml( "titanic", version=1, as_frame=True, return_X_y=True, parser="pandas" @@ -115,9 +116,10 @@ # the gathering of infrequent categories are `min_frequency` and # `max_categories`. See the :ref:`User Guide ` # for more details. -from sklearn.preprocessing import OneHotEncoder import numpy as np +from sklearn.preprocessing import OneHotEncoder + X = np.array( [["dog"] * 5 + ["cat"] * 20 + ["rabbit"] * 10 + ["snake"] * 3], dtype=object ).T @@ -184,6 +186,7 @@ # learning when the data is not readily available from the start, or when the # data does not fit into memory. import numpy as np + from sklearn.decomposition import MiniBatchNMF rng = np.random.RandomState(0) @@ -202,7 +205,7 @@ X_reconstructed = W @ H print( - f"relative reconstruction error: ", + "relative reconstruction error: ", f"{np.sum((X - X_reconstructed) ** 2) / np.sum(X**2):.5f}", ) @@ -215,10 +218,11 @@ # previous clustering: a cluster is split into two new clusters repeatedly # until the target number of clusters is reached, giving a hierarchical # structure to the clustering. -from sklearn.datasets import make_blobs -from sklearn.cluster import KMeans, BisectingKMeans import matplotlib.pyplot as plt +from sklearn.cluster import BisectingKMeans, KMeans +from sklearn.datasets import make_blobs + X, _ = make_blobs(n_samples=1000, centers=2, random_state=0) km = KMeans(n_clusters=5, random_state=0, n_init="auto").fit(X) diff --git a/examples/release_highlights/plot_release_highlights_1_2_0.py b/examples/release_highlights/plot_release_highlights_1_2_0.py index e01372650b016..ee5316229dd9a 100644 --- a/examples/release_highlights/plot_release_highlights_1_2_0.py +++ b/examples/release_highlights/plot_release_highlights_1_2_0.py @@ -1,4 +1,4 @@ -# ruff: noqa +# ruff: noqa: CPY001, E501 """ ======================================= Release Highlights for scikit-learn 1.2 @@ -31,9 +31,10 @@ # (some examples) `__. import numpy as np -from sklearn.datasets import load_iris -from sklearn.preprocessing import StandardScaler, KBinsDiscretizer + from sklearn.compose import ColumnTransformer +from sklearn.datasets import load_iris +from sklearn.preprocessing import KBinsDiscretizer, StandardScaler X, y = load_iris(as_frame=True, return_X_y=True) sepal_cols = ["sepal length (cm)", "sepal width (cm)"] @@ -78,6 +79,7 @@ # :class:`~metrics.PredictionErrorDisplay` provides a way to analyze regression # models in a qualitative manner. import matplotlib.pyplot as plt + from sklearn.metrics import PredictionErrorDisplay fig, axs = plt.subplots(nrows=1, ncols=2, figsize=(12, 5)) @@ -109,8 +111,8 @@ X = X.select_dtypes(["number", "category"]).drop(columns=["body"]) # %% -from sklearn.preprocessing import OrdinalEncoder from sklearn.pipeline import make_pipeline +from sklearn.preprocessing import OrdinalEncoder categorical_features = ["pclass", "sex", "embarked"] model = make_pipeline( diff --git a/examples/release_highlights/plot_release_highlights_1_3_0.py b/examples/release_highlights/plot_release_highlights_1_3_0.py index ebb109e524f1d..f7faad08c9b1e 100644 --- a/examples/release_highlights/plot_release_highlights_1_3_0.py +++ b/examples/release_highlights/plot_release_highlights_1_3_0.py @@ -1,4 +1,4 @@ -# ruff: noqa +# ruff: noqa: CPY001 """ ======================================= Release Highlights for scikit-learn 1.3 @@ -50,6 +50,7 @@ # making it more robust to parameter selection than :class:`cluster.DBSCAN`. # More details in the :ref:`User Guide `. import numpy as np + from sklearn.cluster import HDBSCAN from sklearn.datasets import load_digits from sklearn.metrics import v_measure_score @@ -71,6 +72,7 @@ # estimate of the average target values for observations belonging to that category. # More details in the :ref:`User Guide `. import numpy as np + from sklearn.preprocessing import TargetEncoder X = np.array([["cat"] * 30 + ["dog"] * 20 + ["snake"] * 38], dtype=object).T @@ -92,6 +94,7 @@ # :ref:`sphx_glr_auto_examples_ensemble_plot_hgbt_regression.py` for a usecase # example of this feature in :class:`~ensemble.HistGradientBoostingRegressor`. import numpy as np + from sklearn.tree import DecisionTreeClassifier X = np.array([0, 1, 6, np.nan]).reshape(-1, 1) @@ -128,9 +131,10 @@ # Gamma deviance loss function via `loss="gamma"`. This loss function is useful for # modeling strictly positive targets with a right-skewed distribution. import numpy as np -from sklearn.model_selection import cross_val_score + from sklearn.datasets import make_low_rank_matrix from sklearn.ensemble import HistGradientBoostingRegressor +from sklearn.model_selection import cross_val_score n_samples, n_features = 500, 10 rng = np.random.RandomState(0) @@ -148,9 +152,10 @@ # into a single output for each feature. The parameters to enable the gathering of # infrequent categories are `min_frequency` and `max_categories`. # See the :ref:`User Guide ` for more details. -from sklearn.preprocessing import OrdinalEncoder import numpy as np +from sklearn.preprocessing import OrdinalEncoder + X = np.array( [["dog"] * 5 + ["cat"] * 20 + ["rabbit"] * 10 + ["snake"] * 3], dtype=object ).T diff --git a/examples/release_highlights/plot_release_highlights_1_4_0.py b/examples/release_highlights/plot_release_highlights_1_4_0.py index af07e60f34b56..5ce256b065e48 100644 --- a/examples/release_highlights/plot_release_highlights_1_4_0.py +++ b/examples/release_highlights/plot_release_highlights_1_4_0.py @@ -1,4 +1,4 @@ -# ruff: noqa +# ruff: noqa: CPY001 """ ======================================= Release Highlights for scikit-learn 1.4 @@ -41,8 +41,8 @@ # treats the columns with categorical dtypes as categorical features in the # algorithm: from sklearn.ensemble import HistGradientBoostingClassifier -from sklearn.model_selection import train_test_split from sklearn.metrics import roc_auc_score +from sklearn.model_selection import train_test_split X_train, X_test, y_train, y_test = train_test_split(X_adult, y_adult, random_state=0) hist = HistGradientBoostingClassifier(categorical_features="from_dtype") @@ -56,9 +56,9 @@ # ----------------------------- # scikit-learn's transformers now support polars output with the `set_output` API. import polars as pl -from sklearn.preprocessing import StandardScaler -from sklearn.preprocessing import OneHotEncoder + from sklearn.compose import ColumnTransformer +from sklearn.preprocessing import OneHotEncoder, StandardScaler df = pl.DataFrame( {"height": [120, 140, 150, 110, 100], "pet": ["dog", "cat", "dog", "cat", "cat"]} @@ -87,6 +87,7 @@ # missing values going to the left and right nodes. More details in the # :ref:`User Guide `. import numpy as np + from sklearn.ensemble import RandomForestClassifier X = np.array([0, 1, 6, np.nan]).reshape(-1, 1) @@ -103,8 +104,9 @@ # trees, random forests, extra-trees, and exact gradient boosting. Here, we show this # feature for random forest on a regression problem. import matplotlib.pyplot as plt -from sklearn.inspection import PartialDependenceDisplay + from sklearn.ensemble import RandomForestRegressor +from sklearn.inspection import PartialDependenceDisplay n_samples = 500 rng = np.random.RandomState(0) @@ -161,10 +163,10 @@ # `. For instance, this is how you can do a nested # cross-validation with sample weights and :class:`~model_selection.GroupKFold`: import sklearn -from sklearn.metrics import get_scorer from sklearn.datasets import make_regression from sklearn.linear_model import Lasso -from sklearn.model_selection import GridSearchCV, cross_validate, GroupKFold +from sklearn.metrics import get_scorer +from sklearn.model_selection import GridSearchCV, GroupKFold, cross_validate # For now by default metadata routing is disabled, and need to be explicitly # enabled. @@ -216,10 +218,12 @@ # materializing large sparse matrices when performing the # eigenvalue decomposition of the data set covariance matrix. # -from sklearn.decomposition import PCA -import scipy.sparse as sp from time import time +import scipy.sparse as sp + +from sklearn.decomposition import PCA + X_sparse = sp.random(m=1000, n=1000, random_state=0) X_dense = X_sparse.toarray() diff --git a/examples/release_highlights/plot_release_highlights_1_5_0.py b/examples/release_highlights/plot_release_highlights_1_5_0.py index 7a4e9f61597fd..ef389a5db290b 100644 --- a/examples/release_highlights/plot_release_highlights_1_5_0.py +++ b/examples/release_highlights/plot_release_highlights_1_5_0.py @@ -1,4 +1,4 @@ -# ruff: noqa +# ruff: noqa: CPY001 """ ======================================= Release Highlights for scikit-learn 1.5 @@ -30,10 +30,9 @@ # problem. :class:`~model_selection.FixedThresholdClassifier` allows wrapping any # binary classifier and setting a custom decision threshold. from sklearn.datasets import make_classification -from sklearn.model_selection import train_test_split from sklearn.linear_model import LogisticRegression from sklearn.metrics import ConfusionMatrixDisplay - +from sklearn.model_selection import train_test_split X, y = make_classification(n_samples=10_000, weights=[0.9, 0.1], random_state=0) X_train, X_test, y_train, y_test = train_test_split(X, y, random_state=0) @@ -90,8 +89,8 @@ def custom_score(y_observed, y_pred): # Tuning the threshold to optimize this custom metric gives a smaller threshold # that allows more samples to be classified as the positive class. As a result, # the average gain per prediction improves. -from sklearn.model_selection import TunedThresholdClassifierCV from sklearn.metrics import make_scorer +from sklearn.model_selection import TunedThresholdClassifierCV custom_scorer = make_scorer( custom_score, response_method="predict", greater_is_better=True @@ -161,8 +160,9 @@ def custom_score(y_observed, y_pred): # The transformers of a :class:`~compose.ColumnTransformer` can now be directly # accessed using indexing by name. import numpy as np + from sklearn.compose import ColumnTransformer -from sklearn.preprocessing import StandardScaler, OneHotEncoder +from sklearn.preprocessing import OneHotEncoder, StandardScaler X = np.array([[0, 1, 2], [3, 4, 5]]) column_transformer = ColumnTransformer( diff --git a/examples/release_highlights/plot_release_highlights_1_6_0.py b/examples/release_highlights/plot_release_highlights_1_6_0.py index 7e842659f018a..503af8c076fbb 100644 --- a/examples/release_highlights/plot_release_highlights_1_6_0.py +++ b/examples/release_highlights/plot_release_highlights_1_6_0.py @@ -1,4 +1,4 @@ -# ruff: noqa +# ruff: noqa: CPY001, E501 """ ======================================= Release Highlights for scikit-learn 1.6 @@ -33,6 +33,7 @@ # or to pass a pre-fitted model to some of the meta-estimators. Here's a short example: import time + from sklearn.datasets import make_classification from sklearn.frozen import FrozenEstimator from sklearn.linear_model import SGDClassifier @@ -122,6 +123,7 @@ # :class:`ensemble.ExtraTreesRegressor` now support missing values. More details in the # :ref:`User Guide `. import numpy as np + from sklearn.ensemble import ExtraTreesClassifier X = np.array([0, 1, 6, np.nan]).reshape(-1, 1) diff --git a/pyproject.toml b/pyproject.toml index 4178a9212e2a4..df5e7324833c4 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -137,7 +137,7 @@ preview = true # This enables us to use the explicit preview rules that we want only explicit-preview-rules = true # all rules can be found here: https://docs.astral.sh/ruff/rules/ -extend-select = ["E501", "W", "I", "CPY001", "RUF"] +extend-select = ["E501", "W", "I", "CPY001", "PGH", "RUF"] ignore=[ # do not assign a lambda expression, use a def "E731", diff --git a/sklearn/__check_build/__init__.py b/sklearn/__check_build/__init__.py index e50f5b7ec512f..6e06d16bd4d50 100644 --- a/sklearn/__check_build/__init__.py +++ b/sklearn/__check_build/__init__.py @@ -49,6 +49,6 @@ def raise_build_error(e): try: - from ._check_build import check_build # noqa + from ._check_build import check_build # noqa: F401 except ImportError as e: raise_build_error(e) diff --git a/sklearn/_loss/tests/test_loss.py b/sklearn/_loss/tests/test_loss.py index 810ca4bde6869..4fea325729023 100644 --- a/sklearn/_loss/tests/test_loss.py +++ b/sklearn/_loss/tests/test_loss.py @@ -175,7 +175,7 @@ def test_loss_boundary(loss): ] # y_pred and y_true do not always have the same domain (valid value range). # Hence, we define extra sets of parameters for each of them. -Y_TRUE_PARAMS = [ # type: ignore +Y_TRUE_PARAMS = [ # type: ignore[var-annotated] # (loss, [y success], [y fail]) (HalfPoissonLoss(), [0], []), (HuberLoss(), [0], []), diff --git a/sklearn/cluster/_agglomerative.py b/sklearn/cluster/_agglomerative.py index 438026a57bae5..a2365da3669c4 100644 --- a/sklearn/cluster/_agglomerative.py +++ b/sklearn/cluster/_agglomerative.py @@ -36,7 +36,7 @@ from ..utils.validation import check_memory, validate_data # mypy error: Module 'sklearn.cluster' has no attribute '_hierarchical_fast' -from . import _hierarchical_fast as _hierarchical # type: ignore +from . import _hierarchical_fast as _hierarchical from ._feature_agglomeration import AgglomerationTransform ############################################################################### diff --git a/sklearn/cluster/tests/test_spectral.py b/sklearn/cluster/tests/test_spectral.py index 68860e789666d..3b02acefc5a50 100644 --- a/sklearn/cluster/tests/test_spectral.py +++ b/sklearn/cluster/tests/test_spectral.py @@ -19,7 +19,7 @@ from sklearn.utils.fixes import COO_CONTAINERS, CSR_CONTAINERS try: - from pyamg import smoothed_aggregation_solver # noqa + from pyamg import smoothed_aggregation_solver # noqa: F401 amg_loaded = True except ImportError: diff --git a/sklearn/conftest.py b/sklearn/conftest.py index 6af3a2a51c0ce..7ae771a9c372d 100644 --- a/sklearn/conftest.py +++ b/sklearn/conftest.py @@ -59,7 +59,7 @@ def raccoon_face_or_skip(): raise SkipTest("test is enabled when SKLEARN_SKIP_NETWORK_TESTS=0") try: - import pooch # noqa + import pooch # noqa: F401 except ImportError: raise SkipTest("test requires pooch to be installed") @@ -192,7 +192,7 @@ def pytest_collection_modifyitems(config, items): skip_doctests = False try: - import matplotlib # noqa + import matplotlib # noqa: F401 except ImportError: skip_doctests = True reason = "matplotlib is required to run the doctests" @@ -237,7 +237,7 @@ def pytest_collection_modifyitems(config, items): if item.name != "sklearn._config.config_context": item.add_marker(skip_marker) try: - import PIL # noqa + import PIL # noqa: F401 pillow_installed = True except ImportError: diff --git a/sklearn/covariance/_graph_lasso.py b/sklearn/covariance/_graph_lasso.py index 73fa4f1fd6e66..af701e096fd5b 100644 --- a/sklearn/covariance/_graph_lasso.py +++ b/sklearn/covariance/_graph_lasso.py @@ -18,7 +18,7 @@ from ..exceptions import ConvergenceWarning # mypy error: Module 'sklearn.linear_model' has no attribute '_cd_fast' -from ..linear_model import _cd_fast as cd_fast # type: ignore +from ..linear_model import _cd_fast as cd_fast # type: ignore[attr-defined] from ..linear_model import lars_path_gram from ..model_selection import check_cv, cross_val_score from ..utils import Bunch diff --git a/sklearn/datasets/tests/test_base.py b/sklearn/datasets/tests/test_base.py index 0bf63a7c3483d..4396b7921f3ee 100644 --- a/sklearn/datasets/tests/test_base.py +++ b/sklearn/datasets/tests/test_base.py @@ -367,12 +367,12 @@ def test_load_boston_error(): """Check that we raise the ethical warning when trying to import `load_boston`.""" msg = "The Boston housing prices dataset has an ethical problem" with pytest.raises(ImportError, match=msg): - from sklearn.datasets import load_boston # noqa + from sklearn.datasets import load_boston # noqa: F401 # other non-existing function should raise the usual import error msg = "cannot import name 'non_existing_function' from 'sklearn.datasets'" with pytest.raises(ImportError, match=msg): - from sklearn.datasets import non_existing_function # noqa + from sklearn.datasets import non_existing_function # noqa: F401 def test_fetch_remote_raise_warnings_with_invalid_url(monkeypatch): diff --git a/sklearn/datasets/tests/test_common.py b/sklearn/datasets/tests/test_common.py index 5bed37837718b..33219deab6915 100644 --- a/sklearn/datasets/tests/test_common.py +++ b/sklearn/datasets/tests/test_common.py @@ -11,7 +11,7 @@ def is_pillow_installed(): try: - import PIL # noqa + import PIL # noqa: F401 return True except ImportError: @@ -40,7 +40,7 @@ def is_pillow_installed(): def check_pandas_dependency_message(fetch_func): try: - import pandas # noqa + import pandas # noqa: F401 pytest.skip("This test requires pandas to not be installed") except ImportError: diff --git a/sklearn/ensemble/tests/test_forest.py b/sklearn/ensemble/tests/test_forest.py index 65906dec99316..5dec5c7ab90b2 100644 --- a/sklearn/ensemble/tests/test_forest.py +++ b/sklearn/ensemble/tests/test_forest.py @@ -1479,7 +1479,7 @@ def test_poisson_y_positive_check(): # mypy error: Variable "DEFAULT_JOBLIB_BACKEND" is not valid type -class MyBackend(DEFAULT_JOBLIB_BACKEND): # type: ignore +class MyBackend(DEFAULT_JOBLIB_BACKEND): # type: ignore[valid-type,misc] def __init__(self, *args, **kwargs): self.count = 0 super().__init__(*args, **kwargs) diff --git a/sklearn/impute/__init__.py b/sklearn/impute/__init__.py index 363d24d6a7f3e..aaa81d73c34a1 100644 --- a/sklearn/impute/__init__.py +++ b/sklearn/impute/__init__.py @@ -11,7 +11,7 @@ if typing.TYPE_CHECKING: # Avoid errors in type checkers (e.g. mypy) for experimental estimators. # TODO: remove this check once the estimator is no longer experimental. - from ._iterative import IterativeImputer # noqa + from ._iterative import IterativeImputer # noqa: F401 __all__ = ["KNNImputer", "MissingIndicator", "SimpleImputer"] diff --git a/sklearn/impute/tests/test_common.py b/sklearn/impute/tests/test_common.py index 4d41b44fb0252..afebc96ac035c 100644 --- a/sklearn/impute/tests/test_common.py +++ b/sklearn/impute/tests/test_common.py @@ -1,7 +1,7 @@ import numpy as np import pytest -from sklearn.experimental import enable_iterative_imputer # noqa +from sklearn.experimental import enable_iterative_imputer # noqa: F401 from sklearn.impute import IterativeImputer, KNNImputer, SimpleImputer from sklearn.utils._testing import ( assert_allclose, diff --git a/sklearn/impute/tests/test_impute.py b/sklearn/impute/tests/test_impute.py index e045c125823f9..16501b0550364 100644 --- a/sklearn/impute/tests/test_impute.py +++ b/sklearn/impute/tests/test_impute.py @@ -14,7 +14,7 @@ from sklearn.exceptions import ConvergenceWarning # make IterativeImputer available -from sklearn.experimental import enable_iterative_imputer # noqa +from sklearn.experimental import enable_iterative_imputer # noqa: F401 from sklearn.impute import IterativeImputer, KNNImputer, MissingIndicator, SimpleImputer from sklearn.impute._base import _most_frequent from sklearn.linear_model import ARDRegression, BayesianRidge, RidgeCV diff --git a/sklearn/inspection/_partial_dependence.py b/sklearn/inspection/_partial_dependence.py index 82bcc426c489f..4d75daa8b95ae 100644 --- a/sklearn/inspection/_partial_dependence.py +++ b/sklearn/inspection/_partial_dependence.py @@ -19,7 +19,7 @@ from ..tree import DecisionTreeRegressor from ..utils import Bunch, _safe_indexing, check_array from ..utils._indexing import _determine_key_type, _get_column_indices, _safe_assign -from ..utils._optional_dependencies import check_matplotlib_support # noqa +from ..utils._optional_dependencies import check_matplotlib_support # noqa: F401 from ..utils._param_validation import ( HasMethods, Integral, diff --git a/sklearn/linear_model/_coordinate_descent.py b/sklearn/linear_model/_coordinate_descent.py index 4c12a73ead300..c0c14cbb12f32 100644 --- a/sklearn/linear_model/_coordinate_descent.py +++ b/sklearn/linear_model/_coordinate_descent.py @@ -41,7 +41,7 @@ ) # mypy error: Module 'sklearn.linear_model' has no attribute '_cd_fast' -from . import _cd_fast as cd_fast # type: ignore +from . import _cd_fast as cd_fast # type: ignore[attr-defined] from ._base import LinearModel, _pre_fit, _preprocess_data diff --git a/sklearn/linear_model/_least_angle.py b/sklearn/linear_model/_least_angle.py index 2945e00a1adda..abbd3837bcf43 100644 --- a/sklearn/linear_model/_least_angle.py +++ b/sklearn/linear_model/_least_angle.py @@ -20,7 +20,7 @@ from ..model_selection import check_cv # mypy error: Module 'sklearn.utils' has no attribute 'arrayfuncs' -from ..utils import ( # type: ignore +from ..utils import ( Bunch, arrayfuncs, as_float_array, diff --git a/sklearn/manifold/_t_sne.py b/sklearn/manifold/_t_sne.py index 94a845f756196..51882a5b38abd 100644 --- a/sklearn/manifold/_t_sne.py +++ b/sklearn/manifold/_t_sne.py @@ -30,7 +30,7 @@ # mypy error: Module 'sklearn.manifold' has no attribute '_utils' # mypy error: Module 'sklearn.manifold' has no attribute '_barnes_hut_tsne' -from . import _barnes_hut_tsne, _utils # type: ignore +from . import _barnes_hut_tsne, _utils # type: ignore[attr-defined] MACHINE_EPSILON = np.finfo(np.double).eps diff --git a/sklearn/manifold/tests/test_spectral_embedding.py b/sklearn/manifold/tests/test_spectral_embedding.py index 7826fe64eede2..4c4115734a404 100644 --- a/sklearn/manifold/tests/test_spectral_embedding.py +++ b/sklearn/manifold/tests/test_spectral_embedding.py @@ -29,7 +29,7 @@ from sklearn.utils.fixes import laplacian as csgraph_laplacian try: - from pyamg import smoothed_aggregation_solver # noqa + from pyamg import smoothed_aggregation_solver # noqa: F401 pyamg_available = True except ImportError: diff --git a/sklearn/manifold/tests/test_t_sne.py b/sklearn/manifold/tests/test_t_sne.py index d54c845108ae6..4f32b889d5b1f 100644 --- a/sklearn/manifold/tests/test_t_sne.py +++ b/sklearn/manifold/tests/test_t_sne.py @@ -13,7 +13,7 @@ from sklearn.datasets import make_blobs # mypy error: Module 'sklearn.manifold' has no attribute '_barnes_hut_tsne' -from sklearn.manifold import ( # type: ignore +from sklearn.manifold import ( # type: ignore[attr-defined] TSNE, _barnes_hut_tsne, ) diff --git a/sklearn/metrics/tests/test_common.py b/sklearn/metrics/tests/test_common.py index b31b186054e11..1000c988abca8 100644 --- a/sklearn/metrics/tests/test_common.py +++ b/sklearn/metrics/tests/test_common.py @@ -1012,7 +1012,7 @@ def test_regression_thresholded_inf_nan_input(metric, y_true, y_score): [ ([np.nan, 1, 2], [1, 2, 3]), ([np.inf, 1, 2], [1, 2, 3]), - ], # type: ignore + ], ) def test_classification_inf_nan_input(metric, y_true, y_score): """check that classification metrics raise a message mentioning the diff --git a/sklearn/model_selection/__init__.py b/sklearn/model_selection/__init__.py index bed2a50f33d0d..8eb0ef772c552 100644 --- a/sklearn/model_selection/__init__.py +++ b/sklearn/model_selection/__init__.py @@ -44,7 +44,7 @@ if typing.TYPE_CHECKING: # Avoid errors in type checkers (e.g. mypy) for experimental estimators. # TODO: remove this check once the estimator is no longer experimental. - from ._search_successive_halving import ( # noqa + from ._search_successive_halving import ( # noqa: F401 HalvingGridSearchCV, HalvingRandomSearchCV, ) diff --git a/sklearn/model_selection/tests/test_search.py b/sklearn/model_selection/tests/test_search.py index 7459d71ea2bd1..393429b29ff92 100644 --- a/sklearn/model_selection/tests/test_search.py +++ b/sklearn/model_selection/tests/test_search.py @@ -27,7 +27,7 @@ from sklearn.dummy import DummyClassifier from sklearn.ensemble import HistGradientBoostingClassifier from sklearn.exceptions import FitFailedWarning -from sklearn.experimental import enable_halving_search_cv # noqa +from sklearn.experimental import enable_halving_search_cv # noqa: F401 from sklearn.feature_extraction.text import TfidfVectorizer from sklearn.impute import SimpleImputer from sklearn.linear_model import ( @@ -2891,7 +2891,7 @@ def test_array_api_search_cv_classifier(SearchCV, array_namespace, device, dtype # If we construct this directly via `MaskedArray`, the list of tuples # gets auto-converted to a 2D array. -ma_with_tuples = np.ma.MaskedArray(np.empty(2), mask=True, dtype=object) +ma_with_tuples = np.ma.MaskedArray(np.empty(2), mask=True, dtype=object) # type: ignore[var-annotated] ma_with_tuples[0] = (1, 2) ma_with_tuples[1] = (3, 4) diff --git a/sklearn/model_selection/tests/test_split.py b/sklearn/model_selection/tests/test_split.py index 39698a8e17b80..0f31055d9b7f9 100644 --- a/sklearn/model_selection/tests/test_split.py +++ b/sklearn/model_selection/tests/test_split.py @@ -85,7 +85,7 @@ ] GROUP_SPLITTER_NAMES = set(splitter.__class__.__name__ for splitter in GROUP_SPLITTERS) -ALL_SPLITTERS = NO_GROUP_SPLITTERS + GROUP_SPLITTERS # type: ignore +ALL_SPLITTERS = NO_GROUP_SPLITTERS + GROUP_SPLITTERS # type: ignore[list-item] SPLITTERS_REQUIRING_TARGET = [ StratifiedKFold(), diff --git a/sklearn/model_selection/tests/test_successive_halving.py b/sklearn/model_selection/tests/test_successive_halving.py index a792f18e0b42f..bdfab45b4f7ca 100644 --- a/sklearn/model_selection/tests/test_successive_halving.py +++ b/sklearn/model_selection/tests/test_successive_halving.py @@ -6,7 +6,7 @@ from sklearn.datasets import make_classification from sklearn.dummy import DummyClassifier -from sklearn.experimental import enable_halving_search_cv # noqa +from sklearn.experimental import enable_halving_search_cv # noqa: F401 from sklearn.model_selection import ( GroupKFold, GroupShuffleSplit, @@ -39,10 +39,7 @@ class FastClassifier(DummyClassifier): # update the constraints such that we accept all parameters from a to z _parameter_constraints: dict = { **DummyClassifier._parameter_constraints, - **{ - chr(key): "no_validation" # type: ignore - for key in range(ord("a"), ord("z") + 1) - }, + **{chr(key): "no_validation" for key in range(ord("a"), ord("z") + 1)}, } def __init__( diff --git a/sklearn/neighbors/tests/test_neighbors.py b/sklearn/neighbors/tests/test_neighbors.py index 6f42fdea4819e..ae589b30dd743 100644 --- a/sklearn/neighbors/tests/test_neighbors.py +++ b/sklearn/neighbors/tests/test_neighbors.py @@ -83,7 +83,7 @@ ALGORITHMS = ("ball_tree", "brute", "kd_tree", "auto") COMMON_VALID_METRICS = sorted( set.intersection(*map(set, neighbors.VALID_METRICS.values())) -) # type: ignore +) P = (1, 2, 3, 4, np.inf) @@ -163,7 +163,7 @@ def _weight_func(dist): ], ) @pytest.mark.parametrize("query_is_train", [False, True]) -@pytest.mark.parametrize("metric", COMMON_VALID_METRICS + DISTANCE_METRIC_OBJS) # type: ignore +@pytest.mark.parametrize("metric", COMMON_VALID_METRICS + DISTANCE_METRIC_OBJS) def test_unsupervised_kneighbors( global_dtype, n_samples, @@ -248,7 +248,7 @@ def test_unsupervised_kneighbors( (1000, 5, 100), ], ) -@pytest.mark.parametrize("metric", COMMON_VALID_METRICS + DISTANCE_METRIC_OBJS) # type: ignore +@pytest.mark.parametrize("metric", COMMON_VALID_METRICS + DISTANCE_METRIC_OBJS) @pytest.mark.parametrize("n_neighbors, radius", [(1, 100), (50, 500), (100, 1000)]) @pytest.mark.parametrize( "NeighborsMixinSubclass", diff --git a/sklearn/svm/_base.py b/sklearn/svm/_base.py index 2401f9f1a8901..db295e4e877b5 100644 --- a/sklearn/svm/_base.py +++ b/sklearn/svm/_base.py @@ -24,12 +24,12 @@ check_is_fitted, validate_data, ) -from . import _liblinear as liblinear # type: ignore +from . import _liblinear as liblinear # type: ignore[attr-defined] # mypy error: error: Module 'sklearn.svm' has no attribute '_libsvm' # (and same for other imports) -from . import _libsvm as libsvm # type: ignore -from . import _libsvm_sparse as libsvm_sparse # type: ignore +from . import _libsvm as libsvm # type: ignore[attr-defined] +from . import _libsvm_sparse as libsvm_sparse # type: ignore[attr-defined] LIBSVM_IMPL = ["c_svc", "nu_svc", "one_class", "epsilon_svr", "nu_svr"] diff --git a/sklearn/svm/tests/test_svm.py b/sklearn/svm/tests/test_svm.py index 4c90238993a76..62396451e736d 100644 --- a/sklearn/svm/tests/test_svm.py +++ b/sklearn/svm/tests/test_svm.py @@ -25,7 +25,7 @@ from sklearn.multiclass import OneVsRestClassifier # mypy error: Module 'sklearn.svm' has no attribute '_libsvm' -from sklearn.svm import ( # type: ignore +from sklearn.svm import ( # type: ignore[attr-defined] SVR, LinearSVC, LinearSVR, diff --git a/sklearn/tests/test_common.py b/sklearn/tests/test_common.py index 227e2d7663500..de5003687ca95 100644 --- a/sklearn/tests/test_common.py +++ b/sklearn/tests/test_common.py @@ -23,8 +23,8 @@ # make it possible to discover experimental estimators when calling `all_estimators` from sklearn.experimental import ( - enable_halving_search_cv, # noqa - enable_iterative_imputer, # noqa + enable_halving_search_cv, # noqa: F401 + enable_iterative_imputer, # noqa: F401 ) from sklearn.linear_model import LogisticRegression from sklearn.pipeline import FeatureUnion, make_pipeline diff --git a/sklearn/tests/test_docstring_parameters.py b/sklearn/tests/test_docstring_parameters.py index b131a953f9a30..6ec42b9b13fd5 100644 --- a/sklearn/tests/test_docstring_parameters.py +++ b/sklearn/tests/test_docstring_parameters.py @@ -16,8 +16,8 @@ # make it possible to discover experimental estimators when calling `all_estimators` from sklearn.experimental import ( - enable_halving_search_cv, # noqa - enable_iterative_imputer, # noqa + enable_halving_search_cv, # noqa: F401 + enable_iterative_imputer, # noqa: F401 ) from sklearn.linear_model import LogisticRegression from sklearn.preprocessing import FunctionTransformer diff --git a/sklearn/tests/test_docstrings.py b/sklearn/tests/test_docstrings.py index 889c33c2a832d..ea625ac076a01 100644 --- a/sklearn/tests/test_docstrings.py +++ b/sklearn/tests/test_docstrings.py @@ -6,8 +6,8 @@ # make it possible to discover experimental estimators when calling `all_estimators` from sklearn.experimental import ( - enable_halving_search_cv, # noqa - enable_iterative_imputer, # noqa + enable_halving_search_cv, # noqa: F401 + enable_iterative_imputer, # noqa: F401 ) from sklearn.utils.discovery import all_displays, all_estimators, all_functions diff --git a/sklearn/tests/test_init.py b/sklearn/tests/test_init.py index 331b9b7429cbb..4df9c279030cb 100644 --- a/sklearn/tests/test_init.py +++ b/sklearn/tests/test_init.py @@ -6,7 +6,7 @@ try: - from sklearn import * # noqa + from sklearn import * # noqa: F403 _top_import_error = None except Exception as e: diff --git a/sklearn/tests/test_metadata_routing.py b/sklearn/tests/test_metadata_routing.py index 8f04874bf27ad..46391e9d82bfd 100644 --- a/sklearn/tests/test_metadata_routing.py +++ b/sklearn/tests/test_metadata_routing.py @@ -215,7 +215,7 @@ class OddEstimator(BaseEstimator): __metadata_request__fit = { # set a different default request "sample_weight": True - } # type: ignore + } # type: ignore[var-annotated] odd_request = get_routing_for_object(OddEstimator()) assert odd_request.fit.requests == {"sample_weight": True} diff --git a/sklearn/tests/test_metaestimators_metadata_routing.py b/sklearn/tests/test_metaestimators_metadata_routing.py index ae2a186a3c5c2..f4ed228ec2f9d 100644 --- a/sklearn/tests/test_metaestimators_metadata_routing.py +++ b/sklearn/tests/test_metaestimators_metadata_routing.py @@ -17,8 +17,8 @@ ) from sklearn.exceptions import UnsetMetadataPassedError from sklearn.experimental import ( - enable_halving_search_cv, # noqa - enable_iterative_imputer, # noqa + enable_halving_search_cv, # noqa: F401 + enable_iterative_imputer, # noqa: F401 ) from sklearn.feature_selection import ( RFE, diff --git a/sklearn/utils/__init__.py b/sklearn/utils/__init__.py index deeae3bf6acb6..941126c6b083f 100644 --- a/sklearn/utils/__init__.py +++ b/sklearn/utils/__init__.py @@ -15,7 +15,7 @@ # _safe_indexing was included in our public API documentation despite the leading # `_` in its name. from ._indexing import ( - _safe_indexing, # noqa + _safe_indexing, # noqa: F401 resample, shuffle, ) diff --git a/sklearn/utils/_mocking.py b/sklearn/utils/_mocking.py index 664284fe7fe4e..87fb4106f3b59 100644 --- a/sklearn/utils/_mocking.py +++ b/sklearn/utils/_mocking.py @@ -346,7 +346,7 @@ def __sklearn_tags__(self): # Deactivate key validation for CheckingClassifier because we want to be able to # call fit with arbitrary fit_params and record them. Without this change, we # would get an error because those arbitrary params are not expected. -CheckingClassifier.set_fit_request = RequestMethod( # type: ignore +CheckingClassifier.set_fit_request = RequestMethod( # type: ignore[assignment,method-assign] name="fit", keys=[], validate_keys=False ) diff --git a/sklearn/utils/_optional_dependencies.py b/sklearn/utils/_optional_dependencies.py index 3bc8277fddab5..5f0041285090a 100644 --- a/sklearn/utils/_optional_dependencies.py +++ b/sklearn/utils/_optional_dependencies.py @@ -14,7 +14,7 @@ def check_matplotlib_support(caller_name): The name of the caller that requires matplotlib. """ try: - import matplotlib # noqa + import matplotlib # noqa: F401 except ImportError as e: raise ImportError( "{} requires matplotlib. You can install matplotlib with " diff --git a/sklearn/utils/_pprint.py b/sklearn/utils/_pprint.py index 98330e8f51abb..527843fe42f0b 100644 --- a/sklearn/utils/_pprint.py +++ b/sklearn/utils/_pprint.py @@ -347,7 +347,7 @@ def _pprint_key_val_tuple(self, object, stream, indent, allowance, context, leve # PrettyPrinter class to call methods of _EstimatorPrettyPrinter (see issue # 12906) # mypy error: "Type[PrettyPrinter]" has no attribute "_dispatch" - _dispatch = pprint.PrettyPrinter._dispatch.copy() # type: ignore + _dispatch = pprint.PrettyPrinter._dispatch.copy() # type: ignore[attr-defined] _dispatch[BaseEstimator.__repr__] = _pprint_estimator _dispatch[KeyValTuple.__repr__] = _pprint_key_val_tuple diff --git a/sklearn/utils/_test_common/instance_generator.py b/sklearn/utils/_test_common/instance_generator.py index ea995b8116339..221236f8bc998 100644 --- a/sklearn/utils/_test_common/instance_generator.py +++ b/sklearn/utils/_test_common/instance_generator.py @@ -66,7 +66,7 @@ VotingRegressor, ) from sklearn.exceptions import SkipTestWarning -from sklearn.experimental import enable_halving_search_cv # noqa +from sklearn.experimental import enable_halving_search_cv # noqa: F401 from sklearn.feature_selection import ( RFE, RFECV, diff --git a/sklearn/utils/_testing.py b/sklearn/utils/_testing.py index c1cbeb6e56582..dff2f65dae7af 100644 --- a/sklearn/utils/_testing.py +++ b/sklearn/utils/_testing.py @@ -305,7 +305,7 @@ def set_random_state(estimator, random_state=0): def _is_numpydoc(): try: - import numpydoc # noqa + import numpydoc # noqa: F401 except (ImportError, AssertionError): return False else: @@ -1306,9 +1306,9 @@ def _array_api_for_tests(array_namespace, device): def _get_warnings_filters_info_list(): @dataclass class WarningInfo: - action: "warnings._ActionKind" - message: str = "" - category: type[Warning] = Warning + action: "warnings._ActionKind" # type: ignore[annotation-unchecked] + message: str = "" # type: ignore[annotation-unchecked] + category: type[Warning] = Warning # type: ignore[annotation-unchecked] def to_filterwarning_str(self): if self.category.__module__ == "builtins": diff --git a/sklearn/utils/estimator_checks.py b/sklearn/utils/estimator_checks.py index d1c8d5d3fb610..6347692842615 100644 --- a/sklearn/utils/estimator_checks.py +++ b/sklearn/utils/estimator_checks.py @@ -532,7 +532,7 @@ def estimator_checks_generator( if mark == "xfail": import pytest else: - pytest = None # type: ignore + pytest = None # type: ignore[assignment] name = type(estimator).__name__ # First check that the estimator is cloneable which is needed for the rest diff --git a/sklearn/utils/fixes.py b/sklearn/utils/fixes.py index bbe7e75d188de..816deb3d36072 100644 --- a/sklearn/utils/fixes.py +++ b/sklearn/utils/fixes.py @@ -43,7 +43,7 @@ # Remove when minimum scipy version is 1.11.0 try: - from scipy.sparse import sparray # noqa + from scipy.sparse import sparray # noqa: F401 SPARRAY_PRESENT = True except ImportError: @@ -182,7 +182,10 @@ def _sparse_nan_min_max(X, axis): if np_version >= parse_version("1.25.0"): from numpy.exceptions import ComplexWarning, VisibleDeprecationWarning else: - from numpy import ComplexWarning, VisibleDeprecationWarning # type: ignore # noqa + from numpy import ( # noqa: F401 + ComplexWarning, + VisibleDeprecationWarning, + ) # TODO: Adapt when Pandas > 2.2 is the minimum supported version @@ -318,17 +321,19 @@ def _smallest_admissible_index_dtype(arrays=(), maxval=None, check_contents=Fals # TODO: Remove when Scipy 1.12 is the minimum supported version if sp_version < parse_version("1.12"): - from ..externals._scipy.sparse.csgraph import laplacian # type: ignore + from ..externals._scipy.sparse.csgraph import laplacian else: - from scipy.sparse.csgraph import laplacian # type: ignore # noqa # pragma: no cover + from scipy.sparse.csgraph import ( + laplacian, # noqa: F401 # pragma: no cover + ) def _in_unstable_openblas_configuration(): """Return True if in an unstable configuration for OpenBLAS""" # Import libraries which might load OpenBLAS. - import numpy # noqa - import scipy # noqa + import numpy # noqa: F401 + import scipy # noqa: F401 modules_info = _get_threadpool_controller().info() diff --git a/sklearn/utils/metadata_routing.py b/sklearn/utils/metadata_routing.py index e9f86311a4a21..5068d1b9e3726 100644 --- a/sklearn/utils/metadata_routing.py +++ b/sklearn/utils/metadata_routing.py @@ -6,14 +6,18 @@ # Authors: The scikit-learn developers # SPDX-License-Identifier: BSD-3-Clause -from ._metadata_requests import WARN, UNUSED, UNCHANGED # noqa -from ._metadata_requests import get_routing_for_object # noqa -from ._metadata_requests import MetadataRouter # noqa -from ._metadata_requests import MetadataRequest # noqa -from ._metadata_requests import MethodMapping # noqa -from ._metadata_requests import process_routing # noqa -from ._metadata_requests import _MetadataRequester # noqa -from ._metadata_requests import _routing_enabled # noqa -from ._metadata_requests import _raise_for_params # noqa -from ._metadata_requests import _RoutingNotSupportedMixin # noqa -from ._metadata_requests import _raise_for_unsupported_routing # noqa +from ._metadata_requests import ( # noqa: F401 + UNCHANGED, + UNUSED, + WARN, + MetadataRequest, + MetadataRouter, + MethodMapping, + _MetadataRequester, + _raise_for_params, + _raise_for_unsupported_routing, + _routing_enabled, + _RoutingNotSupportedMixin, + get_routing_for_object, + process_routing, +) diff --git a/sklearn/utils/tests/test_deprecation.py b/sklearn/utils/tests/test_deprecation.py index 7368af3041a19..eec83182bf576 100644 --- a/sklearn/utils/tests/test_deprecation.py +++ b/sklearn/utils/tests/test_deprecation.py @@ -20,7 +20,7 @@ class MockClass2: def method(self): pass - @deprecated("n_features_ is deprecated") # type: ignore + @deprecated("n_features_ is deprecated") # type: ignore[prop-decorator] @property def n_features_(self): """Number of input features.""" diff --git a/sklearn/utils/tests/test_estimator_checks.py b/sklearn/utils/tests/test_estimator_checks.py index c010a007d7525..bd313d2397a0f 100644 --- a/sklearn/utils/tests/test_estimator_checks.py +++ b/sklearn/utils/tests/test_estimator_checks.py @@ -663,7 +663,7 @@ def test_check_dict_unchanged(): def test_check_sample_weights_pandas_series(): # check that sample_weights in fit accepts pandas.Series type try: - from pandas import Series # noqa + from pandas import Series # noqa: F401 msg = ( "Estimator NoSampleWeightPandasSeriesType raises error if " diff --git a/sklearn/utils/tests/test_tags.py b/sklearn/utils/tests/test_tags.py index f08dfad1a2fb1..38be48e85e38e 100644 --- a/sklearn/utils/tests/test_tags.py +++ b/sklearn/utils/tests/test_tags.py @@ -73,7 +73,7 @@ def _more_tags(self): def test_tag_test_passes_with_inheritance(): @dataclass class MyTags(Tags): - my_tag: bool = True + my_tag: bool = True # type: ignore[annotation-unchecked] class MyEstimator(BaseEstimator): def __sklearn_tags__(self): From 3d643769dfbbd33b90292fd5cec942f9197653eb Mon Sep 17 00:00:00 2001 From: Olivier Grisel Date: Mon, 28 Apr 2025 17:05:41 +0200 Subject: [PATCH 088/182] MNT Use BLAS_Order.ColMajor sklearn/utils/_cython_blas.pyx (#31263) --- azure-pipelines.yml | 1 + sklearn/conftest.py | 6 +++++ sklearn/utils/_cython_blas.pyx | 40 +++++++++++++++++++--------------- 3 files changed, 30 insertions(+), 17 deletions(-) diff --git a/azure-pipelines.yml b/azure-pipelines.yml index c4d856e42b6b8..804214f97808a 100644 --- a/azure-pipelines.yml +++ b/azure-pipelines.yml @@ -88,6 +88,7 @@ jobs: DISTRIB: 'conda-free-threaded' LOCK_FILE: './build_tools/azure/pylatest_free_threaded_linux-64_conda.lock' COVERAGE: 'false' + SKLEARN_FAULTHANDLER_TIMEOUT: '1800' # 30 * 60 seconds # Will run all the time regardless of linting outcome. - template: build_tools/azure/posix.yml diff --git a/sklearn/conftest.py b/sklearn/conftest.py index 7ae771a9c372d..8907616bde5b0 100644 --- a/sklearn/conftest.py +++ b/sklearn/conftest.py @@ -2,6 +2,7 @@ # SPDX-License-Identifier: BSD-3-Clause import builtins +import faulthandler import platform import sys from contextlib import suppress @@ -341,6 +342,11 @@ def pytest_configure(config): for line in get_pytest_filterwarning_lines(): config.addinivalue_line("filterwarnings", line) + faulthandler_timeout = int(environ.get("SKLEARN_FAULTHANDLER_TIMEOUT", "0")) + if faulthandler_timeout > 0: + faulthandler.enable() + faulthandler.dump_traceback_later(faulthandler_timeout, exit=True) + @pytest.fixture def hide_available_pandas(monkeypatch): diff --git a/sklearn/utils/_cython_blas.pyx b/sklearn/utils/_cython_blas.pyx index c242e59e1b9de..ac23d0c4000ff 100644 --- a/sklearn/utils/_cython_blas.pyx +++ b/sklearn/utils/_cython_blas.pyx @@ -126,8 +126,8 @@ cdef void _gemv(BLAS_Order order, BLAS_Trans ta, int m, int n, floating alpha, floating beta, floating *y, int incy) noexcept nogil: """y := alpha * op(A).x + beta * y""" cdef char ta_ = ta - if order == RowMajor: - ta_ = NoTrans if ta == Trans else Trans + if order == BLAS_Order.RowMajor: + ta_ = BLAS_Trans.NoTrans if ta == BLAS_Trans.Trans else BLAS_Trans.Trans if floating is float: sgemv(&ta_, &n, &m, &alpha, A, &lda, x, &incx, &beta, y, &incy) @@ -148,8 +148,10 @@ cpdef _gemv_memview(BLAS_Trans ta, floating alpha, const floating[:, :] A, cdef: int m = A.shape[0] int n = A.shape[1] - BLAS_Order order = ColMajor if A.strides[0] == A.itemsize else RowMajor - int lda = m if order == ColMajor else n + BLAS_Order order = ( + BLAS_Order.ColMajor if A.strides[0] == A.itemsize else BLAS_Order.RowMajor + ) + int lda = m if order == BLAS_Order.ColMajor else n _gemv(order, ta, m, n, alpha, &A[0, 0], lda, &x[0], 1, beta, &y[0], 1) @@ -158,7 +160,7 @@ cdef void _ger(BLAS_Order order, int m, int n, floating alpha, const floating *x, int incx, const floating *y, int incy, floating *A, int lda) noexcept nogil: """A := alpha * x.y.T + A""" - if order == RowMajor: + if order == BLAS_Order.RowMajor: if floating is float: sger(&n, &m, &alpha, y, &incy, x, &incx, A, &lda) else: @@ -175,8 +177,10 @@ cpdef _ger_memview(floating alpha, const floating[::1] x, cdef: int m = A.shape[0] int n = A.shape[1] - BLAS_Order order = ColMajor if A.strides[0] == A.itemsize else RowMajor - int lda = m if order == ColMajor else n + BLAS_Order order = ( + BLAS_Order.ColMajor if A.strides[0] == A.itemsize else BLAS_Order.RowMajor + ) + int lda = m if order == BLAS_Order.ColMajor else n _ger(order, m, n, alpha, &x[0], 1, &y[0], 1, &A[0, 0], lda) @@ -194,7 +198,7 @@ cdef void _gemm(BLAS_Order order, BLAS_Trans ta, BLAS_Trans tb, int m, int n, cdef: char ta_ = ta char tb_ = tb - if order == RowMajor: + if order == BLAS_Order.RowMajor: if floating is float: sgemm(&tb_, &ta_, &n, &m, &k, &alpha, B, &ldb, A, &lda, &beta, C, &ldc) @@ -214,19 +218,21 @@ cpdef _gemm_memview(BLAS_Trans ta, BLAS_Trans tb, floating alpha, const floating[:, :] A, const floating[:, :] B, floating beta, floating[:, :] C): cdef: - int m = A.shape[0] if ta == NoTrans else A.shape[1] - int n = B.shape[1] if tb == NoTrans else B.shape[0] - int k = A.shape[1] if ta == NoTrans else A.shape[0] + int m = A.shape[0] if ta == BLAS_Trans.NoTrans else A.shape[1] + int n = B.shape[1] if tb == BLAS_Trans.NoTrans else B.shape[0] + int k = A.shape[1] if ta == BLAS_Trans.NoTrans else A.shape[0] int lda, ldb, ldc - BLAS_Order order = ColMajor if A.strides[0] == A.itemsize else RowMajor + BLAS_Order order = ( + BLAS_Order.ColMajor if A.strides[0] == A.itemsize else BLAS_Order.RowMajor + ) - if order == RowMajor: - lda = k if ta == NoTrans else m - ldb = n if tb == NoTrans else k + if order == BLAS_Order.RowMajor: + lda = k if ta == BLAS_Trans.NoTrans else m + ldb = n if tb == BLAS_Trans.NoTrans else k ldc = n else: - lda = m if ta == NoTrans else k - ldb = k if tb == NoTrans else n + lda = m if ta == BLAS_Trans.NoTrans else k + ldb = k if tb == BLAS_Trans.NoTrans else n ldc = m _gemm(order, ta, tb, m, n, k, alpha, &A[0, 0], From 53a7f4f76311ae65d32de2ae98b4b379660be42b Mon Sep 17 00:00:00 2001 From: Lucy Liu Date: Tue, 29 Apr 2025 08:37:11 +1000 Subject: [PATCH 089/182] MNT Add `ignore_types` to `assert_docstring_consistency` (#30944) --- .../test_docstring_parameters_consistency.py | 19 +++++++- sklearn/utils/_testing.py | 48 ++++++++++++++++++- 2 files changed, 64 insertions(+), 3 deletions(-) diff --git a/sklearn/tests/test_docstring_parameters_consistency.py b/sklearn/tests/test_docstring_parameters_consistency.py index d77f1e3c3f80f..cecc35131b4f7 100644 --- a/sklearn/tests/test_docstring_parameters_consistency.py +++ b/sklearn/tests/test_docstring_parameters_consistency.py @@ -4,10 +4,27 @@ import pytest from sklearn import metrics -from sklearn.ensemble import StackingClassifier, StackingRegressor +from sklearn.ensemble import ( + BaggingClassifier, + BaggingRegressor, + IsolationForest, + StackingClassifier, + StackingRegressor, +) from sklearn.utils._testing import assert_docstring_consistency, skip_if_no_numpydoc CLASS_DOCSTRING_CONSISTENCY_CASES = [ + { + "objects": [BaggingClassifier, BaggingRegressor, IsolationForest], + "include_params": ["max_samples"], + "exclude_params": None, + "include_attrs": False, + "exclude_attrs": None, + "include_returns": False, + "exclude_returns": None, + "descr_regex_pattern": r"The number of samples to draw from X to train each.*", + "ignore_types": ("max_samples"), + }, { "objects": [StackingClassifier, StackingRegressor], "include_params": ["cv", "n_jobs", "passthrough", "verbose"], diff --git a/sklearn/utils/_testing.py b/sklearn/utils/_testing.py index dff2f65dae7af..edf36ff882612 100644 --- a/sklearn/utils/_testing.py +++ b/sklearn/utils/_testing.py @@ -686,12 +686,42 @@ def _get_diff_msg(docstrings_grouped): def _check_consistency_items( - items_docs, type_or_desc, section, n_objects, descr_regex_pattern="" + items_docs, + type_or_desc, + section, + n_objects, + descr_regex_pattern="", + ignore_types=tuple(), ): """Helper to check docstring consistency of all `items_docs`. If item is not present in all objects, checking is skipped and warning raised. If `regex` provided, match descriptions to all descriptions. + + Parameters + ---------- + items_doc : dict of dict of str + Dictionary where the key is the string type or description, value is + a dictionary where the key is "type description" or "description" + and the value is a list of object names with the same string type or + description. + + type_or_desc : {"type description", "description"} + Whether to check type description or description between objects. + + section : {"Parameters", "Attributes", "Returns"} + Name of the section type. + + n_objects : int + Total number of objects. + + descr_regex_pattern : str, default="" + Regex pattern to match for description of all objects. + Ignored when `type_or_desc="type description". + + ignore_types : tuple of str, default=() + Tuple of parameter/attribute/return names for which type description + matching is ignored. Ignored when `type_or_desc="description". """ skipped = [] for item_name, docstrings_grouped in items_docs.items(): @@ -710,6 +740,9 @@ def _check_consistency_items( f" does not match 'descr_regex_pattern': {descr_regex_pattern} " ) raise AssertionError(msg) + # Skip type checking for items in `ignore_types` + elif type_or_desc == "type specification" and item_name in ignore_types: + continue # Otherwise, if more than one key, docstrings not consistent between objects elif len(docstrings_grouped.keys()) > 1: msg_diff = _get_diff_msg(docstrings_grouped) @@ -738,6 +771,7 @@ def assert_docstring_consistency( include_returns=False, exclude_returns=None, descr_regex_pattern=None, + ignore_types=tuple(), ): r"""Check consistency between docstring parameters/attributes/returns of objects. @@ -786,6 +820,10 @@ def assert_docstring_consistency( parameters/attributes/returns. If None, will revert to default behavior of comparing descriptions between objects. + ignore_types : tuple of str, default=tuple() + Tuple of parameter/attribute/return names to exclude from type description + matching between objects. + Examples -------- >>> from sklearn.metrics import (accuracy_score, classification_report, @@ -849,7 +887,13 @@ def _create_args(include, exclude, arg_name, section_name): type_items[item_name][type_def].append(obj_name) desc_items[item_name][desc].append(obj_name) - _check_consistency_items(type_items, "type specification", section, n_objects) + _check_consistency_items( + type_items, + "type specification", + section, + n_objects, + ignore_types=ignore_types, + ) _check_consistency_items( desc_items, "description", From 0173b916739dc17fe522ab64c691682a30d1d17b Mon Sep 17 00:00:00 2001 From: Arturo Amor <86408019+ArturoAmorQ@users.noreply.github.com> Date: Tue, 29 Apr 2025 01:12:27 +0200 Subject: [PATCH 090/182] DOC Improve descriptions of roc_curve-related dosctrings (#31238) Co-authored-by: ArturoAmorQ Co-authored-by: Lucy Liu --- sklearn/metrics/_plot/roc_curve.py | 29 +++++++++++++++++++++-------- sklearn/metrics/_ranking.py | 17 +++++++++-------- 2 files changed, 30 insertions(+), 16 deletions(-) diff --git a/sklearn/metrics/_plot/roc_curve.py b/sklearn/metrics/_plot/roc_curve.py index cc467296cfed1..4a198080e0d0a 100644 --- a/sklearn/metrics/_plot/roc_curve.py +++ b/sklearn/metrics/_plot/roc_curve.py @@ -20,7 +20,10 @@ class RocCurveDisplay(_BinaryClassifierCurveDisplayMixin): a :class:`~sklearn.metrics.RocCurveDisplay`. All parameters are stored as attributes. - Read more in the :ref:`User Guide `. + For general information regarding `scikit-learn` visualization tools, see + the :ref:`Visualization Guide `. + For guidance on interpreting these plots, refer to the :ref:`Model + Evaluation Guide `. Parameters ---------- @@ -215,6 +218,11 @@ def from_estimator( ): """Create a ROC Curve display from an estimator. + For general information regarding `scikit-learn` visualization tools, + see the :ref:`Visualization Guide `. + For guidance on interpreting these plots, refer to the :ref:`Model + Evaluation Guide `. + Parameters ---------- estimator : estimator instance @@ -231,9 +239,10 @@ def from_estimator( Sample weights. drop_intermediate : bool, default=True - Whether to drop some suboptimal thresholds which would not appear - on a plotted ROC curve. This is useful in order to create lighter - ROC curves. + Whether to drop thresholds where the resulting point is collinear + with its neighbors in ROC space. This has no effect on the ROC AUC + or visual shape of the curve, but reduces the number of plotted + points. response_method : {'predict_proba', 'decision_function', 'auto'} \ default='auto' @@ -343,7 +352,10 @@ def from_predictions( ): """Plot ROC curve given the true and predicted values. - Read more in the :ref:`User Guide `. + For general information regarding `scikit-learn` visualization tools, + see the :ref:`Visualization Guide `. + For guidance on interpreting these plots, refer to the :ref:`Model + Evaluation Guide `. .. versionadded:: 1.0 @@ -364,9 +376,10 @@ def from_predictions( Sample weights. drop_intermediate : bool, default=True - Whether to drop some suboptimal thresholds which would not appear - on a plotted ROC curve. This is useful in order to create lighter - ROC curves. + Whether to drop thresholds where the resulting point is collinear + with its neighbors in ROC space. This has no effect on the ROC AUC + or visual shape of the curve, but reduces the number of plotted + points. pos_label : int, float, bool or str, default=None The label of the positive class. When `pos_label=None`, if `y_true` diff --git a/sklearn/metrics/_ranking.py b/sklearn/metrics/_ranking.py index 1f22f687c6a66..273fbe5f242bb 100644 --- a/sklearn/metrics/_ranking.py +++ b/sklearn/metrics/_ranking.py @@ -1093,9 +1093,9 @@ def roc_curve( Sample weights. drop_intermediate : bool, default=True - Whether to drop some suboptimal thresholds which would not appear - on a plotted ROC curve. This is useful in order to create lighter - ROC curves. + Whether to drop thresholds where the resulting point is collinear with + its neighbors in ROC space. This has no effect on the ROC AUC or visual + shape of the curve, but reduces the number of plotted points. .. versionadded:: 0.17 parameter *drop_intermediate*. @@ -1112,8 +1112,12 @@ def roc_curve( thresholds : ndarray of shape (n_thresholds,) Decreasing thresholds on the decision function used to compute - fpr and tpr. `thresholds[0]` represents no instances being predicted - and is arbitrarily set to `np.inf`. + fpr and tpr. The first threshold is set to `np.inf`. + + .. versionchanged:: 1.3 + An arbitrary threshold at infinity (stored in `thresholds[0]`) is + added to represent a classifier that always predicts the negative + class, i.e. `fpr=0` and `tpr=0`. See Also -------- @@ -1130,9 +1134,6 @@ def roc_curve( are reversed upon returning them to ensure they correspond to both ``fpr`` and ``tpr``, which are sorted in reversed order during their calculation. - An arbritrary threshold at infinity is added to represent a classifier - that always predicts the negative class, i.e. `fpr=0` and `tpr=0`. - References ---------- .. [1] `Wikipedia entry for the Receiver operating characteristic From 31439d22f12703c90d8809d08dd35629d5ae3cbf Mon Sep 17 00:00:00 2001 From: Dmitry Kobak Date: Tue, 29 Apr 2025 11:46:57 +0200 Subject: [PATCH 091/182] ENH Change the default `n_init` and `eps` for MDS (#31117) Co-authored-by: Olivier Grisel Co-authored-by: antoinebaker --- .../sklearn.manifold/31117.enhancement.rst | 3 + .../sklearn.manifold/31117.fix.rst | 5 + examples/manifold/plot_compare_methods.py | 2 +- examples/manifold/plot_lle_digits.py | 2 +- examples/manifold/plot_mds.py | 31 ++++- sklearn/manifold/_mds.py | 116 ++++++++++++------ sklearn/manifold/tests/test_mds.py | 71 +++++++++-- sklearn/tests/test_docstring_parameters.py | 4 + 8 files changed, 178 insertions(+), 56 deletions(-) create mode 100644 doc/whats_new/upcoming_changes/sklearn.manifold/31117.enhancement.rst create mode 100644 doc/whats_new/upcoming_changes/sklearn.manifold/31117.fix.rst diff --git a/doc/whats_new/upcoming_changes/sklearn.manifold/31117.enhancement.rst b/doc/whats_new/upcoming_changes/sklearn.manifold/31117.enhancement.rst new file mode 100644 index 0000000000000..51b9222c91e08 --- /dev/null +++ b/doc/whats_new/upcoming_changes/sklearn.manifold/31117.enhancement.rst @@ -0,0 +1,3 @@ +:class:`manifold.MDS` will switch to use `n_init=1` by default, +starting from version 1.9. +By :user:`Dmitry Kobak ` diff --git a/doc/whats_new/upcoming_changes/sklearn.manifold/31117.fix.rst b/doc/whats_new/upcoming_changes/sklearn.manifold/31117.fix.rst new file mode 100644 index 0000000000000..5ade720cfa570 --- /dev/null +++ b/doc/whats_new/upcoming_changes/sklearn.manifold/31117.fix.rst @@ -0,0 +1,5 @@ +:class:`manifold.MDS` now uses `eps=1e-6` by default and the convergence +criterion was adjusted to make sense for both metric and non-metric MDS +and to follow the reference R implementation. The formula for normalized +stress was adjusted to follow the original definition by Kruskal. +By :user:`Dmitry Kobak ` diff --git a/examples/manifold/plot_compare_methods.py b/examples/manifold/plot_compare_methods.py index 30ce4e5d8d897..6203a4afc436d 100644 --- a/examples/manifold/plot_compare_methods.py +++ b/examples/manifold/plot_compare_methods.py @@ -166,7 +166,7 @@ def add_2d_scatter(ax, points, points_color, title=None): md_scaling = manifold.MDS( n_components=n_components, max_iter=50, - n_init=4, + n_init=1, random_state=0, normalized_stress=False, ) diff --git a/examples/manifold/plot_lle_digits.py b/examples/manifold/plot_lle_digits.py index 45298c944aaee..d53816536158f 100644 --- a/examples/manifold/plot_lle_digits.py +++ b/examples/manifold/plot_lle_digits.py @@ -130,7 +130,7 @@ def plot_embedding(X, title): "LTSA LLE embedding": LocallyLinearEmbedding( n_neighbors=n_neighbors, n_components=2, method="ltsa" ), - "MDS embedding": MDS(n_components=2, n_init=1, max_iter=120, n_jobs=2), + "MDS embedding": MDS(n_components=2, n_init=1, max_iter=120, eps=1e-6), "Random Trees embedding": make_pipeline( RandomTreesEmbedding(n_estimators=200, max_depth=5, random_state=0), TruncatedSVD(n_components=2), diff --git a/examples/manifold/plot_mds.py b/examples/manifold/plot_mds.py index d35423ad51367..9d9828fc448f5 100644 --- a/examples/manifold/plot_mds.py +++ b/examples/manifold/plot_mds.py @@ -5,14 +5,17 @@ An illustration of the metric and non-metric MDS on generated noisy data. -The reconstructed points using the metric MDS and non metric MDS are slightly -shifted to avoid overlapping. - """ # Authors: The scikit-learn developers # SPDX-License-Identifier: BSD-3-Clause +# %% +# Dataset preparation +# ------------------- +# +# We start by uniformly generating 20 points in a 2D space. + import numpy as np from matplotlib import pyplot as plt from matplotlib.collections import LineCollection @@ -31,6 +34,11 @@ # Center the data X_true -= X_true.mean() +# %% +# Now we compute pairwise distances between all points and add +# a small amount of noise to the distance matrix. We make sure +# to keep the noisy distance matrix symmetric. + # Compute pairwise Euclidean distances distances = euclidean_distances(X_true) @@ -40,10 +48,14 @@ np.fill_diagonal(noise, 0) distances += noise +# %% +# Here we compute metric and non-metric MDS of the noisy distance matrix. + mds = manifold.MDS( n_components=2, max_iter=3000, eps=1e-9, + n_init=1, random_state=42, dissimilarity="precomputed", n_jobs=1, @@ -62,10 +74,16 @@ ) X_nmds = nmds.fit_transform(distances) -# Rescale the data -X_mds *= np.sqrt((X_true**2).sum()) / np.sqrt((X_mds**2).sum()) +# %% +# Rescaling the non-metric MDS solution to match the spread of the original data. + X_nmds *= np.sqrt((X_true**2).sum()) / np.sqrt((X_nmds**2).sum()) +# %% +# To make the visual comparisons easier, we rotate the original data and both MDS +# solutions to their PCA axes. And flip horizontal and vertical MDS axes, if needed, +# to match the original data orientation. + # Rotate the data pca = PCA(n_components=2) X_true = pca.fit_transform(X_true) @@ -79,6 +97,9 @@ if np.corrcoef(X_nmds[:, i], X_true[:, i])[0, 1] < 0: X_nmds[:, i] *= -1 +# %% +# Finally, we plot the original data and both MDS reconstructions. + fig = plt.figure(1) ax = plt.axes([0.0, 0.0, 1.0, 1.0]) diff --git a/sklearn/manifold/_mds.py b/sklearn/manifold/_mds.py index 07d492bdcd34d..6c31c72f7ef59 100644 --- a/sklearn/manifold/_mds.py +++ b/sklearn/manifold/_mds.py @@ -27,7 +27,7 @@ def _smacof_single( init=None, max_iter=300, verbose=0, - eps=1e-3, + eps=1e-6, random_state=None, normalized_stress=False, ): @@ -59,10 +59,13 @@ def _smacof_single( verbose : int, default=0 Level of verbosity. - eps : float, default=1e-3 - Relative tolerance with respect to stress at which to declare - convergence. The value of `eps` should be tuned separately depending - on whether or not `normalized_stress` is being used. + eps : float, default=1e-6 + The tolerance with respect to stress (normalized by the sum of squared + embedding distances) at which to declare convergence. + + .. versionchanged:: 1.7 + The default value for `eps` has changed from 1e-3 to 1e-6, as a result + of a bugfix in the computation of the convergence criterion. random_state : int, RandomState instance or None, default=None Determines the random number generator used to initialize the centers. @@ -70,7 +73,7 @@ def _smacof_single( See :term:`Glossary `. normalized_stress : bool, default=False - Whether use and return normalized stress value (Stress-1) instead of raw + Whether to return normalized stress value (Stress-1) instead of raw stress. .. versionadded:: 1.2 @@ -168,29 +171,32 @@ def _smacof_single( # Compute stress distances = euclidean_distances(X) stress = ((distances.ravel() - disparities.ravel()) ** 2).sum() / 2 - if normalized_stress: - stress = np.sqrt(stress / ((disparities.ravel() ** 2).sum() / 2)) - normalization = np.sqrt((X**2).sum(axis=1)).sum() if verbose >= 2: # pragma: no cover print(f"Iteration {it}, stress {stress:.4f}") if old_stress is not None: - if (old_stress - stress / normalization) < eps: + sum_squared_distances = (distances.ravel() ** 2).sum() + if ((old_stress - stress) / (sum_squared_distances / 2)) < eps: if verbose: # pragma: no cover print("Convergence criterion reached.") break - old_stress = stress / normalization + old_stress = stress + + if normalized_stress: + sum_squared_distances = (distances.ravel() ** 2).sum() + stress = np.sqrt(stress / (sum_squared_distances / 2)) return X, stress, it + 1 +# TODO(1.9): change default `n_init` to 1, see PR #31117 @validate_params( { "dissimilarities": ["array-like"], "metric": ["boolean"], "n_components": [Interval(Integral, 1, None, closed="left")], "init": ["array-like", None], - "n_init": [Interval(Integral, 1, None, closed="left")], + "n_init": [Interval(Integral, 1, None, closed="left"), StrOptions({"warn"})], "n_jobs": [Integral, None], "max_iter": [Interval(Integral, 1, None, closed="left")], "verbose": ["verbose"], @@ -207,11 +213,11 @@ def smacof( metric=True, n_components=2, init=None, - n_init=8, + n_init="warn", n_jobs=None, max_iter=300, verbose=0, - eps=1e-3, + eps=1e-6, random_state=None, return_n_iter=False, normalized_stress="auto", @@ -262,6 +268,9 @@ def smacof( determined by the run with the smallest final stress. If ``init`` is provided, this option is overridden and a single run is performed. + .. versionchanged:: 1.9 + The default value for `n_iter` will change from 8 to 1 in version 1.9. + n_jobs : int, default=None The number of jobs to use for the computation. If multiple initializations are used (``n_init``), each run of the algorithm is @@ -277,10 +286,13 @@ def smacof( verbose : int, default=0 Level of verbosity. - eps : float, default=1e-3 - Relative tolerance with respect to stress at which to declare - convergence. The value of `eps` should be tuned separately depending - on whether or not `normalized_stress` is being used. + eps : float, default=1e-6 + The tolerance with respect to stress (normalized by the sum of squared + embedding distances) at which to declare convergence. + + .. versionchanged:: 1.7 + The default value for `eps` has changed from 1e-3 to 1e-6, as a result + of a bugfix in the computation of the convergence criterion. random_state : int, RandomState instance or None, default=None Determines the random number generator used to initialize the centers. @@ -290,7 +302,7 @@ def smacof( return_n_iter : bool, default=False Whether or not to return the number of iterations. - normalized_stress : bool or "auto" default="auto" + normalized_stress : bool or "auto", default="auto" Whether to return normalized stress value (Stress-1) instead of raw stress. By default, metric MDS returns raw stress while non-metric MDS returns normalized stress. @@ -335,17 +347,24 @@ def smacof( >>> import numpy as np >>> from sklearn.manifold import smacof >>> from sklearn.metrics import euclidean_distances - >>> X = np.array([[0, 1, 2], [1, 0, 3],[2, 3, 0]]) + >>> X = np.array([[0, 1, 2], [1, 0, 3], [2, 3, 0]]) >>> dissimilarities = euclidean_distances(X) - >>> mds_result, stress = smacof(dissimilarities, n_components=2, random_state=42) - >>> np.round(mds_result, 5) - array([[ 0.05352, -1.07253], - [ 1.74231, -0.75675], - [-1.79583, 1.82928]]) - >>> np.round(stress, 5).item() - 0.00128 + >>> Z, stress = smacof( + ... dissimilarities, n_components=2, n_init=1, eps=1e-6, random_state=42 + ... ) + >>> Z.shape + (3, 2) + >>> np.round(stress, 6).item() + 3.2e-05 """ + if n_init == "warn": + warnings.warn( + "The default value of `n_init` will change from 8 to 1 in 1.9.", + FutureWarning, + ) + n_init = 8 + dissimilarities = check_array(dissimilarities) random_state = check_random_state(random_state) @@ -408,6 +427,7 @@ def smacof( return best_pos, best_stress +# TODO(1.9): change default `n_init` to 1, see PR #31117 class MDS(BaseEstimator): """Multidimensional scaling. @@ -428,16 +448,22 @@ class MDS(BaseEstimator): initializations. The final results will be the best output of the runs, determined by the run with the smallest final stress. + .. versionchanged:: 1.9 + The default value for `n_init` will change from 4 to 1 in version 1.9. + max_iter : int, default=300 Maximum number of iterations of the SMACOF algorithm for a single run. verbose : int, default=0 Level of verbosity. - eps : float, default=1e-3 - Relative tolerance with respect to stress at which to declare - convergence. The value of `eps` should be tuned separately depending - on whether or not `normalized_stress` is being used. + eps : float, default=1e-6 + The tolerance with respect to stress (normalized by the sum of squared + embedding distances) at which to declare convergence. + + .. versionchanged:: 1.7 + The default value for `eps` has changed from 1e-3 to 1e-6, as a result + of a bugfix in the computation of the convergence criterion. n_jobs : int, default=None The number of jobs to use for the computation. If multiple @@ -464,9 +490,9 @@ class MDS(BaseEstimator): ``fit_transform``. normalized_stress : bool or "auto" default="auto" - Whether use and return normalized stress value (Stress-1) instead of raw - stress. By default, metric MDS uses raw stress while non-metric MDS uses - normalized stress. + Whether to return normalized stress value (Stress-1) instead of raw + stress. By default, metric MDS returns raw stress while non-metric MDS + returns normalized stress. .. versionadded:: 1.2 @@ -539,7 +565,7 @@ class MDS(BaseEstimator): >>> X, _ = load_digits(return_X_y=True) >>> X.shape (1797, 64) - >>> embedding = MDS(n_components=2, normalized_stress='auto') + >>> embedding = MDS(n_components=2, n_init=1) >>> X_transformed = embedding.fit_transform(X[:100]) >>> X_transformed.shape (100, 2) @@ -554,7 +580,7 @@ class MDS(BaseEstimator): _parameter_constraints: dict = { "n_components": [Interval(Integral, 1, None, closed="left")], "metric": ["boolean"], - "n_init": [Interval(Integral, 1, None, closed="left")], + "n_init": [Interval(Integral, 1, None, closed="left"), StrOptions({"warn"})], "max_iter": [Interval(Integral, 1, None, closed="left")], "verbose": ["verbose"], "eps": [Interval(Real, 0.0, None, closed="left")], @@ -569,10 +595,10 @@ def __init__( n_components=2, *, metric=True, - n_init=4, + n_init="warn", max_iter=300, verbose=0, - eps=1e-3, + eps=1e-6, n_jobs=None, random_state=None, dissimilarity="euclidean", @@ -646,10 +672,20 @@ def fit_transform(self, X, y=None, init=None): X_new : ndarray of shape (n_samples, n_components) X transformed in the new space. """ + + if self.n_init == "warn": + warnings.warn( + "The default value of `n_init` will change from 4 to 1 in 1.9.", + FutureWarning, + ) + self._n_init = 4 + else: + self._n_init = self.n_init + X = validate_data(self, X) if X.shape[0] == X.shape[1] and self.dissimilarity != "precomputed": warnings.warn( - "The MDS API has changed. ``fit`` now constructs an" + "The MDS API has changed. ``fit`` now constructs a" " dissimilarity matrix from data. To use a custom " "dissimilarity matrix, set " "``dissimilarity='precomputed'``." @@ -665,7 +701,7 @@ def fit_transform(self, X, y=None, init=None): metric=self.metric, n_components=self.n_components, init=init, - n_init=self.n_init, + n_init=self._n_init, n_jobs=self.n_jobs, max_iter=self.max_iter, verbose=self.verbose, diff --git a/sklearn/manifold/tests/test_mds.py b/sklearn/manifold/tests/test_mds.py index 8a465f0d3c2ab..88dc842a1d5fc 100644 --- a/sklearn/manifold/tests/test_mds.py +++ b/sklearn/manifold/tests/test_mds.py @@ -2,7 +2,7 @@ import numpy as np import pytest -from numpy.testing import assert_allclose, assert_array_almost_equal +from numpy.testing import assert_allclose, assert_array_almost_equal, assert_equal from sklearn.datasets import load_digits from sklearn.manifold import _mds as mds @@ -54,7 +54,6 @@ def test_nonmetric_mds_optimization(): mds_est = mds.MDS( n_components=2, n_init=1, - eps=1e-15, max_iter=2, metric=False, random_state=42, @@ -64,7 +63,6 @@ def test_nonmetric_mds_optimization(): mds_est = mds.MDS( n_components=2, n_init=1, - eps=1e-15, max_iter=3, metric=False, random_state=42, @@ -86,7 +84,7 @@ def test_mds_recovers_true_data(metric): random_state=42, ).fit(X) stress = mds_est.stress_ - assert_allclose(stress, 0, atol=1e-10) + assert_allclose(stress, 0, atol=1e-6) def test_smacof_error(): @@ -94,13 +92,13 @@ def test_smacof_error(): sim = np.array([[0, 5, 9, 4], [5, 0, 2, 2], [3, 2, 0, 1], [4, 2, 1, 0]]) with pytest.raises(ValueError): - mds.smacof(sim) + mds.smacof(sim, n_init=1) # Not squared similarity matrix: sim = np.array([[0, 5, 9, 4], [5, 0, 2, 2], [4, 2, 1, 0]]) with pytest.raises(ValueError): - mds.smacof(sim) + mds.smacof(sim, n_init=1) # init not None and not correct format: sim = np.array([[0, 5, 3, 4], [5, 0, 2, 2], [3, 2, 0, 1], [4, 2, 1, 0]]) @@ -112,10 +110,17 @@ def test_smacof_error(): def test_MDS(): sim = np.array([[0, 5, 3, 4], [5, 0, 2, 2], [3, 2, 0, 1], [4, 2, 1, 0]]) - mds_clf = mds.MDS(metric=False, n_jobs=3, dissimilarity="precomputed") + mds_clf = mds.MDS( + metric=False, + n_jobs=3, + n_init=3, + dissimilarity="precomputed", + ) mds_clf.fit(sim) +# TODO(1.9): remove warning filter +@pytest.mark.filterwarnings("ignore::FutureWarning") @pytest.mark.parametrize("k", [0.5, 1.5, 2]) def test_normed_stress(k): """Test that non-metric MDS normalized stress is scale-invariant.""" @@ -128,6 +133,8 @@ def test_normed_stress(k): assert_allclose(X1, X2, rtol=1e-5) +# TODO(1.9): remove warning filter +@pytest.mark.filterwarnings("ignore::FutureWarning") @pytest.mark.parametrize("metric", [True, False]) def test_normalized_stress_auto(metric, monkeypatch): rng = np.random.RandomState(0) @@ -165,17 +172,63 @@ def test_isotonic_outofbounds(): mds.smacof(dis, init=init, metric=False, n_init=1) -def test_returned_stress(): +# TODO(1.9): remove warning filter +@pytest.mark.filterwarnings("ignore::FutureWarning") +@pytest.mark.parametrize("normalized_stress", [True, False]) +def test_returned_stress(normalized_stress): # Test that the final stress corresponds to the final embedding # (non-regression test for issue 16846) X = np.array([[1, 1], [1, 4], [1, 5], [3, 3]]) D = euclidean_distances(X) - mds_est = mds.MDS(n_components=2, random_state=42).fit(X) + mds_est = mds.MDS( + n_components=2, + random_state=42, + normalized_stress=normalized_stress, + ).fit(X) + Z = mds_est.embedding_ stress = mds_est.stress_ D_mds = euclidean_distances(Z) stress_Z = ((D_mds.ravel() - D.ravel()) ** 2).sum() / 2 + if normalized_stress: + stress_Z = np.sqrt(stress_Z / ((D_mds.ravel() ** 2).sum() / 2)) + assert_allclose(stress, stress_Z) + + +# TODO(1.9): remove warning filter +@pytest.mark.filterwarnings("ignore::FutureWarning") +@pytest.mark.parametrize("metric", [True, False]) +def test_convergence_does_not_depend_on_scale(metric): + # Test that the number of iterations until convergence does not depend on + # the scale of the input data + X = np.array([[1, 1], [1, 4], [1, 5], [3, 3]]) + + mds_est = mds.MDS( + n_components=2, + random_state=42, + metric=metric, + ) + + mds_est.fit(X * 100) + n_iter1 = mds_est.n_iter_ + + mds_est.fit(X / 100) + n_iter2 = mds_est.n_iter_ + + assert_equal(n_iter1, n_iter2) + + +# TODO(1.9): delete this test +def test_future_warning_n_init(): + X = np.array([[1, 1], [1, 4], [1, 5], [3, 3]]) + sim = np.array([[0, 5, 3, 4], [5, 0, 2, 2], [3, 2, 0, 1], [4, 2, 1, 0]]) + + with pytest.warns(FutureWarning): + mds.smacof(sim) + + with pytest.warns(FutureWarning): + mds.MDS().fit(X) diff --git a/sklearn/tests/test_docstring_parameters.py b/sklearn/tests/test_docstring_parameters.py index 6ec42b9b13fd5..4d179df69ddf7 100644 --- a/sklearn/tests/test_docstring_parameters.py +++ b/sklearn/tests/test_docstring_parameters.py @@ -224,6 +224,10 @@ def test_fit_docstring_attributes(name, Estimator): elif Estimator.__name__ == "KBinsDiscretizer": # default raises an FutureWarning if quantile method is at default "warn" est.set_params(quantile_method="averaged_inverted_cdf") + # TODO(1.9) remove + elif Estimator.__name__ == "MDS": + # default raises a FutureWarning + est.set_params(n_init=1) # Low max iter to speed up tests: we are only interested in checking the existence # of fitted attributes. This should be invariant to whether it has converged or not. From 9ba4f917c340b659c6d28d734c839d76eecf636c Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Dea=20Mar=C3=ADa=20L=C3=A9on?= Date: Tue, 29 Apr 2025 17:17:25 +0200 Subject: [PATCH 092/182] MNT Avoid pre-commit failure (#31273) --- sklearn/cluster/_agglomerative.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/sklearn/cluster/_agglomerative.py b/sklearn/cluster/_agglomerative.py index a2365da3669c4..f068dc934151d 100644 --- a/sklearn/cluster/_agglomerative.py +++ b/sklearn/cluster/_agglomerative.py @@ -36,7 +36,7 @@ from ..utils.validation import check_memory, validate_data # mypy error: Module 'sklearn.cluster' has no attribute '_hierarchical_fast' -from . import _hierarchical_fast as _hierarchical +from . import _hierarchical_fast as _hierarchical # type: ignore[attr-defined] from ._feature_agglomeration import AgglomerationTransform ############################################################################### From c4760bae216fdd634dbd6a92ff714057b78da823 Mon Sep 17 00:00:00 2001 From: Dmitry Kobak Date: Tue, 29 Apr 2025 18:05:32 +0200 Subject: [PATCH 093/182] MNT Fix the formatting of the what's new entries for 1.7 (#31272) --- .../30179.enhancement.rst | 2 +- .../sklearn.linear_model/30521.fix.rst | 8 ++++---- .../sklearn.linear_model/30616.api.rst | 18 +++++++++--------- .../sklearn.linear_model/30644.fix.rst | 6 +++--- .../sklearn.manifold/31117.enhancement.rst | 6 +++--- .../sklearn.manifold/31117.fix.rst | 10 +++++----- .../sklearn.neural_network/24788.fix.rst | 6 +++--- .../sklearn.utils/29907.enhancement.rst | 3 +-- .../sklearn.utils/30775.fix.rst | 10 +++++----- 9 files changed, 34 insertions(+), 35 deletions(-) diff --git a/doc/whats_new/upcoming_changes/sklearn.feature_selection/30179.enhancement.rst b/doc/whats_new/upcoming_changes/sklearn.feature_selection/30179.enhancement.rst index 97e147d81db10..6eec68c0d95e7 100644 --- a/doc/whats_new/upcoming_changes/sklearn.feature_selection/30179.enhancement.rst +++ b/doc/whats_new/upcoming_changes/sklearn.feature_selection/30179.enhancement.rst @@ -1,3 +1,3 @@ - :class:`feature_selection.RFECV` now gives access to the ranking and support in each - iteration and cv step of feature selection. + iteration and cv step of feature selection. By :user:`Marie S. ` diff --git a/doc/whats_new/upcoming_changes/sklearn.linear_model/30521.fix.rst b/doc/whats_new/upcoming_changes/sklearn.linear_model/30521.fix.rst index 7a3c238f53d84..74ad18fbd2f8e 100644 --- a/doc/whats_new/upcoming_changes/sklearn.linear_model/30521.fix.rst +++ b/doc/whats_new/upcoming_changes/sklearn.linear_model/30521.fix.rst @@ -1,4 +1,4 @@ -- |Enhancement| Added a new parameter `tol` to - :class:`linear_model.LinearRegression` that determines the precision of the - solution `coef_` when fitting on sparse data. - By :user:`Success Moses ` +- |Enhancement| Added a new parameter `tol` to + :class:`linear_model.LinearRegression` that determines the precision of the + solution `coef_` when fitting on sparse data. + By :user:`Success Moses ` diff --git a/doc/whats_new/upcoming_changes/sklearn.linear_model/30616.api.rst b/doc/whats_new/upcoming_changes/sklearn.linear_model/30616.api.rst index 8d0a032fd284f..2b9d30e445bcf 100644 --- a/doc/whats_new/upcoming_changes/sklearn.linear_model/30616.api.rst +++ b/doc/whats_new/upcoming_changes/sklearn.linear_model/30616.api.rst @@ -1,9 +1,9 @@ -The parameter `n_alphas` has been deprecated in the following classes: -:class:`linear_model.ElasticNetCV` and :class:`linear_model.LassoCV` -and :class:`linear_model.MultiTaskElasticNetCV` -and :class:`linear_model.MultiTaskLassoCV`, and will be removed in 1.9. The parameter -`alphas` now supports both integers and array-likes, removing the need for `n_alphas`. -From now on, only `alphas` should be set to either indicate the number of alphas to -automatically generate (int) or to provide a list of alphas (array-like) to test along -the regularization path. -By :user:`Siddharth Bansal `. +- The parameter `n_alphas` has been deprecated in the following classes: + :class:`linear_model.ElasticNetCV` and :class:`linear_model.LassoCV` + and :class:`linear_model.MultiTaskElasticNetCV` + and :class:`linear_model.MultiTaskLassoCV`, and will be removed in 1.9. The parameter + `alphas` now supports both integers and array-likes, removing the need for `n_alphas`. + From now on, only `alphas` should be set to either indicate the number of alphas to + automatically generate (int) or to provide a list of alphas (array-like) to test along + the regularization path. + By :user:`Siddharth Bansal `. diff --git a/doc/whats_new/upcoming_changes/sklearn.linear_model/30644.fix.rst b/doc/whats_new/upcoming_changes/sklearn.linear_model/30644.fix.rst index c9254fe350e28..9c8a85b080617 100644 --- a/doc/whats_new/upcoming_changes/sklearn.linear_model/30644.fix.rst +++ b/doc/whats_new/upcoming_changes/sklearn.linear_model/30644.fix.rst @@ -1,3 +1,3 @@ -- The update and initialization of the hyperparameters now properly handle - sample weights in :class:`linear_model.BayesianRidge`. - By :user:`Antoine Baker `. +- The update and initialization of the hyperparameters now properly handle + sample weights in :class:`linear_model.BayesianRidge`. + By :user:`Antoine Baker `. diff --git a/doc/whats_new/upcoming_changes/sklearn.manifold/31117.enhancement.rst b/doc/whats_new/upcoming_changes/sklearn.manifold/31117.enhancement.rst index 51b9222c91e08..87b6896890163 100644 --- a/doc/whats_new/upcoming_changes/sklearn.manifold/31117.enhancement.rst +++ b/doc/whats_new/upcoming_changes/sklearn.manifold/31117.enhancement.rst @@ -1,3 +1,3 @@ -:class:`manifold.MDS` will switch to use `n_init=1` by default, -starting from version 1.9. -By :user:`Dmitry Kobak ` +- :class:`manifold.MDS` will switch to use `n_init=1` by default, + starting from version 1.9. + By :user:`Dmitry Kobak ` diff --git a/doc/whats_new/upcoming_changes/sklearn.manifold/31117.fix.rst b/doc/whats_new/upcoming_changes/sklearn.manifold/31117.fix.rst index 5ade720cfa570..6248a23b86546 100644 --- a/doc/whats_new/upcoming_changes/sklearn.manifold/31117.fix.rst +++ b/doc/whats_new/upcoming_changes/sklearn.manifold/31117.fix.rst @@ -1,5 +1,5 @@ -:class:`manifold.MDS` now uses `eps=1e-6` by default and the convergence -criterion was adjusted to make sense for both metric and non-metric MDS -and to follow the reference R implementation. The formula for normalized -stress was adjusted to follow the original definition by Kruskal. -By :user:`Dmitry Kobak ` +- :class:`manifold.MDS` now uses `eps=1e-6` by default and the convergence + criterion was adjusted to make sense for both metric and non-metric MDS + and to follow the reference R implementation. The formula for normalized + stress was adjusted to follow the original definition by Kruskal. + By :user:`Dmitry Kobak ` diff --git a/doc/whats_new/upcoming_changes/sklearn.neural_network/24788.fix.rst b/doc/whats_new/upcoming_changes/sklearn.neural_network/24788.fix.rst index ea67942daec59..dc2742e9a04d8 100644 --- a/doc/whats_new/upcoming_changes/sklearn.neural_network/24788.fix.rst +++ b/doc/whats_new/upcoming_changes/sklearn.neural_network/24788.fix.rst @@ -1,3 +1,3 @@ -:class:`neural_network.MLPRegressor` now raises an informative error when -`early_stopping` is set and the computed validation set is too small. -By :user:`David Shumway `. +- :class:`neural_network.MLPRegressor` now raises an informative error when + `early_stopping` is set and the computed validation set is too small. + By :user:`David Shumway `. diff --git a/doc/whats_new/upcoming_changes/sklearn.utils/29907.enhancement.rst b/doc/whats_new/upcoming_changes/sklearn.utils/29907.enhancement.rst index 497c53cd96254..0a17e5d1d1ae1 100644 --- a/doc/whats_new/upcoming_changes/sklearn.utils/29907.enhancement.rst +++ b/doc/whats_new/upcoming_changes/sklearn.utils/29907.enhancement.rst @@ -1,5 +1,4 @@ - - :func: `resample` now handles sample weights which allows weighted resampling. - :pr:`29907` by :user:`Shruti Nath ` and :user:`Olivier Grisel + By :user:`Shruti Nath ` and :user:`Olivier Grisel ` diff --git a/doc/whats_new/upcoming_changes/sklearn.utils/30775.fix.rst b/doc/whats_new/upcoming_changes/sklearn.utils/30775.fix.rst index 7f8503b25300b..bd383a70c2bba 100644 --- a/doc/whats_new/upcoming_changes/sklearn.utils/30775.fix.rst +++ b/doc/whats_new/upcoming_changes/sklearn.utils/30775.fix.rst @@ -1,5 +1,5 @@ -- In :mod:`utils.estimator_checks` we now enforce for binary classifiers a - binary `y` by taking the minimum as the negative class instead of the first - element, which makes it robust to `y` shuffling. It prevents two checks from - wrongly failing on binary classifiers. - By :user:`Antoine Baker `. +- In :mod:`utils.estimator_checks` we now enforce for binary classifiers a + binary `y` by taking the minimum as the negative class instead of the first + element, which makes it robust to `y` shuffling. It prevents two checks from + wrongly failing on binary classifiers. + By :user:`Antoine Baker `. From 7c976b443ff4c3bd1af7bb57de198a4dbc3026a0 Mon Sep 17 00:00:00 2001 From: Lucy Liu Date: Wed, 30 Apr 2025 02:08:24 +1000 Subject: [PATCH 094/182] MNT Avoid nested sequence in `weighted_percentile` (#31211) --- sklearn/utils/stats.py | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/sklearn/utils/stats.py b/sklearn/utils/stats.py index d665ee449f388..66179e5ea3aba 100644 --- a/sklearn/utils/stats.py +++ b/sklearn/utils/stats.py @@ -93,14 +93,13 @@ def _weighted_percentile(array, sample_weight, percentile_rank=50, xp=None): # For each feature with index j, find sample index i of the scalar value # `adjusted_percentile_rank[j]` in 1D array `weight_cdf[j]`, such that: # weight_cdf[j, i-1] < adjusted_percentile_rank[j] <= weight_cdf[j, i]. - percentile_indices = xp.asarray( + percentile_indices = xp.stack( [ xp.searchsorted( weight_cdf[feature_idx, ...], adjusted_percentile_rank[feature_idx] ) for feature_idx in range(weight_cdf.shape[0]) ], - device=device, ) # In rare cases, `percentile_indices` equals to `sorted_idx.shape[0]` max_idx = sorted_idx.shape[0] - 1 From 6c8bf6e9be20f910f132c6aa6469cbd8f3822579 Mon Sep 17 00:00:00 2001 From: Dimitri Papadopoulos Orfanos <3234522+DimitriPapadopoulos@users.noreply.github.com> Date: Wed, 30 Apr 2025 10:33:33 +0200 Subject: [PATCH 095/182] MNT git ignore application of ruff PGH rules (#31226) (#31265) --- .git-blame-ignore-revs | 3 +++ 1 file changed, 3 insertions(+) diff --git a/.git-blame-ignore-revs b/.git-blame-ignore-revs index ce83f716e73e3..77fb878ee8fe7 100644 --- a/.git-blame-ignore-revs +++ b/.git-blame-ignore-revs @@ -43,3 +43,6 @@ fe7c4176828af5231f526e76683fb9bdb9ea0367 # PR 31015: black -> ruff format ff78e258ccf11068e2b3a433c51517ae56234f88 + +# PR 31226: Enforce ruff/pygrep-hooks rules +b98dc797c480b1b9495f918e201d45ee07f29feb From f0cbbbbd03c7b3ea7daeeeba4f8e941b9223afa5 Mon Sep 17 00:00:00 2001 From: Benjamin Danek Date: Wed, 30 Apr 2025 01:37:34 -0700 Subject: [PATCH 096/182] DOC Minor update to CalibratedClassifierCV docstring (#31275) --- sklearn/calibration.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/sklearn/calibration.py b/sklearn/calibration.py index 80932629983f0..a2b145536eca6 100644 --- a/sklearn/calibration.py +++ b/sklearn/calibration.py @@ -61,7 +61,7 @@ class CalibratedClassifierCV(ClassifierMixin, MetaEstimatorMixin, BaseEstimator) """Probability calibration with isotonic regression or logistic regression. This class uses cross-validation to both estimate the parameters of a - classifier and subsequently calibrate a classifier. With default + classifier and subsequently calibrate a classifier. With `ensemble=True`, for each cv split it fits a copy of the base estimator to the training subset, and calibrates it using the testing subset. For prediction, predicted probabilities are From e29d727ce8e6ff75797bec87a232d2e737e59dd1 Mon Sep 17 00:00:00 2001 From: Olivier Grisel Date: Wed, 30 Apr 2025 10:45:00 +0200 Subject: [PATCH 097/182] FIX TST `test_precomputed_nearest_neighbors_filtering[60]` failure on CI (#31262) --- sklearn/cluster/tests/test_spectral.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/sklearn/cluster/tests/test_spectral.py b/sklearn/cluster/tests/test_spectral.py index 3b02acefc5a50..71b11c9fe151c 100644 --- a/sklearn/cluster/tests/test_spectral.py +++ b/sklearn/cluster/tests/test_spectral.py @@ -106,7 +106,7 @@ def test_precomputed_nearest_neighbors_filtering(global_random_seed): X, y = make_blobs( n_samples=250, random_state=global_random_seed, - centers=[[1, 1], [-1, -1]], + centers=[[1, 1, 1], [-1, -1, -1]], cluster_std=0.01, ) @@ -114,7 +114,7 @@ def test_precomputed_nearest_neighbors_filtering(global_random_seed): results = [] for additional_neighbors in [0, 10]: nn = NearestNeighbors(n_neighbors=n_neighbors + additional_neighbors).fit(X) - graph = nn.kneighbors_graph(X, mode="connectivity") + graph = nn.kneighbors_graph(X, mode="distance") labels = ( SpectralClustering( random_state=global_random_seed, From d51f17b6959a569fd3f1beb2965c625fd4e411ac Mon Sep 17 00:00:00 2001 From: mohammed benyamna Date: Wed, 30 Apr 2025 10:00:53 +0100 Subject: [PATCH 098/182] TST Enhance ROC Curve Display Tests for Improved Clarity and Maintainability (#31266) --- .../_plot/tests/test_roc_curve_display.py | 23 +++++++++---------- 1 file changed, 11 insertions(+), 12 deletions(-) diff --git a/sklearn/metrics/_plot/tests/test_roc_curve_display.py b/sklearn/metrics/_plot/tests/test_roc_curve_display.py index c2e6c865fa9a9..ca0d7155e7c2c 100644 --- a/sklearn/metrics/_plot/tests/test_roc_curve_display.py +++ b/sklearn/metrics/_plot/tests/test_roc_curve_display.py @@ -5,7 +5,7 @@ from sklearn import clone from sklearn.compose import make_column_transformer -from sklearn.datasets import load_breast_cancer, load_iris +from sklearn.datasets import load_breast_cancer, make_classification from sklearn.exceptions import NotFittedError from sklearn.linear_model import LogisticRegression from sklearn.metrics import RocCurveDisplay, auc, roc_curve @@ -16,20 +16,19 @@ @pytest.fixture(scope="module") -def data(): - X, y = load_iris(return_X_y=True) - # Avoid introducing test dependencies by mistake. - X.flags.writeable = False - y.flags.writeable = False +def data_binary(): + X, y = make_classification( + n_samples=200, + n_features=20, + n_informative=5, + n_redundant=2, + flip_y=0.1, + class_sep=0.8, + random_state=42, + ) return X, y -@pytest.fixture(scope="module") -def data_binary(data): - X, y = data - return X[y < 2], y[y < 2] - - @pytest.mark.parametrize("response_method", ["predict_proba", "decision_function"]) @pytest.mark.parametrize("with_sample_weight", [True, False]) @pytest.mark.parametrize("drop_intermediate", [True, False]) From 7db1015b0c20fdc3acb2741c4c7cb38a71db18ea Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?J=C3=A9r=C3=A9mie=20du=20Boisberranger?= Date: Wed, 30 Apr 2025 11:03:28 +0200 Subject: [PATCH 099/182] DOC Improve consistency of inverse_transform return name (#31135) --- sklearn/cluster/_feature_agglomeration.py | 4 +-- sklearn/cross_decomposition/_pls.py | 4 +-- sklearn/decomposition/_base.py | 2 +- sklearn/decomposition/_dict_learning.py | 4 +-- sklearn/decomposition/_fastica.py | 2 +- sklearn/decomposition/_kernel_pca.py | 2 +- sklearn/decomposition/_nmf.py | 2 +- .../feature_extraction/_dict_vectorizer.py | 2 +- sklearn/feature_extraction/text.py | 2 +- sklearn/feature_selection/_base.py | 2 +- sklearn/model_selection/_search.py | 4 +-- sklearn/pipeline.py | 2 +- sklearn/preprocessing/_data.py | 27 ++++++++++--------- sklearn/preprocessing/_discretization.py | 2 +- sklearn/preprocessing/_encoders.py | 4 +-- .../preprocessing/_function_transformer.py | 2 +- sklearn/preprocessing/_label.py | 6 ++--- 17 files changed, 37 insertions(+), 36 deletions(-) diff --git a/sklearn/cluster/_feature_agglomeration.py b/sklearn/cluster/_feature_agglomeration.py index cbde0e37de824..32fcb85625f35 100644 --- a/sklearn/cluster/_feature_agglomeration.py +++ b/sklearn/cluster/_feature_agglomeration.py @@ -66,8 +66,8 @@ def inverse_transform(self, X): Returns ------- - X : ndarray of shape (n_samples, n_features) or (n_features,) - A vector of size `n_samples` with the values of `Xred` assigned to + X_original : ndarray of shape (n_samples, n_features) or (n_features,) + A vector of size `n_samples` with the values of `X` assigned to each of the cluster of samples. """ check_is_fitted(self) diff --git a/sklearn/cross_decomposition/_pls.py b/sklearn/cross_decomposition/_pls.py index 6999cabf2d8b8..0bf6ec8f01d06 100644 --- a/sklearn/cross_decomposition/_pls.py +++ b/sklearn/cross_decomposition/_pls.py @@ -419,10 +419,10 @@ def inverse_transform(self, X, y=None): Returns ------- - X_reconstructed : ndarray of shape (n_samples, n_features) + X_original : ndarray of shape (n_samples, n_features) Return the reconstructed `X` data. - y_reconstructed : ndarray of shape (n_samples, n_targets) + y_original : ndarray of shape (n_samples, n_targets) Return the reconstructed `X` target. Only returned when `y` is given. Notes diff --git a/sklearn/decomposition/_base.py b/sklearn/decomposition/_base.py index 13202d56c50f4..783c316b50f27 100644 --- a/sklearn/decomposition/_base.py +++ b/sklearn/decomposition/_base.py @@ -177,7 +177,7 @@ def inverse_transform(self, X): Returns ------- - X_original array-like of shape (n_samples, n_features) + X_original : array-like of shape (n_samples, n_features) Original data, where `n_samples` is the number of samples and `n_features` is the number of features. diff --git a/sklearn/decomposition/_dict_learning.py b/sklearn/decomposition/_dict_learning.py index 0ef03183f1f5c..2e724c856b967 100644 --- a/sklearn/decomposition/_dict_learning.py +++ b/sklearn/decomposition/_dict_learning.py @@ -1174,7 +1174,7 @@ def inverse_transform(self, X): Returns ------- - X_new : ndarray of shape (n_samples, n_features) + X_original : ndarray of shape (n_samples, n_features) Transformed data. """ check_is_fitted(self) @@ -1378,7 +1378,7 @@ def inverse_transform(self, X): Returns ------- - X_new : ndarray of shape (n_samples, n_features) + X_original : ndarray of shape (n_samples, n_features) Transformed data. """ return self._inverse_transform(X, self.dictionary) diff --git a/sklearn/decomposition/_fastica.py b/sklearn/decomposition/_fastica.py index a6fd837313fc5..efda7bfca56b6 100644 --- a/sklearn/decomposition/_fastica.py +++ b/sklearn/decomposition/_fastica.py @@ -781,7 +781,7 @@ def inverse_transform(self, X, copy=True): Returns ------- - X_new : ndarray of shape (n_samples, n_features) + X_original : ndarray of shape (n_samples, n_features) Reconstructed data obtained with the mixing matrix. """ check_is_fitted(self) diff --git a/sklearn/decomposition/_kernel_pca.py b/sklearn/decomposition/_kernel_pca.py index 37ff77c8d7c64..79573651eeb84 100644 --- a/sklearn/decomposition/_kernel_pca.py +++ b/sklearn/decomposition/_kernel_pca.py @@ -544,7 +544,7 @@ def inverse_transform(self, X): Returns ------- - X_new : ndarray of shape (n_samples, n_features) + X_original : ndarray of shape (n_samples, n_features) Returns the instance itself. References diff --git a/sklearn/decomposition/_nmf.py b/sklearn/decomposition/_nmf.py index 45586370a042c..4c963538619a3 100644 --- a/sklearn/decomposition/_nmf.py +++ b/sklearn/decomposition/_nmf.py @@ -1302,7 +1302,7 @@ def inverse_transform(self, X): Returns ------- - X : ndarray of shape (n_samples, n_features) + X_original : ndarray of shape (n_samples, n_features) Returns a data matrix of the original shape. """ diff --git a/sklearn/feature_extraction/_dict_vectorizer.py b/sklearn/feature_extraction/_dict_vectorizer.py index a754b92824585..689146bd229d8 100644 --- a/sklearn/feature_extraction/_dict_vectorizer.py +++ b/sklearn/feature_extraction/_dict_vectorizer.py @@ -339,7 +339,7 @@ def inverse_transform(self, X, dict_type=dict): Returns ------- - D : list of dict_type objects of shape (n_samples,) + X_original : list of dict_type objects of shape (n_samples,) Feature mappings for the samples in X. """ check_is_fitted(self, "feature_names_") diff --git a/sklearn/feature_extraction/text.py b/sklearn/feature_extraction/text.py index 8d26539645866..eb3226b01c79e 100644 --- a/sklearn/feature_extraction/text.py +++ b/sklearn/feature_extraction/text.py @@ -1433,7 +1433,7 @@ def inverse_transform(self, X): Returns ------- - X_inv : list of arrays of shape (n_samples,) + X_original : list of arrays of shape (n_samples,) List of arrays of terms. """ self._check_vocabulary() diff --git a/sklearn/feature_selection/_base.py b/sklearn/feature_selection/_base.py index 065d9c7eed03a..56e50e49ca30c 100644 --- a/sklearn/feature_selection/_base.py +++ b/sklearn/feature_selection/_base.py @@ -141,7 +141,7 @@ def inverse_transform(self, X): Returns ------- - X_r : array of shape [n_samples, n_original_features] + X_original : array of shape [n_samples, n_original_features] `X` with columns of zeros inserted where features would have been removed by :meth:`transform`. """ diff --git a/sklearn/model_selection/_search.py b/sklearn/model_selection/_search.py index fe86a11c50267..869e2dcaf57e4 100644 --- a/sklearn/model_selection/_search.py +++ b/sklearn/model_selection/_search.py @@ -703,8 +703,8 @@ def inverse_transform(self, X): Returns ------- - X : {ndarray, sparse matrix} of shape (n_samples, n_features) - Result of the `inverse_transform` function for `Xt` based on the + X_original : {ndarray, sparse matrix} of shape (n_samples, n_features) + Result of the `inverse_transform` function for `X` based on the estimator with the best found parameters. """ check_is_fitted(self) diff --git a/sklearn/pipeline.py b/sklearn/pipeline.py index 122b9508da86a..9a61d06664da7 100644 --- a/sklearn/pipeline.py +++ b/sklearn/pipeline.py @@ -1120,7 +1120,7 @@ def inverse_transform(self, X, **params): Returns ------- - Xt : ndarray of shape (n_samples, n_features) + X_original : ndarray of shape (n_samples, n_features) Inverse transformed data, that is, data in the original feature space. """ diff --git a/sklearn/preprocessing/_data.py b/sklearn/preprocessing/_data.py index d671376b9330d..f9dd9b6b360db 100644 --- a/sklearn/preprocessing/_data.py +++ b/sklearn/preprocessing/_data.py @@ -575,7 +575,7 @@ def inverse_transform(self, X): Returns ------- - Xt : ndarray of shape (n_samples, n_features) + X_original : ndarray of shape (n_samples, n_features) Transformed data. """ check_is_fitted(self) @@ -1104,12 +1104,13 @@ def inverse_transform(self, X, copy=None): ---------- X : {array-like, sparse matrix} of shape (n_samples, n_features) The data used to scale along the features axis. + copy : bool, default=None - Copy the input X or not. + Copy the input `X` or not. Returns ------- - X_tr : {ndarray, sparse matrix} of shape (n_samples, n_features) + X_original : {ndarray, sparse matrix} of shape (n_samples, n_features) Transformed array. """ check_is_fitted(self) @@ -1351,7 +1352,7 @@ def inverse_transform(self, X): Returns ------- - X_tr : {ndarray, sparse matrix} of shape (n_samples, n_features) + X_original : {ndarray, sparse matrix} of shape (n_samples, n_features) Transformed array. """ check_is_fitted(self) @@ -1726,7 +1727,7 @@ def inverse_transform(self, X): Returns ------- - X_tr : {ndarray, sparse matrix} of shape (n_samples, n_features) + X_original : {ndarray, sparse matrix} of shape (n_samples, n_features) Transformed array. """ check_is_fitted(self) @@ -3017,7 +3018,7 @@ def inverse_transform(self, X): Returns ------- - Xt : {ndarray, sparse matrix} of (n_samples, n_features) + X_original : {ndarray, sparse matrix} of (n_samples, n_features) The projected data. """ check_is_fitted(self) @@ -3413,20 +3414,20 @@ def inverse_transform(self, X): The inverse of the Box-Cox transformation is given by:: if lambda_ == 0: - X = exp(X_trans) + X_original = exp(X_trans) else: - X = (X_trans * lambda_ + 1) ** (1 / lambda_) + X_original = (X * lambda_ + 1) ** (1 / lambda_) The inverse of the Yeo-Johnson transformation is given by:: if X >= 0 and lambda_ == 0: - X = exp(X_trans) - 1 + X_original = exp(X) - 1 elif X >= 0 and lambda_ != 0: - X = (X_trans * lambda_ + 1) ** (1 / lambda_) - 1 + X_original = (X * lambda_ + 1) ** (1 / lambda_) - 1 elif X < 0 and lambda_ != 2: - X = 1 - (-(2 - lambda_) * X_trans + 1) ** (1 / (2 - lambda_)) + X_original = 1 - (-(2 - lambda_) * X + 1) ** (1 / (2 - lambda_)) elif X < 0 and lambda_ == 2: - X = 1 - exp(-X_trans) + X_original = 1 - exp(-X) Parameters ---------- @@ -3435,7 +3436,7 @@ def inverse_transform(self, X): Returns ------- - X : ndarray of shape (n_samples, n_features) + X_original : ndarray of shape (n_samples, n_features) The original data. """ check_is_fitted(self) diff --git a/sklearn/preprocessing/_discretization.py b/sklearn/preprocessing/_discretization.py index 0cdfe225d163f..ef5081080bda1 100644 --- a/sklearn/preprocessing/_discretization.py +++ b/sklearn/preprocessing/_discretization.py @@ -494,7 +494,7 @@ def inverse_transform(self, X): Returns ------- - Xinv : ndarray, dtype={np.float32, np.float64} + X_original : ndarray, dtype={np.float32, np.float64} Data in the original feature space. """ diff --git a/sklearn/preprocessing/_encoders.py b/sklearn/preprocessing/_encoders.py index 86e0c991ab2a3..5f41c9d0c6d22 100644 --- a/sklearn/preprocessing/_encoders.py +++ b/sklearn/preprocessing/_encoders.py @@ -1104,7 +1104,7 @@ def inverse_transform(self, X): Returns ------- - X_tr : ndarray of shape (n_samples, n_features) + X_original : ndarray of shape (n_samples, n_features) Inverse transformed array. """ check_is_fitted(self) @@ -1622,7 +1622,7 @@ def inverse_transform(self, X): Returns ------- - X_tr : ndarray of shape (n_samples, n_features) + X_original : ndarray of shape (n_samples, n_features) Inverse transformed array. """ check_is_fitted(self) diff --git a/sklearn/preprocessing/_function_transformer.py b/sklearn/preprocessing/_function_transformer.py index 3fc33c59e76bd..0363f8c5b6120 100644 --- a/sklearn/preprocessing/_function_transformer.py +++ b/sklearn/preprocessing/_function_transformer.py @@ -325,7 +325,7 @@ def inverse_transform(self, X): Returns ------- - X_out : array-like, shape (n_samples, n_features) + X_original : array-like, shape (n_samples, n_features) Transformed input. """ if self.validate: diff --git a/sklearn/preprocessing/_label.py b/sklearn/preprocessing/_label.py index 14b7c7907d1eb..dd721b35a3521 100644 --- a/sklearn/preprocessing/_label.py +++ b/sklearn/preprocessing/_label.py @@ -143,7 +143,7 @@ def inverse_transform(self, y): Returns ------- - y : ndarray of shape (n_samples,) + y_original : ndarray of shape (n_samples,) Original encoding. """ check_is_fitted(self) @@ -389,7 +389,7 @@ def inverse_transform(self, Y, threshold=None): Returns ------- - y : {ndarray, sparse matrix} of shape (n_samples,) + y_original : {ndarray, sparse matrix} of shape (n_samples,) Target values. Sparse matrix will be of CSR format. Notes @@ -925,7 +925,7 @@ def inverse_transform(self, yt): Returns ------- - y : list of tuples + y_original : list of tuples The set of labels for each sample such that `y[i]` consists of `classes_[j]` for each `yt[i, j] == 1`. """ From a15578d4c4b9ddb84f7618d01ac79b379b190fc3 Mon Sep 17 00:00:00 2001 From: Dimitri Papadopoulos Orfanos <3234522+DimitriPapadopoulos@users.noreply.github.com> Date: Wed, 30 Apr 2025 12:56:30 +0200 Subject: [PATCH 100/182] MNT Avoid pre-commit failures (#31276) --- .pre-commit-config.yaml | 4 ++-- doc/whats_new/upcoming_changes/array-api/30819.feature.rst | 2 +- .../upcoming_changes/sklearn.inspection/31146.fix.rst | 2 +- examples/release_highlights/plot_release_highlights_1_1_0.py | 2 +- pyproject.toml | 2 +- sklearn/_min_dependencies.py | 2 +- 6 files changed, 7 insertions(+), 7 deletions(-) diff --git a/.pre-commit-config.yaml b/.pre-commit-config.yaml index 42f2445728028..48871d2a4abed 100644 --- a/.pre-commit-config.yaml +++ b/.pre-commit-config.yaml @@ -7,7 +7,7 @@ repos: - id: end-of-file-fixer - id: trailing-whitespace - repo: https://github.com/astral-sh/ruff-pre-commit - rev: v0.11.2 + rev: v0.11.7 hooks: - id: ruff args: ["--fix", "--output-format=full"] @@ -19,7 +19,7 @@ repos: files: sklearn/ additional_dependencies: [pytest==6.2.4] - repo: https://github.com/MarcoGorelli/cython-lint - rev: v0.15.0 + rev: v0.16.6 hooks: # TODO: add the double-quote-cython-strings hook when it's usability has improved: # possibility to pass a directory and use it as a check instead of auto-formatter. diff --git a/doc/whats_new/upcoming_changes/array-api/30819.feature.rst b/doc/whats_new/upcoming_changes/array-api/30819.feature.rst index fac6d32b00375..56955d73ae903 100644 --- a/doc/whats_new/upcoming_changes/array-api/30819.feature.rst +++ b/doc/whats_new/upcoming_changes/array-api/30819.feature.rst @@ -1,2 +1,2 @@ - :func:`sklearn.utils.extmath.randomized_svd` now support Array API compatible inputs. - By :user:`Connor Lane ` and :user:`Jérémie du Boisberranger `. \ No newline at end of file + By :user:`Connor Lane ` and :user:`Jérémie du Boisberranger `. diff --git a/doc/whats_new/upcoming_changes/sklearn.inspection/31146.fix.rst b/doc/whats_new/upcoming_changes/sklearn.inspection/31146.fix.rst index 105a5e093e693..2cd7d6eed61f5 100644 --- a/doc/whats_new/upcoming_changes/sklearn.inspection/31146.fix.rst +++ b/doc/whats_new/upcoming_changes/sklearn.inspection/31146.fix.rst @@ -1,4 +1,4 @@ - :func:`inspection.partial_dependence` now raises an informative error when passing an empty list as the `categorical_features` parameter. `None` should be used instead to indicate that no categorical features are present. - By :user:`Pedro Lopes `. \ No newline at end of file + By :user:`Pedro Lopes `. diff --git a/examples/release_highlights/plot_release_highlights_1_1_0.py b/examples/release_highlights/plot_release_highlights_1_1_0.py index da53ea6160894..fdb11f887f3db 100644 --- a/examples/release_highlights/plot_release_highlights_1_1_0.py +++ b/examples/release_highlights/plot_release_highlights_1_1_0.py @@ -1,4 +1,4 @@ -# ruff: noqa: CPY001, E501 +# ruff: noqa: CPY001 """ ======================================= Release Highlights for scikit-learn 1.1 diff --git a/pyproject.toml b/pyproject.toml index df5e7324833c4..8a1d710c4babc 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -83,7 +83,7 @@ tests = [ "pandas>=1.4.0", "pytest>=7.1.2", "pytest-cov>=2.9.0", - "ruff>=0.11.2", + "ruff>=0.11.7", "mypy>=1.15", "pyamg>=4.2.1", "polars>=0.20.30", diff --git a/sklearn/_min_dependencies.py b/sklearn/_min_dependencies.py index 7e7229d6350e5..eb69f66db1bcf 100644 --- a/sklearn/_min_dependencies.py +++ b/sklearn/_min_dependencies.py @@ -32,7 +32,7 @@ "memory_profiler": ("0.57.0", "benchmark, docs"), "pytest": (PYTEST_MIN_VERSION, "tests"), "pytest-cov": ("2.9.0", "tests"), - "ruff": ("0.11.2", "tests"), + "ruff": ("0.11.7", "tests"), "mypy": ("1.15", "tests"), "pyamg": ("4.2.1", "tests"), "polars": ("0.20.30", "docs, tests"), From ebf071e8feb0e4e196deee466d500e24a300c9c7 Mon Sep 17 00:00:00 2001 From: Dimitri Papadopoulos Orfanos <3234522+DimitriPapadopoulos@users.noreply.github.com> Date: Wed, 30 Apr 2025 12:58:03 +0200 Subject: [PATCH 101/182] MNT Avoid pre-commit failures (#31276) From 1eff92be756f6d0e99807a5b9b4ee6a292523b52 Mon Sep 17 00:00:00 2001 From: Dimitri Papadopoulos Orfanos <3234522+DimitriPapadopoulos@users.noreply.github.com> Date: Wed, 30 Apr 2025 12:58:41 +0200 Subject: [PATCH 102/182] DOC Fix typos found by codespell (#31277) --- build_tools/codespell_ignore_words.txt | 3 +++ examples/feature_selection/plot_rfe_with_cross_validation.py | 4 ++-- pyproject.toml | 2 +- 3 files changed, 6 insertions(+), 3 deletions(-) diff --git a/build_tools/codespell_ignore_words.txt b/build_tools/codespell_ignore_words.txt index 48dd5bdcb9568..6b942a2eabe6d 100644 --- a/build_tools/codespell_ignore_words.txt +++ b/build_tools/codespell_ignore_words.txt @@ -5,6 +5,7 @@ ba basf boun bre +bu cach chanel complies @@ -30,11 +31,13 @@ lamas linke lod mape +mis mor nd nmae ocur pullrequest +repid ro ser soler diff --git a/examples/feature_selection/plot_rfe_with_cross_validation.py b/examples/feature_selection/plot_rfe_with_cross_validation.py index 16e4a0e9454c5..951b82bffa46d 100644 --- a/examples/feature_selection/plot_rfe_with_cross_validation.py +++ b/examples/feature_selection/plot_rfe_with_cross_validation.py @@ -110,6 +110,6 @@ features_selected = np.ma.compressed(np.ma.masked_array(feat_names, mask=1 - mask)) print(f"Features selected in fold {i}: {features_selected}") # %% -# In the five folds, the selected features are consistant. This is good news, -# it means that the selection is stable accross folds, and it confirms that +# In the five folds, the selected features are consistent. This is good news, +# it means that the selection is stable across folds, and it confirms that # these features are the most informative ones. diff --git a/pyproject.toml b/pyproject.toml index 8a1d710c4babc..9a1c7c96241c7 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -276,7 +276,7 @@ package = "sklearn" # name of your package whatsnew_pattern = 'doc/whatsnew/upcoming_changes/[^/]+/\d+\.[^.]+\.rst' [tool.codespell] -skip = ["./.git", "./.mypy_cache", "./sklearn/feature_extraction/_stop_words.py", "./doc/_build", "./doc/auto_examples", "./doc/modules/generated"] +skip = ["./.git", "*.svg", "./.mypy_cache", "./sklearn/feature_extraction/_stop_words.py", "./sklearn/feature_extraction/tests/test_text.py", "./build_tools/wheels/LICENSE_windows.txt", "./doc/_build", "./doc/auto_examples", "./doc/modules/generated"] ignore-words = "build_tools/codespell_ignore_words.txt" [tool.towncrier] From 46727eff52b57f3767a1828dfa4ca55456a25920 Mon Sep 17 00:00:00 2001 From: Christian Lorentzen Date: Wed, 30 Apr 2025 14:37:38 +0200 Subject: [PATCH 103/182] ENH add X_val and y_val to HGBT.fit (#27124) --- .../sklearn.ensemble/27124.feature.rst | 6 + .../gradient_boosting.py | 109 +++++++++++++++--- .../tests/test_gradient_boosting.py | 96 ++++++++++++++- 3 files changed, 193 insertions(+), 18 deletions(-) create mode 100644 doc/whats_new/upcoming_changes/sklearn.ensemble/27124.feature.rst diff --git a/doc/whats_new/upcoming_changes/sklearn.ensemble/27124.feature.rst b/doc/whats_new/upcoming_changes/sklearn.ensemble/27124.feature.rst new file mode 100644 index 0000000000000..2087efb00d779 --- /dev/null +++ b/doc/whats_new/upcoming_changes/sklearn.ensemble/27124.feature.rst @@ -0,0 +1,6 @@ +- :class:`ensemble.HistGradientBoostingClassifier` and + :class:`ensemble.HistGradientBoostingRegressor` allow for more control over the + validation set used for early stopping. You can now pass data to be used for + validation directly to `fit` via the arguments `X_val`, `y_val` and + `sample_weight_val`. + By :user:`Christian Lorentzen `. diff --git a/sklearn/ensemble/_hist_gradient_boosting/gradient_boosting.py b/sklearn/ensemble/_hist_gradient_boosting/gradient_boosting.py index 4ed20074bcc5a..064391abab24d 100644 --- a/sklearn/ensemble/_hist_gradient_boosting/gradient_boosting.py +++ b/sklearn/ensemble/_hist_gradient_boosting/gradient_boosting.py @@ -421,8 +421,8 @@ def _check_categorical_features(self, X): ) n_features = X.shape[1] - # At this point `_validate_data` was not called yet because we want to use the - # dtypes are used to discover the categorical features. Thus `feature_names_in_` + # At this point `validate_data` was not called yet because we use the original + # dtypes to discover the categorical features. Thus `feature_names_in_` # is not defined yet. feature_names_in_ = getattr(X, "columns", None) @@ -508,7 +508,16 @@ def _check_interaction_cst(self, n_features): return constraints @_fit_context(prefer_skip_nested_validation=True) - def fit(self, X, y, sample_weight=None): + def fit( + self, + X, + y, + sample_weight=None, + *, + X_val=None, + y_val=None, + sample_weight_val=None, + ): """Fit the gradient boosting model. Parameters @@ -524,6 +533,23 @@ def fit(self, X, y, sample_weight=None): .. versionadded:: 0.23 + X_val : array-like of shape (n_val, n_features) + Additional sample of features for validation used in early stopping. + In a `Pipeline`, `X_val` can be transformed the same way as `X` with + `Pipeline(..., transform_input=["X_val"])`. + + .. versionadded:: 1.7 + + y_val : array-like of shape (n_samples,) + Additional sample of target values for validation used in early stopping. + + .. versionadded:: 1.7 + + sample_weight_val : array-like of shape (n_samples,) default=None + Additional weights for validation used in early stopping. + + .. versionadded:: 1.7 + Returns ------- self : object @@ -548,6 +574,30 @@ def fit(self, X, y, sample_weight=None): sample_weight = self._finalize_sample_weight(sample_weight, y) + validation_data_provided = X_val is not None or y_val is not None + if validation_data_provided: + if y_val is None: + raise ValueError("X_val is provided, but y_val was not provided.") + if X_val is None: + raise ValueError("y_val is provided, but X_val was not provided.") + X_val = self._preprocess_X(X_val, reset=False) + y_val = _check_y(y_val, estimator=self) + y_val = self._encode_y_val(y_val) + check_consistent_length(X_val, y_val) + if sample_weight_val is not None: + sample_weight_val = _check_sample_weight( + sample_weight_val, X_val, dtype=np.float64 + ) + if self.early_stopping is False: + raise ValueError( + "X_val and y_val are passed to fit while at the same time " + "early_stopping is False. When passing X_val and y_val to fit," + "early_stopping should be set to either 'auto' or True." + ) + + # Note: At this point, we could delete self._label_encoder if it exists. + # But we don't to keep the code even simpler. + rng = check_random_state(self.random_state) # When warm starting, we want to reuse the same seed that was used @@ -598,13 +648,19 @@ def fit(self, X, y, sample_weight=None): self._loss = self.loss if self.early_stopping == "auto": - self.do_early_stopping_ = n_samples > 10000 + self.do_early_stopping_ = n_samples > 10_000 else: self.do_early_stopping_ = self.early_stopping # create validation data if needed - self._use_validation_data = self.validation_fraction is not None - if self.do_early_stopping_ and self._use_validation_data: + self._use_validation_data = ( + self.validation_fraction is not None or validation_data_provided + ) + if ( + self.do_early_stopping_ + and self._use_validation_data + and not validation_data_provided + ): # stratify for classification # instead of checking predict_proba, loss.n_classes >= 2 would also work stratify = y if hasattr(self._loss, "predict_proba") else None @@ -642,7 +698,8 @@ def fit(self, X, y, sample_weight=None): ) else: X_train, y_train, sample_weight_train = X, y, sample_weight - X_val = y_val = sample_weight_val = None + if not validation_data_provided: + X_val = y_val = sample_weight_val = None # Bin the data # For ease of use of the API, the user-facing GBDT classes accept the @@ -1397,7 +1454,11 @@ def _get_loss(self, sample_weight): @abstractmethod def _encode_y(self, y=None): - pass + pass # pragma: no cover + + @abstractmethod + def _encode_y_val(self, y=None): + pass # pragma: no cover @property def n_iter_(self): @@ -1574,8 +1635,8 @@ class HistGradientBoostingRegressor(RegressorMixin, BaseHistGradientBoosting): See :term:`the Glossary `. early_stopping : 'auto' or bool, default='auto' If 'auto', early stopping is enabled if the sample size is larger than - 10000. If True, early stopping is enabled, otherwise early stopping is - disabled. + 10000 or if `X_val` and `y_val` are passed to `fit`. If True, early stopping + is enabled, otherwise early stopping is disabled. .. versionadded:: 0.23 @@ -1593,7 +1654,9 @@ class HistGradientBoostingRegressor(RegressorMixin, BaseHistGradientBoosting): validation_fraction : int or float or None, default=0.1 Proportion (or absolute size) of training data to set aside as validation data for early stopping. If None, early stopping is done on - the training data. Only used if early stopping is performed. + the training data. + The value is ignored if either early stopping is not performed, e.g. + `early_stopping=False`, or if `X_val` and `y_val` are passed to fit. n_iter_no_change : int, default=10 Used to determine when to "early stop". The fitting process is stopped when none of the last ``n_iter_no_change`` scores are better @@ -1795,6 +1858,9 @@ def _encode_y(self, y): ) return y + def _encode_y_val(self, y=None): + return self._encode_y(y) + def _get_loss(self, sample_weight): if self.loss == "quantile": return _LOSSES[self.loss]( @@ -1963,8 +2029,8 @@ class HistGradientBoostingClassifier(ClassifierMixin, BaseHistGradientBoosting): See :term:`the Glossary `. early_stopping : 'auto' or bool, default='auto' If 'auto', early stopping is enabled if the sample size is larger than - 10000. If True, early stopping is enabled, otherwise early stopping is - disabled. + 10000 or if `X_val` and `y_val` are passed to `fit`. If True, early stopping + is enabled, otherwise early stopping is disabled. .. versionadded:: 0.23 @@ -1981,7 +2047,9 @@ class HistGradientBoostingClassifier(ClassifierMixin, BaseHistGradientBoosting): validation_fraction : int or float or None, default=0.1 Proportion (or absolute size) of training data to set aside as validation data for early stopping. If None, early stopping is done on - the training data. Only used if early stopping is performed. + the training data. + The value is ignored if either early stopping is not performed, e.g. + `early_stopping=False`, or if `X_val` and `y_val` are passed to fit. n_iter_no_change : int, default=10 Used to determine when to "early stop". The fitting process is stopped when none of the last ``n_iter_no_change`` scores are better @@ -2272,13 +2340,16 @@ def staged_decision_function(self, X): yield staged_decision def _encode_y(self, y): + """Create self._label_encoder and encode y correspondingly.""" # encode classes into 0 ... n_classes - 1 and sets attributes classes_ # and n_trees_per_iteration_ check_classification_targets(y) - label_encoder = LabelEncoder() - encoded_y = label_encoder.fit_transform(y) - self.classes_ = label_encoder.classes_ + # We need to store the label encoder in case y_val needs to be label encoded, + # too. + self._label_encoder = LabelEncoder() + encoded_y = self._label_encoder.fit_transform(y) + self.classes_ = self._label_encoder.classes_ n_classes = self.classes_.shape[0] # only 1 tree for binary classification. For multiclass classification, # we build 1 tree per class. @@ -2286,6 +2357,10 @@ def _encode_y(self, y): encoded_y = encoded_y.astype(Y_DTYPE, copy=False) return encoded_y + def _encode_y_val(self, y): + encoded_y = self._label_encoder.transform(y) + return encoded_y.astype(Y_DTYPE, copy=False) + def _get_loss(self, sample_weight): # At this point self.loss == "log_loss" if self.n_trees_per_iteration_ == 1: diff --git a/sklearn/ensemble/_hist_gradient_boosting/tests/test_gradient_boosting.py b/sklearn/ensemble/_hist_gradient_boosting/tests/test_gradient_boosting.py index 9a625ba7af76a..7dde25f3d22df 100644 --- a/sklearn/ensemble/_hist_gradient_boosting/tests/test_gradient_boosting.py +++ b/sklearn/ensemble/_hist_gradient_boosting/tests/test_gradient_boosting.py @@ -35,7 +35,7 @@ from sklearn.model_selection import cross_val_score, train_test_split from sklearn.pipeline import make_pipeline from sklearn.preprocessing import KBinsDiscretizer, MinMaxScaler, OneHotEncoder -from sklearn.utils import shuffle +from sklearn.utils import check_random_state, shuffle from sklearn.utils._openmp_helpers import _openmp_effective_n_threads from sklearn.utils._testing import _convert_container from sklearn.utils.fixes import _IS_32BIT @@ -1450,6 +1450,100 @@ def test_unknown_category_that_are_negative(): assert_allclose(hist.predict(X_test_neg), hist.predict(X_test_nan)) +@pytest.mark.parametrize( + ("GradientBoosting", "make_X_y"), + [ + (HistGradientBoostingClassifier, make_classification), + (HistGradientBoostingRegressor, make_regression), + ], +) +@pytest.mark.parametrize("sample_weight", [False, True]) +def test_X_val_in_fit(GradientBoosting, make_X_y, sample_weight, global_random_seed): + """Test that passing X_val, y_val in fit is same as validation fraction.""" + rng = np.random.RandomState(42) + n_samples = 100 + X, y = make_X_y(n_samples=n_samples, random_state=rng) + if sample_weight: + sample_weight = np.abs(rng.normal(size=n_samples)) + data = (X, y, sample_weight) + else: + sample_weight = None + data = (X, y) + rng_seed = global_random_seed + + # Fit with validation fraction and early stopping. + m1 = GradientBoosting( + early_stopping=True, + validation_fraction=0.5, + random_state=rng_seed, + ) + m1.fit(X, y, sample_weight) + + # Do train-test split ourselves. + rng = check_random_state(rng_seed) + # We do the same as in the fit method. + stratify = y if isinstance(m1, HistGradientBoostingClassifier) else None + random_seed = rng.randint(np.iinfo(np.uint32).max, dtype="u8") + X_train, X_val, y_train, y_val, *sw = train_test_split( + *data, + test_size=0.5, + stratify=stratify, + random_state=random_seed, + ) + if sample_weight is not None: + sample_weight_train = sw[0] + sample_weight_val = sw[1] + else: + sample_weight_train = None + sample_weight_val = None + m2 = GradientBoosting( + early_stopping=True, + random_state=rng_seed, + ) + m2.fit( + X_train, + y_train, + sample_weight=sample_weight_train, + X_val=X_val, + y_val=y_val, + sample_weight_val=sample_weight_val, + ) + + assert_allclose(m2.n_iter_, m1.n_iter_) + assert_allclose(m2.predict(X), m1.predict(X)) + + +def test_X_val_raises_missing_y_val(): + """Test that an error is raised if X_val given but y_val None.""" + X, y = make_classification(n_samples=4) + X, X_val = X[:2], X[2:] + y, y_val = y[:2], y[2:] + with pytest.raises( + ValueError, + match="X_val is provided, but y_val was not provided", + ): + HistGradientBoostingClassifier().fit(X, y, X_val=X_val) + with pytest.raises( + ValueError, + match="y_val is provided, but X_val was not provided", + ): + HistGradientBoostingClassifier().fit(X, y, y_val=y_val) + + +def test_X_val_raises_with_early_stopping_false(): + """Test that an error is raised if X_val given but early_stopping is False.""" + X, y = make_regression(n_samples=4) + X, X_val = X[:2], X[2:] + y, y_val = y[:2], y[2:] + with pytest.raises( + ValueError, + match="X_val and y_val are passed to fit while at the same time", + ): + HistGradientBoostingRegressor(early_stopping=False).fit( + X, y, X_val=X_val, y_val=y_val + ) + + @pytest.mark.parametrize("dataframe_lib", ["pandas", "polars"]) @pytest.mark.parametrize( "HistGradientBoosting", From d042d68dbe482e22b60a20242cd34b8ca7d60ffb Mon Sep 17 00:00:00 2001 From: Dimitri Papadopoulos Orfanos <3234522+DimitriPapadopoulos@users.noreply.github.com> Date: Wed, 30 Apr 2025 15:04:20 +0200 Subject: [PATCH 104/182] MNT Apply ruff/flake8-executable rules (EXE) (#31063) --- doc/sphinxext/allow_nan_estimators.py | 0 examples/miscellaneous/plot_pipeline_display.py | 0 sklearn/_build_utils/version.py | 0 sklearn/cluster/_optics.py | 0 sklearn/ensemble/tests/test_weight_boosting.py | 0 5 files changed, 0 insertions(+), 0 deletions(-) mode change 100755 => 100644 doc/sphinxext/allow_nan_estimators.py mode change 100755 => 100644 examples/miscellaneous/plot_pipeline_display.py mode change 100644 => 100755 sklearn/_build_utils/version.py mode change 100755 => 100644 sklearn/cluster/_optics.py mode change 100755 => 100644 sklearn/ensemble/tests/test_weight_boosting.py diff --git a/doc/sphinxext/allow_nan_estimators.py b/doc/sphinxext/allow_nan_estimators.py old mode 100755 new mode 100644 diff --git a/examples/miscellaneous/plot_pipeline_display.py b/examples/miscellaneous/plot_pipeline_display.py old mode 100755 new mode 100644 diff --git a/sklearn/_build_utils/version.py b/sklearn/_build_utils/version.py old mode 100644 new mode 100755 diff --git a/sklearn/cluster/_optics.py b/sklearn/cluster/_optics.py old mode 100755 new mode 100644 diff --git a/sklearn/ensemble/tests/test_weight_boosting.py b/sklearn/ensemble/tests/test_weight_boosting.py old mode 100755 new mode 100644 From 4985e693eeed4f78738f63bbf54f8b31ecb4d5f8 Mon Sep 17 00:00:00 2001 From: Rahil Parikh <75483881+rprkh@users.noreply.github.com> Date: Wed, 30 Apr 2025 08:26:50 -0700 Subject: [PATCH 105/182] ENH `check_classification_targets` raises a warning when unique classes > 50% of `n_samples` (#26335) Co-authored-by: Guillaume Lemaitre Co-authored-by: adrinjalali Co-authored-by: Tim Head --- .../sklearn.utils/26335.enhancement.rst | 4 ++++ sklearn/utils/multiclass.py | 11 +++++++++- sklearn/utils/tests/test_multiclass.py | 20 +++++++++++++++++++ 3 files changed, 34 insertions(+), 1 deletion(-) create mode 100644 doc/whats_new/upcoming_changes/sklearn.utils/26335.enhancement.rst diff --git a/doc/whats_new/upcoming_changes/sklearn.utils/26335.enhancement.rst b/doc/whats_new/upcoming_changes/sklearn.utils/26335.enhancement.rst new file mode 100644 index 0000000000000..e5bf047cd5db9 --- /dev/null +++ b/doc/whats_new/upcoming_changes/sklearn.utils/26335.enhancement.rst @@ -0,0 +1,4 @@ +- |Enhancement| :func:`utils.multiclass.type_of_target` raises a warning when the number + of unique classes is greater than 50% of the number of samples. This warning is raised + only if `y` has more than 20 samples. + By :user:`Rahil Parikh `. diff --git a/sklearn/utils/multiclass.py b/sklearn/utils/multiclass.py index 15d1428ce2ad7..3a81e2b9eb6fe 100644 --- a/sklearn/utils/multiclass.py +++ b/sklearn/utils/multiclass.py @@ -413,7 +413,16 @@ def _raise_or_return(): # Check multiclass if issparse(first_row_or_val): first_row_or_val = first_row_or_val.data - if cached_unique(y).shape[0] > 2 or (y.ndim == 2 and len(first_row_or_val) > 1): + classes = cached_unique(y) + if y.shape[0] > 20 and classes.shape[0] > round(0.5 * y.shape[0]): + # Only raise the warning when we have at least 20 samples. + warnings.warn( + "The number of unique classes is greater than 50% of the number " + "of samples.", + UserWarning, + stacklevel=2, + ) + if classes.shape[0] > 2 or (y.ndim == 2 and len(first_row_or_val) > 1): # [1, 2, 3] or [[1., 2., 3]] or [[1, 2]] return "multiclass" + suffix else: diff --git a/sklearn/utils/tests/test_multiclass.py b/sklearn/utils/tests/test_multiclass.py index b400d675e5687..433e8118923fb 100644 --- a/sklearn/utils/tests/test_multiclass.py +++ b/sklearn/utils/tests/test_multiclass.py @@ -1,3 +1,4 @@ +import warnings from itertools import product import numpy as np @@ -294,6 +295,25 @@ def test_unique_labels(): assert_array_equal(unique_labels(np.ones((4, 5)), np.ones((5, 5))), np.arange(5)) +def test_type_of_target_too_many_unique_classes(): + """Check that we raise a warning when the number of unique classes is greater than + 50% of the number of samples. + + We need to check that we don't raise if we have less than 20 samples. + """ + + y = np.arange(25) + msg = r"The number of unique classes is greater than 50% of the number of samples." + with pytest.warns(UserWarning, match=msg): + type_of_target(y) + + # less than 20 samples, no warning should be raised + y = np.arange(10) + with warnings.catch_warnings(): + warnings.simplefilter("error") + type_of_target(y) + + def test_unique_labels_non_specific(): # Test unique_labels with a variety of collected examples From 1527b1fe98d129f85f9a3c5cd0358214247d236b Mon Sep 17 00:00:00 2001 From: Arturo Amor <86408019+ArturoAmorQ@users.noreply.github.com> Date: Thu, 1 May 2025 11:31:32 +0200 Subject: [PATCH 106/182] DOC Rework voting classifier example (#30985) Co-authored-by: ArturoAmorQ Co-authored-by: Olivier Grisel Co-authored-by: Lucy Liu --- doc/conf.py | 3 + doc/modules/ensemble.rst | 41 +--- .../ensemble/plot_voting_decision_regions.py | 229 ++++++++++++++---- examples/ensemble/plot_voting_probas.py | 97 -------- 4 files changed, 199 insertions(+), 171 deletions(-) delete mode 100644 examples/ensemble/plot_voting_probas.py diff --git a/doc/conf.py b/doc/conf.py index aea5d52b53da4..1113d4b2c100a 100644 --- a/doc/conf.py +++ b/doc/conf.py @@ -491,6 +491,9 @@ def add_js_css_files(app, pagename, templatename, context, doctree): "auto_examples/ensemble/plot_forest_importances_faces": ( "auto_examples/ensemble/plot_forest_importances" ), + "auto_examples/ensemble/plot_voting_probas": ( + "auto_examples/ensemble/plot_voting_decision_regions" + ), "auto_examples/datasets/plot_iris_dataset": ( "auto_examples/decomposition/plot_pca_iris" ), diff --git a/doc/modules/ensemble.rst b/doc/modules/ensemble.rst index 35ef9f6d7bbfc..b336a25d8048d 100644 --- a/doc/modules/ensemble.rst +++ b/doc/modules/ensemble.rst @@ -1410,40 +1410,17 @@ classifier 3 w3 * 0.3 w3 * 0.4 w3 * 0.3 weighted average 0.37 0.4 0.23 ================ ========== ========== ========== -Here, the predicted class label is 2, since it has the highest average probability. See -this example on :ref:`Visualising class probabilities in a Voting Classifier -` for a detailed illustration of -class probabilities averaged by soft voting. +Here, the predicted class label is 2, since it has the highest average +predicted probability. See the example on +:ref:`sphx_glr_auto_examples_ensemble_plot_voting_decision_regions.py` for a +demonstration of how the predicted class label can be obtained from the weighted +average of predicted probabilities. -Also, the following example illustrates how the decision regions may change -when a soft :class:`VotingClassifier` is used based on a linear Support -Vector Machine, a Decision Tree, and a K-nearest neighbor classifier:: +The following figure illustrates how the decision regions may change when +a soft :class:`VotingClassifier` is trained with weights on three linear +models: - >>> from sklearn import datasets - >>> from sklearn.tree import DecisionTreeClassifier - >>> from sklearn.neighbors import KNeighborsClassifier - >>> from sklearn.svm import SVC - >>> from itertools import product - >>> from sklearn.ensemble import VotingClassifier - - >>> # Loading some example data - >>> iris = datasets.load_iris() - >>> X = iris.data[:, [0, 2]] - >>> y = iris.target - - >>> # Training classifiers - >>> clf1 = DecisionTreeClassifier(max_depth=4) - >>> clf2 = KNeighborsClassifier(n_neighbors=7) - >>> clf3 = SVC(kernel='rbf', probability=True) - >>> eclf = VotingClassifier(estimators=[('dt', clf1), ('knn', clf2), ('svc', clf3)], - ... voting='soft', weights=[2, 1, 2]) - - >>> clf1 = clf1.fit(X, y) - >>> clf2 = clf2.fit(X, y) - >>> clf3 = clf3.fit(X, y) - >>> eclf = eclf.fit(X, y) - -.. figure:: ../auto_examples/ensemble/images/sphx_glr_plot_voting_decision_regions_001.png +.. figure:: ../auto_examples/ensemble/images/sphx_glr_plot_voting_decision_regions_002.png :target: ../auto_examples/ensemble/plot_voting_decision_regions.html :align: center :scale: 75% diff --git a/examples/ensemble/plot_voting_decision_regions.py b/examples/ensemble/plot_voting_decision_regions.py index d40d831fb911f..57f3f4b22b947 100644 --- a/examples/ensemble/plot_voting_decision_regions.py +++ b/examples/ensemble/plot_voting_decision_regions.py @@ -1,55 +1,111 @@ """ -================================================== -Plot the decision boundaries of a VotingClassifier -================================================== +=============================================================== +Visualizing the probabilistic predictions of a VotingClassifier +=============================================================== .. currentmodule:: sklearn -Plot the decision boundaries of a :class:`~ensemble.VotingClassifier` for two -features of the Iris dataset. +Plot the predicted class probabilities in a toy dataset predicted by three +different classifiers and averaged by the :class:`~ensemble.VotingClassifier`. -Plot the class probabilities of the first sample in a toy dataset predicted by -three different classifiers and averaged by the -:class:`~ensemble.VotingClassifier`. +First, three linear classifiers are initialized. Two are spline models with +interaction terms, one using constant extrapolation and the other using periodic +extrapolation. The third classifier is a :class:`~kernel_approximation.Nystroem` +with the default "rbf" kernel. -First, three exemplary classifiers are initialized -(:class:`~tree.DecisionTreeClassifier`, -:class:`~neighbors.KNeighborsClassifier`, and :class:`~svm.SVC`) and used to -initialize a soft-voting :class:`~ensemble.VotingClassifier` with weights `[2, -1, 2]`, which means that the predicted probabilities of the -:class:`~tree.DecisionTreeClassifier` and :class:`~svm.SVC` each count 2 times -as much as the weights of the :class:`~neighbors.KNeighborsClassifier` -classifier when the averaged probability is calculated. +In the first part of this example, these three classifiers are used to +demonstrate soft-voting using :class:`~ensemble.VotingClassifier` with weighted +average. We set `weights=[2, 1, 3]`, meaning the constant extrapolation spline +model's predictions are weighted twice as much as the periodic spline model's, +and the Nystroem model's predictions are weighted three times as much as the +periodic spline. + +The second part demonstrates how soft predictions can be converted into hard +predictions. """ # Authors: The scikit-learn developers # SPDX-License-Identifier: BSD-3-Clause -from itertools import product +# %% +# We first generate a noisy XOR dataset, which is a binary classification task. import matplotlib.pyplot as plt +import numpy as np +import pandas as pd +from matplotlib.colors import ListedColormap + +n_samples = 500 +rng = np.random.default_rng(0) +feature_names = ["Feature #0", "Feature #1"] +common_scatter_plot_params = dict( + cmap=ListedColormap(["tab:red", "tab:blue"]), + edgecolor="white", + linewidth=1, +) + +xor = pd.DataFrame( + np.random.RandomState(0).uniform(low=-1, high=1, size=(n_samples, 2)), + columns=feature_names, +) +noise = rng.normal(loc=0, scale=0.1, size=(n_samples, 2)) +target_xor = np.logical_xor( + xor["Feature #0"] + noise[:, 0] > 0, xor["Feature #1"] + noise[:, 1] > 0 +) + +X = xor[feature_names] +y = target_xor.astype(np.int32) + +fig, ax = plt.subplots() +ax.scatter(X["Feature #0"], X["Feature #1"], c=y, **common_scatter_plot_params) +ax.set_title("The XOR dataset") +plt.show() + +# %% +# Due to the inherent non-linear separability of the XOR dataset, tree-based +# models would often be preferred. However, appropriate feature engineering +# combined with a linear model can yield effective results, with the added +# benefit of producing better-calibrated probabilities for samples located in +# the transition regions affected by noise. +# +# We define and fit the models on the whole dataset. -from sklearn import datasets from sklearn.ensemble import VotingClassifier -from sklearn.inspection import DecisionBoundaryDisplay -from sklearn.neighbors import KNeighborsClassifier -from sklearn.svm import SVC -from sklearn.tree import DecisionTreeClassifier - -# Loading some example data -iris = datasets.load_iris() -X = iris.data[:, [0, 2]] -y = iris.target - -# Training classifiers -clf1 = DecisionTreeClassifier(max_depth=4) -clf2 = KNeighborsClassifier(n_neighbors=7) -clf3 = SVC(gamma=0.1, kernel="rbf", probability=True) +from sklearn.kernel_approximation import Nystroem +from sklearn.linear_model import LogisticRegression +from sklearn.pipeline import make_pipeline +from sklearn.preprocessing import PolynomialFeatures, SplineTransformer, StandardScaler + +clf1 = make_pipeline( + SplineTransformer(degree=2, n_knots=2), + PolynomialFeatures(interaction_only=True), + LogisticRegression(C=10), +) +clf2 = make_pipeline( + SplineTransformer( + degree=2, + n_knots=4, + extrapolation="periodic", + include_bias=True, + ), + PolynomialFeatures(interaction_only=True), + LogisticRegression(C=10), +) +clf3 = make_pipeline( + StandardScaler(), + Nystroem(gamma=2, random_state=0), + LogisticRegression(C=10), +) +weights = [2, 1, 3] eclf = VotingClassifier( - estimators=[("dt", clf1), ("knn", clf2), ("svc", clf3)], + estimators=[ + ("constant splines model", clf1), + ("periodic splines model", clf2), + ("nystroem model", clf3), + ], voting="soft", - weights=[2, 1, 2], + weights=weights, ) clf1.fit(X, y) @@ -57,17 +113,106 @@ clf3.fit(X, y) eclf.fit(X, y) -# Plotting decision regions -f, axarr = plt.subplots(2, 2, sharex="col", sharey="row", figsize=(10, 8)) -for idx, clf, tt in zip( +# %% +# Finally we use :class:`~inspection.DecisionBoundaryDisplay` to plot the +# predicted probabilities. By using a diverging colormap (such as `"RdBu"`), we +# can ensure that darker colors correspond to `predict_proba` close to either 0 +# or 1, and white corresponds to `predict_proba` of 0.5. + +from itertools import product + +from sklearn.inspection import DecisionBoundaryDisplay + +fig, axarr = plt.subplots(2, 2, sharex="col", sharey="row", figsize=(10, 8)) +for idx, clf, title in zip( product([0, 1], [0, 1]), [clf1, clf2, clf3, eclf], - ["Decision Tree (depth=4)", "KNN (k=7)", "Kernel SVM", "Soft Voting"], + [ + "Splines with\nconstant extrapolation", + "Splines with\nperiodic extrapolation", + "RBF Nystroem", + "Soft Voting", + ], ): - DecisionBoundaryDisplay.from_estimator( - clf, X, alpha=0.4, ax=axarr[idx[0], idx[1]], response_method="predict" + disp = DecisionBoundaryDisplay.from_estimator( + clf, + X, + response_method="predict_proba", + plot_method="pcolormesh", + cmap="RdBu", + alpha=0.8, + ax=axarr[idx[0], idx[1]], + ) + axarr[idx[0], idx[1]].scatter( + X["Feature #0"], + X["Feature #1"], + c=y, + **common_scatter_plot_params, ) - axarr[idx[0], idx[1]].scatter(X[:, 0], X[:, 1], c=y, s=20, edgecolor="k") - axarr[idx[0], idx[1]].set_title(tt) + axarr[idx[0], idx[1]].set_title(title) + fig.colorbar(disp.surface_, ax=axarr[idx[0], idx[1]], label="Probability estimate") plt.show() + +# %% +# As a sanity check, we can verify for a given sample that the probability +# predicted by the :class:`~ensemble.VotingClassifier` is indeed the weighted +# average of the individual classifiers' soft-predictions. +# +# In the case of binary classification such as in the present example, the +# :term:`predict_proba` arrays contain the probability of belonging to class 0 +# (here in red) as the first entry, and the probability of belonging to class 1 +# (here in blue) as the second entry. + +test_sample = pd.DataFrame({"Feature #0": [-0.5], "Feature #1": [1.5]}) +predict_probas = [est.predict_proba(test_sample).ravel() for est in eclf.estimators_] +for (est_name, _), est_probas in zip(eclf.estimators, predict_probas): + print(f"{est_name}'s predicted probabilities: {est_probas}") + +# %% +print( + "Weighted average of soft-predictions: " + f"{np.dot(weights, predict_probas) / np.sum(weights)}" +) + +# %% +# We can see that manual calculation of predicted probabilities above is +# equivalent to that produced by the `VotingClassifier`: + +print( + "Predicted probability of VotingClassifier: " + f"{eclf.predict_proba(test_sample).ravel()}" +) + +# %% +# To convert soft predictions into hard predictions when weights are provided, +# the weighted average predicted probabilities are computed for each class. +# Then, the final class label is then derived from the class label with the +# highest average probability, which corresponds to the default threshold at +# `predict_proba=0.5` in the case of binary classification. + +print( + "Class with the highest weighted average of soft-predictions: " + f"{np.argmax(np.dot(weights, predict_probas) / np.sum(weights))}" +) + +# %% +# This is equivalent to the output of `VotingClassifier`'s `predict` method: + +print(f"Predicted class of VotingClassifier: {eclf.predict(test_sample).ravel()}") + +# %% +# Soft votes can be thresholded as for any other probabilistic classifier. This +# allows you to set a threshold probability at which the positive class will be +# predicted, instead of simply selecting the class with the highest predicted +# probability. + +from sklearn.model_selection import FixedThresholdClassifier + +eclf_other_threshold = FixedThresholdClassifier( + eclf, threshold=0.7, response_method="predict_proba" +).fit(X, y) +print( + "Predicted class of thresholded VotingClassifier: " + f"{eclf_other_threshold.predict(test_sample)}" +) diff --git a/examples/ensemble/plot_voting_probas.py b/examples/ensemble/plot_voting_probas.py deleted file mode 100644 index 848358ca1d208..0000000000000 --- a/examples/ensemble/plot_voting_probas.py +++ /dev/null @@ -1,97 +0,0 @@ -""" -=========================================================== -Plot class probabilities calculated by the VotingClassifier -=========================================================== - -.. currentmodule:: sklearn - -Plot the class probabilities of the first sample in a toy dataset predicted by -three different classifiers and averaged by the -:class:`~ensemble.VotingClassifier`. - -First, three exemplary classifiers are initialized -(:class:`~linear_model.LogisticRegression`, :class:`~naive_bayes.GaussianNB`, -and :class:`~ensemble.RandomForestClassifier`) and used to initialize a -soft-voting :class:`~ensemble.VotingClassifier` with weights `[1, 1, 5]`, which -means that the predicted probabilities of the -:class:`~ensemble.RandomForestClassifier` count 5 times as much as the weights -of the other classifiers when the averaged probability is calculated. - -To visualize the probability weighting, we fit each classifier on the training -set and plot the predicted class probabilities for the first sample in this -example dataset. - -""" - -# Authors: The scikit-learn developers -# SPDX-License-Identifier: BSD-3-Clause - -import matplotlib.pyplot as plt -import numpy as np - -from sklearn.ensemble import RandomForestClassifier, VotingClassifier -from sklearn.linear_model import LogisticRegression -from sklearn.naive_bayes import GaussianNB - -clf1 = LogisticRegression(max_iter=1000, random_state=123) -clf2 = RandomForestClassifier(n_estimators=100, random_state=123) -clf3 = GaussianNB() -X = np.array([[-1.0, -1.0], [-1.2, -1.4], [-3.4, -2.2], [1.1, 1.2]]) -y = np.array([1, 1, 2, 2]) - -eclf = VotingClassifier( - estimators=[("lr", clf1), ("rf", clf2), ("gnb", clf3)], - voting="soft", - weights=[1, 1, 5], -) - -# predict class probabilities for all classifiers -probas = [c.fit(X, y).predict_proba(X) for c in (clf1, clf2, clf3, eclf)] - -# get class probabilities for the first sample in the dataset -class1_1 = [pr[0, 0] for pr in probas] -class2_1 = [pr[0, 1] for pr in probas] - - -# plotting - -N = 4 # number of groups -ind = np.arange(N) # group positions -width = 0.35 # bar width - -fig, ax = plt.subplots() - -# bars for classifier 1-3 -p1 = ax.bar(ind, np.hstack(([class1_1[:-1], [0]])), width, color="green", edgecolor="k") -p2 = ax.bar( - ind + width, - np.hstack(([class2_1[:-1], [0]])), - width, - color="lightgreen", - edgecolor="k", -) - -# bars for VotingClassifier -p3 = ax.bar(ind, [0, 0, 0, class1_1[-1]], width, color="blue", edgecolor="k") -p4 = ax.bar( - ind + width, [0, 0, 0, class2_1[-1]], width, color="steelblue", edgecolor="k" -) - -# plot annotations -plt.axvline(2.8, color="k", linestyle="dashed") -ax.set_xticks(ind + width) -ax.set_xticklabels( - [ - "LogisticRegression\nweight 1", - "GaussianNB\nweight 1", - "RandomForestClassifier\nweight 5", - "VotingClassifier\n(average probabilities)", - ], - rotation=40, - ha="right", -) -plt.ylim([0, 1]) -plt.title("Class probabilities for sample 1 by different classifiers") -plt.legend([p1[0], p2[0]], ["class 1", "class 2"], loc="upper left") -plt.tight_layout() -plt.show() From 36d056fc0b4ff84c6fd1f158b1b14798e9f75df2 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?J=C3=A9r=C3=A9mie=20du=20Boisberranger?= Date: Mon, 5 May 2025 01:57:41 +0200 Subject: [PATCH 107/182] MNT Clean-up deprecations for 1.7: Remainder column type of ColumnTransformer (#31167) --- .../sklearn.compose/31167.api.rst | 4 + sklearn/compose/_column_transformer.py | 160 +++--------------- .../compose/tests/test_column_transformer.py | 106 ++++-------- 3 files changed, 62 insertions(+), 208 deletions(-) create mode 100644 doc/whats_new/upcoming_changes/sklearn.compose/31167.api.rst diff --git a/doc/whats_new/upcoming_changes/sklearn.compose/31167.api.rst b/doc/whats_new/upcoming_changes/sklearn.compose/31167.api.rst new file mode 100644 index 0000000000000..5f25cbac65020 --- /dev/null +++ b/doc/whats_new/upcoming_changes/sklearn.compose/31167.api.rst @@ -0,0 +1,4 @@ +- The `force_int_remainder_cols` parameter of :class:`compose.ColumnTransformer` and + :func:`compose.make_column_transformer` is deprecated and will be removed in 1.9. + It has no effect. + By :user:`Jérémie du Boisberranger ` diff --git a/sklearn/compose/_column_transformer.py b/sklearn/compose/_column_transformer.py index 65eed27e3e07f..8e3938c49be32 100644 --- a/sklearn/compose/_column_transformer.py +++ b/sklearn/compose/_column_transformer.py @@ -8,7 +8,7 @@ # SPDX-License-Identifier: BSD-3-Clause import warnings -from collections import Counter, UserList +from collections import Counter from functools import partial from itertools import chain from numbers import Integral, Real @@ -161,11 +161,8 @@ class ColumnTransformer(TransformerMixin, _BaseComposition): .. versionchanged:: 1.6 `verbose_feature_names_out` can be a callable or a string to be formatted. - force_int_remainder_cols : bool, default=True - Force the columns of the last entry of `transformers_`, which - corresponds to the "remainder" transformer, to always be stored as - indices (int) rather than column names (str). See description of the - `transformers_` attribute for details. + force_int_remainder_cols : bool, default=False + This parameter has no effect. .. note:: If you do not access the list of columns for the remainder columns @@ -178,6 +175,9 @@ class ColumnTransformer(TransformerMixin, _BaseComposition): The default value for `force_int_remainder_cols` will change from `True` to `False` in version 1.7. + .. deprecated:: 1.7 + `force_int_remainder_cols` is deprecated and will be removed in 1.9. + Attributes ---------- transformers_ : list @@ -192,16 +192,12 @@ class ColumnTransformer(TransformerMixin, _BaseComposition): ``len(transformers_)==len(transformers)+1``, otherwise ``len(transformers_)==len(transformers)``. - .. versionchanged:: 1.5 - If there are remaining columns and `force_int_remainder_cols` is - True, the remaining columns are always represented by their - positional indices in the input `X` (as in older versions). If - `force_int_remainder_cols` is False, the format attempts to match - that of the other transformers: if all columns were provided as - column names (`str`), the remaining columns are stored as column - names; if all columns were provided as mask arrays (`bool`), so are - the remaining columns; in all other cases the remaining columns are - stored as indices (`int`). + .. versionadded:: 1.7 + The format of the remaining columns now attempts to match that of the other + transformers: if all columns were provided as column names (`str`), the + remaining columns are stored as column names; if all columns were provided + as mask arrays (`bool`), so are the remaining columns; in all other cases + the remaining columns are stored as indices (`int`). named_transformers_ : :class:`~sklearn.utils.Bunch` Read-only attribute to access any transformer by given name. @@ -300,7 +296,7 @@ class ColumnTransformer(TransformerMixin, _BaseComposition): "transformer_weights": [dict, None], "verbose": ["verbose"], "verbose_feature_names_out": ["boolean", str, callable], - "force_int_remainder_cols": ["boolean"], + "force_int_remainder_cols": ["boolean", Hidden(StrOptions({"deprecated"}))], } def __init__( @@ -313,7 +309,7 @@ def __init__( transformer_weights=None, verbose=False, verbose_feature_names_out=True, - force_int_remainder_cols=True, + force_int_remainder_cols="deprecated", ): self.transformers = transformers self.remainder = remainder @@ -477,13 +473,6 @@ def _iter(self, fitted, column_as_labels, skip_drop, skip_empty_columns): if self._remainder[2]: transformers = chain(transformers, [self._remainder]) - # We want the warning about the future change of the remainder - # columns dtype to be shown only when a user accesses them - # directly, not when they are used by the ColumnTransformer itself. - # We disable warnings here; they are enabled when setting - # self.transformers_. - transformers = _with_dtype_warning_enabled_set_to(False, transformers) - get_weight = (self.transformer_weights or {}).get for name, trans, columns in transformers: @@ -578,8 +567,6 @@ def _get_remainder_cols_dtype(self): def _get_remainder_cols(self, indices): dtype = self._get_remainder_cols_dtype() - if self.force_int_remainder_cols and dtype != "int": - return _RemainderColsList(indices, future_dtype=dtype) if dtype == "str": return list(self.feature_names_in_[indices]) if dtype == "bool": @@ -753,7 +740,7 @@ def _update_fitted_transformers(self, transformers): # sanity check that transformers is exhausted assert not list(fitted_transformers) - self.transformers_ = _with_dtype_warning_enabled_set_to(True, transformers_) + self.transformers_ = transformers_ def _validate_output(self, result): """ @@ -984,6 +971,14 @@ def fit_transform(self, X, y=None, **params): _raise_for_params(params, self, "fit_transform") _check_feature_names(self, X, reset=True) + if self.force_int_remainder_cols != "deprecated": + warnings.warn( + "The parameter `force_int_remainder_cols` is deprecated and will be " + "removed in 1.9. It has no effect. Leave it to its default value to " + "avoid this warning.", + FutureWarning, + ) + X = _check_X(X) # set n_features_in_ attribute _check_n_features(self, X, reset=True) @@ -1380,7 +1375,7 @@ def make_column_transformer( n_jobs=None, verbose=False, verbose_feature_names_out=True, - force_int_remainder_cols=True, + force_int_remainder_cols="deprecated", ): """Construct a ColumnTransformer from the given transformers. @@ -1454,10 +1449,7 @@ def make_column_transformer( .. versionadded:: 1.0 force_int_remainder_cols : bool, default=True - Force the columns of the last entry of `transformers_`, which - corresponds to the "remainder" transformer, to always be stored as - indices (int) rather than column names (str). See description of the - :attr:`ColumnTransformer.transformers_` attribute for details. + This parameter has no effect. .. note:: If you do not access the list of columns for the remainder columns @@ -1470,6 +1462,9 @@ def make_column_transformer( The default value for `force_int_remainder_cols` will change from `True` to `False` in version 1.7. + .. deprecated:: 1.7 + `force_int_remainder_cols` is deprecated and will be removed in version 1.9. + Returns ------- ct : ColumnTransformer @@ -1596,105 +1591,6 @@ def __call__(self, df): return cols.tolist() -class _RemainderColsList(UserList): - """A list that raises a warning whenever items are accessed. - - It is used to store the columns handled by the "remainder" entry of - ``ColumnTransformer.transformers_``, ie ``transformers_[-1][-1]``. - - For some values of the ``ColumnTransformer`` ``transformers`` parameter, - this list of indices will be replaced by either a list of column names or a - boolean mask; in those cases we emit a ``FutureWarning`` the first time an - element is accessed. - - Parameters - ---------- - columns : list of int - The remainder columns. - - future_dtype : {'str', 'bool'}, default=None - The dtype that will be used by a ColumnTransformer with the same inputs - in a future release. There is a default value because providing a - constructor that takes a single argument is a requirement for - subclasses of UserList, but we do not use it in practice. It would only - be used if a user called methods that return a new list such are - copying or concatenating `_RemainderColsList`. - - warning_was_emitted : bool, default=False - Whether the warning for that particular list was already shown, so we - only emit it once. - - warning_enabled : bool, default=True - When False, the list never emits the warning nor updates - `warning_was_emitted``. This is used to obtain a quiet copy of the list - for use by the `ColumnTransformer` itself, so that the warning is only - shown when a user accesses it directly. - """ - - def __init__( - self, - columns, - *, - future_dtype=None, - warning_was_emitted=False, - warning_enabled=True, - ): - super().__init__(columns) - self.future_dtype = future_dtype - self.warning_was_emitted = warning_was_emitted - self.warning_enabled = warning_enabled - - def __getitem__(self, index): - self._show_remainder_cols_warning() - return super().__getitem__(index) - - def _show_remainder_cols_warning(self): - if self.warning_was_emitted or not self.warning_enabled: - return - self.warning_was_emitted = True - future_dtype_description = { - "str": "column names (of type str)", - "bool": "a mask array (of type bool)", - # shouldn't happen because we always initialize it with a - # non-default future_dtype - None: "a different type depending on the ColumnTransformer inputs", - }.get(self.future_dtype, self.future_dtype) - - # TODO(1.7) Update the warning to say that the old behavior will be - # removed in 1.9. - warnings.warn( - ( - "\nThe format of the columns of the 'remainder' transformer in" - " ColumnTransformer.transformers_ will change in version 1.7 to" - " match the format of the other transformers.\nAt the moment the" - " remainder columns are stored as indices (of type int). With the same" - " ColumnTransformer configuration, in the future they will be stored" - f" as {future_dtype_description}.\nTo use the new behavior now and" - " suppress this warning, use" - " ColumnTransformer(force_int_remainder_cols=False).\n" - ), - category=FutureWarning, - ) - - def _repr_pretty_(self, printer, *_): - """Override display in ipython console, otherwise the class name is shown.""" - printer.text(repr(self.data)) - - -def _with_dtype_warning_enabled_set_to(warning_enabled, transformers): - result = [] - for name, trans, columns in transformers: - if isinstance(columns, _RemainderColsList): - columns = _RemainderColsList( - columns.data, - future_dtype=columns.future_dtype, - warning_was_emitted=columns.warning_was_emitted, - warning_enabled=warning_enabled, - ) - result.append((name, trans, columns)) - return result - - def _feature_names_out_with_str_format( transformer_name: str, feature_name: str, str_format: str ) -> str: diff --git a/sklearn/compose/tests/test_column_transformer.py b/sklearn/compose/tests/test_column_transformer.py index aed22db07af36..daa4111c9393d 100644 --- a/sklearn/compose/tests/test_column_transformer.py +++ b/sklearn/compose/tests/test_column_transformer.py @@ -5,7 +5,6 @@ import pickle import re import warnings -from unittest.mock import Mock import joblib import numpy as np @@ -20,7 +19,6 @@ make_column_selector, make_column_transformer, ) -from sklearn.compose._column_transformer import _RemainderColsList from sklearn.exceptions import NotFittedError from sklearn.feature_selection import VarianceThreshold from sklearn.preprocessing import ( @@ -792,7 +790,7 @@ def test_column_transformer_get_set_params(): "transformer_weights": None, "verbose_feature_names_out": True, "verbose": False, - "force_int_remainder_cols": True, + "force_int_remainder_cols": "deprecated", } assert ct.get_params() == exp @@ -814,7 +812,7 @@ def test_column_transformer_get_set_params(): "transformer_weights": None, "verbose_feature_names_out": True, "verbose": False, - "force_int_remainder_cols": True, + "force_int_remainder_cols": "deprecated", } assert ct.get_params() == exp @@ -944,91 +942,51 @@ def test_column_transformer_remainder(): assert ct.remainder == "drop" -# TODO(1.7): check for deprecated force_int_remainder_cols -# TODO(1.9): remove force_int but keep the test @pytest.mark.parametrize( - "cols1, cols2", + "cols1, cols2, expected_remainder_cols", [ - ([0], [False, True, False]), # mix types - ([0], [1]), # ints - (lambda x: [0], lambda x: [1]), # callables + ([0], [False, True, False], [2]), # mix types + ([0], [1], [2]), # ints + (lambda x: [0], lambda x: [1], [2]), # callables + (["A"], ["B"], ["C"]), # all strings + ([True, False, False], [False, True, False], [False, False, True]), # all bools ], ) -@pytest.mark.parametrize("force_int", [False, True]) -def test_column_transformer_remainder_dtypes_ints(force_int, cols1, cols2): - """Check that the remainder columns are always stored as indices when - other columns are not all specified as column names or masks, regardless of - `force_int_remainder_cols`. - """ - X = np.ones((1, 3)) - - ct = make_column_transformer( - (Trans(), cols1), - (Trans(), cols2), - remainder="passthrough", - force_int_remainder_cols=force_int, - ) - with warnings.catch_warnings(): - warnings.simplefilter("error") - ct.fit_transform(X) - assert ct.transformers_[-1][-1][0] == 2 - - -# TODO(1.7): check for deprecated force_int_remainder_cols -# TODO(1.9): remove force_int but keep the test -@pytest.mark.parametrize( - "force_int, cols1, cols2, expected_cols", - [ - (True, ["A"], ["B"], [2]), - (False, ["A"], ["B"], ["C"]), - (True, [True, False, False], [False, True, False], [2]), - (False, [True, False, False], [False, True, False], [False, False, True]), - ], -) -def test_column_transformer_remainder_dtypes(force_int, cols1, cols2, expected_cols): +def test_column_transformer_remainder_dtypes(cols1, cols2, expected_remainder_cols): """Check that the remainder columns format matches the format of the other - columns when they're all strings or masks, unless `force_int = True`. + columns when they're all strings or masks. """ X = np.ones((1, 3)) - if isinstance(cols1[0], str): + if isinstance(cols1, list) and isinstance(cols1[0], str): pd = pytest.importorskip("pandas") X = pd.DataFrame(X, columns=["A", "B", "C"]) - # if inputs are column names store remainder columns as column names unless - # force_int_remainder_cols is True + # if inputs are column names store remainder columns as column names ct = make_column_transformer( (Trans(), cols1), (Trans(), cols2), remainder="passthrough", - force_int_remainder_cols=force_int, ) - with warnings.catch_warnings(): - warnings.simplefilter("error") - ct.fit_transform(X) + ct.fit_transform(X) + assert ct.transformers_[-1][-1] == expected_remainder_cols - if force_int: - # If we forced using ints and we access the remainder columns a warning is shown - match = "The format of the columns of the 'remainder' transformer" - cols = ct.transformers_[-1][-1] - with pytest.warns(FutureWarning, match=match): - cols[0] - else: - with warnings.catch_warnings(): - warnings.simplefilter("error") - cols = ct.transformers_[-1][-1] - cols[0] - - assert cols == expected_cols +# TODO(1.9): remove this test +@pytest.mark.parametrize("force_int_remainder_cols", [True, False]) +def test_force_int_remainder_cols_deprecation(force_int_remainder_cols): + """Check that ColumnTransformer raises a FutureWarning when + force_int_remainder_cols is set. + """ + X = np.ones((1, 3)) + ct = ColumnTransformer( + [("T1", Trans(), [0]), ("T2", Trans(), [1])], + remainder="passthrough", + force_int_remainder_cols=force_int_remainder_cols, + ) -def test_remainder_list_repr(): - cols = _RemainderColsList([0, 1], warning_enabled=False) - assert str(cols) == "[0, 1]" - assert repr(cols) == "[0, 1]" - mock = Mock() - cols._repr_pretty_(mock, False) - mock.text.assert_called_once_with("[0, 1]") + with pytest.warns(FutureWarning, match="`force_int_remainder_cols` is deprecated"): + ct.fit(X) @pytest.mark.parametrize( @@ -1048,7 +1006,6 @@ def test_column_transformer_remainder_numpy(key, expected_cols): ct = ColumnTransformer( [("trans1", Trans(), key)], remainder="passthrough", - force_int_remainder_cols=False, ) assert_array_equal(ct.fit_transform(X_array), X_res_both) assert_array_equal(ct.fit(X_array).transform(X_array), X_res_both) @@ -1085,7 +1042,6 @@ def test_column_transformer_remainder_pandas(key, expected_cols): ct = ColumnTransformer( [("trans1", Trans(), key)], remainder="passthrough", - force_int_remainder_cols=False, ) assert_array_equal(ct.fit_transform(X_df), X_res_both) assert_array_equal(ct.fit(X_df).transform(X_df), X_res_both) @@ -1114,7 +1070,6 @@ def test_column_transformer_remainder_transformer(key, expected_cols): ct = ColumnTransformer( [("trans1", Trans(), key)], remainder=DoubleTrans(), - force_int_remainder_cols=False, ) assert_array_equal(ct.fit_transform(X_array), X_res_both) @@ -1217,7 +1172,7 @@ def test_column_transformer_get_set_params_with_remainder(): "transformer_weights": None, "verbose_feature_names_out": True, "verbose": False, - "force_int_remainder_cols": True, + "force_int_remainder_cols": "deprecated", } assert ct.get_params() == exp @@ -1238,7 +1193,7 @@ def test_column_transformer_get_set_params_with_remainder(): "transformer_weights": None, "verbose_feature_names_out": True, "verbose": False, - "force_int_remainder_cols": True, + "force_int_remainder_cols": "deprecated", } assert ct.get_params() == exp @@ -1597,7 +1552,6 @@ def test_sk_visual_block_remainder_fitted_pandas(remainder): ct = ColumnTransformer( transformers=[("ohe", ohe, ["col1", "col2"])], remainder=remainder, - force_int_remainder_cols=False, ) df = pd.DataFrame( { From 2153726f838d5df3b33c28be5ca442434e226785 Mon Sep 17 00:00:00 2001 From: scikit-learn-bot Date: Mon, 5 May 2025 10:20:00 +0200 Subject: [PATCH 108/182] :lock: :robot: CI Update lock files for array-api CI build(s) :lock: :robot: (#31298) Co-authored-by: Lock file bot --- ...a_forge_cuda_array-api_linux-64_conda.lock | 30 +++++++++---------- 1 file changed, 15 insertions(+), 15 deletions(-) diff --git a/build_tools/github/pylatest_conda_forge_cuda_array-api_linux-64_conda.lock b/build_tools/github/pylatest_conda_forge_cuda_array-api_linux-64_conda.lock index 124b1948f0d6c..8a707637fbc9b 100644 --- a/build_tools/github/pylatest_conda_forge_cuda_array-api_linux-64_conda.lock +++ b/build_tools/github/pylatest_conda_forge_cuda_array-api_linux-64_conda.lock @@ -16,7 +16,7 @@ https://conda.anaconda.org/conda-forge/noarch/ca-certificates-2025.4.26-hbd8a1cb https://conda.anaconda.org/conda-forge/noarch/fonts-conda-forge-1-0.tar.bz2#f766549260d6815b0c52253f1fb1bb29 https://conda.anaconda.org/conda-forge/linux-64/ld_impl_linux-64-2.43-h712a8e2_4.conda#01f8d123c96816249efd255a31ad7712 https://conda.anaconda.org/conda-forge/linux-64/libglvnd-1.7.0-ha4b6fd6_2.conda#434ca7e50e40f4918ab701e3facd59a0 -https://conda.anaconda.org/conda-forge/linux-64/llvm-openmp-20.1.3-h024ca30_0.conda#c721339ea8746513e42b1233b4bbdfb0 +https://conda.anaconda.org/conda-forge/linux-64/llvm-openmp-20.1.4-h024ca30_0.conda#4fc395cda27912a7d904b86b5dbf3a4d https://conda.anaconda.org/conda-forge/noarch/sysroot_linux-64-2.17-h0157908_18.conda#460eba7851277ec1fd80a1a24080787a https://conda.anaconda.org/conda-forge/linux-64/_openmp_mutex-4.5-3_kmp_llvm.conda#ee5c2118262e30b972bc0b4db8ef0ba5 https://conda.anaconda.org/conda-forge/noarch/fonts-conda-ecosystem-1-0.tar.bz2#fee5683a3f04bd15cbd8318b096a27ab @@ -42,7 +42,7 @@ https://conda.anaconda.org/conda-forge/linux-64/libuv-1.50.0-hb9d3cd8_0.conda#77 https://conda.anaconda.org/conda-forge/linux-64/libwebp-base-1.5.0-h851e524_0.conda#63f790534398730f59e1b899c3644d4a https://conda.anaconda.org/conda-forge/linux-64/libzlib-1.3.1-hb9d3cd8_2.conda#edb0dca6bc32e4f4789199455a1dbeb8 https://conda.anaconda.org/conda-forge/linux-64/ncurses-6.5-h2d0b736_3.conda#47e340acb35de30501a76c7c799c41d7 -https://conda.anaconda.org/conda-forge/linux-64/openssl-3.5.0-h7b32b05_0.conda#bb539841f2a3fde210f387d00ed4bb9d +https://conda.anaconda.org/conda-forge/linux-64/openssl-3.5.0-h7b32b05_1.conda#de356753cfdbffcde5bb1e86e3aa6cd0 https://conda.anaconda.org/conda-forge/linux-64/pthread-stubs-0.4-hb9d3cd8_1002.conda#b3c17d95b5a10c6e64a21fa17573e70e https://conda.anaconda.org/conda-forge/linux-64/xorg-libice-1.1.2-hb9d3cd8_0.conda#fb901ff28063514abb6046c9ec2c4a45 https://conda.anaconda.org/conda-forge/linux-64/xorg-libxau-1.0.12-hb9d3cd8_0.conda#f6ebe2cb3f82ba6c057dde5d9debe4f7 @@ -75,7 +75,7 @@ https://conda.anaconda.org/conda-forge/linux-64/libxcb-1.17.0-h8a09558_0.conda#9 https://conda.anaconda.org/conda-forge/linux-64/lz4-c-1.10.0-h5888daf_1.conda#9de5350a85c4a20c685259b889aa6393 https://conda.anaconda.org/conda-forge/linux-64/mysql-common-9.2.0-h266115a_0.conda#db22a0962c953e81a2a679ecb1fc6027 https://conda.anaconda.org/conda-forge/linux-64/ninja-1.12.1-hff21bea_1.conda#2322531904f27501ee19847b87ba7c64 -https://conda.anaconda.org/conda-forge/linux-64/pixman-0.44.2-h29eaf8c_0.conda#5e2a7acfa2c24188af39e7944e1b3604 +https://conda.anaconda.org/conda-forge/linux-64/pixman-0.46.0-h29eaf8c_0.conda#d2f1c87d4416d1e7344cf92b1aaee1c4 https://conda.anaconda.org/conda-forge/linux-64/readline-8.2-h8c095d6_2.conda#283b96675859b20a825f8fa30f311446 https://conda.anaconda.org/conda-forge/linux-64/s2n-1.5.14-h6c98b2b_0.conda#efab4ad81ba5731b2fefa0ab4359e884 https://conda.anaconda.org/conda-forge/linux-64/sleef-3.8-h1b44611_0.conda#aec4dba5d4c2924730088753f6fa164b @@ -103,8 +103,8 @@ https://conda.anaconda.org/conda-forge/linux-64/libre2-11-2024.07.02-hbbce691_2. https://conda.anaconda.org/conda-forge/linux-64/libthrift-0.21.0-h0e7cc3e_0.conda#dcb95c0a98ba9ff737f7ae482aef7833 https://conda.anaconda.org/conda-forge/linux-64/libtiff-4.7.0-hd9ff511_4.conda#6c1028898cf3a2032d9af46689e1b81a https://conda.anaconda.org/conda-forge/linux-64/mysql-libs-9.2.0-he0572af_0.conda#93340b072c393d23c4700a1d40565dca -https://conda.anaconda.org/conda-forge/linux-64/nccl-2.26.2.1-h03a54cd_1.conda#07f874246d0987e94f8b94685bcc754c -https://conda.anaconda.org/conda-forge/linux-64/pcre2-10.44-hba22ea6_2.conda#df359c09c41cd186fffb93a2d87aa6f5 +https://conda.anaconda.org/conda-forge/linux-64/nccl-2.26.5.1-h03a54cd_0.conda#47dc81d35df91d38609df9c93d608b2b +https://conda.anaconda.org/conda-forge/linux-64/pcre2-10.44-hc749103_2.conda#31614c73d7b103ef76faa4d83d261d34 https://conda.anaconda.org/conda-forge/linux-64/python-3.13.3-hf636f53_101_cp313.conda#10622e12d649154af0bd76bcf33a7c5c https://conda.anaconda.org/conda-forge/linux-64/qhull-2020.2-h434a139_5.conda#353823361b1d27eb3960efb076dfcaf6 https://conda.anaconda.org/conda-forge/linux-64/xcb-util-0.4.1-hb711507_2.conda#8637c3e5821654d0edf97e2b0404b443 @@ -139,6 +139,7 @@ https://conda.anaconda.org/conda-forge/linux-64/libglx-1.7.0-ha4b6fd6_2.conda#c8 https://conda.anaconda.org/conda-forge/linux-64/libhiredis-1.0.2-h2cc385e_0.tar.bz2#b34907d3a81a3cd8095ee83d174c074a https://conda.anaconda.org/conda-forge/linux-64/libxml2-2.13.7-h4bc477f_1.conda#ad1f1f8238834cd3c88ceeaee8da444a https://conda.anaconda.org/conda-forge/linux-64/markupsafe-3.0.2-py313h8060acc_1.conda#21b62c55924f01b6eef6827167b46acb +https://conda.anaconda.org/conda-forge/noarch/meson-1.8.0-pyh29332c3_0.conda#8e25221b702272394b86b0f4d7217f77 https://conda.anaconda.org/conda-forge/linux-64/mpfr-4.2.1-h90cbb55_3.conda#2eeb50cab6652538eee8fc0bc3340c81 https://conda.anaconda.org/conda-forge/noarch/mpmath-1.3.0-pyhd8ed1ab_1.conda#3585aa87c43ab15b167b574cd73b057b https://conda.anaconda.org/conda-forge/noarch/munkres-1.1.4-pyh9f0ad1d_0.tar.bz2#2ba8498c1018c1e9c61eb99b973dfe19 @@ -147,13 +148,13 @@ https://conda.anaconda.org/conda-forge/linux-64/openblas-0.3.29-pthreads_h6ec200 https://conda.anaconda.org/conda-forge/linux-64/openjpeg-2.5.3-h5fbd93e_0.conda#9e5816bc95d285c115a3ebc2f8563564 https://conda.anaconda.org/conda-forge/linux-64/orc-2.1.1-h2271f48_0.conda#67075ef2cb33079efee3abfe58127a3b https://conda.anaconda.org/conda-forge/noarch/packaging-25.0-pyh29332c3_1.conda#58335b26c38bf4a20f399384c33cbcf9 -https://conda.anaconda.org/conda-forge/noarch/pip-25.1-pyh145f28c_0.conda#4627e20c39e7340febed674c3bf05b16 +https://conda.anaconda.org/conda-forge/noarch/pip-25.1.1-pyh145f28c_0.conda#01384ff1639c6330a0924791413b8714 https://conda.anaconda.org/conda-forge/noarch/pluggy-1.5.0-pyhd8ed1ab_1.conda#e9dcbce5f45f9ee500e728ae58b605b6 https://conda.anaconda.org/conda-forge/noarch/pyparsing-3.2.3-pyhd8ed1ab_1.conda#513d3c262ee49b54a8fec85c5bc99764 https://conda.anaconda.org/conda-forge/noarch/python-tzdata-2025.2-pyhd8ed1ab_0.conda#88476ae6ebd24f39261e0854ac244f33 https://conda.anaconda.org/conda-forge/noarch/pytz-2025.2-pyhd8ed1ab_0.conda#bc8e3267d44011051f2eb14d22fb0960 https://conda.anaconda.org/conda-forge/linux-64/re2-2024.07.02-h9925aae_2.conda#e84ddf12bde691e8ec894b00ea829ddf -https://conda.anaconda.org/conda-forge/noarch/setuptools-79.0.1-pyhff2d567_0.conda#fa6669cc21abd4b7b6c5393b7bc71914 +https://conda.anaconda.org/conda-forge/noarch/setuptools-80.1.0-pyhff2d567_0.conda#f6f72d0837c79eaec77661be43e8a691 https://conda.anaconda.org/conda-forge/noarch/six-1.17.0-pyhd8ed1ab_0.conda#a451d576819089b0d672f18768be0f65 https://conda.anaconda.org/conda-forge/noarch/threadpoolctl-3.6.0-pyhecae5ae_0.conda#9d64911b31d57ca443e9f1e36b04385f https://conda.anaconda.org/conda-forge/noarch/toml-0.10.2-pyhd8ed1ab_1.conda#b0dd904de08b7db706167240bf37b164 @@ -168,22 +169,21 @@ https://conda.anaconda.org/conda-forge/linux-64/xorg-libxrender-0.9.12-hb9d3cd8_ https://conda.anaconda.org/conda-forge/linux-64/aws-c-auth-0.8.6-hd08a7f5_4.conda#f5a770ac1fd2cb34b21327fc513013a7 https://conda.anaconda.org/conda-forge/linux-64/aws-c-mqtt-0.12.2-h108da3e_2.conda#90e07c8bac8da6378ee1882ef0a9374a https://conda.anaconda.org/conda-forge/linux-64/azure-core-cpp-1.14.0-h5cfcd09_0.conda#0a8838771cc2e985cd295e01ae83baf1 -https://conda.anaconda.org/conda-forge/linux-64/ccache-4.11.2-hd714d17_0.conda#35ae7ce74089ab05fdb1cb9746c0fbe4 +https://conda.anaconda.org/conda-forge/linux-64/ccache-4.11.3-h80c52d3_0.conda#eb517c6a2b960c3ccb6f1db1005f063a https://conda.anaconda.org/conda-forge/linux-64/coverage-7.8.0-py313h8060acc_0.conda#375064d30e709bf7c1d4580e70aaea61 https://conda.anaconda.org/conda-forge/linux-64/dbus-1.13.6-h5008d03_3.tar.bz2#ecfff944ba3960ecb334b9a2663d708d https://conda.anaconda.org/conda-forge/linux-64/fonttools-4.57.0-py313h8060acc_0.conda#76b3a3367ac578a7cc43f4b7814e7e87 https://conda.anaconda.org/conda-forge/linux-64/freetype-2.13.3-ha770c72_1.conda#9ccd736d31e0c6e41f54e704e5312811 https://conda.anaconda.org/conda-forge/noarch/jinja2-3.1.6-pyhd8ed1ab_0.conda#446bd6c8cb26050d528881df495ce646 -https://conda.anaconda.org/conda-forge/noarch/joblib-1.4.2-pyhd8ed1ab_1.conda#bf8243ee348f3a10a14ed0cae323e0c1 +https://conda.anaconda.org/conda-forge/noarch/joblib-1.5.0-pyhd8ed1ab_0.conda#3d7257f0a61c9aa4ffa3e324a887416b https://conda.anaconda.org/conda-forge/linux-64/libcblas-3.9.0-31_he106b2a_openblas.conda#abb32c727da370c481a1c206f5159ce9 https://conda.anaconda.org/conda-forge/linux-64/libgl-1.7.0-ha4b6fd6_2.conda#928b8be80851f5d8ffb016f9c81dae7a https://conda.anaconda.org/conda-forge/linux-64/libgrpc-1.67.1-h25350d4_2.conda#bfcedaf5f9b003029cc6abe9431f66bf https://conda.anaconda.org/conda-forge/linux-64/libhwloc-2.11.2-default_h0d58e46_1001.conda#804ca9e91bcaea0824a341d55b1684f2 https://conda.anaconda.org/conda-forge/linux-64/liblapack-3.9.0-31_h7ac8fdf_openblas.conda#452b98eafe050ecff932f0ec832dd03f -https://conda.anaconda.org/conda-forge/linux-64/libllvm20-20.1.3-he9d0ab4_0.conda#74c14fe2ab88e352ab6e4fedf5ecb527 -https://conda.anaconda.org/conda-forge/linux-64/libxkbcommon-1.9.0-h65c71a3_0.conda#14fbc598b68d4c6386978f7db09fc5ed +https://conda.anaconda.org/conda-forge/linux-64/libllvm20-20.1.4-he9d0ab4_0.conda#96c33bbd084ef2b2463503fb7f1482ae +https://conda.anaconda.org/conda-forge/linux-64/libxkbcommon-1.9.1-h65c71a3_0.conda#6e45090fe0eec179ecc8041a3a3fc9f8 https://conda.anaconda.org/conda-forge/linux-64/libxslt-1.1.39-h76b75d6_0.conda#e71f31f8cfb0a91439f2086fc8aa0461 -https://conda.anaconda.org/conda-forge/noarch/meson-1.7.1-pyhd8ed1ab_0.conda#90018ee73b8741268027421ceac2809a https://conda.anaconda.org/conda-forge/linux-64/mpc-1.3.1-h24ddda3_1.conda#aa14b9a5196a6d8dd364164b7ce56acf https://conda.anaconda.org/conda-forge/linux-64/openldap-2.6.9-he970967_0.conda#ca2de8bbdc871bce41dbf59e51324165 https://conda.anaconda.org/conda-forge/linux-64/prometheus-cpp-1.3.0-ha5d0236_0.conda#a83f6a2fdc079e643237887a37460668 @@ -204,8 +204,8 @@ https://conda.anaconda.org/conda-forge/linux-64/azure-identity-cpp-1.10.0-h113e6 https://conda.anaconda.org/conda-forge/linux-64/azure-storage-common-cpp-12.8.0-h736e048_1.conda#13de36be8de3ae3f05ba127631599213 https://conda.anaconda.org/conda-forge/linux-64/fontconfig-2.15.0-h7e30c49_1.conda#8f5b0b297b59e1ac160ad4beec99dbee https://conda.anaconda.org/conda-forge/linux-64/gmpy2-2.2.1-py313h11186cd_0.conda#54d020e0eaacf1e99bfb2410b9aa2e5e -https://conda.anaconda.org/conda-forge/linux-64/libclang-cpp20.1-20.1.3-default_h1df26ce_0.conda#bbce8ba7f25af8b0928f13fca1eb7405 -https://conda.anaconda.org/conda-forge/linux-64/libclang13-20.1.3-default_he06ed0a_0.conda#1bb2ec3c550f7589b2d16e271aeaeddb +https://conda.anaconda.org/conda-forge/linux-64/libclang-cpp20.1-20.1.4-default_h1df26ce_0.conda#96f8d5b2e94c9ba4fef19f1adf068a15 +https://conda.anaconda.org/conda-forge/linux-64/libclang13-20.1.4-default_he06ed0a_0.conda#2d933632c8004be47deb2be61bf013be https://conda.anaconda.org/conda-forge/linux-64/libgoogle-cloud-2.36.0-h2b5623c_0.conda#c96ca58ad3352a964bfcb85de6cd1496 https://conda.anaconda.org/conda-forge/linux-64/liblapacke-3.9.0-31_he2f377e_openblas.conda#7e5fff7d0db69be3a266f7e79a3bb0e2 https://conda.anaconda.org/conda-forge/linux-64/libmagma-2.9.0-h45b15fe_0.conda#703a1ab01e36111d8bb40bc7517e900b @@ -231,7 +231,7 @@ https://conda.anaconda.org/conda-forge/linux-64/mkl-2024.2.2-ha957f24_16.conda#1 https://conda.anaconda.org/conda-forge/linux-64/pandas-2.2.3-py313ha87cce1_3.conda#6248b529e537b1d4cb5ab3ef7f537795 https://conda.anaconda.org/conda-forge/linux-64/polars-1.27.1-py39h2a4a510_3.conda#fba08963eaa1f954480045d033d1221e https://conda.anaconda.org/conda-forge/linux-64/scipy-1.15.2-py313h86fcf2b_0.conda#ca68acd9febc86448eeed68d0c6c8643 -https://conda.anaconda.org/conda-forge/noarch/sympy-1.13.3-pyh2585a3b_105.conda#254cd5083ffa04d96e3173397a3d30f4 +https://conda.anaconda.org/conda-forge/noarch/sympy-1.14.0-pyh2585a3b_105.conda#8c09fac3785696e1c477156192d64b91 https://conda.anaconda.org/conda-forge/linux-64/aws-sdk-cpp-1.11.510-h37a5c72_3.conda#beb8577571033140c6897d257acc7724 https://conda.anaconda.org/conda-forge/linux-64/azure-storage-files-datalake-cpp-12.12.0-ha633028_1.conda#7c1980f89dd41b097549782121a73490 https://conda.anaconda.org/conda-forge/linux-64/blas-2.131-openblas.conda#38b2ec894c69bb4be0e66d2ef7fc60bf From c155113d8dd46418a336e92d1c7bddcf04593463 Mon Sep 17 00:00:00 2001 From: scikit-learn-bot Date: Mon, 5 May 2025 10:21:20 +0200 Subject: [PATCH 109/182] :lock: :robot: CI Update lock files for main CI build(s) :lock: :robot: (#31299) Co-authored-by: Lock file bot --- build_tools/azure/debian_32bit_lock.txt | 4 +- ...latest_conda_forge_mkl_linux-64_conda.lock | 56 ++++++------ ...pylatest_conda_forge_mkl_osx-64_conda.lock | 16 ++-- ...test_conda_mkl_no_openmp_osx-64_conda.lock | 10 +- ...st_pip_openblas_pandas_linux-64_conda.lock | 12 +-- .../pymin_conda_forge_mkl_win-64_conda.lock | 16 ++-- ...nblas_min_dependencies_linux-64_conda.lock | 44 ++++----- ...e_openblas_ubuntu_2204_linux-64_conda.lock | 16 ++-- build_tools/azure/ubuntu_atlas_lock.txt | 2 +- build_tools/circle/doc_linux-64_conda.lock | 30 +++--- .../doc_min_dependencies_linux-64_conda.lock | 91 +++++++++---------- ...n_conda_forge_arm_linux-aarch64_conda.lock | 24 ++--- 12 files changed, 159 insertions(+), 162 deletions(-) diff --git a/build_tools/azure/debian_32bit_lock.txt b/build_tools/azure/debian_32bit_lock.txt index 654cbcc78a382..051a8b8ef7e48 100644 --- a/build_tools/azure/debian_32bit_lock.txt +++ b/build_tools/azure/debian_32bit_lock.txt @@ -10,9 +10,9 @@ cython==3.0.12 # via -r build_tools/azure/debian_32bit_requirements.txt iniconfig==2.1.0 # via pytest -joblib==1.4.2 +joblib==1.5.0 # via -r build_tools/azure/debian_32bit_requirements.txt -meson==1.7.2 +meson==1.8.0 # via meson-python meson-python==0.17.1 # via -r build_tools/azure/debian_32bit_requirements.txt diff --git a/build_tools/azure/pylatest_conda_forge_mkl_linux-64_conda.lock b/build_tools/azure/pylatest_conda_forge_mkl_linux-64_conda.lock index 1ea82245f3772..9b452e7ecba3d 100644 --- a/build_tools/azure/pylatest_conda_forge_mkl_linux-64_conda.lock +++ b/build_tools/azure/pylatest_conda_forge_mkl_linux-64_conda.lock @@ -15,7 +15,7 @@ https://conda.anaconda.org/conda-forge/noarch/ca-certificates-2025.4.26-hbd8a1cb https://conda.anaconda.org/conda-forge/noarch/fonts-conda-forge-1-0.tar.bz2#f766549260d6815b0c52253f1fb1bb29 https://conda.anaconda.org/conda-forge/linux-64/ld_impl_linux-64-2.43-h712a8e2_4.conda#01f8d123c96816249efd255a31ad7712 https://conda.anaconda.org/conda-forge/linux-64/libglvnd-1.7.0-ha4b6fd6_2.conda#434ca7e50e40f4918ab701e3facd59a0 -https://conda.anaconda.org/conda-forge/linux-64/llvm-openmp-20.1.3-h024ca30_0.conda#c721339ea8746513e42b1233b4bbdfb0 +https://conda.anaconda.org/conda-forge/linux-64/llvm-openmp-20.1.4-h024ca30_0.conda#4fc395cda27912a7d904b86b5dbf3a4d https://conda.anaconda.org/conda-forge/linux-64/_openmp_mutex-4.5-3_kmp_llvm.conda#ee5c2118262e30b972bc0b4db8ef0ba5 https://conda.anaconda.org/conda-forge/noarch/fonts-conda-ecosystem-1-0.tar.bz2#fee5683a3f04bd15cbd8318b096a27ab https://conda.anaconda.org/conda-forge/linux-64/libegl-1.7.0-ha4b6fd6_2.conda#c151d5eb730e9b7480e6d48c0fc44048 @@ -40,7 +40,7 @@ https://conda.anaconda.org/conda-forge/linux-64/libuv-1.50.0-hb9d3cd8_0.conda#77 https://conda.anaconda.org/conda-forge/linux-64/libwebp-base-1.5.0-h851e524_0.conda#63f790534398730f59e1b899c3644d4a https://conda.anaconda.org/conda-forge/linux-64/libzlib-1.3.1-hb9d3cd8_2.conda#edb0dca6bc32e4f4789199455a1dbeb8 https://conda.anaconda.org/conda-forge/linux-64/ncurses-6.5-h2d0b736_3.conda#47e340acb35de30501a76c7c799c41d7 -https://conda.anaconda.org/conda-forge/linux-64/openssl-3.5.0-h7b32b05_0.conda#bb539841f2a3fde210f387d00ed4bb9d +https://conda.anaconda.org/conda-forge/linux-64/openssl-3.5.0-h7b32b05_1.conda#de356753cfdbffcde5bb1e86e3aa6cd0 https://conda.anaconda.org/conda-forge/linux-64/pthread-stubs-0.4-hb9d3cd8_1002.conda#b3c17d95b5a10c6e64a21fa17573e70e https://conda.anaconda.org/conda-forge/linux-64/xorg-libice-1.1.2-hb9d3cd8_0.conda#fb901ff28063514abb6046c9ec2c4a45 https://conda.anaconda.org/conda-forge/linux-64/xorg-libxau-1.0.12-hb9d3cd8_0.conda#f6ebe2cb3f82ba6c057dde5d9debe4f7 @@ -73,7 +73,7 @@ https://conda.anaconda.org/conda-forge/linux-64/libxcb-1.17.0-h8a09558_0.conda#9 https://conda.anaconda.org/conda-forge/linux-64/lz4-c-1.10.0-h5888daf_1.conda#9de5350a85c4a20c685259b889aa6393 https://conda.anaconda.org/conda-forge/linux-64/mysql-common-9.2.0-h266115a_0.conda#db22a0962c953e81a2a679ecb1fc6027 https://conda.anaconda.org/conda-forge/linux-64/ninja-1.12.1-hff21bea_1.conda#2322531904f27501ee19847b87ba7c64 -https://conda.anaconda.org/conda-forge/linux-64/pixman-0.44.2-h29eaf8c_0.conda#5e2a7acfa2c24188af39e7944e1b3604 +https://conda.anaconda.org/conda-forge/linux-64/pixman-0.46.0-h29eaf8c_0.conda#d2f1c87d4416d1e7344cf92b1aaee1c4 https://conda.anaconda.org/conda-forge/linux-64/readline-8.2-h8c095d6_2.conda#283b96675859b20a825f8fa30f311446 https://conda.anaconda.org/conda-forge/linux-64/s2n-1.5.17-hba75a32_0.conda#dbb899164b5451c34969e67a35ca17a9 https://conda.anaconda.org/conda-forge/linux-64/sleef-3.8-h1b44611_0.conda#aec4dba5d4c2924730088753f6fa164b @@ -99,7 +99,7 @@ https://conda.anaconda.org/conda-forge/linux-64/libre2-11-2024.07.02-hba17884_3. https://conda.anaconda.org/conda-forge/linux-64/libthrift-0.21.0-h0e7cc3e_0.conda#dcb95c0a98ba9ff737f7ae482aef7833 https://conda.anaconda.org/conda-forge/linux-64/libtiff-4.7.0-hd9ff511_4.conda#6c1028898cf3a2032d9af46689e1b81a https://conda.anaconda.org/conda-forge/linux-64/mysql-libs-9.2.0-he0572af_0.conda#93340b072c393d23c4700a1d40565dca -https://conda.anaconda.org/conda-forge/linux-64/pcre2-10.44-hba22ea6_2.conda#df359c09c41cd186fffb93a2d87aa6f5 +https://conda.anaconda.org/conda-forge/linux-64/pcre2-10.44-hc749103_2.conda#31614c73d7b103ef76faa4d83d261d34 https://conda.anaconda.org/conda-forge/linux-64/python-3.13.3-hf636f53_101_cp313.conda#10622e12d649154af0bd76bcf33a7c5c https://conda.anaconda.org/conda-forge/linux-64/qhull-2020.2-h434a139_5.conda#353823361b1d27eb3960efb076dfcaf6 https://conda.anaconda.org/conda-forge/linux-64/xcb-util-0.4.1-hb711507_2.conda#8637c3e5821654d0edf97e2b0404b443 @@ -109,7 +109,7 @@ https://conda.anaconda.org/conda-forge/linux-64/xcb-util-wm-0.4.2-hb711507_0.con https://conda.anaconda.org/conda-forge/linux-64/xorg-libsm-1.2.6-he73a12e_0.conda#1c74ff8c35dcadf952a16f752ca5aa49 https://conda.anaconda.org/conda-forge/linux-64/xorg-libx11-1.8.12-h4f16b4b_0.conda#db038ce880f100acc74dba10302b5630 https://conda.anaconda.org/conda-forge/linux-64/aws-c-event-stream-0.5.4-hc5e5e9e_7.conda#eb339cb6cd7c881b3f0e7910e99c261b -https://conda.anaconda.org/conda-forge/linux-64/aws-c-http-0.9.7-h6884c39_1.conda#6b69d862d15b5753710e81e7a4a7226b +https://conda.anaconda.org/conda-forge/linux-64/aws-c-http-0.10.0-h6884c39_0.conda#76a0f88aeb377e0eee84d48ac65ca747 https://conda.anaconda.org/conda-forge/linux-64/brotli-1.1.0-hb9d3cd8_2.conda#98514fe74548d768907ce7a13f680e8f https://conda.anaconda.org/conda-forge/noarch/colorama-0.4.6-pyhd8ed1ab_1.conda#962b9857ee8e7018c22f2776ffa0b2d7 https://conda.anaconda.org/conda-forge/noarch/cpython-3.13.3-py313hd8ed1ab_101.conda#904a822cbd380adafb9070debf8579a8 @@ -131,6 +131,7 @@ https://conda.anaconda.org/conda-forge/linux-64/libglx-1.7.0-ha4b6fd6_2.conda#c8 https://conda.anaconda.org/conda-forge/linux-64/libhiredis-1.0.2-h2cc385e_0.tar.bz2#b34907d3a81a3cd8095ee83d174c074a https://conda.anaconda.org/conda-forge/linux-64/libxml2-2.13.7-h4bc477f_1.conda#ad1f1f8238834cd3c88ceeaee8da444a https://conda.anaconda.org/conda-forge/linux-64/markupsafe-3.0.2-py313h8060acc_1.conda#21b62c55924f01b6eef6827167b46acb +https://conda.anaconda.org/conda-forge/noarch/meson-1.8.0-pyh29332c3_0.conda#8e25221b702272394b86b0f4d7217f77 https://conda.anaconda.org/conda-forge/linux-64/mpfr-4.2.1-h90cbb55_3.conda#2eeb50cab6652538eee8fc0bc3340c81 https://conda.anaconda.org/conda-forge/noarch/mpmath-1.3.0-pyhd8ed1ab_1.conda#3585aa87c43ab15b167b574cd73b057b https://conda.anaconda.org/conda-forge/noarch/munkres-1.1.4-pyh9f0ad1d_0.tar.bz2#2ba8498c1018c1e9c61eb99b973dfe19 @@ -138,7 +139,7 @@ https://conda.anaconda.org/conda-forge/noarch/networkx-3.4.2-pyh267e887_2.conda# https://conda.anaconda.org/conda-forge/linux-64/openjpeg-2.5.3-h5fbd93e_0.conda#9e5816bc95d285c115a3ebc2f8563564 https://conda.anaconda.org/conda-forge/linux-64/orc-2.1.1-h17f744e_1.conda#cfe9bc267c22b6d53438eff187649d43 https://conda.anaconda.org/conda-forge/noarch/packaging-25.0-pyh29332c3_1.conda#58335b26c38bf4a20f399384c33cbcf9 -https://conda.anaconda.org/conda-forge/noarch/pip-25.1-pyh145f28c_0.conda#4627e20c39e7340febed674c3bf05b16 +https://conda.anaconda.org/conda-forge/noarch/pip-25.1.1-pyh145f28c_0.conda#01384ff1639c6330a0924791413b8714 https://conda.anaconda.org/conda-forge/noarch/pluggy-1.5.0-pyhd8ed1ab_1.conda#e9dcbce5f45f9ee500e728ae58b605b6 https://conda.anaconda.org/conda-forge/noarch/pybind11-global-2.13.6-pyh415d2e4_2.conda#120541563e520d12d8e39abd7de9092c https://conda.anaconda.org/conda-forge/noarch/pyparsing-3.2.3-pyhd8ed1ab_1.conda#513d3c262ee49b54a8fec85c5bc99764 @@ -157,23 +158,22 @@ https://conda.anaconda.org/conda-forge/linux-64/xkeyboard-config-2.44-hb9d3cd8_0 https://conda.anaconda.org/conda-forge/linux-64/xorg-libxext-1.3.6-hb9d3cd8_0.conda#febbab7d15033c913d53c7a2c102309d https://conda.anaconda.org/conda-forge/linux-64/xorg-libxfixes-6.0.1-hb9d3cd8_0.conda#4bdb303603e9821baf5fe5fdff1dc8f8 https://conda.anaconda.org/conda-forge/linux-64/xorg-libxrender-0.9.12-hb9d3cd8_0.conda#96d57aba173e878a2089d5638016dc5e -https://conda.anaconda.org/conda-forge/linux-64/aws-c-auth-0.9.0-h0a147a0_3.conda#d9239cbfec4e372206043ac623253c74 -https://conda.anaconda.org/conda-forge/linux-64/aws-c-mqtt-0.12.3-h27aa219_3.conda#138a54cfd9e73a13ff4e4f0c2a3a22c7 +https://conda.anaconda.org/conda-forge/linux-64/aws-c-auth-0.9.0-h9a6e2ae_4.conda#a948110dbbde6491c62815643a96d589 +https://conda.anaconda.org/conda-forge/linux-64/aws-c-mqtt-0.12.3-hef6a231_4.conda#fd1d89d79c8287e6bcb2a529292f537a https://conda.anaconda.org/conda-forge/linux-64/azure-core-cpp-1.14.0-h5cfcd09_0.conda#0a8838771cc2e985cd295e01ae83baf1 -https://conda.anaconda.org/conda-forge/linux-64/ccache-4.11.2-hd714d17_0.conda#35ae7ce74089ab05fdb1cb9746c0fbe4 +https://conda.anaconda.org/conda-forge/linux-64/ccache-4.11.3-h80c52d3_0.conda#eb517c6a2b960c3ccb6f1db1005f063a https://conda.anaconda.org/conda-forge/linux-64/coverage-7.8.0-py313h8060acc_0.conda#375064d30e709bf7c1d4580e70aaea61 https://conda.anaconda.org/conda-forge/linux-64/dbus-1.13.6-h5008d03_3.tar.bz2#ecfff944ba3960ecb334b9a2663d708d https://conda.anaconda.org/conda-forge/linux-64/fonttools-4.57.0-py313h8060acc_0.conda#76b3a3367ac578a7cc43f4b7814e7e87 https://conda.anaconda.org/conda-forge/linux-64/freetype-2.13.3-ha770c72_1.conda#9ccd736d31e0c6e41f54e704e5312811 https://conda.anaconda.org/conda-forge/noarch/jinja2-3.1.6-pyhd8ed1ab_0.conda#446bd6c8cb26050d528881df495ce646 -https://conda.anaconda.org/conda-forge/noarch/joblib-1.4.2-pyhd8ed1ab_1.conda#bf8243ee348f3a10a14ed0cae323e0c1 +https://conda.anaconda.org/conda-forge/noarch/joblib-1.5.0-pyhd8ed1ab_0.conda#3d7257f0a61c9aa4ffa3e324a887416b https://conda.anaconda.org/conda-forge/linux-64/libgl-1.7.0-ha4b6fd6_2.conda#928b8be80851f5d8ffb016f9c81dae7a https://conda.anaconda.org/conda-forge/linux-64/libgrpc-1.71.0-h8e591d7_1.conda#c3cfd72cbb14113abee7bbd86f44ad69 https://conda.anaconda.org/conda-forge/linux-64/libhwloc-2.11.2-default_h0d58e46_1001.conda#804ca9e91bcaea0824a341d55b1684f2 -https://conda.anaconda.org/conda-forge/linux-64/libllvm20-20.1.3-he9d0ab4_0.conda#74c14fe2ab88e352ab6e4fedf5ecb527 -https://conda.anaconda.org/conda-forge/linux-64/libxkbcommon-1.9.0-h65c71a3_0.conda#14fbc598b68d4c6386978f7db09fc5ed +https://conda.anaconda.org/conda-forge/linux-64/libllvm20-20.1.4-he9d0ab4_0.conda#96c33bbd084ef2b2463503fb7f1482ae +https://conda.anaconda.org/conda-forge/linux-64/libxkbcommon-1.9.1-h65c71a3_0.conda#6e45090fe0eec179ecc8041a3a3fc9f8 https://conda.anaconda.org/conda-forge/linux-64/libxslt-1.1.39-h76b75d6_0.conda#e71f31f8cfb0a91439f2086fc8aa0461 -https://conda.anaconda.org/conda-forge/noarch/meson-1.7.1-pyhd8ed1ab_0.conda#90018ee73b8741268027421ceac2809a https://conda.anaconda.org/conda-forge/linux-64/mpc-1.3.1-h24ddda3_1.conda#aa14b9a5196a6d8dd364164b7ce56acf https://conda.anaconda.org/conda-forge/linux-64/openldap-2.6.9-he970967_0.conda#ca2de8bbdc871bce41dbf59e51324165 https://conda.anaconda.org/conda-forge/linux-64/prometheus-cpp-1.3.0-ha5d0236_0.conda#a83f6a2fdc079e643237887a37460668 @@ -191,13 +191,13 @@ https://conda.anaconda.org/conda-forge/linux-64/xorg-libxi-1.8.2-hb9d3cd8_0.cond https://conda.anaconda.org/conda-forge/linux-64/xorg-libxrandr-1.5.4-hb9d3cd8_0.conda#2de7f99d6581a4a7adbff607b5c278ca https://conda.anaconda.org/conda-forge/linux-64/xorg-libxxf86vm-1.1.6-hb9d3cd8_0.conda#5efa5fa6243a622445fdfd72aee15efa https://conda.anaconda.org/conda-forge/noarch/_python_abi3_support-1.0-hd8ed1ab_2.conda#aaa2a381ccc56eac91d63b6c1240312f -https://conda.anaconda.org/conda-forge/linux-64/aws-c-s3-0.7.15-hea6d4b9_2.conda#b9a2a9ac3222c3ad1ad2533c9f5cd852 +https://conda.anaconda.org/conda-forge/linux-64/aws-c-s3-0.7.16-h7dfd680_1.conda#d8870015dbf8a8bb44832f4c330bf044 https://conda.anaconda.org/conda-forge/linux-64/azure-identity-cpp-1.10.0-h113e628_0.conda#73f73f60854f325a55f1d31459f2ab73 https://conda.anaconda.org/conda-forge/linux-64/azure-storage-common-cpp-12.8.0-h736e048_1.conda#13de36be8de3ae3f05ba127631599213 https://conda.anaconda.org/conda-forge/linux-64/fontconfig-2.15.0-h7e30c49_1.conda#8f5b0b297b59e1ac160ad4beec99dbee https://conda.anaconda.org/conda-forge/linux-64/gmpy2-2.2.1-py313h11186cd_0.conda#54d020e0eaacf1e99bfb2410b9aa2e5e -https://conda.anaconda.org/conda-forge/linux-64/libclang-cpp20.1-20.1.3-default_h1df26ce_0.conda#bbce8ba7f25af8b0928f13fca1eb7405 -https://conda.anaconda.org/conda-forge/linux-64/libclang13-20.1.3-default_he06ed0a_0.conda#1bb2ec3c550f7589b2d16e271aeaeddb +https://conda.anaconda.org/conda-forge/linux-64/libclang-cpp20.1-20.1.4-default_h1df26ce_0.conda#96f8d5b2e94c9ba4fef19f1adf068a15 +https://conda.anaconda.org/conda-forge/linux-64/libclang13-20.1.4-default_he06ed0a_0.conda#2d933632c8004be47deb2be61bf013be https://conda.anaconda.org/conda-forge/linux-64/libgoogle-cloud-2.36.0-hc4361e1_1.conda#ae36e6296a8dd8e8a9a8375965bf6398 https://conda.anaconda.org/conda-forge/linux-64/libopentelemetry-cpp-1.20.0-hd1b1c89_0.conda#e1185384cc23e3bbf85486987835df94 https://conda.anaconda.org/conda-forge/linux-64/libpq-17.4-h27ae623_1.conda#37fba334855ef3b51549308e61ed7a3d @@ -208,41 +208,41 @@ https://conda.anaconda.org/conda-forge/noarch/pytest-cov-6.1.1-pyhd8ed1ab_0.cond https://conda.anaconda.org/conda-forge/noarch/pytest-xdist-3.6.1-pyhd8ed1ab_1.conda#59aad4fb37cabc0bacc73cf344612ddd https://conda.anaconda.org/conda-forge/linux-64/tbb-2021.13.0-hceb3a55_1.conda#ba7726b8df7b9d34ea80e82b097a4893 https://conda.anaconda.org/conda-forge/linux-64/xorg-libxtst-1.2.5-hb9d3cd8_3.conda#7bbe9a0cc0df0ac5f5a8ad6d6a11af2f -https://conda.anaconda.org/conda-forge/linux-64/aws-crt-cpp-0.32.4-h9a0fb62_1.conda#37b05aa860c197db33997ba5c53be659 +https://conda.anaconda.org/conda-forge/linux-64/aws-crt-cpp-0.32.4-h0cee55f_2.conda#bc519b9909ef60e85ef2d59cd9542a0f https://conda.anaconda.org/conda-forge/linux-64/azure-storage-blobs-cpp-12.13.0-h3cf044e_1.conda#7eb66060455c7a47d9dcdbfa9f46579b https://conda.anaconda.org/conda-forge/linux-64/cairo-1.18.4-h3394656_0.conda#09262e66b19567aff4f592fb53b28760 https://conda.anaconda.org/conda-forge/linux-64/libgoogle-cloud-storage-2.36.0-h0121fbd_1.conda#a0f7588c1f0a26d550e7bae4fb49427a https://conda.anaconda.org/conda-forge/linux-64/mkl-2024.2.2-ha957f24_16.conda#1459379c79dda834673426504d52b319 -https://conda.anaconda.org/conda-forge/noarch/sympy-1.13.3-pyh2585a3b_105.conda#254cd5083ffa04d96e3173397a3d30f4 +https://conda.anaconda.org/conda-forge/noarch/sympy-1.14.0-pyh2585a3b_105.conda#8c09fac3785696e1c477156192d64b91 https://conda.anaconda.org/conda-forge/linux-64/aws-sdk-cpp-1.11.510-h5b777a2_6.conda#2fd0b0d4cc7fc86024b2965feedd628a https://conda.anaconda.org/conda-forge/linux-64/azure-storage-files-datalake-cpp-12.12.0-ha633028_1.conda#7c1980f89dd41b097549782121a73490 https://conda.anaconda.org/conda-forge/linux-64/harfbuzz-11.1.0-h3beb420_0.conda#95e3bb97f9cdc251c0c68640e9c10ed3 https://conda.anaconda.org/conda-forge/linux-64/libblas-3.9.0-31_hfdb39a5_mkl.conda#bdf4a57254e8248222cb631db4393ff1 https://conda.anaconda.org/conda-forge/linux-64/mkl-devel-2024.2.2-ha770c72_16.conda#140891ea14285fc634353b31e9e40a95 -https://conda.anaconda.org/conda-forge/linux-64/libarrow-19.0.1-h27f8bab_8_cpu.conda#adabf9b45433d7465041140051dfdaa1 +https://conda.anaconda.org/conda-forge/linux-64/libarrow-20.0.0-h27f8bab_0_cpu.conda#6dacb4d072204ce0fd13835759418872 https://conda.anaconda.org/conda-forge/linux-64/libcblas-3.9.0-31_h372d94f_mkl.conda#2a06a6c16b45bd3d10002927ca204b67 https://conda.anaconda.org/conda-forge/linux-64/liblapack-3.9.0-31_hc41d3b0_mkl.conda#10d012ddd7cc1c7ff9093d4974a34e53 https://conda.anaconda.org/conda-forge/linux-64/qt6-main-6.9.0-h6441bc3_1.conda#4029a8dcb1d97ea241dbe5abfda1fad6 -https://conda.anaconda.org/conda-forge/linux-64/libarrow-acero-19.0.1-hcb10f89_8_cpu.conda#e96553170bbc67aa151a7194f450e698 +https://conda.anaconda.org/conda-forge/linux-64/libarrow-acero-20.0.0-hcb10f89_0_cpu.conda#025bf09c4f59e6f5d9a6a4b82dd5894f https://conda.anaconda.org/conda-forge/linux-64/liblapacke-3.9.0-31_hbc6e62b_mkl.conda#562026e418363dc346ad5a9e18cce73c -https://conda.anaconda.org/conda-forge/linux-64/libparquet-19.0.1-h081d1f1_8_cpu.conda#874cbb160bf4b8f3155b1165f4186585 -https://conda.anaconda.org/conda-forge/linux-64/libtorch-2.6.0-cpu_mkl_hf6ddc5a_104.conda#828146bb6100e9a4217e8351b18c8e83 +https://conda.anaconda.org/conda-forge/linux-64/libparquet-20.0.0-h081d1f1_0_cpu.conda#4ad62607dd9f9902e0bd3d91c5bbce58 +https://conda.anaconda.org/conda-forge/linux-64/libtorch-2.7.0-cpu_mkl_hf6ddc5a_100.conda#6bdda0b10852c6d03b030bab7ec251f0 https://conda.anaconda.org/conda-forge/linux-64/numpy-2.2.5-py313h17eae1a_0.conda#6ceeff9ed72e54e4a2f9a1c88f47bdde -https://conda.anaconda.org/conda-forge/linux-64/pyarrow-core-19.0.1-py313he5f92c8_0_cpu.conda#7d8649531c807b24295c8f9a0a396a78 +https://conda.anaconda.org/conda-forge/linux-64/pyarrow-core-20.0.0-py313he5f92c8_0_cpu.conda#2afdef63d9fbc2cd0e52f8e8f3472404 https://conda.anaconda.org/conda-forge/linux-64/pyside6-6.9.0-py313h5f61773_0.conda#f51f25ec8fcbf777f8b186bb5deeed40 https://conda.anaconda.org/conda-forge/noarch/array-api-strict-2.3.1-pyhd8ed1ab_0.conda#11107d0aeb8c590a34fee0894909816b https://conda.anaconda.org/conda-forge/linux-64/blas-devel-3.9.0-31_hcf00494_mkl.conda#368c93bde87a67d24a74de15bf4c49fd https://conda.anaconda.org/conda-forge/linux-64/contourpy-1.3.2-py313h33d0bda_0.conda#5dc81fffe102f63045225007a33d6199 -https://conda.anaconda.org/conda-forge/linux-64/libarrow-dataset-19.0.1-hcb10f89_8_cpu.conda#3bb1fd3f721c4542ed26ba9bfc036619 +https://conda.anaconda.org/conda-forge/linux-64/libarrow-dataset-20.0.0-hcb10f89_0_cpu.conda#ebdbd9d4522b4106246866054f7520bf https://conda.anaconda.org/conda-forge/linux-64/pandas-2.2.3-py313ha87cce1_3.conda#6248b529e537b1d4cb5ab3ef7f537795 https://conda.anaconda.org/conda-forge/linux-64/polars-1.27.1-py39h2a4a510_3.conda#fba08963eaa1f954480045d033d1221e -https://conda.anaconda.org/conda-forge/linux-64/pytorch-2.6.0-cpu_mkl_py313_hea9ba1b_104.conda#5544fa15f47f4c53222f263eb51dd6b3 +https://conda.anaconda.org/conda-forge/linux-64/pytorch-2.7.0-cpu_mkl_py313_hea9ba1b_100.conda#3c2ce6a304aa827f1e3cc21f7df9190d https://conda.anaconda.org/conda-forge/linux-64/scipy-1.15.2-py313h86fcf2b_0.conda#ca68acd9febc86448eeed68d0c6c8643 https://conda.anaconda.org/conda-forge/noarch/scipy-doctest-1.7.1-pyh29332c3_0.conda#d3b3b7b88385648eff6ae39694692f27 https://conda.anaconda.org/conda-forge/linux-64/blas-2.131-mkl.conda#9bb865b7e01104255ca54e61a58ded15 -https://conda.anaconda.org/conda-forge/linux-64/libarrow-substrait-19.0.1-h1bed206_8_cpu.conda#7832ea7b3c0e1269ef8990d774c9b6b1 +https://conda.anaconda.org/conda-forge/linux-64/libarrow-substrait-20.0.0-h1bed206_0_cpu.conda#1763dd016d6eee48e2bb29382f8d1562 https://conda.anaconda.org/conda-forge/linux-64/matplotlib-base-3.10.1-py313h129903b_0.conda#4e23b3fabf434b418e0d9c6975a6453f https://conda.anaconda.org/conda-forge/linux-64/pyamg-5.2.1-py313hf0ab243_1.conda#4c769bf3858f424cb2ecf952175ec600 -https://conda.anaconda.org/conda-forge/linux-64/pytorch-cpu-2.6.0-cpu_mkl_hc60beec_104.conda#ccdc8b6254649dd4ed448b94fe80070e +https://conda.anaconda.org/conda-forge/linux-64/pytorch-cpu-2.7.0-cpu_mkl_hc60beec_100.conda#20b3051f55ad823a27818dfa46a41c8f https://conda.anaconda.org/conda-forge/linux-64/matplotlib-3.10.1-py313h78bf25f_0.conda#d0c80dea550ca97fc0710b2ecef919ba -https://conda.anaconda.org/conda-forge/linux-64/pyarrow-19.0.1-py313h78bf25f_0.conda#e8efe6998a383dd149787c83d3d6a92e +https://conda.anaconda.org/conda-forge/linux-64/pyarrow-20.0.0-py313h78bf25f_0.conda#6b8d388845ce750fe2ad8436669182f3 diff --git a/build_tools/azure/pylatest_conda_forge_mkl_osx-64_conda.lock b/build_tools/azure/pylatest_conda_forge_mkl_osx-64_conda.lock index 430be45730865..4def307b28f84 100644 --- a/build_tools/azure/pylatest_conda_forge_mkl_osx-64_conda.lock +++ b/build_tools/azure/pylatest_conda_forge_mkl_osx-64_conda.lock @@ -11,7 +11,7 @@ https://conda.anaconda.org/conda-forge/osx-64/bzip2-1.0.8-hfdf4475_7.conda#7ed43 https://conda.anaconda.org/conda-forge/noarch/ca-certificates-2025.4.26-hbd8a1cb_0.conda#95db94f75ba080a22eb623590993167b https://conda.anaconda.org/conda-forge/osx-64/icu-75.1-h120a0e1_0.conda#d68d48a3060eb5abdc1cdc8e2a3a5966 https://conda.anaconda.org/conda-forge/osx-64/libbrotlicommon-1.1.0-h00291cd_2.conda#58f2c4bdd56c46cc7451596e4ae68e0b -https://conda.anaconda.org/conda-forge/osx-64/libcxx-20.1.3-hf95d169_0.conda#022f109787a9624301ddbeb39519ff13 +https://conda.anaconda.org/conda-forge/osx-64/libcxx-20.1.4-hf95d169_0.conda#9a38a63cfe950dd3e1b3adfcba731d3a https://conda.anaconda.org/conda-forge/osx-64/libdeflate-1.23-hcc1b750_0.conda#5d3507f22dda24f7d9a79325ad313e44 https://conda.anaconda.org/conda-forge/osx-64/libexpat-2.7.0-h240833e_0.conda#026d0a1056ba2a3dbbea6d4b08188676 https://conda.anaconda.org/conda-forge/osx-64/libffi-3.4.6-h281671d_1.conda#4ca9ea59839a9ca8df84170fab4ceb41 @@ -21,7 +21,7 @@ https://conda.anaconda.org/conda-forge/osx-64/liblzma-5.8.1-hd471939_0.conda#8e1 https://conda.anaconda.org/conda-forge/osx-64/libmpdec-4.0.0-hfdf4475_0.conda#ed625b2e59dff82859c23dd24774156b https://conda.anaconda.org/conda-forge/osx-64/libwebp-base-1.5.0-h6cf52b4_0.conda#5e0cefc99a231ac46ba21e27ae44689f https://conda.anaconda.org/conda-forge/osx-64/libzlib-1.3.1-hd23fc13_2.conda#003a54a4e32b02f7355b50a837e699da -https://conda.anaconda.org/conda-forge/osx-64/llvm-openmp-20.1.3-ha54dae1_0.conda#16b29a91c8177de8910477ded0f80191 +https://conda.anaconda.org/conda-forge/osx-64/llvm-openmp-20.1.4-ha54dae1_0.conda#985619d7704847d30346abb6feeb8351 https://conda.anaconda.org/conda-forge/osx-64/ncurses-6.5-h0622a9a_3.conda#ced34dd9929f491ca6dab6a2927aff25 https://conda.anaconda.org/conda-forge/osx-64/pthread-stubs-0.4-h00291cd_1002.conda#8bcf980d2c6b17094961198284b8e862 https://conda.anaconda.org/conda-forge/osx-64/xorg-libxau-1.0.12-h6e16a3a_0.conda#4cf40e60b444d56512a64f39d12c20bd @@ -39,7 +39,7 @@ https://conda.anaconda.org/conda-forge/osx-64/libxcb-1.17.0-hf1f96e2_0.conda#bbe https://conda.anaconda.org/conda-forge/osx-64/libxml2-2.14.2-h8c082e5_0.conda#4adac80accf99fa253f0620444ad01fb https://conda.anaconda.org/conda-forge/osx-64/mkl-2023.2.0-h54c2260_50500.conda#0a342ccdc79e4fcd359245ac51941e7b https://conda.anaconda.org/conda-forge/osx-64/ninja-1.12.1-hd6aca1a_1.conda#1cf196736676270fa876001901e4e1db -https://conda.anaconda.org/conda-forge/osx-64/openssl-3.5.0-hc426f3f_0.conda#e06e13c34056b6334a7a1188b0f4c83c +https://conda.anaconda.org/conda-forge/osx-64/openssl-3.5.0-hc426f3f_1.conda#919faa07b9647beb99a0e7404596a465 https://conda.anaconda.org/conda-forge/osx-64/qhull-2020.2-h3c5361c_5.conda#dd1ea9ff27c93db7c01a7b7656bd4ad4 https://conda.anaconda.org/conda-forge/osx-64/readline-8.2-h7cca4af_2.conda#342570f8e02f2f022147a7f841475784 https://conda.anaconda.org/conda-forge/osx-64/tapi-1300.6.5-h390ca13_0.conda#c6ee25eb54accb3f1c8fc39203acfaf1 @@ -72,32 +72,32 @@ https://conda.anaconda.org/conda-forge/osx-64/libfreetype-2.13.3-h694c41f_1.cond https://conda.anaconda.org/conda-forge/osx-64/libhiredis-1.0.2-h2beb688_0.tar.bz2#524282b2c46c9dedf051b3bc2ae05494 https://conda.anaconda.org/conda-forge/osx-64/liblapack-3.9.0-20_osx64_mkl.conda#58f08e12ad487fac4a08f90ff0b87aec https://conda.anaconda.org/conda-forge/osx-64/llvm-tools-18-18.1.8-default_h3571c67_5.conda#4391981e855468ced32ca1940b3d7613 +https://conda.anaconda.org/conda-forge/noarch/meson-1.8.0-pyh29332c3_0.conda#8e25221b702272394b86b0f4d7217f77 https://conda.anaconda.org/conda-forge/osx-64/mpc-1.3.1-h9d8efa1_1.conda#0520855aaae268ea413d6bc913f1384c https://conda.anaconda.org/conda-forge/noarch/munkres-1.1.4-pyh9f0ad1d_0.tar.bz2#2ba8498c1018c1e9c61eb99b973dfe19 https://conda.anaconda.org/conda-forge/osx-64/openjpeg-2.5.3-h7fd6d84_0.conda#025c711177fc3309228ca1a32374458d https://conda.anaconda.org/conda-forge/noarch/packaging-25.0-pyh29332c3_1.conda#58335b26c38bf4a20f399384c33cbcf9 -https://conda.anaconda.org/conda-forge/noarch/pip-25.1-pyh145f28c_0.conda#4627e20c39e7340febed674c3bf05b16 +https://conda.anaconda.org/conda-forge/noarch/pip-25.1.1-pyh145f28c_0.conda#01384ff1639c6330a0924791413b8714 https://conda.anaconda.org/conda-forge/noarch/pluggy-1.5.0-pyhd8ed1ab_1.conda#e9dcbce5f45f9ee500e728ae58b605b6 https://conda.anaconda.org/conda-forge/noarch/pyparsing-3.2.3-pyhd8ed1ab_1.conda#513d3c262ee49b54a8fec85c5bc99764 https://conda.anaconda.org/conda-forge/noarch/python-tzdata-2025.2-pyhd8ed1ab_0.conda#88476ae6ebd24f39261e0854ac244f33 https://conda.anaconda.org/conda-forge/noarch/pytz-2025.2-pyhd8ed1ab_0.conda#bc8e3267d44011051f2eb14d22fb0960 -https://conda.anaconda.org/conda-forge/noarch/setuptools-79.0.1-pyhff2d567_0.conda#fa6669cc21abd4b7b6c5393b7bc71914 +https://conda.anaconda.org/conda-forge/noarch/setuptools-80.1.0-pyhff2d567_0.conda#f6f72d0837c79eaec77661be43e8a691 https://conda.anaconda.org/conda-forge/noarch/six-1.17.0-pyhd8ed1ab_0.conda#a451d576819089b0d672f18768be0f65 https://conda.anaconda.org/conda-forge/noarch/threadpoolctl-3.6.0-pyhecae5ae_0.conda#9d64911b31d57ca443e9f1e36b04385f https://conda.anaconda.org/conda-forge/noarch/toml-0.10.2-pyhd8ed1ab_1.conda#b0dd904de08b7db706167240bf37b164 https://conda.anaconda.org/conda-forge/noarch/tomli-2.2.1-pyhd8ed1ab_1.conda#ac944244f1fed2eb49bae07193ae8215 https://conda.anaconda.org/conda-forge/osx-64/tornado-6.4.2-py313h63b0ddb_0.conda#74a3a14f82dc65fa19f4fd4e2eb8da93 -https://conda.anaconda.org/conda-forge/osx-64/ccache-4.11.2-h30d2cd9_0.conda#9412b5214abe467b2d70eaf8c65975a0 +https://conda.anaconda.org/conda-forge/osx-64/ccache-4.11.3-h33566b8_0.conda#b65cad834bd6c1f660c101cca09430bf https://conda.anaconda.org/conda-forge/osx-64/clang-18-18.1.8-default_h3571c67_9.conda#e29d8d2866f15f3b167938cc0e775b2f https://conda.anaconda.org/conda-forge/osx-64/coverage-7.8.0-py313h717bdf5_0.conda#1215b56c8d9915318d1714cbd004035f https://conda.anaconda.org/conda-forge/osx-64/fonttools-4.57.0-py313h717bdf5_0.conda#190b8625dd6c38afe4f10e3be50122e4 https://conda.anaconda.org/conda-forge/osx-64/freetype-2.13.3-h694c41f_1.conda#126dba1baf5030cb6f34533718924577 https://conda.anaconda.org/conda-forge/osx-64/gfortran_impl_osx-64-13.3.0-hbf5bf67_105.conda#f56a107c8d1253346d01785ecece7977 -https://conda.anaconda.org/conda-forge/noarch/joblib-1.4.2-pyhd8ed1ab_1.conda#bf8243ee348f3a10a14ed0cae323e0c1 +https://conda.anaconda.org/conda-forge/noarch/joblib-1.5.0-pyhd8ed1ab_0.conda#3d7257f0a61c9aa4ffa3e324a887416b https://conda.anaconda.org/conda-forge/osx-64/ld64-951.9-h4e51db5_6.conda#45bf526d53b1bc95bc0b932a91a41576 https://conda.anaconda.org/conda-forge/osx-64/liblapacke-3.9.0-20_osx64_mkl.conda#124ae8e384268a8da66f1d64114a1eda https://conda.anaconda.org/conda-forge/osx-64/llvm-tools-18.1.8-default_h3571c67_5.conda#cc07ff74d2547da1f1452c42b67bafd6 -https://conda.anaconda.org/conda-forge/noarch/meson-1.7.1-pyhd8ed1ab_0.conda#90018ee73b8741268027421ceac2809a https://conda.anaconda.org/conda-forge/osx-64/numpy-2.2.5-py313hc518a0f_0.conda#eba644ccc203cfde2fa1f450f528c70d https://conda.anaconda.org/conda-forge/noarch/pyproject-metadata-0.9.1-pyhd8ed1ab_0.conda#22ae7c6ea81e0c8661ef32168dda929b https://conda.anaconda.org/conda-forge/noarch/pytest-8.3.5-pyhd8ed1ab_0.conda#c3c9316209dec74a705a36797970c6be diff --git a/build_tools/azure/pylatest_conda_mkl_no_openmp_osx-64_conda.lock b/build_tools/azure/pylatest_conda_mkl_no_openmp_osx-64_conda.lock index c0d3ba892c505..ed4af051f10c6 100644 --- a/build_tools/azure/pylatest_conda_mkl_no_openmp_osx-64_conda.lock +++ b/build_tools/azure/pylatest_conda_mkl_no_openmp_osx-64_conda.lock @@ -12,7 +12,7 @@ https://repo.anaconda.com/pkgs/main/osx-64/libffi-3.4.4-hecd8cb5_1.conda#eb7f09a https://repo.anaconda.com/pkgs/main/osx-64/libwebp-base-1.3.2-h46256e1_1.conda#399c11b50e6e7a6969aca9a84ea416b7 https://repo.anaconda.com/pkgs/main/osx-64/llvm-openmp-14.0.6-h0dcd299_0.conda#b5804d32b87dc61ca94561ade33d5f2d https://repo.anaconda.com/pkgs/main/osx-64/ncurses-6.4-hcec6c5f_0.conda#0214d1ee980e217fabc695f1e40662aa -https://repo.anaconda.com/pkgs/main/noarch/tzdata-2025a-h04d1e81_0.conda#885caf42f821b98b3321dc4108511a3d +https://repo.anaconda.com/pkgs/main/noarch/tzdata-2025b-h04d1e81_0.conda#1d027393db3427ab22a02aa44a56f143 https://repo.anaconda.com/pkgs/main/osx-64/xz-5.6.4-h46256e1_1.conda#ce989a528575ad332a650bb7c7f7e5d5 https://repo.anaconda.com/pkgs/main/osx-64/zlib-1.2.13-h4b97444_1.conda#38e35f7c817fac0973034bfce6706ec2 https://repo.anaconda.com/pkgs/main/osx-64/ccache-3.7.9-hf120daa_0.conda#a01515a32e721c51d631283f991bc8ea @@ -48,9 +48,9 @@ https://repo.anaconda.com/pkgs/main/osx-64/openjpeg-2.5.2-h2d09ccc_1.conda#0f2e2 https://repo.anaconda.com/pkgs/main/osx-64/packaging-24.2-py312hecd8cb5_0.conda#76512e47c9c37443444ef0624769f620 https://repo.anaconda.com/pkgs/main/osx-64/pluggy-1.5.0-py312hecd8cb5_0.conda#ca381e438f1dbd7986ac0fa0da70c9d8 https://repo.anaconda.com/pkgs/main/osx-64/pyparsing-3.2.0-py312hecd8cb5_0.conda#e4086daaaed13f68cc8d5b9da7db73cc -https://repo.anaconda.com/pkgs/main/noarch/python-tzdata-2023.3-pyhd3eb1b0_0.conda#479c037de0186d114b9911158427624e +https://repo.anaconda.com/pkgs/main/noarch/python-tzdata-2025.2-pyhd3eb1b0_0.conda#5ac858f05dbf9d3cdb04d53516901247 https://repo.anaconda.com/pkgs/main/osx-64/pytz-2024.1-py312hecd8cb5_0.conda#2b28ec0e0d07f5c0c701f75200b1e8b6 -https://repo.anaconda.com/pkgs/main/osx-64/setuptools-75.8.0-py312hecd8cb5_0.conda#23bf9c15a65f2950af1716724c4e5396 +https://repo.anaconda.com/pkgs/main/osx-64/setuptools-78.1.1-py312hecd8cb5_0.conda#76b66b96a1564cb76011408c1eb8df3e https://repo.anaconda.com/pkgs/main/osx-64/six-1.17.0-py312hecd8cb5_0.conda#aadd782bc06426887ae0835eedd98ceb https://repo.anaconda.com/pkgs/main/noarch/toml-0.10.2-pyhd3eb1b0_0.conda#cda05f5f6d8509529d1a2743288d197a https://repo.anaconda.com/pkgs/main/osx-64/tornado-6.4.2-py312h46256e1_0.conda#6b41d7d8a2bf93ae3fc512202b14a9ec @@ -59,7 +59,7 @@ https://repo.anaconda.com/pkgs/main/osx-64/wheel-0.45.1-py312hecd8cb5_0.conda#fa https://repo.anaconda.com/pkgs/main/osx-64/fonttools-4.55.3-py312h46256e1_0.conda#f7680dd6b8b1c2f8aab17cf6630c6deb https://repo.anaconda.com/pkgs/main/osx-64/numpy-base-1.26.4-py312h6f81483_0.conda#87f73efbf26ab2e2ea7c32481a71bd47 https://repo.anaconda.com/pkgs/main/osx-64/pillow-11.1.0-py312h935ef2f_1.conda#c2f7a3f027cc93a3626d50b765b75dc5 -https://repo.anaconda.com/pkgs/main/osx-64/pip-25.0-py312hecd8cb5_0.conda#ece07a868514de9803e7a3c8aec1909f +https://repo.anaconda.com/pkgs/main/noarch/pip-25.1-pyhc872135_2.conda#2778327d2a700153fefe0e69438b18e1 https://repo.anaconda.com/pkgs/main/osx-64/pytest-8.3.4-py312hecd8cb5_0.conda#b15ee02022967632dfa1672669228bee https://repo.anaconda.com/pkgs/main/osx-64/python-dateutil-2.9.0post0-py312hecd8cb5_2.conda#1047dde28f78127dd9f6121e882926dd https://repo.anaconda.com/pkgs/main/osx-64/pytest-cov-6.0.0-py312hecd8cb5_0.conda#db697e319a4d1145363246a51eef0352 @@ -76,7 +76,7 @@ https://repo.anaconda.com/pkgs/main/osx-64/scipy-1.11.4-py312h81688c2_0.conda#7d https://repo.anaconda.com/pkgs/main/osx-64/pandas-2.2.3-py312h6d0c2b6_0.conda#84ce5b8ec4a986d13a5df17811f556a2 https://repo.anaconda.com/pkgs/main/osx-64/pyamg-5.2.1-py312h1962661_0.conda#58881950d4ce74c9302b56961f97a43c # pip cython @ https://files.pythonhosted.org/packages/e6/6c/3be501a6520a93449b1e7e6f63e598ec56f3b5d1bc7ad14167c72a22ddf7/Cython-3.0.12-cp312-cp312-macosx_10_9_x86_64.whl#sha256=fe030d4a00afb2844f5f70896b7f2a1a0d7da09bf3aa3d884cbe5f73fff5d310 -# pip meson @ https://files.pythonhosted.org/packages/e5/2b/46bda4ef5a7ae4135dbfe27fc0368c44e5a349a897a54fdf2cedb8dcb66e/meson-1.7.2-py3-none-any.whl#sha256=82c6818dc81743c96de3a458f06175776ebfde4081195ea31ea6971838f25e38 +# pip meson @ https://files.pythonhosted.org/packages/df/d7/f1c8acf0e597d4d07532f519780ee6e11ba285a9b092f18706b4c9118331/meson-1.8.0-py3-none-any.whl#sha256=472b7b25da286447333d32872b82d1c6f1a34024fb8ee017d7308056c25fec1f # pip threadpoolctl @ https://files.pythonhosted.org/packages/32/d5/f9a850d79b0851d1d4ef6456097579a9005b31fea68726a4ae5f2d82ddd9/threadpoolctl-3.6.0-py3-none-any.whl#sha256=43a0b8fd5a2928500110039e43a5eed8480b918967083ea48dc3ab9f13c4a7fb # pip pyproject-metadata @ https://files.pythonhosted.org/packages/7e/b1/8e63033b259e0a4e40dd1ec4a9fee17718016845048b43a36ec67d62e6fe/pyproject_metadata-0.9.1-py3-none-any.whl#sha256=ee5efde548c3ed9b75a354fc319d5afd25e9585fa918a34f62f904cc731973ad # pip meson-python @ https://files.pythonhosted.org/packages/7d/ec/40c0ddd29ef4daa6689a2b9c5ced47d5b58fa54ae149b19e9a97f4979c8c/meson_python-0.17.1-py3-none-any.whl#sha256=30a75c52578ef14aff8392677b09c39346e0a24d2b2c6204b8ed30583c11269c diff --git a/build_tools/azure/pylatest_pip_openblas_pandas_linux-64_conda.lock b/build_tools/azure/pylatest_pip_openblas_pandas_linux-64_conda.lock index e137fc315653d..edffbc7d70f46 100644 --- a/build_tools/azure/pylatest_pip_openblas_pandas_linux-64_conda.lock +++ b/build_tools/azure/pylatest_pip_openblas_pandas_linux-64_conda.lock @@ -6,7 +6,7 @@ https://repo.anaconda.com/pkgs/main/linux-64/_libgcc_mutex-0.1-main.conda#c3473f https://repo.anaconda.com/pkgs/main/linux-64/ca-certificates-2025.2.25-h06a4308_0.conda#495015d24da8ad929e3ae2d18571016d https://repo.anaconda.com/pkgs/main/linux-64/ld_impl_linux-64-2.40-h12ee557_0.conda#ee672b5f635340734f58d618b7bca024 https://repo.anaconda.com/pkgs/main/linux-64/python_abi-3.13-0_cp313.conda#d4009c49dd2b54ffded7f1365b5f6505 -https://repo.anaconda.com/pkgs/main/noarch/tzdata-2025a-h04d1e81_0.conda#885caf42f821b98b3321dc4108511a3d +https://repo.anaconda.com/pkgs/main/noarch/tzdata-2025b-h04d1e81_0.conda#1d027393db3427ab22a02aa44a56f143 https://repo.anaconda.com/pkgs/main/linux-64/libgomp-11.2.0-h1234567_1.conda#b372c0eea9b60732fdae4b817a63c8cd https://repo.anaconda.com/pkgs/main/linux-64/libstdcxx-ng-11.2.0-h1234567_1.conda#57623d10a70e09e1d048c2b2b6f4e2dd https://repo.anaconda.com/pkgs/main/linux-64/_openmp_mutex-5.1-1_gnu.conda#71d281e9c2192cb3fa425655a8defb85 @@ -25,13 +25,13 @@ https://repo.anaconda.com/pkgs/main/linux-64/readline-8.2-h5eee18b_0.conda#be421 https://repo.anaconda.com/pkgs/main/linux-64/tk-8.6.14-h39e8969_0.conda#78dbc5e3c69143ebc037fc5d5b22e597 https://repo.anaconda.com/pkgs/main/linux-64/sqlite-3.45.3-h5eee18b_0.conda#acf93d6aceb74d6110e20b44cc45939e https://repo.anaconda.com/pkgs/main/linux-64/python-3.13.2-hf623796_100_cp313.conda#bf836f30ac4c16fd3d71c1aaa25da08c -https://repo.anaconda.com/pkgs/main/linux-64/setuptools-75.8.0-py313h06a4308_0.conda#45420d536cdd6c3f76b3ea1e4a7fbeac +https://repo.anaconda.com/pkgs/main/linux-64/setuptools-78.1.1-py313h06a4308_0.conda#8f8e1c1e3af9d2d371aaa0ee8316ae7c https://repo.anaconda.com/pkgs/main/linux-64/wheel-0.45.1-py313h06a4308_0.conda#29057e876eedce0e37c2388c138a19f9 -https://repo.anaconda.com/pkgs/main/linux-64/pip-25.0-py313h06a4308_0.conda#cbe254aa48f8c0f980a12976e7571e0e +https://repo.anaconda.com/pkgs/main/noarch/pip-25.1-pyhc872135_2.conda#2778327d2a700153fefe0e69438b18e1 # pip alabaster @ https://files.pythonhosted.org/packages/7e/b3/6b4067be973ae96ba0d615946e314c5ae35f9f993eca561b356540bb0c2b/alabaster-1.0.0-py3-none-any.whl#sha256=fc6786402dc3fcb2de3cabd5fe455a2db534b371124f1f21de8731783dec828b # pip babel @ https://files.pythonhosted.org/packages/b7/b8/3fe70c75fe32afc4bb507f75563d39bc5642255d1d94f1f23604725780bf/babel-2.17.0-py3-none-any.whl#sha256=4d0b53093fdfb4b21c92b5213dba5a1b23885afa8383709427046b21c366e5f2 # pip certifi @ https://files.pythonhosted.org/packages/4a/7e/3db2bd1b1f9e95f7cddca6d6e75e2f2bd9f51b1246e546d88addca0106bd/certifi-2025.4.26-py3-none-any.whl#sha256=30350364dfe371162649852c63336a15c70c6510c2ad5015b21c2345311805f3 -# pip charset-normalizer @ https://files.pythonhosted.org/packages/52/ed/b7f4f07de100bdb95c1756d3a4d17b90c1a3c53715c1a476f8738058e0fa/charset_normalizer-3.4.1-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl#sha256=955f8851919303c92343d2f66165294848d57e9bba6cf6e3625485a70a038d11 +# pip charset-normalizer @ https://files.pythonhosted.org/packages/e2/28/ffc026b26f441fc67bd21ab7f03b313ab3fe46714a14b516f931abe1a2d8/charset_normalizer-3.4.2-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl#sha256=6c9379d65defcab82d07b2a9dfbfc2e95bc8fe0ebb1b176a3190230a3ef0e07c # pip coverage @ https://files.pythonhosted.org/packages/cb/74/2f8cc196643b15bc096d60e073691dadb3dca48418f08bc78dd6e899383e/coverage-7.8.0-cp313-cp313-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl#sha256=5aaeb00761f985007b38cf463b1d160a14a22c34eb3f6a39d9ad6fc27cb73008 # pip cycler @ https://files.pythonhosted.org/packages/e7/05/c19819d5e3d95294a6f5947fb9b9629efb316b96de511b418c53d245aae6/cycler-0.12.1-py3-none-any.whl#sha256=85cef7cff222d8644161529808465972e51340599459b8ac3ccbac5a854e0d30 # pip cython @ https://files.pythonhosted.org/packages/a8/30/7f48207ea13dab46604db0dd388e807d53513ba6ad1c34462892072f8f8c/Cython-3.0.12-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl#sha256=879ae9023958d63c0675015369384642d0afb9c9d1f3473df9186c42f7a9d265 @@ -41,10 +41,10 @@ https://repo.anaconda.com/pkgs/main/linux-64/pip-25.0-py313h06a4308_0.conda#cbe2 # pip idna @ https://files.pythonhosted.org/packages/76/c6/c88e154df9c4e1a2a66ccf0005a88dfb2650c1dffb6f5ce603dfbd452ce3/idna-3.10-py3-none-any.whl#sha256=946d195a0d259cbba61165e88e65941f16e9b36ea6ddb97f00452bae8b1287d3 # pip imagesize @ https://files.pythonhosted.org/packages/ff/62/85c4c919272577931d407be5ba5d71c20f0b616d31a0befe0ae45bb79abd/imagesize-1.4.1-py2.py3-none-any.whl#sha256=0d8d18d08f840c19d0ee7ca1fd82490fdc3729b7ac93f49870406ddde8ef8d8b # pip iniconfig @ https://files.pythonhosted.org/packages/2c/e1/e6716421ea10d38022b952c159d5161ca1193197fb744506875fbb87ea7b/iniconfig-2.1.0-py3-none-any.whl#sha256=9deba5723312380e77435581c6bf4935c94cbfab9b1ed33ef8d238ea168eb760 -# pip joblib @ https://files.pythonhosted.org/packages/91/29/df4b9b42f2be0b623cbd5e2140cafcaa2bef0759a00b7b70104dcfe2fb51/joblib-1.4.2-py3-none-any.whl#sha256=06d478d5674cbc267e7496a410ee875abd68e4340feff4490bcb7afb88060ae6 +# pip joblib @ https://files.pythonhosted.org/packages/da/d3/13ee227a148af1c693654932b8b0b02ed64af5e1f7406d56b088b57574cd/joblib-1.5.0-py3-none-any.whl#sha256=206144b320246485b712fc8cc51f017de58225fa8b414a1fe1764a7231aca491 # pip kiwisolver @ https://files.pythonhosted.org/packages/8f/e9/6a7d025d8da8c4931522922cd706105aa32b3291d1add8c5427cdcd66e63/kiwisolver-1.4.8-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl#sha256=a5ce1e481a74b44dd5e92ff03ea0cb371ae7a0268318e202be06c8f04f4f1246 # pip markupsafe @ https://files.pythonhosted.org/packages/0c/91/96cf928db8236f1bfab6ce15ad070dfdd02ed88261c2afafd4b43575e9e9/MarkupSafe-3.0.2-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl#sha256=15ab75ef81add55874e7ab7055e9c397312385bd9ced94920f2802310c930396 -# pip meson @ https://files.pythonhosted.org/packages/e5/2b/46bda4ef5a7ae4135dbfe27fc0368c44e5a349a897a54fdf2cedb8dcb66e/meson-1.7.2-py3-none-any.whl#sha256=82c6818dc81743c96de3a458f06175776ebfde4081195ea31ea6971838f25e38 +# pip meson @ https://files.pythonhosted.org/packages/df/d7/f1c8acf0e597d4d07532f519780ee6e11ba285a9b092f18706b4c9118331/meson-1.8.0-py3-none-any.whl#sha256=472b7b25da286447333d32872b82d1c6f1a34024fb8ee017d7308056c25fec1f # pip networkx @ https://files.pythonhosted.org/packages/b9/54/dd730b32ea14ea797530a4479b2ed46a6fb250f682a9cfb997e968bf0261/networkx-3.4.2-py3-none-any.whl#sha256=df5d4365b724cf81b8c6a7312509d0c22386097011ad1abe274afd5e9d3bbc5f # pip ninja @ https://files.pythonhosted.org/packages/eb/7a/455d2877fe6cf99886849c7f9755d897df32eaf3a0fba47b56e615f880f7/ninja-1.11.1.4-py3-none-manylinux_2_12_x86_64.manylinux2010_x86_64.whl#sha256=096487995473320de7f65d622c3f1d16c3ad174797602218ca8c967f51ec38a0 # pip numpy @ https://files.pythonhosted.org/packages/aa/fc/ebfd32c3e124e6a1043e19c0ab0769818aa69050ce5589b63d05ff185526/numpy-2.2.5-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl#sha256=2ba321813a00e508d5421104464510cc962a6f791aa2fca1c97b1e65027da80d diff --git a/build_tools/azure/pymin_conda_forge_mkl_win-64_conda.lock b/build_tools/azure/pymin_conda_forge_mkl_win-64_conda.lock index e5d24cc45111c..051a5041f1138 100644 --- a/build_tools/azure/pymin_conda_forge_mkl_win-64_conda.lock +++ b/build_tools/azure/pymin_conda_forge_mkl_win-64_conda.lock @@ -35,8 +35,8 @@ https://conda.anaconda.org/conda-forge/win-64/libsqlite-3.49.1-h67fdade_2.conda# https://conda.anaconda.org/conda-forge/win-64/libwebp-base-1.5.0-h3b0e114_0.conda#33f7313967072c6e6d8f865f5493c7ae https://conda.anaconda.org/conda-forge/win-64/libzlib-1.3.1-h2466b09_2.conda#41fbfac52c601159df6c01f875de31b9 https://conda.anaconda.org/conda-forge/win-64/ninja-1.12.1-hc790b64_1.conda#3974c522f3248d4a93e6940c463d2de7 -https://conda.anaconda.org/conda-forge/win-64/openssl-3.5.0-ha4e3fda_0.conda#4ea7db75035eb8c13fa680bb90171e08 -https://conda.anaconda.org/conda-forge/win-64/pixman-0.44.2-had0cd8c_0.conda#c720ac9a3bd825bf8b4dc7523ea49be4 +https://conda.anaconda.org/conda-forge/win-64/openssl-3.5.0-ha4e3fda_1.conda#72c07e46b6766bb057018a9a74861b89 +https://conda.anaconda.org/conda-forge/win-64/pixman-0.46.0-had0cd8c_0.conda#01617534ef71b5385ebba940a6d6150d https://conda.anaconda.org/conda-forge/win-64/qhull-2020.2-hc790b64_5.conda#854fbdff64b572b5c0b470f334d34c11 https://conda.anaconda.org/conda-forge/win-64/tk-8.6.13-h5226925_1.conda#fc048363eb8f03cd1737600a5d08aafe https://conda.anaconda.org/conda-forge/win-64/krb5-1.21.3-hdf4eb48_0.conda#31aec030344e962fbd7dbbbbd68e60a9 @@ -46,7 +46,7 @@ https://conda.anaconda.org/conda-forge/win-64/libgcc-14.2.0-h1383e82_2.conda#4a7 https://conda.anaconda.org/conda-forge/win-64/libintl-0.22.5-h5728263_3.conda#2cf0cf76cc15d360dfa2f17fd6cf9772 https://conda.anaconda.org/conda-forge/win-64/libpng-1.6.47-h7a4582a_0.conda#ad620e92b82d2948bc019e029c574ebb https://conda.anaconda.org/conda-forge/win-64/libxml2-2.13.7-h442d1da_1.conda#c14ff7f05e57489df9244917d2b55763 -https://conda.anaconda.org/conda-forge/win-64/pcre2-10.44-h3d7b363_2.conda#a3a3baddcfb8c80db84bec3cb7746fb8 +https://conda.anaconda.org/conda-forge/win-64/pcre2-10.44-h99c9b8b_2.conda#a912b2c4ff0f03101c751aa79a331831 https://conda.anaconda.org/conda-forge/win-64/python-3.10.17-h8c5b53a_0_cpython.conda#0c59918f056ab2e9c7bb45970d32b2ea https://conda.anaconda.org/conda-forge/win-64/zstd-1.5.7-hbeecb71_2.conda#21f56217d6125fb30c3c3f10c786d751 https://conda.anaconda.org/conda-forge/win-64/brotli-bin-1.1.0-h2466b09_2.conda#d22534a9be5771fc58eb7564947f669d @@ -57,18 +57,19 @@ https://conda.anaconda.org/conda-forge/noarch/exceptiongroup-1.2.2-pyhd8ed1ab_1. https://conda.anaconda.org/conda-forge/noarch/execnet-2.1.1-pyhd8ed1ab_1.conda#a71efeae2c160f6789900ba2631a2c90 https://conda.anaconda.org/conda-forge/noarch/iniconfig-2.0.0-pyhd8ed1ab_1.conda#6837f3eff7dcea42ecd714ce1ac2b108 https://conda.anaconda.org/conda-forge/win-64/kiwisolver-1.4.7-py310hc19bc0b_0.conda#50d96539497fc7493cbe469fbb6b8b6e -https://conda.anaconda.org/conda-forge/win-64/libclang13-20.1.3-default_h6e92b77_0.conda#e7530cd4a3b5e3d2348be3d836cb196c +https://conda.anaconda.org/conda-forge/win-64/libclang13-20.1.4-default_h6e92b77_0.conda#80c3ee2ffb5f35f2b6c4b10d636b04fb https://conda.anaconda.org/conda-forge/win-64/libfreetype6-2.13.3-h0b5ce68_1.conda#a84b7d1a13060a9372bea961a8131dbc https://conda.anaconda.org/conda-forge/win-64/libglib-2.84.1-h7025463_0.conda#6cbaea9075a4f007eb7d0a90bb9a2a09 https://conda.anaconda.org/conda-forge/win-64/libhwloc-2.11.2-default_ha69328c_1001.conda#b87a0ac5ab6495d8225db5dc72dd21cd https://conda.anaconda.org/conda-forge/win-64/libtiff-4.7.0-h797046b_4.conda#7d938ca70c64c5516767b4eae0a56172 https://conda.anaconda.org/conda-forge/win-64/libxslt-1.1.39-h3df6e99_0.conda#279ee338c9b34871d578cb3c7aa68f70 +https://conda.anaconda.org/conda-forge/noarch/meson-1.8.0-pyh29332c3_0.conda#8e25221b702272394b86b0f4d7217f77 https://conda.anaconda.org/conda-forge/noarch/munkres-1.1.4-pyh9f0ad1d_0.tar.bz2#2ba8498c1018c1e9c61eb99b973dfe19 https://conda.anaconda.org/conda-forge/noarch/packaging-25.0-pyh29332c3_1.conda#58335b26c38bf4a20f399384c33cbcf9 https://conda.anaconda.org/conda-forge/noarch/pluggy-1.5.0-pyhd8ed1ab_1.conda#e9dcbce5f45f9ee500e728ae58b605b6 https://conda.anaconda.org/conda-forge/win-64/pthread-stubs-0.4-h0e40799_1002.conda#3c8f2573569bb816483e5cf57efbbe29 https://conda.anaconda.org/conda-forge/noarch/pyparsing-3.2.3-pyhd8ed1ab_1.conda#513d3c262ee49b54a8fec85c5bc99764 -https://conda.anaconda.org/conda-forge/noarch/setuptools-79.0.1-pyhff2d567_0.conda#fa6669cc21abd4b7b6c5393b7bc71914 +https://conda.anaconda.org/conda-forge/noarch/setuptools-80.1.0-pyhff2d567_0.conda#f6f72d0837c79eaec77661be43e8a691 https://conda.anaconda.org/conda-forge/noarch/six-1.17.0-pyhd8ed1ab_0.conda#a451d576819089b0d672f18768be0f65 https://conda.anaconda.org/conda-forge/noarch/threadpoolctl-3.6.0-pyhecae5ae_0.conda#9d64911b31d57ca443e9f1e36b04385f https://conda.anaconda.org/conda-forge/noarch/toml-0.10.2-pyhd8ed1ab_1.conda#b0dd904de08b7db706167240bf37b164 @@ -80,13 +81,12 @@ https://conda.anaconda.org/conda-forge/win-64/xorg-libxau-1.0.12-h0e40799_0.cond https://conda.anaconda.org/conda-forge/win-64/xorg-libxdmcp-1.1.5-h0e40799_0.conda#8393c0f7e7870b4eb45553326f81f0ff https://conda.anaconda.org/conda-forge/win-64/brotli-1.1.0-h2466b09_2.conda#378f1c9421775dfe644731cb121c8979 https://conda.anaconda.org/conda-forge/win-64/coverage-7.8.0-py310h38315fa_0.conda#30a825dae940c63c55bca8df4f806f3e -https://conda.anaconda.org/conda-forge/noarch/joblib-1.4.2-pyhd8ed1ab_1.conda#bf8243ee348f3a10a14ed0cae323e0c1 +https://conda.anaconda.org/conda-forge/noarch/joblib-1.5.0-pyhd8ed1ab_0.conda#3d7257f0a61c9aa4ffa3e324a887416b https://conda.anaconda.org/conda-forge/win-64/lcms2-2.17-hbcf6048_0.conda#3538827f77b82a837fa681a4579e37a1 https://conda.anaconda.org/conda-forge/win-64/libfreetype-2.13.3-h57928b3_1.conda#410ba2c8e7bdb278dfbb5d40220e39d2 https://conda.anaconda.org/conda-forge/win-64/libxcb-1.17.0-h0e4246c_0.conda#a69bbf778a462da324489976c84cfc8c -https://conda.anaconda.org/conda-forge/noarch/meson-1.7.1-pyhd8ed1ab_0.conda#90018ee73b8741268027421ceac2809a https://conda.anaconda.org/conda-forge/win-64/openjpeg-2.5.3-h4d64b90_0.conda#fc050366dd0b8313eb797ed1ffef3a29 -https://conda.anaconda.org/conda-forge/noarch/pip-25.1-pyh8b19718_0.conda#2247aa245832ea47e8b971bef73d7094 +https://conda.anaconda.org/conda-forge/noarch/pip-25.1.1-pyh8b19718_0.conda#32d0781ace05105cc99af55d36cbec7c https://conda.anaconda.org/conda-forge/noarch/pyproject-metadata-0.9.1-pyhd8ed1ab_0.conda#22ae7c6ea81e0c8661ef32168dda929b https://conda.anaconda.org/conda-forge/noarch/pytest-8.3.5-pyhd8ed1ab_0.conda#c3c9316209dec74a705a36797970c6be https://conda.anaconda.org/conda-forge/noarch/python-dateutil-2.9.0.post0-pyhff2d567_1.conda#5ba79d7c71f03c678c8ead841f347d6e diff --git a/build_tools/azure/pymin_conda_forge_openblas_min_dependencies_linux-64_conda.lock b/build_tools/azure/pymin_conda_forge_openblas_min_dependencies_linux-64_conda.lock index 0eae8d97f5a2b..5d0b23f9e2f41 100644 --- a/build_tools/azure/pymin_conda_forge_openblas_min_dependencies_linux-64_conda.lock +++ b/build_tools/azure/pymin_conda_forge_openblas_min_dependencies_linux-64_conda.lock @@ -12,30 +12,31 @@ https://conda.anaconda.org/conda-forge/noarch/ca-certificates-2025.4.26-hbd8a1cb https://conda.anaconda.org/conda-forge/noarch/fonts-conda-forge-1-0.tar.bz2#f766549260d6815b0c52253f1fb1bb29 https://conda.anaconda.org/conda-forge/linux-64/ld_impl_linux-64-2.43-h712a8e2_4.conda#01f8d123c96816249efd255a31ad7712 https://conda.anaconda.org/conda-forge/linux-64/libglvnd-1.7.0-ha4b6fd6_2.conda#434ca7e50e40f4918ab701e3facd59a0 -https://conda.anaconda.org/conda-forge/linux-64/llvm-openmp-20.1.3-h024ca30_0.conda#c721339ea8746513e42b1233b4bbdfb0 +https://conda.anaconda.org/conda-forge/linux-64/llvm-openmp-20.1.4-h024ca30_0.conda#4fc395cda27912a7d904b86b5dbf3a4d https://conda.anaconda.org/conda-forge/linux-64/_openmp_mutex-4.5-3_kmp_llvm.conda#ee5c2118262e30b972bc0b4db8ef0ba5 https://conda.anaconda.org/conda-forge/noarch/fonts-conda-ecosystem-1-0.tar.bz2#fee5683a3f04bd15cbd8318b096a27ab https://conda.anaconda.org/conda-forge/linux-64/libegl-1.7.0-ha4b6fd6_2.conda#c151d5eb730e9b7480e6d48c0fc44048 https://conda.anaconda.org/conda-forge/linux-64/libgcc-14.2.0-h767d61c_2.conda#ef504d1acbd74b7cc6849ef8af47dd03 https://conda.anaconda.org/conda-forge/linux-64/alsa-lib-1.2.14-hb9d3cd8_0.conda#76df83c2a9035c54df5d04ff81bcc02d -https://conda.anaconda.org/conda-forge/linux-64/gettext-tools-0.23.1-h5888daf_0.conda#2f659535feef3cfb782f7053c8775a32 +https://conda.anaconda.org/conda-forge/linux-64/gettext-tools-0.24.1-h5888daf_0.conda#d54305672f0361c2f3886750e7165b5f https://conda.anaconda.org/conda-forge/linux-64/libbrotlicommon-1.1.0-hb9d3cd8_2.conda#41b599ed2b02abcfdd84302bff174b23 https://conda.anaconda.org/conda-forge/linux-64/libdeflate-1.23-h86f0d12_0.conda#27fe770decaf469a53f3e3a6d593067f https://conda.anaconda.org/conda-forge/linux-64/libexpat-2.7.0-h5888daf_0.conda#db0bfbe7dd197b68ad5f30333bae6ce0 https://conda.anaconda.org/conda-forge/linux-64/libffi-3.4.6-h2dba641_1.conda#ede4673863426c0883c0063d853bbd85 https://conda.anaconda.org/conda-forge/linux-64/libgcc-ng-14.2.0-h69a702a_2.conda#a2222a6ada71fb478682efe483ce0f92 -https://conda.anaconda.org/conda-forge/linux-64/libgettextpo-0.23.1-h5888daf_0.conda#a09ce5decdef385bcce78c32809fa794 +https://conda.anaconda.org/conda-forge/linux-64/libgettextpo-0.24.1-h5888daf_0.conda#2ee6d71b72f75d50581f2f68e965efdb https://conda.anaconda.org/conda-forge/linux-64/libgfortran5-14.2.0-hf1ad2bd_2.conda#556a4fdfac7287d349b8f09aba899693 https://conda.anaconda.org/conda-forge/linux-64/libiconv-1.18-h4ce23a2_1.conda#e796ff8ddc598affdf7c173d6145f087 https://conda.anaconda.org/conda-forge/linux-64/libjpeg-turbo-3.1.0-hb9d3cd8_0.conda#9fa334557db9f63da6c9285fd2a48638 https://conda.anaconda.org/conda-forge/linux-64/liblzma-5.8.1-hb9d3cd8_0.conda#0e87378639676987af32fee53ba32258 https://conda.anaconda.org/conda-forge/linux-64/libntlm-1.8-hb9d3cd8_0.conda#7c7927b404672409d9917d49bff5f2d6 +https://conda.anaconda.org/conda-forge/linux-64/libogg-1.3.5-hd0c01bc_1.conda#68e52064ed3897463c0e958ab5c8f91b https://conda.anaconda.org/conda-forge/linux-64/libopus-1.5.2-hd0c01bc_0.conda#b64523fb87ac6f87f0790f324ad43046 https://conda.anaconda.org/conda-forge/linux-64/libstdcxx-14.2.0-h8f9b012_2.conda#a78c856b6dc6bf4ea8daeb9beaaa3fb0 https://conda.anaconda.org/conda-forge/linux-64/libwebp-base-1.5.0-h851e524_0.conda#63f790534398730f59e1b899c3644d4a https://conda.anaconda.org/conda-forge/linux-64/libzlib-1.3.1-hb9d3cd8_2.conda#edb0dca6bc32e4f4789199455a1dbeb8 https://conda.anaconda.org/conda-forge/linux-64/ncurses-6.5-h2d0b736_3.conda#47e340acb35de30501a76c7c799c41d7 -https://conda.anaconda.org/conda-forge/linux-64/openssl-3.5.0-h7b32b05_0.conda#bb539841f2a3fde210f387d00ed4bb9d +https://conda.anaconda.org/conda-forge/linux-64/openssl-3.5.0-h7b32b05_1.conda#de356753cfdbffcde5bb1e86e3aa6cd0 https://conda.anaconda.org/conda-forge/linux-64/pthread-stubs-0.4-hb9d3cd8_1002.conda#b3c17d95b5a10c6e64a21fa17573e70e https://conda.anaconda.org/conda-forge/linux-64/xorg-libice-1.1.2-hb9d3cd8_0.conda#fb901ff28063514abb6046c9ec2c4a45 https://conda.anaconda.org/conda-forge/linux-64/xorg-libxau-1.0.12-hb9d3cd8_0.conda#f6ebe2cb3f82ba6c057dde5d9debe4f7 @@ -47,16 +48,15 @@ https://conda.anaconda.org/conda-forge/linux-64/expat-2.7.0-h5888daf_0.conda#d68 https://conda.anaconda.org/conda-forge/linux-64/keyutils-1.6.1-h166bdaf_0.tar.bz2#30186d27e2c9fa62b45fb1476b7200e3 https://conda.anaconda.org/conda-forge/linux-64/lame-3.100-h166bdaf_1003.tar.bz2#a8832b479f93521a9e7b5b743803be51 https://conda.anaconda.org/conda-forge/linux-64/lerc-4.0.0-h0aef613_1.conda#9344155d33912347b37f0ae6c410a835 -https://conda.anaconda.org/conda-forge/linux-64/libasprintf-0.23.1-h8e693c7_0.conda#988f4937281a66ca19d1adb3b5e3f859 +https://conda.anaconda.org/conda-forge/linux-64/libasprintf-0.24.1-h8e693c7_0.conda#57566a81dd1e5aa3d98ac7582e8bfe03 https://conda.anaconda.org/conda-forge/linux-64/libbrotlidec-1.1.0-hb9d3cd8_2.conda#9566f0bd264fbd463002e759b8a82401 https://conda.anaconda.org/conda-forge/linux-64/libbrotlienc-1.1.0-hb9d3cd8_2.conda#06f70867945ea6a84d35836af780f1de https://conda.anaconda.org/conda-forge/linux-64/libedit-3.1.20250104-pl5321h7949ede_0.conda#c277e0a4d549b03ac1e9d6cbbe3d017b https://conda.anaconda.org/conda-forge/linux-64/libevent-2.1.12-hf998b51_1.conda#a1cfcc585f0c42bf8d5546bb1dfb668d -https://conda.anaconda.org/conda-forge/linux-64/libgettextpo-devel-0.23.1-h5888daf_0.conda#7a5d5c245a6807deab87558e9efd3ef0 +https://conda.anaconda.org/conda-forge/linux-64/libgettextpo-devel-0.24.1-h5888daf_0.conda#8f04c7aae6a46503bc36d1ed5abc8c7c https://conda.anaconda.org/conda-forge/linux-64/libgfortran-14.2.0-h69a702a_2.conda#fb54c4ea68b460c278d26eea89cfbcc3 https://conda.anaconda.org/conda-forge/linux-64/libgpg-error-1.55-h3f2d84a_0.conda#2bd47db5807daade8500ed7ca4c512a4 https://conda.anaconda.org/conda-forge/linux-64/libnsl-2.0.1-hd590300_0.conda#30fd6e37fe21f86f4bd26d6ee73eeec7 -https://conda.anaconda.org/conda-forge/linux-64/libogg-1.3.5-h4ab18f5_0.conda#601bfb4b3c6f0b844443bb81a56651e0 https://conda.anaconda.org/conda-forge/linux-64/libpciaccess-0.18-hd590300_0.conda#48f4330bfcd959c3cfb704d424903c82 https://conda.anaconda.org/conda-forge/linux-64/libpng-1.6.47-h943b412_0.conda#55199e2ae2c3651f6f9b2a447b47bdc9 https://conda.anaconda.org/conda-forge/linux-64/libsqlite-3.49.1-hee588c1_2.conda#962d6ac93c30b1dfc54c9cccafd1003e @@ -69,7 +69,7 @@ https://conda.anaconda.org/conda-forge/linux-64/mpg123-1.32.9-hc50e24c_0.conda#c https://conda.anaconda.org/conda-forge/linux-64/mysql-common-9.0.1-h266115a_6.conda#94116b69829e90b72d566e64421e1bff https://conda.anaconda.org/conda-forge/linux-64/ninja-1.12.1-hff21bea_1.conda#2322531904f27501ee19847b87ba7c64 https://conda.anaconda.org/conda-forge/linux-64/nspr-4.36-h5888daf_0.conda#de9cd5bca9e4918527b9b72b6e2e1409 -https://conda.anaconda.org/conda-forge/linux-64/pixman-0.44.2-h29eaf8c_0.conda#5e2a7acfa2c24188af39e7944e1b3604 +https://conda.anaconda.org/conda-forge/linux-64/pixman-0.46.0-h29eaf8c_0.conda#d2f1c87d4416d1e7344cf92b1aaee1c4 https://conda.anaconda.org/conda-forge/linux-64/readline-8.2-h8c095d6_2.conda#283b96675859b20a825f8fa30f311446 https://conda.anaconda.org/conda-forge/linux-64/tk-8.6.13-noxft_h4845f30_101.conda#d453b98d9c83e71da0741bb0ff4d76bc https://conda.anaconda.org/conda-forge/linux-64/zstd-1.5.7-hb8e6e7a_2.conda#6432cb5d4ac0046c3ac0a8a0f95842f9 @@ -77,7 +77,7 @@ https://conda.anaconda.org/conda-forge/linux-64/brotli-bin-1.1.0-hb9d3cd8_2.cond https://conda.anaconda.org/conda-forge/linux-64/graphite2-1.3.13-h59595ed_1003.conda#f87c7b7c2cb45f323ffbce941c78ab7c https://conda.anaconda.org/conda-forge/linux-64/icu-75.1-he02047a_0.conda#8b189310083baabfb622af68fd9d3ae3 https://conda.anaconda.org/conda-forge/linux-64/krb5-1.21.3-h659f571_0.conda#3f43953b7d3fb3aaa1d0d0723d91e368 -https://conda.anaconda.org/conda-forge/linux-64/libasprintf-devel-0.23.1-h8e693c7_0.conda#2827e722a963b779ce878ef9b5474534 +https://conda.anaconda.org/conda-forge/linux-64/libasprintf-devel-0.24.1-h8e693c7_0.conda#8f66ed2e34507b7ae44afa31c3e4ec79 https://conda.anaconda.org/conda-forge/linux-64/libcap-2.75-h39aace5_0.conda#c44c16d6976d2aebbd65894d7741e67e https://conda.anaconda.org/conda-forge/linux-64/libdrm-2.4.124-hb9d3cd8_0.conda#8bc89311041d7fcb510238cf0848ccae https://conda.anaconda.org/conda-forge/linux-64/libfreetype6-2.13.3-h48d6fc4_1.conda#3c255be50a506c50765a93a6644f32fe @@ -87,7 +87,7 @@ https://conda.anaconda.org/conda-forge/linux-64/libtiff-4.7.0-hd9ff511_4.conda#6 https://conda.anaconda.org/conda-forge/linux-64/libvorbis-1.3.7-h9c3ff4c_0.tar.bz2#309dec04b70a3cc0f1e84a4013683bc0 https://conda.anaconda.org/conda-forge/linux-64/mysql-libs-9.0.1-he0572af_6.conda#9802ae6d20982f42c0f5d69008988763 https://conda.anaconda.org/conda-forge/linux-64/nss-3.110-h159eef7_0.conda#945659af183e87429c8aa7e0be3cc91d -https://conda.anaconda.org/conda-forge/linux-64/pcre2-10.44-hba22ea6_2.conda#df359c09c41cd186fffb93a2d87aa6f5 +https://conda.anaconda.org/conda-forge/linux-64/pcre2-10.45-hc749103_0.conda#b90bece58b4c2bf25969b70f3be42d25 https://conda.anaconda.org/conda-forge/linux-64/python-3.10.17-hd6af730_0_cpython.conda#7bb89638dae9ce1b8e051d0b721e83c2 https://conda.anaconda.org/conda-forge/linux-64/xcb-util-0.4.1-hb711507_2.conda#8637c3e5821654d0edf97e2b0404b443 https://conda.anaconda.org/conda-forge/linux-64/xcb-util-keysyms-0.4.1-hb711507_0.conda#ad748ccca349aec3e91743e08b5e2b50 @@ -103,18 +103,19 @@ https://conda.anaconda.org/conda-forge/linux-64/cyrus-sasl-2.1.27-h54b06d7_7.con https://conda.anaconda.org/conda-forge/linux-64/cython-3.0.10-py310hc6cd4ac_0.conda#bd1d71ee240be36f1d85c86177d6964f https://conda.anaconda.org/conda-forge/noarch/exceptiongroup-1.2.2-pyhd8ed1ab_1.conda#a16662747cdeb9abbac74d0057cc976e https://conda.anaconda.org/conda-forge/noarch/execnet-2.1.1-pyhd8ed1ab_1.conda#a71efeae2c160f6789900ba2631a2c90 -https://conda.anaconda.org/conda-forge/linux-64/gettext-0.23.1-h5888daf_0.conda#0754038c806eae440582da1c3af85577 +https://conda.anaconda.org/conda-forge/linux-64/gettext-0.24.1-h5888daf_0.conda#c63e7590d4d6f4c85721040ed8b12888 https://conda.anaconda.org/conda-forge/noarch/iniconfig-2.0.0-pyhd8ed1ab_1.conda#6837f3eff7dcea42ecd714ce1ac2b108 https://conda.anaconda.org/conda-forge/linux-64/kiwisolver-1.4.7-py310h3788b33_0.conda#4186d9b4d004b0fe0de6aa62496fb48a https://conda.anaconda.org/conda-forge/linux-64/lcms2-2.17-h717163a_0.conda#000e85703f0fd9594c81710dd5066471 https://conda.anaconda.org/conda-forge/linux-64/libcups-2.3.3-h4637d8d_4.conda#d4529f4dff3057982a7617c7ac58fde3 https://conda.anaconda.org/conda-forge/linux-64/libfreetype-2.13.3-ha770c72_1.conda#51f5be229d83ecd401fb369ab96ae669 -https://conda.anaconda.org/conda-forge/linux-64/libglib-2.84.1-h2ff4ddf_0.conda#0305434da649d4fb48a425e588b79ea6 +https://conda.anaconda.org/conda-forge/linux-64/libglib-2.84.1-h3618099_1.conda#714c97d4ff495ab69d1fdfcadbcae985 https://conda.anaconda.org/conda-forge/linux-64/libglx-1.7.0-ha4b6fd6_2.conda#c8013e438185f33b13814c5c488acd5c https://conda.anaconda.org/conda-forge/linux-64/libhiredis-1.0.2-h2cc385e_0.tar.bz2#b34907d3a81a3cd8095ee83d174c074a https://conda.anaconda.org/conda-forge/linux-64/libopenblas-0.3.25-pthreads_h413a1c8_0.conda#d172b34a443b95f86089e8229ddc9a17 https://conda.anaconda.org/conda-forge/linux-64/libsystemd0-257.4-h4e0b6ca_1.conda#04bcf3055e51f8dde6fab9672fb9fca0 https://conda.anaconda.org/conda-forge/linux-64/libxml2-2.13.7-h4bc477f_1.conda#ad1f1f8238834cd3c88ceeaee8da444a +https://conda.anaconda.org/conda-forge/noarch/meson-1.8.0-pyh29332c3_0.conda#8e25221b702272394b86b0f4d7217f77 https://conda.anaconda.org/conda-forge/noarch/munkres-1.1.4-pyh9f0ad1d_0.tar.bz2#2ba8498c1018c1e9c61eb99b973dfe19 https://conda.anaconda.org/conda-forge/linux-64/openjpeg-2.5.3-h5fbd93e_0.conda#9e5816bc95d285c115a3ebc2f8563564 https://conda.anaconda.org/conda-forge/noarch/packaging-25.0-pyh29332c3_1.conda#58335b26c38bf4a20f399384c33cbcf9 @@ -122,7 +123,7 @@ https://conda.anaconda.org/conda-forge/noarch/pluggy-1.5.0-pyhd8ed1ab_1.conda#e9 https://conda.anaconda.org/conda-forge/noarch/ply-3.11-pyhd8ed1ab_3.conda#fd5062942bfa1b0bd5e0d2a4397b099e https://conda.anaconda.org/conda-forge/noarch/pyparsing-3.2.3-pyhd8ed1ab_1.conda#513d3c262ee49b54a8fec85c5bc99764 https://conda.anaconda.org/conda-forge/noarch/pytz-2025.2-pyhd8ed1ab_0.conda#bc8e3267d44011051f2eb14d22fb0960 -https://conda.anaconda.org/conda-forge/noarch/setuptools-79.0.1-pyhff2d567_0.conda#fa6669cc21abd4b7b6c5393b7bc71914 +https://conda.anaconda.org/conda-forge/noarch/setuptools-80.1.0-pyhff2d567_0.conda#f6f72d0837c79eaec77661be43e8a691 https://conda.anaconda.org/conda-forge/noarch/six-1.17.0-pyhd8ed1ab_0.conda#a451d576819089b0d672f18768be0f65 https://conda.anaconda.org/conda-forge/noarch/threadpoolctl-3.1.0-pyh8a188c0_0.tar.bz2#a2995ee828f65687ac5b1e71a2ab1e0c https://conda.anaconda.org/conda-forge/noarch/toml-0.10.2-pyhd8ed1ab_1.conda#b0dd904de08b7db706167240bf37b164 @@ -136,22 +137,21 @@ https://conda.anaconda.org/conda-forge/linux-64/xkeyboard-config-2.44-hb9d3cd8_0 https://conda.anaconda.org/conda-forge/linux-64/xorg-libxext-1.3.6-hb9d3cd8_0.conda#febbab7d15033c913d53c7a2c102309d https://conda.anaconda.org/conda-forge/linux-64/xorg-libxfixes-6.0.1-hb9d3cd8_0.conda#4bdb303603e9821baf5fe5fdff1dc8f8 https://conda.anaconda.org/conda-forge/linux-64/xorg-libxrender-0.9.12-hb9d3cd8_0.conda#96d57aba173e878a2089d5638016dc5e -https://conda.anaconda.org/conda-forge/linux-64/ccache-4.11.2-hd714d17_0.conda#35ae7ce74089ab05fdb1cb9746c0fbe4 +https://conda.anaconda.org/conda-forge/linux-64/ccache-4.11.3-h80c52d3_0.conda#eb517c6a2b960c3ccb6f1db1005f063a https://conda.anaconda.org/conda-forge/linux-64/coverage-7.8.0-py310h89163eb_0.conda#9f7865c17117d16f804b687b498e35fa https://conda.anaconda.org/conda-forge/linux-64/dbus-1.13.6-h5008d03_3.tar.bz2#ecfff944ba3960ecb334b9a2663d708d https://conda.anaconda.org/conda-forge/linux-64/fonttools-4.57.0-py310h89163eb_0.conda#34378af82141b3c1725dcdf898b28fc6 https://conda.anaconda.org/conda-forge/linux-64/freetype-2.13.3-ha770c72_1.conda#9ccd736d31e0c6e41f54e704e5312811 -https://conda.anaconda.org/conda-forge/linux-64/glib-tools-2.84.1-h4833e2c_0.conda#ddc06964296eee2b4070e65415b332fd +https://conda.anaconda.org/conda-forge/linux-64/glib-tools-2.84.1-h4833e2c_1.conda#418de18c9b79a3d8583d90d27e0937c2 https://conda.anaconda.org/conda-forge/noarch/joblib-1.2.0-pyhd8ed1ab_0.tar.bz2#7583652522d71ad78ba536bba06940eb https://conda.anaconda.org/conda-forge/linux-64/libblas-3.9.0-20_linux64_openblas.conda#2b7bb4f7562c8cf334fc2e20c2d28abc https://conda.anaconda.org/conda-forge/linux-64/libflac-1.4.3-h59595ed_0.conda#ee48bf17cc83a00f59ca1494d5646869 https://conda.anaconda.org/conda-forge/linux-64/libgl-1.7.0-ha4b6fd6_2.conda#928b8be80851f5d8ffb016f9c81dae7a -https://conda.anaconda.org/conda-forge/linux-64/libllvm20-20.1.3-he9d0ab4_0.conda#74c14fe2ab88e352ab6e4fedf5ecb527 -https://conda.anaconda.org/conda-forge/linux-64/libxkbcommon-1.9.0-h65c71a3_0.conda#14fbc598b68d4c6386978f7db09fc5ed -https://conda.anaconda.org/conda-forge/noarch/meson-1.7.1-pyhd8ed1ab_0.conda#90018ee73b8741268027421ceac2809a +https://conda.anaconda.org/conda-forge/linux-64/libllvm20-20.1.4-he9d0ab4_0.conda#96c33bbd084ef2b2463503fb7f1482ae +https://conda.anaconda.org/conda-forge/linux-64/libxkbcommon-1.9.1-h65c71a3_0.conda#6e45090fe0eec179ecc8041a3a3fc9f8 https://conda.anaconda.org/conda-forge/linux-64/openblas-0.3.25-pthreads_h7a3da1a_0.conda#87661673941b5e702275fdf0fc095ad0 https://conda.anaconda.org/conda-forge/linux-64/openldap-2.6.9-he970967_0.conda#ca2de8bbdc871bce41dbf59e51324165 -https://conda.anaconda.org/conda-forge/noarch/pip-25.1-pyh8b19718_0.conda#2247aa245832ea47e8b971bef73d7094 +https://conda.anaconda.org/conda-forge/noarch/pip-25.1.1-pyh8b19718_0.conda#32d0781ace05105cc99af55d36cbec7c https://conda.anaconda.org/conda-forge/noarch/pyproject-metadata-0.9.1-pyhd8ed1ab_0.conda#22ae7c6ea81e0c8661ef32168dda929b https://conda.anaconda.org/conda-forge/noarch/pytest-8.3.5-pyhd8ed1ab_0.conda#c3c9316209dec74a705a36797970c6be https://conda.anaconda.org/conda-forge/noarch/python-dateutil-2.9.0.post0-pyhff2d567_1.conda#5ba79d7c71f03c678c8ead841f347d6e @@ -159,10 +159,10 @@ https://conda.anaconda.org/conda-forge/linux-64/sip-6.8.6-py310hf71b8c6_2.conda# https://conda.anaconda.org/conda-forge/linux-64/xorg-libxdamage-1.1.6-hb9d3cd8_0.conda#b5fcc7172d22516e1f965490e65e33a4 https://conda.anaconda.org/conda-forge/linux-64/xorg-libxxf86vm-1.1.6-hb9d3cd8_0.conda#5efa5fa6243a622445fdfd72aee15efa https://conda.anaconda.org/conda-forge/linux-64/fontconfig-2.15.0-h7e30c49_1.conda#8f5b0b297b59e1ac160ad4beec99dbee -https://conda.anaconda.org/conda-forge/linux-64/glib-2.84.1-h07242d1_0.conda#2c2357f18073331d4aefe7252b9fad17 +https://conda.anaconda.org/conda-forge/linux-64/glib-2.84.1-h6287aef_1.conda#35012688d30e1b52bff2ba5d1f342a50 https://conda.anaconda.org/conda-forge/linux-64/libcblas-3.9.0-20_linux64_openblas.conda#36d486d72ab64ffea932329a1d3729a3 -https://conda.anaconda.org/conda-forge/linux-64/libclang-cpp20.1-20.1.3-default_h1df26ce_0.conda#bbce8ba7f25af8b0928f13fca1eb7405 -https://conda.anaconda.org/conda-forge/linux-64/libclang13-20.1.3-default_he06ed0a_0.conda#1bb2ec3c550f7589b2d16e271aeaeddb +https://conda.anaconda.org/conda-forge/linux-64/libclang-cpp20.1-20.1.4-default_h1df26ce_0.conda#96f8d5b2e94c9ba4fef19f1adf068a15 +https://conda.anaconda.org/conda-forge/linux-64/libclang13-20.1.4-default_he06ed0a_0.conda#2d933632c8004be47deb2be61bf013be https://conda.anaconda.org/conda-forge/linux-64/liblapack-3.9.0-20_linux64_openblas.conda#6fabc51f5e647d09cc010c40061557e0 https://conda.anaconda.org/conda-forge/linux-64/libpq-17.4-h27ae623_1.conda#37fba334855ef3b51549308e61ed7a3d https://conda.anaconda.org/conda-forge/linux-64/libsndfile-1.2.2-hc60ed4a_1.conda#ef1910918dd895516a769ed36b5b3a4e diff --git a/build_tools/azure/pymin_conda_forge_openblas_ubuntu_2204_linux-64_conda.lock b/build_tools/azure/pymin_conda_forge_openblas_ubuntu_2204_linux-64_conda.lock index 6e22f28a387e8..009d15a7d3713 100644 --- a/build_tools/azure/pymin_conda_forge_openblas_ubuntu_2204_linux-64_conda.lock +++ b/build_tools/azure/pymin_conda_forge_openblas_ubuntu_2204_linux-64_conda.lock @@ -21,7 +21,7 @@ https://conda.anaconda.org/conda-forge/linux-64/libstdcxx-14.2.0-h8f9b012_2.cond https://conda.anaconda.org/conda-forge/linux-64/libwebp-base-1.5.0-h851e524_0.conda#63f790534398730f59e1b899c3644d4a https://conda.anaconda.org/conda-forge/linux-64/libzlib-1.3.1-hb9d3cd8_2.conda#edb0dca6bc32e4f4789199455a1dbeb8 https://conda.anaconda.org/conda-forge/linux-64/ncurses-6.5-h2d0b736_3.conda#47e340acb35de30501a76c7c799c41d7 -https://conda.anaconda.org/conda-forge/linux-64/openssl-3.5.0-h7b32b05_0.conda#bb539841f2a3fde210f387d00ed4bb9d +https://conda.anaconda.org/conda-forge/linux-64/openssl-3.5.0-h7b32b05_1.conda#de356753cfdbffcde5bb1e86e3aa6cd0 https://conda.anaconda.org/conda-forge/linux-64/pthread-stubs-0.4-hb9d3cd8_1002.conda#b3c17d95b5a10c6e64a21fa17573e70e https://conda.anaconda.org/conda-forge/linux-64/xorg-libxau-1.0.12-hb9d3cd8_0.conda#f6ebe2cb3f82ba6c057dde5d9debe4f7 https://conda.anaconda.org/conda-forge/linux-64/xorg-libxdmcp-1.1.5-hb9d3cd8_0.conda#8035c64cb77ed555e3f150b7b3972480 @@ -47,7 +47,7 @@ https://conda.anaconda.org/conda-forge/linux-64/python-3.10.17-hd6af730_0_cpytho https://conda.anaconda.org/conda-forge/noarch/alabaster-1.0.0-pyhd8ed1ab_1.conda#1fd9696649f65fd6611fcdb4ffec738a https://conda.anaconda.org/conda-forge/linux-64/brotli-python-1.1.0-py310hf71b8c6_2.conda#bf502c169c71e3c6ac0d6175addfacc2 https://conda.anaconda.org/conda-forge/noarch/certifi-2025.1.31-pyhd8ed1ab_0.conda#c207fa5ac7ea99b149344385a9c0880d -https://conda.anaconda.org/conda-forge/noarch/charset-normalizer-3.4.1-pyhd8ed1ab_0.conda#e83a31202d1c0a000fce3e9cf3825875 +https://conda.anaconda.org/conda-forge/noarch/charset-normalizer-3.4.2-pyhd8ed1ab_0.conda#40fe4284b8b5835a9073a645139f35af https://conda.anaconda.org/conda-forge/noarch/colorama-0.4.6-pyhd8ed1ab_1.conda#962b9857ee8e7018c22f2776ffa0b2d7 https://conda.anaconda.org/conda-forge/linux-64/cython-3.0.12-py310had8cdd9_0.conda#b630fe36f0b621d23e74872dc4fd2bd7 https://conda.anaconda.org/conda-forge/noarch/docutils-0.21.2-pyhd8ed1ab_1.conda#24c1ca34138ee57de72a943237cde4cc @@ -63,6 +63,7 @@ https://conda.anaconda.org/conda-forge/linux-64/libblas-3.9.0-31_h59b9bed_openbl https://conda.anaconda.org/conda-forge/linux-64/libfreetype-2.13.3-ha770c72_1.conda#51f5be229d83ecd401fb369ab96ae669 https://conda.anaconda.org/conda-forge/linux-64/libhiredis-1.0.2-h2cc385e_0.tar.bz2#b34907d3a81a3cd8095ee83d174c074a https://conda.anaconda.org/conda-forge/linux-64/markupsafe-3.0.2-py310h89163eb_1.conda#8ce3f0332fd6de0d737e2911d329523f +https://conda.anaconda.org/conda-forge/noarch/meson-1.8.0-pyh29332c3_0.conda#8e25221b702272394b86b0f4d7217f77 https://conda.anaconda.org/conda-forge/linux-64/openblas-0.3.29-pthreads_h6ec200e_0.conda#7e4d48870b3258bea920d51b7f495a81 https://conda.anaconda.org/conda-forge/linux-64/openjpeg-2.5.3-h5fbd93e_0.conda#9e5816bc95d285c115a3ebc2f8563564 https://conda.anaconda.org/conda-forge/noarch/packaging-25.0-pyh29332c3_1.conda#58335b26c38bf4a20f399384c33cbcf9 @@ -72,7 +73,7 @@ https://conda.anaconda.org/conda-forge/noarch/pygments-2.19.1-pyhd8ed1ab_0.conda https://conda.anaconda.org/conda-forge/noarch/pysocks-1.7.1-pyha55dd90_7.conda#461219d1a5bd61342293efa2c0c90eac https://conda.anaconda.org/conda-forge/noarch/python-tzdata-2025.2-pyhd8ed1ab_0.conda#88476ae6ebd24f39261e0854ac244f33 https://conda.anaconda.org/conda-forge/noarch/pytz-2025.2-pyhd8ed1ab_0.conda#bc8e3267d44011051f2eb14d22fb0960 -https://conda.anaconda.org/conda-forge/noarch/setuptools-79.0.1-pyhff2d567_0.conda#fa6669cc21abd4b7b6c5393b7bc71914 +https://conda.anaconda.org/conda-forge/noarch/setuptools-80.1.0-pyhff2d567_0.conda#f6f72d0837c79eaec77661be43e8a691 https://conda.anaconda.org/conda-forge/noarch/six-1.17.0-pyhd8ed1ab_0.conda#a451d576819089b0d672f18768be0f65 https://conda.anaconda.org/conda-forge/noarch/snowballstemmer-2.2.0-pyhd8ed1ab_0.tar.bz2#4d22a9315e78c6827f806065957d566e https://conda.anaconda.org/conda-forge/noarch/sphinxcontrib-jsmath-1.0.1-pyhd8ed1ab_1.conda#fa839b5ff59e192f411ccc7dae6588bb @@ -81,16 +82,15 @@ https://conda.anaconda.org/conda-forge/noarch/threadpoolctl-3.6.0-pyhecae5ae_0.c https://conda.anaconda.org/conda-forge/noarch/tomli-2.2.1-pyhd8ed1ab_1.conda#ac944244f1fed2eb49bae07193ae8215 https://conda.anaconda.org/conda-forge/noarch/wheel-0.45.1-pyhd8ed1ab_1.conda#75cb7132eb58d97896e173ef12ac9986 https://conda.anaconda.org/conda-forge/noarch/babel-2.17.0-pyhd8ed1ab_0.conda#0a01c169f0ab0f91b26e77a3301fbfe4 -https://conda.anaconda.org/conda-forge/linux-64/ccache-4.11.2-hd714d17_0.conda#35ae7ce74089ab05fdb1cb9746c0fbe4 +https://conda.anaconda.org/conda-forge/linux-64/ccache-4.11.3-h80c52d3_0.conda#eb517c6a2b960c3ccb6f1db1005f063a https://conda.anaconda.org/conda-forge/linux-64/cffi-1.17.1-py310h8deb56e_0.conda#1fc24a3196ad5ede2a68148be61894f4 https://conda.anaconda.org/conda-forge/linux-64/freetype-2.13.3-ha770c72_1.conda#9ccd736d31e0c6e41f54e704e5312811 https://conda.anaconda.org/conda-forge/noarch/h2-4.2.0-pyhd8ed1ab_0.conda#b4754fb1bdcb70c8fd54f918301582c6 https://conda.anaconda.org/conda-forge/noarch/jinja2-3.1.6-pyhd8ed1ab_0.conda#446bd6c8cb26050d528881df495ce646 -https://conda.anaconda.org/conda-forge/noarch/joblib-1.4.2-pyhd8ed1ab_1.conda#bf8243ee348f3a10a14ed0cae323e0c1 +https://conda.anaconda.org/conda-forge/noarch/joblib-1.5.0-pyhd8ed1ab_0.conda#3d7257f0a61c9aa4ffa3e324a887416b https://conda.anaconda.org/conda-forge/linux-64/libcblas-3.9.0-31_he106b2a_openblas.conda#abb32c727da370c481a1c206f5159ce9 https://conda.anaconda.org/conda-forge/linux-64/liblapack-3.9.0-31_h7ac8fdf_openblas.conda#452b98eafe050ecff932f0ec832dd03f -https://conda.anaconda.org/conda-forge/noarch/meson-1.7.1-pyhd8ed1ab_0.conda#90018ee73b8741268027421ceac2809a -https://conda.anaconda.org/conda-forge/noarch/pip-25.1-pyh8b19718_0.conda#2247aa245832ea47e8b971bef73d7094 +https://conda.anaconda.org/conda-forge/noarch/pip-25.1.1-pyh8b19718_0.conda#32d0781ace05105cc99af55d36cbec7c https://conda.anaconda.org/conda-forge/noarch/pyproject-metadata-0.9.1-pyhd8ed1ab_0.conda#22ae7c6ea81e0c8661ef32168dda929b https://conda.anaconda.org/conda-forge/noarch/pytest-8.3.5-pyhd8ed1ab_0.conda#c3c9316209dec74a705a36797970c6be https://conda.anaconda.org/conda-forge/noarch/python-dateutil-2.9.0.post0-pyhff2d567_1.conda#5ba79d7c71f03c678c8ead841f347d6e @@ -99,7 +99,7 @@ https://conda.anaconda.org/conda-forge/noarch/meson-python-0.17.1-pyh70fd9c4_1.c https://conda.anaconda.org/conda-forge/linux-64/numpy-2.2.5-py310hefbff90_0.conda#5526bc875ec897f0d335e38da832b6ee https://conda.anaconda.org/conda-forge/linux-64/pillow-11.1.0-py310h7e6dc6c_0.conda#14d300b9e1504748e70cc6499a7b4d25 https://conda.anaconda.org/conda-forge/noarch/pytest-xdist-3.6.1-pyhd8ed1ab_1.conda#59aad4fb37cabc0bacc73cf344612ddd -https://conda.anaconda.org/conda-forge/linux-64/zstandard-0.23.0-py310ha75aee5_1.conda#0316e8d0e00c00631a6de89207db5b09 +https://conda.anaconda.org/conda-forge/linux-64/zstandard-0.23.0-py310ha75aee5_2.conda#f9254b5b0193982416b91edcb4b2676f https://conda.anaconda.org/conda-forge/linux-64/blas-devel-3.9.0-31_h1ea3ea9_openblas.conda#ba652ee0576396d4765e567f043c57f9 https://conda.anaconda.org/conda-forge/linux-64/pandas-2.2.3-py310h5eaa309_3.conda#07697a584fab513ce895c4511f7a2403 https://conda.anaconda.org/conda-forge/linux-64/scipy-1.15.2-py310h1d65ade_0.conda#8c29cd33b64b2eb78597fa28b5595c8d diff --git a/build_tools/azure/ubuntu_atlas_lock.txt b/build_tools/azure/ubuntu_atlas_lock.txt index 7e8638c24f938..ea978eeabcb51 100644 --- a/build_tools/azure/ubuntu_atlas_lock.txt +++ b/build_tools/azure/ubuntu_atlas_lock.txt @@ -14,7 +14,7 @@ iniconfig==2.1.0 # via pytest joblib==1.2.0 # via -r build_tools/azure/ubuntu_atlas_requirements.txt -meson==1.7.2 +meson==1.8.0 # via meson-python meson-python==0.17.1 # via -r build_tools/azure/ubuntu_atlas_requirements.txt diff --git a/build_tools/circle/doc_linux-64_conda.lock b/build_tools/circle/doc_linux-64_conda.lock index dc800de2b5148..c489e4f01a9f7 100644 --- a/build_tools/circle/doc_linux-64_conda.lock +++ b/build_tools/circle/doc_linux-64_conda.lock @@ -41,7 +41,7 @@ https://conda.anaconda.org/conda-forge/linux-64/libstdcxx-14.2.0-h8f9b012_2.cond https://conda.anaconda.org/conda-forge/linux-64/libwebp-base-1.5.0-h851e524_0.conda#63f790534398730f59e1b899c3644d4a https://conda.anaconda.org/conda-forge/linux-64/libzlib-1.3.1-hb9d3cd8_2.conda#edb0dca6bc32e4f4789199455a1dbeb8 https://conda.anaconda.org/conda-forge/linux-64/ncurses-6.5-h2d0b736_3.conda#47e340acb35de30501a76c7c799c41d7 -https://conda.anaconda.org/conda-forge/linux-64/openssl-3.5.0-h7b32b05_0.conda#bb539841f2a3fde210f387d00ed4bb9d +https://conda.anaconda.org/conda-forge/linux-64/openssl-3.5.0-h7b32b05_1.conda#de356753cfdbffcde5bb1e86e3aa6cd0 https://conda.anaconda.org/conda-forge/linux-64/pthread-stubs-0.4-hb9d3cd8_1002.conda#b3c17d95b5a10c6e64a21fa17573e70e https://conda.anaconda.org/conda-forge/linux-64/xorg-libice-1.1.2-hb9d3cd8_0.conda#fb901ff28063514abb6046c9ec2c4a45 https://conda.anaconda.org/conda-forge/linux-64/xorg-libxau-1.0.12-hb9d3cd8_0.conda#f6ebe2cb3f82ba6c057dde5d9debe4f7 @@ -71,7 +71,7 @@ https://conda.anaconda.org/conda-forge/linux-64/libxcrypt-4.4.36-hd590300_1.cond https://conda.anaconda.org/conda-forge/linux-64/lz4-c-1.10.0-h5888daf_1.conda#9de5350a85c4a20c685259b889aa6393 https://conda.anaconda.org/conda-forge/linux-64/mysql-common-9.2.0-h266115a_0.conda#db22a0962c953e81a2a679ecb1fc6027 https://conda.anaconda.org/conda-forge/linux-64/ninja-1.12.1-hff21bea_1.conda#2322531904f27501ee19847b87ba7c64 -https://conda.anaconda.org/conda-forge/linux-64/pixman-0.44.2-h29eaf8c_0.conda#5e2a7acfa2c24188af39e7944e1b3604 +https://conda.anaconda.org/conda-forge/linux-64/pixman-0.46.0-h29eaf8c_0.conda#d2f1c87d4416d1e7344cf92b1aaee1c4 https://conda.anaconda.org/conda-forge/linux-64/rav1e-0.6.6-he8a937b_2.conda#77d9955b4abddb811cb8ab1aa7d743e4 https://conda.anaconda.org/conda-forge/linux-64/readline-8.2-h8c095d6_2.conda#283b96675859b20a825f8fa30f311446 https://conda.anaconda.org/conda-forge/linux-64/snappy-1.2.1-h8bd8927_1.conda#3b3e64af585eadfb52bb90b553db5edf @@ -98,7 +98,7 @@ https://conda.anaconda.org/conda-forge/linux-64/libopenblas-0.3.29-pthreads_h94d https://conda.anaconda.org/conda-forge/linux-64/libtiff-4.7.0-hd9ff511_4.conda#6c1028898cf3a2032d9af46689e1b81a https://conda.anaconda.org/conda-forge/linux-64/libzopfli-1.0.3-h9c3ff4c_0.tar.bz2#c66fe2d123249af7651ebde8984c51c2 https://conda.anaconda.org/conda-forge/linux-64/mysql-libs-9.2.0-he0572af_0.conda#93340b072c393d23c4700a1d40565dca -https://conda.anaconda.org/conda-forge/linux-64/pcre2-10.44-hba22ea6_2.conda#df359c09c41cd186fffb93a2d87aa6f5 +https://conda.anaconda.org/conda-forge/linux-64/pcre2-10.44-hc749103_2.conda#31614c73d7b103ef76faa4d83d261d34 https://conda.anaconda.org/conda-forge/linux-64/python-3.10.17-hd6af730_0_cpython.conda#7bb89638dae9ce1b8e051d0b721e83c2 https://conda.anaconda.org/conda-forge/linux-64/qhull-2020.2-h434a139_5.conda#353823361b1d27eb3960efb076dfcaf6 https://conda.anaconda.org/conda-forge/linux-64/xcb-util-0.4.1-hb711507_2.conda#8637c3e5821654d0edf97e2b0404b443 @@ -111,7 +111,7 @@ https://conda.anaconda.org/conda-forge/noarch/alabaster-1.0.0-pyhd8ed1ab_1.conda https://conda.anaconda.org/conda-forge/linux-64/brotli-1.1.0-hb9d3cd8_2.conda#98514fe74548d768907ce7a13f680e8f https://conda.anaconda.org/conda-forge/linux-64/brotli-python-1.1.0-py310hf71b8c6_2.conda#bf502c169c71e3c6ac0d6175addfacc2 https://conda.anaconda.org/conda-forge/noarch/certifi-2025.1.31-pyhd8ed1ab_0.conda#c207fa5ac7ea99b149344385a9c0880d -https://conda.anaconda.org/conda-forge/noarch/charset-normalizer-3.4.1-pyhd8ed1ab_0.conda#e83a31202d1c0a000fce3e9cf3825875 +https://conda.anaconda.org/conda-forge/noarch/charset-normalizer-3.4.2-pyhd8ed1ab_0.conda#40fe4284b8b5835a9073a645139f35af https://conda.anaconda.org/conda-forge/noarch/click-8.1.8-pyh707e725_0.conda#f22f4d4970e09d68a10b922cbb0408d3 https://conda.anaconda.org/conda-forge/noarch/colorama-0.4.6-pyhd8ed1ab_1.conda#962b9857ee8e7018c22f2776ffa0b2d7 https://conda.anaconda.org/conda-forge/noarch/cpython-3.10.17-py310hd8ed1ab_0.conda#e2b81369f0473107784f8b7da8e6a8e9 @@ -140,8 +140,9 @@ https://conda.anaconda.org/conda-forge/linux-64/libglib-2.84.1-h2ff4ddf_0.conda# https://conda.anaconda.org/conda-forge/linux-64/libglx-1.7.0-ha4b6fd6_2.conda#c8013e438185f33b13814c5c488acd5c https://conda.anaconda.org/conda-forge/linux-64/libxml2-2.13.7-h4bc477f_1.conda#ad1f1f8238834cd3c88ceeaee8da444a https://conda.anaconda.org/conda-forge/linux-64/markupsafe-3.0.2-py310h89163eb_1.conda#8ce3f0332fd6de0d737e2911d329523f +https://conda.anaconda.org/conda-forge/noarch/meson-1.8.0-pyh29332c3_0.conda#8e25221b702272394b86b0f4d7217f77 https://conda.anaconda.org/conda-forge/noarch/munkres-1.1.4-pyh9f0ad1d_0.tar.bz2#2ba8498c1018c1e9c61eb99b973dfe19 -https://conda.anaconda.org/conda-forge/noarch/narwhals-1.36.0-pyh29332c3_0.conda#3def833a2e07af8713090bb484e1f0b1 +https://conda.anaconda.org/conda-forge/noarch/narwhals-1.37.0-pyh29332c3_0.conda#f9ae420fa431efd502a5d5c4c1f08263 https://conda.anaconda.org/conda-forge/noarch/networkx-3.4.2-pyh267e887_2.conda#fd40bf7f7f4bc4b647dc8512053d9873 https://conda.anaconda.org/conda-forge/linux-64/openblas-0.3.29-pthreads_h6ec200e_0.conda#7e4d48870b3258bea920d51b7f495a81 https://conda.anaconda.org/conda-forge/linux-64/openjpeg-2.5.3-h5fbd93e_0.conda#9e5816bc95d285c115a3ebc2f8563564 @@ -155,7 +156,7 @@ https://conda.anaconda.org/conda-forge/noarch/pyparsing-3.2.3-pyhd8ed1ab_1.conda https://conda.anaconda.org/conda-forge/noarch/pysocks-1.7.1-pyha55dd90_7.conda#461219d1a5bd61342293efa2c0c90eac https://conda.anaconda.org/conda-forge/noarch/python-tzdata-2025.2-pyhd8ed1ab_0.conda#88476ae6ebd24f39261e0854ac244f33 https://conda.anaconda.org/conda-forge/noarch/pytz-2025.2-pyhd8ed1ab_0.conda#bc8e3267d44011051f2eb14d22fb0960 -https://conda.anaconda.org/conda-forge/noarch/setuptools-79.0.1-pyhff2d567_0.conda#fa6669cc21abd4b7b6c5393b7bc71914 +https://conda.anaconda.org/conda-forge/noarch/setuptools-80.1.0-pyhff2d567_0.conda#f6f72d0837c79eaec77661be43e8a691 https://conda.anaconda.org/conda-forge/noarch/six-1.17.0-pyhd8ed1ab_0.conda#a451d576819089b0d672f18768be0f65 https://conda.anaconda.org/conda-forge/noarch/snowballstemmer-2.2.0-pyhd8ed1ab_0.tar.bz2#4d22a9315e78c6827f806065957d566e https://conda.anaconda.org/conda-forge/noarch/soupsieve-2.5-pyhd8ed1ab_1.conda#3f144b2c34f8cb5a9abd9ed23a39c561 @@ -189,17 +190,16 @@ https://conda.anaconda.org/conda-forge/noarch/h2-4.2.0-pyhd8ed1ab_0.conda#b4754f https://conda.anaconda.org/conda-forge/noarch/importlib-metadata-8.6.1-pyha770c72_0.conda#f4b39bf00c69f56ac01e020ebfac066c https://conda.anaconda.org/conda-forge/noarch/importlib_resources-6.5.2-pyhd8ed1ab_0.conda#c85c76dc67d75619a92f51dfbce06992 https://conda.anaconda.org/conda-forge/noarch/jinja2-3.1.6-pyhd8ed1ab_0.conda#446bd6c8cb26050d528881df495ce646 -https://conda.anaconda.org/conda-forge/noarch/joblib-1.4.2-pyhd8ed1ab_1.conda#bf8243ee348f3a10a14ed0cae323e0c1 +https://conda.anaconda.org/conda-forge/noarch/joblib-1.5.0-pyhd8ed1ab_0.conda#3d7257f0a61c9aa4ffa3e324a887416b https://conda.anaconda.org/conda-forge/linux-64/libcblas-3.9.0-31_he106b2a_openblas.conda#abb32c727da370c481a1c206f5159ce9 https://conda.anaconda.org/conda-forge/linux-64/libgl-1.7.0-ha4b6fd6_2.conda#928b8be80851f5d8ffb016f9c81dae7a https://conda.anaconda.org/conda-forge/linux-64/liblapack-3.9.0-31_h7ac8fdf_openblas.conda#452b98eafe050ecff932f0ec832dd03f -https://conda.anaconda.org/conda-forge/linux-64/libllvm20-20.1.3-he9d0ab4_0.conda#74c14fe2ab88e352ab6e4fedf5ecb527 -https://conda.anaconda.org/conda-forge/linux-64/libxkbcommon-1.9.0-h65c71a3_0.conda#14fbc598b68d4c6386978f7db09fc5ed +https://conda.anaconda.org/conda-forge/linux-64/libllvm20-20.1.4-he9d0ab4_0.conda#96c33bbd084ef2b2463503fb7f1482ae +https://conda.anaconda.org/conda-forge/linux-64/libxkbcommon-1.9.1-h65c71a3_0.conda#6e45090fe0eec179ecc8041a3a3fc9f8 https://conda.anaconda.org/conda-forge/linux-64/libxslt-1.1.39-h76b75d6_0.conda#e71f31f8cfb0a91439f2086fc8aa0461 https://conda.anaconda.org/conda-forge/noarch/memory_profiler-0.61.0-pyhd8ed1ab_1.conda#71abbefb6f3b95e1668cd5e0af3affb9 -https://conda.anaconda.org/conda-forge/noarch/meson-1.7.1-pyhd8ed1ab_0.conda#90018ee73b8741268027421ceac2809a https://conda.anaconda.org/conda-forge/linux-64/openldap-2.6.9-he970967_0.conda#ca2de8bbdc871bce41dbf59e51324165 -https://conda.anaconda.org/conda-forge/noarch/pip-25.1-pyh8b19718_0.conda#2247aa245832ea47e8b971bef73d7094 +https://conda.anaconda.org/conda-forge/noarch/pip-25.1.1-pyh8b19718_0.conda#32d0781ace05105cc99af55d36cbec7c https://conda.anaconda.org/conda-forge/noarch/plotly-6.0.1-pyhd8ed1ab_0.conda#37ce02c899ff42ac5c554257b1a5906e https://conda.anaconda.org/conda-forge/noarch/pyproject-metadata-0.9.1-pyhd8ed1ab_0.conda#22ae7c6ea81e0c8661ef32168dda929b https://conda.anaconda.org/conda-forge/noarch/pytest-8.3.5-pyhd8ed1ab_0.conda#c3c9316209dec74a705a36797970c6be @@ -220,8 +220,8 @@ https://conda.anaconda.org/conda-forge/linux-64/fontconfig-2.15.0-h7e30c49_1.con https://conda.anaconda.org/conda-forge/linux-64/fortran-compiler-1.9.0-h36df796_0.conda#cc0cf942201f9d3b0e9654ea02e12486 https://conda.anaconda.org/conda-forge/noarch/importlib-resources-6.5.2-pyhd8ed1ab_0.conda#e376ea42e9ae40f3278b0f79c9bf9826 https://conda.anaconda.org/conda-forge/noarch/lazy-loader-0.4-pyhd8ed1ab_2.conda#d10d9393680734a8febc4b362a4c94f2 -https://conda.anaconda.org/conda-forge/linux-64/libclang-cpp20.1-20.1.3-default_h1df26ce_0.conda#bbce8ba7f25af8b0928f13fca1eb7405 -https://conda.anaconda.org/conda-forge/linux-64/libclang13-20.1.3-default_he06ed0a_0.conda#1bb2ec3c550f7589b2d16e271aeaeddb +https://conda.anaconda.org/conda-forge/linux-64/libclang-cpp20.1-20.1.4-default_h1df26ce_0.conda#96f8d5b2e94c9ba4fef19f1adf068a15 +https://conda.anaconda.org/conda-forge/linux-64/libclang13-20.1.4-default_he06ed0a_0.conda#2d933632c8004be47deb2be61bf013be https://conda.anaconda.org/conda-forge/linux-64/liblapacke-3.9.0-31_he2f377e_openblas.conda#7e5fff7d0db69be3a266f7e79a3bb0e2 https://conda.anaconda.org/conda-forge/linux-64/libpq-17.4-h27ae623_1.conda#37fba334855ef3b51549308e61ed7a3d https://conda.anaconda.org/conda-forge/noarch/meson-python-0.17.1-pyh70fd9c4_1.conda#7a02679229c6c2092571b4c025055440 @@ -229,7 +229,7 @@ https://conda.anaconda.org/conda-forge/linux-64/numpy-2.2.5-py310hefbff90_0.cond https://conda.anaconda.org/conda-forge/linux-64/pillow-11.1.0-py310h7e6dc6c_0.conda#14d300b9e1504748e70cc6499a7b4d25 https://conda.anaconda.org/conda-forge/noarch/pytest-xdist-3.6.1-pyhd8ed1ab_1.conda#59aad4fb37cabc0bacc73cf344612ddd https://conda.anaconda.org/conda-forge/linux-64/xorg-libxtst-1.2.5-hb9d3cd8_3.conda#7bbe9a0cc0df0ac5f5a8ad6d6a11af2f -https://conda.anaconda.org/conda-forge/linux-64/zstandard-0.23.0-py310ha75aee5_1.conda#0316e8d0e00c00631a6de89207db5b09 +https://conda.anaconda.org/conda-forge/linux-64/zstandard-0.23.0-py310ha75aee5_2.conda#f9254b5b0193982416b91edcb4b2676f https://conda.anaconda.org/conda-forge/linux-64/blas-devel-3.9.0-31_h1ea3ea9_openblas.conda#ba652ee0576396d4765e567f043c57f9 https://conda.anaconda.org/conda-forge/linux-64/cairo-1.18.4-h3394656_0.conda#09262e66b19567aff4f592fb53b28760 https://conda.anaconda.org/conda-forge/linux-64/compilers-1.9.0-ha770c72_0.conda#5859096e397aba423340d0bbbb11ec64 @@ -329,4 +329,4 @@ https://conda.anaconda.org/conda-forge/noarch/sphinxext-opengraph-0.9.1-pyhd8ed1 # pip nbconvert @ https://files.pythonhosted.org/packages/cc/9a/cd673b2f773a12c992f41309ef81b99da1690426bd2f96957a7ade0d3ed7/nbconvert-7.16.6-py3-none-any.whl#sha256=1375a7b67e0c2883678c48e506dc320febb57685e5ee67faa51b18a90f3a712b # pip jupyter-server @ https://files.pythonhosted.org/packages/e2/a2/89eeaf0bb954a123a909859fa507fa86f96eb61b62dc30667b60dbd5fdaf/jupyter_server-2.15.0-py3-none-any.whl#sha256=872d989becf83517012ee669f09604aa4a28097c0bd90b2f424310156c2cdae3 # pip jupyterlab-server @ https://files.pythonhosted.org/packages/54/09/2032e7d15c544a0e3cd831c51d77a8ca57f7555b2e1b2922142eddb02a84/jupyterlab_server-2.27.3-py3-none-any.whl#sha256=e697488f66c3db49df675158a77b3b017520d772c6e1548c7d9bcc5df7944ee4 -# pip jupyterlite-sphinx @ https://files.pythonhosted.org/packages/31/54/37969009fd23e95d25494eedc0f2d3e2d75090fe00d0e17c08fa6cd75229/jupyterlite_sphinx-0.19.1-py3-none-any.whl#sha256=0eee482144df992586f52f3b381999100381c11c2e0ddaa196d2934704e8992f +# pip jupyterlite-sphinx @ https://files.pythonhosted.org/packages/a9/f2/b64ad053b8b6fed95c46e8df85ee3349a1cca47e006eb6a65671c9a1c6e5/jupyterlite_sphinx-0.20.0-py3-none-any.whl#sha256=de2cb966f389d70cc269f501af24f0cbb1f47d521a89ee79ac83f0ad302214fc diff --git a/build_tools/circle/doc_min_dependencies_linux-64_conda.lock b/build_tools/circle/doc_min_dependencies_linux-64_conda.lock index 8aa95b7971683..4e9d8501dc411 100644 --- a/build_tools/circle/doc_min_dependencies_linux-64_conda.lock +++ b/build_tools/circle/doc_min_dependencies_linux-64_conda.lock @@ -2,6 +2,7 @@ # platform: linux-64 # input_hash: 1ff580fa5b39efc9a616b69d09ea9208049b15bb1bd5e42883b7295d717cc6ba @EXPLICIT +https://conda.anaconda.org/conda-forge/linux-64/_libgcc_mutex-0.1-conda_forge.tar.bz2#d7c89558ba9fa0495403155b64376d81 https://conda.anaconda.org/conda-forge/noarch/font-ttf-dejavu-sans-mono-2.37-hab24e00_0.tar.bz2#0c96522c6bdaed4b1566d11387caaf45 https://conda.anaconda.org/conda-forge/noarch/font-ttf-inconsolata-3.000-h77eed37_0.tar.bz2#34893075a5c9e55cdafac56607368fc6 https://conda.anaconda.org/conda-forge/noarch/font-ttf-source-code-pro-2.038-h77eed37_0.tar.bz2#4d59c254e01d9cde7957100457e2d5fb @@ -16,9 +17,8 @@ https://conda.anaconda.org/conda-forge/noarch/libgcc-devel_linux-64-13.3.0-hc03c https://conda.anaconda.org/conda-forge/linux-64/libglvnd-1.7.0-ha4b6fd6_2.conda#434ca7e50e40f4918ab701e3facd59a0 https://conda.anaconda.org/conda-forge/linux-64/libgomp-14.2.0-h767d61c_2.conda#06d02030237f4d5b3d9a7e7d348fe3c6 https://conda.anaconda.org/conda-forge/noarch/libstdcxx-devel_linux-64-13.3.0-hc03c837_102.conda#aa38de2738c5f4a72a880e3d31ffe8b4 -https://conda.anaconda.org/conda-forge/linux-64/llvm-openmp-20.1.3-h024ca30_0.conda#c721339ea8746513e42b1233b4bbdfb0 https://conda.anaconda.org/conda-forge/noarch/sysroot_linux-64-2.17-h0157908_18.conda#460eba7851277ec1fd80a1a24080787a -https://conda.anaconda.org/conda-forge/linux-64/_openmp_mutex-4.5-3_kmp_llvm.conda#ee5c2118262e30b972bc0b4db8ef0ba5 +https://conda.anaconda.org/conda-forge/linux-64/_openmp_mutex-4.5-2_gnu.tar.bz2#73aaf86a425cc6e73fcf236a5a46396d https://conda.anaconda.org/conda-forge/linux-64/binutils_impl_linux-64-2.43-h4bf12b8_4.conda#ef67db625ad0d2dce398837102f875ed https://conda.anaconda.org/conda-forge/noarch/fonts-conda-ecosystem-1-0.tar.bz2#fee5683a3f04bd15cbd8318b096a27ab https://conda.anaconda.org/conda-forge/linux-64/libegl-1.7.0-ha4b6fd6_2.conda#c151d5eb730e9b7480e6d48c0fc44048 @@ -26,24 +26,25 @@ https://conda.anaconda.org/conda-forge/linux-64/binutils-2.43-h4852527_4.conda#2 https://conda.anaconda.org/conda-forge/linux-64/binutils_linux-64-2.43-h4852527_4.conda#c87e146f5b685672d4aa6b527c6d3b5e https://conda.anaconda.org/conda-forge/linux-64/libgcc-14.2.0-h767d61c_2.conda#ef504d1acbd74b7cc6849ef8af47dd03 https://conda.anaconda.org/conda-forge/linux-64/alsa-lib-1.2.14-hb9d3cd8_0.conda#76df83c2a9035c54df5d04ff81bcc02d -https://conda.anaconda.org/conda-forge/linux-64/gettext-tools-0.23.1-h5888daf_0.conda#2f659535feef3cfb782f7053c8775a32 +https://conda.anaconda.org/conda-forge/linux-64/gettext-tools-0.24.1-h5888daf_0.conda#d54305672f0361c2f3886750e7165b5f https://conda.anaconda.org/conda-forge/linux-64/libbrotlicommon-1.1.0-hb9d3cd8_2.conda#41b599ed2b02abcfdd84302bff174b23 https://conda.anaconda.org/conda-forge/linux-64/libdeflate-1.23-h86f0d12_0.conda#27fe770decaf469a53f3e3a6d593067f https://conda.anaconda.org/conda-forge/linux-64/libexpat-2.7.0-h5888daf_0.conda#db0bfbe7dd197b68ad5f30333bae6ce0 https://conda.anaconda.org/conda-forge/linux-64/libffi-3.4.6-h2dba641_1.conda#ede4673863426c0883c0063d853bbd85 https://conda.anaconda.org/conda-forge/linux-64/libgcc-ng-14.2.0-h69a702a_2.conda#a2222a6ada71fb478682efe483ce0f92 -https://conda.anaconda.org/conda-forge/linux-64/libgettextpo-0.23.1-h5888daf_0.conda#a09ce5decdef385bcce78c32809fa794 +https://conda.anaconda.org/conda-forge/linux-64/libgettextpo-0.24.1-h5888daf_0.conda#2ee6d71b72f75d50581f2f68e965efdb https://conda.anaconda.org/conda-forge/linux-64/libgfortran5-14.2.0-hf1ad2bd_2.conda#556a4fdfac7287d349b8f09aba899693 https://conda.anaconda.org/conda-forge/linux-64/libiconv-1.18-h4ce23a2_1.conda#e796ff8ddc598affdf7c173d6145f087 https://conda.anaconda.org/conda-forge/linux-64/libjpeg-turbo-3.1.0-hb9d3cd8_0.conda#9fa334557db9f63da6c9285fd2a48638 https://conda.anaconda.org/conda-forge/linux-64/liblzma-5.8.1-hb9d3cd8_0.conda#0e87378639676987af32fee53ba32258 https://conda.anaconda.org/conda-forge/linux-64/libntlm-1.8-hb9d3cd8_0.conda#7c7927b404672409d9917d49bff5f2d6 +https://conda.anaconda.org/conda-forge/linux-64/libogg-1.3.5-hd0c01bc_1.conda#68e52064ed3897463c0e958ab5c8f91b https://conda.anaconda.org/conda-forge/linux-64/libopus-1.5.2-hd0c01bc_0.conda#b64523fb87ac6f87f0790f324ad43046 https://conda.anaconda.org/conda-forge/linux-64/libstdcxx-14.2.0-h8f9b012_2.conda#a78c856b6dc6bf4ea8daeb9beaaa3fb0 https://conda.anaconda.org/conda-forge/linux-64/libwebp-base-1.5.0-h851e524_0.conda#63f790534398730f59e1b899c3644d4a https://conda.anaconda.org/conda-forge/linux-64/libzlib-1.3.1-hb9d3cd8_2.conda#edb0dca6bc32e4f4789199455a1dbeb8 https://conda.anaconda.org/conda-forge/linux-64/ncurses-6.5-h2d0b736_3.conda#47e340acb35de30501a76c7c799c41d7 -https://conda.anaconda.org/conda-forge/linux-64/openssl-3.5.0-h7b32b05_0.conda#bb539841f2a3fde210f387d00ed4bb9d +https://conda.anaconda.org/conda-forge/linux-64/openssl-3.5.0-h7b32b05_1.conda#de356753cfdbffcde5bb1e86e3aa6cd0 https://conda.anaconda.org/conda-forge/linux-64/pthread-stubs-0.4-hb9d3cd8_1002.conda#b3c17d95b5a10c6e64a21fa17573e70e https://conda.anaconda.org/conda-forge/linux-64/xorg-libice-1.1.2-hb9d3cd8_0.conda#fb901ff28063514abb6046c9ec2c4a45 https://conda.anaconda.org/conda-forge/linux-64/xorg-libxau-1.0.12-hb9d3cd8_0.conda#f6ebe2cb3f82ba6c057dde5d9debe4f7 @@ -59,17 +60,16 @@ https://conda.anaconda.org/conda-forge/linux-64/jxrlib-1.1-hd590300_3.conda#5aea https://conda.anaconda.org/conda-forge/linux-64/keyutils-1.6.1-h166bdaf_0.tar.bz2#30186d27e2c9fa62b45fb1476b7200e3 https://conda.anaconda.org/conda-forge/linux-64/lame-3.100-h166bdaf_1003.tar.bz2#a8832b479f93521a9e7b5b743803be51 https://conda.anaconda.org/conda-forge/linux-64/lerc-4.0.0-h0aef613_1.conda#9344155d33912347b37f0ae6c410a835 -https://conda.anaconda.org/conda-forge/linux-64/libasprintf-0.23.1-h8e693c7_0.conda#988f4937281a66ca19d1adb3b5e3f859 +https://conda.anaconda.org/conda-forge/linux-64/libasprintf-0.24.1-h8e693c7_0.conda#57566a81dd1e5aa3d98ac7582e8bfe03 https://conda.anaconda.org/conda-forge/linux-64/libbrotlidec-1.1.0-hb9d3cd8_2.conda#9566f0bd264fbd463002e759b8a82401 https://conda.anaconda.org/conda-forge/linux-64/libbrotlienc-1.1.0-hb9d3cd8_2.conda#06f70867945ea6a84d35836af780f1de https://conda.anaconda.org/conda-forge/linux-64/libedit-3.1.20250104-pl5321h7949ede_0.conda#c277e0a4d549b03ac1e9d6cbbe3d017b https://conda.anaconda.org/conda-forge/linux-64/libevent-2.1.12-hf998b51_1.conda#a1cfcc585f0c42bf8d5546bb1dfb668d -https://conda.anaconda.org/conda-forge/linux-64/libgettextpo-devel-0.23.1-h5888daf_0.conda#7a5d5c245a6807deab87558e9efd3ef0 +https://conda.anaconda.org/conda-forge/linux-64/libgettextpo-devel-0.24.1-h5888daf_0.conda#8f04c7aae6a46503bc36d1ed5abc8c7c https://conda.anaconda.org/conda-forge/linux-64/libgfortran-14.2.0-h69a702a_2.conda#fb54c4ea68b460c278d26eea89cfbcc3 https://conda.anaconda.org/conda-forge/linux-64/libgpg-error-1.55-h3f2d84a_0.conda#2bd47db5807daade8500ed7ca4c512a4 https://conda.anaconda.org/conda-forge/linux-64/libhwy-1.2.0-hf40a0c7_0.conda#2f433d593a66044c3f163cb25f0a09de https://conda.anaconda.org/conda-forge/linux-64/libnsl-2.0.1-hd590300_0.conda#30fd6e37fe21f86f4bd26d6ee73eeec7 -https://conda.anaconda.org/conda-forge/linux-64/libogg-1.3.5-h4ab18f5_0.conda#601bfb4b3c6f0b844443bb81a56651e0 https://conda.anaconda.org/conda-forge/linux-64/libpciaccess-0.18-hd590300_0.conda#48f4330bfcd959c3cfb704d424903c82 https://conda.anaconda.org/conda-forge/linux-64/libpng-1.6.47-h943b412_0.conda#55199e2ae2c3651f6f9b2a447b47bdc9 https://conda.anaconda.org/conda-forge/linux-64/libsanitizer-13.3.0-he8ea267_2.conda#2b6cdf7bb95d3d10ef4e38ce0bc95dba @@ -83,7 +83,7 @@ https://conda.anaconda.org/conda-forge/linux-64/mpg123-1.32.9-hc50e24c_0.conda#c https://conda.anaconda.org/conda-forge/linux-64/mysql-common-9.0.1-h266115a_6.conda#94116b69829e90b72d566e64421e1bff https://conda.anaconda.org/conda-forge/linux-64/ninja-1.12.1-hff21bea_1.conda#2322531904f27501ee19847b87ba7c64 https://conda.anaconda.org/conda-forge/linux-64/nspr-4.36-h5888daf_0.conda#de9cd5bca9e4918527b9b72b6e2e1409 -https://conda.anaconda.org/conda-forge/linux-64/pixman-0.44.2-h29eaf8c_0.conda#5e2a7acfa2c24188af39e7944e1b3604 +https://conda.anaconda.org/conda-forge/linux-64/pixman-0.46.0-h29eaf8c_0.conda#d2f1c87d4416d1e7344cf92b1aaee1c4 https://conda.anaconda.org/conda-forge/linux-64/rav1e-0.6.6-he8a937b_2.conda#77d9955b4abddb811cb8ab1aa7d743e4 https://conda.anaconda.org/conda-forge/linux-64/readline-8.2-h8c095d6_2.conda#283b96675859b20a825f8fa30f311446 https://conda.anaconda.org/conda-forge/linux-64/snappy-1.2.1-h8bd8927_1.conda#3b3e64af585eadfb52bb90b553db5edf @@ -103,7 +103,7 @@ https://conda.anaconda.org/conda-forge/linux-64/graphite2-1.3.13-h59595ed_1003.c https://conda.anaconda.org/conda-forge/linux-64/icu-75.1-he02047a_0.conda#8b189310083baabfb622af68fd9d3ae3 https://conda.anaconda.org/conda-forge/linux-64/krb5-1.21.3-h659f571_0.conda#3f43953b7d3fb3aaa1d0d0723d91e368 https://conda.anaconda.org/conda-forge/linux-64/libaec-1.1.3-h59595ed_0.conda#5e97e271911b8b2001a8b71860c32faa -https://conda.anaconda.org/conda-forge/linux-64/libasprintf-devel-0.23.1-h8e693c7_0.conda#2827e722a963b779ce878ef9b5474534 +https://conda.anaconda.org/conda-forge/linux-64/libasprintf-devel-0.24.1-h8e693c7_0.conda#8f66ed2e34507b7ae44afa31c3e4ec79 https://conda.anaconda.org/conda-forge/linux-64/libblas-3.9.0-31_h66dfbfd_blis.conda#612d513ce8103e41dbcb4d941a325027 https://conda.anaconda.org/conda-forge/linux-64/libcap-2.75-h39aace5_0.conda#c44c16d6976d2aebbd65894d7741e67e https://conda.anaconda.org/conda-forge/linux-64/libdrm-2.4.124-hb9d3cd8_0.conda#8bc89311041d7fcb510238cf0848ccae @@ -116,7 +116,7 @@ https://conda.anaconda.org/conda-forge/linux-64/libvorbis-1.3.7-h9c3ff4c_0.tar.b https://conda.anaconda.org/conda-forge/linux-64/libzopfli-1.0.3-h9c3ff4c_0.tar.bz2#c66fe2d123249af7651ebde8984c51c2 https://conda.anaconda.org/conda-forge/linux-64/mysql-libs-9.0.1-he0572af_6.conda#9802ae6d20982f42c0f5d69008988763 https://conda.anaconda.org/conda-forge/linux-64/nss-3.110-h159eef7_0.conda#945659af183e87429c8aa7e0be3cc91d -https://conda.anaconda.org/conda-forge/linux-64/pcre2-10.44-hba22ea6_2.conda#df359c09c41cd186fffb93a2d87aa6f5 +https://conda.anaconda.org/conda-forge/linux-64/pcre2-10.45-hc749103_0.conda#b90bece58b4c2bf25969b70f3be42d25 https://conda.anaconda.org/conda-forge/linux-64/python-3.10.17-hd6af730_0_cpython.conda#7bb89638dae9ce1b8e051d0b721e83c2 https://conda.anaconda.org/conda-forge/linux-64/xcb-util-0.4.1-hb711507_2.conda#8637c3e5821654d0edf97e2b0404b443 https://conda.anaconda.org/conda-forge/linux-64/xcb-util-keysyms-0.4.1-hb711507_0.conda#ad748ccca349aec3e91743e08b5e2b50 @@ -129,7 +129,7 @@ https://conda.anaconda.org/conda-forge/noarch/appdirs-1.4.4-pyhd8ed1ab_1.conda#f https://conda.anaconda.org/conda-forge/linux-64/brotli-1.1.0-hb9d3cd8_2.conda#98514fe74548d768907ce7a13f680e8f https://conda.anaconda.org/conda-forge/linux-64/brotli-python-1.1.0-py310hf71b8c6_2.conda#bf502c169c71e3c6ac0d6175addfacc2 https://conda.anaconda.org/conda-forge/noarch/certifi-2025.1.31-pyhd8ed1ab_0.conda#c207fa5ac7ea99b149344385a9c0880d -https://conda.anaconda.org/conda-forge/noarch/charset-normalizer-3.4.1-pyhd8ed1ab_0.conda#e83a31202d1c0a000fce3e9cf3825875 +https://conda.anaconda.org/conda-forge/noarch/charset-normalizer-3.4.2-pyhd8ed1ab_0.conda#40fe4284b8b5835a9073a645139f35af https://conda.anaconda.org/conda-forge/noarch/click-8.1.8-pyh707e725_0.conda#f22f4d4970e09d68a10b922cbb0408d3 https://conda.anaconda.org/conda-forge/noarch/cloudpickle-3.1.1-pyhd8ed1ab_0.conda#364ba6c9fb03886ac979b482f39ebb92 https://conda.anaconda.org/conda-forge/noarch/colorama-0.4.6-pyhd8ed1ab_1.conda#962b9857ee8e7018c22f2776ffa0b2d7 @@ -142,7 +142,7 @@ https://conda.anaconda.org/conda-forge/noarch/execnet-2.1.1-pyhd8ed1ab_1.conda#a https://conda.anaconda.org/conda-forge/noarch/fsspec-2025.3.2-pyhd8ed1ab_0.conda#9c40692c3d24c7aaf335f673ac09d308 https://conda.anaconda.org/conda-forge/linux-64/gcc-13.3.0-h9576a4e_2.conda#d92e51bf4b6bdbfe45e5884fb0755afe https://conda.anaconda.org/conda-forge/linux-64/gcc_linux-64-13.3.0-hc28eda2_10.conda#d151142bbafe5e68ec7fc065c5e6f80c -https://conda.anaconda.org/conda-forge/linux-64/gettext-0.23.1-h5888daf_0.conda#0754038c806eae440582da1c3af85577 +https://conda.anaconda.org/conda-forge/linux-64/gettext-0.24.1-h5888daf_0.conda#c63e7590d4d6f4c85721040ed8b12888 https://conda.anaconda.org/conda-forge/linux-64/gfortran_impl_linux-64-13.3.0-h84c1745_2.conda#4e21ed177b76537067736f20f54fee0a https://conda.anaconda.org/conda-forge/linux-64/gxx_impl_linux-64-13.3.0-hae580e1_2.conda#b55f02540605c322a47719029f8404cc https://conda.anaconda.org/conda-forge/noarch/hpack-4.1.0-pyhd8ed1ab_0.conda#0a802cb9888dd14eeefc611f05c40b6e @@ -156,12 +156,14 @@ https://conda.anaconda.org/conda-forge/linux-64/libavif16-1.2.1-hbb36593_2.conda https://conda.anaconda.org/conda-forge/linux-64/libcblas-3.9.0-31_hba4ea11_blis.conda#1ea7ae3db0fea0c5222388d841583c51 https://conda.anaconda.org/conda-forge/linux-64/libcups-2.3.3-h4637d8d_4.conda#d4529f4dff3057982a7617c7ac58fde3 https://conda.anaconda.org/conda-forge/linux-64/libfreetype-2.13.3-ha770c72_1.conda#51f5be229d83ecd401fb369ab96ae669 -https://conda.anaconda.org/conda-forge/linux-64/libglib-2.84.1-h2ff4ddf_0.conda#0305434da649d4fb48a425e588b79ea6 +https://conda.anaconda.org/conda-forge/linux-64/libglib-2.84.1-h3618099_1.conda#714c97d4ff495ab69d1fdfcadbcae985 https://conda.anaconda.org/conda-forge/linux-64/libglx-1.7.0-ha4b6fd6_2.conda#c8013e438185f33b13814c5c488acd5c +https://conda.anaconda.org/conda-forge/linux-64/liblapack-3.9.0-12_hd37a5e2_netlib.conda#4b181b55915cefcd35c8398c9274e629 https://conda.anaconda.org/conda-forge/linux-64/libsystemd0-257.4-h4e0b6ca_1.conda#04bcf3055e51f8dde6fab9672fb9fca0 https://conda.anaconda.org/conda-forge/linux-64/libxml2-2.13.7-h4bc477f_1.conda#ad1f1f8238834cd3c88ceeaee8da444a https://conda.anaconda.org/conda-forge/noarch/locket-1.0.0-pyhd8ed1ab_0.tar.bz2#91e27ef3d05cc772ce627e51cff111c4 https://conda.anaconda.org/conda-forge/linux-64/markupsafe-3.0.2-py310h89163eb_1.conda#8ce3f0332fd6de0d737e2911d329523f +https://conda.anaconda.org/conda-forge/noarch/meson-1.8.0-pyh29332c3_0.conda#8e25221b702272394b86b0f4d7217f77 https://conda.anaconda.org/conda-forge/noarch/munkres-1.1.4-pyh9f0ad1d_0.tar.bz2#2ba8498c1018c1e9c61eb99b973dfe19 https://conda.anaconda.org/conda-forge/noarch/networkx-3.2-pyhd8ed1ab_0.conda#cec8cc498664cc00a070676aa89e69a7 https://conda.anaconda.org/conda-forge/linux-64/openjpeg-2.5.3-h5fbd93e_0.conda#9e5816bc95d285c115a3ebc2f8563564 @@ -175,7 +177,7 @@ https://conda.anaconda.org/conda-forge/noarch/pyparsing-3.2.3-pyhd8ed1ab_1.conda https://conda.anaconda.org/conda-forge/noarch/pysocks-1.7.1-pyha55dd90_7.conda#461219d1a5bd61342293efa2c0c90eac https://conda.anaconda.org/conda-forge/noarch/pytz-2025.2-pyhd8ed1ab_0.conda#bc8e3267d44011051f2eb14d22fb0960 https://conda.anaconda.org/conda-forge/linux-64/pyyaml-6.0.2-py310h89163eb_2.conda#fd343408e64cf1e273ab7c710da374db -https://conda.anaconda.org/conda-forge/noarch/setuptools-79.0.1-pyhff2d567_0.conda#fa6669cc21abd4b7b6c5393b7bc71914 +https://conda.anaconda.org/conda-forge/noarch/setuptools-80.1.0-pyhff2d567_0.conda#f6f72d0837c79eaec77661be43e8a691 https://conda.anaconda.org/conda-forge/noarch/six-1.17.0-pyhd8ed1ab_0.conda#a451d576819089b0d672f18768be0f65 https://conda.anaconda.org/conda-forge/noarch/snowballstemmer-2.2.0-pyhd8ed1ab_0.tar.bz2#4d22a9315e78c6827f806065957d566e https://conda.anaconda.org/conda-forge/noarch/soupsieve-2.5-pyhd8ed1ab_1.conda#3f144b2c34f8cb5a9abd9ed23a39c561 @@ -206,24 +208,24 @@ https://conda.anaconda.org/conda-forge/linux-64/fonttools-4.57.0-py310h89163eb_0 https://conda.anaconda.org/conda-forge/linux-64/freetype-2.13.3-ha770c72_1.conda#9ccd736d31e0c6e41f54e704e5312811 https://conda.anaconda.org/conda-forge/linux-64/gfortran-13.3.0-h9576a4e_2.conda#19e6d3c9cde10a0a9a170a684082588e https://conda.anaconda.org/conda-forge/linux-64/gfortran_linux-64-13.3.0-hb919d3a_10.conda#7ce070e3329cd10bf79dbed562a21bd4 -https://conda.anaconda.org/conda-forge/linux-64/glib-tools-2.84.1-h4833e2c_0.conda#ddc06964296eee2b4070e65415b332fd +https://conda.anaconda.org/conda-forge/linux-64/glib-tools-2.84.1-h4833e2c_1.conda#418de18c9b79a3d8583d90d27e0937c2 https://conda.anaconda.org/conda-forge/linux-64/gxx-13.3.0-h9576a4e_2.conda#07e8df00b7cd3084ad3ef598ce32a71c https://conda.anaconda.org/conda-forge/linux-64/gxx_linux-64-13.3.0-h6834431_10.conda#9a8ebde471cec5cc9c48f8682f434f92 https://conda.anaconda.org/conda-forge/noarch/h2-4.2.0-pyhd8ed1ab_0.conda#b4754fb1bdcb70c8fd54f918301582c6 https://conda.anaconda.org/conda-forge/noarch/importlib-metadata-8.6.1-pyha770c72_0.conda#f4b39bf00c69f56ac01e020ebfac066c https://conda.anaconda.org/conda-forge/noarch/importlib_resources-6.5.2-pyhd8ed1ab_0.conda#c85c76dc67d75619a92f51dfbce06992 https://conda.anaconda.org/conda-forge/noarch/jinja2-3.1.6-pyhd8ed1ab_0.conda#446bd6c8cb26050d528881df495ce646 -https://conda.anaconda.org/conda-forge/noarch/joblib-1.4.2-pyhd8ed1ab_1.conda#bf8243ee348f3a10a14ed0cae323e0c1 +https://conda.anaconda.org/conda-forge/noarch/joblib-1.5.0-pyhd8ed1ab_0.conda#3d7257f0a61c9aa4ffa3e324a887416b https://conda.anaconda.org/conda-forge/linux-64/libflac-1.4.3-h59595ed_0.conda#ee48bf17cc83a00f59ca1494d5646869 https://conda.anaconda.org/conda-forge/linux-64/libgl-1.7.0-ha4b6fd6_2.conda#928b8be80851f5d8ffb016f9c81dae7a -https://conda.anaconda.org/conda-forge/linux-64/libhwloc-2.11.2-default_h0d58e46_1001.conda#804ca9e91bcaea0824a341d55b1684f2 -https://conda.anaconda.org/conda-forge/linux-64/libllvm20-20.1.3-he9d0ab4_0.conda#74c14fe2ab88e352ab6e4fedf5ecb527 -https://conda.anaconda.org/conda-forge/linux-64/libxkbcommon-1.9.0-h65c71a3_0.conda#14fbc598b68d4c6386978f7db09fc5ed +https://conda.anaconda.org/conda-forge/linux-64/liblapacke-3.9.0-12_hce4cc19_netlib.conda#bdcf65db13abdddba7af29592f93600b +https://conda.anaconda.org/conda-forge/linux-64/libllvm20-20.1.4-he9d0ab4_0.conda#96c33bbd084ef2b2463503fb7f1482ae +https://conda.anaconda.org/conda-forge/linux-64/libxkbcommon-1.9.1-h65c71a3_0.conda#6e45090fe0eec179ecc8041a3a3fc9f8 https://conda.anaconda.org/conda-forge/noarch/memory_profiler-0.61.0-pyhd8ed1ab_1.conda#71abbefb6f3b95e1668cd5e0af3affb9 -https://conda.anaconda.org/conda-forge/noarch/meson-1.7.1-pyhd8ed1ab_0.conda#90018ee73b8741268027421ceac2809a +https://conda.anaconda.org/conda-forge/linux-64/numpy-1.22.0-py310h454958d_1.tar.bz2#607c66f0cce2986515a8fe9e136b2b57 https://conda.anaconda.org/conda-forge/linux-64/openldap-2.6.9-he970967_0.conda#ca2de8bbdc871bce41dbf59e51324165 https://conda.anaconda.org/conda-forge/noarch/partd-1.4.2-pyhd8ed1ab_0.conda#0badf9c54e24cecfb0ad2f99d680c163 -https://conda.anaconda.org/conda-forge/noarch/pip-25.1-pyh8b19718_0.conda#2247aa245832ea47e8b971bef73d7094 +https://conda.anaconda.org/conda-forge/noarch/pip-25.1.1-pyh8b19718_0.conda#32d0781ace05105cc99af55d36cbec7c https://conda.anaconda.org/conda-forge/noarch/plotly-5.14.0-pyhd8ed1ab_0.conda#6a7bcc42ef58dd6cf3da9333ea102433 https://conda.anaconda.org/conda-forge/noarch/pyproject-metadata-0.9.1-pyhd8ed1ab_0.conda#22ae7c6ea81e0c8661ef32168dda929b https://conda.anaconda.org/conda-forge/noarch/pytest-8.3.5-pyhd8ed1ab_0.conda#c3c9316209dec74a705a36797970c6be @@ -233,55 +235,50 @@ https://conda.anaconda.org/conda-forge/noarch/typing-extensions-4.13.2-h0e9735f_ https://conda.anaconda.org/conda-forge/linux-64/xorg-libxdamage-1.1.6-hb9d3cd8_0.conda#b5fcc7172d22516e1f965490e65e33a4 https://conda.anaconda.org/conda-forge/linux-64/xorg-libxxf86vm-1.1.6-hb9d3cd8_0.conda#5efa5fa6243a622445fdfd72aee15efa https://conda.anaconda.org/conda-forge/noarch/beautifulsoup4-4.13.4-pyha770c72_0.conda#9f07c4fc992adb2d6c30da7fab3959a7 +https://conda.anaconda.org/conda-forge/linux-64/blas-devel-3.9.0-31_hdec4247_blis.conda#1675e95a742c910204645f7b6d7e56dc https://conda.anaconda.org/conda-forge/linux-64/cxx-compiler-1.9.0-h1a2810e_0.conda#1ce8b218d359d9ed0ab481f2a3f3c512 https://conda.anaconda.org/conda-forge/noarch/dask-core-2025.4.1-pyhd8ed1ab_0.conda#0735ecef025a6c2d6eb61aae4785fc3f https://conda.anaconda.org/conda-forge/linux-64/fontconfig-2.15.0-h7e30c49_1.conda#8f5b0b297b59e1ac160ad4beec99dbee https://conda.anaconda.org/conda-forge/linux-64/fortran-compiler-1.9.0-h36df796_0.conda#cc0cf942201f9d3b0e9654ea02e12486 -https://conda.anaconda.org/conda-forge/linux-64/glib-2.84.1-h07242d1_0.conda#2c2357f18073331d4aefe7252b9fad17 +https://conda.anaconda.org/conda-forge/linux-64/glib-2.84.1-h6287aef_1.conda#35012688d30e1b52bff2ba5d1f342a50 +https://conda.anaconda.org/conda-forge/linux-64/imagecodecs-2024.12.30-py310h78a9a29_0.conda#e0c50079904122427bcf52e1afcd1cdb https://conda.anaconda.org/conda-forge/noarch/importlib-resources-6.5.2-pyhd8ed1ab_0.conda#e376ea42e9ae40f3278b0f79c9bf9826 -https://conda.anaconda.org/conda-forge/linux-64/libclang-cpp20.1-20.1.3-default_h1df26ce_0.conda#bbce8ba7f25af8b0928f13fca1eb7405 -https://conda.anaconda.org/conda-forge/linux-64/libclang13-20.1.3-default_he06ed0a_0.conda#1bb2ec3c550f7589b2d16e271aeaeddb +https://conda.anaconda.org/conda-forge/linux-64/libclang-cpp20.1-20.1.4-default_h1df26ce_0.conda#96f8d5b2e94c9ba4fef19f1adf068a15 +https://conda.anaconda.org/conda-forge/linux-64/libclang13-20.1.4-default_he06ed0a_0.conda#2d933632c8004be47deb2be61bf013be https://conda.anaconda.org/conda-forge/linux-64/libpq-17.4-h27ae623_1.conda#37fba334855ef3b51549308e61ed7a3d https://conda.anaconda.org/conda-forge/linux-64/libsndfile-1.2.2-hc60ed4a_1.conda#ef1910918dd895516a769ed36b5b3a4e https://conda.anaconda.org/conda-forge/noarch/meson-python-0.17.1-pyh70fd9c4_1.conda#7a02679229c6c2092571b4c025055440 +https://conda.anaconda.org/conda-forge/linux-64/pandas-1.4.0-py310hb5077e9_0.tar.bz2#43e920bc9856daa7d8d18fcbfb244c4e +https://conda.anaconda.org/conda-forge/noarch/patsy-1.0.1-pyhd8ed1ab_1.conda#ee23fabfd0a8c6b8d6f3729b47b2859d https://conda.anaconda.org/conda-forge/linux-64/pillow-11.1.0-py310h7e6dc6c_0.conda#14d300b9e1504748e70cc6499a7b4d25 +https://conda.anaconda.org/conda-forge/linux-64/polars-0.20.30-py310h031f9ce_0.conda#0743f5db9f978b6df92d412935ff8371 https://conda.anaconda.org/conda-forge/linux-64/pyqt5-sip-12.13.0-py310hf71b8c6_1.conda#0c8cbfbe70f4c8a47b040a14615e6f1f https://conda.anaconda.org/conda-forge/noarch/pytest-xdist-3.6.1-pyhd8ed1ab_1.conda#59aad4fb37cabc0bacc73cf344612ddd -https://conda.anaconda.org/conda-forge/linux-64/tbb-2021.13.0-hceb3a55_1.conda#ba7726b8df7b9d34ea80e82b097a4893 -https://conda.anaconda.org/conda-forge/linux-64/zstandard-0.23.0-py310ha75aee5_1.conda#0316e8d0e00c00631a6de89207db5b09 +https://conda.anaconda.org/conda-forge/linux-64/pywavelets-1.6.0-py310h261611a_0.conda#04a405ee0bccb4de8d1ed0c87704f5f6 +https://conda.anaconda.org/conda-forge/linux-64/scipy-1.8.0-py310hea5193d_1.tar.bz2#664d80ddeb51241629b3ada5ea926e4d +https://conda.anaconda.org/conda-forge/linux-64/zstandard-0.23.0-py310ha75aee5_2.conda#f9254b5b0193982416b91edcb4b2676f +https://conda.anaconda.org/conda-forge/linux-64/blas-2.131-blis.conda#87829e6b9fe49a926280e100959b7d2b https://conda.anaconda.org/conda-forge/linux-64/cairo-1.18.4-h3394656_0.conda#09262e66b19567aff4f592fb53b28760 https://conda.anaconda.org/conda-forge/linux-64/compilers-1.9.0-ha770c72_0.conda#5859096e397aba423340d0bbbb11ec64 https://conda.anaconda.org/conda-forge/linux-64/gstreamer-1.24.11-hc37bda9_0.conda#056d86cacf2b48c79c6a562a2486eb8c -https://conda.anaconda.org/conda-forge/linux-64/mkl-2024.2.2-ha957f24_16.conda#1459379c79dda834673426504d52b319 +https://conda.anaconda.org/conda-forge/noarch/imageio-2.37.0-pyhfb79c49_0.conda#b5577bc2212219566578fd5af9993af6 +https://conda.anaconda.org/conda-forge/linux-64/matplotlib-base-3.5.0-py310h23f4a51_0.tar.bz2#9911225650b298776c8e8c083b5cacf1 https://conda.anaconda.org/conda-forge/linux-64/pulseaudio-client-17.0-hac146a9_1.conda#66b1fa9608d8836e25f9919159adc9c6 +https://conda.anaconda.org/conda-forge/linux-64/pyamg-4.2.1-py310h7c3ba0c_0.tar.bz2#89f5a48e1f23b5cf3163a6094903d181 +https://conda.anaconda.org/conda-forge/linux-64/statsmodels-0.14.2-py310h261611a_0.conda#4b8508bab02b2aa2cef12eab4883f4a1 +https://conda.anaconda.org/conda-forge/noarch/tifffile-2025.3.30-pyhd8ed1ab_0.conda#14f46147fae19bb867f82a787c7059e9 https://conda.anaconda.org/conda-forge/noarch/towncrier-24.8.0-pyhd8ed1ab_1.conda#820b6a1ddf590fba253f8204f7200d82 https://conda.anaconda.org/conda-forge/noarch/urllib3-2.4.0-pyhd8ed1ab_0.conda#c1e349028e0052c4eea844e94f773065 https://conda.anaconda.org/conda-forge/linux-64/gst-plugins-base-1.24.11-h651a532_0.conda#d8d8894f8ced2c9be76dc9ad1ae531ce https://conda.anaconda.org/conda-forge/linux-64/harfbuzz-11.1.0-h3beb420_0.conda#95e3bb97f9cdc251c0c68640e9c10ed3 -https://conda.anaconda.org/conda-forge/linux-64/liblapack-3.9.0-11_h9f1adc1_netlib.conda#fb4e3a141e4be1caf354a9d81780245b https://conda.anaconda.org/conda-forge/noarch/requests-2.32.3-pyhd8ed1ab_1.conda#a9b9368f3701a417eac9edbcae7cb737 -https://conda.anaconda.org/conda-forge/linux-64/liblapacke-3.9.0-11_h0ad7b2f_netlib.conda#06dacf1374982882a6ca02e1fa13efbd -https://conda.anaconda.org/conda-forge/linux-64/numpy-1.22.0-py310h454958d_1.tar.bz2#607c66f0cce2986515a8fe9e136b2b57 +https://conda.anaconda.org/conda-forge/linux-64/scikit-image-0.19.0-py310hb5077e9_0.tar.bz2#aa24b3a4aa979641ac3144405209cd89 +https://conda.anaconda.org/conda-forge/noarch/seaborn-base-0.13.2-pyhd8ed1ab_3.conda#fd96da444e81f9e6fcaac38590f3dd42 https://conda.anaconda.org/conda-forge/noarch/pooch-1.6.0-pyhd8ed1ab_0.tar.bz2#6429e1d1091c51f626b5dcfdd38bf429 https://conda.anaconda.org/conda-forge/linux-64/qt-main-5.15.15-h993ce98_3.conda#aa49f5308f39277477d47cd6687eb8f3 -https://conda.anaconda.org/conda-forge/linux-64/blas-devel-3.9.0-31_hdec4247_blis.conda#1675e95a742c910204645f7b6d7e56dc -https://conda.anaconda.org/conda-forge/linux-64/imagecodecs-2024.12.30-py310h78a9a29_0.conda#e0c50079904122427bcf52e1afcd1cdb -https://conda.anaconda.org/conda-forge/noarch/imageio-2.37.0-pyhfb79c49_0.conda#b5577bc2212219566578fd5af9993af6 -https://conda.anaconda.org/conda-forge/linux-64/matplotlib-base-3.5.0-py310h23f4a51_0.tar.bz2#9911225650b298776c8e8c083b5cacf1 -https://conda.anaconda.org/conda-forge/linux-64/pandas-1.4.0-py310hb5077e9_0.tar.bz2#43e920bc9856daa7d8d18fcbfb244c4e -https://conda.anaconda.org/conda-forge/noarch/patsy-1.0.1-pyhd8ed1ab_1.conda#ee23fabfd0a8c6b8d6f3729b47b2859d -https://conda.anaconda.org/conda-forge/linux-64/polars-0.20.30-py310h031f9ce_0.conda#0743f5db9f978b6df92d412935ff8371 +https://conda.anaconda.org/conda-forge/noarch/seaborn-0.13.2-hd8ed1ab_3.conda#62afb877ca2c2b4b6f9ecb37320085b6 https://conda.anaconda.org/conda-forge/linux-64/pyqt-5.15.10-py310hb3b5edb_1.conda#c370972fc4557cb54d265c9c1f71bd20 -https://conda.anaconda.org/conda-forge/linux-64/pywavelets-1.6.0-py310h261611a_0.conda#04a405ee0bccb4de8d1ed0c87704f5f6 -https://conda.anaconda.org/conda-forge/linux-64/scipy-1.8.0-py310hea5193d_1.tar.bz2#664d80ddeb51241629b3ada5ea926e4d -https://conda.anaconda.org/conda-forge/linux-64/blas-2.131-blis.conda#87829e6b9fe49a926280e100959b7d2b https://conda.anaconda.org/conda-forge/linux-64/matplotlib-3.5.0-py310hff52083_0.tar.bz2#1b2f3b135d5d9c594b5e0e6150c03b7b -https://conda.anaconda.org/conda-forge/linux-64/pyamg-4.2.1-py310h7c3ba0c_0.tar.bz2#89f5a48e1f23b5cf3163a6094903d181 -https://conda.anaconda.org/conda-forge/noarch/seaborn-base-0.13.2-pyhd8ed1ab_3.conda#fd96da444e81f9e6fcaac38590f3dd42 -https://conda.anaconda.org/conda-forge/linux-64/statsmodels-0.14.2-py310h261611a_0.conda#4b8508bab02b2aa2cef12eab4883f4a1 -https://conda.anaconda.org/conda-forge/noarch/tifffile-2025.3.30-pyhd8ed1ab_0.conda#14f46147fae19bb867f82a787c7059e9 -https://conda.anaconda.org/conda-forge/linux-64/scikit-image-0.19.0-py310hb5077e9_0.tar.bz2#aa24b3a4aa979641ac3144405209cd89 -https://conda.anaconda.org/conda-forge/noarch/seaborn-0.13.2-hd8ed1ab_3.conda#62afb877ca2c2b4b6f9ecb37320085b6 https://conda.anaconda.org/conda-forge/noarch/numpydoc-1.2-pyhd8ed1ab_0.tar.bz2#025ad7ca2c7f65007ab6b6f5d93a56eb https://conda.anaconda.org/conda-forge/noarch/pydata-sphinx-theme-0.15.3-pyhd8ed1ab_0.conda#55e445f4fcb07f2471fb0e1102d36488 https://conda.anaconda.org/conda-forge/noarch/sphinx-copybutton-0.5.2-pyhd8ed1ab_1.conda#bf22cb9c439572760316ce0748af3713 diff --git a/build_tools/github/pymin_conda_forge_arm_linux-aarch64_conda.lock b/build_tools/github/pymin_conda_forge_arm_linux-aarch64_conda.lock index 2c023f3c775e0..5f7bedbbfeaa8 100644 --- a/build_tools/github/pymin_conda_forge_arm_linux-aarch64_conda.lock +++ b/build_tools/github/pymin_conda_forge_arm_linux-aarch64_conda.lock @@ -32,7 +32,7 @@ https://conda.anaconda.org/conda-forge/linux-aarch64/libstdcxx-14.2.0-h3f4de04_2 https://conda.anaconda.org/conda-forge/linux-aarch64/libwebp-base-1.5.0-h0886dbf_0.conda#95ef4a689b8cc1b7e18b53784d88f96b https://conda.anaconda.org/conda-forge/linux-aarch64/libzlib-1.3.1-h86ecc28_2.conda#08aad7cbe9f5a6b460d0976076b6ae64 https://conda.anaconda.org/conda-forge/linux-aarch64/ncurses-6.5-ha32ae93_3.conda#182afabe009dc78d8b73100255ee6868 -https://conda.anaconda.org/conda-forge/linux-aarch64/openssl-3.5.0-hd08dc88_0.conda#26af4dcecaf373c31ae91f403ae98259 +https://conda.anaconda.org/conda-forge/linux-aarch64/openssl-3.5.0-hd08dc88_1.conda#ee68fdc3a8723e9c58bdd2f10544658f https://conda.anaconda.org/conda-forge/linux-aarch64/pthread-stubs-0.4-h86ecc28_1002.conda#bb5a90c93e3bac3d5690acf76b4a6386 https://conda.anaconda.org/conda-forge/linux-aarch64/xorg-libice-1.1.2-h86ecc28_0.conda#c8d8ec3e00cd0fd8a231789b91a7c5b7 https://conda.anaconda.org/conda-forge/linux-aarch64/xorg-libxau-1.0.12-h86ecc28_0.conda#d5397424399a66d33c80b1f2345a36a6 @@ -57,7 +57,7 @@ https://conda.anaconda.org/conda-forge/linux-aarch64/libxcb-1.17.0-h262b8f6_0.co https://conda.anaconda.org/conda-forge/linux-aarch64/libxcrypt-4.4.36-h31becfc_1.conda#b4df5d7d4b63579d081fd3a4cf99740e https://conda.anaconda.org/conda-forge/linux-aarch64/mysql-common-9.2.0-h3f5c77f_0.conda#f9db1ad1a8897483edb3ac321d662e7b https://conda.anaconda.org/conda-forge/linux-aarch64/ninja-1.12.1-h17cf362_1.conda#885414635e2a65ed06f284f6d569cdff -https://conda.anaconda.org/conda-forge/linux-aarch64/pixman-0.44.2-h86a87f0_0.conda#95689fc369832398e82d17c56ff5df8a +https://conda.anaconda.org/conda-forge/linux-aarch64/pixman-0.46.0-h86a87f0_0.conda#1328d5bad76f7b31926ccd2a33e0d6ef https://conda.anaconda.org/conda-forge/linux-aarch64/readline-8.2-h8382b9d_2.conda#c0f08fc2737967edde1a272d4bf41ed9 https://conda.anaconda.org/conda-forge/linux-aarch64/tk-8.6.13-h194ca79_0.conda#f75105e0585851f818e0009dd1dde4dc https://conda.anaconda.org/conda-forge/linux-aarch64/wayland-1.23.1-h698ed42_1.conda#229b00f81a229af79547a7e4776ccf6e @@ -72,7 +72,7 @@ https://conda.anaconda.org/conda-forge/linux-aarch64/libgfortran-ng-14.2.0-he943 https://conda.anaconda.org/conda-forge/linux-aarch64/libopenblas-0.3.29-pthreads_h9d3fd7e_0.conda#a99e2bfcb1ad6362544c71281eb617e9 https://conda.anaconda.org/conda-forge/linux-aarch64/libtiff-4.7.0-h88f7998_4.conda#6edd78ac9bee9a972f25cb6e8c6e21ad https://conda.anaconda.org/conda-forge/linux-aarch64/mysql-libs-9.2.0-h11569fd_0.conda#72f21962b1205535d810b82f8f0fa342 -https://conda.anaconda.org/conda-forge/linux-aarch64/pcre2-10.44-h070dd5b_2.conda#94022de9682cb1a0bb18a99cbc3541b3 +https://conda.anaconda.org/conda-forge/linux-aarch64/pcre2-10.44-hf4ec17f_2.conda#ab9d0f9a3c9ce23e4fd2af4edc6fa245 https://conda.anaconda.org/conda-forge/linux-aarch64/python-3.10.17-h256493d_0_cpython.conda#c496213b6ede3c5a30ce1bf02bebf382 https://conda.anaconda.org/conda-forge/linux-aarch64/qhull-2020.2-h70be974_5.conda#bb138086d938e2b64f5f364945793ebf https://conda.anaconda.org/conda-forge/linux-aarch64/xcb-util-0.4.1-h5c728e9_2.conda#b4cf8ba6cff9cdf1249bcfe1314222b0 @@ -98,13 +98,14 @@ https://conda.anaconda.org/conda-forge/linux-aarch64/libglib-2.84.1-hc486b8e_0.c https://conda.anaconda.org/conda-forge/linux-aarch64/libglx-1.7.0-hd24410f_2.conda#1d4269e233636148696a67e2d30dad2a https://conda.anaconda.org/conda-forge/linux-aarch64/libhiredis-1.0.2-h05efe27_0.tar.bz2#a87f068744fd20334cd41489eb163bee https://conda.anaconda.org/conda-forge/linux-aarch64/libxml2-2.13.7-he060846_1.conda#b461618b5dafbc95c6f9492043cd991a +https://conda.anaconda.org/conda-forge/noarch/meson-1.8.0-pyh29332c3_0.conda#8e25221b702272394b86b0f4d7217f77 https://conda.anaconda.org/conda-forge/noarch/munkres-1.1.4-pyh9f0ad1d_0.tar.bz2#2ba8498c1018c1e9c61eb99b973dfe19 https://conda.anaconda.org/conda-forge/linux-aarch64/openblas-0.3.29-pthreads_h3a8cbd8_0.conda#4ec5b6144709ced5e7933977675f61c6 https://conda.anaconda.org/conda-forge/linux-aarch64/openjpeg-2.5.3-h3f56577_0.conda#04231368e4af50d11184b50e14250993 https://conda.anaconda.org/conda-forge/noarch/packaging-25.0-pyh29332c3_1.conda#58335b26c38bf4a20f399384c33cbcf9 https://conda.anaconda.org/conda-forge/noarch/pluggy-1.5.0-pyhd8ed1ab_1.conda#e9dcbce5f45f9ee500e728ae58b605b6 https://conda.anaconda.org/conda-forge/noarch/pyparsing-3.2.3-pyhd8ed1ab_1.conda#513d3c262ee49b54a8fec85c5bc99764 -https://conda.anaconda.org/conda-forge/noarch/setuptools-79.0.1-pyhff2d567_0.conda#fa6669cc21abd4b7b6c5393b7bc71914 +https://conda.anaconda.org/conda-forge/noarch/setuptools-80.1.0-pyhff2d567_0.conda#f6f72d0837c79eaec77661be43e8a691 https://conda.anaconda.org/conda-forge/noarch/six-1.17.0-pyhd8ed1ab_0.conda#a451d576819089b0d672f18768be0f65 https://conda.anaconda.org/conda-forge/noarch/threadpoolctl-3.6.0-pyhecae5ae_0.conda#9d64911b31d57ca443e9f1e36b04385f https://conda.anaconda.org/conda-forge/noarch/tomli-2.2.1-pyhd8ed1ab_1.conda#ac944244f1fed2eb49bae07193ae8215 @@ -116,20 +117,19 @@ https://conda.anaconda.org/conda-forge/linux-aarch64/xkeyboard-config-2.44-h86ec https://conda.anaconda.org/conda-forge/linux-aarch64/xorg-libxext-1.3.6-h57736b2_0.conda#bd1e86dd8aa3afd78a4bfdb4ef918165 https://conda.anaconda.org/conda-forge/linux-aarch64/xorg-libxfixes-6.0.1-h57736b2_0.conda#78f8715c002cc66991d7c11e3cf66039 https://conda.anaconda.org/conda-forge/linux-aarch64/xorg-libxrender-0.9.12-h86ecc28_0.conda#ae2c2dd0e2d38d249887727db2af960e -https://conda.anaconda.org/conda-forge/linux-aarch64/ccache-4.11.2-h3aba2e8_0.conda#a46293869605e4a6b0635f0bf9e0d492 +https://conda.anaconda.org/conda-forge/linux-aarch64/ccache-4.11.3-h4889ad1_0.conda#e0b9e519da2bf0fb8c48381daf87a194 https://conda.anaconda.org/conda-forge/linux-aarch64/dbus-1.13.6-h12b9eeb_3.tar.bz2#f3d63805602166bac09386741e00935e https://conda.anaconda.org/conda-forge/linux-aarch64/fonttools-4.57.0-py310heeae437_0.conda#548b750f1b3ec57d07b0014f8081e9c2 https://conda.anaconda.org/conda-forge/linux-aarch64/freetype-2.13.3-h8af1aa0_1.conda#71c4cbe1b384a8e7b56993394a435343 -https://conda.anaconda.org/conda-forge/noarch/joblib-1.4.2-pyhd8ed1ab_1.conda#bf8243ee348f3a10a14ed0cae323e0c1 +https://conda.anaconda.org/conda-forge/noarch/joblib-1.5.0-pyhd8ed1ab_0.conda#3d7257f0a61c9aa4ffa3e324a887416b https://conda.anaconda.org/conda-forge/linux-aarch64/libcblas-3.9.0-31_hab92f65_openblas.conda#6b81dbae56a519f1ec2f25e0ee2f4334 https://conda.anaconda.org/conda-forge/linux-aarch64/libgl-1.7.0-hd24410f_2.conda#0d00176464ebb25af83d40736a2cd3bb https://conda.anaconda.org/conda-forge/linux-aarch64/liblapack-3.9.0-31_h411afd4_openblas.conda#41dbff5eb805a75c120a7b7a1c744dc2 -https://conda.anaconda.org/conda-forge/linux-aarch64/libllvm20-20.1.3-h07bd352_0.conda#72d693aa8786a9c14286d6bf6f4d0da7 -https://conda.anaconda.org/conda-forge/linux-aarch64/libxkbcommon-1.9.0-hbab7b08_0.conda#d8f79e5786c1060e29c209c1c4c67a66 +https://conda.anaconda.org/conda-forge/linux-aarch64/libllvm20-20.1.4-h07bd352_0.conda#a83f31777ec098202198145883d86ffb +https://conda.anaconda.org/conda-forge/linux-aarch64/libxkbcommon-1.9.1-hbab7b08_0.conda#49a02083d4ab2cda74584a64defb4b9d https://conda.anaconda.org/conda-forge/linux-aarch64/libxslt-1.1.39-h1cc9640_0.conda#13e1d3f9188e85c6d59a98651aced002 -https://conda.anaconda.org/conda-forge/noarch/meson-1.7.1-pyhd8ed1ab_0.conda#90018ee73b8741268027421ceac2809a https://conda.anaconda.org/conda-forge/linux-aarch64/openldap-2.6.9-h30c48ee_0.conda#c07822a5de65ce9797b9afa257faa917 -https://conda.anaconda.org/conda-forge/noarch/pip-25.1-pyh8b19718_0.conda#2247aa245832ea47e8b971bef73d7094 +https://conda.anaconda.org/conda-forge/noarch/pip-25.1.1-pyh8b19718_0.conda#32d0781ace05105cc99af55d36cbec7c https://conda.anaconda.org/conda-forge/noarch/pyproject-metadata-0.9.1-pyhd8ed1ab_0.conda#22ae7c6ea81e0c8661ef32168dda929b https://conda.anaconda.org/conda-forge/noarch/pytest-8.3.5-pyhd8ed1ab_0.conda#c3c9316209dec74a705a36797970c6be https://conda.anaconda.org/conda-forge/noarch/python-dateutil-2.9.0.post0-pyhff2d567_1.conda#5ba79d7c71f03c678c8ead841f347d6e @@ -141,8 +141,8 @@ https://conda.anaconda.org/conda-forge/linux-aarch64/xorg-libxi-1.8.2-h57736b2_0 https://conda.anaconda.org/conda-forge/linux-aarch64/xorg-libxrandr-1.5.4-h86ecc28_0.conda#dd3e74283a082381aa3860312e3c721e https://conda.anaconda.org/conda-forge/linux-aarch64/xorg-libxxf86vm-1.1.6-h86ecc28_0.conda#d745faa2d7c15092652e40a22bb261ed https://conda.anaconda.org/conda-forge/linux-aarch64/fontconfig-2.15.0-h8dda3cd_1.conda#112b71b6af28b47c624bcbeefeea685b -https://conda.anaconda.org/conda-forge/linux-aarch64/libclang-cpp20.1-20.1.3-default_h7d4303a_0.conda#c8e8f4cb5f527bfae38e710459cb05a4 -https://conda.anaconda.org/conda-forge/linux-aarch64/libclang13-20.1.3-default_h9e36cb9_0.conda#409dd4c25c875b9b367fe6a203d96ff0 +https://conda.anaconda.org/conda-forge/linux-aarch64/libclang-cpp20.1-20.1.4-default_h7d4303a_0.conda#d71665eccdb65183c72e149424ec3928 +https://conda.anaconda.org/conda-forge/linux-aarch64/libclang13-20.1.4-default_h9e36cb9_0.conda#6d587caa650694fa5f6d04fda1bcfee2 https://conda.anaconda.org/conda-forge/linux-aarch64/liblapacke-3.9.0-31_hc659ca5_openblas.conda#256bb281d78e5b8927ff13a1cde9f6f5 https://conda.anaconda.org/conda-forge/linux-aarch64/libpq-17.4-hf590da8_1.conda#10fdc78be541c9017e2144f86d092aa2 https://conda.anaconda.org/conda-forge/noarch/meson-python-0.17.1-pyh70fd9c4_1.conda#7a02679229c6c2092571b4c025055440 From b985df0a723d26ed9068bd28483fdd3858397e1f Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Mon, 5 May 2025 09:06:49 +0000 Subject: [PATCH 110/182] Bump pypa/cibuildwheel from 2.23.2 to 2.23.3 in the actions group (#31291) Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> Co-authored-by: adrinjalali --- .github/workflows/cuda-ci.yml | 2 +- .github/workflows/emscripten.yml | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/.github/workflows/cuda-ci.yml b/.github/workflows/cuda-ci.yml index 8bcd78abb9cbf..028ff06903e8a 100644 --- a/.github/workflows/cuda-ci.yml +++ b/.github/workflows/cuda-ci.yml @@ -18,7 +18,7 @@ jobs: - uses: actions/checkout@v4 - name: Build wheels - uses: pypa/cibuildwheel@v2.23.2 + uses: pypa/cibuildwheel@faf86a6ed7efa889faf6996aa23820831055001a env: CIBW_BUILD: cp313-manylinux_x86_64 CIBW_MANYLINUX_X86_64_IMAGE: manylinux2014 diff --git a/.github/workflows/emscripten.yml b/.github/workflows/emscripten.yml index cd2731a6ceec4..47e54f6125638 100644 --- a/.github/workflows/emscripten.yml +++ b/.github/workflows/emscripten.yml @@ -67,7 +67,7 @@ jobs: with: persist-credentials: false - - uses: pypa/cibuildwheel@d04cacbc9866d432033b1d09142936e6a0e2121a # v2.23.2 + - uses: pypa/cibuildwheel@faf86a6ed7efa889faf6996aa23820831055001a env: CIBW_PLATFORM: pyodide SKLEARN_SKIP_OPENMP_TEST: "true" From f0c80e8f4a4bc4fdaea1a00ad887cbba99d533e2 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?J=C3=A9r=C3=A9mie=20du=20Boisberranger?= Date: Mon, 5 May 2025 13:37:05 +0200 Subject: [PATCH 111/182] MNT clean-up deprecations for 1.7: multi_class in LogisticRegression (#31241) --- doc/modules/model_evaluation.rst | 6 +- .../sklearn.linear_model/31241.api.rst | 7 +++ sklearn/ensemble/tests/test_voting.py | 10 +-- sklearn/linear_model/_logistic.py | 26 ++++++-- sklearn/linear_model/tests/test_logistic.py | 61 +++++++++++++------ sklearn/metrics/_ranking.py | 6 +- .../model_selection/tests/test_validation.py | 44 +++++-------- sklearn/svm/tests/test_bounds.py | 5 ++ sklearn/tests/test_multioutput.py | 24 ++++---- 9 files changed, 112 insertions(+), 77 deletions(-) create mode 100644 doc/whats_new/upcoming_changes/sklearn.linear_model/31241.api.rst diff --git a/doc/modules/model_evaluation.rst b/doc/modules/model_evaluation.rst index b7371c0ba6def..672ed48f9c0d3 100644 --- a/doc/modules/model_evaluation.rst +++ b/doc/modules/model_evaluation.rst @@ -1632,7 +1632,7 @@ Therefore, the `y_score` parameter is of size (n_samples,). >>> from sklearn.linear_model import LogisticRegression >>> from sklearn.metrics import roc_auc_score >>> X, y = load_breast_cancer(return_X_y=True) - >>> clf = LogisticRegression(solver="liblinear").fit(X, y) + >>> clf = LogisticRegression().fit(X, y) >>> clf.classes_ array([0, 1]) @@ -1728,11 +1728,11 @@ class with the greater label for each output. >>> from sklearn.datasets import make_multilabel_classification >>> from sklearn.multioutput import MultiOutputClassifier >>> X, y = make_multilabel_classification(random_state=0) - >>> inner_clf = LogisticRegression(solver="liblinear", random_state=0) + >>> inner_clf = LogisticRegression(random_state=0) >>> clf = MultiOutputClassifier(inner_clf).fit(X, y) >>> y_score = np.transpose([y_pred[:, 1] for y_pred in clf.predict_proba(X)]) >>> roc_auc_score(y, y_score, average=None) - array([0.82..., 0.86..., 0.94..., 0.85... , 0.94...]) + array([0.82..., 0.85..., 0.93..., 0.86..., 0.94...]) And the decision values do not require such processing. diff --git a/doc/whats_new/upcoming_changes/sklearn.linear_model/31241.api.rst b/doc/whats_new/upcoming_changes/sklearn.linear_model/31241.api.rst new file mode 100644 index 0000000000000..9cd97143e29c7 --- /dev/null +++ b/doc/whats_new/upcoming_changes/sklearn.linear_model/31241.api.rst @@ -0,0 +1,7 @@ +- Using the `"liblinear"` solver for multiclass classification with a one-versus-rest + scheme in :class:`linear_model.LogisticRegression` and + :class:`linear_model.LogisticRegressionCV` is deprecated and will raise an error in + version 1.8. Either use a solver which supports the multinomial loss or wrap the + estimator in a :class:`sklearn.multiclass.OneVsRestClassifier` to keep applying a + one-versus-rest scheme. + By :user:`Jérémie du Boisberranger `. diff --git a/sklearn/ensemble/tests/test_voting.py b/sklearn/ensemble/tests/test_voting.py index b9a4b4a55bebd..fc3fc82c2bee8 100644 --- a/sklearn/ensemble/tests/test_voting.py +++ b/sklearn/ensemble/tests/test_voting.py @@ -114,7 +114,7 @@ def test_notfitted(): def test_majority_label_iris(global_random_seed): """Check classification by majority label on dataset iris.""" - clf1 = LogisticRegression(solver="liblinear", random_state=global_random_seed) + clf1 = LogisticRegression(random_state=global_random_seed) clf2 = RandomForestClassifier(n_estimators=10, random_state=global_random_seed) clf3 = GaussianNB() eclf = VotingClassifier( @@ -127,12 +127,12 @@ def test_majority_label_iris(global_random_seed): def test_tie_situation(): """Check voting classifier selects smaller class label in tie situation.""" - clf1 = LogisticRegression(random_state=123, solver="liblinear") + clf1 = LogisticRegression(random_state=123) clf2 = RandomForestClassifier(random_state=123) eclf = VotingClassifier(estimators=[("lr", clf1), ("rf", clf2)], voting="hard") - assert clf1.fit(X, y).predict(X)[73] == 2 - assert clf2.fit(X, y).predict(X)[73] == 1 - assert eclf.fit(X, y).predict(X)[73] == 1 + assert clf1.fit(X, y).predict(X)[52] == 2 + assert clf2.fit(X, y).predict(X)[52] == 1 + assert eclf.fit(X, y).predict(X)[52] == 1 def test_weights_iris(global_random_seed): diff --git a/sklearn/linear_model/_logistic.py b/sklearn/linear_model/_logistic.py index e4e12d1435d41..94e180ba54238 100644 --- a/sklearn/linear_model/_logistic.py +++ b/sklearn/linear_model/_logistic.py @@ -501,6 +501,15 @@ def _logistic_regression_path( w0 = sol.solve(X=X, y=target, sample_weight=sample_weight) n_iter_i = sol.iteration elif solver == "liblinear": + if len(classes) > 2: + warnings.warn( + "Using the 'liblinear' solver for multiclass classification is " + "deprecated. An error will be raised in 1.8. Either use another " + "solver which supports the multinomial loss or wrap the estimator " + "in a OneVsRestClassifier to keep applying a one-versus-rest " + "scheme.", + FutureWarning, + ) ( coef_, intercept_, @@ -931,7 +940,7 @@ class LogisticRegression(LinearClassifierMixin, SparseCoefMixin, BaseEstimator): 'lbfgs' 'l2', None yes 'liblinear' 'l1', 'l2' no 'newton-cg' 'l2', None yes - 'newton-cholesky' 'l2', None no + 'newton-cholesky' 'l2', None yes 'sag' 'l2', None yes 'saga' 'elasticnet', 'l1', 'l2', None yes ================= ============================== ====================== @@ -1238,7 +1247,7 @@ def fit(self, X, y, sample_weight=None): check_classification_targets(y) self.classes_ = np.unique(y) - # TODO(1.7) remove multi_class + # TODO(1.8) remove multi_class multi_class = self.multi_class if self.multi_class == "multinomial" and len(self.classes_) == 2: warnings.warn( @@ -1274,6 +1283,15 @@ def fit(self, X, y, sample_weight=None): multi_class = _check_multi_class(multi_class, solver, len(self.classes_)) if solver == "liblinear": + if len(self.classes_) > 2: + warnings.warn( + "Using the 'liblinear' solver for multiclass classification is " + "deprecated. An error will be raised in 1.8. Either use another " + "solver which supports the multinomial loss or wrap the estimator " + "in a OneVsRestClassifier to keep applying a one-versus-rest " + "scheme.", + FutureWarning, + ) if effective_n_jobs(self.n_jobs) != 1: warnings.warn( "'n_jobs' > 1 does not have any effect when" @@ -1568,7 +1586,7 @@ class LogisticRegressionCV(LogisticRegression, LinearClassifierMixin, BaseEstima 'lbfgs' 'l2' yes 'liblinear' 'l1', 'l2' no 'newton-cg' 'l2' yes - 'newton-cholesky' 'l2', no + 'newton-cholesky' 'l2', yes 'sag' 'l2', yes 'saga' 'elasticnet', 'l1', 'l2' yes ================= ============================== ====================== @@ -1900,7 +1918,7 @@ def fit(self, X, y, sample_weight=None, **params): classes = self.classes_ = label_encoder.classes_ encoded_labels = label_encoder.transform(label_encoder.classes_) - # TODO(1.7) remove multi_class + # TODO(1.8) remove multi_class multi_class = self.multi_class if self.multi_class == "multinomial" and len(self.classes_) == 2: warnings.warn( diff --git a/sklearn/linear_model/tests/test_logistic.py b/sklearn/linear_model/tests/test_logistic.py index b013487fac98b..bbb291facdaf9 100644 --- a/sklearn/linear_model/tests/test_logistic.py +++ b/sklearn/linear_model/tests/test_logistic.py @@ -129,8 +129,7 @@ def __call__(self, model, X, y, sample_weight=None): @skip_if_no_parallel def test_lr_liblinear_warning(): - n_samples, n_features = iris.data.shape - target = iris.target_names[iris.target] + X, y = make_classification(random_state=0) lr = LogisticRegression(solver="liblinear", n_jobs=2) warning_message = ( @@ -139,7 +138,7 @@ def test_lr_liblinear_warning(): " = 2." ) with pytest.warns(UserWarning, match=warning_message): - lr.fit(iris.data, target) + lr.fit(X, y) @pytest.mark.parametrize("csr_container", CSR_CONTAINERS) @@ -148,8 +147,11 @@ def test_predict_3_classes(csr_container): check_predictions(LogisticRegression(C=10), csr_container(X), Y2) -# TODO(1.7): remove filterwarnings after the deprecation of multi_class +# TODO(1.8): remove filterwarnings after the deprecation of multi_class @pytest.mark.filterwarnings("ignore:.*'multi_class' was deprecated.*:FutureWarning") +@pytest.mark.filterwarnings( + "ignore:.*'liblinear' solver for multiclass classification is deprecated.*" +) @pytest.mark.parametrize( "clf", [ @@ -197,7 +199,7 @@ def test_predict_iris(clf): assert np.mean(pred == target) > 0.95 -# TODO(1.7): remove filterwarnings after the deprecation of multi_class +# TODO(1.8): remove filterwarnings after the deprecation of multi_class @pytest.mark.filterwarnings("ignore:.*'multi_class' was deprecated.*:FutureWarning") @pytest.mark.parametrize("LR", [LogisticRegression, LogisticRegressionCV]) def test_check_solver_option(LR): @@ -249,7 +251,7 @@ def test_elasticnet_l1_ratio_err_helpful(LR): model.fit(np.array([[1, 2], [3, 4]]), np.array([0, 1])) -# TODO(1.7): remove whole test with deprecation of multi_class +# TODO(1.8): remove whole test with deprecation of multi_class @pytest.mark.filterwarnings("ignore:.*'multi_class' was deprecated.*:FutureWarning") @pytest.mark.parametrize("solver", ["lbfgs", "newton-cg", "sag", "saga"]) def test_multinomial_binary(solver): @@ -274,7 +276,7 @@ def test_multinomial_binary(solver): assert np.mean(pred == target) > 0.9 -# TODO(1.7): remove filterwarnings after the deprecation of multi_class +# TODO(1.8): remove filterwarnings after the deprecation of multi_class # Maybe even remove this whole test as correctness of multinomial loss is tested # elsewhere. @pytest.mark.filterwarnings("ignore:.*'multi_class' was deprecated.*:FutureWarning") @@ -614,7 +616,7 @@ def test_logistic_cv_sparse(csr_container): assert clfs.C_ == clf.C_ -# TODO(1.7): remove filterwarnings after the deprecation of multi_class +# TODO(1.8): remove filterwarnings after the deprecation of multi_class # Best remove this whole test. @pytest.mark.filterwarnings("ignore:.*'multi_class' was deprecated.*:FutureWarning") def test_ovr_multinomial_iris(): @@ -700,7 +702,7 @@ def test_logistic_regression_solvers(): ) -# TODO(1.7): remove filterwarnings after the deprecation of multi_class +# TODO(1.8): remove filterwarnings after the deprecation of multi_class @pytest.mark.filterwarnings("ignore:.*'multi_class' was deprecated.*:FutureWarning") @pytest.mark.parametrize("fit_intercept", [False, True]) def test_logistic_regression_solvers_multiclass(fit_intercept): @@ -1301,7 +1303,7 @@ def test_logreg_predict_proba_multinomial(): assert clf_wrong_loss > clf_multi_loss -# TODO(1.7): remove filterwarnings after the deprecation of multi_class +# TODO(1.8): remove filterwarnings after the deprecation of multi_class @pytest.mark.filterwarnings("ignore:.*'multi_class' was deprecated.*:FutureWarning") @pytest.mark.parametrize("max_iter", np.arange(1, 5)) @pytest.mark.parametrize("multi_class", ["ovr", "multinomial"]) @@ -1345,8 +1347,11 @@ def test_max_iter(max_iter, multi_class, solver, message): assert lr.n_iter_[0] == max_iter -# TODO(1.7): remove filterwarnings after the deprecation of multi_class +# TODO(1.8): remove filterwarnings after the deprecation of multi_class @pytest.mark.filterwarnings("ignore:.*'multi_class' was deprecated.*:FutureWarning") +@pytest.mark.filterwarnings( + "ignore:.*'liblinear' solver for multiclass classification is deprecated.*" +) @pytest.mark.parametrize("solver", SOLVERS) def test_n_iter(solver): # Test that self.n_iter_ has the correct format. @@ -1478,7 +1483,7 @@ def test_saga_vs_liblinear(csr_container): assert_array_almost_equal(saga.coef_, liblinear.coef_, 3) -# TODO(1.7): remove filterwarnings after the deprecation of multi_class +# TODO(1.8): remove filterwarnings after the deprecation of multi_class @pytest.mark.filterwarnings("ignore:.*'multi_class' was deprecated.*:FutureWarning") @pytest.mark.parametrize("multi_class", ["ovr", "multinomial"]) @pytest.mark.parametrize( @@ -1738,7 +1743,7 @@ def test_LogisticRegressionCV_GridSearchCV_elastic_net(n_classes): assert gs.best_params_["C"] == lrcv.C_[0] -# TODO(1.7): remove filterwarnings after the deprecation of multi_class +# TODO(1.8): remove filterwarnings after the deprecation of multi_class # Maybe remove whole test after removal of the deprecated multi_class. @pytest.mark.filterwarnings("ignore:.*'multi_class' was deprecated.*:FutureWarning") def test_LogisticRegressionCV_GridSearchCV_elastic_net_ovr(): @@ -1786,7 +1791,7 @@ def test_LogisticRegressionCV_GridSearchCV_elastic_net_ovr(): assert (lrcv.predict(X_test) == gs.predict(X_test)).mean() >= 0.8 -# TODO(1.7): remove filterwarnings after the deprecation of multi_class +# TODO(1.8): remove filterwarnings after the deprecation of multi_class @pytest.mark.filterwarnings("ignore:.*'multi_class' was deprecated.*:FutureWarning") @pytest.mark.parametrize("penalty", ("l2", "elasticnet")) @pytest.mark.parametrize("multi_class", ("ovr", "multinomial", "auto")) @@ -1825,7 +1830,7 @@ def test_LogisticRegressionCV_no_refit(penalty, multi_class): assert lrcv.coef_.shape == (n_classes, n_features) -# TODO(1.7): remove filterwarnings after the deprecation of multi_class +# TODO(1.8): remove filterwarnings after the deprecation of multi_class # Remove multi_class an change first element of the expected n_iter_.shape from # n_classes to 1 (according to the docstring). @pytest.mark.filterwarnings("ignore:.*'multi_class' was deprecated.*:FutureWarning") @@ -1955,8 +1960,11 @@ def test_logistic_regression_path_coefs_multinomial(): assert_array_almost_equal(coefs[1], coefs[2], decimal=1) -# TODO(1.7): remove filterwarnings after the deprecation of multi_class +# TODO(1.8): remove filterwarnings after the deprecation of multi_class @pytest.mark.filterwarnings("ignore:.*'multi_class' was deprecated.*:FutureWarning") +@pytest.mark.filterwarnings( + "ignore:.*'liblinear' solver for multiclass classification is deprecated.*" +) @pytest.mark.parametrize( "est", [ @@ -2126,7 +2134,7 @@ def test_scores_attribute_layout_elasticnet(): assert avg_scores_lrcv[i, j] == pytest.approx(avg_score_lr) -# TODO(1.7): remove filterwarnings after the deprecation of multi_class +# TODO(1.8): remove filterwarnings after the deprecation of multi_class @pytest.mark.filterwarnings("ignore:.*'multi_class' was deprecated.*:FutureWarning") @pytest.mark.parametrize("solver", ["lbfgs", "newton-cg", "newton-cholesky"]) @pytest.mark.parametrize("fit_intercept", [False, True]) @@ -2171,7 +2179,7 @@ def test_multinomial_identifiability_on_iris(solver, fit_intercept): assert clf.intercept_.sum(axis=0) == pytest.approx(0, abs=1e-11) -# TODO(1.7): remove filterwarnings after the deprecation of multi_class +# TODO(1.8): remove filterwarnings after the deprecation of multi_class @pytest.mark.filterwarnings("ignore:.*'multi_class' was deprecated.*:FutureWarning") @pytest.mark.parametrize("multi_class", ["ovr", "multinomial", "auto"]) @pytest.mark.parametrize("class_weight", [{0: 1.0, 1: 10.0, 2: 1.0}, "balanced"]) @@ -2349,7 +2357,7 @@ def test_passing_params_without_enabling_metadata_routing(): lr_cv.score(X, y, **params) -# TODO(1.7): remove +# TODO(1.8): remove def test_multi_class_deprecated(): """Check `multi_class` parameter deprecated.""" X, y = make_classification(n_classes=3, n_samples=50, n_informative=6) @@ -2414,3 +2422,18 @@ def test_newton_cholesky_fallback_to_lbfgs(global_random_seed): n_iter_nc_limited = lr_nc_limited.n_iter_[0] assert n_iter_nc_limited == lr_nc_limited.max_iter - 1 + + +# TODO(1.8): check for an error instead +@pytest.mark.parametrize("Estimator", [LogisticRegression, LogisticRegressionCV]) +def test_liblinear_multiclass_warning(Estimator): + """Check that liblinear warns on multiclass problems.""" + msg = ( + "Using the 'liblinear' solver for multiclass classification is " + "deprecated. An error will be raised in 1.8. Either use another " + "solver which supports the multinomial loss or wrap the estimator " + "in a OneVsRestClassifier to keep applying a one-versus-rest " + "scheme." + ) + with pytest.warns(FutureWarning, match=msg): + Estimator(solver="liblinear").fit(iris.data, iris.target) diff --git a/sklearn/metrics/_ranking.py b/sklearn/metrics/_ranking.py index 273fbe5f242bb..560fd81076914 100644 --- a/sklearn/metrics/_ranking.py +++ b/sklearn/metrics/_ranking.py @@ -622,7 +622,7 @@ class scores must correspond to the order of ``labels``, >>> from sklearn.linear_model import LogisticRegression >>> from sklearn.metrics import roc_auc_score >>> X, y = load_breast_cancer(return_X_y=True) - >>> clf = LogisticRegression(solver="liblinear", random_state=0).fit(X, y) + >>> clf = LogisticRegression(solver="newton-cholesky", random_state=0).fit(X, y) >>> roc_auc_score(y, clf.predict_proba(X)[:, 1]) 0.99... >>> roc_auc_score(y, clf.decision_function(X)) @@ -632,7 +632,7 @@ class scores must correspond to the order of ``labels``, >>> from sklearn.datasets import load_iris >>> X, y = load_iris(return_X_y=True) - >>> clf = LogisticRegression(solver="liblinear").fit(X, y) + >>> clf = LogisticRegression(solver="newton-cholesky").fit(X, y) >>> roc_auc_score(y, clf.predict_proba(X), multi_class='ovr') 0.99... @@ -649,7 +649,7 @@ class scores must correspond to the order of ``labels``, >>> # extract the positive columns for each output >>> y_score = np.transpose([score[:, 1] for score in y_score]) >>> roc_auc_score(y, y_score, average=None) - array([0.82..., 0.86..., 0.94..., 0.85... , 0.94...]) + array([0.82..., 0.85..., 0.93..., 0.86..., 0.94...]) >>> from sklearn.linear_model import RidgeClassifierCV >>> clf = RidgeClassifierCV().fit(X, y) >>> roc_auc_score(y, clf.decision_function(X), average=None) diff --git a/sklearn/model_selection/tests/test_validation.py b/sklearn/model_selection/tests/test_validation.py index a34257679b50f..c20131b8d3f38 100644 --- a/sklearn/model_selection/tests/test_validation.py +++ b/sklearn/model_selection/tests/test_validation.py @@ -982,16 +982,12 @@ def split(self, X, y=None, groups=None): def test_cross_val_predict_decision_function_shape(): X, y = make_classification(n_classes=2, n_samples=50, random_state=0) - preds = cross_val_predict( - LogisticRegression(solver="liblinear"), X, y, method="decision_function" - ) + preds = cross_val_predict(LogisticRegression(), X, y, method="decision_function") assert preds.shape == (50,) X, y = load_iris(return_X_y=True) - preds = cross_val_predict( - LogisticRegression(solver="liblinear"), X, y, method="decision_function" - ) + preds = cross_val_predict(LogisticRegression(), X, y, method="decision_function") assert preds.shape == (150, 3) # This specifically tests imbalanced splits for binary @@ -1034,32 +1030,24 @@ def test_cross_val_predict_decision_function_shape(): def test_cross_val_predict_predict_proba_shape(): X, y = make_classification(n_classes=2, n_samples=50, random_state=0) - preds = cross_val_predict( - LogisticRegression(solver="liblinear"), X, y, method="predict_proba" - ) + preds = cross_val_predict(LogisticRegression(), X, y, method="predict_proba") assert preds.shape == (50, 2) X, y = load_iris(return_X_y=True) - preds = cross_val_predict( - LogisticRegression(solver="liblinear"), X, y, method="predict_proba" - ) + preds = cross_val_predict(LogisticRegression(), X, y, method="predict_proba") assert preds.shape == (150, 3) def test_cross_val_predict_predict_log_proba_shape(): X, y = make_classification(n_classes=2, n_samples=50, random_state=0) - preds = cross_val_predict( - LogisticRegression(solver="liblinear"), X, y, method="predict_log_proba" - ) + preds = cross_val_predict(LogisticRegression(), X, y, method="predict_log_proba") assert preds.shape == (50, 2) X, y = load_iris(return_X_y=True) - preds = cross_val_predict( - LogisticRegression(solver="liblinear"), X, y, method="predict_log_proba" - ) + preds = cross_val_predict(LogisticRegression(), X, y, method="predict_log_proba") assert preds.shape == (150, 3) @@ -1097,13 +1085,13 @@ def test_cross_val_predict_input_types(coo_container): # test with X and y as list and non empty method predictions = cross_val_predict( - LogisticRegression(solver="liblinear"), + LogisticRegression(), X.tolist(), y.tolist(), method="decision_function", ) predictions = cross_val_predict( - LogisticRegression(solver="liblinear"), + LogisticRegression(), X, y.tolist(), method="decision_function", @@ -1146,7 +1134,7 @@ def test_cross_val_predict_unbalanced(): ) # Change the first sample to a new class y[0] = 2 - clf = LogisticRegression(random_state=1, solver="liblinear") + clf = LogisticRegression(random_state=1) cv = StratifiedKFold(n_splits=2) train, test = list(cv.split(X, y)) yhat_proba = cross_val_predict(clf, X, y, cv=cv, method="predict_proba") @@ -1885,10 +1873,8 @@ def check_cross_val_predict_with_method_multiclass(est): def test_cross_val_predict_with_method(): - check_cross_val_predict_with_method_binary(LogisticRegression(solver="liblinear")) - check_cross_val_predict_with_method_multiclass( - LogisticRegression(solver="liblinear") - ) + check_cross_val_predict_with_method_binary(LogisticRegression()) + check_cross_val_predict_with_method_multiclass(LogisticRegression()) def test_cross_val_predict_method_checking(): @@ -1906,9 +1892,7 @@ def test_gridsearchcv_cross_val_predict_with_method(): iris = load_iris() X, y = iris.data, iris.target X, y = shuffle(X, y, random_state=0) - est = GridSearchCV( - LogisticRegression(random_state=42, solver="liblinear"), {"C": [0.1, 1]}, cv=2 - ) + est = GridSearchCV(LogisticRegression(random_state=42), {"C": [0.1, 1]}, cv=2) for method in ["decision_function", "predict_proba", "predict_log_proba"]: check_cross_val_predict_multiclass(est, X, y, method) @@ -1962,7 +1946,7 @@ def test_cross_val_predict_with_method_rare_class(): rng = np.random.RandomState(0) X = rng.normal(0, 1, size=(14, 10)) y = np.array([0, 1, 2, 0, 1, 2, 0, 1, 2, 0, 1, 2, 0, 3]) - est = LogisticRegression(solver="liblinear") + est = LogisticRegression() for method in ["predict_proba", "predict_log_proba", "decision_function"]: with warnings.catch_warnings(): # Suppress warning about too few examples of a class @@ -2019,7 +2003,7 @@ def test_cross_val_predict_class_subset(): methods = ["decision_function", "predict_proba", "predict_log_proba"] for method in methods: - est = LogisticRegression(solver="liblinear") + est = LogisticRegression() # Test with n_splits=3 predictions = cross_val_predict(est, X, y, method=method, cv=kfold3) diff --git a/sklearn/svm/tests/test_bounds.py b/sklearn/svm/tests/test_bounds.py index ecf88dde42aa0..af7e8cfb1159d 100644 --- a/sklearn/svm/tests/test_bounds.py +++ b/sklearn/svm/tests/test_bounds.py @@ -14,6 +14,11 @@ Y2 = [2, 1, 0, 0] +# TODO(1.8): remove filterwarnings after the deprecation of liblinear multiclass +# and maybe remove LogisticRegression from this test +@pytest.mark.filterwarnings( + "ignore:.*'liblinear' solver for multiclass classification is deprecated.*" +) @pytest.mark.parametrize("X_container", CSR_CONTAINERS + [np.array]) @pytest.mark.parametrize("loss", ["squared_hinge", "log"]) @pytest.mark.parametrize("Y_label", ["two-classes", "multi-class"]) diff --git a/sklearn/tests/test_multioutput.py b/sklearn/tests/test_multioutput.py index c5bff07573337..e8127b805a999 100644 --- a/sklearn/tests/test_multioutput.py +++ b/sklearn/tests/test_multioutput.py @@ -368,9 +368,7 @@ def test_multiclass_multioutput_estimator_predict_proba(): Y = np.concatenate([y1, y2], axis=1) - clf = MultiOutputClassifier( - LogisticRegression(solver="liblinear", random_state=seed) - ) + clf = MultiOutputClassifier(LogisticRegression(random_state=seed)) clf.fit(X, Y) @@ -378,20 +376,20 @@ def test_multiclass_multioutput_estimator_predict_proba(): y_actual = [ np.array( [ - [0.23481764, 0.76518236], - [0.67196072, 0.32803928], - [0.54681448, 0.45318552], - [0.34883923, 0.65116077], - [0.73687069, 0.26312931], + [0.31525135, 0.68474865], + [0.81004803, 0.18995197], + [0.65664086, 0.34335914], + [0.38584929, 0.61415071], + [0.83234285, 0.16765715], ] ), np.array( [ - [0.5171785, 0.23878628, 0.24403522], - [0.22141451, 0.64102704, 0.13755846], - [0.16751315, 0.18256843, 0.64991843], - [0.27357372, 0.55201592, 0.17441036], - [0.65745193, 0.26062899, 0.08191907], + [0.65759215, 0.20976588, 0.13264197], + [0.14996984, 0.82591444, 0.02411571], + [0.13111876, 0.13294966, 0.73593158], + [0.24663053, 0.65860244, 0.09476703], + [0.81458885, 0.1728158, 0.01259535], ] ), ] From 2d66fd7d63cd9b97540d204b17a1a804d6a3d28f Mon Sep 17 00:00:00 2001 From: Olivier Grisel Date: Mon, 5 May 2025 14:01:39 +0200 Subject: [PATCH 112/182] Fix BLAS_Order.RowMajor import and similar in test_cython_blas with Cython 3.1 (#31301) --- sklearn/utils/tests/test_cython_blas.py | 38 ++++++++++++++++++------- 1 file changed, 27 insertions(+), 11 deletions(-) diff --git a/sklearn/utils/tests/test_cython_blas.py b/sklearn/utils/tests/test_cython_blas.py index e57bfc3ec5a9c..e221c3fea4e02 100644 --- a/sklearn/utils/tests/test_cython_blas.py +++ b/sklearn/utils/tests/test_cython_blas.py @@ -2,10 +2,8 @@ import pytest from sklearn.utils._cython_blas import ( - ColMajor, - NoTrans, - RowMajor, - Trans, + BLAS_Order, + BLAS_Trans, _asum_memview, _axpy_memview, _copy_memview, @@ -30,7 +28,7 @@ def _numpy_to_cython(dtype): RTOL = {np.float32: 1e-6, np.float64: 1e-12} -ORDER = {RowMajor: "C", ColMajor: "F"} +ORDER = {BLAS_Order.RowMajor: "C", BLAS_Order.ColMajor: "F"} def _no_op(x): @@ -166,9 +164,15 @@ def test_rot(dtype): @pytest.mark.parametrize("dtype", [np.float32, np.float64]) @pytest.mark.parametrize( - "opA, transA", [(_no_op, NoTrans), (np.transpose, Trans)], ids=["NoTrans", "Trans"] + "opA, transA", + [(_no_op, BLAS_Trans.NoTrans), (np.transpose, BLAS_Trans.Trans)], + ids=["NoTrans", "Trans"], +) +@pytest.mark.parametrize( + "order", + [BLAS_Order.RowMajor, BLAS_Order.ColMajor], + ids=["RowMajor", "ColMajor"], ) -@pytest.mark.parametrize("order", [RowMajor, ColMajor], ids=["RowMajor", "ColMajor"]) def test_gemv(dtype, opA, transA, order): gemv = _gemv_memview[_numpy_to_cython(dtype)] @@ -187,7 +191,11 @@ def test_gemv(dtype, opA, transA, order): @pytest.mark.parametrize("dtype", [np.float32, np.float64]) -@pytest.mark.parametrize("order", [RowMajor, ColMajor], ids=["RowMajor", "ColMajor"]) +@pytest.mark.parametrize( + "order", + [BLAS_Order.RowMajor, BLAS_Order.ColMajor], + ids=["BLAS_Order.RowMajor", "BLAS_Order.ColMajor"], +) def test_ger(dtype, order): ger = _ger_memview[_numpy_to_cython(dtype)] @@ -207,12 +215,20 @@ def test_ger(dtype, order): @pytest.mark.parametrize("dtype", [np.float32, np.float64]) @pytest.mark.parametrize( - "opB, transB", [(_no_op, NoTrans), (np.transpose, Trans)], ids=["NoTrans", "Trans"] + "opB, transB", + [(_no_op, BLAS_Trans.NoTrans), (np.transpose, BLAS_Trans.Trans)], + ids=["NoTrans", "Trans"], +) +@pytest.mark.parametrize( + "opA, transA", + [(_no_op, BLAS_Trans.NoTrans), (np.transpose, BLAS_Trans.Trans)], + ids=["NoTrans", "Trans"], ) @pytest.mark.parametrize( - "opA, transA", [(_no_op, NoTrans), (np.transpose, Trans)], ids=["NoTrans", "Trans"] + "order", + [BLAS_Order.RowMajor, BLAS_Order.ColMajor], + ids=["BLAS_Order.RowMajor", "BLAS_Order.ColMajor"], ) -@pytest.mark.parametrize("order", [RowMajor, ColMajor], ids=["RowMajor", "ColMajor"]) def test_gemm(dtype, opA, transA, opB, transB, order): gemm = _gemm_memview[_numpy_to_cython(dtype)] From 37bbeaa3466d92230fa84c9549d05b12cd93b44b Mon Sep 17 00:00:00 2001 From: Lucy Liu Date: Mon, 5 May 2025 22:25:46 +1000 Subject: [PATCH 113/182] COSMIT Use `get_namespace_and_device` in `multilabel_confusion_matrix` (#31287) --- sklearn/metrics/_classification.py | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/sklearn/metrics/_classification.py b/sklearn/metrics/_classification.py index 13f2f5dc89208..f7898b2018e52 100644 --- a/sklearn/metrics/_classification.py +++ b/sklearn/metrics/_classification.py @@ -36,7 +36,6 @@ _searchsorted, _tolist, _union1d, - device, get_namespace, get_namespace_and_device, xpx, @@ -655,8 +654,7 @@ def multilabel_confusion_matrix( [1, 2]]]) """ y_true, y_pred = attach_unique(y_true, y_pred) - xp, _ = get_namespace(y_true, y_pred) - device_ = device(y_true, y_pred) + xp, _, device_ = get_namespace_and_device(y_true, y_pred) y_type, y_true, y_pred = _check_targets(y_true, y_pred) if sample_weight is not None: sample_weight = column_or_1d(sample_weight, device=device_) From c28588866c75e27c1ebe0c99370e3363c3fd1e23 Mon Sep 17 00:00:00 2001 From: Lucy Liu Date: Mon, 5 May 2025 22:28:23 +1000 Subject: [PATCH 114/182] DOC Fix return type for `d2_tweedie_score` (#31285) --- sklearn/metrics/_regression.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/sklearn/metrics/_regression.py b/sklearn/metrics/_regression.py index 9be9f1d954fcc..4c46346d63d92 100644 --- a/sklearn/metrics/_regression.py +++ b/sklearn/metrics/_regression.py @@ -1622,7 +1622,7 @@ def d2_tweedie_score(y_true, y_pred, *, sample_weight=None, power=0): Returns ------- - z : float or ndarray of floats + z : float The D^2 score. Notes From c6d6170da2a5addd1053ea05f8c1a5595c98e5a1 Mon Sep 17 00:00:00 2001 From: scikit-learn-bot Date: Mon, 5 May 2025 14:55:11 +0200 Subject: [PATCH 115/182] :lock: :robot: CI Update lock files for free-threaded CI build(s) :lock: :robot: (#31297) Co-authored-by: Lock file bot Co-authored-by: Olivier Grisel --- .../azure/pylatest_free_threaded_linux-64_conda.lock | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/build_tools/azure/pylatest_free_threaded_linux-64_conda.lock b/build_tools/azure/pylatest_free_threaded_linux-64_conda.lock index b0dd205cc6976..39b5e6021d170 100644 --- a/build_tools/azure/pylatest_free_threaded_linux-64_conda.lock +++ b/build_tools/azure/pylatest_free_threaded_linux-64_conda.lock @@ -18,7 +18,7 @@ https://conda.anaconda.org/conda-forge/linux-64/liblzma-5.8.1-hb9d3cd8_0.conda#0 https://conda.anaconda.org/conda-forge/linux-64/libstdcxx-14.2.0-h8f9b012_2.conda#a78c856b6dc6bf4ea8daeb9beaaa3fb0 https://conda.anaconda.org/conda-forge/linux-64/libzlib-1.3.1-hb9d3cd8_2.conda#edb0dca6bc32e4f4789199455a1dbeb8 https://conda.anaconda.org/conda-forge/linux-64/ncurses-6.5-h2d0b736_3.conda#47e340acb35de30501a76c7c799c41d7 -https://conda.anaconda.org/conda-forge/linux-64/openssl-3.5.0-h7b32b05_0.conda#bb539841f2a3fde210f387d00ed4bb9d +https://conda.anaconda.org/conda-forge/linux-64/openssl-3.5.0-h7b32b05_1.conda#de356753cfdbffcde5bb1e86e3aa6cd0 https://conda.anaconda.org/conda-forge/linux-64/bzip2-1.0.8-h4bc722e_7.conda#62ee74e96c5ebb0af99386de58cf9553 https://conda.anaconda.org/conda-forge/linux-64/libgfortran-14.2.0-h69a702a_2.conda#fb54c4ea68b460c278d26eea89cfbcc3 https://conda.anaconda.org/conda-forge/linux-64/libmpdec-4.0.0-h4bc722e_0.conda#aeb98fdeb2e8f25d43ef71fbacbeec80 @@ -39,17 +39,17 @@ https://conda.anaconda.org/conda-forge/noarch/execnet-2.1.1-pyhd8ed1ab_1.conda#a https://conda.anaconda.org/conda-forge/noarch/iniconfig-2.0.0-pyhd8ed1ab_1.conda#6837f3eff7dcea42ecd714ce1ac2b108 https://conda.anaconda.org/conda-forge/linux-64/libblas-3.9.0-31_h59b9bed_openblas.conda#728dbebd0f7a20337218beacffd37916 https://conda.anaconda.org/conda-forge/linux-64/libhiredis-1.0.2-h2cc385e_0.tar.bz2#b34907d3a81a3cd8095ee83d174c074a +https://conda.anaconda.org/conda-forge/noarch/meson-1.8.0-pyh29332c3_0.conda#8e25221b702272394b86b0f4d7217f77 https://conda.anaconda.org/conda-forge/noarch/packaging-25.0-pyh29332c3_1.conda#58335b26c38bf4a20f399384c33cbcf9 -https://conda.anaconda.org/conda-forge/noarch/pip-25.1-pyh145f28c_0.conda#4627e20c39e7340febed674c3bf05b16 +https://conda.anaconda.org/conda-forge/noarch/pip-25.1.1-pyh145f28c_0.conda#01384ff1639c6330a0924791413b8714 https://conda.anaconda.org/conda-forge/noarch/pluggy-1.5.0-pyhd8ed1ab_1.conda#e9dcbce5f45f9ee500e728ae58b605b6 -https://conda.anaconda.org/conda-forge/noarch/setuptools-79.0.1-pyhff2d567_0.conda#fa6669cc21abd4b7b6c5393b7bc71914 +https://conda.anaconda.org/conda-forge/noarch/setuptools-80.1.0-pyhff2d567_0.conda#f6f72d0837c79eaec77661be43e8a691 https://conda.anaconda.org/conda-forge/noarch/threadpoolctl-3.6.0-pyhecae5ae_0.conda#9d64911b31d57ca443e9f1e36b04385f https://conda.anaconda.org/conda-forge/noarch/tomli-2.2.1-pyhd8ed1ab_1.conda#ac944244f1fed2eb49bae07193ae8215 -https://conda.anaconda.org/conda-forge/linux-64/ccache-4.11.2-hd714d17_0.conda#35ae7ce74089ab05fdb1cb9746c0fbe4 -https://conda.anaconda.org/conda-forge/noarch/joblib-1.4.2-pyhd8ed1ab_1.conda#bf8243ee348f3a10a14ed0cae323e0c1 +https://conda.anaconda.org/conda-forge/linux-64/ccache-4.11.3-h80c52d3_0.conda#eb517c6a2b960c3ccb6f1db1005f063a +https://conda.anaconda.org/conda-forge/noarch/joblib-1.5.0-pyhd8ed1ab_0.conda#3d7257f0a61c9aa4ffa3e324a887416b https://conda.anaconda.org/conda-forge/linux-64/libcblas-3.9.0-31_he106b2a_openblas.conda#abb32c727da370c481a1c206f5159ce9 https://conda.anaconda.org/conda-forge/linux-64/liblapack-3.9.0-31_h7ac8fdf_openblas.conda#452b98eafe050ecff932f0ec832dd03f -https://conda.anaconda.org/conda-forge/noarch/meson-1.7.1-pyhd8ed1ab_0.conda#90018ee73b8741268027421ceac2809a https://conda.anaconda.org/conda-forge/noarch/pyproject-metadata-0.9.1-pyhd8ed1ab_0.conda#22ae7c6ea81e0c8661ef32168dda929b https://conda.anaconda.org/conda-forge/noarch/pytest-8.3.5-pyhd8ed1ab_0.conda#c3c9316209dec74a705a36797970c6be https://conda.anaconda.org/conda-forge/noarch/python-freethreading-3.13.3-h92d6c8b_1.conda#4fa25290aec662a01642ba4b3c0ff5c1 From 4f614da7c28c54b76d4d8792cabf618e5e7a14f1 Mon Sep 17 00:00:00 2001 From: scikit-learn-bot Date: Mon, 5 May 2025 14:57:26 +0200 Subject: [PATCH 116/182] :lock: :robot: CI Update lock files for scipy-dev CI build(s) :lock: :robot: (#31296) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Co-authored-by: Lock file bot Co-authored-by: Jérémie du Boisberranger --- .../azure/pylatest_pip_scipy_dev_linux-64_conda.lock | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/build_tools/azure/pylatest_pip_scipy_dev_linux-64_conda.lock b/build_tools/azure/pylatest_pip_scipy_dev_linux-64_conda.lock index 398ccd2132b71..068aee47c99a3 100644 --- a/build_tools/azure/pylatest_pip_scipy_dev_linux-64_conda.lock +++ b/build_tools/azure/pylatest_pip_scipy_dev_linux-64_conda.lock @@ -6,7 +6,7 @@ https://repo.anaconda.com/pkgs/main/linux-64/_libgcc_mutex-0.1-main.conda#c3473f https://repo.anaconda.com/pkgs/main/linux-64/ca-certificates-2025.2.25-h06a4308_0.conda#495015d24da8ad929e3ae2d18571016d https://repo.anaconda.com/pkgs/main/linux-64/ld_impl_linux-64-2.40-h12ee557_0.conda#ee672b5f635340734f58d618b7bca024 https://repo.anaconda.com/pkgs/main/linux-64/python_abi-3.13-0_cp313.conda#d4009c49dd2b54ffded7f1365b5f6505 -https://repo.anaconda.com/pkgs/main/noarch/tzdata-2025a-h04d1e81_0.conda#885caf42f821b98b3321dc4108511a3d +https://repo.anaconda.com/pkgs/main/noarch/tzdata-2025b-h04d1e81_0.conda#1d027393db3427ab22a02aa44a56f143 https://repo.anaconda.com/pkgs/main/linux-64/libgomp-11.2.0-h1234567_1.conda#b372c0eea9b60732fdae4b817a63c8cd https://repo.anaconda.com/pkgs/main/linux-64/libstdcxx-ng-11.2.0-h1234567_1.conda#57623d10a70e09e1d048c2b2b6f4e2dd https://repo.anaconda.com/pkgs/main/linux-64/_openmp_mutex-5.1-1_gnu.conda#71d281e9c2192cb3fa425655a8defb85 @@ -25,13 +25,13 @@ https://repo.anaconda.com/pkgs/main/linux-64/readline-8.2-h5eee18b_0.conda#be421 https://repo.anaconda.com/pkgs/main/linux-64/tk-8.6.14-h39e8969_0.conda#78dbc5e3c69143ebc037fc5d5b22e597 https://repo.anaconda.com/pkgs/main/linux-64/sqlite-3.45.3-h5eee18b_0.conda#acf93d6aceb74d6110e20b44cc45939e https://repo.anaconda.com/pkgs/main/linux-64/python-3.13.2-hf623796_100_cp313.conda#bf836f30ac4c16fd3d71c1aaa25da08c -https://repo.anaconda.com/pkgs/main/linux-64/setuptools-75.8.0-py313h06a4308_0.conda#45420d536cdd6c3f76b3ea1e4a7fbeac +https://repo.anaconda.com/pkgs/main/linux-64/setuptools-78.1.1-py313h06a4308_0.conda#8f8e1c1e3af9d2d371aaa0ee8316ae7c https://repo.anaconda.com/pkgs/main/linux-64/wheel-0.45.1-py313h06a4308_0.conda#29057e876eedce0e37c2388c138a19f9 -https://repo.anaconda.com/pkgs/main/linux-64/pip-25.0-py313h06a4308_0.conda#cbe254aa48f8c0f980a12976e7571e0e +https://repo.anaconda.com/pkgs/main/noarch/pip-25.1-pyhc872135_2.conda#2778327d2a700153fefe0e69438b18e1 # pip alabaster @ https://files.pythonhosted.org/packages/7e/b3/6b4067be973ae96ba0d615946e314c5ae35f9f993eca561b356540bb0c2b/alabaster-1.0.0-py3-none-any.whl#sha256=fc6786402dc3fcb2de3cabd5fe455a2db534b371124f1f21de8731783dec828b # pip babel @ https://files.pythonhosted.org/packages/b7/b8/3fe70c75fe32afc4bb507f75563d39bc5642255d1d94f1f23604725780bf/babel-2.17.0-py3-none-any.whl#sha256=4d0b53093fdfb4b21c92b5213dba5a1b23885afa8383709427046b21c366e5f2 -# pip certifi @ https://files.pythonhosted.org/packages/38/fc/bce832fd4fd99766c04d1ee0eead6b0ec6486fb100ae5e74c1d91292b982/certifi-2025.1.31-py3-none-any.whl#sha256=ca78db4565a652026a4db2bcdf68f2fb589ea80d0be70e03929ed730746b84fe -# pip charset-normalizer @ https://files.pythonhosted.org/packages/52/ed/b7f4f07de100bdb95c1756d3a4d17b90c1a3c53715c1a476f8738058e0fa/charset_normalizer-3.4.1-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl#sha256=955f8851919303c92343d2f66165294848d57e9bba6cf6e3625485a70a038d11 +# pip certifi @ https://files.pythonhosted.org/packages/4a/7e/3db2bd1b1f9e95f7cddca6d6e75e2f2bd9f51b1246e546d88addca0106bd/certifi-2025.4.26-py3-none-any.whl#sha256=30350364dfe371162649852c63336a15c70c6510c2ad5015b21c2345311805f3 +# pip charset-normalizer @ https://files.pythonhosted.org/packages/e2/28/ffc026b26f441fc67bd21ab7f03b313ab3fe46714a14b516f931abe1a2d8/charset_normalizer-3.4.2-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl#sha256=6c9379d65defcab82d07b2a9dfbfc2e95bc8fe0ebb1b176a3190230a3ef0e07c # pip coverage @ https://files.pythonhosted.org/packages/cb/74/2f8cc196643b15bc096d60e073691dadb3dca48418f08bc78dd6e899383e/coverage-7.8.0-cp313-cp313-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl#sha256=5aaeb00761f985007b38cf463b1d160a14a22c34eb3f6a39d9ad6fc27cb73008 # pip docutils @ https://files.pythonhosted.org/packages/8f/d7/9322c609343d929e75e7e5e6255e614fcc67572cfd083959cdef3b7aad79/docutils-0.21.2-py3-none-any.whl#sha256=dafca5b9e384f0e419294eb4d2ff9fa826435bf15f15b7bd45723e8ad76811b2 # pip execnet @ https://files.pythonhosted.org/packages/43/09/2aea36ff60d16dd8879bdb2f5b3ee0ba8d08cbbdcdfe870e695ce3784385/execnet-2.1.1-py3-none-any.whl#sha256=26dee51f1b80cebd6d0ca8e74dd8745419761d3bef34163928cbebbdc4749fdc @@ -39,7 +39,7 @@ https://repo.anaconda.com/pkgs/main/linux-64/pip-25.0-py313h06a4308_0.conda#cbe2 # pip imagesize @ https://files.pythonhosted.org/packages/ff/62/85c4c919272577931d407be5ba5d71c20f0b616d31a0befe0ae45bb79abd/imagesize-1.4.1-py2.py3-none-any.whl#sha256=0d8d18d08f840c19d0ee7ca1fd82490fdc3729b7ac93f49870406ddde8ef8d8b # pip iniconfig @ https://files.pythonhosted.org/packages/2c/e1/e6716421ea10d38022b952c159d5161ca1193197fb744506875fbb87ea7b/iniconfig-2.1.0-py3-none-any.whl#sha256=9deba5723312380e77435581c6bf4935c94cbfab9b1ed33ef8d238ea168eb760 # pip markupsafe @ https://files.pythonhosted.org/packages/0c/91/96cf928db8236f1bfab6ce15ad070dfdd02ed88261c2afafd4b43575e9e9/MarkupSafe-3.0.2-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl#sha256=15ab75ef81add55874e7ab7055e9c397312385bd9ced94920f2802310c930396 -# pip meson @ https://files.pythonhosted.org/packages/e5/2b/46bda4ef5a7ae4135dbfe27fc0368c44e5a349a897a54fdf2cedb8dcb66e/meson-1.7.2-py3-none-any.whl#sha256=82c6818dc81743c96de3a458f06175776ebfde4081195ea31ea6971838f25e38 +# pip meson @ https://files.pythonhosted.org/packages/df/d7/f1c8acf0e597d4d07532f519780ee6e11ba285a9b092f18706b4c9118331/meson-1.8.0-py3-none-any.whl#sha256=472b7b25da286447333d32872b82d1c6f1a34024fb8ee017d7308056c25fec1f # pip ninja @ https://files.pythonhosted.org/packages/eb/7a/455d2877fe6cf99886849c7f9755d897df32eaf3a0fba47b56e615f880f7/ninja-1.11.1.4-py3-none-manylinux_2_12_x86_64.manylinux2010_x86_64.whl#sha256=096487995473320de7f65d622c3f1d16c3ad174797602218ca8c967f51ec38a0 # pip packaging @ https://files.pythonhosted.org/packages/20/12/38679034af332785aac8774540895e234f4d07f7545804097de4b666afd8/packaging-25.0-py3-none-any.whl#sha256=29572ef2b1f17581046b3a2227d5c611fb25ec70ca1ba8554b24b0e69331a484 # pip platformdirs @ https://files.pythonhosted.org/packages/6d/45/59578566b3275b8fd9157885918fcd0c4d74162928a5310926887b856a51/platformdirs-4.3.7-py3-none-any.whl#sha256=a03875334331946f13c549dbd8f4bac7a13a50a895a0eb1e8c6a8ace80d40a94 From 6c1d33fd69bc36ac8580ba4154e81ee1d8ac7b19 Mon Sep 17 00:00:00 2001 From: Yaich Mohamed Date: Mon, 5 May 2025 17:56:51 +0200 Subject: [PATCH 117/182] ENH Use scipy Yeo-Johnson implementation in PowerTransformer for scipy >= 1.9 (#31227) Co-authored-by: Mohamed Yaich Co-authored-by: Christian Lorentzen --- .../sklearn.preprocessing/31227.fix.rst | 6 +++ sklearn/preprocessing/_data.py | 7 +-- sklearn/preprocessing/tests/test_data.py | 51 +++++++++++++++++++ sklearn/utils/fixes.py | 33 ++++++++++++ 4 files changed, 94 insertions(+), 3 deletions(-) create mode 100644 doc/whats_new/upcoming_changes/sklearn.preprocessing/31227.fix.rst diff --git a/doc/whats_new/upcoming_changes/sklearn.preprocessing/31227.fix.rst b/doc/whats_new/upcoming_changes/sklearn.preprocessing/31227.fix.rst new file mode 100644 index 0000000000000..803517760a822 --- /dev/null +++ b/doc/whats_new/upcoming_changes/sklearn.preprocessing/31227.fix.rst @@ -0,0 +1,6 @@ +- Now using ``scipy.stats.yeojohnson`` instead of our own implementation of the Yeo-Johnson transform. + Fixed numerical stability (mostly overflows) of the Yeo-Johnson transform with + `PowerTransformer(method="yeo-johnson")` when scipy version is `>= 1.12`. + Initial PR by :user:`Xuefeng Xu ` completed by :user:`Mohamed Yaich `, + :user:`Oussama Er-rabie `, :user:`Mohammed Yaslam Dlimi `, + :user:`Hamza Zaroual `, :user:`Amine Hannoun ` and :user:`Sylvain Marié `. \ No newline at end of file diff --git a/sklearn/preprocessing/_data.py b/sklearn/preprocessing/_data.py index f9dd9b6b360db..1349374a61ea8 100644 --- a/sklearn/preprocessing/_data.py +++ b/sklearn/preprocessing/_data.py @@ -6,7 +6,7 @@ from numbers import Integral, Real import numpy as np -from scipy import optimize, sparse, stats +from scipy import sparse, stats from scipy.special import boxcox, inv_boxcox from sklearn.utils import metadata_routing @@ -28,6 +28,7 @@ ) from ..utils._param_validation import Interval, Options, StrOptions, validate_params from ..utils.extmath import _incremental_mean_and_var, row_norms +from ..utils.fixes import _yeojohnson_lambda from ..utils.sparsefuncs import ( incr_mean_variance_axis, inplace_column_scale, @@ -3542,8 +3543,8 @@ def _neg_log_likelihood(lmbda): # the computation of lambda is influenced by NaNs so we need to # get rid of them x = x[~np.isnan(x)] - # choosing bracket -2, 2 like for boxcox - return optimize.brent(_neg_log_likelihood, brack=(-2, 2)) + + return _yeojohnson_lambda(_neg_log_likelihood, x) def _check_input(self, X, in_fit, check_positive=False, check_shape=False): """Validate the input before fit and transform. diff --git a/sklearn/preprocessing/tests/test_data.py b/sklearn/preprocessing/tests/test_data.py index 4732d2960360c..a618d426a7dcb 100644 --- a/sklearn/preprocessing/tests/test_data.py +++ b/sklearn/preprocessing/tests/test_data.py @@ -12,6 +12,7 @@ from sklearn import config_context, datasets from sklearn.base import clone from sklearn.exceptions import NotFittedError +from sklearn.externals._packaging.version import parse as parse_version from sklearn.metrics.pairwise import linear_kernel from sklearn.model_selection import cross_val_predict from sklearn.pipeline import Pipeline @@ -62,6 +63,7 @@ CSC_CONTAINERS, CSR_CONTAINERS, LIL_CONTAINERS, + sp_version, ) from sklearn.utils.sparsefuncs import mean_variance_axis @@ -2640,3 +2642,52 @@ def test_power_transformer_constant_feature(standardize): assert_allclose(Xt_, np.zeros_like(X)) else: assert_allclose(Xt_, X) + + +@pytest.mark.skipif( + sp_version < parse_version("1.12"), + reason="scipy version 1.12 required for stable yeo-johnson", +) +def test_power_transformer_no_warnings(): + """Verify that PowerTransformer operates without raising any warnings on valid data. + + This test addresses numerical issues with floating point numbers (mostly + overflows) with the Yeo-Johnson transform, see + https://github.com/scikit-learn/scikit-learn/issues/23319#issuecomment-1464933635 + """ + x = np.array( + [ + 2003.0, + 1950.0, + 1997.0, + 2000.0, + 2009.0, + 2009.0, + 1980.0, + 1999.0, + 2007.0, + 1991.0, + ] + ) + + def _test_no_warnings(data): + """Internal helper to test for unexpected warnings.""" + with warnings.catch_warnings(record=True) as caught_warnings: + warnings.simplefilter("always") # Ensure all warnings are captured + PowerTransformer(method="yeo-johnson", standardize=True).fit_transform(data) + + assert not caught_warnings, "Unexpected warnings were raised:\n" + "\n".join( + str(w.message) for w in caught_warnings + ) + + # Full dataset: Should not trigger overflow in variance calculation. + _test_no_warnings(x.reshape(-1, 1)) + + # Subset of data: Should not trigger overflow in power calculation. + _test_no_warnings(x[:5].reshape(-1, 1)) + + +def test_yeojohnson_for_different_scipy_version(): + """Check that the results are consistent across different SciPy versions.""" + pt = PowerTransformer(method="yeo-johnson").fit(X_1col) + pt.lambdas_[0] == pytest.approx(0.99546157, rel=1e-7) diff --git a/sklearn/utils/fixes.py b/sklearn/utils/fixes.py index 816deb3d36072..02e723963448b 100644 --- a/sklearn/utils/fixes.py +++ b/sklearn/utils/fixes.py @@ -14,6 +14,7 @@ import scipy import scipy.sparse.linalg import scipy.stats +from scipy import optimize try: import pandas as pd @@ -80,6 +81,38 @@ def _sparse_linalg_cg(A, b, **kwargs): return scipy.sparse.linalg.cg(A, b, **kwargs) +# TODO : remove this when required minimum version of scipy >= 1.9.0 +def _yeojohnson_lambda(_neg_log_likelihood, x): + """Estimate the optimal Yeo-Johnson transformation parameter (lambda). + + This function provides a compatibility workaround for versions of SciPy + older than 1.9.0, where `scipy.stats.yeojohnson` did not return + the estimated lambda directly. + + Parameters + ---------- + _neg_log_likelihood : callable + A function that computes the negative log-likelihood of the Yeo-Johnson + transformation for a given lambda. Used only for SciPy versions < 1.9.0. + + x : array-like + Input data to estimate the Yeo-Johnson transformation parameter. + + Returns + ------- + lmbda : float + The estimated lambda parameter for the Yeo-Johnson transformation. + """ + min_scipy_version = "1.9.0" + + if sp_version < parse_version(min_scipy_version): + # choosing bracket -2, 2 like for boxcox + return optimize.brent(_neg_log_likelihood, brack=(-2, 2)) + + _, lmbda = scipy.stats.yeojohnson(x, lmbda=None) + return lmbda + + # TODO: Fuse the modern implementations of _sparse_min_max and _sparse_nan_min_max # into the public min_max_axis function when Scipy 1.11 is the minimum supported # version and delete the backport in the else branch below. From 37a69e8d295872926f136f24af8e6d85315ff414 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Lo=C3=AFc=20Est=C3=A8ve?= Date: Mon, 5 May 2025 18:04:14 +0200 Subject: [PATCH 118/182] MNT Remove pr directives from towncrier fragments (#31303) --- .../upcoming_changes/sklearn.linear_model/30521.fix.rst | 2 +- .../upcoming_changes/sklearn.metrics/29151.enhancement.rst | 2 +- doc/whats_new/upcoming_changes/sklearn.metrics/29151.fix.rst | 2 +- .../sklearn.preprocessing/29907.enhancement.rst | 4 ++-- .../upcoming_changes/sklearn.preprocessing/29907.fix.rst | 2 +- .../upcoming_changes/sklearn.utils/26335.enhancement.rst | 2 +- 6 files changed, 7 insertions(+), 7 deletions(-) diff --git a/doc/whats_new/upcoming_changes/sklearn.linear_model/30521.fix.rst b/doc/whats_new/upcoming_changes/sklearn.linear_model/30521.fix.rst index 74ad18fbd2f8e..951da8f2627b4 100644 --- a/doc/whats_new/upcoming_changes/sklearn.linear_model/30521.fix.rst +++ b/doc/whats_new/upcoming_changes/sklearn.linear_model/30521.fix.rst @@ -1,4 +1,4 @@ -- |Enhancement| Added a new parameter `tol` to +- Added a new parameter `tol` to :class:`linear_model.LinearRegression` that determines the precision of the solution `coef_` when fitting on sparse data. By :user:`Success Moses ` diff --git a/doc/whats_new/upcoming_changes/sklearn.metrics/29151.enhancement.rst b/doc/whats_new/upcoming_changes/sklearn.metrics/29151.enhancement.rst index 26fbb92e1c9a9..fc552703f2512 100644 --- a/doc/whats_new/upcoming_changes/sklearn.metrics/29151.enhancement.rst +++ b/doc/whats_new/upcoming_changes/sklearn.metrics/29151.enhancement.rst @@ -3,4 +3,4 @@ `drop_intermediate` option to drop thresholds where true positives (tp) do not change from the previous or subsequent thresholds. All points with the same tp value have the same `fnr` and thus same y coordinate in a DET curve. - :pr:`29151` by :user:`Arturo Amor `. + By :user:`Arturo Amor ` diff --git a/doc/whats_new/upcoming_changes/sklearn.metrics/29151.fix.rst b/doc/whats_new/upcoming_changes/sklearn.metrics/29151.fix.rst index 5312aee72d7c2..61cf97e9b27f6 100644 --- a/doc/whats_new/upcoming_changes/sklearn.metrics/29151.fix.rst +++ b/doc/whats_new/upcoming_changes/sklearn.metrics/29151.fix.rst @@ -1,4 +1,4 @@ - :func:`metrics.det_curve` and :class:`metrics.DetCurveDisplay` now return an extra threshold at infinity where the classifier always predicts the negative class i.e. tps = fps = 0. - :pr:`29151` by :user:`Arturo Amor `. + By :user:`Arturo Amor ` diff --git a/doc/whats_new/upcoming_changes/sklearn.preprocessing/29907.enhancement.rst b/doc/whats_new/upcoming_changes/sklearn.preprocessing/29907.enhancement.rst index 3f3716a3b740f..0ce9249cc94fb 100644 --- a/doc/whats_new/upcoming_changes/sklearn.preprocessing/29907.enhancement.rst +++ b/doc/whats_new/upcoming_changes/sklearn.preprocessing/29907.enhancement.rst @@ -1,6 +1,6 @@ - :class:`preprocessing.KBinsDiscretizer` with `strategy="uniform"` now accepts `sample_weight`. Additionally with `strategy="quantile"` the `quantile_method` can now be specified (in the future - `quantile_method="averaged_inverted_cdf"` will become the default) - :pr:`29907` by :user:`Shruti Nath ` and :user:`Olivier Grisel + `quantile_method="averaged_inverted_cdf"` will become the default). + By :user:`Shruti Nath ` and :user:`Olivier Grisel ` diff --git a/doc/whats_new/upcoming_changes/sklearn.preprocessing/29907.fix.rst b/doc/whats_new/upcoming_changes/sklearn.preprocessing/29907.fix.rst index b4cbb2ac4b819..d2f61e099c5eb 100644 --- a/doc/whats_new/upcoming_changes/sklearn.preprocessing/29907.fix.rst +++ b/doc/whats_new/upcoming_changes/sklearn.preprocessing/29907.fix.rst @@ -2,5 +2,5 @@ sample weights are given and subsampling is used. This may change results even when not using sample weights, although in absolute and not in terms of statistical properties. - :pr:`29907` by :user:`Shruti Nath ` and :user:`Jérémie du Boisberranger + By :user:`Shruti Nath ` and :user:`Jérémie du Boisberranger ` diff --git a/doc/whats_new/upcoming_changes/sklearn.utils/26335.enhancement.rst b/doc/whats_new/upcoming_changes/sklearn.utils/26335.enhancement.rst index e5bf047cd5db9..9a82ab4f02675 100644 --- a/doc/whats_new/upcoming_changes/sklearn.utils/26335.enhancement.rst +++ b/doc/whats_new/upcoming_changes/sklearn.utils/26335.enhancement.rst @@ -1,4 +1,4 @@ -- |Enhancement| :func:`utils.multiclass.type_of_target` raises a warning when the number +- :func:`utils.multiclass.type_of_target` raises a warning when the number of unique classes is greater than 50% of the number of samples. This warning is raised only if `y` has more than 20 samples. By :user:`Rahil Parikh `. From c26fa1687eae83100c492ca38b1014982647a44d Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Lo=C3=AFc=20Est=C3=A8ve?= Date: Mon, 5 May 2025 18:08:53 +0200 Subject: [PATCH 119/182] BLD Reduce generated build file path lengths to avoid Windows path length limitation (#31212) --- sklearn/__check_build/meson.build | 3 +- sklearn/_loss/meson.build | 3 +- sklearn/cluster/_hdbscan/meson.build | 5 ++-- sklearn/cluster/meson.build | 15 ++++------ sklearn/datasets/meson.build | 3 +- sklearn/decomposition/meson.build | 6 ++-- .../_hist_gradient_boosting/meson.build | 16 +++++------ sklearn/ensemble/meson.build | 3 +- sklearn/feature_extraction/meson.build | 4 +-- sklearn/linear_model/meson.build | 6 ++-- sklearn/manifold/meson.build | 6 ++-- sklearn/meson.build | 13 +++++++++ .../_pairwise_distances_reduction/meson.build | 28 +++++-------------- sklearn/metrics/cluster/meson.build | 3 +- sklearn/metrics/meson.build | 6 ++-- sklearn/neighbors/meson.build | 9 ++---- sklearn/preprocessing/meson.build | 7 ++--- sklearn/svm/meson.build | 13 +++------ sklearn/tree/meson.build | 13 ++++----- sklearn/utils/meson.build | 27 ++++++++---------- 20 files changed, 77 insertions(+), 112 deletions(-) diff --git a/sklearn/__check_build/meson.build b/sklearn/__check_build/meson.build index 8295e6b573639..5f6115d976549 100644 --- a/sklearn/__check_build/meson.build +++ b/sklearn/__check_build/meson.build @@ -1,7 +1,6 @@ py.extension_module( '_check_build', - '_check_build.pyx', - cython_args: cython_args, + cython_gen.process('_check_build.pyx'), install: true, subdir: 'sklearn/__check_build', ) diff --git a/sklearn/_loss/meson.build b/sklearn/_loss/meson.build index ead867dcfa746..a4b3425a21cd2 100644 --- a/sklearn/_loss/meson.build +++ b/sklearn/_loss/meson.build @@ -16,9 +16,8 @@ _loss_pyx = custom_target( py.extension_module( '_loss', - _loss_pyx, + cython_gen.process(_loss_pyx), dependencies: [openmp_dep], - cython_args: cython_args, install: true, subdir: 'sklearn/_loss', ) diff --git a/sklearn/cluster/_hdbscan/meson.build b/sklearn/cluster/_hdbscan/meson.build index b6a11eda8bb71..f2e3ac91b1eb2 100644 --- a/sklearn/cluster/_hdbscan/meson.build +++ b/sklearn/cluster/_hdbscan/meson.build @@ -1,6 +1,6 @@ cluster_hdbscan_extension_metadata = { - '_linkage': {'sources': ['_linkage.pyx', metrics_cython_tree]}, - '_reachability': {'sources': ['_reachability.pyx']}, + '_linkage': {'sources': [cython_gen.process('_linkage.pyx'), metrics_cython_tree]}, + '_reachability': {'sources': [cython_gen.process('_reachability.pyx')]}, '_tree': {'sources': ['_tree.pyx']} } @@ -9,7 +9,6 @@ foreach ext_name, ext_dict : cluster_hdbscan_extension_metadata ext_name, ext_dict.get('sources'), dependencies: [np_dep], - cython_args: cython_args, subdir: 'sklearn/cluster/_hdbscan', install: true ) diff --git a/sklearn/cluster/meson.build b/sklearn/cluster/meson.build index 9031d11d56319..6c11619f3ca55 100644 --- a/sklearn/cluster/meson.build +++ b/sklearn/cluster/meson.build @@ -1,17 +1,16 @@ cluster_extension_metadata = { '_dbscan_inner': - {'sources': ['_dbscan_inner.pyx'], 'override_options': ['cython_language=cpp']}, + {'sources': [cython_gen_cpp.process('_dbscan_inner.pyx')]}, '_hierarchical_fast': - {'sources': ['_hierarchical_fast.pyx', metrics_cython_tree], - 'override_options': ['cython_language=cpp']}, + {'sources': [cython_gen_cpp.process('_hierarchical_fast.pyx'), metrics_cython_tree]}, '_k_means_common': - {'sources': ['_k_means_common.pyx'], 'dependencies': [openmp_dep]}, + {'sources': [cython_gen.process('_k_means_common.pyx')], 'dependencies': [openmp_dep]}, '_k_means_lloyd': - {'sources': ['_k_means_lloyd.pyx'], 'dependencies': [openmp_dep]}, + {'sources': [cython_gen.process('_k_means_lloyd.pyx')], 'dependencies': [openmp_dep]}, '_k_means_elkan': - {'sources': ['_k_means_elkan.pyx'], 'dependencies': [openmp_dep]}, + {'sources': [cython_gen.process('_k_means_elkan.pyx')], 'dependencies': [openmp_dep]}, '_k_means_minibatch': - {'sources': ['_k_means_minibatch.pyx'], 'dependencies': [openmp_dep]}, + {'sources': [cython_gen.process('_k_means_minibatch.pyx')], 'dependencies': [openmp_dep]}, } foreach ext_name, ext_dict : cluster_extension_metadata @@ -19,8 +18,6 @@ foreach ext_name, ext_dict : cluster_extension_metadata ext_name, [ext_dict.get('sources'), utils_cython_tree], dependencies: [np_dep] + ext_dict.get('dependencies', []), - override_options : ext_dict.get('override_options', []), - cython_args: cython_args, subdir: 'sklearn/cluster', install: true ) diff --git a/sklearn/datasets/meson.build b/sklearn/datasets/meson.build index 77f784d610b30..4efcd279315de 100644 --- a/sklearn/datasets/meson.build +++ b/sklearn/datasets/meson.build @@ -1,8 +1,7 @@ py.extension_module( '_svmlight_format_fast', - '_svmlight_format_fast.pyx', + cython_gen.process('_svmlight_format_fast.pyx'), dependencies: [np_dep], - cython_args: cython_args, subdir: 'sklearn/datasets', install: true ) diff --git a/sklearn/decomposition/meson.build b/sklearn/decomposition/meson.build index 93dc6dff06e90..75b67a46981f4 100644 --- a/sklearn/decomposition/meson.build +++ b/sklearn/decomposition/meson.build @@ -1,16 +1,14 @@ py.extension_module( '_online_lda_fast', - ['_online_lda_fast.pyx', utils_cython_tree], - cython_args: cython_args, + [cython_gen.process('_online_lda_fast.pyx'), utils_cython_tree], subdir: 'sklearn/decomposition', install: true ) py.extension_module( '_cdnmf_fast', - '_cdnmf_fast.pyx', + cython_gen.process('_cdnmf_fast.pyx'), dependencies: [np_dep], - cython_args: cython_args, subdir: 'sklearn/decomposition', install: true ) diff --git a/sklearn/ensemble/_hist_gradient_boosting/meson.build b/sklearn/ensemble/_hist_gradient_boosting/meson.build index 362bd5efb82d5..122a2102800f3 100644 --- a/sklearn/ensemble/_hist_gradient_boosting/meson.build +++ b/sklearn/ensemble/_hist_gradient_boosting/meson.build @@ -1,11 +1,12 @@ hist_gradient_boosting_extension_metadata = { - '_gradient_boosting': {'sources': ['_gradient_boosting.pyx'], 'dependencies': [openmp_dep]}, - 'histogram': {'sources': ['histogram.pyx'], 'dependencies': [openmp_dep]}, - 'splitting': {'sources': ['splitting.pyx'], 'dependencies': [openmp_dep]}, - '_binning': {'sources': ['_binning.pyx'], 'dependencies': [openmp_dep]}, - '_predictor': {'sources': ['_predictor.pyx'], 'dependencies': [openmp_dep]}, - '_bitset': {'sources': ['_bitset.pyx']}, - 'common': {'sources': ['common.pyx']}, + '_gradient_boosting': {'sources': [cython_gen.process('_gradient_boosting.pyx')], + 'dependencies': [openmp_dep]}, + 'histogram': {'sources': [cython_gen.process('histogram.pyx')], 'dependencies': [openmp_dep]}, + 'splitting': {'sources': [cython_gen.process('splitting.pyx')], 'dependencies': [openmp_dep]}, + '_binning': {'sources': [cython_gen.process('_binning.pyx')], 'dependencies': [openmp_dep]}, + '_predictor': {'sources': [cython_gen.process('_predictor.pyx')], 'dependencies': [openmp_dep]}, + '_bitset': {'sources': [cython_gen.process('_bitset.pyx')]}, + 'common': {'sources': [cython_gen.process('common.pyx')]}, } foreach ext_name, ext_dict : hist_gradient_boosting_extension_metadata @@ -13,7 +14,6 @@ foreach ext_name, ext_dict : hist_gradient_boosting_extension_metadata ext_name, ext_dict.get('sources'), dependencies: ext_dict.get('dependencies', []), - cython_args: cython_args, subdir: 'sklearn/ensemble/_hist_gradient_boosting', install: true ) diff --git a/sklearn/ensemble/meson.build b/sklearn/ensemble/meson.build index bc5868b3a0104..893a4eb1a510a 100644 --- a/sklearn/ensemble/meson.build +++ b/sklearn/ensemble/meson.build @@ -1,8 +1,7 @@ py.extension_module( '_gradient_boosting', - ['_gradient_boosting.pyx'] + utils_cython_tree, + [cython_gen.process('_gradient_boosting.pyx')] + utils_cython_tree, dependencies: [np_dep], - cython_args: cython_args, subdir: 'sklearn/ensemble', install: true ) diff --git a/sklearn/feature_extraction/meson.build b/sklearn/feature_extraction/meson.build index 81732474de3b2..f810d7b28576c 100644 --- a/sklearn/feature_extraction/meson.build +++ b/sklearn/feature_extraction/meson.build @@ -1,9 +1,7 @@ py.extension_module( '_hashing_fast', - ['_hashing_fast.pyx', utils_cython_tree], + [cython_gen_cpp.process('_hashing_fast.pyx'), utils_cython_tree], dependencies: [np_dep], - override_options: ['cython_language=cpp'], - cython_args: cython_args, subdir: 'sklearn/feature_extraction', install: true ) diff --git a/sklearn/linear_model/meson.build b/sklearn/linear_model/meson.build index 04fde5a16dde8..6d8405c793389 100644 --- a/sklearn/linear_model/meson.build +++ b/sklearn/linear_model/meson.build @@ -5,8 +5,7 @@ linear_model_cython_tree = [ py.extension_module( '_cd_fast', - ['_cd_fast.pyx', utils_cython_tree], - cython_args: cython_args, + [cython_gen.process('_cd_fast.pyx'), utils_cython_tree], subdir: 'sklearn/linear_model', install: true ) @@ -26,8 +25,7 @@ foreach name: name_list ) py.extension_module( name, - pyx, - cython_args: cython_args, + cython_gen.process(pyx), subdir: 'sklearn/linear_model', install: true ) diff --git a/sklearn/manifold/meson.build b/sklearn/manifold/meson.build index ee83e8afc5019..c060590410d63 100644 --- a/sklearn/manifold/meson.build +++ b/sklearn/manifold/meson.build @@ -1,16 +1,14 @@ py.extension_module( '_utils', - ['_utils.pyx', utils_cython_tree], - cython_args: cython_args, + [cython_gen.process('_utils.pyx'), utils_cython_tree], subdir: 'sklearn/manifold', install: true ) py.extension_module( '_barnes_hut_tsne', - '_barnes_hut_tsne.pyx', + cython_gen.process('_barnes_hut_tsne.pyx'), dependencies: [np_dep, openmp_dep], - cython_args: cython_args, subdir: 'sklearn/manifold', install: true ) diff --git a/sklearn/meson.build b/sklearn/meson.build index a8c97121ba806..93de0c18d99f9 100644 --- a/sklearn/meson.build +++ b/sklearn/meson.build @@ -190,6 +190,19 @@ scikit_learn_cython_args = [ ] cython_args += scikit_learn_cython_args +cython_program = find_program(cython.cmd_array()[0]) + +cython_gen = generator(cython_program, + arguments : cython_args + ['@INPUT@', '--output-file', '@OUTPUT@'], + output : '@BASENAME@.c', +) + +cython_gen_cpp = generator(cython_program, + arguments : cython_args + ['--cplus', '@INPUT@', '--output-file', '@OUTPUT@'], + output : '@BASENAME@.cpp', +) + + # Write file in Meson build dir to be able to figure out from Python code # whether scikit-learn was built with Meson. Adapted from pandas # _version_meson.py. diff --git a/sklearn/metrics/_pairwise_distances_reduction/meson.build b/sklearn/metrics/_pairwise_distances_reduction/meson.build index 4803305e85ec4..0f7eaa286399c 100644 --- a/sklearn/metrics/_pairwise_distances_reduction/meson.build +++ b/sklearn/metrics/_pairwise_distances_reduction/meson.build @@ -38,10 +38,8 @@ _datasets_pair_pyx = custom_target( ) _datasets_pair = py.extension_module( '_datasets_pair', - _datasets_pair_pyx, + cython_gen_cpp.process(_datasets_pair_pyx), dependencies: [np_dep], - override_options: ['cython_language=cpp'], - cython_args: cython_args, subdir: 'sklearn/metrics/_pairwise_distances_reduction', install: true ) @@ -65,10 +63,8 @@ _base_pyx = custom_target( ) _base = py.extension_module( '_base', - _base_pyx, + cython_gen_cpp.process(_base_pyx), dependencies: [np_dep, openmp_dep], - override_options: ['cython_language=cpp'], - cython_args: cython_args, subdir: 'sklearn/metrics/_pairwise_distances_reduction', install: true ) @@ -93,10 +89,8 @@ _middle_term_computer_pyx = custom_target( ) _middle_term_computer = py.extension_module( '_middle_term_computer', - _middle_term_computer_pyx, + cython_gen_cpp.process(_middle_term_computer_pyx), dependencies: [np_dep], - override_options: ['cython_language=cpp'], - cython_args: cython_args, subdir: 'sklearn/metrics/_pairwise_distances_reduction', install: true ) @@ -121,10 +115,8 @@ _argkmin_pyx = custom_target( ) _argkmin = py.extension_module( '_argkmin', - _argkmin_pyx, + cython_gen_cpp.process(_argkmin_pyx), dependencies: [np_dep, openmp_dep], - override_options: ['cython_language=cpp'], - cython_args: cython_args, subdir: 'sklearn/metrics/_pairwise_distances_reduction', install: true ) @@ -149,10 +141,8 @@ _radius_neighbors_pyx = custom_target( ) _radius_neighbors = py.extension_module( '_radius_neighbors', - _radius_neighbors_pyx, + cython_gen_cpp.process(_radius_neighbors_pyx), dependencies: [np_dep, openmp_dep], - override_options: ['cython_language=cpp'], - cython_args: cython_args, subdir: 'sklearn/metrics/_pairwise_distances_reduction', install: true ) @@ -171,10 +161,8 @@ _argkmin_classmode_pyx = custom_target( ) _argkmin_classmode = py.extension_module( '_argkmin_classmode', - _argkmin_classmode_pyx, + cython_gen_cpp.process(_argkmin_classmode_pyx), dependencies: [np_dep, openmp_dep], - override_options: ['cython_language=cpp'], - cython_args: cython_args, # XXX: for some reason -fno-sized-deallocation is needed otherwise there is # an error with undefined symbol _ZdlPv at import time in manylinux wheels. # See https://github.com/scikit-learn/scikit-learn/issues/28596 for more details. @@ -198,10 +186,8 @@ _radius_neighbors_classmode_pyx = custom_target( ) _radius_neighbors_classmode = py.extension_module( '_radius_neighbors_classmode', - _radius_neighbors_classmode_pyx, + cython_gen_cpp.process(_radius_neighbors_classmode_pyx), dependencies: [np_dep, openmp_dep], - override_options: ['cython_language=cpp'], - cython_args: cython_args, subdir: 'sklearn/metrics/_pairwise_distances_reduction', install: true ) diff --git a/sklearn/metrics/cluster/meson.build b/sklearn/metrics/cluster/meson.build index 80740fde22c69..5f25296c7540f 100644 --- a/sklearn/metrics/cluster/meson.build +++ b/sklearn/metrics/cluster/meson.build @@ -1,7 +1,6 @@ py.extension_module( '_expected_mutual_info_fast', - '_expected_mutual_info_fast.pyx', - cython_args: cython_args, + cython_gen.process('_expected_mutual_info_fast.pyx'), subdir: 'sklearn/metrics/cluster', install: true ) diff --git a/sklearn/metrics/meson.build b/sklearn/metrics/meson.build index d788cf08f3add..f0f9894cc6f59 100644 --- a/sklearn/metrics/meson.build +++ b/sklearn/metrics/meson.build @@ -31,18 +31,16 @@ _dist_metrics_pyx = custom_target( _dist_metrics = py.extension_module( '_dist_metrics', - _dist_metrics_pyx, + cython_gen.process(_dist_metrics_pyx), dependencies: [np_dep], - cython_args: cython_args, subdir: 'sklearn/metrics', install: true ) py.extension_module( '_pairwise_fast', - ['_pairwise_fast.pyx', metrics_cython_tree], + [cython_gen.process('_pairwise_fast.pyx'), metrics_cython_tree], dependencies: [openmp_dep], - cython_args: cython_args, subdir: 'sklearn/metrics', install: true ) diff --git a/sklearn/neighbors/meson.build b/sklearn/neighbors/meson.build index e7ce9a2972cd3..df2aab466500c 100644 --- a/sklearn/neighbors/meson.build +++ b/sklearn/neighbors/meson.build @@ -28,9 +28,8 @@ foreach name: name_list ) py.extension_module( name, - pyx, + cython_gen.process(pyx), dependencies: [np_dep], - cython_args: cython_args, subdir: 'sklearn/neighbors', install: true ) @@ -38,8 +37,8 @@ endforeach neighbors_extension_metadata = { '_partition_nodes': - {'sources': ['_partition_nodes.pyx'], - 'override_options': ['cython_language=cpp'], 'dependencies': [np_dep]}, + {'sources': [cython_gen_cpp.process('_partition_nodes.pyx')], + 'dependencies': [np_dep]}, '_quad_tree': {'sources': ['_quad_tree.pyx'], 'dependencies': [np_dep]}, } @@ -48,8 +47,6 @@ foreach ext_name, ext_dict : neighbors_extension_metadata ext_name, [ext_dict.get('sources'), utils_cython_tree], dependencies: ext_dict.get('dependencies'), - override_options : ext_dict.get('override_options', []), - cython_args: cython_args, subdir: 'sklearn/neighbors', install: true ) diff --git a/sklearn/preprocessing/meson.build b/sklearn/preprocessing/meson.build index a8f741ee352b1..052c4a6766ad4 100644 --- a/sklearn/preprocessing/meson.build +++ b/sklearn/preprocessing/meson.build @@ -1,16 +1,13 @@ py.extension_module( '_csr_polynomial_expansion', - ['_csr_polynomial_expansion.pyx', utils_cython_tree], - cython_args: cython_args, + [cython_gen.process('_csr_polynomial_expansion.pyx'), utils_cython_tree], subdir: 'sklearn/preprocessing', install: true ) py.extension_module( '_target_encoder_fast', - ['_target_encoder_fast.pyx', utils_cython_tree], - override_options: ['cython_language=cpp'], - cython_args: cython_args, + [cython_gen_cpp.process('_target_encoder_fast.pyx'), utils_cython_tree], subdir: 'sklearn/preprocessing', install: true ) diff --git a/sklearn/svm/meson.build b/sklearn/svm/meson.build index 8372364c429cd..6232d747d1feb 100644 --- a/sklearn/svm/meson.build +++ b/sklearn/svm/meson.build @@ -4,10 +4,8 @@ liblinear_include = include_directories('src/liblinear') _newrand = py.extension_module( '_newrand', - '_newrand.pyx', - override_options: ['cython_language=cpp'], + cython_gen_cpp.process('_newrand.pyx'), include_directories: [newrand_include], - cython_args: cython_args, subdir: 'sklearn/svm', install: true ) @@ -19,20 +17,18 @@ libsvm_skl = static_library( py.extension_module( '_libsvm', - ['_libsvm.pyx', utils_cython_tree], + [cython_gen.process('_libsvm.pyx'), utils_cython_tree], include_directories: [newrand_include, libsvm_include], link_with: libsvm_skl, - cython_args: cython_args, subdir: 'sklearn/svm', install: true ) py.extension_module( '_libsvm_sparse', - ['_libsvm_sparse.pyx', utils_cython_tree], + [cython_gen.process('_libsvm_sparse.pyx'), utils_cython_tree], include_directories: [newrand_include, libsvm_include], link_with: libsvm_skl, - cython_args: cython_args, subdir: 'sklearn/svm', install: true ) @@ -44,10 +40,9 @@ liblinear_skl = static_library( py.extension_module( '_liblinear', - ['_liblinear.pyx', utils_cython_tree], + [cython_gen.process('_liblinear.pyx'), utils_cython_tree], include_directories: [newrand_include, liblinear_include], link_with: [liblinear_skl], - cython_args: cython_args, subdir: 'sklearn/svm', install: true ) diff --git a/sklearn/tree/meson.build b/sklearn/tree/meson.build index 3e16af150b7ae..87345a1e344bf 100644 --- a/sklearn/tree/meson.build +++ b/sklearn/tree/meson.build @@ -1,18 +1,18 @@ tree_extension_metadata = { '_tree': - {'sources': ['_tree.pyx'], - 'override_options': ['cython_language=cpp', 'optimization=3']}, + {'sources': [cython_gen_cpp.process('_tree.pyx')], + 'override_options': ['optimization=3']}, '_splitter': - {'sources': ['_splitter.pyx'], + {'sources': [cython_gen.process('_splitter.pyx')], 'override_options': ['optimization=3']}, '_partitioner': - {'sources': ['_partitioner.pyx'], + {'sources': [cython_gen.process('_partitioner.pyx')], 'override_options': ['optimization=3']}, '_criterion': - {'sources': ['_criterion.pyx'], + {'sources': [cython_gen.process('_criterion.pyx')], 'override_options': ['optimization=3']}, '_utils': - {'sources': ['_utils.pyx'], + {'sources': [cython_gen.process('_utils.pyx')], 'override_options': ['optimization=3']}, } @@ -22,7 +22,6 @@ foreach ext_name, ext_dict : tree_extension_metadata [ext_dict.get('sources'), utils_cython_tree], dependencies: [np_dep], override_options : ext_dict.get('override_options', []), - cython_args: cython_args, subdir: 'sklearn/tree', install: true ) diff --git a/sklearn/utils/meson.build b/sklearn/utils/meson.build index 76b5f0141393d..9ac2454172c9a 100644 --- a/sklearn/utils/meson.build +++ b/sklearn/utils/meson.build @@ -16,23 +16,23 @@ utils_cython_tree = [ utils_extension_metadata = { 'sparsefuncs_fast': - {'sources': ['sparsefuncs_fast.pyx']}, - '_cython_blas': {'sources': ['_cython_blas.pyx']}, - 'arrayfuncs': {'sources': ['arrayfuncs.pyx']}, + {'sources': [cython_gen.process('sparsefuncs_fast.pyx')]}, + '_cython_blas': {'sources': [cython_gen.process('_cython_blas.pyx')]}, + 'arrayfuncs': {'sources': [cython_gen.process('arrayfuncs.pyx')]}, 'murmurhash': { 'sources': ['murmurhash.pyx', 'src' / 'MurmurHash3.cpp'], }, '_fast_dict': - {'sources': ['_fast_dict.pyx'], 'override_options': ['cython_language=cpp']}, - '_openmp_helpers': {'sources': ['_openmp_helpers.pyx'], 'dependencies': [openmp_dep]}, - '_random': {'sources': ['_random.pyx']}, - '_typedefs': {'sources': ['_typedefs.pyx']}, - '_heap': {'sources': ['_heap.pyx']}, - '_sorting': {'sources': ['_sorting.pyx']}, + {'sources': [cython_gen_cpp.process('_fast_dict.pyx')]}, + '_openmp_helpers': {'sources': [cython_gen.process('_openmp_helpers.pyx')], 'dependencies': [openmp_dep]}, + '_random': {'sources': [cython_gen.process('_random.pyx')]}, + '_typedefs': {'sources': [cython_gen.process('_typedefs.pyx')]}, + '_heap': {'sources': [cython_gen.process('_heap.pyx')]}, + '_sorting': {'sources': [cython_gen.process('_sorting.pyx')]}, '_vector_sentinel': - {'sources': ['_vector_sentinel.pyx'], 'override_options': ['cython_language=cpp'], + {'sources': [cython_gen_cpp.process('_vector_sentinel.pyx')], 'dependencies': [np_dep]}, - '_isfinite': {'sources': ['_isfinite.pyx']}, + '_isfinite': {'sources': [cython_gen.process('_isfinite.pyx')]}, } foreach ext_name, ext_dict : utils_extension_metadata @@ -40,8 +40,6 @@ foreach ext_name, ext_dict : utils_extension_metadata ext_name, [ext_dict.get('sources'), utils_cython_tree], dependencies: ext_dict.get('dependencies', []), - override_options : ext_dict.get('override_options', []), - cython_args: cython_args, subdir: 'sklearn/utils', install: true ) @@ -70,8 +68,7 @@ foreach name: util_extension_names ) py.extension_module( name, - pyx, - cython_args: cython_args, + cython_gen.process(pyx), subdir: 'sklearn/utils', install: true ) From 2d78745ba8b88c07c63a42381c0ab41d798ac04b Mon Sep 17 00:00:00 2001 From: Mamduh Zabidi Date: Tue, 6 May 2025 00:20:39 +0800 Subject: [PATCH 120/182] DOC: added link to user guide in feature_extraction.grid_to_graph (#30916) --- doc/modules/feature_extraction.rst | 2 ++ sklearn/feature_extraction/image.py | 2 ++ 2 files changed, 4 insertions(+) diff --git a/doc/modules/feature_extraction.rst b/doc/modules/feature_extraction.rst index ce62e22b0bc74..1f2e18dfc31b2 100644 --- a/doc/modules/feature_extraction.rst +++ b/doc/modules/feature_extraction.rst @@ -1041,6 +1041,8 @@ implemented as a scikit-learn transformer, so it can be used in pipelines. See:: >>> patches.shape (45, 2, 2, 3) +.. _connectivity_graph_image: + Connectivity graph of an image ------------------------------- diff --git a/sklearn/feature_extraction/image.py b/sklearn/feature_extraction/image.py index ae7325d528224..b571215de47be 100644 --- a/sklearn/feature_extraction/image.py +++ b/sklearn/feature_extraction/image.py @@ -205,6 +205,8 @@ def grid_to_graph( Edges exist if 2 voxels are connected. + Read more in the :ref:`User Guide `. + Parameters ---------- n_x : int From 7cf4e4209124be982450c7441520b5fc3141814a Mon Sep 17 00:00:00 2001 From: Mihir Waknis Date: Mon, 5 May 2025 23:52:39 -0700 Subject: [PATCH 121/182] ENH Improve SimpleImputer error message for incompatible fill_value types (#30828) Co-authored-by: Adrin Jalali --- sklearn/impute/_base.py | 12 +++++++----- 1 file changed, 7 insertions(+), 5 deletions(-) diff --git a/sklearn/impute/_base.py b/sklearn/impute/_base.py index 35b35167db579..689ba8aceeaf6 100644 --- a/sklearn/impute/_base.py +++ b/sklearn/impute/_base.py @@ -391,16 +391,18 @@ def _validate_input(self, X, in_fit): fill_value_dtype = type(self.fill_value) err_msg = ( f"fill_value={self.fill_value!r} (of type {fill_value_dtype!r}) " - f"cannot be cast to the input data that is {X.dtype!r}. Make sure " - "that both dtypes are of the same kind." + f"cannot be cast to the input data that is {X.dtype!r}. " + "If fill_value is a Python scalar, instead pass a numpy scalar " + "(e.g. fill_value=np.uint8(0) if your data is of type np.uint8). " + "Make sure that both dtypes are of the same kind." ) elif not in_fit: fill_value_dtype = self.statistics_.dtype err_msg = ( f"The dtype of the filling value (i.e. {fill_value_dtype!r}) " - f"cannot be cast to the input data that is {X.dtype!r}. Make sure " - "that the dtypes of the input data is of the same kind between " - "fit and transform." + f"cannot be cast to the input data that is {X.dtype!r}. " + "Make sure that the dtypes of the input data are of the same kind " + "between fit and transform." ) else: # By default, fill_value=None, and the replacement is always From 17c84a87d4f92495e2b1be2f77a6e862aed6c68d Mon Sep 17 00:00:00 2001 From: Aniruddha Saha Date: Tue, 6 May 2025 04:37:46 -0400 Subject: [PATCH 122/182] DOC improve headings in LabelSpreading examples (#30553) Co-authored-by: adrinjalali --- .../plot_label_propagation_digits_active_learning.py | 6 +++--- .../semi_supervised/plot_label_propagation_structure.py | 6 +++--- 2 files changed, 6 insertions(+), 6 deletions(-) diff --git a/examples/semi_supervised/plot_label_propagation_digits_active_learning.py b/examples/semi_supervised/plot_label_propagation_digits_active_learning.py index 36183a8f6bfe5..eda6804fe3863 100644 --- a/examples/semi_supervised/plot_label_propagation_digits_active_learning.py +++ b/examples/semi_supervised/plot_label_propagation_digits_active_learning.py @@ -1,7 +1,7 @@ """ -======================================== -Label Propagation digits active learning -======================================== +========================================= +Label Propagation digits: Active learning +========================================= Demonstrates an active learning technique to learn handwritten digits using label propagation. diff --git a/examples/semi_supervised/plot_label_propagation_structure.py b/examples/semi_supervised/plot_label_propagation_structure.py index 2b44c51923686..323cfb2a110cf 100644 --- a/examples/semi_supervised/plot_label_propagation_structure.py +++ b/examples/semi_supervised/plot_label_propagation_structure.py @@ -1,7 +1,7 @@ """ -============================================== -Label Propagation learning a complex structure -============================================== +======================================================= +Label Propagation circles: Learning a complex structure +======================================================= Example of LabelPropagation learning a complex internal structure to demonstrate "manifold learning". The outer circle should be From c9883452041c1ce9931c5419374bca44ebd4463e Mon Sep 17 00:00:00 2001 From: Ashton Powell <139727994+ashtonpowell@users.noreply.github.com> Date: Tue, 6 May 2025 02:47:14 -0700 Subject: [PATCH 123/182] DOC Added an example reference for plot_manifold_sphere.py (#30959) --- doc/modules/manifold.rst | 3 +++ 1 file changed, 3 insertions(+) diff --git a/doc/modules/manifold.rst b/doc/modules/manifold.rst index 19694ff0cb422..fec6e96153323 100644 --- a/doc/modules/manifold.rst +++ b/doc/modules/manifold.rst @@ -112,6 +112,9 @@ from the data itself, without the use of predetermined classifications. using manifold learning to map the stock market structure based on historical stock prices. +* See :ref:`sphx_glr_auto_examples_manifold_plot_manifold_sphere.py` for an example of + manifold learning techniques applied to a spherical data-set. + The manifold learning implementations available in scikit-learn are summarized below From 8ba69c5639df44468bf059a929fba29f53b63cd3 Mon Sep 17 00:00:00 2001 From: Aiden Frank Date: Tue, 6 May 2025 06:02:24 -0400 Subject: [PATCH 124/182] DOC: Add link to plot_nnls example (#31280) --- sklearn/linear_model/_base.py | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/sklearn/linear_model/_base.py b/sklearn/linear_model/_base.py index 78c118168e122..1c9ab10531177 100644 --- a/sklearn/linear_model/_base.py +++ b/sklearn/linear_model/_base.py @@ -494,6 +494,10 @@ class LinearRegression(MultiOutputMixin, RegressorMixin, LinearModel): When set to ``True``, forces the coefficients to be positive. This option is only supported for dense arrays. + For a comparison between a linear regression model with positive constraints + on the regression coefficients and a linear regression without such constraints, + see :ref:`sphx_glr_auto_examples_linear_model_plot_nnls.py`. + .. versionadded:: 0.24 Attributes From ed9bcc7330e464c39e6eee2576c0780a76608267 Mon Sep 17 00:00:00 2001 From: Natalia Mokeeva <91160475+natmokval@users.noreply.github.com> Date: Tue, 6 May 2025 12:05:42 +0200 Subject: [PATCH 125/182] DOC add link to the plot_gmm_covariances example (#31249) --- sklearn/mixture/_gaussian_mixture.py | 3 +++ 1 file changed, 3 insertions(+) diff --git a/sklearn/mixture/_gaussian_mixture.py b/sklearn/mixture/_gaussian_mixture.py index 2796d0fc3bacc..c4bdd3a0d68c8 100644 --- a/sklearn/mixture/_gaussian_mixture.py +++ b/sklearn/mixture/_gaussian_mixture.py @@ -631,6 +631,9 @@ class GaussianMixture(BaseMixture): (n_components, n_features) if 'diag', (n_components, n_features, n_features) if 'full' + For an example of using covariances, refer to + :ref:`sphx_glr_auto_examples_mixture_plot_gmm_covariances.py`. + precisions_ : array-like The precision matrices for each component in the mixture. A precision matrix is the inverse of a covariance matrix. A covariance matrix is From e78fce44f8a39c7f256fa9f9d92ee93cb69739ed Mon Sep 17 00:00:00 2001 From: Daniel Agyapong Date: Tue, 6 May 2025 12:17:11 +0200 Subject: [PATCH 126/182] DOC Add link to plot_sparse_cov example (#31278) Co-authored-by: Stefanie Senger <91849487+StefanieSenger@users.noreply.github.com> --- sklearn/covariance/_graph_lasso.py | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/sklearn/covariance/_graph_lasso.py b/sklearn/covariance/_graph_lasso.py index af701e096fd5b..b3f653de64149 100644 --- a/sklearn/covariance/_graph_lasso.py +++ b/sklearn/covariance/_graph_lasso.py @@ -893,6 +893,11 @@ class GraphicalLassoCV(BaseGraphicalLasso): [0.017, 0.036, 0.094, 0.69 ]]) >>> np.around(cov.location_, decimals=3) array([0.073, 0.04 , 0.038, 0.143]) + + For an example comparing :class:`sklearn.covariance.GraphicalLassoCV`, + :func:`sklearn.covariance.ledoit_wolf` shrinkage and the empirical covariance + on high-dimensional gaussian data, see + :ref:`sphx_glr_auto_examples_covariance_plot_sparse_cov.py`. """ _parameter_constraints: dict = { From f29c100941c6fb1554fe123c797cf716b52d7ae6 Mon Sep 17 00:00:00 2001 From: ash <99674179+ashbleu@users.noreply.github.com> Date: Tue, 6 May 2025 12:47:56 +0100 Subject: [PATCH 127/182] DOC add link to plot_gpr_on_structured_data example in gaussian_process (#31150) Co-authored-by: adrinjalali --- doc/modules/gaussian_process.rst | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/doc/modules/gaussian_process.rst b/doc/modules/gaussian_process.rst index 4990649624f18..4bbc2e7824136 100644 --- a/doc/modules/gaussian_process.rst +++ b/doc/modules/gaussian_process.rst @@ -236,8 +236,10 @@ translations in the input space, while non-stationary kernels depend also on the specific values of the datapoints. Stationary kernels can further be subdivided into isotropic and anisotropic kernels, where isotropic kernels are also invariant to rotations in the input space. For more details, we refer to -Chapter 4 of [RW2006]_. For guidance on how to best combine different kernels, -we refer to [Duv2014]_. +Chapter 4 of [RW2006]_. :ref:`This example +` +shows how to define a custom kernel over discrete data. For guidance on how to best +combine different kernels, we refer to [Duv2014]_. .. dropdown:: Gaussian Process Kernel API From b55aba5466f241c401df01285539a2fce69c6a17 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Miguel=20Gonz=C3=A1lez=20Duque?= Date: Tue, 6 May 2025 14:07:39 +0200 Subject: [PATCH 128/182] ENH Exposes latent mean and variance for GPCs (#22227) Co-authored-by: antoinebaker --- doc/modules/gaussian_process.rst | 9 +- .../22227.enhancement.rst | 1 + sklearn/gaussian_process/_gpc.py | 85 +++++++++++++++++-- sklearn/gaussian_process/tests/test_gpc.py | 35 ++++++++ 4 files changed, 119 insertions(+), 11 deletions(-) create mode 100644 doc/whats_new/upcoming_changes/sklearn.gaussian_process/22227.enhancement.rst diff --git a/doc/modules/gaussian_process.rst b/doc/modules/gaussian_process.rst index 4bbc2e7824136..46d04ac35d832 100644 --- a/doc/modules/gaussian_process.rst +++ b/doc/modules/gaussian_process.rst @@ -106,11 +106,11 @@ The :class:`GaussianProcessClassifier` implements Gaussian processes (GP) for classification purposes, more specifically for probabilistic classification, where test predictions take the form of class probabilities. GaussianProcessClassifier places a GP prior on a latent function :math:`f`, -which is then squashed through a link function to obtain the probabilistic +which is then squashed through a link function :math:`\pi` to obtain the probabilistic classification. The latent function :math:`f` is a so-called nuisance function, whose values are not observed and are not relevant by themselves. Its purpose is to allow a convenient formulation of the model, and :math:`f` -is removed (integrated out) during prediction. GaussianProcessClassifier +is removed (integrated out) during prediction. :class:`GaussianProcessClassifier` implements the logistic link function, for which the integral cannot be computed analytically but is easily approximated in the binary case. @@ -134,6 +134,11 @@ that have been chosen randomly from the range of allowed values. If the initial hyperparameters should be kept fixed, `None` can be passed as optimizer. +In some scenarios, information about the latent function :math:`f` is desired +(i.e. the mean :math:`\bar{f_*}` and the variance :math:`\text{Var}[f_*]` described +in Eqs. (3.21) and (3.24) of [RW2006]_). The :class:`GaussianProcessClassifier` +provides access to these quantities via the `latent_mean_and_variance` method. + :class:`GaussianProcessClassifier` supports multi-class classification by performing either one-versus-rest or one-versus-one based training and prediction. In one-versus-rest, one binary Gaussian process classifier is diff --git a/doc/whats_new/upcoming_changes/sklearn.gaussian_process/22227.enhancement.rst b/doc/whats_new/upcoming_changes/sklearn.gaussian_process/22227.enhancement.rst new file mode 100644 index 0000000000000..bcc9825f30978 --- /dev/null +++ b/doc/whats_new/upcoming_changes/sklearn.gaussian_process/22227.enhancement.rst @@ -0,0 +1 @@ +- :class:`gaussian_process.GaussianProcessClassifier` now includes a `latent_mean_and_variance` method that exposes the mean and the variance of the latent function, :math:`f`, used in the Laplace approximation. By :user:`Miguel González Duque ` diff --git a/sklearn/gaussian_process/_gpc.py b/sklearn/gaussian_process/_gpc.py index b923e09bcd8eb..64abceaf781a9 100644 --- a/sklearn/gaussian_process/_gpc.py +++ b/sklearn/gaussian_process/_gpc.py @@ -306,12 +306,9 @@ def predict_proba(self, X): """ check_is_fitted(self) - # Based on Algorithm 3.2 of GPML - K_star = self.kernel_(self.X_train_, X) # K_star =k(x_star) - f_star = K_star.T.dot(self.y_train_ - self.pi_) # Line 4 - v = solve(self.L_, self.W_sr_[:, np.newaxis] * K_star) # Line 5 - # Line 6 (compute np.diag(v.T.dot(v)) via einsum) - var_f_star = self.kernel_.diag(X) - np.einsum("ij,ij->j", v, v) + # Compute the mean and variance of the latent function + # (Lines 4-6 of Algorithm 3.2 of GPML) + latent_mean, latent_var = self.latent_mean_and_variance(X) # Line 7: # Approximate \int log(z) * N(z | f_star, var_f_star) @@ -320,12 +317,12 @@ def predict_proba(self, X): # sigmoid by a linear combination of 5 error functions. # For information on how this integral can be computed see # blitiri.blogspot.de/2012/11/gaussian-integral-of-error-function.html - alpha = 1 / (2 * var_f_star) - gamma = LAMBDAS * f_star + alpha = 1 / (2 * latent_var) + gamma = LAMBDAS * latent_mean integrals = ( np.sqrt(np.pi / alpha) * erf(gamma * np.sqrt(alpha / (alpha + LAMBDAS**2))) - / (2 * np.sqrt(var_f_star * 2 * np.pi)) + / (2 * np.sqrt(latent_var * 2 * np.pi)) ) pi_star = (COEFS * integrals).sum(axis=0) + 0.5 * COEFS.sum() @@ -410,6 +407,39 @@ def log_marginal_likelihood( return Z, d_Z + def latent_mean_and_variance(self, X): + """Compute the mean and variance of the latent function values. + + Based on algorithm 3.2 of [RW2006]_, this function returns the latent + mean (Line 4) and variance (Line 6) of the Gaussian process + classification model. + + Note that this function is only supported for binary classification. + + Parameters + ---------- + X : array-like of shape (n_samples, n_features) or list of object + Query points where the GP is evaluated for classification. + + Returns + ------- + latent_mean : array-like of shape (n_samples,) + Mean of the latent function values at the query points. + + latent_var : array-like of shape (n_samples,) + Variance of the latent function values at the query points. + """ + check_is_fitted(self) + + # Based on Algorithm 3.2 of GPML + K_star = self.kernel_(self.X_train_, X) # K_star =k(x_star) + latent_mean = K_star.T.dot(self.y_train_ - self.pi_) # Line 4 + v = solve(self.L_, self.W_sr_[:, np.newaxis] * K_star) # Line 5 + # Line 6 (compute np.diag(v.T.dot(v)) via einsum) + latent_var = self.kernel_.diag(X) - np.einsum("ij,ij->j", v, v) + + return latent_mean, latent_var + def _posterior_mode(self, K, return_temporaries=False): """Mode-finding for binary Laplace GPC and fixed kernel. @@ -902,3 +932,40 @@ def log_marginal_likelihood( "Obtained theta with shape %d." % (n_dims, n_dims * self.classes_.shape[0], theta.shape[0]) ) + + def latent_mean_and_variance(self, X): + """Compute the mean and variance of the latent function. + + Based on algorithm 3.2 of [RW2006]_, this function returns the latent + mean (Line 4) and variance (Line 6) of the Gaussian process + classification model. + + Note that this function is only supported for binary classification. + + Parameters + ---------- + X : array-like of shape (n_samples, n_features) or list of object + Query points where the GP is evaluated for classification. + + Returns + ------- + latent_mean : array-like of shape (n_samples,) + Mean of the latent function values at the query points. + + latent_var : array-like of shape (n_samples,) + Variance of the latent function values at the query points. + """ + if self.n_classes_ > 2: + raise ValueError( + "Returning the mean and variance of the latent function f " + "is only supported for binary classification, received " + f"{self.n_classes_} classes." + ) + check_is_fitted(self) + + if self.kernel is None or self.kernel.requires_vector_input: + X = validate_data(self, X, ensure_2d=True, dtype="numeric", reset=False) + else: + X = validate_data(self, X, ensure_2d=False, dtype=None, reset=False) + + return self.base_estimator_.latent_mean_and_variance(X) diff --git a/sklearn/gaussian_process/tests/test_gpc.py b/sklearn/gaussian_process/tests/test_gpc.py index 4bd437df34967..365b8f5a11441 100644 --- a/sklearn/gaussian_process/tests/test_gpc.py +++ b/sklearn/gaussian_process/tests/test_gpc.py @@ -283,3 +283,38 @@ def test_gpc_fit_error(params, error_type, err_msg): gpc = GaussianProcessClassifier(**params) with pytest.raises(error_type, match=err_msg): gpc.fit(X, y) + + +@pytest.mark.parametrize("kernel", kernels) +def test_gpc_latent_mean_and_variance_shape(kernel): + """Checks that the latent mean and variance have the right shape.""" + gpc = GaussianProcessClassifier(kernel=kernel) + gpc.fit(X, y) + + # Check that the latent mean and variance have the right shape + latent_mean, latent_variance = gpc.latent_mean_and_variance(X) + assert latent_mean.shape == (X.shape[0],) + assert latent_variance.shape == (X.shape[0],) + + +def test_gpc_latent_mean_and_variance_complain_on_more_than_2_classes(): + """Checks that the latent mean and variance have the right shape.""" + gpc = GaussianProcessClassifier(kernel=RBF()) + gpc.fit(X, y_mc) + + # Check that the latent mean and variance have the right shape + with pytest.raises( + ValueError, + match="Returning the mean and variance of the latent function f " + "is only supported for binary classification", + ): + gpc.latent_mean_and_variance(X) + + +def test_latent_mean_and_variance_works_on_structured_kernels(): + X = ["A", "AB", "B"] + y = np.array([True, False, True]) + kernel = MiniSeqKernel(baseline_similarity_bounds="fixed") + gpc = GaussianProcessClassifier(kernel=kernel).fit(X, y) + + gpc.latent_mean_and_variance(X) From 2b2da858f9b82abd8d74a7f66b67cfdaf5abd4b9 Mon Sep 17 00:00:00 2001 From: Adrin Jalali Date: Tue, 6 May 2025 14:57:22 +0200 Subject: [PATCH 129/182] DOC add versionadded directive to new method in GPC (#31320) --- sklearn/gaussian_process/_gpc.py | 2 ++ 1 file changed, 2 insertions(+) diff --git a/sklearn/gaussian_process/_gpc.py b/sklearn/gaussian_process/_gpc.py index 64abceaf781a9..0ecceb47de905 100644 --- a/sklearn/gaussian_process/_gpc.py +++ b/sklearn/gaussian_process/_gpc.py @@ -942,6 +942,8 @@ def latent_mean_and_variance(self, X): Note that this function is only supported for binary classification. + .. versionadded:: 1.7 + Parameters ---------- X : array-like of shape (n_samples, n_features) or list of object From 7a88bf1cd4c05ee0fc1d93d235ddf315378bc0dd Mon Sep 17 00:00:00 2001 From: Mohamed Ali SRIR <107807424+metlouf@users.noreply.github.com> Date: Tue, 6 May 2025 17:31:49 +0200 Subject: [PATCH 130/182] DOC Add reference to CalibrationDisplay from calibration_curve's docstring (#31312) --- sklearn/calibration.py | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/sklearn/calibration.py b/sklearn/calibration.py index a2b145536eca6..70337f8c82be4 100644 --- a/sklearn/calibration.py +++ b/sklearn/calibration.py @@ -1005,6 +1005,13 @@ def calibration_curve( prob_pred : ndarray of shape (n_bins,) or smaller The mean predicted probability in each bin. + See Also + -------- + CalibrationDisplay.from_predictions : Plot calibration curve using true + and predicted labels. + CalibrationDisplay.from_estimator : Plot calibration curve using an + estimator and data. + References ---------- Alexandru Niculescu-Mizil and Rich Caruana (2005) Predicting Good From 81bb708dc4c218f801b11fa2751c51e2ba3715b8 Mon Sep 17 00:00:00 2001 From: Christian Lorentzen Date: Wed, 7 May 2025 11:26:11 +0200 Subject: [PATCH 131/182] FIX _safe_indexing for pyarrow (#31040) --- .../sklearn.utils/31040.enhancement.rst | 4 + sklearn/utils/_indexing.py | 78 +++++++++++++++++-- sklearn/utils/_testing.py | 4 + sklearn/utils/tests/test_indexing.py | 39 +++++++--- sklearn/utils/tests/test_testing.py | 16 +++- sklearn/utils/validation.py | 9 +++ 6 files changed, 133 insertions(+), 17 deletions(-) create mode 100644 doc/whats_new/upcoming_changes/sklearn.utils/31040.enhancement.rst diff --git a/doc/whats_new/upcoming_changes/sklearn.utils/31040.enhancement.rst b/doc/whats_new/upcoming_changes/sklearn.utils/31040.enhancement.rst new file mode 100644 index 0000000000000..096a98cb176bc --- /dev/null +++ b/doc/whats_new/upcoming_changes/sklearn.utils/31040.enhancement.rst @@ -0,0 +1,4 @@ +- The private helper function :func:`utils._safe_indexing` now officially supports + pyarrow data. For instance, passing a pyarrow `Table` as `X` in a + :class:`compose.ColumnTransformer` is now possible. + By :user:`Christian Lorentzen ` diff --git a/sklearn/utils/_indexing.py b/sklearn/utils/_indexing.py index eadfdf9a6e0fa..09427376a4059 100644 --- a/sklearn/utils/_indexing.py +++ b/sklearn/utils/_indexing.py @@ -18,6 +18,7 @@ _is_arraylike_not_scalar, _is_pandas_df, _is_polars_df_or_series, + _is_pyarrow_data, _use_interchange_protocol, check_array, check_consistent_length, @@ -65,7 +66,7 @@ def _list_indexing(X, key, key_dtype): def _polars_indexing(X, key, key_dtype, axis): - """Indexing X with polars interchange protocol.""" + """Index a polars dataframe or series.""" # Polars behavior is more consistent with lists if isinstance(key, np.ndarray): # Convert each element of the array to a Python scalar @@ -93,6 +94,55 @@ def _polars_indexing(X, key, key_dtype, axis): return X_indexed +def _pyarrow_indexing(X, key, key_dtype, axis): + """Index a pyarrow data.""" + scalar_key = np.isscalar(key) + if isinstance(key, slice): + if isinstance(key.stop, str): + start = X.column_names.index(key.start) + stop = X.column_names.index(key.stop) + 1 + else: + start = 0 if not key.start else key.start + stop = key.stop + step = 1 if not key.step else key.step + key = list(range(start, stop, step)) + + if axis == 1: + # Here we are certain that X is a pyarrow Table or RecordBatch. + if key_dtype == "int" and not isinstance(key, list): + # pyarrow's X.select behavior is more consistent with integer lists. + key = np.asarray(key).tolist() + if key_dtype == "bool": + key = np.asarray(key).nonzero()[0].tolist() + + if scalar_key: + return X.column(key) + + return X.select(key) + + # axis == 0 from here on + if scalar_key: + if hasattr(X, "shape"): + # X is a Table or RecordBatch + key = [key] + else: + return X[key].as_py() + elif not isinstance(key, list): + key = np.asarray(key) + + if key_dtype == "bool": + X_indexed = X.filter(key) + else: + X_indexed = X.take(key) + + if scalar_key and len(getattr(X, "shape", [0])) == 2: + # X_indexed is a dataframe-like with a single row; we return a Series to be + # consistent with pandas + pa = sys.modules["pyarrow"] + return pa.array(X_indexed.to_pylist()[0].values()) + return X_indexed + + def _determine_key_type(key, accept_slice=True): """Determine the data type of key. @@ -245,11 +295,11 @@ def _safe_indexing(X, indices, *, axis=0): if axis == 1 and isinstance(X, list): raise ValueError("axis=1 is not supported for lists") - if axis == 1 and hasattr(X, "shape") and len(X.shape) != 2: + if axis == 1 and (ndim := len(getattr(X, "shape", [0]))) != 2: raise ValueError( "'X' should be a 2D NumPy array, 2D sparse matrix or " "dataframe when indexing the columns (i.e. 'axis=1'). " - "Got {} instead with {} dimension(s).".format(type(X), len(X.shape)) + f"Got {type(X)} instead with {ndim} dimension(s)." ) if ( @@ -262,12 +312,28 @@ def _safe_indexing(X, indices, *, axis=0): ) if hasattr(X, "iloc"): - # TODO: we should probably use _is_pandas_df_or_series(X) instead but this - # would require updating some tests such as test_train_test_split_mock_pandas. + # TODO: we should probably use _is_pandas_df_or_series(X) instead but: + # 1) Currently, it (probably) works for dataframes compliant to pandas' API. + # 2) Updating would require updating some tests such as + # test_train_test_split_mock_pandas. return _pandas_indexing(X, indices, indices_dtype, axis=axis) elif _is_polars_df_or_series(X): return _polars_indexing(X, indices, indices_dtype, axis=axis) - elif hasattr(X, "shape"): + elif _is_pyarrow_data(X): + return _pyarrow_indexing(X, indices, indices_dtype, axis=axis) + elif _use_interchange_protocol(X): # pragma: no cover + # Once the dataframe X is converted into its dataframe interchange protocol + # version by calling X.__dataframe__(), it becomes very hard to turn it back + # into its original type, e.g., a pyarrow.Table, see + # https://github.com/data-apis/dataframe-api/issues/85. + raise warnings.warn( + message="A data object with support for the dataframe interchange protocol" + "was passed, but scikit-learn does currently not know how to handle this " + "kind of data. Some array/list indexing will be tried.", + category=UserWarning, + ) + + if hasattr(X, "shape"): return _array_indexing(X, indices, indices_dtype, axis=axis) else: return _list_indexing(X, indices, indices_dtype) diff --git a/sklearn/utils/_testing.py b/sklearn/utils/_testing.py index edf36ff882612..6582bb763641e 100644 --- a/sklearn/utils/_testing.py +++ b/sklearn/utils/_testing.py @@ -1021,6 +1021,7 @@ def _convert_container( elif constructor_name == "pyarrow": pa = pytest.importorskip("pyarrow", minversion=minversion) array = np.asarray(container) + array = array[:, None] if array.ndim == 1 else array if columns_name is None: columns_name = [f"col{i}" for i in range(array.shape[1])] data = {name: array[:, i] for i, name in enumerate(columns_name)} @@ -1042,6 +1043,9 @@ def _convert_container( elif constructor_name == "series": pd = pytest.importorskip("pandas", minversion=minversion) return pd.Series(container, dtype=dtype) + elif constructor_name == "pyarrow_array": + pa = pytest.importorskip("pyarrow", minversion=minversion) + return pa.array(container) elif constructor_name == "polars_series": pl = pytest.importorskip("polars", minversion=minversion) return pl.Series(values=container) diff --git a/sklearn/utils/tests/test_indexing.py b/sklearn/utils/tests/test_indexing.py index 61feee2304723..f7127638d6abb 100644 --- a/sklearn/utils/tests/test_indexing.py +++ b/sklearn/utils/tests/test_indexing.py @@ -134,7 +134,7 @@ def test_determine_key_type_array_api(array_namespace, device, dtype_name): @pytest.mark.parametrize( - "array_type", ["list", "array", "sparse", "dataframe", "polars"] + "array_type", ["list", "array", "sparse", "dataframe", "polars", "pyarrow"] ) @pytest.mark.parametrize("indices_type", ["list", "tuple", "array", "series", "slice"]) def test_safe_indexing_2d_container_axis_0(array_type, indices_type): @@ -149,7 +149,9 @@ def test_safe_indexing_2d_container_axis_0(array_type, indices_type): ) -@pytest.mark.parametrize("array_type", ["list", "array", "series", "polars_series"]) +@pytest.mark.parametrize( + "array_type", ["list", "array", "series", "polars_series", "pyarrow_array"] +) @pytest.mark.parametrize("indices_type", ["list", "tuple", "array", "series", "slice"]) def test_safe_indexing_1d_container(array_type, indices_type): indices = [1, 2] @@ -161,7 +163,9 @@ def test_safe_indexing_1d_container(array_type, indices_type): assert_allclose_dense_sparse(subset, _convert_container([2, 3], array_type)) -@pytest.mark.parametrize("array_type", ["array", "sparse", "dataframe", "polars"]) +@pytest.mark.parametrize( + "array_type", ["array", "sparse", "dataframe", "polars", "pyarrow"] +) @pytest.mark.parametrize("indices_type", ["list", "tuple", "array", "series", "slice"]) @pytest.mark.parametrize("indices", [[1, 2], ["col_1", "col_2"]]) def test_safe_indexing_2d_container_axis_1(array_type, indices_type, indices): @@ -177,7 +181,7 @@ def test_safe_indexing_2d_container_axis_1(array_type, indices_type, indices): ) indices_converted = _convert_container(indices_converted, indices_type) - if isinstance(indices[0], str) and array_type not in ("dataframe", "polars"): + if isinstance(indices[0], str) and array_type in ("array", "sparse"): err_msg = ( "Specifying the columns using strings is only supported for dataframes" ) @@ -192,7 +196,9 @@ def test_safe_indexing_2d_container_axis_1(array_type, indices_type, indices): @pytest.mark.parametrize("array_read_only", [True, False]) @pytest.mark.parametrize("indices_read_only", [True, False]) -@pytest.mark.parametrize("array_type", ["array", "sparse", "dataframe", "polars"]) +@pytest.mark.parametrize( + "array_type", ["array", "sparse", "dataframe", "polars", "pyarrow"] +) @pytest.mark.parametrize("indices_type", ["array", "series"]) @pytest.mark.parametrize( "axis, expected_array", [(0, [[4, 5, 6], [7, 8, 9]]), (1, [[2, 3], [5, 6], [8, 9]])] @@ -212,7 +218,9 @@ def test_safe_indexing_2d_read_only_axis_1( assert_allclose_dense_sparse(subset, _convert_container(expected_array, array_type)) -@pytest.mark.parametrize("array_type", ["list", "array", "series", "polars_series"]) +@pytest.mark.parametrize( + "array_type", ["list", "array", "series", "polars_series", "pyarrow_array"] +) @pytest.mark.parametrize("indices_type", ["list", "tuple", "array", "series"]) def test_safe_indexing_1d_container_mask(array_type, indices_type): indices = [False] + [True] * 2 + [False] * 6 @@ -222,7 +230,9 @@ def test_safe_indexing_1d_container_mask(array_type, indices_type): assert_allclose_dense_sparse(subset, _convert_container([2, 3], array_type)) -@pytest.mark.parametrize("array_type", ["array", "sparse", "dataframe", "polars"]) +@pytest.mark.parametrize( + "array_type", ["array", "sparse", "dataframe", "polars", "pyarrow"] +) @pytest.mark.parametrize("indices_type", ["list", "tuple", "array", "series"]) @pytest.mark.parametrize( "axis, expected_subset", @@ -250,6 +260,7 @@ def test_safe_indexing_2d_mask(array_type, indices_type, axis, expected_subset): ("sparse", "sparse"), ("dataframe", "series"), ("polars", "polars_series"), + ("pyarrow", "pyarrow_array"), ], ) def test_safe_indexing_2d_scalar_axis_0(array_type, expected_output_type): @@ -260,7 +271,9 @@ def test_safe_indexing_2d_scalar_axis_0(array_type, expected_output_type): assert_allclose_dense_sparse(subset, expected_array) -@pytest.mark.parametrize("array_type", ["list", "array", "series", "polars_series"]) +@pytest.mark.parametrize( + "array_type", ["list", "array", "series", "polars_series", "pyarrow_array"] +) def test_safe_indexing_1d_scalar(array_type): array = _convert_container([1, 2, 3, 4, 5, 6, 7, 8, 9], array_type) indices = 2 @@ -275,6 +288,7 @@ def test_safe_indexing_1d_scalar(array_type): ("sparse", "sparse"), ("dataframe", "series"), ("polars", "polars_series"), + ("pyarrow", "pyarrow_array"), ], ) @pytest.mark.parametrize("indices", [2, "col_2"]) @@ -284,7 +298,7 @@ def test_safe_indexing_2d_scalar_axis_1(array_type, expected_output_type, indice [[1, 2, 3], [4, 5, 6], [7, 8, 9]], array_type, columns_name ) - if isinstance(indices, str) and array_type not in ("dataframe", "polars"): + if isinstance(indices, str) and array_type in ("array", "sparse"): err_msg = ( "Specifying the columns using strings is only supported for dataframes" ) @@ -321,7 +335,9 @@ def test_safe_indexing_error_axis(axis): _safe_indexing(X_toy, [0, 1], axis=axis) -@pytest.mark.parametrize("X_constructor", ["array", "series", "polars_series"]) +@pytest.mark.parametrize( + "X_constructor", ["array", "series", "polars_series", "pyarrow_array"] +) def test_safe_indexing_1d_array_error(X_constructor): # check that we are raising an error if the array-like passed is 1D and # we try to index on the 2nd dimension @@ -334,6 +350,9 @@ def test_safe_indexing_1d_array_error(X_constructor): elif X_constructor == "polars_series": pl = pytest.importorskip("polars") X_constructor = pl.Series(values=X) + elif X_constructor == "pyarrow_array": + pa = pytest.importorskip("pyarrow") + X_constructor = pa.array(X) err_msg = "'X' should be a 2D NumPy array, 2D sparse matrix or dataframe" with pytest.raises(ValueError, match=err_msg): diff --git a/sklearn/utils/tests/test_testing.py b/sklearn/utils/tests/test_testing.py index f4ffa75e5f89f..ae9c380941c8c 100644 --- a/sklearn/utils/tests/test_testing.py +++ b/sklearn/utils/tests/test_testing.py @@ -896,6 +896,10 @@ def test_create_memmap_backed_data(monkeypatch): ("dataframe", lambda: pytest.importorskip("pandas").DataFrame), ("series", lambda: pytest.importorskip("pandas").Series), ("index", lambda: pytest.importorskip("pandas").Index), + ("pyarrow", lambda: pytest.importorskip("pyarrow").Table), + ("pyarrow_array", lambda: pytest.importorskip("pyarrow").Array), + ("polars", lambda: pytest.importorskip("polars").DataFrame), + ("polars_series", lambda: pytest.importorskip("polars").Series), ("slice", slice), ], ) @@ -916,7 +920,15 @@ def test_convert_container( ): """Check that we convert the container to the right type of array with the right data type.""" - if constructor_name in ("dataframe", "polars", "series", "polars_series", "index"): + if constructor_name in ( + "dataframe", + "index", + "polars", + "polars_series", + "pyarrow", + "pyarrow_array", + "series", + ): # delay the import of pandas/polars within the function to only skip this test # instead of the whole file container_type = container_type() @@ -933,6 +945,8 @@ def test_convert_container( # list and tuple will use Python class dtype: int, float # pandas index will always use high precision: np.int64 and np.float64 assert np.issubdtype(type(container_converted[0]), superdtype) + elif constructor_name in ("polars", "polars_series", "pyarrow", "pyarrow_array"): + return elif hasattr(container_converted, "dtype"): assert container_converted.dtype == dtype elif hasattr(container_converted, "dtypes"): diff --git a/sklearn/utils/validation.py b/sklearn/utils/validation.py index 8173c431bd930..324827323168a 100644 --- a/sklearn/utils/validation.py +++ b/sklearn/utils/validation.py @@ -2348,6 +2348,15 @@ def _is_pandas_df(X): return isinstance(X, pd.DataFrame) +def _is_pyarrow_data(X): + """Return True if the X is a pyarrow Table, RecordBatch, Array or ChunkedArray.""" + try: + pa = sys.modules["pyarrow"] + except KeyError: + return False + return isinstance(X, (pa.Table, pa.RecordBatch, pa.Array, pa.ChunkedArray)) + + def _is_polars_df_or_series(X): """Return True if the X is a polars dataframe or series.""" try: From bdef5aa4245278046b4e3854f10de5c1db2d28d6 Mon Sep 17 00:00:00 2001 From: Vasco Pereira Date: Wed, 7 May 2025 11:22:16 +0100 Subject: [PATCH 132/182] Fix ElasticNet l1 ratio fails for float-only arrays (#31107) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Co-authored-by: Jérémie du Boisberranger --- .../sklearn.feature_selection/31107.fix.rst | 4 ++++ sklearn/feature_selection/_from_model.py | 15 +++++++++++---- .../feature_selection/tests/test_from_model.py | 17 ++++++++++++++++- 3 files changed, 31 insertions(+), 5 deletions(-) create mode 100644 doc/whats_new/upcoming_changes/sklearn.feature_selection/31107.fix.rst diff --git a/doc/whats_new/upcoming_changes/sklearn.feature_selection/31107.fix.rst b/doc/whats_new/upcoming_changes/sklearn.feature_selection/31107.fix.rst new file mode 100644 index 0000000000000..b5ca4ab283434 --- /dev/null +++ b/doc/whats_new/upcoming_changes/sklearn.feature_selection/31107.fix.rst @@ -0,0 +1,4 @@ +- :class:`feature_selection.SelectFromModel` now correctly works when the estimator + is an instance of :class:`linear_model.ElasticNetCV` with its `l1_ratio` parameter + being an array-like. + By :user:`Vasco Pereira `. diff --git a/sklearn/feature_selection/_from_model.py b/sklearn/feature_selection/_from_model.py index d73b53eea647e..92654821c9dff 100644 --- a/sklearn/feature_selection/_from_model.py +++ b/sklearn/feature_selection/_from_model.py @@ -35,11 +35,18 @@ def _calculate_threshold(estimator, importances, threshold): est_name = estimator.__class__.__name__ is_l1_penalized = hasattr(estimator, "penalty") and estimator.penalty == "l1" is_lasso = "Lasso" in est_name - is_elasticnet_l1_penalized = "ElasticNet" in est_name and ( - (hasattr(estimator, "l1_ratio_") and np.isclose(estimator.l1_ratio_, 1.0)) - or (hasattr(estimator, "l1_ratio") and np.isclose(estimator.l1_ratio, 1.0)) + is_elasticnet_l1_penalized = est_name == "ElasticNet" and ( + hasattr(estimator, "l1_ratio") and np.isclose(estimator.l1_ratio, 1.0) ) - if is_l1_penalized or is_lasso or is_elasticnet_l1_penalized: + is_elasticnetcv_l1_penalized = est_name == "ElasticNetCV" and ( + hasattr(estimator, "l1_ratio_") and np.isclose(estimator.l1_ratio_, 1.0) + ) + if ( + is_l1_penalized + or is_lasso + or is_elasticnet_l1_penalized + or is_elasticnetcv_l1_penalized + ): # the natural default threshold is 0 when l1 penalty was used threshold = 1e-5 else: diff --git a/sklearn/feature_selection/tests/test_from_model.py b/sklearn/feature_selection/tests/test_from_model.py index 421f575c92a0e..17bedf44748fb 100644 --- a/sklearn/feature_selection/tests/test_from_model.py +++ b/sklearn/feature_selection/tests/test_from_model.py @@ -8,7 +8,7 @@ from sklearn import datasets from sklearn.base import BaseEstimator from sklearn.cross_decomposition import CCA, PLSCanonical, PLSRegression -from sklearn.datasets import make_friedman1 +from sklearn.datasets import make_friedman1, make_regression from sklearn.decomposition import PCA from sklearn.ensemble import HistGradientBoostingClassifier, RandomForestClassifier from sklearn.exceptions import NotFittedError @@ -489,6 +489,21 @@ def test_prefit_max_features(): model.transform(data) +def test_get_feature_names_out_elasticnetcv(): + """Check if ElasticNetCV works with a list of floats. + + Non-regression test for #30936.""" + X, y = make_regression(n_features=5, n_informative=3, random_state=0) + estimator = ElasticNetCV(l1_ratio=[0.25, 0.5, 0.75], random_state=0) + selector = SelectFromModel(estimator=estimator) + selector.fit(X, y) + + names_out = selector.get_feature_names_out() + mask = selector.get_support() + expected = np.array([f"x{i}" for i in range(X.shape[1])])[mask] + assert_array_equal(names_out, expected) + + def test_prefit_get_feature_names_out(): """Check the interaction between prefit and the feature names.""" clf = RandomForestClassifier(n_estimators=2, random_state=0) From 75c7bc0d7cba290b7f66abebafb96caf09981ab2 Mon Sep 17 00:00:00 2001 From: Mounir Lbath <100532921+mounirLbath@users.noreply.github.com> Date: Wed, 7 May 2025 17:23:07 +0200 Subject: [PATCH 133/182] DOC add reference to "Visualizations" in user doc guide from "PartialDependenceDisplay" docstring. (#31313) --- sklearn/inspection/_plot/partial_dependence.py | 10 +++++++--- 1 file changed, 7 insertions(+), 3 deletions(-) diff --git a/sklearn/inspection/_plot/partial_dependence.py b/sklearn/inspection/_plot/partial_dependence.py index 400084d588f67..bf4975cdfd2d9 100644 --- a/sklearn/inspection/_plot/partial_dependence.py +++ b/sklearn/inspection/_plot/partial_dependence.py @@ -35,9 +35,13 @@ class PartialDependenceDisplay: :class:`~sklearn.inspection.PartialDependenceDisplay`. All parameters are stored as attributes. - Read more in - :ref:`sphx_glr_auto_examples_miscellaneous_plot_partial_dependence_visualization_api.py` - and the :ref:`User Guide `. + For general information regarding `scikit-learn` visualization tools, see + the :ref:`Visualization Guide `. + For guidance on interpreting these plots, refer to the + :ref:`Partial Dependence and ICE plots `. + + For an example on how to use this class, see the following example: + :ref:`sphx_glr_auto_examples_miscellaneous_plot_partial_dependence_visualization_api.py`. .. versionadded:: 0.22 From 07248004ae13bf361afed2619efa56b838674ed9 Mon Sep 17 00:00:00 2001 From: Achraf Tasfaout <78175662+AchrafTasfaout@users.noreply.github.com> Date: Wed, 7 May 2025 17:40:56 +0200 Subject: [PATCH 134/182] DOC Link PrecisionRecallDisplay to visualization and evaluation guides (#31308) --- sklearn/metrics/_plot/precision_recall_curve.py | 15 ++++++++++++++- 1 file changed, 14 insertions(+), 1 deletion(-) diff --git a/sklearn/metrics/_plot/precision_recall_curve.py b/sklearn/metrics/_plot/precision_recall_curve.py index 502b7cb9c7ff3..286fc26d0e208 100644 --- a/sklearn/metrics/_plot/precision_recall_curve.py +++ b/sklearn/metrics/_plot/precision_recall_curve.py @@ -20,7 +20,10 @@ class PrecisionRecallDisplay(_BinaryClassifierCurveDisplayMixin): a :class:`~sklearn.metrics.PrecisionRecallDisplay`. All parameters are stored as attributes. - Read more in the :ref:`User Guide `. + For general information regarding `scikit-learn` visualization tools, see + the :ref:`Visualization Guide `. + For guidance on interpreting these plots, refer to the :ref:`Model + Evaluation Guide `. Parameters ---------- @@ -276,6 +279,11 @@ def from_estimator( ): """Plot precision-recall curve given an estimator and some data. + For general information regarding `scikit-learn` visualization tools, see + the :ref:`Visualization Guide `. + For guidance on interpreting these plots, refer to the :ref:`Model + Evaluation Guide `. + Parameters ---------- estimator : estimator instance @@ -416,6 +424,11 @@ def from_predictions( ): """Plot precision-recall curve given binary class predictions. + For general information regarding `scikit-learn` visualization tools, see + the :ref:`Visualization Guide `. + For guidance on interpreting these plots, refer to the :ref:`Model + Evaluation Guide `. + Parameters ---------- y_true : array-like of shape (n_samples,) From f44350d45750a63969411534ecd8c6e7be21010f Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Lo=C3=AFc=20Est=C3=A8ve?= Date: Wed, 7 May 2025 18:06:21 +0200 Subject: [PATCH 135/182] MNT Remove ellipsis from doctests (#31332) --- doc/modules/classification_threshold.rst | 8 +- doc/modules/clustering.rst | 50 +++---- doc/modules/compose.rst | 14 +- doc/modules/cross_validation.rst | 18 +-- doc/modules/ensemble.rst | 29 ++-- doc/modules/feature_extraction.rst | 2 +- doc/modules/feature_selection.rst | 2 +- doc/modules/impute.rst | 2 +- doc/modules/learning_curve.rst | 24 ++-- doc/modules/linear_model.rst | 8 +- doc/modules/model_evaluation.rst | 124 +++++++++--------- doc/modules/neural_networks_supervised.rst | 4 +- doc/modules/preprocessing.rst | 44 +++---- doc/modules/sgd.rst | 8 +- sklearn/calibration.py | 12 +- sklearn/cluster/_mean_shift.py | 6 +- sklearn/cluster/_optics.py | 6 +- sklearn/conftest.py | 1 + sklearn/covariance/_elliptic_envelope.py | 6 +- sklearn/covariance/_empirical_covariance.py | 6 +- sklearn/covariance/_graph_lasso.py | 6 +- sklearn/covariance/_robust_covariance.py | 6 +- sklearn/covariance/_shrunk_covariance.py | 40 +++--- sklearn/datasets/_samples_generator.py | 22 ++-- sklearn/decomposition/_dict_learning.py | 14 +- sklearn/decomposition/_pca.py | 12 +- sklearn/decomposition/_sparse_pca.py | 4 +- sklearn/decomposition/_truncated_svd.py | 6 +- sklearn/ensemble/_bagging.py | 2 +- sklearn/ensemble/_gb.py | 4 +- sklearn/ensemble/_voting.py | 2 +- sklearn/ensemble/_weight_boosting.py | 6 +- sklearn/feature_selection/_from_model.py | 4 +- sklearn/feature_selection/_mutual_info.py | 6 +- .../_univariate_selection.py | 22 ++-- sklearn/gaussian_process/_gpr.py | 2 +- sklearn/gaussian_process/kernels.py | 44 +++---- sklearn/impute/_iterative.py | 6 +- sklearn/inspection/_partial_dependence.py | 2 +- sklearn/inspection/_permutation_importance.py | 4 +- sklearn/isotonic.py | 6 +- sklearn/linear_model/_base.py | 2 +- sklearn/linear_model/_coordinate_descent.py | 34 ++--- sklearn/linear_model/_glm/glm.py | 24 ++-- sklearn/linear_model/_huber.py | 4 +- sklearn/linear_model/_least_angle.py | 30 ++--- sklearn/linear_model/_logistic.py | 6 +- sklearn/linear_model/_omp.py | 12 +- sklearn/linear_model/_ransac.py | 4 +- sklearn/linear_model/_ridge.py | 9 +- sklearn/linear_model/_theil_sen.py | 4 +- sklearn/metrics/_classification.py | 74 +++++------ sklearn/metrics/_ranking.py | 30 ++--- sklearn/metrics/cluster/_supervised.py | 24 ++-- sklearn/metrics/pairwise.py | 40 +++--- sklearn/mixture/_bayesian_mixture.py | 4 +- sklearn/model_selection/_search.py | 2 +- sklearn/model_selection/_validation.py | 2 +- sklearn/multioutput.py | 8 +- sklearn/neighbors/_classification.py | 2 +- sklearn/neighbors/_lof.py | 2 +- .../neural_network/_multilayer_perceptron.py | 6 +- sklearn/pipeline.py | 8 +- sklearn/preprocessing/_data.py | 22 ++-- .../preprocessing/_function_transformer.py | 4 +- sklearn/preprocessing/_target_encoder.py | 6 +- sklearn/random_projection.py | 2 +- sklearn/svm/_classes.py | 12 +- sklearn/tree/_classes.py | 12 +- sklearn/utils/extmath.py | 6 +- sklearn/utils/sparsefuncs.py | 2 +- 71 files changed, 497 insertions(+), 494 deletions(-) diff --git a/doc/modules/classification_threshold.rst b/doc/modules/classification_threshold.rst index ec0963d9da9a2..ee7028f469b5f 100644 --- a/doc/modules/classification_threshold.rst +++ b/doc/modules/classification_threshold.rst @@ -38,8 +38,8 @@ probability estimates :math:`P(y|X)` and class labels:: >>> classifier.predict_proba(X[:4]) array([[0.94 , 0.06 ], [0.94 , 0.06 ], - [0.0416..., 0.9583...], - [0.0416..., 0.9583...]]) + [0.0416, 0.9583], + [0.0416, 0.9583]]) >>> classifier.predict(X[:4]) array([0, 0, 1, 1]) @@ -112,10 +112,10 @@ a meaningful metric for their use case. >>> base_model = LogisticRegression() >>> model = TunedThresholdClassifierCV(base_model, scoring=scorer) >>> scorer(model.fit(X, y), X, y) - 0.88... + 0.88 >>> # compare it with the internal score found by cross-validation >>> model.best_score_ - np.float64(0.86...) + np.float64(0.86) Important notes regarding the internal cross-validation ------------------------------------------------------- diff --git a/doc/modules/clustering.rst b/doc/modules/clustering.rst index 6489d8f245201..cdf8421a103e3 100644 --- a/doc/modules/clustering.rst +++ b/doc/modules/clustering.rst @@ -1310,32 +1310,32 @@ ignoring permutations:: >>> labels_true = [0, 0, 0, 1, 1, 1] >>> labels_pred = [0, 0, 1, 1, 2, 2] >>> metrics.rand_score(labels_true, labels_pred) - 0.66... + 0.66 The Rand index does not ensure to obtain a value close to 0.0 for a random labelling. The adjusted Rand index **corrects for chance** and will give such a baseline. >>> metrics.adjusted_rand_score(labels_true, labels_pred) - 0.24... + 0.24 As with all clustering metrics, one can permute 0 and 1 in the predicted labels, rename 2 to 3, and get the same score:: >>> labels_pred = [1, 1, 0, 0, 3, 3] >>> metrics.rand_score(labels_true, labels_pred) - 0.66... + 0.66 >>> metrics.adjusted_rand_score(labels_true, labels_pred) - 0.24... + 0.24 Furthermore, both :func:`rand_score` and :func:`adjusted_rand_score` are **symmetric**: swapping the argument does not change the scores. They can thus be used as **consensus measures**:: >>> metrics.rand_score(labels_pred, labels_true) - 0.66... + 0.66 >>> metrics.adjusted_rand_score(labels_pred, labels_true) - 0.24... + 0.24 Perfect labeling is scored 1.0:: @@ -1353,9 +1353,9 @@ will not necessarily be close to zero:: >>> labels_true = [0, 0, 0, 0, 0, 0, 1, 1] >>> labels_pred = [0, 1, 2, 3, 4, 5, 5, 6] >>> metrics.rand_score(labels_true, labels_pred) - 0.39... + 0.39 >>> metrics.adjusted_rand_score(labels_true, labels_pred) - -0.07... + -0.072 .. topic:: Advantages: @@ -1466,21 +1466,21 @@ proposed more recently and is **normalized against chance**:: >>> labels_pred = [0, 0, 1, 1, 2, 2] >>> metrics.adjusted_mutual_info_score(labels_true, labels_pred) # doctest: +SKIP - 0.22504... + 0.22504 One can permute 0 and 1 in the predicted labels, rename 2 to 3 and get the same score:: >>> labels_pred = [1, 1, 0, 0, 3, 3] >>> metrics.adjusted_mutual_info_score(labels_true, labels_pred) # doctest: +SKIP - 0.22504... + 0.22504 All, :func:`mutual_info_score`, :func:`adjusted_mutual_info_score` and :func:`normalized_mutual_info_score` are symmetric: swapping the argument does not change the score. Thus they can be used as a **consensus measure**:: >>> metrics.adjusted_mutual_info_score(labels_pred, labels_true) # doctest: +SKIP - 0.22504... + 0.22504 Perfect labeling is scored 1.0:: @@ -1494,14 +1494,14 @@ Perfect labeling is scored 1.0:: This is not true for ``mutual_info_score``, which is therefore harder to judge:: >>> metrics.mutual_info_score(labels_true, labels_pred) # doctest: +SKIP - 0.69... + 0.69 Bad (e.g. independent labelings) have non-positive scores:: >>> labels_true = [0, 1, 2, 0, 3, 4, 5, 1] >>> labels_pred = [1, 1, 0, 0, 2, 2, 2, 2] >>> metrics.adjusted_mutual_info_score(labels_true, labels_pred) # doctest: +SKIP - -0.10526... + -0.10526 .. topic:: Advantages: @@ -1649,16 +1649,16 @@ We can turn those concept as scores :func:`homogeneity_score` and >>> labels_pred = [0, 0, 1, 1, 2, 2] >>> metrics.homogeneity_score(labels_true, labels_pred) - 0.66... + 0.66 >>> metrics.completeness_score(labels_true, labels_pred) - 0.42... + 0.42 Their harmonic mean called **V-measure** is computed by :func:`v_measure_score`:: >>> metrics.v_measure_score(labels_true, labels_pred) - 0.51... + 0.516 This function's formula is as follows: @@ -1667,12 +1667,12 @@ This function's formula is as follows: `beta` defaults to a value of 1.0, but for using a value less than 1 for beta:: >>> metrics.v_measure_score(labels_true, labels_pred, beta=0.6) - 0.54... + 0.547 more weight will be attributed to homogeneity, and using a value greater than 1:: >>> metrics.v_measure_score(labels_true, labels_pred, beta=1.8) - 0.48... + 0.48 more weight will be attributed to completeness. @@ -1683,14 +1683,14 @@ Homogeneity, completeness and V-measure can be computed at once using :func:`homogeneity_completeness_v_measure` as follows:: >>> metrics.homogeneity_completeness_v_measure(labels_true, labels_pred) - (0.66..., 0.42..., 0.51...) + (0.67, 0.42, 0.52) The following clustering assignment is slightly better, since it is homogeneous but not complete:: >>> labels_pred = [0, 0, 0, 1, 2, 2] >>> metrics.homogeneity_completeness_v_measure(labels_true, labels_pred) - (1.0, 0.68..., 0.81...) + (1.0, 0.68, 0.81) .. note:: @@ -1820,7 +1820,7 @@ between two clusters. >>> labels_pred = [0, 0, 1, 1, 2, 2] >>> metrics.fowlkes_mallows_score(labels_true, labels_pred) - 0.47140... + 0.47140 One can permute 0 and 1 in the predicted labels, rename 2 to 3 and get the same score:: @@ -1828,7 +1828,7 @@ the same score:: >>> labels_pred = [1, 1, 0, 0, 3, 3] >>> metrics.fowlkes_mallows_score(labels_true, labels_pred) - 0.47140... + 0.47140 Perfect labeling is scored 1.0:: @@ -1917,7 +1917,7 @@ cluster analysis. >>> kmeans_model = KMeans(n_clusters=3, random_state=1).fit(X) >>> labels = kmeans_model.labels_ >>> metrics.silhouette_score(X, labels, metric='euclidean') - 0.55... + 0.55 .. topic:: Advantages: @@ -1974,7 +1974,7 @@ cluster analysis: >>> kmeans_model = KMeans(n_clusters=3, random_state=1).fit(X) >>> labels = kmeans_model.labels_ >>> metrics.calinski_harabasz_score(X, labels) - 561.59... + 561.59 .. topic:: Advantages: @@ -2048,7 +2048,7 @@ cluster analysis as follows: >>> kmeans = KMeans(n_clusters=3, random_state=1).fit(X) >>> labels = kmeans.labels_ >>> davies_bouldin_score(X, labels) - 0.666... + 0.666 .. topic:: Advantages: diff --git a/doc/modules/compose.rst b/doc/modules/compose.rst index 3db1104602a5d..3ef0d94236aa6 100644 --- a/doc/modules/compose.rst +++ b/doc/modules/compose.rst @@ -504,10 +504,10 @@ on data type or column name:: ... OneHotEncoder(), ... make_column_selector(pattern='city', dtype_include=object))]) >>> ct.fit_transform(X) - array([[ 0.904..., 0. , 1. , 0. , 0. ], - [-1.507..., 1.414..., 1. , 0. , 0. ], - [-0.301..., 0. , 0. , 1. , 0. ], - [ 0.904..., -1.414..., 0. , 0. , 1. ]]) + array([[ 0.904, 0. , 1. , 0. , 0. ], + [-1.507, 1.414, 1. , 0. , 0. ], + [-0.301, 0. , 0. , 1. , 0. ], + [ 0.904, -1.414, 0. , 0. , 1. ]]) Strings can reference columns if the input is a DataFrame, integers are always interpreted as the positional columns. @@ -571,9 +571,9 @@ will use the column names to select the columns:: >>> X_new = pd.DataFrame({"expert_rating": [5, 6, 1], ... "ignored_new_col": [1.2, 0.3, -0.1]}) >>> ct.transform(X_new) - array([[ 0.9...], - [ 2.1...], - [-3.9...]]) + array([[ 0.9], + [ 2.1], + [-3.9]]) .. _visualizing_composite_estimators: diff --git a/doc/modules/cross_validation.rst b/doc/modules/cross_validation.rst index 84a6c1a985a3d..bfdee6c8a043d 100644 --- a/doc/modules/cross_validation.rst +++ b/doc/modules/cross_validation.rst @@ -55,7 +55,7 @@ data for testing (evaluating) our classifier:: >>> clf = svm.SVC(kernel='linear', C=1).fit(X_train, y_train) >>> clf.score(X_test, y_test) - 0.96... + 0.96 When evaluating different settings ("hyperparameters") for estimators, such as the ``C`` setting that must be manually set for an SVM, @@ -120,7 +120,7 @@ time):: >>> clf = svm.SVC(kernel='linear', C=1, random_state=42) >>> scores = cross_val_score(clf, X, y, cv=5) >>> scores - array([0.96..., 1. , 0.96..., 0.96..., 1. ]) + array([0.96, 1. , 0.96, 0.96, 1. ]) The mean score and the standard deviation are hence given by:: @@ -135,7 +135,7 @@ scoring parameter:: >>> scores = cross_val_score( ... clf, X, y, cv=5, scoring='f1_macro') >>> scores - array([0.96..., 1. ..., 0.96..., 0.96..., 1. ]) + array([0.96, 1., 0.96, 0.96, 1.]) See :ref:`scoring_parameter` for details. In the case of the Iris dataset, the samples are balanced across target @@ -153,7 +153,7 @@ validation iterator instead, for instance:: >>> n_samples = X.shape[0] >>> cv = ShuffleSplit(n_splits=5, test_size=0.3, random_state=0) >>> cross_val_score(clf, X, y, cv=cv) - array([0.977..., 0.977..., 1. ..., 0.955..., 1. ]) + array([0.977, 0.977, 1., 0.955, 1.]) Another option is to use an iterable yielding (train, test) splits as arrays of indices, for example:: @@ -168,7 +168,7 @@ indices, for example:: ... >>> custom_cv = custom_cv_2folds(X) >>> cross_val_score(clf, X, y, cv=custom_cv) - array([1. , 0.973...]) + array([1. , 0.973]) .. dropdown:: Data transformation with held-out data @@ -185,7 +185,7 @@ indices, for example:: >>> clf = svm.SVC(C=1).fit(X_train_transformed, y_train) >>> X_test_transformed = scaler.transform(X_test) >>> clf.score(X_test_transformed, y_test) - 0.9333... + 0.9333 A :class:`Pipeline ` makes it easier to compose estimators, providing this behavior under cross-validation:: @@ -193,7 +193,7 @@ indices, for example:: >>> from sklearn.pipeline import make_pipeline >>> clf = make_pipeline(preprocessing.StandardScaler(), svm.SVC(C=1)) >>> cross_val_score(clf, X, y, cv=cv) - array([0.977..., 0.933..., 0.955..., 0.933..., 0.977...]) + array([0.977, 0.933, 0.955, 0.933, 0.977]) See :ref:`combining_estimators`. @@ -237,7 +237,7 @@ predefined scorer names:: >>> sorted(scores.keys()) ['fit_time', 'score_time', 'test_precision_macro', 'test_recall_macro'] >>> scores['test_recall_macro'] - array([0.96..., 1. ..., 0.96..., 0.96..., 1. ]) + array([0.96, 1., 0.96, 0.96, 1.]) Or as a dict mapping scorer name to a predefined or custom scoring function:: @@ -250,7 +250,7 @@ Or as a dict mapping scorer name to a predefined or custom scoring function:: ['fit_time', 'score_time', 'test_prec_macro', 'test_rec_macro', 'train_prec_macro', 'train_rec_macro'] >>> scores['train_rec_macro'] - array([0.97..., 0.97..., 0.99..., 0.98..., 0.98...]) + array([0.97, 0.97, 0.99, 0.98, 0.98]) Here is an example of ``cross_validate`` using a single metric:: diff --git a/doc/modules/ensemble.rst b/doc/modules/ensemble.rst index b336a25d8048d..f0f14c60e4867 100644 --- a/doc/modules/ensemble.rst +++ b/doc/modules/ensemble.rst @@ -241,7 +241,7 @@ The following toy example demonstrates that samples with a sample weight of zero >>> gb.predict([[1, 0]]) array([1]) >>> gb.predict_proba([[1, 0]])[0, 1] - np.float64(0.999...) + np.float64(0.999) As you can see, the `[1, 0]` is comfortably classified as `1` since the first two samples are ignored due to their sample weights. @@ -513,7 +513,7 @@ parameters of these estimators are `n_estimators` and `learning_rate`. >>> clf = GradientBoostingClassifier(n_estimators=100, learning_rate=1.0, ... max_depth=1, random_state=0).fit(X_train, y_train) >>> clf.score(X_test, y_test) - 0.913... + 0.913 The number of weak learners (i.e. regression trees) is controlled by the parameter ``n_estimators``; :ref:`The size of each tree @@ -556,7 +556,7 @@ parameters of these estimators are `n_estimators` and `learning_rate`. ... loss='squared_error' ... ).fit(X_train, y_train) >>> mean_squared_error(y_test, est.predict(X_test)) - 5.00... + 5.00 The figure below shows the results of applying :class:`GradientBoostingRegressor` with least squares loss and 500 base learners to the diabetes dataset @@ -604,11 +604,11 @@ fitted model. ... ) >>> est = est.fit(X_train, y_train) # fit with 100 trees >>> mean_squared_error(y_test, est.predict(X_test)) - 5.00... + 5.00 >>> _ = est.set_params(n_estimators=200, warm_start=True) # set warm_start and increase num of trees >>> _ = est.fit(X_train, y_train) # fit additional 100 trees to est >>> mean_squared_error(y_test, est.predict(X_test)) - 3.84... + 3.84 .. _gradient_boosting_tree_size: @@ -900,7 +900,8 @@ accessed via the ``feature_importances_`` property:: >>> clf = GradientBoostingClassifier(n_estimators=100, learning_rate=1.0, ... max_depth=1, random_state=0).fit(X, y) >>> clf.feature_importances_ - array([0.10..., 0.10..., 0.11..., ... + array([0.107, 0.105, 0.113, 0.0987, 0.0947, + 0.107, 0.0916, 0.0972, 0.0958, 0.0906]) Note that this computation of feature importance is based on entropy, and it is distinct from :func:`sklearn.inspection.permutation_importance` which is @@ -1035,13 +1036,13 @@ in bias:: ... random_state=0) >>> scores = cross_val_score(clf, X, y, cv=5) >>> scores.mean() - np.float64(0.98...) + np.float64(0.98) >>> clf = RandomForestClassifier(n_estimators=10, max_depth=None, ... min_samples_split=2, random_state=0) >>> scores = cross_val_score(clf, X, y, cv=5) >>> scores.mean() - np.float64(0.999...) + np.float64(0.999) >>> clf = ExtraTreesClassifier(n_estimators=10, max_depth=None, ... min_samples_split=2, random_state=0) @@ -1578,11 +1579,11 @@ Note that it is also possible to get the output of the stacked `estimators` using the `transform` method:: >>> reg.transform(X_test[:5]) - array([[142..., 138..., 146...], - [179..., 182..., 151...], - [139..., 132..., 158...], - [286..., 292..., 225...], - [126..., 124..., 164...]]) + array([[142, 138, 146], + [179, 182, 151], + [139, 132, 158], + [286, 292, 225], + [126, 124, 164]]) In practice, a stacking predictor predicts as good as the best predictor of the base layer and even sometimes outperforms it by combining the different @@ -1684,7 +1685,7 @@ learners:: >>> clf = AdaBoostClassifier(n_estimators=100) >>> scores = cross_val_score(clf, X, y, cv=5) >>> scores.mean() - np.float64(0.9...) + np.float64(0.95) The number of weak learners is controlled by the parameter ``n_estimators``. The ``learning_rate`` parameter controls the contribution of the weak learners in diff --git a/doc/modules/feature_extraction.rst b/doc/modules/feature_extraction.rst index 1f2e18dfc31b2..42bcf18e1d572 100644 --- a/doc/modules/feature_extraction.rst +++ b/doc/modules/feature_extraction.rst @@ -583,7 +583,7 @@ Again please see the :ref:`reference documentation attribute:: >>> transformer.idf_ - array([1. ..., 2.25..., 1.84...]) + array([1., 2.25, 1.84]) As tf-idf is very often used for text features, there is also another class called :class:`TfidfVectorizer` that combines all the options of diff --git a/doc/modules/feature_selection.rst b/doc/modules/feature_selection.rst index aff37f466521c..ffee801f34ccc 100644 --- a/doc/modules/feature_selection.rst +++ b/doc/modules/feature_selection.rst @@ -262,7 +262,7 @@ meta-transformer):: >>> clf = ExtraTreesClassifier(n_estimators=50) >>> clf = clf.fit(X, y) >>> clf.feature_importances_ # doctest: +SKIP - array([ 0.04..., 0.05..., 0.4..., 0.4...]) + array([ 0.04, 0.05, 0.4, 0.4]) >>> model = SelectFromModel(clf, prefit=True) >>> X_new = model.transform(X) >>> X_new.shape # doctest: +SKIP diff --git a/doc/modules/impute.rst b/doc/modules/impute.rst index d26492402274f..59367b647dd58 100644 --- a/doc/modules/impute.rst +++ b/doc/modules/impute.rst @@ -50,7 +50,7 @@ that contain the missing values:: >>> X = [[np.nan, 2], [6, np.nan], [7, 6]] >>> print(imp.transform(X)) [[4. 2. ] - [6. 3.666...] + [6. 3.666] [7. 6. ]] The :class:`SimpleImputer` class also supports sparse matrices:: diff --git a/doc/modules/learning_curve.rst b/doc/modules/learning_curve.rst index 77c627d189f2a..6dca0a29af7cb 100644 --- a/doc/modules/learning_curve.rst +++ b/doc/modules/learning_curve.rst @@ -83,13 +83,13 @@ The function :func:`validation_curve` can help in this case:: ... SVC(kernel="linear"), X, y, param_name="C", param_range=np.logspace(-7, 3, 3), ... ) >>> train_scores - array([[0.90..., 0.94..., 0.91..., 0.89..., 0.92...], - [0.9... , 0.92..., 0.93..., 0.92..., 0.93...], - [0.97..., 1... , 0.98..., 0.97..., 0.99...]]) + array([[0.90, 0.94, 0.91, 0.89, 0.92], + [0.9 , 0.92, 0.93, 0.92, 0.93], + [0.97, 1 , 0.98, 0.97, 0.99]]) >>> valid_scores - array([[0.9..., 0.9... , 0.9... , 0.96..., 0.9... ], - [0.9..., 0.83..., 0.96..., 0.96..., 0.93...], - [1.... , 0.93..., 1.... , 1.... , 0.9... ]]) + array([[0.9, 0.9 , 0.9 , 0.96, 0.9 ], + [0.9, 0.83, 0.96, 0.96, 0.93], + [1. , 0.93, 1 , 1 , 0.9 ]]) If you intend to plot the validation curves only, the class :class:`~sklearn.model_selection.ValidationCurveDisplay` is more direct than @@ -154,13 +154,13 @@ average scores on the validation sets):: >>> train_sizes array([ 50, 80, 110]) >>> train_scores - array([[0.98..., 0.98 , 0.98..., 0.98..., 0.98...], - [0.98..., 1. , 0.98..., 0.98..., 0.98...], - [0.98..., 1. , 0.98..., 0.98..., 0.99...]]) + array([[0.98, 0.98 , 0.98, 0.98, 0.98], + [0.98, 1. , 0.98, 0.98, 0.98], + [0.98, 1. , 0.98, 0.98, 0.99]]) >>> valid_scores - array([[1. , 0.93..., 1. , 1. , 0.96...], - [1. , 0.96..., 1. , 1. , 0.96...], - [1. , 0.96..., 1. , 1. , 0.96...]]) + array([[1. , 0.93, 1. , 1. , 0.96], + [1. , 0.96, 1. , 1. , 0.96], + [1. , 0.96, 1. , 1. , 0.96]]) If you intend to plot the learning curves only, the class :class:`~sklearn.model_selection.LearningCurveDisplay` will be easier to use. diff --git a/doc/modules/linear_model.rst b/doc/modules/linear_model.rst index 2a06bc5d1ff91..69a2bf9b7f477 100644 --- a/doc/modules/linear_model.rst +++ b/doc/modules/linear_model.rst @@ -126,7 +126,7 @@ its ``coef_`` member:: >>> reg.coef_ array([0.34545455, 0.34545455]) >>> reg.intercept_ - np.float64(0.13636...) + np.float64(0.13636) Note that the class :class:`Ridge` allows for the user to specify that the solver be automatically chosen by setting `solver="auto"`. When this option @@ -627,7 +627,7 @@ function of the norm of its coefficients. >>> reg.fit([[0, 0], [1, 1]], [0, 1]) LassoLars(alpha=0.1) >>> reg.coef_ - array([0.6..., 0. ]) + array([0.6, 0. ]) .. rubric:: Examples @@ -1282,9 +1282,9 @@ Usage example:: >>> reg.fit([[0, 0], [0, 1], [2, 2]], [0, 1, 2]) TweedieRegressor(alpha=0.5, link='log', power=1) >>> reg.coef_ - array([0.2463..., 0.4337...]) + array([0.2463, 0.4337]) >>> reg.intercept_ - np.float64(-0.7638...) + np.float64(-0.7638) .. rubric:: Examples diff --git a/doc/modules/model_evaluation.rst b/doc/modules/model_evaluation.rst index 672ed48f9c0d3..cf168295a6024 100644 --- a/doc/modules/model_evaluation.rst +++ b/doc/modules/model_evaluation.rst @@ -268,7 +268,7 @@ Usage examples: >>> X, y = datasets.load_iris(return_X_y=True) >>> clf = svm.SVC(random_state=0) >>> cross_val_score(clf, X, y, cv=5, scoring='recall_macro') - array([0.96..., 0.96..., 0.96..., 0.93..., 1. ]) + array([0.96, 0.96, 0.96, 0.93, 1. ]) .. note:: @@ -389,9 +389,9 @@ You can create your own custom scorer object using >>> clf = DummyClassifier(strategy='most_frequent', random_state=0) >>> clf = clf.fit(X, y) >>> my_custom_loss_func(y, clf.predict(X)) - 0.69... + 0.69 >>> score(clf, X, y) - -0.69... + -0.69 .. dropdown:: Custom scorer objects from scratch @@ -1091,15 +1091,15 @@ Here are some small examples in binary classification:: >>> metrics.recall_score(y_true, y_pred) 0.5 >>> metrics.f1_score(y_true, y_pred) - 0.66... + 0.66 >>> metrics.fbeta_score(y_true, y_pred, beta=0.5) - 0.83... + 0.83 >>> metrics.fbeta_score(y_true, y_pred, beta=1) - 0.66... + 0.66 >>> metrics.fbeta_score(y_true, y_pred, beta=2) - 0.55... + 0.55 >>> metrics.precision_recall_fscore_support(y_true, y_pred, beta=0.5) - (array([0.66..., 1. ]), array([1. , 0.5]), array([0.71..., 0.83...]), array([2, 2])) + (array([0.66, 1. ]), array([1. , 0.5]), array([0.71, 0.83]), array([2, 2])) >>> import numpy as np @@ -1109,13 +1109,13 @@ Here are some small examples in binary classification:: >>> y_scores = np.array([0.1, 0.4, 0.35, 0.8]) >>> precision, recall, threshold = precision_recall_curve(y_true, y_scores) >>> precision - array([0.5 , 0.66..., 0.5 , 1. , 1. ]) + array([0.5 , 0.66, 0.5 , 1. , 1. ]) >>> recall array([1. , 1. , 0.5, 0.5, 0. ]) >>> threshold array([0.1 , 0.35, 0.4 , 0.8 ]) >>> average_precision_score(y_true, y_scores) - 0.83... + 0.83 @@ -1178,15 +1178,15 @@ Then the metrics are defined as: >>> y_true = [0, 1, 2, 0, 1, 2] >>> y_pred = [0, 2, 1, 0, 0, 1] >>> metrics.precision_score(y_true, y_pred, average='macro') - 0.22... + 0.22 >>> metrics.recall_score(y_true, y_pred, average='micro') - 0.33... + 0.33 >>> metrics.f1_score(y_true, y_pred, average='weighted') - 0.26... + 0.267 >>> metrics.fbeta_score(y_true, y_pred, average='macro', beta=0.5) - 0.23... + 0.238 >>> metrics.precision_recall_fscore_support(y_true, y_pred, beta=0.5, average=None) - (array([0.66..., 0. , 0. ]), array([1., 0., 0.]), array([0.71..., 0. , 0. ]), array([2, 2, 2]...)) + (array([0.667, 0., 0.]), array([1., 0., 0.]), array([0.714, 0., 0.]), array([2, 2, 2])) For multiclass classification with a "negative class", it is possible to exclude some labels: @@ -1197,7 +1197,7 @@ For multiclass classification with a "negative class", it is possible to exclude Similarly, labels not present in the data sample may be accounted for in macro-averaging. >>> metrics.precision_score(y_true, y_pred, labels=[0, 1, 2, 3], average='macro') - 0.166... + 0.166 .. rubric:: References @@ -1234,7 +1234,7 @@ In the binary case:: >>> y_pred = np.array([[1, 1, 1], ... [1, 0, 0]]) >>> jaccard_score(y_true[0], y_pred[0]) - 0.6666... + 0.6666 In the 2D comparison case (e.g. image similarity): @@ -1244,9 +1244,9 @@ In the 2D comparison case (e.g. image similarity): In the multilabel case with binary label indicators:: >>> jaccard_score(y_true, y_pred, average='samples') - 0.5833... + 0.5833 >>> jaccard_score(y_true, y_pred, average='macro') - 0.6666... + 0.6666 >>> jaccard_score(y_true, y_pred, average=None) array([0.5, 0.5, 1. ]) @@ -1256,11 +1256,11 @@ multilabel problem:: >>> y_pred = [0, 2, 1, 2] >>> y_true = [0, 1, 2, 2] >>> jaccard_score(y_true, y_pred, average=None) - array([1. , 0. , 0.33...]) + array([1. , 0. , 0.33]) >>> jaccard_score(y_true, y_pred, average='macro') - 0.44... + 0.44 >>> jaccard_score(y_true, y_pred, average='micro') - 0.33... + 0.33 .. _hinge_loss: @@ -1313,9 +1313,9 @@ with a svm classifier in a binary class problem:: LinearSVC(random_state=0) >>> pred_decision = est.decision_function([[-2], [3], [0.5]]) >>> pred_decision - array([-2.18..., 2.36..., 0.09...]) + array([-2.18, 2.36, 0.09]) >>> hinge_loss([-1, 1, 1], pred_decision) - 0.3... + 0.3 Here is an example demonstrating the use of the :func:`hinge_loss` function with a svm classifier in a multiclass problem:: @@ -1329,7 +1329,7 @@ with a svm classifier in a multiclass problem:: >>> pred_decision = est.decision_function([[-1], [2], [3]]) >>> y_true = [0, 2, 3] >>> hinge_loss(y_true, pred_decision, labels=labels) - 0.56... + 0.56 .. _log_loss: @@ -1379,7 +1379,7 @@ method. >>> y_true = [0, 0, 1, 1] >>> y_pred = [[.9, .1], [.8, .2], [.3, .7], [.01, .99]] >>> log_loss(y_true, y_pred) - 0.1738... + 0.1738 The first ``[.9, .1]`` in ``y_pred`` denotes 90% probability that the first sample has label 0. The log loss is non-negative. @@ -1445,7 +1445,7 @@ function: >>> y_true = [+1, +1, +1, -1] >>> y_pred = [+1, -1, +1, +1] >>> matthews_corrcoef(y_true, y_pred) - -0.33... + -0.33 .. rubric:: References @@ -1640,12 +1640,12 @@ We can use the probability estimates corresponding to `clf.classes_[1]`. >>> y_score = clf.predict_proba(X)[:, 1] >>> roc_auc_score(y, y_score) - 0.99... + 0.99 Otherwise, we can use the non-thresholded decision values >>> roc_auc_score(y, clf.decision_function(X)) - 0.99... + 0.99 .. _roc_auc_multiclass: @@ -1732,7 +1732,7 @@ class with the greater label for each output. >>> clf = MultiOutputClassifier(inner_clf).fit(X, y) >>> y_score = np.transpose([y_pred[:, 1] for y_pred in clf.predict_proba(X)]) >>> roc_auc_score(y, y_score, average=None) - array([0.82..., 0.85..., 0.93..., 0.86..., 0.94...]) + array([0.828, 0.851, 0.94, 0.87, 0.95]) And the decision values do not require such processing. @@ -1740,7 +1740,7 @@ And the decision values do not require such processing. >>> clf = RidgeClassifierCV().fit(X, y) >>> y_score = clf.decision_function(X) >>> roc_auc_score(y, y_score, average=None) - array([0.81..., 0.84... , 0.93..., 0.87..., 0.94...]) + array([0.82, 0.85, 0.93, 0.87, 0.94]) .. rubric:: Examples @@ -1980,7 +1980,7 @@ two above definitions to follow. ... [[0.8, 0.1, 0.1], [0.2, 0.7, 0.1], [0.2, 0.2, 0.6]], ... labels=["eggs", "ham", "spam"], ... ) - 0.146... + 0.146 The Brier score can be used to assess how well a classifier is calibrated. However, a lower Brier score loss does not always mean a better calibration. @@ -2199,7 +2199,7 @@ of 0.0. ... [0.01, 0.01, 0.98], ... ] >>> d2_log_loss_score(y_true, y_pred) - 0.981... + 0.981 >>> y_true = [1, 2, 3] >>> y_pred = [ ... [0.1, 0.6, 0.3], @@ -2207,7 +2207,7 @@ of 0.0. ... [0.4, 0.5, 0.1], ... ] >>> d2_log_loss_score(y_true, y_pred) - -0.552... + -0.552 .. _multilabel_ranking_metrics: @@ -2306,7 +2306,7 @@ Here is a small example of usage of this function:: >>> y_true = np.array([[1, 0, 0], [0, 0, 1]]) >>> y_score = np.array([[0.75, 0.5, 1], [1, 0.2, 0.1]]) >>> label_ranking_average_precision_score(y_true, y_score) - 0.416... + 0.416 .. _label_ranking_loss: @@ -2341,7 +2341,7 @@ Here is a small example of usage of this function:: >>> y_true = np.array([[1, 0, 0], [0, 0, 1]]) >>> y_score = np.array([[0.75, 0.5, 1], [1, 0.2, 0.1]]) >>> label_ranking_loss(y_true, y_score) - 0.75... + 0.75 >>> # With the following prediction, we have perfect and minimal loss >>> y_score = np.array([[1.0, 0.1, 0.2], [0.1, 0.2, 0.9]]) >>> label_ranking_loss(y_true, y_score) @@ -2499,19 +2499,19 @@ Here is a small example of usage of the :func:`r2_score` function:: >>> y_true = [3, -0.5, 2, 7] >>> y_pred = [2.5, 0.0, 2, 8] >>> r2_score(y_true, y_pred) - 0.948... + 0.948 >>> y_true = [[0.5, 1], [-1, 1], [7, -6]] >>> y_pred = [[0, 2], [-1, 2], [8, -5]] >>> r2_score(y_true, y_pred, multioutput='variance_weighted') - 0.938... + 0.938 >>> y_true = [[0.5, 1], [-1, 1], [7, -6]] >>> y_pred = [[0, 2], [-1, 2], [8, -5]] >>> r2_score(y_true, y_pred, multioutput='uniform_average') - 0.936... + 0.936 >>> r2_score(y_true, y_pred, multioutput='raw_values') - array([0.965..., 0.908...]) + array([0.965, 0.908]) >>> r2_score(y_true, y_pred, multioutput=[0.3, 0.7]) - 0.925... + 0.925 >>> y_true = [-2, -2, -2] >>> y_pred = [-2, -2, -2] >>> r2_score(y_true, y_pred) @@ -2563,7 +2563,7 @@ Here is a small example of usage of the :func:`mean_absolute_error` function:: >>> mean_absolute_error(y_true, y_pred, multioutput='raw_values') array([0.5, 1. ]) >>> mean_absolute_error(y_true, y_pred, multioutput=[0.3, 0.7]) - 0.85... + 0.85 .. _mean_squared_error: @@ -2594,7 +2594,7 @@ function:: >>> y_true = [[0.5, 1], [-1, 1], [7, -6]] >>> y_pred = [[0, 2], [-1, 2], [8, -5]] >>> mean_squared_error(y_true, y_pred) - 0.7083... + 0.7083 .. rubric:: Examples @@ -2636,11 +2636,11 @@ function:: >>> y_true = [3, 5, 2.5, 7] >>> y_pred = [2.5, 5, 4, 8] >>> mean_squared_log_error(y_true, y_pred) - 0.039... + 0.0397 >>> y_true = [[0.5, 1], [1, 2], [7, 6]] >>> y_pred = [[0.5, 2], [1, 2.5], [8, 8]] >>> mean_squared_log_error(y_true, y_pred) - 0.044... + 0.044 The root mean squared logarithmic error (RMSLE) is available through the :func:`root_mean_squared_log_error` function. @@ -2674,7 +2674,7 @@ function:: >>> y_true = [1, 10, 1e6] >>> y_pred = [0.9, 15, 1.2e6] >>> mean_absolute_percentage_error(y_true, y_pred) - 0.2666... + 0.2666 In above example, if we had used `mean_absolute_error`, it would have ignored the small magnitude values and only reflected the error in prediction of highest @@ -2802,13 +2802,13 @@ function:: >>> y_true = [3, -0.5, 2, 7] >>> y_pred = [2.5, 0.0, 2, 8] >>> explained_variance_score(y_true, y_pred) - 0.957... + 0.957 >>> y_true = [[0.5, 1], [-1, 1], [7, -6]] >>> y_pred = [[0, 2], [-1, 2], [8, -5]] >>> explained_variance_score(y_true, y_pred, multioutput='raw_values') - array([0.967..., 1. ]) + array([0.967, 1. ]) >>> explained_variance_score(y_true, y_pred, multioutput=[0.3, 0.7]) - 0.990... + 0.990 >>> y_true = [-2, -2, -2] >>> y_pred = [-2, -2, -2] >>> explained_variance_score(y_true, y_pred) @@ -2880,16 +2880,16 @@ prediction difference of the second point,:: If we increase ``power`` to 1,:: >>> mean_tweedie_deviance([1.0], [1.5], power=1) - 0.18... + 0.189 >>> mean_tweedie_deviance([100.], [150.], power=1) - 18.9... + 18.9 the difference in errors decreases. Finally, by setting, ``power=2``:: >>> mean_tweedie_deviance([1.0], [1.5], power=2) - 0.14... + 0.144 >>> mean_tweedie_deviance([100.], [150.], power=2) - 0.14... + 0.144 we would get identical errors. The deviance when ``power=2`` is thus only sensitive to relative errors. @@ -2916,13 +2916,13 @@ Here is a small example of usage of the :func:`mean_pinball_loss` function:: >>> from sklearn.metrics import mean_pinball_loss >>> y_true = [1, 2, 3] >>> mean_pinball_loss(y_true, [0, 2, 3], alpha=0.1) - 0.03... + 0.033 >>> mean_pinball_loss(y_true, [1, 2, 4], alpha=0.1) - 0.3... + 0.3 >>> mean_pinball_loss(y_true, [0, 2, 3], alpha=0.9) - 0.3... + 0.3 >>> mean_pinball_loss(y_true, [1, 2, 4], alpha=0.9) - 0.03... + 0.033 >>> mean_pinball_loss(y_true, y_true, alpha=0.1) 0.0 >>> mean_pinball_loss(y_true, y_true, alpha=0.9) @@ -2947,7 +2947,7 @@ quantile regressor via cross-validation: ... random_state=0, ... ) >>> cross_val_score(estimator, X, y, cv=5, scoring=mean_pinball_loss_95p) - array([13.6..., 9.7..., 23.3..., 9.5..., 10.4...]) + array([13.6, 9.7, 23.3, 9.5, 10.4]) It is also possible to build scorer objects for hyper-parameter tuning. The sign of the loss must be switched to ensure that greater means better as @@ -3034,7 +3034,7 @@ of 0.0. >>> y_true = [3, -0.5, 2, 7] >>> y_pred = [2.5, 0.0, 2, 8] >>> d2_absolute_error_score(y_true, y_pred) - 0.764... + 0.764 >>> y_true = [1, 2, 3] >>> y_pred = [1, 2, 3] >>> d2_absolute_error_score(y_true, y_pred) @@ -3172,19 +3172,19 @@ Next, let's compare the accuracy of ``SVC`` and ``most_frequent``:: >>> from sklearn.svm import SVC >>> clf = SVC(kernel='linear', C=1).fit(X_train, y_train) >>> clf.score(X_test, y_test) - 0.63... + 0.63 >>> clf = DummyClassifier(strategy='most_frequent', random_state=0) >>> clf.fit(X_train, y_train) DummyClassifier(random_state=0, strategy='most_frequent') >>> clf.score(X_test, y_test) - 0.57... + 0.579 We see that ``SVC`` doesn't do much better than a dummy classifier. Now, let's change the kernel:: >>> clf = SVC(kernel='rbf', C=1).fit(X_train, y_train) >>> clf.score(X_test, y_test) - 0.94... + 0.94 We see that the accuracy was boosted to almost 100%. A cross validation strategy is recommended for a better estimate of the accuracy, if it diff --git a/doc/modules/neural_networks_supervised.rst b/doc/modules/neural_networks_supervised.rst index 1c0802f0ac92f..13611b7f52775 100644 --- a/doc/modules/neural_networks_supervised.rst +++ b/doc/modules/neural_networks_supervised.rst @@ -116,8 +116,8 @@ classification, it minimizes the Cross-Entropy loss function, giving a vector of probability estimates :math:`P(y|x)` per sample :math:`x`:: >>> clf.predict_proba([[2., 2.], [1., 2.]]) - array([[1.967...e-04, 9.998...-01], - [1.967...e-04, 9.998...-01]]) + array([[1.967e-04, 9.998e-01], + [1.967e-04, 9.998e-01]]) :class:`MLPClassifier` supports multi-class classification by applying `Softmax `_ diff --git a/doc/modules/preprocessing.rst b/doc/modules/preprocessing.rst index 2c7f7af1fe130..69dff95518c41 100644 --- a/doc/modules/preprocessing.rst +++ b/doc/modules/preprocessing.rst @@ -57,16 +57,16 @@ dataset:: StandardScaler() >>> scaler.mean_ - array([1. ..., 0. ..., 0.33...]) + array([1., 0., 0.33]) >>> scaler.scale_ - array([0.81..., 0.81..., 1.24...]) + array([0.81, 0.81, 1.24]) >>> X_scaled = scaler.transform(X_train) >>> X_scaled - array([[ 0. ..., -1.22..., 1.33...], - [ 1.22..., 0. ..., -0.26...], - [-1.22..., 1.22..., -1.06...]]) + array([[ 0. , -1.22, 1.33 ], + [ 1.22, 0. , -0.267], + [-1.22, 1.22, -1.06 ]]) .. >>> import numpy as np @@ -147,10 +147,10 @@ It is possible to introspect the scaler attributes to find about the exact nature of the transformation learned on the training data:: >>> min_max_scaler.scale_ - array([0.5 , 0.5 , 0.33...]) + array([0.5 , 0.5 , 0.33]) >>> min_max_scaler.min_ - array([0. , 0.5 , 0.33...]) + array([0. , 0.5 , 0.33]) If :class:`MinMaxScaler` is given an explicit ``feature_range=(min, max)`` the full formula is:: @@ -351,7 +351,7 @@ previously defined:: >>> np.percentile(X_train_trans[:, 0], [0, 25, 50, 75, 100]) ... # doctest: +SKIP - array([ 0.00... , 0.24..., 0.49..., 0.73..., 0.99... ]) + array([ 0.00 , 0.24, 0.49, 0.73, 0.99 ]) This can be confirmed on an independent testing set with similar remarks:: @@ -360,7 +360,7 @@ This can be confirmed on an independent testing set with similar remarks:: array([ 4.4 , 5.125, 5.75 , 6.175, 7.3 ]) >>> np.percentile(X_test_trans[:, 0], [0, 25, 50, 75, 100]) ... # doctest: +SKIP - array([ 0.01..., 0.25..., 0.46..., 0.60... , 0.94...]) + array([ 0.01, 0.25, 0.46, 0.60 , 0.94]) Mapping to a Gaussian distribution ---------------------------------- @@ -401,13 +401,13 @@ the Yeo-Johnson transform and the Box-Cox transform. >>> pt = preprocessing.PowerTransformer(method='box-cox', standardize=False) >>> X_lognormal = np.random.RandomState(616).lognormal(size=(3, 3)) >>> X_lognormal - array([[1.28..., 1.18..., 0.84...], - [0.94..., 1.60..., 0.38...], - [1.35..., 0.21..., 1.09...]]) + array([[1.28, 1.18 , 0.84 ], + [0.94, 1.60 , 0.388], + [1.35, 0.217, 1.09 ]]) >>> pt.fit_transform(X_lognormal) - array([[ 0.49..., 0.17..., -0.15...], - [-0.05..., 0.58..., -0.57...], - [ 0.69..., -0.84..., 0.10...]]) + array([[ 0.49 , 0.179, -0.156], + [-0.051, 0.589, -0.576], + [ 0.69 , -0.849, 0.101]]) While the above example sets the `standardize` option to `False`, :class:`PowerTransformer` will apply zero-mean, unit-variance normalization @@ -470,9 +470,9 @@ operation on a single array-like dataset, either using the ``l1``, ``l2``, or >>> X_normalized = preprocessing.normalize(X, norm='l2') >>> X_normalized - array([[ 0.40..., -0.40..., 0.81...], - [ 1. ..., 0. ..., 0. ...], - [ 0. ..., 0.70..., -0.70...]]) + array([[ 0.408, -0.408, 0.812], + [ 1. , 0. , 0. ], + [ 0. , 0.707, -0.707]]) The ``preprocessing`` module further provides a utility class :class:`Normalizer` that implements the same operation using the @@ -490,12 +490,12 @@ This class is hence suitable for use in the early steps of a The normalizer instance can then be used on sample vectors as any transformer:: >>> normalizer.transform(X) - array([[ 0.40..., -0.40..., 0.81...], - [ 1. ..., 0. ..., 0. ...], - [ 0. ..., 0.70..., -0.70...]]) + array([[ 0.408, -0.408, 0.812], + [ 1. , 0. , 0. ], + [ 0. , 0.707, -0.707]]) >>> normalizer.transform([[-1., 1., 0.]]) - array([[-0.70..., 0.70..., 0. ...]]) + array([[-0.707, 0.707, 0.]]) Note: L2 normalization is also known as spatial sign preprocessing. diff --git a/doc/modules/sgd.rst b/doc/modules/sgd.rst index b97c6d135dcfe..103ae205387e3 100644 --- a/doc/modules/sgd.rst +++ b/doc/modules/sgd.rst @@ -91,12 +91,12 @@ SGD fits a linear model to the training data. The ``coef_`` attribute holds the model parameters:: >>> clf.coef_ - array([[9.9..., 9.9...]]) + array([[9.9, 9.9]]) The ``intercept_`` attribute holds the intercept (aka offset or bias):: >>> clf.intercept_ - array([-9.9...]) + array([-9.9]) Whether or not the model should use an intercept, i.e. a biased hyperplane, is controlled by the parameter ``fit_intercept``. @@ -106,7 +106,7 @@ the coefficients and the input sample, plus the intercept) is given by :meth:`SGDClassifier.decision_function`:: >>> clf.decision_function([[2., 2.]]) - array([29.6...]) + array([29.6]) The concrete loss function can be set via the ``loss`` parameter. :class:`SGDClassifier` supports the following loss functions: @@ -131,7 +131,7 @@ Using ``loss="log_loss"`` or ``loss="modified_huber"`` enables the >>> clf = SGDClassifier(loss="log_loss", max_iter=5).fit(X, y) >>> clf.predict_proba([[1., 1.]]) # doctest: +SKIP - array([[0.00..., 0.99...]]) + array([[0.00, 0.99]]) The concrete penalty can be set via the ``penalty`` parameter. SGD supports the following penalties: diff --git a/sklearn/calibration.py b/sklearn/calibration.py index 70337f8c82be4..5b2bca2edfcc0 100644 --- a/sklearn/calibration.py +++ b/sklearn/calibration.py @@ -225,11 +225,11 @@ class CalibratedClassifierCV(ClassifierMixin, MetaEstimatorMixin, BaseEstimator) >>> len(calibrated_clf.calibrated_classifiers_) 3 >>> calibrated_clf.predict_proba(X)[:5, :] - array([[0.110..., 0.889...], - [0.072..., 0.927...], - [0.928..., 0.071...], - [0.928..., 0.071...], - [0.071..., 0.928...]]) + array([[0.110, 0.889], + [0.072, 0.927], + [0.928, 0.072], + [0.928, 0.072], + [0.072, 0.928]]) >>> from sklearn.model_selection import train_test_split >>> X, y = make_classification(n_samples=100, n_features=2, ... n_redundant=0, random_state=42) @@ -246,7 +246,7 @@ class CalibratedClassifierCV(ClassifierMixin, MetaEstimatorMixin, BaseEstimator) >>> len(calibrated_clf.calibrated_classifiers_) 1 >>> calibrated_clf.predict_proba([[-0.5, 0.5]]) - array([[0.936..., 0.063...]]) + array([[0.936, 0.063]]) """ _parameter_constraints: dict = { diff --git a/sklearn/cluster/_mean_shift.py b/sklearn/cluster/_mean_shift.py index c122692cd0c2a..1ba4409d14698 100644 --- a/sklearn/cluster/_mean_shift.py +++ b/sklearn/cluster/_mean_shift.py @@ -82,7 +82,7 @@ def estimate_bandwidth(X, *, quantile=0.3, n_samples=None, random_state=0, n_job >>> X = np.array([[1, 1], [2, 1], [1, 0], ... [4, 7], [3, 5], [3, 6]]) >>> estimate_bandwidth(X, quantile=0.5) - np.float64(1.61...) + np.float64(1.61) """ X = check_array(X) @@ -227,8 +227,8 @@ def mean_shift( ... [4, 7], [3, 5], [3, 6]]) >>> cluster_centers, labels = mean_shift(X, bandwidth=2) >>> cluster_centers - array([[3.33..., 6. ], - [1.33..., 0.66...]]) + array([[3.33, 6. ], + [1.33, 0.66]]) >>> labels array([1, 1, 1, 0, 0, 0]) """ diff --git a/sklearn/cluster/_optics.py b/sklearn/cluster/_optics.py index 4b33f03f526fa..0cd32023de46c 100644 --- a/sklearn/cluster/_optics.py +++ b/sklearn/cluster/_optics.py @@ -585,10 +585,10 @@ def compute_optics_graph( >>> ordering array([0, 1, 2, 5, 3, 4]) >>> core_distances - array([3.16..., 1.41..., 1.41..., 1. , 1. , - 4.12...]) + array([3.16, 1.41, 1.41, 1. , 1. , + 4.12]) >>> reachability - array([ inf, 3.16..., 1.41..., 4.12..., 1. , + array([ inf, 3.16, 1.41, 4.12, 1. , 5. ]) >>> predecessor array([-1, 0, 1, 5, 3, 2]) diff --git a/sklearn/conftest.py b/sklearn/conftest.py index 8907616bde5b0..d5255ead1ffdc 100644 --- a/sklearn/conftest.py +++ b/sklearn/conftest.py @@ -372,3 +372,4 @@ def print_changed_only_false(): if dt_config is not None: # Strict mode to differentiate between 3.14 and np.float64(3.14) dt_config.strict_check = True + # dt_config.rtol = 0.01 diff --git a/sklearn/covariance/_elliptic_envelope.py b/sklearn/covariance/_elliptic_envelope.py index 81ae86b4ad76e..71fb72ccd683d 100644 --- a/sklearn/covariance/_elliptic_envelope.py +++ b/sklearn/covariance/_elliptic_envelope.py @@ -135,10 +135,10 @@ class EllipticEnvelope(OutlierMixin, MinCovDet): ... [3, 3]]) array([ 1, -1]) >>> cov.covariance_ - array([[0.7411..., 0.2535...], - [0.2535..., 0.3053...]]) + array([[0.7411, 0.2535], + [0.2535, 0.3053]]) >>> cov.location_ - array([0.0813... , 0.0427...]) + array([0.0813 , 0.0427]) """ _parameter_constraints: dict = { diff --git a/sklearn/covariance/_empirical_covariance.py b/sklearn/covariance/_empirical_covariance.py index 955046fa37d4b..7c4db63b4e363 100644 --- a/sklearn/covariance/_empirical_covariance.py +++ b/sklearn/covariance/_empirical_covariance.py @@ -177,10 +177,10 @@ class EmpiricalCovariance(BaseEstimator): ... size=500) >>> cov = EmpiricalCovariance().fit(X) >>> cov.covariance_ - array([[0.7569..., 0.2818...], - [0.2818..., 0.3928...]]) + array([[0.7569, 0.2818], + [0.2818, 0.3928]]) >>> cov.location_ - array([0.0622..., 0.0193...]) + array([0.0622, 0.0193]) """ # X_test should have been called X diff --git a/sklearn/covariance/_graph_lasso.py b/sklearn/covariance/_graph_lasso.py index b3f653de64149..e94663120216d 100644 --- a/sklearn/covariance/_graph_lasso.py +++ b/sklearn/covariance/_graph_lasso.py @@ -334,9 +334,9 @@ def graphical_lasso( >>> emp_cov = empirical_covariance(X, assume_centered=True) >>> emp_cov, _ = graphical_lasso(emp_cov, alpha=0.05) >>> emp_cov - array([[ 1.68..., 0.21..., -0.20...], - [ 0.21..., 0.22..., -0.08...], - [-0.20..., -0.08..., 0.23...]]) + array([[ 1.687, 0.212, -0.209], + [ 0.212, 0.221, -0.0817], + [-0.209, -0.0817, 0.232]]) """ model = GraphicalLasso( alpha=alpha, diff --git a/sklearn/covariance/_robust_covariance.py b/sklearn/covariance/_robust_covariance.py index 559401f7bbc5b..f386879e693fb 100644 --- a/sklearn/covariance/_robust_covariance.py +++ b/sklearn/covariance/_robust_covariance.py @@ -697,10 +697,10 @@ class MinCovDet(EmpiricalCovariance): ... size=500) >>> cov = MinCovDet(random_state=0).fit(X) >>> cov.covariance_ - array([[0.7411..., 0.2535...], - [0.2535..., 0.3053...]]) + array([[0.7411, 0.2535], + [0.2535, 0.3053]]) >>> cov.location_ - array([0.0813... , 0.0427...]) + array([0.0813 , 0.0427]) """ _parameter_constraints: dict = { diff --git a/sklearn/covariance/_shrunk_covariance.py b/sklearn/covariance/_shrunk_covariance.py index d3197e1b2e6fe..99d6f70f57d6e 100644 --- a/sklearn/covariance/_shrunk_covariance.py +++ b/sklearn/covariance/_shrunk_covariance.py @@ -142,8 +142,8 @@ def shrunk_covariance(emp_cov, shrinkage=0.1): >>> rng = np.random.RandomState(0) >>> X = rng.multivariate_normal(mean=[0, 0], cov=real_cov, size=500) >>> shrunk_covariance(empirical_covariance(X)) - array([[0.73..., 0.25...], - [0.25..., 0.41...]]) + array([[0.739, 0.254], + [0.254, 0.411]]) """ emp_cov = check_array(emp_cov, allow_nd=True) n_features = emp_cov.shape[-1] @@ -234,10 +234,10 @@ class ShrunkCovariance(EmpiricalCovariance): ... size=500) >>> cov = ShrunkCovariance().fit(X) >>> cov.covariance_ - array([[0.7387..., 0.2536...], - [0.2536..., 0.4110...]]) + array([[0.7387, 0.2536], + [0.2536, 0.4110]]) >>> cov.location_ - array([0.0622..., 0.0193...]) + array([0.0622, 0.0193]) """ _parameter_constraints: dict = { @@ -336,7 +336,7 @@ def ledoit_wolf_shrinkage(X, assume_centered=False, block_size=1000): >>> X = rng.multivariate_normal(mean=[0, 0], cov=real_cov, size=50) >>> shrinkage_coefficient = ledoit_wolf_shrinkage(X) >>> shrinkage_coefficient - np.float64(0.23...) + np.float64(0.23) """ X = check_array(X) # for only one feature, the result is the same whatever the shrinkage @@ -450,10 +450,10 @@ def ledoit_wolf(X, *, assume_centered=False, block_size=1000): >>> X = rng.multivariate_normal(mean=[0, 0], cov=real_cov, size=50) >>> covariance, shrinkage = ledoit_wolf(X) >>> covariance - array([[0.44..., 0.16...], - [0.16..., 0.80...]]) + array([[0.44, 0.16], + [0.16, 0.80]]) >>> shrinkage - np.float64(0.23...) + np.float64(0.23) """ estimator = LedoitWolf( assume_centered=assume_centered, @@ -559,10 +559,10 @@ class LedoitWolf(EmpiricalCovariance): ... size=50) >>> cov = LedoitWolf().fit(X) >>> cov.covariance_ - array([[0.4406..., 0.1616...], - [0.1616..., 0.8022...]]) + array([[0.4406, 0.1616], + [0.1616, 0.8022]]) >>> cov.location_ - array([ 0.0595... , -0.0075...]) + array([ 0.0595 , -0.0075]) See also :ref:`sphx_glr_auto_examples_covariance_plot_covariance_estimation.py` and :ref:`sphx_glr_auto_examples_covariance_plot_lw_vs_oas.py` @@ -674,10 +674,10 @@ def oas(X, *, assume_centered=False): >>> X = rng.multivariate_normal(mean=[0, 0], cov=real_cov, size=500) >>> shrunk_cov, shrinkage = oas(X) >>> shrunk_cov - array([[0.7533..., 0.2763...], - [0.2763..., 0.3964...]]) + array([[0.7533, 0.2763], + [0.2763, 0.3964]]) >>> shrinkage - np.float64(0.0195...) + np.float64(0.0195) """ estimator = OAS( assume_centered=assume_centered, @@ -777,13 +777,13 @@ class OAS(EmpiricalCovariance): ... size=500) >>> oas = OAS().fit(X) >>> oas.covariance_ - array([[0.7533..., 0.2763...], - [0.2763..., 0.3964...]]) + array([[0.7533, 0.2763], + [0.2763, 0.3964]]) >>> oas.precision_ - array([[ 1.7833..., -1.2431... ], - [-1.2431..., 3.3889...]]) + array([[ 1.7833, -1.2431 ], + [-1.2431, 3.3889]]) >>> oas.shrinkage_ - np.float64(0.0195...) + np.float64(0.0195) See also :ref:`sphx_glr_auto_examples_covariance_plot_covariance_estimation.py` and :ref:`sphx_glr_auto_examples_covariance_plot_lw_vs_oas.py` diff --git a/sklearn/datasets/_samples_generator.py b/sklearn/datasets/_samples_generator.py index 04810675f66a4..e2d80422e7df7 100644 --- a/sklearn/datasets/_samples_generator.py +++ b/sklearn/datasets/_samples_generator.py @@ -739,13 +739,13 @@ def make_regression( >>> from sklearn.datasets import make_regression >>> X, y = make_regression(n_samples=5, n_features=2, noise=1, random_state=42) >>> X - array([[ 0.4967..., -0.1382... ], - [ 0.6476..., 1.523...], - [-0.2341..., -0.2341...], - [-0.4694..., 0.5425...], - [ 1.579..., 0.7674...]]) + array([[ 0.4967, -0.1382 ], + [ 0.6476, 1.523], + [-0.2341, -0.2341], + [-0.4694, 0.5425], + [ 1.579, 0.7674]]) >>> y - array([ 6.737..., 37.79..., -10.27..., 0.4017..., 42.22...]) + array([ 6.737, 37.79, -10.27, 0.4017, 42.22]) """ n_informative = min(n_features, n_informative) generator = check_random_state(random_state) @@ -1228,7 +1228,7 @@ def make_friedman1(n_samples=100, n_features=10, *, noise=0.0, random_state=None >>> y.shape (100,) >>> list(y[:3]) - [np.float64(16.8...), np.float64(5.8...), np.float64(9.4...)] + [np.float64(16.8), np.float64(5.87), np.float64(9.46)] """ generator = check_random_state(random_state) @@ -1310,7 +1310,7 @@ def make_friedman2(n_samples=100, *, noise=0.0, random_state=None): >>> y.shape (100,) >>> list(y[:3]) - [np.float64(1229.4...), np.float64(27.0...), np.float64(65.6...)] + [np.float64(1229.4), np.float64(27.0), np.float64(65.6)] """ generator = check_random_state(random_state) @@ -1394,7 +1394,7 @@ def make_friedman3(n_samples=100, *, noise=0.0, random_state=None): >>> y.shape (100,) >>> list(y[:3]) - [np.float64(1.5...), np.float64(0.9...), np.float64(0.4...)] + [np.float64(1.54), np.float64(0.956), np.float64(0.414)] """ generator = check_random_state(random_state) @@ -1718,8 +1718,8 @@ def make_spd_matrix(n_dim, *, random_state=None): -------- >>> from sklearn.datasets import make_spd_matrix >>> make_spd_matrix(n_dim=2, random_state=42) - array([[2.09..., 0.34...], - [0.34..., 0.21...]]) + array([[2.093, 0.346], + [0.346, 0.218]]) """ generator = check_random_state(random_state) diff --git a/sklearn/decomposition/_dict_learning.py b/sklearn/decomposition/_dict_learning.py index 2e724c856b967..ae40e28e9f013 100644 --- a/sklearn/decomposition/_dict_learning.py +++ b/sklearn/decomposition/_dict_learning.py @@ -842,7 +842,7 @@ def dict_learning_online( We can check the level of sparsity of `U`: >>> np.mean(U == 0) - np.float64(0.53...) + np.float64(0.53) We can compare the average squared euclidean norm of the reconstruction error of the sparse coded signal relative to the squared euclidean norm of @@ -850,7 +850,7 @@ def dict_learning_online( >>> X_hat = U @ V >>> np.mean(np.sum((X_hat - X) ** 2, axis=1) / np.sum(X ** 2, axis=1)) - np.float64(0.05...) + np.float64(0.053) """ transform_algorithm = "lasso_" + method @@ -1033,7 +1033,7 @@ def dict_learning( We can check the level of sparsity of `U`: >>> np.mean(U == 0) - np.float64(0.6...) + np.float64(0.62) We can compare the average squared euclidean norm of the reconstruction error of the sparse coded signal relative to the squared euclidean norm of @@ -1041,7 +1041,7 @@ def dict_learning( >>> X_hat = U @ V >>> np.mean(np.sum((X_hat - X) ** 2, axis=1) / np.sum(X ** 2, axis=1)) - np.float64(0.01...) + np.float64(0.0192) """ estimator = DictionaryLearning( n_components=n_components, @@ -1587,7 +1587,7 @@ class DictionaryLearning(_BaseSparseCoding, BaseEstimator): We can check the level of sparsity of `X_transformed`: >>> np.mean(X_transformed == 0) - np.float64(0.52...) + np.float64(0.527) We can compare the average squared euclidean norm of the reconstruction error of the sparse coded signal relative to the squared euclidean norm of @@ -1595,7 +1595,7 @@ class DictionaryLearning(_BaseSparseCoding, BaseEstimator): >>> X_hat = X_transformed @ dict_learner.components_ >>> np.mean(np.sum((X_hat - X) ** 2, axis=1) / np.sum(X ** 2, axis=1)) - np.float64(0.05...) + np.float64(0.056) """ _parameter_constraints: dict = { @@ -1954,7 +1954,7 @@ class MiniBatchDictionaryLearning(_BaseSparseCoding, BaseEstimator): >>> X_hat = X_transformed @ dict_learner.components_ >>> np.mean(np.sum((X_hat - X) ** 2, axis=1) / np.sum(X ** 2, axis=1)) - np.float64(0.052...) + np.float64(0.052) """ _parameter_constraints: dict = { diff --git a/sklearn/decomposition/_pca.py b/sklearn/decomposition/_pca.py index 41b0ac5394be1..1b0d21d5d38be 100644 --- a/sklearn/decomposition/_pca.py +++ b/sklearn/decomposition/_pca.py @@ -353,25 +353,25 @@ class PCA(_BasePCA): >>> pca.fit(X) PCA(n_components=2) >>> print(pca.explained_variance_ratio_) - [0.9924... 0.0075...] + [0.9924 0.0075] >>> print(pca.singular_values_) - [6.30061... 0.54980...] + [6.30061 0.54980] >>> pca = PCA(n_components=2, svd_solver='full') >>> pca.fit(X) PCA(n_components=2, svd_solver='full') >>> print(pca.explained_variance_ratio_) - [0.9924... 0.00755...] + [0.9924 0.00755] >>> print(pca.singular_values_) - [6.30061... 0.54980...] + [6.30061 0.54980] >>> pca = PCA(n_components=1, svd_solver='arpack') >>> pca.fit(X) PCA(n_components=1, svd_solver='arpack') >>> print(pca.explained_variance_ratio_) - [0.99244...] + [0.99244] >>> print(pca.singular_values_) - [6.30061...] + [6.30061] """ _parameter_constraints: dict = { diff --git a/sklearn/decomposition/_sparse_pca.py b/sklearn/decomposition/_sparse_pca.py index d32874cb54616..2717230c9df92 100644 --- a/sklearn/decomposition/_sparse_pca.py +++ b/sklearn/decomposition/_sparse_pca.py @@ -267,7 +267,7 @@ class SparsePCA(_BaseSparsePCA): (200, 5) >>> # most values in the components_ are zero (sparsity) >>> np.mean(transformer.components_ == 0) - np.float64(0.9666...) + np.float64(0.9666) """ _parameter_constraints: dict = { @@ -469,7 +469,7 @@ class MiniBatchSparsePCA(_BaseSparsePCA): (200, 5) >>> # most values in the components_ are zero (sparsity) >>> np.mean(transformer.components_ == 0) - np.float64(0.9...) + np.float64(0.9) """ _parameter_constraints: dict = { diff --git a/sklearn/decomposition/_truncated_svd.py b/sklearn/decomposition/_truncated_svd.py index 26127b2b522fd..6165aba4e8db6 100644 --- a/sklearn/decomposition/_truncated_svd.py +++ b/sklearn/decomposition/_truncated_svd.py @@ -151,11 +151,11 @@ class to data once, then keep the instance around to do transformations. >>> svd.fit(X) TruncatedSVD(n_components=5, n_iter=7, random_state=42) >>> print(svd.explained_variance_ratio_) - [0.0157... 0.0512... 0.0499... 0.0479... 0.0453...] + [0.0157 0.0512 0.0499 0.0479 0.0453] >>> print(svd.explained_variance_ratio_.sum()) - 0.2102... + 0.2102 >>> print(svd.singular_values_) - [35.2410... 4.5981... 4.5420... 4.4486... 4.3288...] + [35.2410 4.5981 4.5420 4.4486 4.3288] """ _parameter_constraints: dict = { diff --git a/sklearn/ensemble/_bagging.py b/sklearn/ensemble/_bagging.py index 94c89b9841ef8..34b613b15281a 100644 --- a/sklearn/ensemble/_bagging.py +++ b/sklearn/ensemble/_bagging.py @@ -1348,7 +1348,7 @@ class BaggingRegressor(RegressorMixin, BaseBagging): >>> regr = BaggingRegressor(estimator=SVR(), ... n_estimators=10, random_state=0).fit(X, y) >>> regr.predict([[0, 0, 0, 0]]) - array([-2.8720...]) + array([-2.8720]) """ def __init__( diff --git a/sklearn/ensemble/_gb.py b/sklearn/ensemble/_gb.py index 8bfbfe640aead..55c8e79e062df 100644 --- a/sklearn/ensemble/_gb.py +++ b/sklearn/ensemble/_gb.py @@ -1454,7 +1454,7 @@ class GradientBoostingClassifier(ClassifierMixin, BaseGradientBoosting): >>> clf = GradientBoostingClassifier(n_estimators=100, learning_rate=1.0, ... max_depth=1, random_state=0).fit(X_train, y_train) >>> clf.score(X_test, y_test) - 0.913... + 0.913 """ _parameter_constraints: dict = { @@ -2052,7 +2052,7 @@ class GradientBoostingRegressor(RegressorMixin, BaseGradientBoosting): >>> reg.fit(X_train, y_train) GradientBoostingRegressor(random_state=0) >>> reg.predict(X_test[1:2]) - array([-61...]) + array([-61.1]) >>> reg.score(X_test, y_test) 0.4... diff --git a/sklearn/ensemble/_voting.py b/sklearn/ensemble/_voting.py index d72e5806bbae0..e7e670dd869b6 100644 --- a/sklearn/ensemble/_voting.py +++ b/sklearn/ensemble/_voting.py @@ -622,7 +622,7 @@ class VotingRegressor(RegressorMixin, _BaseVoting): >>> y = np.array([2, 6, 12, 20, 30, 42]) >>> er = VotingRegressor([('lr', r1), ('rf', r2), ('r3', r3)]) >>> print(er.fit(X, y).predict(X)) - [ 6.8... 8.4... 12.5... 17.8... 26... 34...] + [ 6.8 8.4 12.5 17.8 26 34] In the following example, we drop the `'lr'` estimator with :meth:`~VotingRegressor.set_params` and fit the remaining two estimators: diff --git a/sklearn/ensemble/_weight_boosting.py b/sklearn/ensemble/_weight_boosting.py index 494d78b9ff63d..37c6468a5ebf6 100644 --- a/sklearn/ensemble/_weight_boosting.py +++ b/sklearn/ensemble/_weight_boosting.py @@ -476,7 +476,7 @@ class AdaBoostClassifier( >>> clf.predict([[0, 0, 0, 0]]) array([1]) >>> clf.score(X, y) - 0.96... + 0.96 For a detailed example of using AdaBoost to fit a sequence of DecisionTrees as weaklearners, please refer to @@ -973,9 +973,9 @@ class AdaBoostRegressor(_RoutingNotSupportedMixin, RegressorMixin, BaseWeightBoo >>> regr.fit(X, y) AdaBoostRegressor(n_estimators=100, random_state=0) >>> regr.predict([[0, 0, 0, 0]]) - array([4.7972...]) + array([4.7972]) >>> regr.score(X, y) - 0.9771... + 0.9771 For a detailed example of utilizing :class:`~sklearn.ensemble.AdaBoostRegressor` to fit a sequence of decision trees as weak learners, please refer to diff --git a/sklearn/feature_selection/_from_model.py b/sklearn/feature_selection/_from_model.py index 92654821c9dff..3b2c73c6cbfae 100644 --- a/sklearn/feature_selection/_from_model.py +++ b/sklearn/feature_selection/_from_model.py @@ -211,9 +211,9 @@ class SelectFromModel(MetaEstimatorMixin, SelectorMixin, BaseEstimator): >>> y = [0, 1, 0, 1] >>> selector = SelectFromModel(estimator=LogisticRegression()).fit(X, y) >>> selector.estimator_.coef_ - array([[-0.3252..., 0.8345..., 0.4976...]]) + array([[-0.3252, 0.8345, 0.4976]]) >>> selector.threshold_ - np.float64(0.55249...) + np.float64(0.55249) >>> selector.get_support() array([False, True, False]) >>> selector.transform(X) diff --git a/sklearn/feature_selection/_mutual_info.py b/sklearn/feature_selection/_mutual_info.py index ede6fa9a21c34..aef9097879fca 100644 --- a/sklearn/feature_selection/_mutual_info.py +++ b/sklearn/feature_selection/_mutual_info.py @@ -436,7 +436,7 @@ def mutual_info_regression( ... n_samples=50, n_features=3, n_informative=1, noise=1e-4, random_state=42 ... ) >>> mutual_info_regression(X, y) - array([0.1..., 2.6... , 0.0...]) + array([0.117, 2.645, 0.0287]) """ return _estimate_mi( X, @@ -564,8 +564,8 @@ def mutual_info_classif( ... shuffle=False, random_state=42 ... ) >>> mutual_info_classif(X, y) - array([0.58..., 0.10..., 0.19..., 0.09... , 0. , - 0. , 0. , 0. , 0. , 0. ]) + array([0.589, 0.107, 0.196, 0.0968 , 0., + 0. , 0. , 0. , 0. , 0.]) """ check_classification_targets(y) return _estimate_mi( diff --git a/sklearn/feature_selection/_univariate_selection.py b/sklearn/feature_selection/_univariate_selection.py index fe07b48f4fc2e..7671a7ad7921d 100644 --- a/sklearn/feature_selection/_univariate_selection.py +++ b/sklearn/feature_selection/_univariate_selection.py @@ -158,13 +158,13 @@ def f_classif(X, y): ... ) >>> f_statistic, p_values = f_classif(X, y) >>> f_statistic - array([2.2...e+02, 7.0...e-01, 1.6...e+00, 9.3...e-01, - 5.4...e+00, 3.2...e-01, 4.7...e-02, 5.7...e-01, - 7.5...e-01, 8.9...e-02]) + array([2.21e+02, 7.02e-01, 1.70e+00, 9.31e-01, + 5.41e+00, 3.25e-01, 4.71e-02, 5.72e-01, + 7.54e-01, 8.90e-02]) >>> p_values - array([7.1...e-27, 4.0...e-01, 1.9...e-01, 3.3...e-01, - 2.2...e-02, 5.7...e-01, 8.2...e-01, 4.5...e-01, - 3.8...e-01, 7.6...e-01]) + array([7.14e-27, 4.04e-01, 1.96e-01, 3.37e-01, + 2.21e-02, 5.70e-01, 8.29e-01, 4.51e-01, + 3.87e-01, 7.66e-01]) """ X, y = check_X_y(X, y, accept_sparse=["csr", "csc", "coo"]) args = [X[safe_mask(X, y == k)] for k in np.unique(y)] @@ -253,9 +253,9 @@ def chi2(X, y): >>> y = np.array([1, 1, 0, 0, 2, 2]) >>> chi2_stats, p_values = chi2(X, y) >>> chi2_stats - array([15.3..., 6.5 , 8.9...]) + array([15.3, 6.5 , 8.9]) >>> p_values - array([0.0004..., 0.0387..., 0.0116... ]) + array([0.000456, 0.0387, 0.0116 ]) """ # XXX: we might want to do some of the following in logspace instead for @@ -359,7 +359,7 @@ def r_regression(X, y, *, center=True, force_finite=True): ... n_samples=50, n_features=3, n_informative=1, noise=1e-4, random_state=42 ... ) >>> r_regression(X, y) - array([-0.15..., 1. , -0.22...]) + array([-0.157, 1. , -0.229]) """ X, y = check_X_y(X, y, accept_sparse=["csr", "csc", "coo"], dtype=np.float64) n_samples = X.shape[0] @@ -492,9 +492,9 @@ def f_regression(X, y, *, center=True, force_finite=True): ... ) >>> f_statistic, p_values = f_regression(X, y) >>> f_statistic - array([1.2...+00, 2.6...+13, 2.6...+00]) + array([1.21, 2.67e13, 2.66]) >>> p_values - array([2.7..., 1.5..., 1.0...]) + array([0.276, 1.54e-283, 0.11]) """ correlation_coefficient = r_regression( X, y, center=center, force_finite=force_finite diff --git a/sklearn/gaussian_process/_gpr.py b/sklearn/gaussian_process/_gpr.py index 208d6cb12a16c..d56e7735be787 100644 --- a/sklearn/gaussian_process/_gpr.py +++ b/sklearn/gaussian_process/_gpr.py @@ -186,7 +186,7 @@ def optimizer(obj_func, initial_theta, bounds): >>> gpr.score(X, y) 0.3680... >>> gpr.predict(X[:2,:], return_std=True) - (array([653.0..., 592.1...]), array([316.6..., 316.6...])) + (array([653.0, 592.1]), array([316.6, 316.6])) """ _parameter_constraints: dict = { diff --git a/sklearn/gaussian_process/kernels.py b/sklearn/gaussian_process/kernels.py index b5b9d56a20612..4a0a6ec667be4 100644 --- a/sklearn/gaussian_process/kernels.py +++ b/sklearn/gaussian_process/kernels.py @@ -1024,9 +1024,9 @@ class Exponentiation(Kernel): >>> gpr = GaussianProcessRegressor(kernel=kernel, alpha=5, ... random_state=0).fit(X, y) >>> gpr.score(X, y) - 0.419... + 0.419 >>> gpr.predict(X[:1,:], return_std=True) - (array([635.5...]), array([0.559...])) + (array([635.5]), array([0.559])) """ def __init__(self, kernel, exponent): @@ -1223,9 +1223,9 @@ class ConstantKernel(StationaryKernelMixin, GenericKernelMixin, Kernel): >>> gpr = GaussianProcessRegressor(kernel=kernel, alpha=5, ... random_state=0).fit(X, y) >>> gpr.score(X, y) - 0.3696... + 0.3696 >>> gpr.predict(X[:1,:], return_std=True) - (array([606.1...]), array([0.24...])) + (array([606.1]), array([0.248])) """ def __init__(self, constant_value=1.0, constant_value_bounds=(1e-5, 1e5)): @@ -1353,9 +1353,9 @@ class WhiteKernel(StationaryKernelMixin, GenericKernelMixin, Kernel): >>> gpr = GaussianProcessRegressor(kernel=kernel, ... random_state=0).fit(X, y) >>> gpr.score(X, y) - 0.3680... + 0.3680 >>> gpr.predict(X[:2,:], return_std=True) - (array([653.0..., 592.1... ]), array([316.6..., 316.6...])) + (array([653.0, 592.1 ]), array([316.6, 316.6])) """ def __init__(self, noise_level=1.0, noise_level_bounds=(1e-5, 1e5)): @@ -1497,10 +1497,10 @@ class RBF(StationaryKernelMixin, NormalizedKernelMixin, Kernel): >>> gpc = GaussianProcessClassifier(kernel=kernel, ... random_state=0).fit(X, y) >>> gpc.score(X, y) - 0.9866... + 0.9866 >>> gpc.predict_proba(X[:2,:]) - array([[0.8354..., 0.03228..., 0.1322...], - [0.7906..., 0.0652..., 0.1441...]]) + array([[0.8354, 0.03228, 0.1322], + [0.7906, 0.0652, 0.1441]]) """ def __init__(self, length_scale=1.0, length_scale_bounds=(1e-5, 1e5)): @@ -1667,10 +1667,10 @@ class Matern(RBF): >>> gpc = GaussianProcessClassifier(kernel=kernel, ... random_state=0).fit(X, y) >>> gpc.score(X, y) - 0.9866... + 0.9866 >>> gpc.predict_proba(X[:2,:]) - array([[0.8513..., 0.0368..., 0.1117...], - [0.8086..., 0.0693..., 0.1220...]]) + array([[0.8513, 0.0368, 0.1117], + [0.8086, 0.0693, 0.1220]]) """ def __init__(self, length_scale=1.0, length_scale_bounds=(1e-5, 1e5), nu=1.5): @@ -1850,10 +1850,10 @@ class RationalQuadratic(StationaryKernelMixin, NormalizedKernelMixin, Kernel): >>> gpc = GaussianProcessClassifier(kernel=kernel, ... random_state=0).fit(X, y) >>> gpc.score(X, y) - 0.9733... + 0.9733 >>> gpc.predict_proba(X[:2,:]) - array([[0.8881..., 0.0566..., 0.05518...], - [0.8678..., 0.0707... , 0.0614...]]) + array([[0.8881, 0.0566, 0.05518], + [0.8678, 0.0707 , 0.0614]]) """ def __init__( @@ -1999,9 +1999,9 @@ class ExpSineSquared(StationaryKernelMixin, NormalizedKernelMixin, Kernel): >>> gpr = GaussianProcessRegressor(kernel=kernel, alpha=5, ... random_state=0).fit(X, y) >>> gpr.score(X, y) - 0.0144... + 0.0144 >>> gpr.predict(X[:2,:], return_std=True) - (array([425.6..., 457.5...]), array([0.3894..., 0.3467...])) + (array([425.6, 457.5]), array([0.3894, 0.3467])) """ def __init__( @@ -2146,9 +2146,9 @@ class DotProduct(Kernel): >>> gpr = GaussianProcessRegressor(kernel=kernel, ... random_state=0).fit(X, y) >>> gpr.score(X, y) - 0.3680... + 0.3680 >>> gpr.predict(X[:2,:], return_std=True) - (array([653.0..., 592.1...]), array([316.6..., 316.6...])) + (array([653.0, 592.1]), array([316.6, 316.6])) """ def __init__(self, sigma_0=1.0, sigma_0_bounds=(1e-5, 1e5)): @@ -2296,10 +2296,10 @@ class PairwiseKernel(Kernel): >>> gpc = GaussianProcessClassifier(kernel=kernel, ... random_state=0).fit(X, y) >>> gpc.score(X, y) - 0.9733... + 0.9733 >>> gpc.predict_proba(X[:2,:]) - array([[0.8880..., 0.05663..., 0.05532...], - [0.8676..., 0.07073..., 0.06165...]]) + array([[0.8880, 0.05663, 0.05532], + [0.8676, 0.07073, 0.06165]]) """ def __init__( diff --git a/sklearn/impute/_iterative.py b/sklearn/impute/_iterative.py index 86723c8245d44..ddae5373c5460 100644 --- a/sklearn/impute/_iterative.py +++ b/sklearn/impute/_iterative.py @@ -281,9 +281,9 @@ class IterativeImputer(_BaseImputer): IterativeImputer(random_state=0) >>> X = [[np.nan, 2, 3], [4, np.nan, 6], [10, np.nan, 9]] >>> imp_mean.transform(X) - array([[ 6.9584..., 2. , 3. ], - [ 4. , 2.6000..., 6. ], - [10. , 4.9999..., 9. ]]) + array([[ 6.9584, 2. , 3. ], + [ 4. , 2.6000, 6. ], + [10. , 4.9999, 9. ]]) For a more detailed example see :ref:`sphx_glr_auto_examples_impute_plot_missing_values.py` or diff --git a/sklearn/inspection/_partial_dependence.py b/sklearn/inspection/_partial_dependence.py index 4d75daa8b95ae..ad352c45cc03b 100644 --- a/sklearn/inspection/_partial_dependence.py +++ b/sklearn/inspection/_partial_dependence.py @@ -572,7 +572,7 @@ def partial_dependence( >>> gb = GradientBoostingClassifier(random_state=0).fit(X, y) >>> partial_dependence(gb, features=[0], X=X, percentiles=(0, 1), ... grid_resolution=2) # doctest: +SKIP - (array([[-4.52..., 4.52...]]), [array([ 0., 1.])]) + (array([[-4.52, 4.52]]), [array([ 0., 1.])]) """ check_is_fitted(estimator) diff --git a/sklearn/inspection/_permutation_importance.py b/sklearn/inspection/_permutation_importance.py index 4ee3a0ca3cb74..451062fbe272e 100644 --- a/sklearn/inspection/_permutation_importance.py +++ b/sklearn/inspection/_permutation_importance.py @@ -262,9 +262,9 @@ def permutation_importance( >>> result = permutation_importance(clf, X, y, n_repeats=10, ... random_state=0) >>> result.importances_mean - array([0.4666..., 0. , 0. ]) + array([0.4666, 0. , 0. ]) >>> result.importances_std - array([0.2211..., 0. , 0. ]) + array([0.2211, 0. , 0. ]) """ if not hasattr(X, "iloc"): X = check_array(X, ensure_all_finite="allow-nan", dtype=None) diff --git a/sklearn/isotonic.py b/sklearn/isotonic.py index 451d0544f672d..2f2c56ae5d13c 100644 --- a/sklearn/isotonic.py +++ b/sklearn/isotonic.py @@ -151,8 +151,8 @@ def isotonic_regression( -------- >>> from sklearn.isotonic import isotonic_regression >>> isotonic_regression([5, 3, 1, 2, 8, 10, 7, 9, 6, 4]) - array([2.75 , 2.75 , 2.75 , 2.75 , 7.33..., - 7.33..., 7.33..., 7.33..., 7.33..., 7.33...]) + array([2.75 , 2.75 , 2.75 , 2.75 , 7.33, + 7.33, 7.33, 7.33, 7.33, 7.33]) """ y = check_array(y, ensure_2d=False, input_name="y", dtype=[np.float64, np.float32]) if sp_base_version >= parse_version("1.12.0"): @@ -271,7 +271,7 @@ class IsotonicRegression(RegressorMixin, TransformerMixin, BaseEstimator): >>> X, y = make_regression(n_samples=10, n_features=1, random_state=41) >>> iso_reg = IsotonicRegression().fit(X, y) >>> iso_reg.predict([.1, .2]) - array([1.8628..., 3.7256...]) + array([1.8628, 3.7256]) """ # T should have been called X diff --git a/sklearn/linear_model/_base.py b/sklearn/linear_model/_base.py index 1c9ab10531177..c059e3fa84310 100644 --- a/sklearn/linear_model/_base.py +++ b/sklearn/linear_model/_base.py @@ -559,7 +559,7 @@ class LinearRegression(MultiOutputMixin, RegressorMixin, LinearModel): >>> reg.coef_ array([1., 2.]) >>> reg.intercept_ - np.float64(3.0...) + np.float64(3.0) >>> reg.predict(np.array([[3, 5]])) array([16.]) """ diff --git a/sklearn/linear_model/_coordinate_descent.py b/sklearn/linear_model/_coordinate_descent.py index c0c14cbb12f32..62096133ada2f 100644 --- a/sklearn/linear_model/_coordinate_descent.py +++ b/sklearn/linear_model/_coordinate_descent.py @@ -535,16 +535,16 @@ def enet_path( ... n_samples=100, n_features=5, n_informative=2, coef=True, random_state=0 ... ) >>> true_coef - array([ 0. , 0. , 0. , 97.9..., 45.7...]) + array([ 0. , 0. , 0. , 97.9, 45.7]) >>> alphas, estimated_coef, _ = enet_path(X, y, n_alphas=3) >>> alphas.shape (3,) >>> estimated_coef - array([[ 0. , 0.78..., 0.56...], - [ 0. , 1.12..., 0.61...], - [-0. , -2.12..., -1.12...], - [ 0. , 23.04..., 88.93...], - [ 0. , 10.63..., 41.56...]]) + array([[ 0., 0.787, 0.568], + [ 0., 1.120, 0.620], + [-0., -2.129, -1.128], + [ 0., 23.046, 88.939], + [ 0., 10.637, 41.566]]) """ X_offset_param = params.pop("X_offset", None) X_scale_param = params.pop("X_scale", None) @@ -872,9 +872,9 @@ class ElasticNet(MultiOutputMixin, RegressorMixin, LinearModel): >>> print(regr.coef_) [18.83816048 64.55968825] >>> print(regr.intercept_) - 1.451... + 1.451 >>> print(regr.predict([[0, 0]])) - [1.451...] + [1.451] """ # "check_input" is used for optimisation and isn't something to be passed @@ -1303,7 +1303,7 @@ class Lasso(ElasticNet): >>> print(clf.coef_) [0.85 0. ] >>> print(clf.intercept_) - 0.15... + 0.15 """ _parameter_constraints: dict = { @@ -2093,9 +2093,9 @@ class LassoCV(RegressorMixin, LinearModelCV): >>> X, y = make_regression(noise=4, random_state=0) >>> reg = LassoCV(cv=5, random_state=0).fit(X, y) >>> reg.score(X, y) - 0.9993... + 0.9993 >>> reg.predict(X[:1,]) - array([-78.4951...]) + array([-78.4951]) """ path = staticmethod(lasso_path) @@ -2375,11 +2375,11 @@ class ElasticNetCV(RegressorMixin, LinearModelCV): >>> regr.fit(X, y) ElasticNetCV(cv=5, random_state=0) >>> print(regr.alpha_) - 0.199... + 0.199 >>> print(regr.intercept_) - 0.398... + 0.398 >>> print(regr.predict([[0, 0]])) - [0.398...] + [0.398] """ _parameter_constraints: dict = { @@ -3305,11 +3305,11 @@ class MultiTaskLassoCV(RegressorMixin, LinearModelCV): >>> X, y = make_regression(n_targets=2, noise=4, random_state=0) >>> reg = MultiTaskLassoCV(cv=5, random_state=0).fit(X, y) >>> r2_score(y, reg.predict(X)) - 0.9994... + 0.9994 >>> reg.alpha_ - np.float64(0.5713...) + np.float64(0.5713) >>> reg.predict(X[:1,]) - array([[153.7971..., 94.9015...]]) + array([[153.7971, 94.9015]]) """ _parameter_constraints: dict = { diff --git a/sklearn/linear_model/_glm/glm.py b/sklearn/linear_model/_glm/glm.py index fc31f9825d2e5..c9e10c6378bac 100644 --- a/sklearn/linear_model/_glm/glm.py +++ b/sklearn/linear_model/_glm/glm.py @@ -558,13 +558,13 @@ class PoissonRegressor(_GeneralizedLinearRegressor): >>> clf.fit(X, y) PoissonRegressor() >>> clf.score(X, y) - np.float64(0.990...) + np.float64(0.990) >>> clf.coef_ - array([0.121..., 0.158...]) + array([0.121, 0.158]) >>> clf.intercept_ - np.float64(2.088...) + np.float64(2.088) >>> clf.predict([[1, 1], [3, 4]]) - array([10.676..., 21.875...]) + array([10.676, 21.875]) """ _parameter_constraints: dict = { @@ -690,13 +690,13 @@ class GammaRegressor(_GeneralizedLinearRegressor): >>> clf.fit(X, y) GammaRegressor() >>> clf.score(X, y) - np.float64(0.773...) + np.float64(0.773) >>> clf.coef_ - array([0.072..., 0.066...]) + array([0.073, 0.067]) >>> clf.intercept_ - np.float64(2.896...) + np.float64(2.896) >>> clf.predict([[1, 0], [2, 8]]) - array([19.483..., 35.795...]) + array([19.483, 35.795]) """ _parameter_constraints: dict = { @@ -852,13 +852,13 @@ class TweedieRegressor(_GeneralizedLinearRegressor): >>> clf.fit(X, y) TweedieRegressor() >>> clf.score(X, y) - np.float64(0.839...) + np.float64(0.839) >>> clf.coef_ - array([0.599..., 0.299...]) + array([0.599, 0.299]) >>> clf.intercept_ - np.float64(1.600...) + np.float64(1.600) >>> clf.predict([[1, 1], [3, 4]]) - array([2.500..., 4.599...]) + array([2.500, 4.599]) """ _parameter_constraints: dict = { diff --git a/sklearn/linear_model/_huber.py b/sklearn/linear_model/_huber.py index 598d208df535c..51f24035a3c83 100644 --- a/sklearn/linear_model/_huber.py +++ b/sklearn/linear_model/_huber.py @@ -235,9 +235,9 @@ class HuberRegressor(LinearModel, RegressorMixin, BaseEstimator): >>> y[:4] = rng.uniform(10, 20, 4) >>> huber = HuberRegressor().fit(X, y) >>> huber.score(X, y) - -7.284... + -7.284 >>> huber.predict(X[:1,]) - array([806.7200...]) + array([806.7200]) >>> linear = LinearRegression().fit(X, y) >>> print("True coefficients:", coef) True coefficients: [20.4923... 34.1698...] diff --git a/sklearn/linear_model/_least_angle.py b/sklearn/linear_model/_least_angle.py index abbd3837bcf43..4bffe5f6e8c0d 100644 --- a/sklearn/linear_model/_least_angle.py +++ b/sklearn/linear_model/_least_angle.py @@ -197,7 +197,7 @@ def lars_path( ... n_samples=100, n_features=5, n_informative=2, coef=True, random_state=0 ... ) >>> true_coef - array([ 0. , 0. , 0. , 97.9..., 45.7...]) + array([ 0. , 0. , 0. , 97.9, 45.7]) >>> alphas, _, estimated_coef = lars_path(X, y) >>> alphas.shape (3,) @@ -205,8 +205,8 @@ def lars_path( array([[ 0. , 0. , 0. ], [ 0. , 0. , 0. ], [ 0. , 0. , 0. ], - [ 0. , 46.96..., 97.99...], - [ 0. , 0. , 45.70...]]) + [ 0. , 46.96, 97.99], + [ 0. , 0. , 45.70]]) """ if X is None and Gram is not None: raise ValueError( @@ -378,7 +378,7 @@ def lars_path_gram( ... n_samples=100, n_features=5, n_informative=2, coef=True, random_state=0 ... ) >>> true_coef - array([ 0. , 0. , 0. , 97.9..., 45.7...]) + array([ 0. , 0. , 0. , 97.9, 45.7]) >>> alphas, _, estimated_coef = lars_path_gram(X.T @ y, X.T @ X, n_samples=100) >>> alphas.shape (3,) @@ -386,8 +386,8 @@ def lars_path_gram( array([[ 0. , 0. , 0. ], [ 0. , 0. , 0. ], [ 0. , 0. , 0. ], - [ 0. , 46.96..., 97.99...], - [ 0. , 0. , 45.70...]]) + [ 0. , 46.96, 97.99], + [ 0. , 0. , 45.70]]) """ return _lars_path_solver( X=None, @@ -1024,7 +1024,7 @@ class Lars(MultiOutputMixin, RegressorMixin, LinearModel): >>> reg.fit([[-1, 1], [0, 0], [1, 1]], [-1.1111, 0, -1.1111]) Lars(n_nonzero_coefs=1) >>> print(reg.coef_) - [ 0. -1.11...] + [ 0. -1.11] """ _parameter_constraints: dict = { @@ -1345,7 +1345,7 @@ class LassoLars(Lars): >>> reg.fit([[-1, 1], [0, 0], [1, 1]], [-1, 0, -1]) LassoLars(alpha=0.01) >>> print(reg.coef_) - [ 0. -0.955...] + [ 0. -0.955] """ _parameter_constraints: dict = { @@ -1642,11 +1642,11 @@ class LarsCV(Lars): >>> X, y = make_regression(n_samples=200, noise=4.0, random_state=0) >>> reg = LarsCV(cv=5).fit(X, y) >>> reg.score(X, y) - 0.9996... + 0.9996 >>> reg.alpha_ - np.float64(0.2961...) + np.float64(0.2961) >>> reg.predict(X[:1,]) - array([154.3996...]) + array([154.3996]) """ _parameter_constraints: dict = { @@ -1984,11 +1984,11 @@ class LassoLarsCV(LarsCV): >>> X, y = make_regression(noise=4.0, random_state=0) >>> reg = LassoLarsCV(cv=5).fit(X, y) >>> reg.score(X, y) - 0.9993... + 0.9993 >>> reg.alpha_ - np.float64(0.3972...) + np.float64(0.3972) >>> reg.predict(X[:1,]) - array([-78.4831...]) + array([-78.4831]) """ _parameter_constraints = { @@ -2177,7 +2177,7 @@ class LassoLarsIC(LassoLars): >>> reg.fit(X, y) LassoLarsIC(criterion='bic') >>> print(reg.coef_) - [ 0. -1.11...] + [ 0. -1.11] """ _parameter_constraints: dict = { diff --git a/sklearn/linear_model/_logistic.py b/sklearn/linear_model/_logistic.py index 94e180ba54238..89a17b7fffe0d 100644 --- a/sklearn/linear_model/_logistic.py +++ b/sklearn/linear_model/_logistic.py @@ -1107,10 +1107,10 @@ class LogisticRegression(LinearClassifierMixin, SparseCoefMixin, BaseEstimator): >>> clf.predict(X[:2, :]) array([0, 0]) >>> clf.predict_proba(X[:2, :]) - array([[9.8...e-01, 1.8...e-02, 1.4...e-08], - [9.7...e-01, 2.8...e-02, ...e-08]]) + array([[9.82e-01, 1.82e-02, 1.44e-08], + [9.72e-01, 2.82e-02, 3.02e-08]]) >>> clf.score(X, y) - 0.97... + 0.97 For a comparison of the LogisticRegression with other classifiers see: :ref:`sphx_glr_auto_examples_classification_plot_classification_probability.py`. diff --git a/sklearn/linear_model/_omp.py b/sklearn/linear_model/_omp.py index aad9d1184fb8f..2f4dbac2d7634 100644 --- a/sklearn/linear_model/_omp.py +++ b/sklearn/linear_model/_omp.py @@ -397,7 +397,7 @@ def orthogonal_mp( >>> coef.shape (100,) >>> X[:1,] @ coef - array([-78.68...]) + array([-78.68]) """ X = check_array(X, order="F", copy=copy_X) copy_X = False @@ -575,7 +575,7 @@ def orthogonal_mp_gram( >>> coef.shape (100,) >>> X[:1,] @ coef - array([-78.68...]) + array([-78.68]) """ Gram = check_array(Gram, order="F", copy=copy_Gram) Xy = np.asarray(Xy) @@ -727,9 +727,9 @@ class OrthogonalMatchingPursuit(MultiOutputMixin, RegressorMixin, LinearModel): >>> X, y = make_regression(noise=4, random_state=0) >>> reg = OrthogonalMatchingPursuit().fit(X, y) >>> reg.score(X, y) - 0.9991... + 0.9991 >>> reg.predict(X[:1,]) - array([-78.3854...]) + array([-78.3854]) """ _parameter_constraints: dict = { @@ -994,11 +994,11 @@ class OrthogonalMatchingPursuitCV(RegressorMixin, LinearModel): ... noise=4, random_state=0) >>> reg = OrthogonalMatchingPursuitCV(cv=5).fit(X, y) >>> reg.score(X, y) - 0.9991... + 0.9991 >>> reg.n_nonzero_coefs_ np.int64(10) >>> reg.predict(X[:1,]) - array([-78.3854...]) + array([-78.3854]) """ _parameter_constraints: dict = { diff --git a/sklearn/linear_model/_ransac.py b/sklearn/linear_model/_ransac.py index 30e5b4ff39613..c18065436dc35 100644 --- a/sklearn/linear_model/_ransac.py +++ b/sklearn/linear_model/_ransac.py @@ -249,9 +249,9 @@ class RANSACRegressor( ... n_samples=200, n_features=2, noise=4.0, random_state=0) >>> reg = RANSACRegressor(random_state=0).fit(X, y) >>> reg.score(X, y) - 0.9885... + 0.9885 >>> reg.predict(X[:1,]) - array([-31.9417...]) + array([-31.9417]) For a more detailed example, see :ref:`sphx_glr_auto_examples_linear_model_plot_ransac.py` diff --git a/sklearn/linear_model/_ridge.py b/sklearn/linear_model/_ridge.py index 27bc81c095d7b..0a55291a70ace 100644 --- a/sklearn/linear_model/_ridge.py +++ b/sklearn/linear_model/_ridge.py @@ -568,11 +568,12 @@ def ridge_regression( >>> rng = np.random.RandomState(0) >>> X = rng.randn(100, 4) >>> y = 2.0 * X[:, 0] - 1.0 * X[:, 1] + 0.1 * rng.standard_normal(100) - >>> coef, intercept = ridge_regression(X, y, alpha=1.0, return_intercept=True) - >>> list(coef) - [np.float64(1.9...), np.float64(-1.0...), np.float64(-0.0...), np.float64(-0.0...)] + >>> coef, intercept = ridge_regression(X, y, alpha=1.0, return_intercept=True, + ... random_state=0) + >>> coef + array([ 1.97, -1., -2.69e-3, -9.27e-4 ]) >>> intercept - np.float64(-0.0...) + np.float64(-.0012) """ return _ridge_regression( X, diff --git a/sklearn/linear_model/_theil_sen.py b/sklearn/linear_model/_theil_sen.py index 88afc17fcf5ff..4b25145a8ca55 100644 --- a/sklearn/linear_model/_theil_sen.py +++ b/sklearn/linear_model/_theil_sen.py @@ -320,9 +320,9 @@ class TheilSenRegressor(RegressorMixin, LinearModel): ... n_samples=200, n_features=2, noise=4.0, random_state=0) >>> reg = TheilSenRegressor(random_state=0).fit(X, y) >>> reg.score(X, y) - 0.9884... + 0.9884 >>> reg.predict(X[:1,]) - array([-31.5871...]) + array([-31.5871]) """ _parameter_constraints: dict = { diff --git a/sklearn/metrics/_classification.py b/sklearn/metrics/_classification.py index f7898b2018e52..cae227ac7edb8 100644 --- a/sklearn/metrics/_classification.py +++ b/sklearn/metrics/_classification.py @@ -1036,7 +1036,7 @@ def jaccard_score( In the binary case: >>> jaccard_score(y_true[0], y_pred[0]) - 0.6666... + 0.6666 In the 2D comparison case (e.g. image similarity): @@ -1046,9 +1046,9 @@ def jaccard_score( In the multilabel case: >>> jaccard_score(y_true, y_pred, average='samples') - 0.5833... + 0.5833 >>> jaccard_score(y_true, y_pred, average='macro') - 0.6666... + 0.6666 >>> jaccard_score(y_true, y_pred, average=None) array([0.5, 0.5, 1. ]) @@ -1057,7 +1057,7 @@ def jaccard_score( >>> y_pred = [0, 2, 1, 2] >>> y_true = [0, 1, 2, 2] >>> jaccard_score(y_true, y_pred, average=None) - array([1. , 0. , 0.33...]) + array([1. , 0. , 0.33]) """ labels = _check_set_wise_labels(y_true, y_pred, average, labels, pos_label) samplewise = average == "samples" @@ -1167,7 +1167,7 @@ def matthews_corrcoef(y_true, y_pred, *, sample_weight=None): >>> y_true = [+1, +1, +1, -1] >>> y_pred = [+1, -1, +1, +1] >>> matthews_corrcoef(y_true, y_pred) - -0.33... + -0.33 """ y_true, y_pred = attach_unique(y_true, y_pred) y_type, y_true, y_pred = _check_targets(y_true, y_pred) @@ -1437,11 +1437,11 @@ def f1_score( >>> y_true = [0, 1, 2, 0, 1, 2] >>> y_pred = [0, 2, 1, 0, 0, 1] >>> f1_score(y_true, y_pred, average='macro') - 0.26... + 0.267 >>> f1_score(y_true, y_pred, average='micro') - 0.33... + 0.33 >>> f1_score(y_true, y_pred, average='weighted') - 0.26... + 0.267 >>> f1_score(y_true, y_pred, average=None) array([0.8, 0. , 0. ]) @@ -1641,17 +1641,17 @@ def fbeta_score( >>> y_true = [0, 1, 2, 0, 1, 2] >>> y_pred = [0, 2, 1, 0, 0, 1] >>> fbeta_score(y_true, y_pred, average='macro', beta=0.5) - 0.23... + 0.238 >>> fbeta_score(y_true, y_pred, average='micro', beta=0.5) - 0.33... + 0.33 >>> fbeta_score(y_true, y_pred, average='weighted', beta=0.5) - 0.23... + 0.238 >>> fbeta_score(y_true, y_pred, average=None, beta=0.5) - array([0.71..., 0. , 0. ]) + array([0.71, 0. , 0. ]) >>> y_pred_empty = [0, 0, 0, 0, 0, 0] >>> fbeta_score(y_true, y_pred_empty, ... average="macro", zero_division=np.nan, beta=0.5) - 0.12... + 0.128 """ _, _, f, _ = precision_recall_fscore_support( @@ -1951,18 +1951,18 @@ def precision_recall_fscore_support( >>> y_true = np.array(['cat', 'dog', 'pig', 'cat', 'dog', 'pig']) >>> y_pred = np.array(['cat', 'pig', 'dog', 'cat', 'cat', 'dog']) >>> precision_recall_fscore_support(y_true, y_pred, average='macro') - (0.22..., 0.33..., 0.26..., None) + (0.222, 0.333, 0.267, None) >>> precision_recall_fscore_support(y_true, y_pred, average='micro') - (0.33..., 0.33..., 0.33..., None) + (0.33, 0.33, 0.33, None) >>> precision_recall_fscore_support(y_true, y_pred, average='weighted') - (0.22..., 0.33..., 0.26..., None) + (0.222, 0.333, 0.267, None) It is possible to compute per-label precisions, recalls, F1-scores and supports instead of averaging: >>> precision_recall_fscore_support(y_true, y_pred, average=None, ... labels=['pig', 'dog', 'cat']) - (array([0. , 0. , 0.66...]), + (array([0. , 0. , 0.66]), array([0., 0., 1.]), array([0. , 0. , 0.8]), array([2, 2, 2])) """ @@ -2184,7 +2184,7 @@ class are present in `y_true`): both likelihood ratios are undefined. >>> y_true = np.array(["non-cat", "cat", "non-cat", "cat", "non-cat"]) >>> y_pred = np.array(["cat", "cat", "non-cat", "non-cat", "non-cat"]) >>> class_likelihood_ratios(y_true, y_pred, replace_undefined_by=1.0) - (1.33..., 0.66...) + (1.33, 0.66) >>> y_true = np.array(["non-zebra", "zebra", "non-zebra", "zebra", "non-zebra"]) >>> y_pred = np.array(["zebra", "zebra", "non-zebra", "non-zebra", "non-zebra"]) >>> class_likelihood_ratios(y_true, y_pred, replace_undefined_by=1.0) @@ -2499,20 +2499,20 @@ def precision_score( >>> y_true = [0, 1, 2, 0, 1, 2] >>> y_pred = [0, 2, 1, 0, 0, 1] >>> precision_score(y_true, y_pred, average='macro') - 0.22... + 0.22 >>> precision_score(y_true, y_pred, average='micro') - 0.33... + 0.33 >>> precision_score(y_true, y_pred, average='weighted') - 0.22... + 0.22 >>> precision_score(y_true, y_pred, average=None) - array([0.66..., 0. , 0. ]) + array([0.66, 0. , 0. ]) >>> y_pred = [0, 0, 0, 0, 0, 0] >>> precision_score(y_true, y_pred, average=None) - array([0.33..., 0. , 0. ]) + array([0.33, 0. , 0. ]) >>> precision_score(y_true, y_pred, average=None, zero_division=1) - array([0.33..., 1. , 1. ]) + array([0.33, 1. , 1. ]) >>> precision_score(y_true, y_pred, average=None, zero_division=np.nan) - array([0.33..., nan, nan]) + array([0.33, nan, nan]) >>> # multilabel classification >>> y_true = [[0, 0, 0], [1, 1, 1], [0, 1, 1]] @@ -2681,11 +2681,11 @@ def recall_score( >>> y_true = [0, 1, 2, 0, 1, 2] >>> y_pred = [0, 2, 1, 0, 0, 1] >>> recall_score(y_true, y_pred, average='macro') - 0.33... + 0.33 >>> recall_score(y_true, y_pred, average='micro') - 0.33... + 0.33 >>> recall_score(y_true, y_pred, average='weighted') - 0.33... + 0.33 >>> recall_score(y_true, y_pred, average=None) array([1., 0., 0.]) >>> y_true = [0, 0, 0, 0, 0, 0] @@ -3234,7 +3234,7 @@ def log_loss(y_true, y_pred, *, normalize=True, sample_weight=None, labels=None) >>> from sklearn.metrics import log_loss >>> log_loss(["spam", "ham", "ham", "spam"], ... [[.1, .9], [.9, .1], [.8, .2], [.35, .65]]) - 0.21616... + 0.21616 """ transformed_labels, y_pred = _validate_multiclass_probabilistic_prediction( y_true, y_pred, sample_weight, labels @@ -3320,9 +3320,9 @@ def hinge_loss(y_true, pred_decision, *, labels=None, sample_weight=None): LinearSVC(random_state=0) >>> pred_decision = est.decision_function([[-2], [3], [0.5]]) >>> pred_decision - array([-2.18..., 2.36..., 0.09...]) + array([-2.18, 2.36, 0.09]) >>> hinge_loss([-1, 1, 1], pred_decision) - 0.30... + 0.30 In the multiclass case: @@ -3336,7 +3336,7 @@ def hinge_loss(y_true, pred_decision, *, labels=None, sample_weight=None): >>> pred_decision = est.decision_function([[-1], [2], [3]]) >>> y_true = [0, 2, 3] >>> hinge_loss(y_true, pred_decision, labels=labels) - 0.56... + 0.56 """ check_consistent_length(y_true, pred_decision, sample_weight) pred_decision = check_array(pred_decision, ensure_2d=False) @@ -3584,21 +3584,21 @@ def brier_score_loss( >>> y_true_categorical = np.array(["spam", "ham", "ham", "spam"]) >>> y_prob = np.array([0.1, 0.9, 0.8, 0.3]) >>> brier_score_loss(y_true, y_prob) - 0.037... + 0.0375 >>> brier_score_loss(y_true, 1-y_prob, pos_label=0) - 0.037... + 0.0375 >>> brier_score_loss(y_true_categorical, y_prob, pos_label="ham") - 0.037... + 0.0375 >>> brier_score_loss(y_true, np.array(y_prob) > 0.5) 0.0 >>> brier_score_loss(y_true, y_prob, scale_by_half=False) - 0.074... + 0.075 >>> brier_score_loss( ... ["eggs", "ham", "spam"], ... [[0.8, 0.1, 0.1], [0.2, 0.7, 0.1], [0.2, 0.2, 0.6]], ... labels=["eggs", "ham", "spam"] ... ) - 0.146... + 0.146 """ y_proba = check_array( y_proba, ensure_2d=False, dtype=[np.float64, np.float32, np.float16] diff --git a/sklearn/metrics/_ranking.py b/sklearn/metrics/_ranking.py index 560fd81076914..d4fba69440f13 100644 --- a/sklearn/metrics/_ranking.py +++ b/sklearn/metrics/_ranking.py @@ -203,7 +203,7 @@ def average_precision_score( >>> y_true = np.array([0, 0, 1, 1]) >>> y_scores = np.array([0.1, 0.4, 0.35, 0.8]) >>> average_precision_score(y_true, y_scores) - 0.83... + 0.83 >>> y_true = np.array([0, 0, 1, 1, 2, 2]) >>> y_scores = np.array([ ... [0.7, 0.2, 0.1], @@ -214,7 +214,7 @@ def average_precision_score( ... [0.1, 0.2, 0.7], ... ]) >>> average_precision_score(y_true, y_scores) - 0.77... + 0.77 """ def _binary_uninterpolated_average_precision( @@ -624,9 +624,9 @@ class scores must correspond to the order of ``labels``, >>> X, y = load_breast_cancer(return_X_y=True) >>> clf = LogisticRegression(solver="newton-cholesky", random_state=0).fit(X, y) >>> roc_auc_score(y, clf.predict_proba(X)[:, 1]) - 0.99... + 0.99 >>> roc_auc_score(y, clf.decision_function(X)) - 0.99... + 0.99 Multiclass case: @@ -634,7 +634,7 @@ class scores must correspond to the order of ``labels``, >>> X, y = load_iris(return_X_y=True) >>> clf = LogisticRegression(solver="newton-cholesky").fit(X, y) >>> roc_auc_score(y, clf.predict_proba(X), multi_class='ovr') - 0.99... + 0.99 Multilabel case: @@ -649,11 +649,11 @@ class scores must correspond to the order of ``labels``, >>> # extract the positive columns for each output >>> y_score = np.transpose([score[:, 1] for score in y_score]) >>> roc_auc_score(y, y_score, average=None) - array([0.82..., 0.85..., 0.93..., 0.86..., 0.94...]) + array([0.828, 0.852, 0.94, 0.869, 0.95]) >>> from sklearn.linear_model import RidgeClassifierCV >>> clf = RidgeClassifierCV().fit(X, y) >>> roc_auc_score(y, clf.decision_function(X), average=None) - array([0.81..., 0.84... , 0.93..., 0.87..., 0.94...]) + array([0.82, 0.847, 0.93, 0.872, 0.944]) """ y_type = type_of_target(y_true, input_name="y_true") @@ -1257,7 +1257,7 @@ def label_ranking_average_precision_score(y_true, y_score, *, sample_weight=None >>> y_true = np.array([[1, 0, 0], [0, 0, 1]]) >>> y_score = np.array([[0.75, 0.5, 1], [1, 0.2, 0.1]]) >>> label_ranking_average_precision_score(y_true, y_score) - 0.416... + 0.416 """ check_consistent_length(y_true, y_score, sample_weight) y_true = check_array(y_true, ensure_2d=False, accept_sparse="csr") @@ -1441,7 +1441,7 @@ def label_ranking_loss(y_true, y_score, *, sample_weight=None): >>> y_true = [[1, 0, 0], [0, 0, 1]] >>> y_score = [[0.75, 0.5, 1], [1, 0.2, 0.1]] >>> label_ranking_loss(y_true, y_score) - 0.75... + 0.75 """ y_true = check_array(y_true, ensure_2d=False, accept_sparse="csr") y_score = check_array(y_score, ensure_2d=False) @@ -1697,10 +1697,10 @@ def dcg_score( >>> # we predict scores for the answers >>> scores = np.asarray([[.1, .2, .3, 4, 70]]) >>> dcg_score(true_relevance, scores) - 9.49... + 9.49 >>> # we can set k to truncate the sum; only top k answers contribute >>> dcg_score(true_relevance, scores, k=2) - 5.63... + 5.63 >>> # now we have some ties in our prediction >>> scores = np.asarray([[1, 0, 0, 0, 1]]) >>> # by default ties are averaged, so here we get the average true @@ -1859,13 +1859,13 @@ def ndcg_score(y_true, y_score, *, k=None, sample_weight=None, ignore_ties=False >>> # we predict some scores (relevance) for the answers >>> scores = np.asarray([[.1, .2, .3, 4, 70]]) >>> ndcg_score(true_relevance, scores) - 0.69... + 0.69 >>> scores = np.asarray([[.05, 1.1, 1., .5, .0]]) >>> ndcg_score(true_relevance, scores) - 0.49... + 0.49 >>> # we can set k to truncate the sum; only top k answers contribute. >>> ndcg_score(true_relevance, scores, k=4) - 0.35... + 0.35 >>> # the normalization takes k into account so a perfect answer >>> # would still get 1.0 >>> ndcg_score(true_relevance, true_relevance, k=4) @@ -1875,7 +1875,7 @@ def ndcg_score(y_true, y_score, *, k=None, sample_weight=None, ignore_ties=False >>> # by default ties are averaged, so here we get the average (normalized) >>> # true relevance of our top predictions: (10 / 10 + 5 / 10) / 2 = .75 >>> ndcg_score(true_relevance, scores, k=1) - 0.75... + 0.75 >>> # we can choose to ignore ties for faster results, but only >>> # if we know there aren't ties in our scores, otherwise we get >>> # wrong results: diff --git a/sklearn/metrics/cluster/_supervised.py b/sklearn/metrics/cluster/_supervised.py index b46c76f9feba6..ccc11d752adba 100644 --- a/sklearn/metrics/cluster/_supervised.py +++ b/sklearn/metrics/cluster/_supervised.py @@ -324,7 +324,7 @@ def rand_score(labels_true, labels_pred): are complete but may not always be pure, hence penalized: >>> rand_score([0, 0, 1, 2], [0, 0, 1, 1]) - 0.83... + 0.83 """ contingency = pair_confusion_matrix(labels_true, labels_pred) numerator = contingency.diagonal().sum() @@ -417,13 +417,13 @@ def adjusted_rand_score(labels_true, labels_pred): are complete but may not always be pure, hence penalized:: >>> adjusted_rand_score([0, 0, 1, 2], [0, 0, 1, 1]) - 0.57... + 0.57 ARI is symmetric, so labelings that have pure clusters with members coming from the same classes but unnecessary splits are penalized:: >>> adjusted_rand_score([0, 0, 1, 1], [0, 0, 1, 2]) - 0.57... + 0.57 If classes members are completely split across different clusters, the assignment is totally incomplete, hence the ARI is very low:: @@ -523,7 +523,7 @@ def homogeneity_completeness_v_measure(labels_true, labels_pred, *, beta=1.0): >>> from sklearn.metrics import homogeneity_completeness_v_measure >>> y_true, y_pred = [0, 0, 1, 1, 2, 2], [0, 0, 1, 2, 2, 2] >>> homogeneity_completeness_v_measure(y_true, y_pred) - (0.71..., 0.77..., 0.73...) + (0.71, 0.771, 0.74) """ labels_true, labels_pred = check_clusterings(labels_true, labels_pred) @@ -691,7 +691,7 @@ def completeness_score(labels_true, labels_pred): >>> print(completeness_score([0, 0, 1, 1], [0, 0, 0, 0])) 1.0 >>> print(completeness_score([0, 1, 2, 3], [0, 0, 1, 1])) - 0.999... + 0.999 If classes members are split across different clusters, the assignment cannot be complete:: @@ -780,30 +780,30 @@ def v_measure_score(labels_true, labels_pred, *, beta=1.0): are complete but not homogeneous, hence penalized:: >>> print("%.6f" % v_measure_score([0, 0, 1, 2], [0, 0, 1, 1])) - 0.8... + 0.8 >>> print("%.6f" % v_measure_score([0, 1, 2, 3], [0, 0, 1, 1])) - 0.66... + 0.67 Labelings that have pure clusters with members coming from the same classes are homogeneous but un-necessary splits harm completeness and thus penalize V-measure as well:: >>> print("%.6f" % v_measure_score([0, 0, 1, 1], [0, 0, 1, 2])) - 0.8... + 0.8 >>> print("%.6f" % v_measure_score([0, 0, 1, 1], [0, 1, 2, 3])) - 0.66... + 0.67 If classes members are completely split across different clusters, the assignment is totally incomplete, hence the V-Measure is null:: >>> print("%.6f" % v_measure_score([0, 0, 0, 0], [0, 1, 2, 3])) - 0.0... + 0.0 Clusters that include samples from totally different classes totally destroy the homogeneity of the labeling, hence:: >>> print("%.6f" % v_measure_score([0, 0, 1, 1], [0, 0, 0, 0])) - 0.0... + 0.0 """ return homogeneity_completeness_v_measure(labels_true, labels_pred, beta=beta)[2] @@ -880,7 +880,7 @@ def mutual_info_score(labels_true, labels_pred, *, contingency=None): >>> labels_true = [0, 1, 1, 0, 1, 0] >>> labels_pred = [0, 1, 0, 0, 1, 1] >>> mutual_info_score(labels_true, labels_pred) - 0.056... + 0.0566 """ if contingency is None: labels_true, labels_pred = check_clusterings(labels_true, labels_pred) diff --git a/sklearn/metrics/pairwise.py b/sklearn/metrics/pairwise.py index fa90dedb06da7..f0e6cee65bc28 100644 --- a/sklearn/metrics/pairwise.py +++ b/sklearn/metrics/pairwise.py @@ -1158,8 +1158,8 @@ def cosine_distances(X, Y=None): >>> X = [[0, 0, 0], [1, 1, 1]] >>> Y = [[1, 0, 0], [1, 1, 0]] >>> cosine_distances(X, Y) - array([[1. , 1. ], - [0.42..., 0.18...]]) + array([[1. , 1. ], + [0.422, 0.183]]) """ xp, _ = get_namespace(X, Y) @@ -1291,7 +1291,7 @@ def paired_cosine_distances(X, Y): >>> X = [[0, 0, 0], [1, 1, 1]] >>> Y = [[1, 0, 0], [1, 1, 0]] >>> paired_cosine_distances(X, Y) - array([0.5 , 0.18...]) + array([0.5 , 0.184]) """ X, Y = check_paired_arrays(X, Y) return 0.5 * row_norms(normalize(X) - normalize(Y), squared=True) @@ -1476,7 +1476,7 @@ def polynomial_kernel(X, Y=None, degree=3, gamma=None, coef0=1): >>> Y = [[1, 0, 0], [1, 1, 0]] >>> polynomial_kernel(X, Y, degree=2) array([[1. , 1. ], - [1.77..., 2.77...]]) + [1.77, 2.77]]) """ X, Y = check_pairwise_arrays(X, Y) if gamma is None: @@ -1536,8 +1536,8 @@ def sigmoid_kernel(X, Y=None, gamma=None, coef0=1): >>> X = [[0, 0, 0], [1, 1, 1]] >>> Y = [[1, 0, 0], [1, 1, 0]] >>> sigmoid_kernel(X, Y) - array([[0.76..., 0.76...], - [0.87..., 0.93...]]) + array([[0.76, 0.76], + [0.87, 0.93]]) """ xp, _ = get_namespace(X, Y) X, Y = check_pairwise_arrays(X, Y) @@ -1597,8 +1597,8 @@ def rbf_kernel(X, Y=None, gamma=None): >>> X = [[0, 0, 0], [1, 1, 1]] >>> Y = [[1, 0, 0], [1, 1, 0]] >>> rbf_kernel(X, Y) - array([[0.71..., 0.51...], - [0.51..., 0.71...]]) + array([[0.71, 0.51], + [0.51, 0.71]]) """ xp, _ = get_namespace(X, Y) X, Y = check_pairwise_arrays(X, Y) @@ -1660,8 +1660,8 @@ def laplacian_kernel(X, Y=None, gamma=None): >>> X = [[0, 0, 0], [1, 1, 1]] >>> Y = [[1, 0, 0], [1, 1, 0]] >>> laplacian_kernel(X, Y) - array([[0.71..., 0.51...], - [0.51..., 0.71...]]) + array([[0.71, 0.51], + [0.51, 0.71]]) """ X, Y = check_pairwise_arrays(X, Y) if gamma is None: @@ -1722,8 +1722,8 @@ def cosine_similarity(X, Y=None, dense_output=True): >>> X = [[0, 0, 0], [1, 1, 1]] >>> Y = [[1, 0, 0], [1, 1, 0]] >>> cosine_similarity(X, Y) - array([[0. , 0. ], - [0.57..., 0.81...]]) + array([[0. , 0. ], + [0.577, 0.816]]) """ X, Y = check_pairwise_arrays(X, Y) @@ -1884,8 +1884,8 @@ def chi2_kernel(X, Y=None, gamma=1.0): >>> X = [[0, 0, 0], [1, 1, 1]] >>> Y = [[1, 0, 0], [1, 1, 0]] >>> chi2_kernel(X, Y) - array([[0.36..., 0.13...], - [0.13..., 0.36...]]) + array([[0.368, 0.135], + [0.135, 0.368]]) """ xp, _ = get_namespace(X, Y) K = additive_chi2_kernel(X, Y) @@ -2166,11 +2166,11 @@ def pairwise_distances_chunked( >>> X = np.random.RandomState(0).rand(5, 3) >>> D_chunk = next(pairwise_distances_chunked(X)) >>> D_chunk - array([[0. ..., 0.29..., 0.41..., 0.19..., 0.57...], - [0.29..., 0. ..., 0.57..., 0.41..., 0.76...], - [0.41..., 0.57..., 0. ..., 0.44..., 0.90...], - [0.19..., 0.41..., 0.44..., 0. ..., 0.51...], - [0.57..., 0.76..., 0.90..., 0.51..., 0. ...]]) + array([[0. , 0.295, 0.417, 0.197, 0.572], + [0.295, 0. , 0.576, 0.419, 0.764], + [0.417, 0.576, 0. , 0.449, 0.903], + [0.197, 0.419, 0.449, 0. , 0.512], + [0.572, 0.764, 0.903, 0.512, 0. ]]) Retrieve all neighbors and average distance within radius r: @@ -2184,7 +2184,7 @@ def pairwise_distances_chunked( >>> neigh [array([0, 3]), array([1]), array([2]), array([0, 3]), array([4])] >>> avg_dist - array([0.039..., 0. , 0. , 0.039..., 0. ]) + array([0.039, 0. , 0. , 0.039, 0. ]) Where r is defined per sample, we need to make use of ``start``: diff --git a/sklearn/mixture/_bayesian_mixture.py b/sklearn/mixture/_bayesian_mixture.py index 466035332eaee..57220186faf61 100644 --- a/sklearn/mixture/_bayesian_mixture.py +++ b/sklearn/mixture/_bayesian_mixture.py @@ -342,8 +342,8 @@ class BayesianGaussianMixture(BaseMixture): >>> X = np.array([[1, 2], [1, 4], [1, 0], [4, 2], [12, 4], [10, 7]]) >>> bgm = BayesianGaussianMixture(n_components=2, random_state=42).fit(X) >>> bgm.means_ - array([[2.49... , 2.29...], - [8.45..., 4.52... ]]) + array([[2.49 , 2.29], + [8.45, 4.52 ]]) >>> bgm.predict([[0, 0], [9, 3]]) array([0, 1]) """ diff --git a/sklearn/model_selection/_search.py b/sklearn/model_selection/_search.py index 869e2dcaf57e4..61dbd7c1b1d80 100644 --- a/sklearn/model_selection/_search.py +++ b/sklearn/model_selection/_search.py @@ -1936,7 +1936,7 @@ class RandomizedSearchCV(BaseSearchCV): >>> clf = RandomizedSearchCV(logistic, distributions, random_state=0) >>> search = clf.fit(iris.data, iris.target) >>> search.best_params_ - {'C': np.float64(2...), 'penalty': 'l1'} + {'C': np.float64(2.2), 'penalty': 'l1'} """ _parameter_constraints: dict = { diff --git a/sklearn/model_selection/_validation.py b/sklearn/model_selection/_validation.py index 5275cab66b3f7..e9aa7dc77f4c6 100644 --- a/sklearn/model_selection/_validation.py +++ b/sklearn/model_selection/_validation.py @@ -335,7 +335,7 @@ def cross_validate( ... scoring=('r2', 'neg_mean_squared_error'), ... return_train_score=True) >>> print(scores['test_neg_mean_squared_error']) - [-3635.5... -3573.3... -6114.7...] + [-3635.5 -3573.3 -6114.7] >>> print(scores['train_r2']) [0.28009951 0.3908844 0.22784907] """ diff --git a/sklearn/multioutput.py b/sklearn/multioutput.py index 48b9fbd3bdf9a..08b0c95c94558 100644 --- a/sklearn/multioutput.py +++ b/sklearn/multioutput.py @@ -406,7 +406,7 @@ class MultiOutputRegressor(RegressorMixin, _MultiOutputEstimator): >>> X, y = load_linnerud(return_X_y=True) >>> regr = MultiOutputRegressor(Ridge(random_state=123)).fit(X, y) >>> regr.predict(X[[0]]) - array([[176..., 35..., 57...]]) + array([[176, 35.1, 57.1]]) """ def __init__(self, estimator, *, n_jobs=None): @@ -1018,9 +1018,9 @@ class labels for each estimator in the chain. [1., 0., 0.], [0., 1., 0.]]) >>> chain.predict_proba(X_test) - array([[0.8387..., 0.9431..., 0.4576...], - [0.8878..., 0.3684..., 0.2640...], - [0.0321..., 0.9935..., 0.0626...]]) + array([[0.8387, 0.9431, 0.4576], + [0.8878, 0.3684, 0.2640], + [0.0321, 0.9935, 0.0626]]) """ _parameter_constraints: dict = { diff --git a/sklearn/neighbors/_classification.py b/sklearn/neighbors/_classification.py index 6ef690eb8bbe4..c70b83cb1d3bd 100644 --- a/sklearn/neighbors/_classification.py +++ b/sklearn/neighbors/_classification.py @@ -182,7 +182,7 @@ class KNeighborsClassifier(KNeighborsMixin, ClassifierMixin, NeighborsBase): >>> print(neigh.predict([[1.1]])) [0] >>> print(neigh.predict_proba([[0.9]])) - [[0.666... 0.333...]] + [[0.666 0.333]] """ _parameter_constraints: dict = {**NeighborsBase._parameter_constraints} diff --git a/sklearn/neighbors/_lof.py b/sklearn/neighbors/_lof.py index c05a4f60773b0..d9f00be42570e 100644 --- a/sklearn/neighbors/_lof.py +++ b/sklearn/neighbors/_lof.py @@ -179,7 +179,7 @@ class LocalOutlierFactor(KNeighborsMixin, OutlierMixin, NeighborsBase): >>> clf.fit_predict(X) array([ 1, 1, -1, 1]) >>> clf.negative_outlier_factor_ - array([ -0.9821..., -1.0370..., -73.3697..., -0.9821...]) + array([ -0.9821, -1.0370, -73.3697, -0.9821]) """ _parameter_constraints: dict = { diff --git a/sklearn/neural_network/_multilayer_perceptron.py b/sklearn/neural_network/_multilayer_perceptron.py index d18f873e8a0db..a8a00fe3b4ac5 100644 --- a/sklearn/neural_network/_multilayer_perceptron.py +++ b/sklearn/neural_network/_multilayer_perceptron.py @@ -1143,7 +1143,7 @@ class MLPClassifier(ClassifierMixin, BaseMultilayerPerceptron): ... random_state=1) >>> clf = MLPClassifier(random_state=1, max_iter=300).fit(X_train, y_train) >>> clf.predict_proba(X_test[:1]) - array([[0.038..., 0.961...]]) + array([[0.0383, 0.961]]) >>> clf.predict(X_test[:5, :]) array([1, 0, 1, 0, 1]) >>> clf.score(X_test, y_test) @@ -1662,9 +1662,9 @@ class MLPRegressor(RegressorMixin, BaseMultilayerPerceptron): >>> regr.fit(X_train, y_train) MLPRegressor(max_iter=2000, random_state=1, tol=0.1) >>> regr.predict(X_test[:2]) - array([ 28..., -290...]) + array([ 28.98, -291]) >>> regr.score(X_test, y_test) - 0.98... + 0.98 """ _parameter_constraints: dict = { diff --git a/sklearn/pipeline.py b/sklearn/pipeline.py index 9a61d06664da7..f3fbf1e3b3299 100644 --- a/sklearn/pipeline.py +++ b/sklearn/pipeline.py @@ -1648,12 +1648,12 @@ class FeatureUnion(TransformerMixin, _BaseComposition): ... ("svd", TruncatedSVD(n_components=2))]) >>> X = [[0., 1., 3], [2., 2., 5]] >>> union.fit_transform(X) - array([[-1.5 , 3.0..., -0.8...], - [ 1.5 , 5.7..., 0.4...]]) + array([[-1.5 , 3.04, -0.872], + [ 1.5 , 5.72, 0.463]]) >>> # An estimator's parameter can be set using '__' syntax >>> union.set_params(svd__n_components=1).fit_transform(X) - array([[-1.5 , 3.0...], - [ 1.5 , 5.7...]]) + array([[-1.5 , 3.04], + [ 1.5 , 5.72]]) For a more detailed example of usage, see :ref:`sphx_glr_auto_examples_compose_plot_feature_union.py`. diff --git a/sklearn/preprocessing/_data.py b/sklearn/preprocessing/_data.py index 1349374a61ea8..fe138cda73803 100644 --- a/sklearn/preprocessing/_data.py +++ b/sklearn/preprocessing/_data.py @@ -218,8 +218,8 @@ def scale(X, *, axis=0, with_mean=True, with_std=True, copy=True): array([[-1., 1., 1.], [ 1., -1., -1.]]) >>> scale(X, axis=1) # scaling each row independently - array([[-1.37..., 0.39..., 0.98...], - [-1.22..., 0. , 1.22...]]) + array([[-1.37, 0.39, 0.98], + [-1.22, 0. , 1.22]]) """ X = check_array( X, @@ -1966,8 +1966,8 @@ def normalize(X, norm="l2", *, axis=1, copy=True, return_norm=False): array([[-0.4, 0.2, 0.4], [-0.5, 0. , 0.5]]) >>> normalize(X, norm="l2") # L2 normalization each row independently - array([[-0.66..., 0.33..., 0.66...], - [-0.70..., 0. , 0.70...]]) + array([[-0.67, 0.33, 0.67], + [-0.71, 0. , 0.71]]) """ if axis == 0: sparse_format = "csc" @@ -3275,11 +3275,11 @@ class PowerTransformer(OneToOneFeatureMixin, TransformerMixin, BaseEstimator): >>> print(pt.fit(data)) PowerTransformer() >>> print(pt.lambdas_) - [ 1.386... -3.100...] + [ 1.386 -3.100] >>> print(pt.transform(data)) - [[-1.316... -0.707...] - [ 0.209... -0.707...] - [ 1.106... 1.414...]] + [[-1.316 -0.707] + [ 0.209 -0.707] + [ 1.106 1.414]] """ _parameter_constraints: dict = { @@ -3686,9 +3686,9 @@ def power_transform(X, method="yeo-johnson", *, standardize=True, copy=True): >>> from sklearn.preprocessing import power_transform >>> data = [[1, 2], [3, 2], [4, 5]] >>> print(power_transform(data, method='box-cox')) - [[-1.332... -0.707...] - [ 0.256... -0.707...] - [ 1.076... 1.414...]] + [[-1.332 -0.707] + [ 0.256 -0.707] + [ 1.076 1.414]] .. warning:: Risk of data leak. Do not use :func:`~sklearn.preprocessing.power_transform` unless you diff --git a/sklearn/preprocessing/_function_transformer.py b/sklearn/preprocessing/_function_transformer.py index 0363f8c5b6120..3503fead2ba59 100644 --- a/sklearn/preprocessing/_function_transformer.py +++ b/sklearn/preprocessing/_function_transformer.py @@ -142,8 +142,8 @@ class FunctionTransformer(TransformerMixin, BaseEstimator): >>> transformer = FunctionTransformer(np.log1p) >>> X = np.array([[0, 1], [2, 3]]) >>> transformer.transform(X) - array([[0. , 0.6931...], - [1.0986..., 1.3862...]]) + array([[0. , 0.6931], + [1.0986, 1.3862]]) """ _parameter_constraints: dict = { diff --git a/sklearn/preprocessing/_target_encoder.py b/sklearn/preprocessing/_target_encoder.py index dc328dc5cf5db..77b404e3e39e9 100644 --- a/sklearn/preprocessing/_target_encoder.py +++ b/sklearn/preprocessing/_target_encoder.py @@ -175,15 +175,15 @@ class TargetEncoder(OneToOneFeatureMixin, _BaseEncoder): >>> # encodings: >>> enc_high_smooth = TargetEncoder(smooth=5000.0).fit(X, y) >>> enc_high_smooth.target_mean_ - np.float64(44...) + np.float64(44.3) >>> enc_high_smooth.encodings_ - [array([44..., 44..., 44...])] + [array([44.1, 44.4, 44.3])] >>> # On the other hand, a low `smooth` parameter puts more weight on target >>> # conditioned on the value of the categorical: >>> enc_low_smooth = TargetEncoder(smooth=1.0).fit(X, y) >>> enc_low_smooth.encodings_ - [array([20..., 80..., 43...])] + [array([21, 80.8, 43.2])] """ _parameter_constraints: dict = { diff --git a/sklearn/random_projection.py b/sklearn/random_projection.py index 81d32719a10ff..f98b11365dd3b 100644 --- a/sklearn/random_projection.py +++ b/sklearn/random_projection.py @@ -746,7 +746,7 @@ class SparseRandomProjection(BaseRandomProjection): (25, 2759) >>> # very few components are non-zero >>> np.mean(transformer.components_ != 0) - np.float64(0.0182...) + np.float64(0.0182) """ _parameter_constraints: dict = { diff --git a/sklearn/svm/_classes.py b/sklearn/svm/_classes.py index 8f243937bccf1..277da42893eaf 100644 --- a/sklearn/svm/_classes.py +++ b/sklearn/svm/_classes.py @@ -225,10 +225,10 @@ class LinearSVC(LinearClassifierMixin, SparseCoefMixin, BaseEstimator): ('linearsvc', LinearSVC(random_state=0, tol=1e-05))]) >>> print(clf.named_steps['linearsvc'].coef_) - [[0.141... 0.526... 0.679... 0.493...]] + [[0.141 0.526 0.679 0.493]] >>> print(clf.named_steps['linearsvc'].intercept_) - [0.1693...] + [0.1693] >>> print(clf.predict([[0, 0, 0, 0]])) [1] """ @@ -496,11 +496,11 @@ class LinearSVR(RegressorMixin, LinearModel): ('linearsvr', LinearSVR(random_state=0, tol=1e-05))]) >>> print(regr.named_steps['linearsvr'].coef_) - [18.582... 27.023... 44.357... 64.522...] + [18.582 27.023 44.357 64.522] >>> print(regr.named_steps['linearsvr'].intercept_) - [-4...] + [-4.] >>> print(regr.predict([[0, 0, 0, 0]])) - [-2.384...] + [-2.384] """ _parameter_constraints: dict = { @@ -1662,7 +1662,7 @@ class OneClassSVM(OutlierMixin, BaseLibSVM): >>> clf.predict(X) array([-1, 1, 1, 1, -1]) >>> clf.score_samples(X) - array([1.7798..., 2.0547..., 2.0556..., 2.0561..., 1.7332...]) + array([1.7798, 2.0547, 2.0556, 2.0561, 1.7332]) For a more extended example, see :ref:`sphx_glr_auto_examples_applications_plot_species_distribution_modeling.py` diff --git a/sklearn/tree/_classes.py b/sklearn/tree/_classes.py index ec814f088d1d9..8536ccf0d6f6b 100644 --- a/sklearn/tree/_classes.py +++ b/sklearn/tree/_classes.py @@ -942,8 +942,8 @@ class DecisionTreeClassifier(ClassifierMixin, BaseDecisionTree): >>> cross_val_score(clf, iris.data, iris.target, cv=10) ... # doctest: +SKIP ... - array([ 1. , 0.93..., 0.86..., 0.93..., 0.93..., - 0.93..., 0.93..., 1. , 0.93..., 1. ]) + array([ 1. , 0.93, 0.86, 0.93, 0.93, + 0.93, 0.93, 1. , 0.93, 1. ]) """ # "check_input" is used for optimisation and isn't something to be passed @@ -1324,8 +1324,8 @@ class DecisionTreeRegressor(RegressorMixin, BaseDecisionTree): >>> cross_val_score(regressor, X, y, cv=10) ... # doctest: +SKIP ... - array([-0.39..., -0.46..., 0.02..., 0.06..., -0.50..., - 0.16..., 0.11..., -0.73..., -0.30..., -0.00...]) + array([-0.39, -0.46, 0.02, 0.06, -0.50, + 0.16, 0.11, -0.73, -0.30, -0.00]) """ # "check_input" is used for optimisation and isn't something to be passed @@ -1689,7 +1689,7 @@ class ExtraTreeClassifier(DecisionTreeClassifier): >>> cls = BaggingClassifier(extra_tree, random_state=0).fit( ... X_train, y_train) >>> cls.score(X_test, y_test) - 0.8947... + 0.8947 """ def __init__( @@ -1950,7 +1950,7 @@ class ExtraTreeRegressor(DecisionTreeRegressor): >>> reg = BaggingRegressor(extra_tree, random_state=0).fit( ... X_train, y_train) >>> reg.score(X_test, y_test) - 0.33... + 0.33 """ def __init__( diff --git a/sklearn/utils/extmath.py b/sklearn/utils/extmath.py index 535505e77c010..b98a7747c28aa 100644 --- a/sklearn/utils/extmath.py +++ b/sklearn/utils/extmath.py @@ -269,9 +269,9 @@ def randomized_range_finder( >>> from sklearn.utils.extmath import randomized_range_finder >>> A = np.array([[1, 2, 3], [4, 5, 6], [7, 8, 9]]) >>> randomized_range_finder(A, size=2, n_iter=2, random_state=42) - array([[-0.21..., 0.88...], - [-0.52..., 0.24...], - [-0.82..., -0.38...]]) + array([[-0.214, 0.887], + [-0.521, 0.249], + [-0.826, -0.388]]) """ A = check_array(A, accept_sparse=True) diff --git a/sklearn/utils/sparsefuncs.py b/sklearn/utils/sparsefuncs.py index a9f2c14035b80..00e359bf79547 100644 --- a/sklearn/utils/sparsefuncs.py +++ b/sklearn/utils/sparsefuncs.py @@ -251,7 +251,7 @@ def incr_mean_variance_axis(X, *, axis, last_mean, last_var, last_n, weights=Non >>> sparsefuncs.incr_mean_variance_axis( ... csr, axis=0, last_mean=np.zeros(3), last_var=np.zeros(3), last_n=2 ... ) - (array([1.3..., 0.1..., 1.1...]), array([8.8..., 0.1..., 3.4...]), + (array([1.33, 0.167, 1.17]), array([8.88, 0.139, 3.47]), array([6., 6., 6.])) """ _raise_error_wrong_axis(axis) From a5d7f9e569c181fa9a3cf95316add5ac1dc0c26e Mon Sep 17 00:00:00 2001 From: "Luis M. B. Varona" Date: Wed, 7 May 2025 16:54:29 -0300 Subject: [PATCH 136/182] Fix OneVsRest `predict_proba` is all zeros when positive class is never predicted (#31228) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Co-authored-by: Jérémie du Boisberranger --- .../sklearn.multiclass/31228.fix.rst | 5 ++++ sklearn/multiclass.py | 6 +++-- sklearn/tests/test_multiclass.py | 26 +++++++++++++++++++ 3 files changed, 35 insertions(+), 2 deletions(-) create mode 100644 doc/whats_new/upcoming_changes/sklearn.multiclass/31228.fix.rst diff --git a/doc/whats_new/upcoming_changes/sklearn.multiclass/31228.fix.rst b/doc/whats_new/upcoming_changes/sklearn.multiclass/31228.fix.rst new file mode 100644 index 0000000000000..68056db580fd7 --- /dev/null +++ b/doc/whats_new/upcoming_changes/sklearn.multiclass/31228.fix.rst @@ -0,0 +1,5 @@ +- The `predict_proba` method of :class:`sklearn.multiclass.OneVsRestClassifier` now + returns zero for all classes when all inner estimators never predict their positive + class. + By :user:`Luis M. B. Varona `, :user:`Marc Bresson `, and + :user:`Jérémie du Boisberranger `. diff --git a/sklearn/multiclass.py b/sklearn/multiclass.py index fa86201fb1d89..d4208e0f542c7 100644 --- a/sklearn/multiclass.py +++ b/sklearn/multiclass.py @@ -553,8 +553,10 @@ def predict_proba(self, X): Y = np.concatenate(((1 - Y), Y), axis=1) if not self.multilabel_: - # Then, probabilities should be normalized to 1. - Y /= np.sum(Y, axis=1)[:, np.newaxis] + # Then, (nonzero) sample probability distributions should be normalized. + row_sums = np.sum(Y, axis=1)[:, np.newaxis] + np.divide(Y, row_sums, out=Y, where=row_sums != 0) + return Y @available_if(_estimators_has("decision_function")) diff --git a/sklearn/tests/test_multiclass.py b/sklearn/tests/test_multiclass.py index 566b8f535c9cb..ae718436617e1 100644 --- a/sklearn/tests/test_multiclass.py +++ b/sklearn/tests/test_multiclass.py @@ -6,6 +6,7 @@ from numpy.testing import assert_allclose from sklearn import datasets, svm +from sklearn.base import BaseEstimator, ClassifierMixin from sklearn.datasets import load_breast_cancer from sklearn.exceptions import NotFittedError from sklearn.impute import SimpleImputer @@ -429,6 +430,31 @@ def test_ovr_single_label_predict_proba(): assert not (pred - Y_pred).any() +def test_ovr_single_label_predict_proba_zero(): + """Check that predic_proba returns all zeros when the base estimator + never predicts the positive class. + """ + + class NaiveBinaryClassifier(BaseEstimator, ClassifierMixin): + def fit(self, X, y): + self.classes_ = np.unique(y) + return self + + def predict_proba(self, X): + proba = np.ones((len(X), 2)) + # Probability of being the positive class is always 0 + proba[:, 1] = 0 + return proba + + base_clf = NaiveBinaryClassifier() + X, y = iris.data, iris.target # Three-class problem with 150 samples + + clf = OneVsRestClassifier(base_clf).fit(X, y) + y_proba = clf.predict_proba(X) + + assert_allclose(y_proba, 0.0) + + def test_ovr_multilabel_decision_function(): X, Y = datasets.make_multilabel_classification( n_samples=100, From a69849a18e4c3c84137e0338360830085c42a133 Mon Sep 17 00:00:00 2001 From: Stefanie Senger <91849487+StefanieSenger@users.noreply.github.com> Date: Wed, 7 May 2025 21:55:24 +0200 Subject: [PATCH 137/182] MNT remove default behaviour deprecation from class_likelihood_ratios (#31331) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Co-authored-by: Jérémie du Boisberranger --- .../sklearn.metrics/29288.api.rst | 4 ++ sklearn/metrics/_classification.py | 57 ++++++------------- sklearn/metrics/tests/test_classification.py | 27 ++------- 3 files changed, 24 insertions(+), 64 deletions(-) create mode 100644 doc/whats_new/upcoming_changes/sklearn.metrics/29288.api.rst diff --git a/doc/whats_new/upcoming_changes/sklearn.metrics/29288.api.rst b/doc/whats_new/upcoming_changes/sklearn.metrics/29288.api.rst new file mode 100644 index 0000000000000..1c8e15d714391 --- /dev/null +++ b/doc/whats_new/upcoming_changes/sklearn.metrics/29288.api.rst @@ -0,0 +1,4 @@ +- The `raise_warning` parameter of :func:`metrics.class_likelihood_ratios` is deprecated + and will be removed in 1.9. An `UndefinedMetricWarning` will always be raised in case + of a division by zero. + By :user:`Stefanie Senger `. diff --git a/sklearn/metrics/_classification.py b/sklearn/metrics/_classification.py index cae227ac7edb8..65cbfbad6f01f 100644 --- a/sklearn/metrics/_classification.py +++ b/sklearn/metrics/_classification.py @@ -2052,7 +2052,6 @@ def precision_recall_fscore_support( "sample_weight": ["array-like", None], "raise_warning": ["boolean", Hidden(StrOptions({"deprecated"}))], "replace_undefined_by": [ - Hidden(StrOptions({"default"})), Options(Real, {1.0, np.nan}), dict, ], @@ -2066,7 +2065,7 @@ def class_likelihood_ratios( labels=None, sample_weight=None, raise_warning="deprecated", - replace_undefined_by="default", + replace_undefined_by=np.nan, ): """Compute binary classification positive and negative likelihood ratios. @@ -2178,16 +2177,15 @@ class are present in `y_true`): both likelihood ratios are undefined. -------- >>> import numpy as np >>> from sklearn.metrics import class_likelihood_ratios - >>> class_likelihood_ratios([0, 1, 0, 1, 0], [1, 1, 0, 0, 0], - ... replace_undefined_by=1.0) + >>> class_likelihood_ratios([0, 1, 0, 1, 0], [1, 1, 0, 0, 0]) (1.5, 0.75) >>> y_true = np.array(["non-cat", "cat", "non-cat", "cat", "non-cat"]) >>> y_pred = np.array(["cat", "cat", "non-cat", "non-cat", "non-cat"]) - >>> class_likelihood_ratios(y_true, y_pred, replace_undefined_by=1.0) + >>> class_likelihood_ratios(y_true, y_pred) (1.33, 0.66) >>> y_true = np.array(["non-zebra", "zebra", "non-zebra", "zebra", "non-zebra"]) >>> y_pred = np.array(["zebra", "zebra", "non-zebra", "non-zebra", "non-zebra"]) - >>> class_likelihood_ratios(y_true, y_pred, replace_undefined_by=1.0) + >>> class_likelihood_ratios(y_true, y_pred) (1.5, 0.75) To avoid ambiguities, use the notation `labels=[negative_class, @@ -2195,18 +2193,13 @@ class are present in `y_true`): both likelihood ratios are undefined. >>> y_true = np.array(["non-cat", "cat", "non-cat", "cat", "non-cat"]) >>> y_pred = np.array(["cat", "cat", "non-cat", "non-cat", "non-cat"]) - >>> class_likelihood_ratios(y_true, y_pred, labels=["non-cat", "cat"], - ... replace_undefined_by=1.0) + >>> class_likelihood_ratios(y_true, y_pred, labels=["non-cat", "cat"]) (1.5, 0.75) """ # TODO(1.9): When `raise_warning` is removed, the following changes need to be made: # The checks for `raise_warning==True` need to be removed and we will always warn, - # the default return value of `replace_undefined_by` should be updated from `np.nan` - # (which was kept for backwards compatibility) to `1.0`, its hidden option - # ("default") is not used anymore, some warning messages can be removed, the Warns - # section in the docstring should not mention `raise_warning` anymore and the - # "Mathematical divergences" section in model_evaluation.rst needs to be updated on - # the new default behaviour of `replace_undefined_by`. + # remove `FutureWarning`, and the Warns section in the docstring should not mention + # `raise_warning` anymore. y_true, y_pred = attach_unique(y_true, y_pred) y_type, y_true, y_pred = _check_targets(y_true, y_pred) if y_type != "binary": @@ -2220,28 +2213,11 @@ class are present in `y_true`): both likelihood ratios are undefined. "`UndefinedMetricWarning` will always be raised in case of a division by zero " "and the value set with the `replace_undefined_by` param will be returned." ) - mgs_changed_default = ( - "The default return value of `class_likelihood_ratios` in case of a division " - "by zero has been deprecated in 1.7 and will be changed to the worst scores " - "(`(1.0, 1.0)`) in version 1.9. Set `replace_undefined_by=1.0` to use the new" - "default and to silence this Warning." - ) if raise_warning != "deprecated": - warnings.warn( - " ".join((msg_deprecated_param, mgs_changed_default)), FutureWarning - ) + warnings.warn(msg_deprecated_param, FutureWarning) else: - if replace_undefined_by == "default": - # TODO(1.9): Remove. If users don't set any return values in case of a - # division by zero (`raise_warning="deprecated"` and - # `replace_undefined_by="default"`) they still get a FutureWarning about - # changing default return values: - warnings.warn(mgs_changed_default, FutureWarning) raise_warning = True - if replace_undefined_by == "default": - replace_undefined_by = np.nan - if replace_undefined_by == 1.0: replace_undefined_by = {"LR+": 1.0, "LR-": 1.0} @@ -2293,12 +2269,12 @@ class are present in `y_true`): both likelihood ratios are undefined. # if `support_pos == 0`a division by zero will occur if support_pos == 0: - # TODO(1.9): Change return values in warning message to new default: the worst - # possible scores: `(1.0, 1.0)` msg = ( "No samples of the positive class are present in `y_true`. " "`positive_likelihood_ratio` and `negative_likelihood_ratio` are both set " - "to `np.nan`." + "to `np.nan`. Use the `replace_undefined_by` param to control this " + "behavior. To suppress this warning or turn it into an error, see Python's " + "`warnings` module and `warnings.catch_warnings()`." ) warnings.warn(msg, UndefinedMetricWarning, stacklevel=2) positive_likelihood_ratio = np.nan @@ -2315,9 +2291,8 @@ class are present in `y_true`): both likelihood ratios are undefined. else: msg_beginning = "`positive_likelihood_ratio` is ill-defined and " msg_end = "set to `np.nan`. Use the `replace_undefined_by` param to " - "control this behavior." - # TODO(1.9): Change return value in warning message to new default: `1.0`, - # which is the worst possible score for "LR+" + "control this behavior. To suppress this warning or turn it into an error, " + "see Python's `warnings` module and `warnings.catch_warnings()`." warnings.warn(msg_beginning + msg_end, UndefinedMetricWarning, stacklevel=2) if isinstance(replace_undefined_by, float) and np.isnan(replace_undefined_by): positive_likelihood_ratio = replace_undefined_by @@ -2332,11 +2307,11 @@ class are present in `y_true`): both likelihood ratios are undefined. # if `tn == 0`a division by zero will occur if tn == 0: if raise_warning: - # TODO(1.9): Change return value in warning message to new default: `1.0`, - # which is the worst possible score for "LR-" msg = ( "`negative_likelihood_ratio` is ill-defined and set to `np.nan`. " - "Use the `replace_undefined_by` param to control this behavior." + "Use the `replace_undefined_by` param to control this behavior. To " + "suppress this warning or turn it into an error, see Python's " + "`warnings` module and `warnings.catch_warnings()`." ) warnings.warn(msg, UndefinedMetricWarning, stacklevel=2) if isinstance(replace_undefined_by, float) and np.isnan(replace_undefined_by): diff --git a/sklearn/metrics/tests/test_classification.py b/sklearn/metrics/tests/test_classification.py index 19a326ff184f8..b66353e5ecfab 100644 --- a/sklearn/metrics/tests/test_classification.py +++ b/sklearn/metrics/tests/test_classification.py @@ -709,9 +709,7 @@ def test_likelihood_ratios_warnings(params, warn_msg): # least one of the ratios is ill-defined. with pytest.warns(UserWarning, match=warn_msg): - # TODO(1.9): remove setting `replace_undefined_by` since this will be set by - # default - class_likelihood_ratios(replace_undefined_by=1.0, **params) + class_likelihood_ratios(**params) @pytest.mark.parametrize( @@ -736,7 +734,6 @@ def test_likelihood_ratios_errors(params, err_msg): class_likelihood_ratios(**params) -# TODO(1.9): remove setting `replace_undefined_by` since this will be set by default def test_likelihood_ratios(): # Build confusion matrix with tn=9, fp=8, fn=1, tp=2, # sensitivity=2/3, specificity=9/17, prevalence=3/20, @@ -744,14 +741,12 @@ def test_likelihood_ratios(): y_true = np.array([1] * 3 + [0] * 17) y_pred = np.array([1] * 2 + [0] * 10 + [1] * 8) - pos, neg = class_likelihood_ratios(y_true, y_pred, replace_undefined_by=np.nan) + pos, neg = class_likelihood_ratios(y_true, y_pred) assert_allclose(pos, 34 / 24) assert_allclose(neg, 17 / 27) # Build limit case with y_pred = y_true - pos, neg = class_likelihood_ratios(y_true, y_true, replace_undefined_by=np.nan) - # TODO(1.9): replace next line with `assert_array_equal(pos, 1.0)`, since - # `replace_undefined_by` has a new default: + pos, neg = class_likelihood_ratios(y_true, y_true) assert_array_equal(pos, np.nan * 2) assert_allclose(neg, np.zeros(2), rtol=1e-12) @@ -759,9 +754,7 @@ def test_likelihood_ratios(): # sensitivity=2/3, specificity=9/12, prevalence=3/20, # LR+=24/9, LR-=12/27 sample_weight = np.array([1.0] * 15 + [0.0] * 5) - pos, neg = class_likelihood_ratios( - y_true, y_pred, sample_weight=sample_weight, replace_undefined_by=np.nan - ) + pos, neg = class_likelihood_ratios(y_true, y_pred, sample_weight=sample_weight) assert_allclose(pos, 24 / 9) assert_allclose(neg, 12 / 27) @@ -779,18 +772,6 @@ def test_likelihood_ratios_raise_warning_deprecation(raise_warning): class_likelihood_ratios(y_true, y_pred, raise_warning=raise_warning) -# TODO(1.9): remove test -def test_likelihood_ratios_raise_default_deprecation(): - """Test that class_likelihood_ratios raises a `FutureWarning` when `raise_warning` - and `replace_undefined_by` are both default.""" - y_true = np.array([1, 0]) - y_pred = np.array([1, 0]) - - msg = "The default return value of `class_likelihood_ratios` in case of a" - with pytest.warns(FutureWarning, match=msg): - class_likelihood_ratios(y_true, y_pred) - - def test_likelihood_ratios_replace_undefined_by_worst(): """Test that class_likelihood_ratios returns the worst scores `1.0` for both LR+ and LR- when `replace_undefined_by=1` is set.""" From da0dac352825da3b8832f2cecf399227824a6f80 Mon Sep 17 00:00:00 2001 From: 4hm3d <63117505+ahmedmokeddem@users.noreply.github.com> Date: Thu, 8 May 2025 11:59:48 +0200 Subject: [PATCH 138/182] DOC Link Visualization tools to their respective interpretation (#31306) --- sklearn/metrics/_plot/confusion_matrix.py | 15 ++++++++++++--- 1 file changed, 12 insertions(+), 3 deletions(-) diff --git a/sklearn/metrics/_plot/confusion_matrix.py b/sklearn/metrics/_plot/confusion_matrix.py index 63a5382f3fa2b..25aa21eab2fc2 100644 --- a/sklearn/metrics/_plot/confusion_matrix.py +++ b/sklearn/metrics/_plot/confusion_matrix.py @@ -21,7 +21,10 @@ class ConfusionMatrixDisplay: create a :class:`ConfusionMatrixDisplay`. All parameters are stored as attributes. - Read more in the :ref:`User Guide `. + For general information regarding `scikit-learn` visualization tools, see + the :ref:`Visualization Guide `. + For guidance on interpreting these plots, refer to the + :ref:`Model Evaluation Guide `. Parameters ---------- @@ -220,7 +223,10 @@ def from_estimator( ): """Plot Confusion Matrix given an estimator and some data. - Read more in the :ref:`User Guide `. + For general information regarding `scikit-learn` visualization tools, see + the :ref:`Visualization Guide `. + For guidance on interpreting these plots, refer to the + :ref:`Model Evaluation Guide `. .. versionadded:: 1.0 @@ -365,7 +371,10 @@ def from_predictions( ): """Plot Confusion Matrix given true and predicted labels. - Read more in the :ref:`User Guide `. + For general information regarding `scikit-learn` visualization tools, see + the :ref:`Visualization Guide `. + For guidance on interpreting these plots, refer to the + :ref:`Model Evaluation Guide `. .. versionadded:: 1.0 From aca49c1dec168ef9ffdac34ec648fb615fd4801d Mon Sep 17 00:00:00 2001 From: Arturo Amor <86408019+ArturoAmorQ@users.noreply.github.com> Date: Thu, 8 May 2025 12:48:49 +0200 Subject: [PATCH 139/182] DOC Improve Contributer guide for writting docstrings (#31330) Co-authored-by: ArturoAmorQ Co-authored-by: Stefanie Senger <91849487+StefanieSenger@users.noreply.github.com> --- doc/developers/contributing.rst | 23 ++++++++++++++++++++++- 1 file changed, 22 insertions(+), 1 deletion(-) diff --git a/doc/developers/contributing.rst b/doc/developers/contributing.rst index 34e8e6d3e2aca..bebeb93d86b0c 100644 --- a/doc/developers/contributing.rst +++ b/doc/developers/contributing.rst @@ -726,6 +726,19 @@ We are glad to accept any sort of documentation: .. dropdown:: Guidelines for writing docstrings + * You can use `pytest` to test docstrings, e.g. assuming the + `RandomForestClassifier` docstring has been modified, the following command + would test its docstring compliance: + + .. prompt:: bash + + pytest --doctest-modules sklearn/ensemble/_forest.py -k RandomForestClassifier + + * The correct order of sections is: Parameters, Returns, See Also, Notes, Examples. + See the `numpydoc documentation + `_ for + information on other possible sections. + * When documenting the parameters and attributes, here is a list of some well-formatted examples @@ -791,7 +804,15 @@ We are glad to accept any sort of documentation: SelectKBest : Select features based on the k highest scores. SelectFpr : Select features based on a false positive rate test. - * Add one or two snippets of code in "Example" section to show how it can be used. + * The "Notes" section is optional. It is meant to provide information on + specific behavior of a function/class/classmethod/method. + + * A `Note` can also be added to an attribute, but in that case it requires + using the `.. rubric:: Note` directive. + + * Add one or two **snippets** of code in "Example" section to show how it can + be used. The code should be runable as is, i.e. it should include all + required imports. Keep this section as brief as possible. .. dropdown:: Guidelines for writing the user guide and other reStructuredText documents From 13d00dcd5e6a41b336a2f39017480edce0fdc27a Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Lo=C3=AFc=20Est=C3=A8ve?= Date: Fri, 9 May 2025 09:40:49 +0200 Subject: [PATCH 140/182] MNT Update conda-lock to 3.0.1 (#31333) --- build_tools/azure/debian_32bit_lock.txt | 2 +- ...latest_conda_forge_mkl_linux-64_conda.lock | 8 +- ...pylatest_conda_forge_mkl_osx-64_conda.lock | 6 +- ...test_conda_mkl_no_openmp_osx-64_conda.lock | 4 +- ...pylatest_free_threaded_linux-64_conda.lock | 8 +- ...st_pip_openblas_pandas_linux-64_conda.lock | 6 +- ...pylatest_pip_scipy_dev_linux-64_conda.lock | 6 +- .../pymin_conda_forge_mkl_win-64_conda.lock | 6 +- ...nblas_min_dependencies_linux-64_conda.lock | 10 +-- ...e_openblas_ubuntu_2204_linux-64_conda.lock | 8 +- build_tools/azure/ubuntu_atlas_lock.txt | 2 +- build_tools/circle/doc_linux-64_conda.lock | 14 ++-- .../doc_min_dependencies_linux-64_conda.lock | 14 ++-- ...a_forge_cuda_array-api_linux-64_conda.lock | 77 +++++++++---------- ...n_conda_forge_arm_linux-aarch64_conda.lock | 8 +- pyproject.toml | 2 +- sklearn/_min_dependencies.py | 2 +- 17 files changed, 89 insertions(+), 94 deletions(-) diff --git a/build_tools/azure/debian_32bit_lock.txt b/build_tools/azure/debian_32bit_lock.txt index 051a8b8ef7e48..8a6f9762399ca 100644 --- a/build_tools/azure/debian_32bit_lock.txt +++ b/build_tools/azure/debian_32bit_lock.txt @@ -14,7 +14,7 @@ joblib==1.5.0 # via -r build_tools/azure/debian_32bit_requirements.txt meson==1.8.0 # via meson-python -meson-python==0.17.1 +meson-python==0.18.0 # via -r build_tools/azure/debian_32bit_requirements.txt ninja==1.11.1.4 # via -r build_tools/azure/debian_32bit_requirements.txt diff --git a/build_tools/azure/pylatest_conda_forge_mkl_linux-64_conda.lock b/build_tools/azure/pylatest_conda_forge_mkl_linux-64_conda.lock index 9b452e7ecba3d..78f45bec169ac 100644 --- a/build_tools/azure/pylatest_conda_forge_mkl_linux-64_conda.lock +++ b/build_tools/azure/pylatest_conda_forge_mkl_linux-64_conda.lock @@ -1,6 +1,6 @@ # Generated by conda-lock. # platform: linux-64 -# input_hash: 15de7a0d1a0d046ada825ffa5ad3547c790bf903bd5d9b03e7c0e9a6a62c680d +# input_hash: f524d159a11a0a80ead3448f16255169f24edde269f6b81e8e28453bc4f7fc53 @EXPLICIT https://conda.anaconda.org/conda-forge/noarch/font-ttf-dejavu-sans-mono-2.37-hab24e00_0.tar.bz2#0c96522c6bdaed4b1566d11387caaf45 https://conda.anaconda.org/conda-forge/noarch/font-ttf-inconsolata-3.000-h77eed37_0.tar.bz2#34893075a5c9e55cdafac56607368fc6 @@ -32,7 +32,7 @@ https://conda.anaconda.org/conda-forge/linux-64/libgcc-ng-14.2.0-h69a702a_2.cond https://conda.anaconda.org/conda-forge/linux-64/libgfortran5-14.2.0-hf1ad2bd_2.conda#556a4fdfac7287d349b8f09aba899693 https://conda.anaconda.org/conda-forge/linux-64/libiconv-1.18-h4ce23a2_1.conda#e796ff8ddc598affdf7c173d6145f087 https://conda.anaconda.org/conda-forge/linux-64/libjpeg-turbo-3.1.0-hb9d3cd8_0.conda#9fa334557db9f63da6c9285fd2a48638 -https://conda.anaconda.org/conda-forge/linux-64/liblzma-5.8.1-hb9d3cd8_0.conda#0e87378639676987af32fee53ba32258 +https://conda.anaconda.org/conda-forge/linux-64/liblzma-5.8.1-hb9d3cd8_1.conda#a76fd702c93cd2dfd89eff30a5fd45a8 https://conda.anaconda.org/conda-forge/linux-64/libntlm-1.8-hb9d3cd8_0.conda#7c7927b404672409d9917d49bff5f2d6 https://conda.anaconda.org/conda-forge/linux-64/libstdcxx-14.2.0-h8f9b012_2.conda#a78c856b6dc6bf4ea8daeb9beaaa3fb0 https://conda.anaconda.org/conda-forge/linux-64/libutf8proc-2.10.0-h4c51ac1_0.conda#aeccfff2806ae38430638ffbb4be9610 @@ -172,7 +172,7 @@ https://conda.anaconda.org/conda-forge/linux-64/libgl-1.7.0-ha4b6fd6_2.conda#928 https://conda.anaconda.org/conda-forge/linux-64/libgrpc-1.71.0-h8e591d7_1.conda#c3cfd72cbb14113abee7bbd86f44ad69 https://conda.anaconda.org/conda-forge/linux-64/libhwloc-2.11.2-default_h0d58e46_1001.conda#804ca9e91bcaea0824a341d55b1684f2 https://conda.anaconda.org/conda-forge/linux-64/libllvm20-20.1.4-he9d0ab4_0.conda#96c33bbd084ef2b2463503fb7f1482ae -https://conda.anaconda.org/conda-forge/linux-64/libxkbcommon-1.9.1-h65c71a3_0.conda#6e45090fe0eec179ecc8041a3a3fc9f8 +https://conda.anaconda.org/conda-forge/linux-64/libxkbcommon-1.9.2-h65c71a3_0.conda#d045b1d878031eb497cab44e6392b1df https://conda.anaconda.org/conda-forge/linux-64/libxslt-1.1.39-h76b75d6_0.conda#e71f31f8cfb0a91439f2086fc8aa0461 https://conda.anaconda.org/conda-forge/linux-64/mpc-1.3.1-h24ddda3_1.conda#aa14b9a5196a6d8dd364164b7ce56acf https://conda.anaconda.org/conda-forge/linux-64/openldap-2.6.9-he970967_0.conda#ca2de8bbdc871bce41dbf59e51324165 @@ -201,7 +201,7 @@ https://conda.anaconda.org/conda-forge/linux-64/libclang13-20.1.4-default_he06ed https://conda.anaconda.org/conda-forge/linux-64/libgoogle-cloud-2.36.0-hc4361e1_1.conda#ae36e6296a8dd8e8a9a8375965bf6398 https://conda.anaconda.org/conda-forge/linux-64/libopentelemetry-cpp-1.20.0-hd1b1c89_0.conda#e1185384cc23e3bbf85486987835df94 https://conda.anaconda.org/conda-forge/linux-64/libpq-17.4-h27ae623_1.conda#37fba334855ef3b51549308e61ed7a3d -https://conda.anaconda.org/conda-forge/noarch/meson-python-0.17.1-pyh70fd9c4_1.conda#7a02679229c6c2092571b4c025055440 +https://conda.anaconda.org/conda-forge/noarch/meson-python-0.18.0-pyh70fd9c4_0.conda#576c04b9d9f8e45285fb4d9452c26133 https://conda.anaconda.org/conda-forge/linux-64/optree-0.15.0-py313h33d0bda_0.conda#151f92ff0806c7c700419c8b8cf7cb4b https://conda.anaconda.org/conda-forge/linux-64/pillow-11.1.0-py313h8db990d_0.conda#1e86810c6c3fb6d6aebdba26564eb2e8 https://conda.anaconda.org/conda-forge/noarch/pytest-cov-6.1.1-pyhd8ed1ab_0.conda#1e35d8f975bc0e984a19819aa91c440a diff --git a/build_tools/azure/pylatest_conda_forge_mkl_osx-64_conda.lock b/build_tools/azure/pylatest_conda_forge_mkl_osx-64_conda.lock index 4def307b28f84..cc98410d95f1a 100644 --- a/build_tools/azure/pylatest_conda_forge_mkl_osx-64_conda.lock +++ b/build_tools/azure/pylatest_conda_forge_mkl_osx-64_conda.lock @@ -1,6 +1,6 @@ # Generated by conda-lock. # platform: osx-64 -# input_hash: b4e9eb0fbe1a7a6d067e4f4b43ca9e632309794c2a76d5c254ce023cb2fa2d99 +# input_hash: cee22335ff0a429180f2d8eeb31943f2646e3e653f1197f57ba6e39fc9659b05 @EXPLICIT https://conda.anaconda.org/conda-forge/noarch/libgfortran-devel_osx-64-13.3.0-h297be85_105.conda#c4967f8e797d0ffef3c5650fcdc2cdb5 https://conda.anaconda.org/conda-forge/osx-64/mkl-include-2023.2.0-h6bab518_50500.conda#835abb8ded5e26f23ea6996259c7972e @@ -17,7 +17,7 @@ https://conda.anaconda.org/conda-forge/osx-64/libexpat-2.7.0-h240833e_0.conda#02 https://conda.anaconda.org/conda-forge/osx-64/libffi-3.4.6-h281671d_1.conda#4ca9ea59839a9ca8df84170fab4ceb41 https://conda.anaconda.org/conda-forge/osx-64/libiconv-1.18-h4b5e92a_1.conda#6283140d7b2b55b6b095af939b71b13f https://conda.anaconda.org/conda-forge/osx-64/libjpeg-turbo-3.1.0-h6e16a3a_0.conda#87537967e6de2f885a9fcebd42b7cb10 -https://conda.anaconda.org/conda-forge/osx-64/liblzma-5.8.1-hd471939_0.conda#8e1197f652c67e87a9ece738d82cef4f +https://conda.anaconda.org/conda-forge/osx-64/liblzma-5.8.1-hd471939_1.conda#f87e8821e0e38a4140a7ed4f52530053 https://conda.anaconda.org/conda-forge/osx-64/libmpdec-4.0.0-hfdf4475_0.conda#ed625b2e59dff82859c23dd24774156b https://conda.anaconda.org/conda-forge/osx-64/libwebp-base-1.5.0-h6cf52b4_0.conda#5e0cefc99a231ac46ba21e27ae44689f https://conda.anaconda.org/conda-forge/osx-64/libzlib-1.3.1-hd23fc13_2.conda#003a54a4e32b02f7355b50a837e699da @@ -106,7 +106,7 @@ https://conda.anaconda.org/conda-forge/osx-64/blas-devel-3.9.0-20_osx64_mkl.cond https://conda.anaconda.org/conda-forge/osx-64/cctools_osx-64-1010.6-hd19c6af_6.conda#4694e9e497454a8ce5b9fb61e50d9c5d https://conda.anaconda.org/conda-forge/osx-64/clang-18.1.8-default_h576c50e_9.conda#266e7e8fa2190df09e6f236571c91511 https://conda.anaconda.org/conda-forge/osx-64/contourpy-1.3.2-py313ha0b1807_0.conda#2c2d1f840df1c512b34e0537ef928169 -https://conda.anaconda.org/conda-forge/noarch/meson-python-0.17.1-pyh70fd9c4_1.conda#7a02679229c6c2092571b4c025055440 +https://conda.anaconda.org/conda-forge/noarch/meson-python-0.18.0-pyh70fd9c4_0.conda#576c04b9d9f8e45285fb4d9452c26133 https://conda.anaconda.org/conda-forge/osx-64/pandas-2.2.3-py313h2e7108f_3.conda#5c37fc7549913fc4895d7d2e097091ed https://conda.anaconda.org/conda-forge/osx-64/pillow-11.1.0-py313h0c4f865_0.conda#11b4dd7a814202f2a0b655420f1c1c3a https://conda.anaconda.org/conda-forge/noarch/pytest-cov-6.1.1-pyhd8ed1ab_0.conda#1e35d8f975bc0e984a19819aa91c440a diff --git a/build_tools/azure/pylatest_conda_mkl_no_openmp_osx-64_conda.lock b/build_tools/azure/pylatest_conda_mkl_no_openmp_osx-64_conda.lock index ed4af051f10c6..da996af94f867 100644 --- a/build_tools/azure/pylatest_conda_mkl_no_openmp_osx-64_conda.lock +++ b/build_tools/azure/pylatest_conda_mkl_no_openmp_osx-64_conda.lock @@ -1,6 +1,6 @@ # Generated by conda-lock. # platform: osx-64 -# input_hash: 037fecf9454db91c21c8a57ee632e7221447f0bcfd9a5850dfcd6d727a30b086 +# input_hash: cc639ea0beeaceb46e2ad729ba559d5d5e746b8f6ff522bc718109af6265069c @EXPLICIT https://repo.anaconda.com/pkgs/main/osx-64/blas-1.0-mkl.conda#cb2c87e85ac8e0ceae776d26d4214c8a https://repo.anaconda.com/pkgs/main/osx-64/bzip2-1.0.8-h6c40b1e_6.conda#96224786021d0765ce05818fa3c59bdb @@ -79,4 +79,4 @@ https://repo.anaconda.com/pkgs/main/osx-64/pyamg-5.2.1-py312h1962661_0.conda#588 # pip meson @ https://files.pythonhosted.org/packages/df/d7/f1c8acf0e597d4d07532f519780ee6e11ba285a9b092f18706b4c9118331/meson-1.8.0-py3-none-any.whl#sha256=472b7b25da286447333d32872b82d1c6f1a34024fb8ee017d7308056c25fec1f # pip threadpoolctl @ https://files.pythonhosted.org/packages/32/d5/f9a850d79b0851d1d4ef6456097579a9005b31fea68726a4ae5f2d82ddd9/threadpoolctl-3.6.0-py3-none-any.whl#sha256=43a0b8fd5a2928500110039e43a5eed8480b918967083ea48dc3ab9f13c4a7fb # pip pyproject-metadata @ https://files.pythonhosted.org/packages/7e/b1/8e63033b259e0a4e40dd1ec4a9fee17718016845048b43a36ec67d62e6fe/pyproject_metadata-0.9.1-py3-none-any.whl#sha256=ee5efde548c3ed9b75a354fc319d5afd25e9585fa918a34f62f904cc731973ad -# pip meson-python @ https://files.pythonhosted.org/packages/7d/ec/40c0ddd29ef4daa6689a2b9c5ced47d5b58fa54ae149b19e9a97f4979c8c/meson_python-0.17.1-py3-none-any.whl#sha256=30a75c52578ef14aff8392677b09c39346e0a24d2b2c6204b8ed30583c11269c +# pip meson-python @ https://files.pythonhosted.org/packages/28/58/66db620a8a7ccb32633de9f403fe49f1b63c68ca94e5c340ec5cceeb9821/meson_python-0.18.0-py3-none-any.whl#sha256=3b0fe051551cc238f5febb873247c0949cd60ded556efa130aa57021804868e2 diff --git a/build_tools/azure/pylatest_free_threaded_linux-64_conda.lock b/build_tools/azure/pylatest_free_threaded_linux-64_conda.lock index 39b5e6021d170..84ca12988c3e1 100644 --- a/build_tools/azure/pylatest_free_threaded_linux-64_conda.lock +++ b/build_tools/azure/pylatest_free_threaded_linux-64_conda.lock @@ -1,9 +1,9 @@ # Generated by conda-lock. # platform: linux-64 -# input_hash: a4b2a317ef7733b7244b987f8b6b61126b9e647153cd112ba9565ae8eb5558e8 +# input_hash: c7db5547fb9ea583bb70736e98b526e9e435c63cb5f6f3c4f38e0f0925e28535 @EXPLICIT https://conda.anaconda.org/conda-forge/linux-64/_libgcc_mutex-0.1-conda_forge.tar.bz2#d7c89558ba9fa0495403155b64376d81 -https://conda.anaconda.org/conda-forge/linux-64/python_abi-3.13-5_cp313t.conda#ea4c21b96e8280414d9e243da0ec3201 +https://conda.anaconda.org/conda-forge/noarch/python_abi-3.13-7_cp313t.conda#df81edcc11a1176315e8226acab83eec https://conda.anaconda.org/conda-forge/noarch/tzdata-2025b-h78e105d_0.conda#4222072737ccff51314b5ece9c7d6f5a https://conda.anaconda.org/conda-forge/noarch/ca-certificates-2025.4.26-hbd8a1cb_0.conda#95db94f75ba080a22eb623590993167b https://conda.anaconda.org/conda-forge/linux-64/ld_impl_linux-64-2.43-h712a8e2_4.conda#01f8d123c96816249efd255a31ad7712 @@ -14,7 +14,7 @@ https://conda.anaconda.org/conda-forge/linux-64/libexpat-2.7.0-h5888daf_0.conda# https://conda.anaconda.org/conda-forge/linux-64/libffi-3.4.6-h2dba641_1.conda#ede4673863426c0883c0063d853bbd85 https://conda.anaconda.org/conda-forge/linux-64/libgcc-ng-14.2.0-h69a702a_2.conda#a2222a6ada71fb478682efe483ce0f92 https://conda.anaconda.org/conda-forge/linux-64/libgfortran5-14.2.0-hf1ad2bd_2.conda#556a4fdfac7287d349b8f09aba899693 -https://conda.anaconda.org/conda-forge/linux-64/liblzma-5.8.1-hb9d3cd8_0.conda#0e87378639676987af32fee53ba32258 +https://conda.anaconda.org/conda-forge/linux-64/liblzma-5.8.1-hb9d3cd8_1.conda#a76fd702c93cd2dfd89eff30a5fd45a8 https://conda.anaconda.org/conda-forge/linux-64/libstdcxx-14.2.0-h8f9b012_2.conda#a78c856b6dc6bf4ea8daeb9beaaa3fb0 https://conda.anaconda.org/conda-forge/linux-64/libzlib-1.3.1-hb9d3cd8_2.conda#edb0dca6bc32e4f4789199455a1dbeb8 https://conda.anaconda.org/conda-forge/linux-64/ncurses-6.5-h2d0b736_3.conda#47e340acb35de30501a76c7c799c41d7 @@ -53,6 +53,6 @@ https://conda.anaconda.org/conda-forge/linux-64/liblapack-3.9.0-31_h7ac8fdf_open https://conda.anaconda.org/conda-forge/noarch/pyproject-metadata-0.9.1-pyhd8ed1ab_0.conda#22ae7c6ea81e0c8661ef32168dda929b https://conda.anaconda.org/conda-forge/noarch/pytest-8.3.5-pyhd8ed1ab_0.conda#c3c9316209dec74a705a36797970c6be https://conda.anaconda.org/conda-forge/noarch/python-freethreading-3.13.3-h92d6c8b_1.conda#4fa25290aec662a01642ba4b3c0ff5c1 -https://conda.anaconda.org/conda-forge/noarch/meson-python-0.17.1-pyh70fd9c4_1.conda#7a02679229c6c2092571b4c025055440 +https://conda.anaconda.org/conda-forge/noarch/meson-python-0.18.0-pyh70fd9c4_0.conda#576c04b9d9f8e45285fb4d9452c26133 https://conda.anaconda.org/conda-forge/linux-64/numpy-2.2.5-py313h103f029_0.conda#7dcbd568d6f8a4ffba5ace28915f1230 https://conda.anaconda.org/conda-forge/noarch/pytest-xdist-3.6.1-pyhd8ed1ab_1.conda#59aad4fb37cabc0bacc73cf344612ddd diff --git a/build_tools/azure/pylatest_pip_openblas_pandas_linux-64_conda.lock b/build_tools/azure/pylatest_pip_openblas_pandas_linux-64_conda.lock index edffbc7d70f46..b2e928b578212 100644 --- a/build_tools/azure/pylatest_pip_openblas_pandas_linux-64_conda.lock +++ b/build_tools/azure/pylatest_pip_openblas_pandas_linux-64_conda.lock @@ -1,6 +1,6 @@ # Generated by conda-lock. # platform: linux-64 -# input_hash: 830b1d953ebfc9e46b73f639e733ee09b5171952cf987981d569b1d5abd16292 +# input_hash: 50f16a0198b6eb575a737fee25051b52a644d72f5fca26bd661651a85fcb6a07 @EXPLICIT https://repo.anaconda.com/pkgs/main/linux-64/_libgcc_mutex-0.1-main.conda#c3473ff8bdb3d124ed5ff11ec380d6f9 https://repo.anaconda.com/pkgs/main/linux-64/ca-certificates-2025.2.25-h06a4308_0.conda#495015d24da8ad929e3ae2d18571016d @@ -80,12 +80,12 @@ https://repo.anaconda.com/pkgs/main/noarch/pip-25.1-pyhc872135_2.conda#2778327d2 # pip tifffile @ https://files.pythonhosted.org/packages/6e/be/10d23cfd4078fbec6aba768a357eff9e70c0b6d2a07398425985c524ad2a/tifffile-2025.3.30-py3-none-any.whl#sha256=0ed6eee7b66771db2d1bfc42262a51b01887505d35539daef118f4ff8c0f629c # pip lightgbm @ https://files.pythonhosted.org/packages/42/86/dabda8fbcb1b00bcfb0003c3776e8ade1aa7b413dff0a2c08f457dace22f/lightgbm-4.6.0-py3-none-manylinux_2_28_x86_64.whl#sha256=cb19b5afea55b5b61cbb2131095f50538bd608a00655f23ad5d25ae3e3bf1c8d # pip matplotlib @ https://files.pythonhosted.org/packages/51/d0/2bc4368abf766203e548dc7ab57cf7e9c621f1a3c72b516cc7715347b179/matplotlib-3.10.1-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl#sha256=7e496c01441be4c7d5f96d4e40f7fca06e20dcb40e44c8daa2e740e1757ad9e6 -# pip meson-python @ https://files.pythonhosted.org/packages/7d/ec/40c0ddd29ef4daa6689a2b9c5ced47d5b58fa54ae149b19e9a97f4979c8c/meson_python-0.17.1-py3-none-any.whl#sha256=30a75c52578ef14aff8392677b09c39346e0a24d2b2c6204b8ed30583c11269c +# pip meson-python @ https://files.pythonhosted.org/packages/28/58/66db620a8a7ccb32633de9f403fe49f1b63c68ca94e5c340ec5cceeb9821/meson_python-0.18.0-py3-none-any.whl#sha256=3b0fe051551cc238f5febb873247c0949cd60ded556efa130aa57021804868e2 # pip pandas @ https://files.pythonhosted.org/packages/e8/31/aa8da88ca0eadbabd0a639788a6da13bb2ff6edbbb9f29aa786450a30a91/pandas-2.2.3-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl#sha256=f3a255b2c19987fbbe62a9dfd6cff7ff2aa9ccab3fc75218fd4b7530f01efa24 # pip pyamg @ https://files.pythonhosted.org/packages/cd/a7/0df731cbfb09e73979a1a032fc7bc5be0eba617d798b998a0f887afe8ade/pyamg-5.2.1-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl#sha256=6999b351ab969c79faacb81faa74c0fa9682feeff3954979212872a3ee40c298 # pip pytest-cov @ https://files.pythonhosted.org/packages/28/d0/def53b4a790cfb21483016430ed828f64830dd981ebe1089971cd10cab25/pytest_cov-6.1.1-py3-none-any.whl#sha256=bddf29ed2d0ab6f4df17b4c55b0a657287db8684af9c42ea546b21b1041b3dde # pip pytest-xdist @ https://files.pythonhosted.org/packages/6d/82/1d96bf03ee4c0fdc3c0cbe61470070e659ca78dc0086fb88b66c185e2449/pytest_xdist-3.6.1-py3-none-any.whl#sha256=9ed4adfb68a016610848639bb7e02c9352d5d9f03d04809919e2dafc3be4cca7 # pip scikit-image @ https://files.pythonhosted.org/packages/cd/9b/c3da56a145f52cd61a68b8465d6a29d9503bc45bc993bb45e84371c97d94/scikit_image-0.25.2-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl#sha256=b8abd3c805ce6944b941cfed0406d88faeb19bab3ed3d4b50187af55cf24d147 # pip scipy-doctest @ https://files.pythonhosted.org/packages/76/eb/668949f884d5fe8a0d231dcba42c02e7b84626b35ca9072d6283c3aae773/scipy_doctest-1.7.1-py3-none-any.whl#sha256=dece106ec5ac8c595cc6372480d724e68c684450124dd0ddeb6be487ad62b365 -# pip sphinx @ https://files.pythonhosted.org/packages/2f/72/9a437a9dc5393c0eabba447bdb6233a7b02bb23e84975f17ad9a9ca86677/sphinx-8.3.0-py3-none-any.whl#sha256=bd8fcf35ab2c4240b01c74a411c948350a3aebd6aa175579363754ed380d350a +# pip sphinx @ https://files.pythonhosted.org/packages/31/53/136e9eca6e0b9dc0e1962e2c908fbea2e5ac000c2a2fbd9a35797958c48b/sphinx-8.2.3-py3-none-any.whl#sha256=4405915165f13521d875a8c29c8970800a0141c14cc5416a38feca4ea5d9b9c3 # pip numpydoc @ https://files.pythonhosted.org/packages/6c/45/56d99ba9366476cd8548527667f01869279cedb9e66b28eb4dfb27701679/numpydoc-1.8.0-py3-none-any.whl#sha256=72024c7fd5e17375dec3608a27c03303e8ad00c81292667955c6fea7a3ccf541 diff --git a/build_tools/azure/pylatest_pip_scipy_dev_linux-64_conda.lock b/build_tools/azure/pylatest_pip_scipy_dev_linux-64_conda.lock index 068aee47c99a3..9546a87a15657 100644 --- a/build_tools/azure/pylatest_pip_scipy_dev_linux-64_conda.lock +++ b/build_tools/azure/pylatest_pip_scipy_dev_linux-64_conda.lock @@ -1,6 +1,6 @@ # Generated by conda-lock. # platform: linux-64 -# input_hash: 45bccf0e77c6967a2f49b8c304ef02337f7bd84c59e63221f8c0cb0e75dfe269 +# input_hash: 7555819e95d879c5a5147e6431581e17ffc5d77e8a43b19c8a911821378d2521 @EXPLICIT https://repo.anaconda.com/pkgs/main/linux-64/_libgcc_mutex-0.1-main.conda#c3473ff8bdb3d124ed5ff11ec380d6f9 https://repo.anaconda.com/pkgs/main/linux-64/ca-certificates-2025.2.25-h06a4308_0.conda#495015d24da8ad929e3ae2d18571016d @@ -62,9 +62,9 @@ https://repo.anaconda.com/pkgs/main/noarch/pip-25.1-pyhc872135_2.conda#2778327d2 # pip pytest @ https://files.pythonhosted.org/packages/30/3d/64ad57c803f1fa1e963a7946b6e0fea4a70df53c1a7fed304586539c2bac/pytest-8.3.5-py3-none-any.whl#sha256=c69214aa47deac29fad6c2a4f590b9c4a9fdb16a403176fe154b79c0b4d4d820 # pip python-dateutil @ https://files.pythonhosted.org/packages/ec/57/56b9bcc3c9c6a792fcbaf139543cee77261f3651ca9da0c93f5c1221264b/python_dateutil-2.9.0.post0-py2.py3-none-any.whl#sha256=a8b2bc7bffae282281c8140a97d3aa9c14da0b136dfe83f850eea9a5f7470427 # pip requests @ https://files.pythonhosted.org/packages/f9/9b/335f9764261e915ed497fcdeb11df5dfd6f7bf257d4a6a2a686d80da4d54/requests-2.32.3-py3-none-any.whl#sha256=70761cfe03c773ceb22aa2f671b4757976145175cdfca038c02654d061d6dcc6 -# pip meson-python @ https://files.pythonhosted.org/packages/7d/ec/40c0ddd29ef4daa6689a2b9c5ced47d5b58fa54ae149b19e9a97f4979c8c/meson_python-0.17.1-py3-none-any.whl#sha256=30a75c52578ef14aff8392677b09c39346e0a24d2b2c6204b8ed30583c11269c +# pip meson-python @ https://files.pythonhosted.org/packages/28/58/66db620a8a7ccb32633de9f403fe49f1b63c68ca94e5c340ec5cceeb9821/meson_python-0.18.0-py3-none-any.whl#sha256=3b0fe051551cc238f5febb873247c0949cd60ded556efa130aa57021804868e2 # pip pooch @ https://files.pythonhosted.org/packages/a8/87/77cc11c7a9ea9fd05503def69e3d18605852cd0d4b0d3b8f15bbeb3ef1d1/pooch-1.8.2-py3-none-any.whl#sha256=3529a57096f7198778a5ceefd5ac3ef0e4d06a6ddaf9fc2d609b806f25302c47 # pip pytest-cov @ https://files.pythonhosted.org/packages/28/d0/def53b4a790cfb21483016430ed828f64830dd981ebe1089971cd10cab25/pytest_cov-6.1.1-py3-none-any.whl#sha256=bddf29ed2d0ab6f4df17b4c55b0a657287db8684af9c42ea546b21b1041b3dde # pip pytest-xdist @ https://files.pythonhosted.org/packages/6d/82/1d96bf03ee4c0fdc3c0cbe61470070e659ca78dc0086fb88b66c185e2449/pytest_xdist-3.6.1-py3-none-any.whl#sha256=9ed4adfb68a016610848639bb7e02c9352d5d9f03d04809919e2dafc3be4cca7 -# pip sphinx @ https://files.pythonhosted.org/packages/2f/72/9a437a9dc5393c0eabba447bdb6233a7b02bb23e84975f17ad9a9ca86677/sphinx-8.3.0-py3-none-any.whl#sha256=bd8fcf35ab2c4240b01c74a411c948350a3aebd6aa175579363754ed380d350a +# pip sphinx @ https://files.pythonhosted.org/packages/31/53/136e9eca6e0b9dc0e1962e2c908fbea2e5ac000c2a2fbd9a35797958c48b/sphinx-8.2.3-py3-none-any.whl#sha256=4405915165f13521d875a8c29c8970800a0141c14cc5416a38feca4ea5d9b9c3 # pip numpydoc @ https://files.pythonhosted.org/packages/6c/45/56d99ba9366476cd8548527667f01869279cedb9e66b28eb4dfb27701679/numpydoc-1.8.0-py3-none-any.whl#sha256=72024c7fd5e17375dec3608a27c03303e8ad00c81292667955c6fea7a3ccf541 diff --git a/build_tools/azure/pymin_conda_forge_mkl_win-64_conda.lock b/build_tools/azure/pymin_conda_forge_mkl_win-64_conda.lock index 051a5041f1138..6f8eb6175fa27 100644 --- a/build_tools/azure/pymin_conda_forge_mkl_win-64_conda.lock +++ b/build_tools/azure/pymin_conda_forge_mkl_win-64_conda.lock @@ -1,6 +1,6 @@ # Generated by conda-lock. # platform: win-64 -# input_hash: b3869076628274fd49d96cadc2692c963f26cbed79ec7498ecbfd50011a55e67 +# input_hash: cc5e2a711eb32773dc46fe159e1c3fe14f4fd07565fc8d3dedf2d748d4f2f694 @EXPLICIT https://conda.anaconda.org/conda-forge/noarch/font-ttf-dejavu-sans-mono-2.37-hab24e00_0.tar.bz2#0c96522c6bdaed4b1566d11387caaf45 https://conda.anaconda.org/conda-forge/noarch/font-ttf-inconsolata-3.000-h77eed37_0.tar.bz2#34893075a5c9e55cdafac56607368fc6 @@ -30,7 +30,7 @@ https://conda.anaconda.org/conda-forge/win-64/libexpat-2.7.0-he0c23c2_0.conda#b6 https://conda.anaconda.org/conda-forge/win-64/libffi-3.4.6-h537db12_1.conda#85d8fa5e55ed8f93f874b3b23ed54ec6 https://conda.anaconda.org/conda-forge/win-64/libiconv-1.18-h135ad9c_1.conda#21fc5dba2cbcd8e5e26ff976a312122c https://conda.anaconda.org/conda-forge/win-64/libjpeg-turbo-3.1.0-h2466b09_0.conda#7c51d27540389de84852daa1cdb9c63c -https://conda.anaconda.org/conda-forge/win-64/liblzma-5.8.1-h2466b09_0.conda#8d5cb0016b645d6688e2ff57c5d51302 +https://conda.anaconda.org/conda-forge/win-64/liblzma-5.8.1-h2466b09_1.conda#14a1042c163181e143a7522dfb8ad6ab https://conda.anaconda.org/conda-forge/win-64/libsqlite-3.49.1-h67fdade_2.conda#b58b66d4ad1aaf1c2543cbbd6afb1a59 https://conda.anaconda.org/conda-forge/win-64/libwebp-base-1.5.0-h3b0e114_0.conda#33f7313967072c6e6d8f865f5493c7ae https://conda.anaconda.org/conda-forge/win-64/libzlib-1.3.1-h2466b09_2.conda#41fbfac52c601159df6c01f875de31b9 @@ -93,7 +93,7 @@ https://conda.anaconda.org/conda-forge/noarch/python-dateutil-2.9.0.post0-pyhff2 https://conda.anaconda.org/conda-forge/win-64/tbb-2021.13.0-h62715c5_1.conda#9190dd0a23d925f7602f9628b3aed511 https://conda.anaconda.org/conda-forge/win-64/fonttools-4.57.0-py310h38315fa_0.conda#1f25f742c39582715cc058f5fe451975 https://conda.anaconda.org/conda-forge/win-64/freetype-2.13.3-h57928b3_1.conda#633504fe3f96031192e40e3e6c18ef06 -https://conda.anaconda.org/conda-forge/noarch/meson-python-0.17.1-pyh70fd9c4_1.conda#7a02679229c6c2092571b4c025055440 +https://conda.anaconda.org/conda-forge/noarch/meson-python-0.18.0-pyh70fd9c4_0.conda#576c04b9d9f8e45285fb4d9452c26133 https://conda.anaconda.org/conda-forge/win-64/mkl-2024.2.2-h66d3029_15.conda#302dff2807f2927b3e9e0d19d60121de https://conda.anaconda.org/conda-forge/noarch/pytest-cov-6.1.1-pyhd8ed1ab_0.conda#1e35d8f975bc0e984a19819aa91c440a https://conda.anaconda.org/conda-forge/noarch/pytest-xdist-3.6.1-pyhd8ed1ab_1.conda#59aad4fb37cabc0bacc73cf344612ddd diff --git a/build_tools/azure/pymin_conda_forge_openblas_min_dependencies_linux-64_conda.lock b/build_tools/azure/pymin_conda_forge_openblas_min_dependencies_linux-64_conda.lock index 5d0b23f9e2f41..d68f376c0d376 100644 --- a/build_tools/azure/pymin_conda_forge_openblas_min_dependencies_linux-64_conda.lock +++ b/build_tools/azure/pymin_conda_forge_openblas_min_dependencies_linux-64_conda.lock @@ -1,6 +1,6 @@ # Generated by conda-lock. # platform: linux-64 -# input_hash: fbba4fe2a9e1ebfa6e5d79269f12618306ade6ba86f95bb43c9719cd8dbe0e38 +# input_hash: 41111e5656d9d33f83f1160f643ec4ab314aa8e179923dbe1350c87b0ac2f400 @EXPLICIT https://conda.anaconda.org/conda-forge/noarch/font-ttf-dejavu-sans-mono-2.37-hab24e00_0.tar.bz2#0c96522c6bdaed4b1566d11387caaf45 https://conda.anaconda.org/conda-forge/noarch/font-ttf-inconsolata-3.000-h77eed37_0.tar.bz2#34893075a5c9e55cdafac56607368fc6 @@ -28,7 +28,7 @@ https://conda.anaconda.org/conda-forge/linux-64/libgettextpo-0.24.1-h5888daf_0.c https://conda.anaconda.org/conda-forge/linux-64/libgfortran5-14.2.0-hf1ad2bd_2.conda#556a4fdfac7287d349b8f09aba899693 https://conda.anaconda.org/conda-forge/linux-64/libiconv-1.18-h4ce23a2_1.conda#e796ff8ddc598affdf7c173d6145f087 https://conda.anaconda.org/conda-forge/linux-64/libjpeg-turbo-3.1.0-hb9d3cd8_0.conda#9fa334557db9f63da6c9285fd2a48638 -https://conda.anaconda.org/conda-forge/linux-64/liblzma-5.8.1-hb9d3cd8_0.conda#0e87378639676987af32fee53ba32258 +https://conda.anaconda.org/conda-forge/linux-64/liblzma-5.8.1-hb9d3cd8_1.conda#a76fd702c93cd2dfd89eff30a5fd45a8 https://conda.anaconda.org/conda-forge/linux-64/libntlm-1.8-hb9d3cd8_0.conda#7c7927b404672409d9917d49bff5f2d6 https://conda.anaconda.org/conda-forge/linux-64/libogg-1.3.5-hd0c01bc_1.conda#68e52064ed3897463c0e958ab5c8f91b https://conda.anaconda.org/conda-forge/linux-64/libopus-1.5.2-hd0c01bc_0.conda#b64523fb87ac6f87f0790f324ad43046 @@ -86,7 +86,7 @@ https://conda.anaconda.org/conda-forge/linux-64/libgfortran-ng-14.2.0-h69a702a_2 https://conda.anaconda.org/conda-forge/linux-64/libtiff-4.7.0-hd9ff511_4.conda#6c1028898cf3a2032d9af46689e1b81a https://conda.anaconda.org/conda-forge/linux-64/libvorbis-1.3.7-h9c3ff4c_0.tar.bz2#309dec04b70a3cc0f1e84a4013683bc0 https://conda.anaconda.org/conda-forge/linux-64/mysql-libs-9.0.1-he0572af_6.conda#9802ae6d20982f42c0f5d69008988763 -https://conda.anaconda.org/conda-forge/linux-64/nss-3.110-h159eef7_0.conda#945659af183e87429c8aa7e0be3cc91d +https://conda.anaconda.org/conda-forge/linux-64/nss-3.111-h159eef7_0.conda#311e8370c9db254611ec87250f6370a0 https://conda.anaconda.org/conda-forge/linux-64/pcre2-10.45-hc749103_0.conda#b90bece58b4c2bf25969b70f3be42d25 https://conda.anaconda.org/conda-forge/linux-64/python-3.10.17-hd6af730_0_cpython.conda#7bb89638dae9ce1b8e051d0b721e83c2 https://conda.anaconda.org/conda-forge/linux-64/xcb-util-0.4.1-hb711507_2.conda#8637c3e5821654d0edf97e2b0404b443 @@ -96,7 +96,7 @@ https://conda.anaconda.org/conda-forge/linux-64/xcb-util-wm-0.4.2-hb711507_0.con https://conda.anaconda.org/conda-forge/linux-64/xorg-libsm-1.2.6-he73a12e_0.conda#1c74ff8c35dcadf952a16f752ca5aa49 https://conda.anaconda.org/conda-forge/linux-64/xorg-libx11-1.8.12-h4f16b4b_0.conda#db038ce880f100acc74dba10302b5630 https://conda.anaconda.org/conda-forge/linux-64/brotli-1.1.0-hb9d3cd8_2.conda#98514fe74548d768907ce7a13f680e8f -https://conda.anaconda.org/conda-forge/noarch/certifi-2025.1.31-pyhd8ed1ab_0.conda#c207fa5ac7ea99b149344385a9c0880d +https://conda.anaconda.org/conda-forge/noarch/certifi-2025.4.26-pyhd8ed1ab_0.conda#c33eeaaa33f45031be34cda513df39b6 https://conda.anaconda.org/conda-forge/noarch/colorama-0.4.6-pyhd8ed1ab_1.conda#962b9857ee8e7018c22f2776ffa0b2d7 https://conda.anaconda.org/conda-forge/noarch/cycler-0.12.1-pyhd8ed1ab_1.conda#44600c4667a319d67dbe0681fc0bc833 https://conda.anaconda.org/conda-forge/linux-64/cyrus-sasl-2.1.27-h54b06d7_7.conda#dce22f70b4e5a407ce88f2be046f4ceb @@ -148,7 +148,7 @@ https://conda.anaconda.org/conda-forge/linux-64/libblas-3.9.0-20_linux64_openbla https://conda.anaconda.org/conda-forge/linux-64/libflac-1.4.3-h59595ed_0.conda#ee48bf17cc83a00f59ca1494d5646869 https://conda.anaconda.org/conda-forge/linux-64/libgl-1.7.0-ha4b6fd6_2.conda#928b8be80851f5d8ffb016f9c81dae7a https://conda.anaconda.org/conda-forge/linux-64/libllvm20-20.1.4-he9d0ab4_0.conda#96c33bbd084ef2b2463503fb7f1482ae -https://conda.anaconda.org/conda-forge/linux-64/libxkbcommon-1.9.1-h65c71a3_0.conda#6e45090fe0eec179ecc8041a3a3fc9f8 +https://conda.anaconda.org/conda-forge/linux-64/libxkbcommon-1.9.2-h65c71a3_0.conda#d045b1d878031eb497cab44e6392b1df https://conda.anaconda.org/conda-forge/linux-64/openblas-0.3.25-pthreads_h7a3da1a_0.conda#87661673941b5e702275fdf0fc095ad0 https://conda.anaconda.org/conda-forge/linux-64/openldap-2.6.9-he970967_0.conda#ca2de8bbdc871bce41dbf59e51324165 https://conda.anaconda.org/conda-forge/noarch/pip-25.1.1-pyh8b19718_0.conda#32d0781ace05105cc99af55d36cbec7c diff --git a/build_tools/azure/pymin_conda_forge_openblas_ubuntu_2204_linux-64_conda.lock b/build_tools/azure/pymin_conda_forge_openblas_ubuntu_2204_linux-64_conda.lock index 009d15a7d3713..b7899b98ba3fa 100644 --- a/build_tools/azure/pymin_conda_forge_openblas_ubuntu_2204_linux-64_conda.lock +++ b/build_tools/azure/pymin_conda_forge_openblas_ubuntu_2204_linux-64_conda.lock @@ -1,6 +1,6 @@ # Generated by conda-lock. # platform: linux-64 -# input_hash: ec41f4a9538671e542d266b999ea055a685df8323c3c879f7d01fb2c259197cb +# input_hash: 26bb2530999c20f24bbab0f7b6e3545ad84d059a25027cb624997210afc23693 @EXPLICIT https://conda.anaconda.org/conda-forge/linux-64/_libgcc_mutex-0.1-conda_forge.tar.bz2#d7c89558ba9fa0495403155b64376d81 https://conda.anaconda.org/conda-forge/noarch/python_abi-3.10-7_cp310.conda#44e871cba2b162368476a84b8d040b6c @@ -16,7 +16,7 @@ https://conda.anaconda.org/conda-forge/linux-64/libffi-3.4.6-h2dba641_1.conda#ed https://conda.anaconda.org/conda-forge/linux-64/libgcc-ng-14.2.0-h69a702a_2.conda#a2222a6ada71fb478682efe483ce0f92 https://conda.anaconda.org/conda-forge/linux-64/libgfortran5-14.2.0-hf1ad2bd_2.conda#556a4fdfac7287d349b8f09aba899693 https://conda.anaconda.org/conda-forge/linux-64/libjpeg-turbo-3.1.0-hb9d3cd8_0.conda#9fa334557db9f63da6c9285fd2a48638 -https://conda.anaconda.org/conda-forge/linux-64/liblzma-5.8.1-hb9d3cd8_0.conda#0e87378639676987af32fee53ba32258 +https://conda.anaconda.org/conda-forge/linux-64/liblzma-5.8.1-hb9d3cd8_1.conda#a76fd702c93cd2dfd89eff30a5fd45a8 https://conda.anaconda.org/conda-forge/linux-64/libstdcxx-14.2.0-h8f9b012_2.conda#a78c856b6dc6bf4ea8daeb9beaaa3fb0 https://conda.anaconda.org/conda-forge/linux-64/libwebp-base-1.5.0-h851e524_0.conda#63f790534398730f59e1b899c3644d4a https://conda.anaconda.org/conda-forge/linux-64/libzlib-1.3.1-hb9d3cd8_2.conda#edb0dca6bc32e4f4789199455a1dbeb8 @@ -46,7 +46,7 @@ https://conda.anaconda.org/conda-forge/linux-64/libtiff-4.7.0-hd9ff511_4.conda#6 https://conda.anaconda.org/conda-forge/linux-64/python-3.10.17-hd6af730_0_cpython.conda#7bb89638dae9ce1b8e051d0b721e83c2 https://conda.anaconda.org/conda-forge/noarch/alabaster-1.0.0-pyhd8ed1ab_1.conda#1fd9696649f65fd6611fcdb4ffec738a https://conda.anaconda.org/conda-forge/linux-64/brotli-python-1.1.0-py310hf71b8c6_2.conda#bf502c169c71e3c6ac0d6175addfacc2 -https://conda.anaconda.org/conda-forge/noarch/certifi-2025.1.31-pyhd8ed1ab_0.conda#c207fa5ac7ea99b149344385a9c0880d +https://conda.anaconda.org/conda-forge/noarch/certifi-2025.4.26-pyhd8ed1ab_0.conda#c33eeaaa33f45031be34cda513df39b6 https://conda.anaconda.org/conda-forge/noarch/charset-normalizer-3.4.2-pyhd8ed1ab_0.conda#40fe4284b8b5835a9073a645139f35af https://conda.anaconda.org/conda-forge/noarch/colorama-0.4.6-pyhd8ed1ab_1.conda#962b9857ee8e7018c22f2776ffa0b2d7 https://conda.anaconda.org/conda-forge/linux-64/cython-3.0.12-py310had8cdd9_0.conda#b630fe36f0b621d23e74872dc4fd2bd7 @@ -95,7 +95,7 @@ https://conda.anaconda.org/conda-forge/noarch/pyproject-metadata-0.9.1-pyhd8ed1a https://conda.anaconda.org/conda-forge/noarch/pytest-8.3.5-pyhd8ed1ab_0.conda#c3c9316209dec74a705a36797970c6be https://conda.anaconda.org/conda-forge/noarch/python-dateutil-2.9.0.post0-pyhff2d567_1.conda#5ba79d7c71f03c678c8ead841f347d6e https://conda.anaconda.org/conda-forge/linux-64/liblapacke-3.9.0-31_he2f377e_openblas.conda#7e5fff7d0db69be3a266f7e79a3bb0e2 -https://conda.anaconda.org/conda-forge/noarch/meson-python-0.17.1-pyh70fd9c4_1.conda#7a02679229c6c2092571b4c025055440 +https://conda.anaconda.org/conda-forge/noarch/meson-python-0.18.0-pyh70fd9c4_0.conda#576c04b9d9f8e45285fb4d9452c26133 https://conda.anaconda.org/conda-forge/linux-64/numpy-2.2.5-py310hefbff90_0.conda#5526bc875ec897f0d335e38da832b6ee https://conda.anaconda.org/conda-forge/linux-64/pillow-11.1.0-py310h7e6dc6c_0.conda#14d300b9e1504748e70cc6499a7b4d25 https://conda.anaconda.org/conda-forge/noarch/pytest-xdist-3.6.1-pyhd8ed1ab_1.conda#59aad4fb37cabc0bacc73cf344612ddd diff --git a/build_tools/azure/ubuntu_atlas_lock.txt b/build_tools/azure/ubuntu_atlas_lock.txt index ea978eeabcb51..bb4ee75928009 100644 --- a/build_tools/azure/ubuntu_atlas_lock.txt +++ b/build_tools/azure/ubuntu_atlas_lock.txt @@ -16,7 +16,7 @@ joblib==1.2.0 # via -r build_tools/azure/ubuntu_atlas_requirements.txt meson==1.8.0 # via meson-python -meson-python==0.17.1 +meson-python==0.18.0 # via -r build_tools/azure/ubuntu_atlas_requirements.txt ninja==1.11.1.4 # via -r build_tools/azure/ubuntu_atlas_requirements.txt diff --git a/build_tools/circle/doc_linux-64_conda.lock b/build_tools/circle/doc_linux-64_conda.lock index c489e4f01a9f7..76f56da3a9681 100644 --- a/build_tools/circle/doc_linux-64_conda.lock +++ b/build_tools/circle/doc_linux-64_conda.lock @@ -1,6 +1,6 @@ # Generated by conda-lock. # platform: linux-64 -# input_hash: 208134f3b8c140a6fe6fffe85293a731d77b7bf6cdcf0b12f7a44fdcf6e665d2 +# input_hash: 93cb6f7aa17dce662512650f1419e87eae56ed49163348847bf965697cd268bb @EXPLICIT https://conda.anaconda.org/conda-forge/linux-64/_libgcc_mutex-0.1-conda_forge.tar.bz2#d7c89558ba9fa0495403155b64376d81 https://conda.anaconda.org/conda-forge/noarch/font-ttf-dejavu-sans-mono-2.37-hab24e00_0.tar.bz2#0c96522c6bdaed4b1566d11387caaf45 @@ -35,7 +35,7 @@ https://conda.anaconda.org/conda-forge/linux-64/libgcc-ng-14.2.0-h69a702a_2.cond https://conda.anaconda.org/conda-forge/linux-64/libgfortran5-14.2.0-hf1ad2bd_2.conda#556a4fdfac7287d349b8f09aba899693 https://conda.anaconda.org/conda-forge/linux-64/libiconv-1.18-h4ce23a2_1.conda#e796ff8ddc598affdf7c173d6145f087 https://conda.anaconda.org/conda-forge/linux-64/libjpeg-turbo-3.1.0-hb9d3cd8_0.conda#9fa334557db9f63da6c9285fd2a48638 -https://conda.anaconda.org/conda-forge/linux-64/liblzma-5.8.1-hb9d3cd8_0.conda#0e87378639676987af32fee53ba32258 +https://conda.anaconda.org/conda-forge/linux-64/liblzma-5.8.1-hb9d3cd8_1.conda#a76fd702c93cd2dfd89eff30a5fd45a8 https://conda.anaconda.org/conda-forge/linux-64/libntlm-1.8-hb9d3cd8_0.conda#7c7927b404672409d9917d49bff5f2d6 https://conda.anaconda.org/conda-forge/linux-64/libstdcxx-14.2.0-h8f9b012_2.conda#a78c856b6dc6bf4ea8daeb9beaaa3fb0 https://conda.anaconda.org/conda-forge/linux-64/libwebp-base-1.5.0-h851e524_0.conda#63f790534398730f59e1b899c3644d4a @@ -110,7 +110,7 @@ https://conda.anaconda.org/conda-forge/linux-64/xorg-libx11-1.8.12-h4f16b4b_0.co https://conda.anaconda.org/conda-forge/noarch/alabaster-1.0.0-pyhd8ed1ab_1.conda#1fd9696649f65fd6611fcdb4ffec738a https://conda.anaconda.org/conda-forge/linux-64/brotli-1.1.0-hb9d3cd8_2.conda#98514fe74548d768907ce7a13f680e8f https://conda.anaconda.org/conda-forge/linux-64/brotli-python-1.1.0-py310hf71b8c6_2.conda#bf502c169c71e3c6ac0d6175addfacc2 -https://conda.anaconda.org/conda-forge/noarch/certifi-2025.1.31-pyhd8ed1ab_0.conda#c207fa5ac7ea99b149344385a9c0880d +https://conda.anaconda.org/conda-forge/noarch/certifi-2025.4.26-pyhd8ed1ab_0.conda#c33eeaaa33f45031be34cda513df39b6 https://conda.anaconda.org/conda-forge/noarch/charset-normalizer-3.4.2-pyhd8ed1ab_0.conda#40fe4284b8b5835a9073a645139f35af https://conda.anaconda.org/conda-forge/noarch/click-8.1.8-pyh707e725_0.conda#f22f4d4970e09d68a10b922cbb0408d3 https://conda.anaconda.org/conda-forge/noarch/colorama-0.4.6-pyhd8ed1ab_1.conda#962b9857ee8e7018c22f2776ffa0b2d7 @@ -142,7 +142,7 @@ https://conda.anaconda.org/conda-forge/linux-64/libxml2-2.13.7-h4bc477f_1.conda# https://conda.anaconda.org/conda-forge/linux-64/markupsafe-3.0.2-py310h89163eb_1.conda#8ce3f0332fd6de0d737e2911d329523f https://conda.anaconda.org/conda-forge/noarch/meson-1.8.0-pyh29332c3_0.conda#8e25221b702272394b86b0f4d7217f77 https://conda.anaconda.org/conda-forge/noarch/munkres-1.1.4-pyh9f0ad1d_0.tar.bz2#2ba8498c1018c1e9c61eb99b973dfe19 -https://conda.anaconda.org/conda-forge/noarch/narwhals-1.37.0-pyh29332c3_0.conda#f9ae420fa431efd502a5d5c4c1f08263 +https://conda.anaconda.org/conda-forge/noarch/narwhals-1.38.0-pyhe01879c_0.conda#6d3bd92df4504d07c0ab7cfb81d7e4b1 https://conda.anaconda.org/conda-forge/noarch/networkx-3.4.2-pyh267e887_2.conda#fd40bf7f7f4bc4b647dc8512053d9873 https://conda.anaconda.org/conda-forge/linux-64/openblas-0.3.29-pthreads_h6ec200e_0.conda#7e4d48870b3258bea920d51b7f495a81 https://conda.anaconda.org/conda-forge/linux-64/openjpeg-2.5.3-h5fbd93e_0.conda#9e5816bc95d285c115a3ebc2f8563564 @@ -159,7 +159,7 @@ https://conda.anaconda.org/conda-forge/noarch/pytz-2025.2-pyhd8ed1ab_0.conda#bc8 https://conda.anaconda.org/conda-forge/noarch/setuptools-80.1.0-pyhff2d567_0.conda#f6f72d0837c79eaec77661be43e8a691 https://conda.anaconda.org/conda-forge/noarch/six-1.17.0-pyhd8ed1ab_0.conda#a451d576819089b0d672f18768be0f65 https://conda.anaconda.org/conda-forge/noarch/snowballstemmer-2.2.0-pyhd8ed1ab_0.tar.bz2#4d22a9315e78c6827f806065957d566e -https://conda.anaconda.org/conda-forge/noarch/soupsieve-2.5-pyhd8ed1ab_1.conda#3f144b2c34f8cb5a9abd9ed23a39c561 +https://conda.anaconda.org/conda-forge/noarch/soupsieve-2.7-pyhd8ed1ab_0.conda#fb32097c717486aa34b38a9db57eb49e https://conda.anaconda.org/conda-forge/noarch/sphinxcontrib-jsmath-1.0.1-pyhd8ed1ab_1.conda#fa839b5ff59e192f411ccc7dae6588bb https://conda.anaconda.org/conda-forge/noarch/tabulate-0.9.0-pyhd8ed1ab_2.conda#959484a66b4b76befcddc4fa97c95567 https://conda.anaconda.org/conda-forge/noarch/threadpoolctl-3.6.0-pyhecae5ae_0.conda#9d64911b31d57ca443e9f1e36b04385f @@ -195,7 +195,7 @@ https://conda.anaconda.org/conda-forge/linux-64/libcblas-3.9.0-31_he106b2a_openb https://conda.anaconda.org/conda-forge/linux-64/libgl-1.7.0-ha4b6fd6_2.conda#928b8be80851f5d8ffb016f9c81dae7a https://conda.anaconda.org/conda-forge/linux-64/liblapack-3.9.0-31_h7ac8fdf_openblas.conda#452b98eafe050ecff932f0ec832dd03f https://conda.anaconda.org/conda-forge/linux-64/libllvm20-20.1.4-he9d0ab4_0.conda#96c33bbd084ef2b2463503fb7f1482ae -https://conda.anaconda.org/conda-forge/linux-64/libxkbcommon-1.9.1-h65c71a3_0.conda#6e45090fe0eec179ecc8041a3a3fc9f8 +https://conda.anaconda.org/conda-forge/linux-64/libxkbcommon-1.9.2-h65c71a3_0.conda#d045b1d878031eb497cab44e6392b1df https://conda.anaconda.org/conda-forge/linux-64/libxslt-1.1.39-h76b75d6_0.conda#e71f31f8cfb0a91439f2086fc8aa0461 https://conda.anaconda.org/conda-forge/noarch/memory_profiler-0.61.0-pyhd8ed1ab_1.conda#71abbefb6f3b95e1668cd5e0af3affb9 https://conda.anaconda.org/conda-forge/linux-64/openldap-2.6.9-he970967_0.conda#ca2de8bbdc871bce41dbf59e51324165 @@ -224,7 +224,7 @@ https://conda.anaconda.org/conda-forge/linux-64/libclang-cpp20.1-20.1.4-default_ https://conda.anaconda.org/conda-forge/linux-64/libclang13-20.1.4-default_he06ed0a_0.conda#2d933632c8004be47deb2be61bf013be https://conda.anaconda.org/conda-forge/linux-64/liblapacke-3.9.0-31_he2f377e_openblas.conda#7e5fff7d0db69be3a266f7e79a3bb0e2 https://conda.anaconda.org/conda-forge/linux-64/libpq-17.4-h27ae623_1.conda#37fba334855ef3b51549308e61ed7a3d -https://conda.anaconda.org/conda-forge/noarch/meson-python-0.17.1-pyh70fd9c4_1.conda#7a02679229c6c2092571b4c025055440 +https://conda.anaconda.org/conda-forge/noarch/meson-python-0.18.0-pyh70fd9c4_0.conda#576c04b9d9f8e45285fb4d9452c26133 https://conda.anaconda.org/conda-forge/linux-64/numpy-2.2.5-py310hefbff90_0.conda#5526bc875ec897f0d335e38da832b6ee https://conda.anaconda.org/conda-forge/linux-64/pillow-11.1.0-py310h7e6dc6c_0.conda#14d300b9e1504748e70cc6499a7b4d25 https://conda.anaconda.org/conda-forge/noarch/pytest-xdist-3.6.1-pyhd8ed1ab_1.conda#59aad4fb37cabc0bacc73cf344612ddd diff --git a/build_tools/circle/doc_min_dependencies_linux-64_conda.lock b/build_tools/circle/doc_min_dependencies_linux-64_conda.lock index 4e9d8501dc411..7801c08740653 100644 --- a/build_tools/circle/doc_min_dependencies_linux-64_conda.lock +++ b/build_tools/circle/doc_min_dependencies_linux-64_conda.lock @@ -1,6 +1,6 @@ # Generated by conda-lock. # platform: linux-64 -# input_hash: 1ff580fa5b39efc9a616b69d09ea9208049b15bb1bd5e42883b7295d717cc6ba +# input_hash: cf86af2534e8e281654ed19bc893b468656b355b2b200b12321dbc61cce562db @EXPLICIT https://conda.anaconda.org/conda-forge/linux-64/_libgcc_mutex-0.1-conda_forge.tar.bz2#d7c89558ba9fa0495403155b64376d81 https://conda.anaconda.org/conda-forge/noarch/font-ttf-dejavu-sans-mono-2.37-hab24e00_0.tar.bz2#0c96522c6bdaed4b1566d11387caaf45 @@ -36,7 +36,7 @@ https://conda.anaconda.org/conda-forge/linux-64/libgettextpo-0.24.1-h5888daf_0.c https://conda.anaconda.org/conda-forge/linux-64/libgfortran5-14.2.0-hf1ad2bd_2.conda#556a4fdfac7287d349b8f09aba899693 https://conda.anaconda.org/conda-forge/linux-64/libiconv-1.18-h4ce23a2_1.conda#e796ff8ddc598affdf7c173d6145f087 https://conda.anaconda.org/conda-forge/linux-64/libjpeg-turbo-3.1.0-hb9d3cd8_0.conda#9fa334557db9f63da6c9285fd2a48638 -https://conda.anaconda.org/conda-forge/linux-64/liblzma-5.8.1-hb9d3cd8_0.conda#0e87378639676987af32fee53ba32258 +https://conda.anaconda.org/conda-forge/linux-64/liblzma-5.8.1-hb9d3cd8_1.conda#a76fd702c93cd2dfd89eff30a5fd45a8 https://conda.anaconda.org/conda-forge/linux-64/libntlm-1.8-hb9d3cd8_0.conda#7c7927b404672409d9917d49bff5f2d6 https://conda.anaconda.org/conda-forge/linux-64/libogg-1.3.5-hd0c01bc_1.conda#68e52064ed3897463c0e958ab5c8f91b https://conda.anaconda.org/conda-forge/linux-64/libopus-1.5.2-hd0c01bc_0.conda#b64523fb87ac6f87f0790f324ad43046 @@ -115,7 +115,7 @@ https://conda.anaconda.org/conda-forge/linux-64/libtiff-4.7.0-hd9ff511_4.conda#6 https://conda.anaconda.org/conda-forge/linux-64/libvorbis-1.3.7-h9c3ff4c_0.tar.bz2#309dec04b70a3cc0f1e84a4013683bc0 https://conda.anaconda.org/conda-forge/linux-64/libzopfli-1.0.3-h9c3ff4c_0.tar.bz2#c66fe2d123249af7651ebde8984c51c2 https://conda.anaconda.org/conda-forge/linux-64/mysql-libs-9.0.1-he0572af_6.conda#9802ae6d20982f42c0f5d69008988763 -https://conda.anaconda.org/conda-forge/linux-64/nss-3.110-h159eef7_0.conda#945659af183e87429c8aa7e0be3cc91d +https://conda.anaconda.org/conda-forge/linux-64/nss-3.111-h159eef7_0.conda#311e8370c9db254611ec87250f6370a0 https://conda.anaconda.org/conda-forge/linux-64/pcre2-10.45-hc749103_0.conda#b90bece58b4c2bf25969b70f3be42d25 https://conda.anaconda.org/conda-forge/linux-64/python-3.10.17-hd6af730_0_cpython.conda#7bb89638dae9ce1b8e051d0b721e83c2 https://conda.anaconda.org/conda-forge/linux-64/xcb-util-0.4.1-hb711507_2.conda#8637c3e5821654d0edf97e2b0404b443 @@ -128,7 +128,7 @@ https://conda.anaconda.org/conda-forge/noarch/alabaster-0.7.16-pyhd8ed1ab_0.cond https://conda.anaconda.org/conda-forge/noarch/appdirs-1.4.4-pyhd8ed1ab_1.conda#f4e90937bbfc3a4a92539545a37bb448 https://conda.anaconda.org/conda-forge/linux-64/brotli-1.1.0-hb9d3cd8_2.conda#98514fe74548d768907ce7a13f680e8f https://conda.anaconda.org/conda-forge/linux-64/brotli-python-1.1.0-py310hf71b8c6_2.conda#bf502c169c71e3c6ac0d6175addfacc2 -https://conda.anaconda.org/conda-forge/noarch/certifi-2025.1.31-pyhd8ed1ab_0.conda#c207fa5ac7ea99b149344385a9c0880d +https://conda.anaconda.org/conda-forge/noarch/certifi-2025.4.26-pyhd8ed1ab_0.conda#c33eeaaa33f45031be34cda513df39b6 https://conda.anaconda.org/conda-forge/noarch/charset-normalizer-3.4.2-pyhd8ed1ab_0.conda#40fe4284b8b5835a9073a645139f35af https://conda.anaconda.org/conda-forge/noarch/click-8.1.8-pyh707e725_0.conda#f22f4d4970e09d68a10b922cbb0408d3 https://conda.anaconda.org/conda-forge/noarch/cloudpickle-3.1.1-pyhd8ed1ab_0.conda#364ba6c9fb03886ac979b482f39ebb92 @@ -180,7 +180,7 @@ https://conda.anaconda.org/conda-forge/linux-64/pyyaml-6.0.2-py310h89163eb_2.con https://conda.anaconda.org/conda-forge/noarch/setuptools-80.1.0-pyhff2d567_0.conda#f6f72d0837c79eaec77661be43e8a691 https://conda.anaconda.org/conda-forge/noarch/six-1.17.0-pyhd8ed1ab_0.conda#a451d576819089b0d672f18768be0f65 https://conda.anaconda.org/conda-forge/noarch/snowballstemmer-2.2.0-pyhd8ed1ab_0.tar.bz2#4d22a9315e78c6827f806065957d566e -https://conda.anaconda.org/conda-forge/noarch/soupsieve-2.5-pyhd8ed1ab_1.conda#3f144b2c34f8cb5a9abd9ed23a39c561 +https://conda.anaconda.org/conda-forge/noarch/soupsieve-2.7-pyhd8ed1ab_0.conda#fb32097c717486aa34b38a9db57eb49e https://conda.anaconda.org/conda-forge/noarch/sphinxcontrib-jsmath-1.0.1-pyhd8ed1ab_1.conda#fa839b5ff59e192f411ccc7dae6588bb https://conda.anaconda.org/conda-forge/noarch/tenacity-9.1.2-pyhd8ed1ab_0.conda#5d99943f2ae3cc69e1ada12ce9d4d701 https://conda.anaconda.org/conda-forge/noarch/threadpoolctl-3.6.0-pyhecae5ae_0.conda#9d64911b31d57ca443e9f1e36b04385f @@ -220,7 +220,7 @@ https://conda.anaconda.org/conda-forge/linux-64/libflac-1.4.3-h59595ed_0.conda#e https://conda.anaconda.org/conda-forge/linux-64/libgl-1.7.0-ha4b6fd6_2.conda#928b8be80851f5d8ffb016f9c81dae7a https://conda.anaconda.org/conda-forge/linux-64/liblapacke-3.9.0-12_hce4cc19_netlib.conda#bdcf65db13abdddba7af29592f93600b https://conda.anaconda.org/conda-forge/linux-64/libllvm20-20.1.4-he9d0ab4_0.conda#96c33bbd084ef2b2463503fb7f1482ae -https://conda.anaconda.org/conda-forge/linux-64/libxkbcommon-1.9.1-h65c71a3_0.conda#6e45090fe0eec179ecc8041a3a3fc9f8 +https://conda.anaconda.org/conda-forge/linux-64/libxkbcommon-1.9.2-h65c71a3_0.conda#d045b1d878031eb497cab44e6392b1df https://conda.anaconda.org/conda-forge/noarch/memory_profiler-0.61.0-pyhd8ed1ab_1.conda#71abbefb6f3b95e1668cd5e0af3affb9 https://conda.anaconda.org/conda-forge/linux-64/numpy-1.22.0-py310h454958d_1.tar.bz2#607c66f0cce2986515a8fe9e136b2b57 https://conda.anaconda.org/conda-forge/linux-64/openldap-2.6.9-he970967_0.conda#ca2de8bbdc871bce41dbf59e51324165 @@ -247,7 +247,7 @@ https://conda.anaconda.org/conda-forge/linux-64/libclang-cpp20.1-20.1.4-default_ https://conda.anaconda.org/conda-forge/linux-64/libclang13-20.1.4-default_he06ed0a_0.conda#2d933632c8004be47deb2be61bf013be https://conda.anaconda.org/conda-forge/linux-64/libpq-17.4-h27ae623_1.conda#37fba334855ef3b51549308e61ed7a3d https://conda.anaconda.org/conda-forge/linux-64/libsndfile-1.2.2-hc60ed4a_1.conda#ef1910918dd895516a769ed36b5b3a4e -https://conda.anaconda.org/conda-forge/noarch/meson-python-0.17.1-pyh70fd9c4_1.conda#7a02679229c6c2092571b4c025055440 +https://conda.anaconda.org/conda-forge/noarch/meson-python-0.18.0-pyh70fd9c4_0.conda#576c04b9d9f8e45285fb4d9452c26133 https://conda.anaconda.org/conda-forge/linux-64/pandas-1.4.0-py310hb5077e9_0.tar.bz2#43e920bc9856daa7d8d18fcbfb244c4e https://conda.anaconda.org/conda-forge/noarch/patsy-1.0.1-pyhd8ed1ab_1.conda#ee23fabfd0a8c6b8d6f3729b47b2859d https://conda.anaconda.org/conda-forge/linux-64/pillow-11.1.0-py310h7e6dc6c_0.conda#14d300b9e1504748e70cc6499a7b4d25 diff --git a/build_tools/github/pylatest_conda_forge_cuda_array-api_linux-64_conda.lock b/build_tools/github/pylatest_conda_forge_cuda_array-api_linux-64_conda.lock index 8a707637fbc9b..868f3f9d863c8 100644 --- a/build_tools/github/pylatest_conda_forge_cuda_array-api_linux-64_conda.lock +++ b/build_tools/github/pylatest_conda_forge_cuda_array-api_linux-64_conda.lock @@ -1,6 +1,6 @@ # Generated by conda-lock. # platform: linux-64 -# input_hash: e141e0789f4a2b4be527fb91bb83f873bd14718407fa58b8790d2198f61bc6f5 +# input_hash: 0c167b26e12c284b769bf4d76bd3e604db266ed21c8f9e11e4bb737419ccdc93 @EXPLICIT https://conda.anaconda.org/conda-forge/noarch/cuda-version-11.8-h70ddcb2_3.conda#670f0e1593b8c1d84f57ad5fe5256799 https://conda.anaconda.org/conda-forge/noarch/font-ttf-dejavu-sans-mono-2.37-hab24e00_0.tar.bz2#0c96522c6bdaed4b1566d11387caaf45 @@ -8,8 +8,6 @@ https://conda.anaconda.org/conda-forge/noarch/font-ttf-inconsolata-3.000-h77eed3 https://conda.anaconda.org/conda-forge/noarch/font-ttf-source-code-pro-2.038-h77eed37_0.tar.bz2#4d59c254e01d9cde7957100457e2d5fb https://conda.anaconda.org/conda-forge/noarch/font-ttf-ubuntu-0.83-h77eed37_3.conda#49023d73832ef61042f6a237cb2687e7 https://conda.anaconda.org/conda-forge/noarch/kernel-headers_linux-64-3.10.0-he073ed8_18.conda#ad8527bf134a90e1c9ed35fa0b64318c -https://conda.anaconda.org/conda-forge/linux-64/libopentelemetry-cpp-headers-1.18.0-ha770c72_1.conda#4fb055f57404920a43b147031471e03b -https://conda.anaconda.org/conda-forge/linux-64/nlohmann_json-3.12.0-h3f2d84a_0.conda#d76872d096d063e226482c99337209dc https://conda.anaconda.org/conda-forge/noarch/python_abi-3.13-7_cp313.conda#e84b44e6300f1703cb25d29120c5b1d8 https://conda.anaconda.org/conda-forge/noarch/tzdata-2025b-h78e105d_0.conda#4222072737ccff51314b5ece9c7d6f5a https://conda.anaconda.org/conda-forge/noarch/ca-certificates-2025.4.26-hbd8a1cb_0.conda#95db94f75ba080a22eb623590993167b @@ -24,7 +22,7 @@ https://conda.anaconda.org/conda-forge/linux-64/libegl-1.7.0-ha4b6fd6_2.conda#c1 https://conda.anaconda.org/conda-forge/linux-64/libopengl-1.7.0-ha4b6fd6_2.conda#7df50d44d4a14d6c31a2c54f2cd92157 https://conda.anaconda.org/conda-forge/linux-64/libgcc-14.2.0-h767d61c_2.conda#ef504d1acbd74b7cc6849ef8af47dd03 https://conda.anaconda.org/conda-forge/linux-64/alsa-lib-1.2.14-hb9d3cd8_0.conda#76df83c2a9035c54df5d04ff81bcc02d -https://conda.anaconda.org/conda-forge/linux-64/aws-c-common-0.12.0-hb9d3cd8_0.conda#f65c946f28f0518f41ced702f44c52b7 +https://conda.anaconda.org/conda-forge/linux-64/aws-c-common-0.10.6-hb9d3cd8_0.conda#d7d4680337a14001b0e043e96529409b https://conda.anaconda.org/conda-forge/linux-64/c-ares-1.34.5-hb9d3cd8_0.conda#f7f0d6cc2dc986d42ac2689ec88192be https://conda.anaconda.org/conda-forge/linux-64/libbrotlicommon-1.1.0-hb9d3cd8_2.conda#41b599ed2b02abcfdd84302bff174b23 https://conda.anaconda.org/conda-forge/linux-64/libdeflate-1.23-h86f0d12_0.conda#27fe770decaf469a53f3e3a6d593067f @@ -34,10 +32,10 @@ https://conda.anaconda.org/conda-forge/linux-64/libgcc-ng-14.2.0-h69a702a_2.cond https://conda.anaconda.org/conda-forge/linux-64/libgfortran5-14.2.0-hf1ad2bd_2.conda#556a4fdfac7287d349b8f09aba899693 https://conda.anaconda.org/conda-forge/linux-64/libiconv-1.18-h4ce23a2_1.conda#e796ff8ddc598affdf7c173d6145f087 https://conda.anaconda.org/conda-forge/linux-64/libjpeg-turbo-3.1.0-hb9d3cd8_0.conda#9fa334557db9f63da6c9285fd2a48638 -https://conda.anaconda.org/conda-forge/linux-64/liblzma-5.8.1-hb9d3cd8_0.conda#0e87378639676987af32fee53ba32258 +https://conda.anaconda.org/conda-forge/linux-64/liblzma-5.8.1-hb9d3cd8_1.conda#a76fd702c93cd2dfd89eff30a5fd45a8 https://conda.anaconda.org/conda-forge/linux-64/libntlm-1.8-hb9d3cd8_0.conda#7c7927b404672409d9917d49bff5f2d6 https://conda.anaconda.org/conda-forge/linux-64/libstdcxx-14.2.0-h8f9b012_2.conda#a78c856b6dc6bf4ea8daeb9beaaa3fb0 -https://conda.anaconda.org/conda-forge/linux-64/libutf8proc-2.10.0-h4c51ac1_0.conda#aeccfff2806ae38430638ffbb4be9610 +https://conda.anaconda.org/conda-forge/linux-64/libutf8proc-2.9.0-hb9d3cd8_1.conda#1e936bd23d737aac62a18e9a1e7f8b18 https://conda.anaconda.org/conda-forge/linux-64/libuv-1.50.0-hb9d3cd8_0.conda#771ee65e13bc599b0b62af5359d80169 https://conda.anaconda.org/conda-forge/linux-64/libwebp-base-1.5.0-h851e524_0.conda#63f790534398730f59e1b899c3644d4a https://conda.anaconda.org/conda-forge/linux-64/libzlib-1.3.1-hb9d3cd8_2.conda#edb0dca6bc32e4f4789199455a1dbeb8 @@ -47,10 +45,10 @@ https://conda.anaconda.org/conda-forge/linux-64/pthread-stubs-0.4-hb9d3cd8_1002. https://conda.anaconda.org/conda-forge/linux-64/xorg-libice-1.1.2-hb9d3cd8_0.conda#fb901ff28063514abb6046c9ec2c4a45 https://conda.anaconda.org/conda-forge/linux-64/xorg-libxau-1.0.12-hb9d3cd8_0.conda#f6ebe2cb3f82ba6c057dde5d9debe4f7 https://conda.anaconda.org/conda-forge/linux-64/xorg-libxdmcp-1.1.5-hb9d3cd8_0.conda#8035c64cb77ed555e3f150b7b3972480 -https://conda.anaconda.org/conda-forge/linux-64/aws-c-cal-0.8.7-h043a21b_0.conda#4fdf835d66ea197e693125c64fbd4482 -https://conda.anaconda.org/conda-forge/linux-64/aws-c-compression-0.3.1-h3870646_2.conda#17ccde79d864e6183a83c5bbb8fff34d -https://conda.anaconda.org/conda-forge/linux-64/aws-c-sdkutils-0.2.3-h3870646_2.conda#06008b5ab42117c89c982aa2a32a5b25 -https://conda.anaconda.org/conda-forge/linux-64/aws-checksums-0.2.3-h3870646_2.conda#303d9e83e0518f1dcb66e90054635ca6 +https://conda.anaconda.org/conda-forge/linux-64/aws-c-cal-0.8.1-h1a47875_3.conda#55a8561fdbbbd34f50f57d9be12ed084 +https://conda.anaconda.org/conda-forge/linux-64/aws-c-compression-0.3.0-h4e1184b_5.conda#3f4c1197462a6df2be6dc8241828fe93 +https://conda.anaconda.org/conda-forge/linux-64/aws-c-sdkutils-0.2.1-h4e1184b_4.conda#a5126a90e74ac739b00564a4c7ddcc36 +https://conda.anaconda.org/conda-forge/linux-64/aws-checksums-0.2.2-h4e1184b_4.conda#74e8c3e4df4ceae34aa2959df4b28101 https://conda.anaconda.org/conda-forge/linux-64/bzip2-1.0.8-h4bc722e_7.conda#62ee74e96c5ebb0af99386de58cf9553 https://conda.anaconda.org/conda-forge/linux-64/double-conversion-3.3.1-h5888daf_0.conda#bfd56492d8346d669010eccafe0ba058 https://conda.anaconda.org/conda-forge/linux-64/expat-2.7.0-h5888daf_0.conda#d6845ae4dea52a2f90178bf1829a21f8 @@ -77,14 +75,13 @@ https://conda.anaconda.org/conda-forge/linux-64/mysql-common-9.2.0-h266115a_0.co https://conda.anaconda.org/conda-forge/linux-64/ninja-1.12.1-hff21bea_1.conda#2322531904f27501ee19847b87ba7c64 https://conda.anaconda.org/conda-forge/linux-64/pixman-0.46.0-h29eaf8c_0.conda#d2f1c87d4416d1e7344cf92b1aaee1c4 https://conda.anaconda.org/conda-forge/linux-64/readline-8.2-h8c095d6_2.conda#283b96675859b20a825f8fa30f311446 -https://conda.anaconda.org/conda-forge/linux-64/s2n-1.5.14-h6c98b2b_0.conda#efab4ad81ba5731b2fefa0ab4359e884 +https://conda.anaconda.org/conda-forge/linux-64/s2n-1.5.11-h072c03f_0.conda#5e8060d52f676a40edef0006a75c718f https://conda.anaconda.org/conda-forge/linux-64/sleef-3.8-h1b44611_0.conda#aec4dba5d4c2924730088753f6fa164b https://conda.anaconda.org/conda-forge/linux-64/snappy-1.2.1-h8bd8927_1.conda#3b3e64af585eadfb52bb90b553db5edf https://conda.anaconda.org/conda-forge/linux-64/tk-8.6.13-noxft_h4845f30_101.conda#d453b98d9c83e71da0741bb0ff4d76bc https://conda.anaconda.org/conda-forge/linux-64/wayland-1.23.1-h3e06ad9_1.conda#a37843723437ba75f42c9270ffe800b1 -https://conda.anaconda.org/conda-forge/linux-64/zlib-1.3.1-hb9d3cd8_2.conda#c9f075ab2f33b3bbee9e62d4ad0a6cd8 https://conda.anaconda.org/conda-forge/linux-64/zstd-1.5.7-hb8e6e7a_2.conda#6432cb5d4ac0046c3ac0a8a0f95842f9 -https://conda.anaconda.org/conda-forge/linux-64/aws-c-io-0.17.0-h3dad3f2_6.conda#3a127d28266cdc0da93384d1f59fe8df +https://conda.anaconda.org/conda-forge/linux-64/aws-c-io-0.15.3-h173a860_6.conda#9a063178f1af0a898526cc24ba7be486 https://conda.anaconda.org/conda-forge/linux-64/brotli-bin-1.1.0-hb9d3cd8_2.conda#c63b5e52939e795ba8d26e35d767a843 https://conda.anaconda.org/conda-forge/linux-64/cudatoolkit-11.8.0-h4ba93d1_13.conda#eb43f5f1f16e2fad2eba22219c3e499b https://conda.anaconda.org/conda-forge/linux-64/glog-0.7.1-hbabe93e_0.conda#ff862eebdfeb2fd048ae9dc92510baca @@ -98,7 +95,7 @@ https://conda.anaconda.org/conda-forge/linux-64/libfreetype6-2.13.3-h48d6fc4_1.c https://conda.anaconda.org/conda-forge/linux-64/libgfortran-ng-14.2.0-h69a702a_2.conda#4056c857af1a99ee50589a941059ec55 https://conda.anaconda.org/conda-forge/linux-64/libnghttp2-1.64.0-h161d5f1_0.conda#19e57602824042dfd0446292ef90488b https://conda.anaconda.org/conda-forge/linux-64/libopenblas-0.3.29-pthreads_h94d23a6_0.conda#0a4d0252248ef9a0f88f2ba8b8a08e12 -https://conda.anaconda.org/conda-forge/linux-64/libprotobuf-5.28.3-h6128344_1.conda#d8703f1ffe5a06356f06467f1d0b9464 +https://conda.anaconda.org/conda-forge/linux-64/libprotobuf-5.28.2-h5b01275_0.conda#ab0bff36363bec94720275a681af8b83 https://conda.anaconda.org/conda-forge/linux-64/libre2-11-2024.07.02-hbbce691_2.conda#b2fede24428726dd867611664fb372e8 https://conda.anaconda.org/conda-forge/linux-64/libthrift-0.21.0-h0e7cc3e_0.conda#dcb95c0a98ba9ff737f7ae482aef7833 https://conda.anaconda.org/conda-forge/linux-64/libtiff-4.7.0-hd9ff511_4.conda#6c1028898cf3a2032d9af46689e1b81a @@ -113,8 +110,8 @@ https://conda.anaconda.org/conda-forge/linux-64/xcb-util-renderutil-0.3.10-hb711 https://conda.anaconda.org/conda-forge/linux-64/xcb-util-wm-0.4.2-hb711507_0.conda#608e0ef8256b81d04456e8d211eee3e8 https://conda.anaconda.org/conda-forge/linux-64/xorg-libsm-1.2.6-he73a12e_0.conda#1c74ff8c35dcadf952a16f752ca5aa49 https://conda.anaconda.org/conda-forge/linux-64/xorg-libx11-1.8.12-h4f16b4b_0.conda#db038ce880f100acc74dba10302b5630 -https://conda.anaconda.org/conda-forge/linux-64/aws-c-event-stream-0.5.4-h04a3f94_2.conda#81096a80f03fc2f0fb2a230f5d028643 -https://conda.anaconda.org/conda-forge/linux-64/aws-c-http-0.9.4-hb9b18c6_4.conda#773c99d0dbe2b3704af165f97ff399e5 +https://conda.anaconda.org/conda-forge/linux-64/aws-c-event-stream-0.5.0-h7959bf6_11.conda#9b3fb60fe57925a92f399bc3fc42eccf +https://conda.anaconda.org/conda-forge/linux-64/aws-c-http-0.9.2-hefd7a92_4.conda#5ce4df662d32d3123ea8da15571b6f51 https://conda.anaconda.org/conda-forge/linux-64/brotli-1.1.0-hb9d3cd8_2.conda#98514fe74548d768907ce7a13f680e8f https://conda.anaconda.org/conda-forge/noarch/colorama-0.4.6-pyhd8ed1ab_1.conda#962b9857ee8e7018c22f2776ffa0b2d7 https://conda.anaconda.org/conda-forge/noarch/cpython-3.13.3-py313hd8ed1ab_101.conda#904a822cbd380adafb9070debf8579a8 @@ -146,7 +143,7 @@ https://conda.anaconda.org/conda-forge/noarch/munkres-1.1.4-pyh9f0ad1d_0.tar.bz2 https://conda.anaconda.org/conda-forge/noarch/networkx-3.4.2-pyh267e887_2.conda#fd40bf7f7f4bc4b647dc8512053d9873 https://conda.anaconda.org/conda-forge/linux-64/openblas-0.3.29-pthreads_h6ec200e_0.conda#7e4d48870b3258bea920d51b7f495a81 https://conda.anaconda.org/conda-forge/linux-64/openjpeg-2.5.3-h5fbd93e_0.conda#9e5816bc95d285c115a3ebc2f8563564 -https://conda.anaconda.org/conda-forge/linux-64/orc-2.1.1-h2271f48_0.conda#67075ef2cb33079efee3abfe58127a3b +https://conda.anaconda.org/conda-forge/linux-64/orc-2.0.3-h97ab989_1.conda#2f46eae652623114e112df13fae311cf https://conda.anaconda.org/conda-forge/noarch/packaging-25.0-pyh29332c3_1.conda#58335b26c38bf4a20f399384c33cbcf9 https://conda.anaconda.org/conda-forge/noarch/pip-25.1.1-pyh145f28c_0.conda#01384ff1639c6330a0924791413b8714 https://conda.anaconda.org/conda-forge/noarch/pluggy-1.5.0-pyhd8ed1ab_1.conda#e9dcbce5f45f9ee500e728ae58b605b6 @@ -166,8 +163,8 @@ https://conda.anaconda.org/conda-forge/linux-64/xkeyboard-config-2.44-hb9d3cd8_0 https://conda.anaconda.org/conda-forge/linux-64/xorg-libxext-1.3.6-hb9d3cd8_0.conda#febbab7d15033c913d53c7a2c102309d https://conda.anaconda.org/conda-forge/linux-64/xorg-libxfixes-6.0.1-hb9d3cd8_0.conda#4bdb303603e9821baf5fe5fdff1dc8f8 https://conda.anaconda.org/conda-forge/linux-64/xorg-libxrender-0.9.12-hb9d3cd8_0.conda#96d57aba173e878a2089d5638016dc5e -https://conda.anaconda.org/conda-forge/linux-64/aws-c-auth-0.8.6-hd08a7f5_4.conda#f5a770ac1fd2cb34b21327fc513013a7 -https://conda.anaconda.org/conda-forge/linux-64/aws-c-mqtt-0.12.2-h108da3e_2.conda#90e07c8bac8da6378ee1882ef0a9374a +https://conda.anaconda.org/conda-forge/linux-64/aws-c-auth-0.8.0-hb921021_15.conda#c79d50f64cffa5ad51ecc1a81057962f +https://conda.anaconda.org/conda-forge/linux-64/aws-c-mqtt-0.11.0-h11f4f37_12.conda#96c3e0221fa2da97619ee82faa341a73 https://conda.anaconda.org/conda-forge/linux-64/azure-core-cpp-1.14.0-h5cfcd09_0.conda#0a8838771cc2e985cd295e01ae83baf1 https://conda.anaconda.org/conda-forge/linux-64/ccache-4.11.3-h80c52d3_0.conda#eb517c6a2b960c3ccb6f1db1005f063a https://conda.anaconda.org/conda-forge/linux-64/coverage-7.8.0-py313h8060acc_0.conda#375064d30e709bf7c1d4580e70aaea61 @@ -178,15 +175,14 @@ https://conda.anaconda.org/conda-forge/noarch/jinja2-3.1.6-pyhd8ed1ab_0.conda#44 https://conda.anaconda.org/conda-forge/noarch/joblib-1.5.0-pyhd8ed1ab_0.conda#3d7257f0a61c9aa4ffa3e324a887416b https://conda.anaconda.org/conda-forge/linux-64/libcblas-3.9.0-31_he106b2a_openblas.conda#abb32c727da370c481a1c206f5159ce9 https://conda.anaconda.org/conda-forge/linux-64/libgl-1.7.0-ha4b6fd6_2.conda#928b8be80851f5d8ffb016f9c81dae7a -https://conda.anaconda.org/conda-forge/linux-64/libgrpc-1.67.1-h25350d4_2.conda#bfcedaf5f9b003029cc6abe9431f66bf +https://conda.anaconda.org/conda-forge/linux-64/libgrpc-1.67.1-hc2c308b_0.conda#4606a4647bfe857e3cfe21ca12ac3afb https://conda.anaconda.org/conda-forge/linux-64/libhwloc-2.11.2-default_h0d58e46_1001.conda#804ca9e91bcaea0824a341d55b1684f2 https://conda.anaconda.org/conda-forge/linux-64/liblapack-3.9.0-31_h7ac8fdf_openblas.conda#452b98eafe050ecff932f0ec832dd03f https://conda.anaconda.org/conda-forge/linux-64/libllvm20-20.1.4-he9d0ab4_0.conda#96c33bbd084ef2b2463503fb7f1482ae -https://conda.anaconda.org/conda-forge/linux-64/libxkbcommon-1.9.1-h65c71a3_0.conda#6e45090fe0eec179ecc8041a3a3fc9f8 +https://conda.anaconda.org/conda-forge/linux-64/libxkbcommon-1.9.2-h65c71a3_0.conda#d045b1d878031eb497cab44e6392b1df https://conda.anaconda.org/conda-forge/linux-64/libxslt-1.1.39-h76b75d6_0.conda#e71f31f8cfb0a91439f2086fc8aa0461 https://conda.anaconda.org/conda-forge/linux-64/mpc-1.3.1-h24ddda3_1.conda#aa14b9a5196a6d8dd364164b7ce56acf https://conda.anaconda.org/conda-forge/linux-64/openldap-2.6.9-he970967_0.conda#ca2de8bbdc871bce41dbf59e51324165 -https://conda.anaconda.org/conda-forge/linux-64/prometheus-cpp-1.3.0-ha5d0236_0.conda#a83f6a2fdc079e643237887a37460668 https://conda.anaconda.org/conda-forge/noarch/pyproject-metadata-0.9.1-pyhd8ed1ab_0.conda#22ae7c6ea81e0c8661ef32168dda929b https://conda.anaconda.org/conda-forge/noarch/pytest-8.3.5-pyhd8ed1ab_0.conda#c3c9316209dec74a705a36797970c6be https://conda.anaconda.org/conda-forge/noarch/python-dateutil-2.9.0.post0-pyhff2d567_1.conda#5ba79d7c71f03c678c8ead841f347d6e @@ -199,19 +195,18 @@ https://conda.anaconda.org/conda-forge/linux-64/xorg-libxi-1.8.2-hb9d3cd8_0.cond https://conda.anaconda.org/conda-forge/linux-64/xorg-libxrandr-1.5.4-hb9d3cd8_0.conda#2de7f99d6581a4a7adbff607b5c278ca https://conda.anaconda.org/conda-forge/linux-64/xorg-libxxf86vm-1.1.6-hb9d3cd8_0.conda#5efa5fa6243a622445fdfd72aee15efa https://conda.anaconda.org/conda-forge/noarch/_python_abi3_support-1.0-hd8ed1ab_2.conda#aaa2a381ccc56eac91d63b6c1240312f -https://conda.anaconda.org/conda-forge/linux-64/aws-c-s3-0.7.13-h822ba82_2.conda#9cf2c3c13468f2209ee814be2c88655f +https://conda.anaconda.org/conda-forge/linux-64/aws-c-s3-0.7.7-hf454442_0.conda#947c82025693bebd557f782bb5d6b469 https://conda.anaconda.org/conda-forge/linux-64/azure-identity-cpp-1.10.0-h113e628_0.conda#73f73f60854f325a55f1d31459f2ab73 https://conda.anaconda.org/conda-forge/linux-64/azure-storage-common-cpp-12.8.0-h736e048_1.conda#13de36be8de3ae3f05ba127631599213 https://conda.anaconda.org/conda-forge/linux-64/fontconfig-2.15.0-h7e30c49_1.conda#8f5b0b297b59e1ac160ad4beec99dbee https://conda.anaconda.org/conda-forge/linux-64/gmpy2-2.2.1-py313h11186cd_0.conda#54d020e0eaacf1e99bfb2410b9aa2e5e https://conda.anaconda.org/conda-forge/linux-64/libclang-cpp20.1-20.1.4-default_h1df26ce_0.conda#96f8d5b2e94c9ba4fef19f1adf068a15 https://conda.anaconda.org/conda-forge/linux-64/libclang13-20.1.4-default_he06ed0a_0.conda#2d933632c8004be47deb2be61bf013be -https://conda.anaconda.org/conda-forge/linux-64/libgoogle-cloud-2.36.0-h2b5623c_0.conda#c96ca58ad3352a964bfcb85de6cd1496 +https://conda.anaconda.org/conda-forge/linux-64/libgoogle-cloud-2.32.0-h804f50b_0.conda#3d96df4d6b1c88455e05b94ce8a14a53 https://conda.anaconda.org/conda-forge/linux-64/liblapacke-3.9.0-31_he2f377e_openblas.conda#7e5fff7d0db69be3a266f7e79a3bb0e2 -https://conda.anaconda.org/conda-forge/linux-64/libmagma-2.9.0-h45b15fe_0.conda#703a1ab01e36111d8bb40bc7517e900b -https://conda.anaconda.org/conda-forge/linux-64/libopentelemetry-cpp-1.18.0-hfcad708_1.conda#1f5a5d66e77a39dc5bd639ec953705cf +https://conda.anaconda.org/conda-forge/linux-64/libmagma-2.8.0-h9ddd185_2.conda#8de40c4f75d36bb00a5870f682457f1d https://conda.anaconda.org/conda-forge/linux-64/libpq-17.4-h27ae623_1.conda#37fba334855ef3b51549308e61ed7a3d -https://conda.anaconda.org/conda-forge/noarch/meson-python-0.17.1-pyh70fd9c4_1.conda#7a02679229c6c2092571b4c025055440 +https://conda.anaconda.org/conda-forge/noarch/meson-python-0.18.0-pyh70fd9c4_0.conda#576c04b9d9f8e45285fb4d9452c26133 https://conda.anaconda.org/conda-forge/linux-64/numpy-2.2.5-py313h17eae1a_0.conda#6ceeff9ed72e54e4a2f9a1c88f47bdde https://conda.anaconda.org/conda-forge/linux-64/pillow-11.1.0-py313h8db990d_0.conda#1e86810c6c3fb6d6aebdba26564eb2e8 https://conda.anaconda.org/conda-forge/noarch/pytest-cov-6.1.1-pyhd8ed1ab_0.conda#1e35d8f975bc0e984a19819aa91c440a @@ -219,36 +214,36 @@ https://conda.anaconda.org/conda-forge/noarch/pytest-xdist-3.6.1-pyhd8ed1ab_1.co https://conda.anaconda.org/conda-forge/linux-64/tbb-2021.13.0-hceb3a55_1.conda#ba7726b8df7b9d34ea80e82b097a4893 https://conda.anaconda.org/conda-forge/linux-64/xorg-libxtst-1.2.5-hb9d3cd8_3.conda#7bbe9a0cc0df0ac5f5a8ad6d6a11af2f https://conda.anaconda.org/conda-forge/noarch/array-api-strict-2.3.1-pyhd8ed1ab_0.conda#11107d0aeb8c590a34fee0894909816b -https://conda.anaconda.org/conda-forge/linux-64/aws-crt-cpp-0.31.0-h55f77e1_4.conda#0627af705ed70681f5bede31e72348e5 +https://conda.anaconda.org/conda-forge/linux-64/aws-crt-cpp-0.29.7-hd92328a_7.conda#02b95564257d5c3db9c06beccf711f95 https://conda.anaconda.org/conda-forge/linux-64/azure-storage-blobs-cpp-12.13.0-h3cf044e_1.conda#7eb66060455c7a47d9dcdbfa9f46579b https://conda.anaconda.org/conda-forge/linux-64/blas-devel-3.9.0-31_h1ea3ea9_openblas.conda#ba652ee0576396d4765e567f043c57f9 https://conda.anaconda.org/conda-forge/linux-64/cairo-1.18.4-h3394656_0.conda#09262e66b19567aff4f592fb53b28760 https://conda.anaconda.org/conda-forge/linux-64/contourpy-1.3.2-py313h33d0bda_0.conda#5dc81fffe102f63045225007a33d6199 https://conda.anaconda.org/conda-forge/linux-64/cupy-core-13.4.1-py313hc2a895b_0.conda#46dd595e816b278b178e3bef8a6acf71 -https://conda.anaconda.org/conda-forge/linux-64/libgoogle-cloud-storage-2.36.0-h0121fbd_0.conda#fc5efe1833a4d709953964037985bb72 -https://conda.anaconda.org/conda-forge/linux-64/libmagma_sparse-2.9.0-h45b15fe_0.conda#beac0a5bbe0af75db6b16d3d8fd24f7e +https://conda.anaconda.org/conda-forge/linux-64/libgoogle-cloud-storage-2.32.0-h0121fbd_0.conda#877a5ec0431a5af83bf0cd0522bfe661 +https://conda.anaconda.org/conda-forge/linux-64/libmagma_sparse-2.8.0-h9ddd185_0.conda#f4eb3cfeaf9d91e72d5b2b8706bf059f https://conda.anaconda.org/conda-forge/linux-64/mkl-2024.2.2-ha957f24_16.conda#1459379c79dda834673426504d52b319 https://conda.anaconda.org/conda-forge/linux-64/pandas-2.2.3-py313ha87cce1_3.conda#6248b529e537b1d4cb5ab3ef7f537795 https://conda.anaconda.org/conda-forge/linux-64/polars-1.27.1-py39h2a4a510_3.conda#fba08963eaa1f954480045d033d1221e https://conda.anaconda.org/conda-forge/linux-64/scipy-1.15.2-py313h86fcf2b_0.conda#ca68acd9febc86448eeed68d0c6c8643 https://conda.anaconda.org/conda-forge/noarch/sympy-1.14.0-pyh2585a3b_105.conda#8c09fac3785696e1c477156192d64b91 -https://conda.anaconda.org/conda-forge/linux-64/aws-sdk-cpp-1.11.510-h37a5c72_3.conda#beb8577571033140c6897d257acc7724 +https://conda.anaconda.org/conda-forge/linux-64/aws-sdk-cpp-1.11.458-hc430e4a_4.conda#aeefac461bea1f126653c1285cf5af08 https://conda.anaconda.org/conda-forge/linux-64/azure-storage-files-datalake-cpp-12.12.0-ha633028_1.conda#7c1980f89dd41b097549782121a73490 https://conda.anaconda.org/conda-forge/linux-64/blas-2.131-openblas.conda#38b2ec894c69bb4be0e66d2ef7fc60bf https://conda.anaconda.org/conda-forge/linux-64/cupy-13.4.1-py313h66a2ee2_0.conda#784d6bd149ef2b5d9c733ea3dd4d15ad https://conda.anaconda.org/conda-forge/linux-64/harfbuzz-11.1.0-h3beb420_0.conda#95e3bb97f9cdc251c0c68640e9c10ed3 -https://conda.anaconda.org/conda-forge/linux-64/libtorch-2.4.1-cuda118_mkl_hee7131c_306.conda#28b3b3da11973494ed0100aa50f47328 +https://conda.anaconda.org/conda-forge/linux-64/libtorch-2.5.1-cuda118_hb34f2e8_303.conda#da799bf557ff6376a1a58f40bddfb293 https://conda.anaconda.org/conda-forge/linux-64/matplotlib-base-3.10.1-py313h129903b_0.conda#4e23b3fabf434b418e0d9c6975a6453f https://conda.anaconda.org/conda-forge/linux-64/pyamg-5.2.1-py313hf0ab243_1.conda#4c769bf3858f424cb2ecf952175ec600 -https://conda.anaconda.org/conda-forge/linux-64/libarrow-19.0.1-hc7b3859_3_cpu.conda#9ed3ded6da29dec8417f2e1db68798f2 -https://conda.anaconda.org/conda-forge/linux-64/pytorch-2.4.1-cuda118_mkl_py313_h909c4c2_306.conda#de6e45613bbdb51127e9ff483c31bf41 +https://conda.anaconda.org/conda-forge/linux-64/libarrow-18.1.0-h44a453e_6_cpu.conda#2cf6d608d6e66506f69797d5c6944c35 +https://conda.anaconda.org/conda-forge/linux-64/pytorch-2.5.1-cuda118_py313h40cdc2d_303.conda#19ad990954a4ed89358d91d0a3e7016d https://conda.anaconda.org/conda-forge/linux-64/qt6-main-6.9.0-h6441bc3_1.conda#4029a8dcb1d97ea241dbe5abfda1fad6 -https://conda.anaconda.org/conda-forge/linux-64/libarrow-acero-19.0.1-hcb10f89_3_cpu.conda#8f8dc214d89e06933f1bc1dcd2310b9c -https://conda.anaconda.org/conda-forge/linux-64/libparquet-19.0.1-h081d1f1_3_cpu.conda#1d04307cdb1d8aeb5f55b047d5d403ea -https://conda.anaconda.org/conda-forge/linux-64/pyarrow-core-19.0.1-py313he5f92c8_0_cpu.conda#7d8649531c807b24295c8f9a0a396a78 +https://conda.anaconda.org/conda-forge/linux-64/libarrow-acero-18.1.0-hcb10f89_6_cpu.conda#143f9288b64759a6427563f058c62f2b +https://conda.anaconda.org/conda-forge/linux-64/libparquet-18.1.0-h081d1f1_6_cpu.conda#68788df49ce7480187eb6387f15b2b67 +https://conda.anaconda.org/conda-forge/linux-64/pyarrow-core-18.1.0-py313he5f92c8_0_cpu.conda#5380e12f4468e891911dbbd4248b521a https://conda.anaconda.org/conda-forge/linux-64/pyside6-6.9.0-py313h5f61773_0.conda#f51f25ec8fcbf777f8b186bb5deeed40 -https://conda.anaconda.org/conda-forge/linux-64/pytorch-gpu-2.4.1-cuda118_mkl_hf8a3b2d_306.conda#b1802a39f1ca7ebed5f8c35755bffec1 -https://conda.anaconda.org/conda-forge/linux-64/libarrow-dataset-19.0.1-hcb10f89_3_cpu.conda#a28f04b6e68a1c76de76783108ad729d +https://conda.anaconda.org/conda-forge/linux-64/pytorch-gpu-2.5.1-cuda126hf7c78f0_303.conda#afaf760e55725108ae78ed41198c49bb +https://conda.anaconda.org/conda-forge/linux-64/libarrow-dataset-18.1.0-hcb10f89_6_cpu.conda#20ca46a6bc714a6ab189d5b3f46e66d8 https://conda.anaconda.org/conda-forge/linux-64/matplotlib-3.10.1-py313h78bf25f_0.conda#d0c80dea550ca97fc0710b2ecef919ba -https://conda.anaconda.org/conda-forge/linux-64/libarrow-substrait-19.0.1-h08228c5_3_cpu.conda#a58e4763af8293deaac77b63bc7804d8 -https://conda.anaconda.org/conda-forge/linux-64/pyarrow-19.0.1-py313h78bf25f_0.conda#e8efe6998a383dd149787c83d3d6a92e +https://conda.anaconda.org/conda-forge/linux-64/libarrow-substrait-18.1.0-h3ee7192_6_cpu.conda#aa313b3168caf98d00b3753f5ba27650 +https://conda.anaconda.org/conda-forge/linux-64/pyarrow-18.1.0-py313h78bf25f_0.conda#a11d880ceedc33993c6f5c14a80ea9d3 diff --git a/build_tools/github/pymin_conda_forge_arm_linux-aarch64_conda.lock b/build_tools/github/pymin_conda_forge_arm_linux-aarch64_conda.lock index 5f7bedbbfeaa8..dc7b4ae5c066e 100644 --- a/build_tools/github/pymin_conda_forge_arm_linux-aarch64_conda.lock +++ b/build_tools/github/pymin_conda_forge_arm_linux-aarch64_conda.lock @@ -1,6 +1,6 @@ # Generated by conda-lock. # platform: linux-aarch64 -# input_hash: 9226800dfe446f7b9ed783525101a7cf60f0da339c6c1fc6db00ea557831de1d +# input_hash: f12646c755adbf5f02f95c5d07e868bf1570777923e737bc27273eb1a5e40cd7 @EXPLICIT https://conda.anaconda.org/conda-forge/noarch/font-ttf-dejavu-sans-mono-2.37-hab24e00_0.tar.bz2#0c96522c6bdaed4b1566d11387caaf45 https://conda.anaconda.org/conda-forge/noarch/font-ttf-inconsolata-3.000-h77eed37_0.tar.bz2#34893075a5c9e55cdafac56607368fc6 @@ -27,7 +27,7 @@ https://conda.anaconda.org/conda-forge/linux-aarch64/libgcc-ng-14.2.0-he9431aa_2 https://conda.anaconda.org/conda-forge/linux-aarch64/libgfortran5-14.2.0-hb6113d0_2.conda#cd754566661513808ef2408c4ab99a2f https://conda.anaconda.org/conda-forge/linux-aarch64/libiconv-1.18-hc99b53d_1.conda#81541d85a45fbf4d0a29346176f1f21c https://conda.anaconda.org/conda-forge/linux-aarch64/libjpeg-turbo-3.1.0-h86ecc28_0.conda#a689388210d502364b79e8b19e7fa2cb -https://conda.anaconda.org/conda-forge/linux-aarch64/liblzma-5.8.1-h86ecc28_0.conda#775d36ea4e469b0c049a6f2cd6253d82 +https://conda.anaconda.org/conda-forge/linux-aarch64/liblzma-5.8.1-h86ecc28_1.conda#8ced9a547a29f7a71b7f15a4443ad1de https://conda.anaconda.org/conda-forge/linux-aarch64/libstdcxx-14.2.0-h3f4de04_2.conda#eadee2cda99697e29411c1013c187b92 https://conda.anaconda.org/conda-forge/linux-aarch64/libwebp-base-1.5.0-h0886dbf_0.conda#95ef4a689b8cc1b7e18b53784d88f96b https://conda.anaconda.org/conda-forge/linux-aarch64/libzlib-1.3.1-h86ecc28_2.conda#08aad7cbe9f5a6b460d0976076b6ae64 @@ -126,7 +126,7 @@ https://conda.anaconda.org/conda-forge/linux-aarch64/libcblas-3.9.0-31_hab92f65_ https://conda.anaconda.org/conda-forge/linux-aarch64/libgl-1.7.0-hd24410f_2.conda#0d00176464ebb25af83d40736a2cd3bb https://conda.anaconda.org/conda-forge/linux-aarch64/liblapack-3.9.0-31_h411afd4_openblas.conda#41dbff5eb805a75c120a7b7a1c744dc2 https://conda.anaconda.org/conda-forge/linux-aarch64/libllvm20-20.1.4-h07bd352_0.conda#a83f31777ec098202198145883d86ffb -https://conda.anaconda.org/conda-forge/linux-aarch64/libxkbcommon-1.9.1-hbab7b08_0.conda#49a02083d4ab2cda74584a64defb4b9d +https://conda.anaconda.org/conda-forge/linux-aarch64/libxkbcommon-1.9.2-hbab7b08_0.conda#7b47a2ccfb81b4be6be320b365e1cf33 https://conda.anaconda.org/conda-forge/linux-aarch64/libxslt-1.1.39-h1cc9640_0.conda#13e1d3f9188e85c6d59a98651aced002 https://conda.anaconda.org/conda-forge/linux-aarch64/openldap-2.6.9-h30c48ee_0.conda#c07822a5de65ce9797b9afa257faa917 https://conda.anaconda.org/conda-forge/noarch/pip-25.1.1-pyh8b19718_0.conda#32d0781ace05105cc99af55d36cbec7c @@ -145,7 +145,7 @@ https://conda.anaconda.org/conda-forge/linux-aarch64/libclang-cpp20.1-20.1.4-def https://conda.anaconda.org/conda-forge/linux-aarch64/libclang13-20.1.4-default_h9e36cb9_0.conda#6d587caa650694fa5f6d04fda1bcfee2 https://conda.anaconda.org/conda-forge/linux-aarch64/liblapacke-3.9.0-31_hc659ca5_openblas.conda#256bb281d78e5b8927ff13a1cde9f6f5 https://conda.anaconda.org/conda-forge/linux-aarch64/libpq-17.4-hf590da8_1.conda#10fdc78be541c9017e2144f86d092aa2 -https://conda.anaconda.org/conda-forge/noarch/meson-python-0.17.1-pyh70fd9c4_1.conda#7a02679229c6c2092571b4c025055440 +https://conda.anaconda.org/conda-forge/noarch/meson-python-0.18.0-pyh70fd9c4_0.conda#576c04b9d9f8e45285fb4d9452c26133 https://conda.anaconda.org/conda-forge/linux-aarch64/numpy-2.2.5-py310h6e5608f_0.conda#5c521c566cbcf058769c613dee3a18d6 https://conda.anaconda.org/conda-forge/linux-aarch64/pillow-11.1.0-py310h34c99de_0.conda#c4fa80647a708505d65573c2353bc216 https://conda.anaconda.org/conda-forge/noarch/pytest-xdist-3.6.1-pyhd8ed1ab_1.conda#59aad4fb37cabc0bacc73cf344612ddd diff --git a/pyproject.toml b/pyproject.toml index 9a1c7c96241c7..a902a7b21952d 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -91,7 +91,7 @@ tests = [ "numpydoc>=1.2.0", "pooch>=1.6.0", ] -maintenance = ["conda-lock==2.5.7"] +maintenance = ["conda-lock==3.0.1"] [build-system] build-backend = "mesonpy" diff --git a/sklearn/_min_dependencies.py b/sklearn/_min_dependencies.py index eb69f66db1bcf..8d39075630437 100644 --- a/sklearn/_min_dependencies.py +++ b/sklearn/_min_dependencies.py @@ -53,7 +53,7 @@ "towncrier": ("24.8.0", "docs"), # XXX: Pin conda-lock to the latest released version (needs manual update # from time to time) - "conda-lock": ("2.5.7", "maintenance"), + "conda-lock": ("3.0.1", "maintenance"), } From 27f2af30fa343fbf526ff3b9d39f3f5df798842c Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Lo=C3=AFc=20Est=C3=A8ve?= Date: Fri, 9 May 2025 10:10:27 +0200 Subject: [PATCH 141/182] MNT Use PYTHON_GIL=0 only at test time to avoid interference with conda (#31341) --- azure-pipelines.yml | 1 - build_tools/azure/test_script.sh | 8 ++++++++ 2 files changed, 8 insertions(+), 1 deletion(-) diff --git a/azure-pipelines.yml b/azure-pipelines.yml index 804214f97808a..a36daf39b50db 100644 --- a/azure-pipelines.yml +++ b/azure-pipelines.yml @@ -84,7 +84,6 @@ jobs: ) matrix: pylatest_free_threaded: - PYTHON_GIL: '0' DISTRIB: 'conda-free-threaded' LOCK_FILE: './build_tools/azure/pylatest_free_threaded_linux-64_conda.lock' COVERAGE: 'false' diff --git a/build_tools/azure/test_script.sh b/build_tools/azure/test_script.sh index d8152bd7c3ae2..eb4414283be2b 100755 --- a/build_tools/azure/test_script.sh +++ b/build_tools/azure/test_script.sh @@ -75,6 +75,14 @@ else echo "Could not inspect CPU architecture." fi +if [[ "$DISTRIB" == "conda-free-threaded" ]]; then + # Make sure that GIL is disabled even when importing extensions that have + # not declared free-threaded compatibility. This can be removed when numpy, + # scipy and scikit-learn extensions all have declared free-threaded + # compatibility. + export PYTHON_GIL=0 +fi + TEST_CMD="$TEST_CMD --pyargs sklearn" set -x From ffcd361421f68ca34bc3f91dbd21a44d245dfbe9 Mon Sep 17 00:00:00 2001 From: Omar Salman Date: Fri, 9 May 2025 14:09:06 +0500 Subject: [PATCH 142/182] FEA Add array api support for jaccard score (#31204) --- doc/modules/array_api.rst | 1 + .../upcoming_changes/array-api/31204.feature.rst | 2 ++ sklearn/metrics/_classification.py | 9 +++++---- sklearn/metrics/tests/test_common.py | 5 +++++ 4 files changed, 13 insertions(+), 4 deletions(-) create mode 100644 doc/whats_new/upcoming_changes/array-api/31204.feature.rst diff --git a/doc/modules/array_api.rst b/doc/modules/array_api.rst index e7261ea35cc7c..d24ce3573e7b6 100644 --- a/doc/modules/array_api.rst +++ b/doc/modules/array_api.rst @@ -139,6 +139,7 @@ Metrics - :func:`sklearn.metrics.f1_score` - :func:`sklearn.metrics.fbeta_score` - :func:`sklearn.metrics.hamming_loss` +- :func:`sklearn.metrics.jaccard_score` - :func:`sklearn.metrics.max_error` - :func:`sklearn.metrics.mean_absolute_error` - :func:`sklearn.metrics.mean_absolute_percentage_error` diff --git a/doc/whats_new/upcoming_changes/array-api/31204.feature.rst b/doc/whats_new/upcoming_changes/array-api/31204.feature.rst new file mode 100644 index 0000000000000..e1e2bc61738ca --- /dev/null +++ b/doc/whats_new/upcoming_changes/array-api/31204.feature.rst @@ -0,0 +1,2 @@ +- :func:`sklearn.metrics.jaccard_score` now supports Array API compatible inputs. + By :user:`Omar Salman ` diff --git a/sklearn/metrics/_classification.py b/sklearn/metrics/_classification.py index 65cbfbad6f01f..2e31320ddb1f4 100644 --- a/sklearn/metrics/_classification.py +++ b/sklearn/metrics/_classification.py @@ -1071,9 +1071,10 @@ def jaccard_score( numerator = MCM[:, 1, 1] denominator = MCM[:, 1, 1] + MCM[:, 0, 1] + MCM[:, 1, 0] + xp, _, device_ = get_namespace_and_device(y_true, y_pred) if average == "micro": - numerator = np.array([numerator.sum()]) - denominator = np.array([denominator.sum()]) + numerator = xp.asarray(xp.sum(numerator, keepdims=True), device=device_) + denominator = xp.asarray(xp.sum(denominator, keepdims=True), device=device_) jaccard = _prf_divide( numerator, @@ -1088,14 +1089,14 @@ def jaccard_score( return jaccard if average == "weighted": weights = MCM[:, 1, 0] + MCM[:, 1, 1] - if not np.any(weights): + if not xp.any(weights): # numerator is 0, and warning should have already been issued weights = None elif average == "samples" and sample_weight is not None: weights = sample_weight else: weights = None - return float(np.average(jaccard, weights=weights)) + return float(_average(jaccard, weights=weights, xp=xp)) @validate_params( diff --git a/sklearn/metrics/tests/test_common.py b/sklearn/metrics/tests/test_common.py index 1000c988abca8..00e47f04b5b57 100644 --- a/sklearn/metrics/tests/test_common.py +++ b/sklearn/metrics/tests/test_common.py @@ -2147,6 +2147,11 @@ def check_array_api_metric_pairwise(metric, array_namespace, device, dtype_name) check_array_api_multiclass_classification_metric, check_array_api_multilabel_classification_metric, ], + jaccard_score: [ + check_array_api_binary_classification_metric, + check_array_api_multiclass_classification_metric, + check_array_api_multilabel_classification_metric, + ], multilabel_confusion_matrix: [ check_array_api_binary_classification_metric, check_array_api_multiclass_classification_metric, From e70ae56ed75e3f51ff87d2538bdcc1c2525d13fd Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?J=C3=A9r=C3=A9mie=20du=20Boisberranger?= Date: Fri, 9 May 2025 17:29:46 +0200 Subject: [PATCH 143/182] MNT Bump version to 1.8.dev0 on main (#31336) --- doc/whats_new.rst | 1 + doc/whats_new/v1.8.rst | 34 ++++++++++++++++++++++++++++++++++ pyproject.toml | 2 +- sklearn/__init__.py | 2 +- 4 files changed, 37 insertions(+), 2 deletions(-) create mode 100644 doc/whats_new/v1.8.rst diff --git a/doc/whats_new.rst b/doc/whats_new.rst index 000b1db81f38a..1e9d0316691e1 100644 --- a/doc/whats_new.rst +++ b/doc/whats_new.rst @@ -15,6 +15,7 @@ Changelogs and release notes for all scikit-learn releases are linked in this pa .. toctree:: :maxdepth: 2 + whats_new/v1.8.rst whats_new/v1.7.rst whats_new/v1.6.rst whats_new/v1.5.rst diff --git a/doc/whats_new/v1.8.rst b/doc/whats_new/v1.8.rst new file mode 100644 index 0000000000000..603373824d395 --- /dev/null +++ b/doc/whats_new/v1.8.rst @@ -0,0 +1,34 @@ +.. include:: _contributors.rst + +.. currentmodule:: sklearn + +.. _release_notes_1_8: + +=========== +Version 1.8 +=========== + +.. + -- UNCOMMENT WHEN 1.8.0 IS RELEASED -- + For a short description of the main highlights of the release, please refer to + :ref:`sphx_glr_auto_examples_release_highlights_plot_release_highlights_1_7_0.py`. + + +.. + DELETE WHEN 1.8.0 IS RELEASED + Since October 2024, DO NOT add your changelog entry in this file. +.. + Instead, create a file named `..rst` in the relevant sub-folder in + `doc/whats_new/upcoming_changes/`. For full details, see: + https://github.com/scikit-learn/scikit-learn/blob/main/doc/whats_new/upcoming_changes/README.md + +.. include:: changelog_legend.inc + +.. towncrier release notes start + +.. rubric:: Code and documentation contributors + +Thanks to everyone who has contributed to the maintenance and improvement of +the project since version 1.7, including: + +TODO: update at the time of the release. diff --git a/pyproject.toml b/pyproject.toml index a902a7b21952d..b793bd43dd5df 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -281,7 +281,7 @@ ignore-words = "build_tools/codespell_ignore_words.txt" [tool.towncrier] package = "sklearn" - filename = "doc/whats_new/v1.7.rst" + filename = "doc/whats_new/v1.8.rst" single_file = true directory = "doc/whats_new/upcoming_changes" issue_format = ":pr:`{issue}`" diff --git a/sklearn/__init__.py b/sklearn/__init__.py index 8ea5aacf84cf3..597cc364a105b 100644 --- a/sklearn/__init__.py +++ b/sklearn/__init__.py @@ -42,7 +42,7 @@ # Dev branch marker is: 'X.Y.dev' or 'X.Y.devN' where N is an integer. # 'X.Y.dev0' is the canonical version of 'X.Y.dev' # -__version__ = "1.7.dev0" +__version__ = "1.8.dev0" # On OSX, we can get a runtime error due to multiple OpenMP libraries loaded From fec2fe6d9081d205a3b964d1e2cef164f5abdc85 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Lo=C3=AFc=20Est=C3=A8ve?= Date: Fri, 9 May 2025 21:40:11 +0200 Subject: [PATCH 144/182] BLD Add missing cython generator for a few extensions (#31346) --- sklearn/cluster/_hdbscan/meson.build | 2 +- sklearn/meson.build | 2 +- sklearn/neighbors/meson.build | 2 +- sklearn/utils/meson.build | 2 +- 4 files changed, 4 insertions(+), 4 deletions(-) diff --git a/sklearn/cluster/_hdbscan/meson.build b/sklearn/cluster/_hdbscan/meson.build index f2e3ac91b1eb2..8d880b39a4db5 100644 --- a/sklearn/cluster/_hdbscan/meson.build +++ b/sklearn/cluster/_hdbscan/meson.build @@ -1,7 +1,7 @@ cluster_hdbscan_extension_metadata = { '_linkage': {'sources': [cython_gen.process('_linkage.pyx'), metrics_cython_tree]}, '_reachability': {'sources': [cython_gen.process('_reachability.pyx')]}, - '_tree': {'sources': ['_tree.pyx']} + '_tree': {'sources': [cython_gen.process('_tree.pyx')]} } foreach ext_name, ext_dict : cluster_hdbscan_extension_metadata diff --git a/sklearn/meson.build b/sklearn/meson.build index 93de0c18d99f9..30feb944029d3 100644 --- a/sklearn/meson.build +++ b/sklearn/meson.build @@ -219,7 +219,7 @@ extensions = ['_isotonic'] py.extension_module( '_isotonic', - '_isotonic.pyx', + cython_gen.process('_isotonic.pyx'), cython_args: cython_args, install: true, subdir: 'sklearn', diff --git a/sklearn/neighbors/meson.build b/sklearn/neighbors/meson.build index df2aab466500c..7993421896218 100644 --- a/sklearn/neighbors/meson.build +++ b/sklearn/neighbors/meson.build @@ -39,7 +39,7 @@ neighbors_extension_metadata = { '_partition_nodes': {'sources': [cython_gen_cpp.process('_partition_nodes.pyx')], 'dependencies': [np_dep]}, - '_quad_tree': {'sources': ['_quad_tree.pyx'], 'dependencies': [np_dep]}, + '_quad_tree': {'sources': [cython_gen.process('_quad_tree.pyx')], 'dependencies': [np_dep]}, } foreach ext_name, ext_dict : neighbors_extension_metadata diff --git a/sklearn/utils/meson.build b/sklearn/utils/meson.build index 9ac2454172c9a..ae490e987a4ff 100644 --- a/sklearn/utils/meson.build +++ b/sklearn/utils/meson.build @@ -20,7 +20,7 @@ utils_extension_metadata = { '_cython_blas': {'sources': [cython_gen.process('_cython_blas.pyx')]}, 'arrayfuncs': {'sources': [cython_gen.process('arrayfuncs.pyx')]}, 'murmurhash': { - 'sources': ['murmurhash.pyx', 'src' / 'MurmurHash3.cpp'], + 'sources': [cython_gen.process('murmurhash.pyx'), 'src' / 'MurmurHash3.cpp'], }, '_fast_dict': {'sources': [cython_gen_cpp.process('_fast_dict.pyx')]}, From aa21650bcfbebeb4dd346307931dd1ed14a6f434 Mon Sep 17 00:00:00 2001 From: Lucy Liu Date: Sat, 10 May 2025 05:42:14 +1000 Subject: [PATCH 145/182] DOC Remove old section `_fit_and_score_over_thresholds` (#31339) --- sklearn/model_selection/_classification_threshold.py | 9 ++------- 1 file changed, 2 insertions(+), 7 deletions(-) diff --git a/sklearn/model_selection/_classification_threshold.py b/sklearn/model_selection/_classification_threshold.py index a5a898abdd1da..c68ed38b8819d 100644 --- a/sklearn/model_selection/_classification_threshold.py +++ b/sklearn/model_selection/_classification_threshold.py @@ -444,13 +444,8 @@ def _fit_and_score_over_thresholds( curve_scorer : scorer instance The scorer taking `classifier` and the validation set as input and outputting decision thresholds and scores as a curve. Note that this is different from - the usual scorer that output a single score value: - - * when `score_method` is one of the four constraint metrics, the curve scorer - will output a curve of two scores parametrized by the decision threshold, e.g. - TPR/TNR or precision/recall curves for each threshold; - * otherwise, the curve scorer will output a single score value for each - threshold. + the usual scorer that outputs a single score value as `curve_scorer` + outputs a single score value for each threshold. score_params : dict Parameters to pass to the `score` method of the underlying scorer. From acb3833375b54347fa4a2430d5e9d6b7423e714c Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Lo=C3=AFc=20Est=C3=A8ve?= Date: Mon, 12 May 2025 05:10:19 +0200 Subject: [PATCH 146/182] MNT Fix doctest dict value (#31340) --- sklearn/model_selection/_search.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/sklearn/model_selection/_search.py b/sklearn/model_selection/_search.py index 61dbd7c1b1d80..aeeffc1b83148 100644 --- a/sklearn/model_selection/_search.py +++ b/sklearn/model_selection/_search.py @@ -1936,7 +1936,7 @@ class RandomizedSearchCV(BaseSearchCV): >>> clf = RandomizedSearchCV(logistic, distributions, random_state=0) >>> search = clf.fit(iris.data, iris.target) >>> search.best_params_ - {'C': np.float64(2.2), 'penalty': 'l1'} + {'C': np.float64(2.195), 'penalty': 'l1'} """ _parameter_constraints: dict = { From 5b031bfce5fbd38697e8634175aa15ea4927432e Mon Sep 17 00:00:00 2001 From: scikit-learn-bot Date: Mon, 12 May 2025 10:33:02 +0200 Subject: [PATCH 147/182] :lock: :robot: CI Update lock files for free-threaded CI build(s) :lock: :robot: (#31353) Co-authored-by: Lock file bot --- ...pylatest_free_threaded_linux-64_conda.lock | 23 ++++++++++--------- 1 file changed, 12 insertions(+), 11 deletions(-) diff --git a/build_tools/azure/pylatest_free_threaded_linux-64_conda.lock b/build_tools/azure/pylatest_free_threaded_linux-64_conda.lock index 84ca12988c3e1..0b3a9dc35c383 100644 --- a/build_tools/azure/pylatest_free_threaded_linux-64_conda.lock +++ b/build_tools/azure/pylatest_free_threaded_linux-64_conda.lock @@ -7,34 +7,33 @@ https://conda.anaconda.org/conda-forge/noarch/python_abi-3.13-7_cp313t.conda#df8 https://conda.anaconda.org/conda-forge/noarch/tzdata-2025b-h78e105d_0.conda#4222072737ccff51314b5ece9c7d6f5a https://conda.anaconda.org/conda-forge/noarch/ca-certificates-2025.4.26-hbd8a1cb_0.conda#95db94f75ba080a22eb623590993167b https://conda.anaconda.org/conda-forge/linux-64/ld_impl_linux-64-2.43-h712a8e2_4.conda#01f8d123c96816249efd255a31ad7712 -https://conda.anaconda.org/conda-forge/linux-64/libgomp-14.2.0-h767d61c_2.conda#06d02030237f4d5b3d9a7e7d348fe3c6 +https://conda.anaconda.org/conda-forge/linux-64/libgomp-15.1.0-h767d61c_2.conda#fbe7d535ff9d3a168c148e07358cd5b1 https://conda.anaconda.org/conda-forge/linux-64/_openmp_mutex-4.5-2_gnu.tar.bz2#73aaf86a425cc6e73fcf236a5a46396d -https://conda.anaconda.org/conda-forge/linux-64/libgcc-14.2.0-h767d61c_2.conda#ef504d1acbd74b7cc6849ef8af47dd03 +https://conda.anaconda.org/conda-forge/linux-64/libgcc-15.1.0-h767d61c_2.conda#ea8ac52380885ed41c1baa8f1d6d2b93 https://conda.anaconda.org/conda-forge/linux-64/libexpat-2.7.0-h5888daf_0.conda#db0bfbe7dd197b68ad5f30333bae6ce0 https://conda.anaconda.org/conda-forge/linux-64/libffi-3.4.6-h2dba641_1.conda#ede4673863426c0883c0063d853bbd85 -https://conda.anaconda.org/conda-forge/linux-64/libgcc-ng-14.2.0-h69a702a_2.conda#a2222a6ada71fb478682efe483ce0f92 -https://conda.anaconda.org/conda-forge/linux-64/libgfortran5-14.2.0-hf1ad2bd_2.conda#556a4fdfac7287d349b8f09aba899693 +https://conda.anaconda.org/conda-forge/linux-64/libgcc-ng-15.1.0-h69a702a_2.conda#ddca86c7040dd0e73b2b69bd7833d225 +https://conda.anaconda.org/conda-forge/linux-64/libgfortran5-15.1.0-hcea5267_2.conda#01de444988ed960031dbe84cf4f9b1fc https://conda.anaconda.org/conda-forge/linux-64/liblzma-5.8.1-hb9d3cd8_1.conda#a76fd702c93cd2dfd89eff30a5fd45a8 -https://conda.anaconda.org/conda-forge/linux-64/libstdcxx-14.2.0-h8f9b012_2.conda#a78c856b6dc6bf4ea8daeb9beaaa3fb0 +https://conda.anaconda.org/conda-forge/linux-64/libstdcxx-15.1.0-h8f9b012_2.conda#1cb1c67961f6dd257eae9e9691b341aa https://conda.anaconda.org/conda-forge/linux-64/libzlib-1.3.1-hb9d3cd8_2.conda#edb0dca6bc32e4f4789199455a1dbeb8 https://conda.anaconda.org/conda-forge/linux-64/ncurses-6.5-h2d0b736_3.conda#47e340acb35de30501a76c7c799c41d7 https://conda.anaconda.org/conda-forge/linux-64/openssl-3.5.0-h7b32b05_1.conda#de356753cfdbffcde5bb1e86e3aa6cd0 https://conda.anaconda.org/conda-forge/linux-64/bzip2-1.0.8-h4bc722e_7.conda#62ee74e96c5ebb0af99386de58cf9553 -https://conda.anaconda.org/conda-forge/linux-64/libgfortran-14.2.0-h69a702a_2.conda#fb54c4ea68b460c278d26eea89cfbcc3 +https://conda.anaconda.org/conda-forge/linux-64/libgfortran-15.1.0-h69a702a_2.conda#f92e6e0a3c0c0c85561ef61aa59d555d https://conda.anaconda.org/conda-forge/linux-64/libmpdec-4.0.0-h4bc722e_0.conda#aeb98fdeb2e8f25d43ef71fbacbeec80 -https://conda.anaconda.org/conda-forge/linux-64/libsqlite-3.49.1-hee588c1_2.conda#962d6ac93c30b1dfc54c9cccafd1003e -https://conda.anaconda.org/conda-forge/linux-64/libstdcxx-ng-14.2.0-h4852527_2.conda#c75da67f045c2627f59e6fcb5f4e3a9b +https://conda.anaconda.org/conda-forge/linux-64/libsqlite-3.49.2-hee588c1_0.conda#93048463501053a00739215ea3f36324 +https://conda.anaconda.org/conda-forge/linux-64/libstdcxx-ng-15.1.0-h4852527_2.conda#9d2072af184b5caa29492bf2344597bb https://conda.anaconda.org/conda-forge/linux-64/libuuid-2.38.1-h0b41bf4_0.conda#40b61aab5c7ba9ff276c41cfffe6b80b https://conda.anaconda.org/conda-forge/linux-64/ninja-1.12.1-hff21bea_1.conda#2322531904f27501ee19847b87ba7c64 https://conda.anaconda.org/conda-forge/linux-64/readline-8.2-h8c095d6_2.conda#283b96675859b20a825f8fa30f311446 https://conda.anaconda.org/conda-forge/linux-64/tk-8.6.13-noxft_h4845f30_101.conda#d453b98d9c83e71da0741bb0ff4d76bc https://conda.anaconda.org/conda-forge/linux-64/zstd-1.5.7-hb8e6e7a_2.conda#6432cb5d4ac0046c3ac0a8a0f95842f9 -https://conda.anaconda.org/conda-forge/linux-64/libgfortran-ng-14.2.0-h69a702a_2.conda#4056c857af1a99ee50589a941059ec55 +https://conda.anaconda.org/conda-forge/linux-64/libgfortran-ng-15.1.0-h69a702a_2.conda#a483a87b71e974bb75d1b9413d4436dd https://conda.anaconda.org/conda-forge/linux-64/libopenblas-0.3.29-pthreads_h94d23a6_0.conda#0a4d0252248ef9a0f88f2ba8b8a08e12 https://conda.anaconda.org/conda-forge/linux-64/python-3.13.3-h4724d56_1_cp313t.conda#8193603fe48ace3d8801cfb246f44491 https://conda.anaconda.org/conda-forge/noarch/colorama-0.4.6-pyhd8ed1ab_1.conda#962b9857ee8e7018c22f2776ffa0b2d7 https://conda.anaconda.org/conda-forge/noarch/cpython-3.13.3-py313hd8ed1ab_1.conda#6ba9ba47b91b7758cb963d0f0eaf3422 -https://conda.anaconda.org/conda-forge/noarch/exceptiongroup-1.2.2-pyhd8ed1ab_1.conda#a16662747cdeb9abbac74d0057cc976e https://conda.anaconda.org/conda-forge/noarch/execnet-2.1.1-pyhd8ed1ab_1.conda#a71efeae2c160f6789900ba2631a2c90 https://conda.anaconda.org/conda-forge/noarch/iniconfig-2.0.0-pyhd8ed1ab_1.conda#6837f3eff7dcea42ecd714ce1ac2b108 https://conda.anaconda.org/conda-forge/linux-64/libblas-3.9.0-31_h59b9bed_openblas.conda#728dbebd0f7a20337218beacffd37916 @@ -46,13 +45,15 @@ https://conda.anaconda.org/conda-forge/noarch/pluggy-1.5.0-pyhd8ed1ab_1.conda#e9 https://conda.anaconda.org/conda-forge/noarch/setuptools-80.1.0-pyhff2d567_0.conda#f6f72d0837c79eaec77661be43e8a691 https://conda.anaconda.org/conda-forge/noarch/threadpoolctl-3.6.0-pyhecae5ae_0.conda#9d64911b31d57ca443e9f1e36b04385f https://conda.anaconda.org/conda-forge/noarch/tomli-2.2.1-pyhd8ed1ab_1.conda#ac944244f1fed2eb49bae07193ae8215 +https://conda.anaconda.org/conda-forge/noarch/typing_extensions-4.13.2-pyh29332c3_0.conda#83fc6ae00127671e301c9f44254c31b8 https://conda.anaconda.org/conda-forge/linux-64/ccache-4.11.3-h80c52d3_0.conda#eb517c6a2b960c3ccb6f1db1005f063a +https://conda.anaconda.org/conda-forge/noarch/exceptiongroup-1.3.0-pyhd8ed1ab_0.conda#72e42d28960d875c7654614f8b50939a https://conda.anaconda.org/conda-forge/noarch/joblib-1.5.0-pyhd8ed1ab_0.conda#3d7257f0a61c9aa4ffa3e324a887416b https://conda.anaconda.org/conda-forge/linux-64/libcblas-3.9.0-31_he106b2a_openblas.conda#abb32c727da370c481a1c206f5159ce9 https://conda.anaconda.org/conda-forge/linux-64/liblapack-3.9.0-31_h7ac8fdf_openblas.conda#452b98eafe050ecff932f0ec832dd03f https://conda.anaconda.org/conda-forge/noarch/pyproject-metadata-0.9.1-pyhd8ed1ab_0.conda#22ae7c6ea81e0c8661ef32168dda929b -https://conda.anaconda.org/conda-forge/noarch/pytest-8.3.5-pyhd8ed1ab_0.conda#c3c9316209dec74a705a36797970c6be https://conda.anaconda.org/conda-forge/noarch/python-freethreading-3.13.3-h92d6c8b_1.conda#4fa25290aec662a01642ba4b3c0ff5c1 https://conda.anaconda.org/conda-forge/noarch/meson-python-0.18.0-pyh70fd9c4_0.conda#576c04b9d9f8e45285fb4d9452c26133 https://conda.anaconda.org/conda-forge/linux-64/numpy-2.2.5-py313h103f029_0.conda#7dcbd568d6f8a4ffba5ace28915f1230 +https://conda.anaconda.org/conda-forge/noarch/pytest-8.3.5-pyhd8ed1ab_0.conda#c3c9316209dec74a705a36797970c6be https://conda.anaconda.org/conda-forge/noarch/pytest-xdist-3.6.1-pyhd8ed1ab_1.conda#59aad4fb37cabc0bacc73cf344612ddd From becfab82f1bd6a270729f77fecef50078889538a Mon Sep 17 00:00:00 2001 From: scikit-learn-bot Date: Mon, 12 May 2025 10:36:58 +0200 Subject: [PATCH 148/182] :lock: :robot: CI Update lock files for array-api CI build(s) :lock: :robot: (#31354) Co-authored-by: Lock file bot --- ...a_forge_cuda_array-api_linux-64_conda.lock | 115 +++++++++--------- 1 file changed, 59 insertions(+), 56 deletions(-) diff --git a/build_tools/github/pylatest_conda_forge_cuda_array-api_linux-64_conda.lock b/build_tools/github/pylatest_conda_forge_cuda_array-api_linux-64_conda.lock index 868f3f9d863c8..106a6da8fbcb2 100644 --- a/build_tools/github/pylatest_conda_forge_cuda_array-api_linux-64_conda.lock +++ b/build_tools/github/pylatest_conda_forge_cuda_array-api_linux-64_conda.lock @@ -8,6 +8,8 @@ https://conda.anaconda.org/conda-forge/noarch/font-ttf-inconsolata-3.000-h77eed3 https://conda.anaconda.org/conda-forge/noarch/font-ttf-source-code-pro-2.038-h77eed37_0.tar.bz2#4d59c254e01d9cde7957100457e2d5fb https://conda.anaconda.org/conda-forge/noarch/font-ttf-ubuntu-0.83-h77eed37_3.conda#49023d73832ef61042f6a237cb2687e7 https://conda.anaconda.org/conda-forge/noarch/kernel-headers_linux-64-3.10.0-he073ed8_18.conda#ad8527bf134a90e1c9ed35fa0b64318c +https://conda.anaconda.org/conda-forge/linux-64/libopentelemetry-cpp-headers-1.18.0-ha770c72_1.conda#4fb055f57404920a43b147031471e03b +https://conda.anaconda.org/conda-forge/linux-64/nlohmann_json-3.12.0-h3f2d84a_0.conda#d76872d096d063e226482c99337209dc https://conda.anaconda.org/conda-forge/noarch/python_abi-3.13-7_cp313.conda#e84b44e6300f1703cb25d29120c5b1d8 https://conda.anaconda.org/conda-forge/noarch/tzdata-2025b-h78e105d_0.conda#4222072737ccff51314b5ece9c7d6f5a https://conda.anaconda.org/conda-forge/noarch/ca-certificates-2025.4.26-hbd8a1cb_0.conda#95db94f75ba080a22eb623590993167b @@ -20,22 +22,22 @@ https://conda.anaconda.org/conda-forge/linux-64/_openmp_mutex-4.5-3_kmp_llvm.con https://conda.anaconda.org/conda-forge/noarch/fonts-conda-ecosystem-1-0.tar.bz2#fee5683a3f04bd15cbd8318b096a27ab https://conda.anaconda.org/conda-forge/linux-64/libegl-1.7.0-ha4b6fd6_2.conda#c151d5eb730e9b7480e6d48c0fc44048 https://conda.anaconda.org/conda-forge/linux-64/libopengl-1.7.0-ha4b6fd6_2.conda#7df50d44d4a14d6c31a2c54f2cd92157 -https://conda.anaconda.org/conda-forge/linux-64/libgcc-14.2.0-h767d61c_2.conda#ef504d1acbd74b7cc6849ef8af47dd03 +https://conda.anaconda.org/conda-forge/linux-64/libgcc-15.1.0-h767d61c_2.conda#ea8ac52380885ed41c1baa8f1d6d2b93 https://conda.anaconda.org/conda-forge/linux-64/alsa-lib-1.2.14-hb9d3cd8_0.conda#76df83c2a9035c54df5d04ff81bcc02d -https://conda.anaconda.org/conda-forge/linux-64/aws-c-common-0.10.6-hb9d3cd8_0.conda#d7d4680337a14001b0e043e96529409b +https://conda.anaconda.org/conda-forge/linux-64/aws-c-common-0.12.0-hb9d3cd8_0.conda#f65c946f28f0518f41ced702f44c52b7 https://conda.anaconda.org/conda-forge/linux-64/c-ares-1.34.5-hb9d3cd8_0.conda#f7f0d6cc2dc986d42ac2689ec88192be https://conda.anaconda.org/conda-forge/linux-64/libbrotlicommon-1.1.0-hb9d3cd8_2.conda#41b599ed2b02abcfdd84302bff174b23 https://conda.anaconda.org/conda-forge/linux-64/libdeflate-1.23-h86f0d12_0.conda#27fe770decaf469a53f3e3a6d593067f https://conda.anaconda.org/conda-forge/linux-64/libexpat-2.7.0-h5888daf_0.conda#db0bfbe7dd197b68ad5f30333bae6ce0 https://conda.anaconda.org/conda-forge/linux-64/libffi-3.4.6-h2dba641_1.conda#ede4673863426c0883c0063d853bbd85 -https://conda.anaconda.org/conda-forge/linux-64/libgcc-ng-14.2.0-h69a702a_2.conda#a2222a6ada71fb478682efe483ce0f92 -https://conda.anaconda.org/conda-forge/linux-64/libgfortran5-14.2.0-hf1ad2bd_2.conda#556a4fdfac7287d349b8f09aba899693 +https://conda.anaconda.org/conda-forge/linux-64/libgcc-ng-15.1.0-h69a702a_2.conda#ddca86c7040dd0e73b2b69bd7833d225 +https://conda.anaconda.org/conda-forge/linux-64/libgfortran5-15.1.0-hcea5267_2.conda#01de444988ed960031dbe84cf4f9b1fc https://conda.anaconda.org/conda-forge/linux-64/libiconv-1.18-h4ce23a2_1.conda#e796ff8ddc598affdf7c173d6145f087 https://conda.anaconda.org/conda-forge/linux-64/libjpeg-turbo-3.1.0-hb9d3cd8_0.conda#9fa334557db9f63da6c9285fd2a48638 https://conda.anaconda.org/conda-forge/linux-64/liblzma-5.8.1-hb9d3cd8_1.conda#a76fd702c93cd2dfd89eff30a5fd45a8 https://conda.anaconda.org/conda-forge/linux-64/libntlm-1.8-hb9d3cd8_0.conda#7c7927b404672409d9917d49bff5f2d6 -https://conda.anaconda.org/conda-forge/linux-64/libstdcxx-14.2.0-h8f9b012_2.conda#a78c856b6dc6bf4ea8daeb9beaaa3fb0 -https://conda.anaconda.org/conda-forge/linux-64/libutf8proc-2.9.0-hb9d3cd8_1.conda#1e936bd23d737aac62a18e9a1e7f8b18 +https://conda.anaconda.org/conda-forge/linux-64/libstdcxx-15.1.0-h8f9b012_2.conda#1cb1c67961f6dd257eae9e9691b341aa +https://conda.anaconda.org/conda-forge/linux-64/libutf8proc-2.10.0-h4c51ac1_0.conda#aeccfff2806ae38430638ffbb4be9610 https://conda.anaconda.org/conda-forge/linux-64/libuv-1.50.0-hb9d3cd8_0.conda#771ee65e13bc599b0b62af5359d80169 https://conda.anaconda.org/conda-forge/linux-64/libwebp-base-1.5.0-h851e524_0.conda#63f790534398730f59e1b899c3644d4a https://conda.anaconda.org/conda-forge/linux-64/libzlib-1.3.1-hb9d3cd8_2.conda#edb0dca6bc32e4f4789199455a1dbeb8 @@ -45,10 +47,10 @@ https://conda.anaconda.org/conda-forge/linux-64/pthread-stubs-0.4-hb9d3cd8_1002. https://conda.anaconda.org/conda-forge/linux-64/xorg-libice-1.1.2-hb9d3cd8_0.conda#fb901ff28063514abb6046c9ec2c4a45 https://conda.anaconda.org/conda-forge/linux-64/xorg-libxau-1.0.12-hb9d3cd8_0.conda#f6ebe2cb3f82ba6c057dde5d9debe4f7 https://conda.anaconda.org/conda-forge/linux-64/xorg-libxdmcp-1.1.5-hb9d3cd8_0.conda#8035c64cb77ed555e3f150b7b3972480 -https://conda.anaconda.org/conda-forge/linux-64/aws-c-cal-0.8.1-h1a47875_3.conda#55a8561fdbbbd34f50f57d9be12ed084 -https://conda.anaconda.org/conda-forge/linux-64/aws-c-compression-0.3.0-h4e1184b_5.conda#3f4c1197462a6df2be6dc8241828fe93 -https://conda.anaconda.org/conda-forge/linux-64/aws-c-sdkutils-0.2.1-h4e1184b_4.conda#a5126a90e74ac739b00564a4c7ddcc36 -https://conda.anaconda.org/conda-forge/linux-64/aws-checksums-0.2.2-h4e1184b_4.conda#74e8c3e4df4ceae34aa2959df4b28101 +https://conda.anaconda.org/conda-forge/linux-64/aws-c-cal-0.8.7-h043a21b_0.conda#4fdf835d66ea197e693125c64fbd4482 +https://conda.anaconda.org/conda-forge/linux-64/aws-c-compression-0.3.1-h3870646_2.conda#17ccde79d864e6183a83c5bbb8fff34d +https://conda.anaconda.org/conda-forge/linux-64/aws-c-sdkutils-0.2.3-h3870646_2.conda#06008b5ab42117c89c982aa2a32a5b25 +https://conda.anaconda.org/conda-forge/linux-64/aws-checksums-0.2.3-h3870646_2.conda#303d9e83e0518f1dcb66e90054635ca6 https://conda.anaconda.org/conda-forge/linux-64/bzip2-1.0.8-h4bc722e_7.conda#62ee74e96c5ebb0af99386de58cf9553 https://conda.anaconda.org/conda-forge/linux-64/double-conversion-3.3.1-h5888daf_0.conda#bfd56492d8346d669010eccafe0ba058 https://conda.anaconda.org/conda-forge/linux-64/expat-2.7.0-h5888daf_0.conda#d6845ae4dea52a2f90178bf1829a21f8 @@ -61,27 +63,27 @@ https://conda.anaconda.org/conda-forge/linux-64/libbrotlienc-1.1.0-hb9d3cd8_2.co https://conda.anaconda.org/conda-forge/linux-64/libedit-3.1.20250104-pl5321h7949ede_0.conda#c277e0a4d549b03ac1e9d6cbbe3d017b https://conda.anaconda.org/conda-forge/linux-64/libev-4.33-hd590300_2.conda#172bf1cd1ff8629f2b1179945ed45055 https://conda.anaconda.org/conda-forge/linux-64/libevent-2.1.12-hf998b51_1.conda#a1cfcc585f0c42bf8d5546bb1dfb668d -https://conda.anaconda.org/conda-forge/linux-64/libgfortran-14.2.0-h69a702a_2.conda#fb54c4ea68b460c278d26eea89cfbcc3 +https://conda.anaconda.org/conda-forge/linux-64/libgfortran-15.1.0-h69a702a_2.conda#f92e6e0a3c0c0c85561ef61aa59d555d https://conda.anaconda.org/conda-forge/linux-64/libmpdec-4.0.0-h4bc722e_0.conda#aeb98fdeb2e8f25d43ef71fbacbeec80 https://conda.anaconda.org/conda-forge/linux-64/libpciaccess-0.18-hd590300_0.conda#48f4330bfcd959c3cfb704d424903c82 https://conda.anaconda.org/conda-forge/linux-64/libpng-1.6.47-h943b412_0.conda#55199e2ae2c3651f6f9b2a447b47bdc9 -https://conda.anaconda.org/conda-forge/linux-64/libsqlite-3.49.1-hee588c1_2.conda#962d6ac93c30b1dfc54c9cccafd1003e +https://conda.anaconda.org/conda-forge/linux-64/libsqlite-3.49.2-hee588c1_0.conda#93048463501053a00739215ea3f36324 https://conda.anaconda.org/conda-forge/linux-64/libssh2-1.11.1-hcf80075_0.conda#eecce068c7e4eddeb169591baac20ac4 -https://conda.anaconda.org/conda-forge/linux-64/libstdcxx-ng-14.2.0-h4852527_2.conda#c75da67f045c2627f59e6fcb5f4e3a9b +https://conda.anaconda.org/conda-forge/linux-64/libstdcxx-ng-15.1.0-h4852527_2.conda#9d2072af184b5caa29492bf2344597bb https://conda.anaconda.org/conda-forge/linux-64/libuuid-2.38.1-h0b41bf4_0.conda#40b61aab5c7ba9ff276c41cfffe6b80b https://conda.anaconda.org/conda-forge/linux-64/libxcb-1.17.0-h8a09558_0.conda#92ed62436b625154323d40d5f2f11dd7 https://conda.anaconda.org/conda-forge/linux-64/lz4-c-1.10.0-h5888daf_1.conda#9de5350a85c4a20c685259b889aa6393 -https://conda.anaconda.org/conda-forge/linux-64/mysql-common-9.2.0-h266115a_0.conda#db22a0962c953e81a2a679ecb1fc6027 https://conda.anaconda.org/conda-forge/linux-64/ninja-1.12.1-hff21bea_1.conda#2322531904f27501ee19847b87ba7c64 https://conda.anaconda.org/conda-forge/linux-64/pixman-0.46.0-h29eaf8c_0.conda#d2f1c87d4416d1e7344cf92b1aaee1c4 https://conda.anaconda.org/conda-forge/linux-64/readline-8.2-h8c095d6_2.conda#283b96675859b20a825f8fa30f311446 -https://conda.anaconda.org/conda-forge/linux-64/s2n-1.5.11-h072c03f_0.conda#5e8060d52f676a40edef0006a75c718f +https://conda.anaconda.org/conda-forge/linux-64/s2n-1.5.14-h6c98b2b_0.conda#efab4ad81ba5731b2fefa0ab4359e884 https://conda.anaconda.org/conda-forge/linux-64/sleef-3.8-h1b44611_0.conda#aec4dba5d4c2924730088753f6fa164b https://conda.anaconda.org/conda-forge/linux-64/snappy-1.2.1-h8bd8927_1.conda#3b3e64af585eadfb52bb90b553db5edf https://conda.anaconda.org/conda-forge/linux-64/tk-8.6.13-noxft_h4845f30_101.conda#d453b98d9c83e71da0741bb0ff4d76bc https://conda.anaconda.org/conda-forge/linux-64/wayland-1.23.1-h3e06ad9_1.conda#a37843723437ba75f42c9270ffe800b1 +https://conda.anaconda.org/conda-forge/linux-64/zlib-1.3.1-hb9d3cd8_2.conda#c9f075ab2f33b3bbee9e62d4ad0a6cd8 https://conda.anaconda.org/conda-forge/linux-64/zstd-1.5.7-hb8e6e7a_2.conda#6432cb5d4ac0046c3ac0a8a0f95842f9 -https://conda.anaconda.org/conda-forge/linux-64/aws-c-io-0.15.3-h173a860_6.conda#9a063178f1af0a898526cc24ba7be486 +https://conda.anaconda.org/conda-forge/linux-64/aws-c-io-0.17.0-h3dad3f2_6.conda#3a127d28266cdc0da93384d1f59fe8df https://conda.anaconda.org/conda-forge/linux-64/brotli-bin-1.1.0-hb9d3cd8_2.conda#c63b5e52939e795ba8d26e35d767a843 https://conda.anaconda.org/conda-forge/linux-64/cudatoolkit-11.8.0-h4ba93d1_13.conda#eb43f5f1f16e2fad2eba22219c3e499b https://conda.anaconda.org/conda-forge/linux-64/glog-0.7.1-hbabe93e_0.conda#ff862eebdfeb2fd048ae9dc92510baca @@ -92,14 +94,13 @@ https://conda.anaconda.org/conda-forge/linux-64/krb5-1.21.3-h659f571_0.conda#3f4 https://conda.anaconda.org/conda-forge/linux-64/libcrc32c-1.1.2-h9c3ff4c_0.tar.bz2#c965a5aa0d5c1c37ffc62dff36e28400 https://conda.anaconda.org/conda-forge/linux-64/libdrm-2.4.124-hb9d3cd8_0.conda#8bc89311041d7fcb510238cf0848ccae https://conda.anaconda.org/conda-forge/linux-64/libfreetype6-2.13.3-h48d6fc4_1.conda#3c255be50a506c50765a93a6644f32fe -https://conda.anaconda.org/conda-forge/linux-64/libgfortran-ng-14.2.0-h69a702a_2.conda#4056c857af1a99ee50589a941059ec55 +https://conda.anaconda.org/conda-forge/linux-64/libgfortran-ng-15.1.0-h69a702a_2.conda#a483a87b71e974bb75d1b9413d4436dd https://conda.anaconda.org/conda-forge/linux-64/libnghttp2-1.64.0-h161d5f1_0.conda#19e57602824042dfd0446292ef90488b https://conda.anaconda.org/conda-forge/linux-64/libopenblas-0.3.29-pthreads_h94d23a6_0.conda#0a4d0252248ef9a0f88f2ba8b8a08e12 -https://conda.anaconda.org/conda-forge/linux-64/libprotobuf-5.28.2-h5b01275_0.conda#ab0bff36363bec94720275a681af8b83 +https://conda.anaconda.org/conda-forge/linux-64/libprotobuf-5.28.3-h6128344_1.conda#d8703f1ffe5a06356f06467f1d0b9464 https://conda.anaconda.org/conda-forge/linux-64/libre2-11-2024.07.02-hbbce691_2.conda#b2fede24428726dd867611664fb372e8 https://conda.anaconda.org/conda-forge/linux-64/libthrift-0.21.0-h0e7cc3e_0.conda#dcb95c0a98ba9ff737f7ae482aef7833 https://conda.anaconda.org/conda-forge/linux-64/libtiff-4.7.0-hd9ff511_4.conda#6c1028898cf3a2032d9af46689e1b81a -https://conda.anaconda.org/conda-forge/linux-64/mysql-libs-9.2.0-he0572af_0.conda#93340b072c393d23c4700a1d40565dca https://conda.anaconda.org/conda-forge/linux-64/nccl-2.26.5.1-h03a54cd_0.conda#47dc81d35df91d38609df9c93d608b2b https://conda.anaconda.org/conda-forge/linux-64/pcre2-10.44-hc749103_2.conda#31614c73d7b103ef76faa4d83d261d34 https://conda.anaconda.org/conda-forge/linux-64/python-3.13.3-hf636f53_101_cp313.conda#10622e12d649154af0bd76bcf33a7c5c @@ -110,16 +111,15 @@ https://conda.anaconda.org/conda-forge/linux-64/xcb-util-renderutil-0.3.10-hb711 https://conda.anaconda.org/conda-forge/linux-64/xcb-util-wm-0.4.2-hb711507_0.conda#608e0ef8256b81d04456e8d211eee3e8 https://conda.anaconda.org/conda-forge/linux-64/xorg-libsm-1.2.6-he73a12e_0.conda#1c74ff8c35dcadf952a16f752ca5aa49 https://conda.anaconda.org/conda-forge/linux-64/xorg-libx11-1.8.12-h4f16b4b_0.conda#db038ce880f100acc74dba10302b5630 -https://conda.anaconda.org/conda-forge/linux-64/aws-c-event-stream-0.5.0-h7959bf6_11.conda#9b3fb60fe57925a92f399bc3fc42eccf -https://conda.anaconda.org/conda-forge/linux-64/aws-c-http-0.9.2-hefd7a92_4.conda#5ce4df662d32d3123ea8da15571b6f51 +https://conda.anaconda.org/conda-forge/linux-64/aws-c-event-stream-0.5.4-h04a3f94_2.conda#81096a80f03fc2f0fb2a230f5d028643 +https://conda.anaconda.org/conda-forge/linux-64/aws-c-http-0.9.4-hb9b18c6_4.conda#773c99d0dbe2b3704af165f97ff399e5 https://conda.anaconda.org/conda-forge/linux-64/brotli-1.1.0-hb9d3cd8_2.conda#98514fe74548d768907ce7a13f680e8f https://conda.anaconda.org/conda-forge/noarch/colorama-0.4.6-pyhd8ed1ab_1.conda#962b9857ee8e7018c22f2776ffa0b2d7 https://conda.anaconda.org/conda-forge/noarch/cpython-3.13.3-py313hd8ed1ab_101.conda#904a822cbd380adafb9070debf8579a8 -https://conda.anaconda.org/conda-forge/linux-64/cudnn-9.8.0.87-hf36481c_1.conda#988b6d0f8a2660fdee429d3d0f761ed3 +https://conda.anaconda.org/conda-forge/linux-64/cudnn-9.9.0.52-hf36481c_0.conda#5586a7f60b88d82c6d8ee5e0309c34d8 https://conda.anaconda.org/conda-forge/noarch/cycler-0.12.1-pyhd8ed1ab_1.conda#44600c4667a319d67dbe0681fc0bc833 https://conda.anaconda.org/conda-forge/linux-64/cyrus-sasl-2.1.27-h54b06d7_7.conda#dce22f70b4e5a407ce88f2be046f4ceb -https://conda.anaconda.org/conda-forge/linux-64/cython-3.0.12-py313h5dec8f5_0.conda#24a42a0c1cc33743e33572d63d489b54 -https://conda.anaconda.org/conda-forge/noarch/exceptiongroup-1.2.2-pyhd8ed1ab_1.conda#a16662747cdeb9abbac74d0057cc976e +https://conda.anaconda.org/conda-forge/linux-64/cython-3.1.0-py313h5dec8f5_0.conda#43ede3c67f0001ebc9dbf9a5e5e2b218 https://conda.anaconda.org/conda-forge/noarch/execnet-2.1.1-pyhd8ed1ab_1.conda#a71efeae2c160f6789900ba2631a2c90 https://conda.anaconda.org/conda-forge/linux-64/fastrlock-0.8.3-py313h9800cb9_1.conda#54dd71b3be2ed6ccc50f180347c901db https://conda.anaconda.org/conda-forge/noarch/filelock-3.18.0-pyhd8ed1ab_0.conda#4547b39256e296bb758166893e909a7c @@ -134,7 +134,7 @@ https://conda.anaconda.org/conda-forge/linux-64/libfreetype-2.13.3-ha770c72_1.co https://conda.anaconda.org/conda-forge/linux-64/libglib-2.84.1-h2ff4ddf_0.conda#0305434da649d4fb48a425e588b79ea6 https://conda.anaconda.org/conda-forge/linux-64/libglx-1.7.0-ha4b6fd6_2.conda#c8013e438185f33b13814c5c488acd5c https://conda.anaconda.org/conda-forge/linux-64/libhiredis-1.0.2-h2cc385e_0.tar.bz2#b34907d3a81a3cd8095ee83d174c074a -https://conda.anaconda.org/conda-forge/linux-64/libxml2-2.13.7-h4bc477f_1.conda#ad1f1f8238834cd3c88ceeaee8da444a +https://conda.anaconda.org/conda-forge/linux-64/libxml2-2.13.8-h4bc477f_0.conda#14dbe05b929e329dbaa6f2d0aa19466d https://conda.anaconda.org/conda-forge/linux-64/markupsafe-3.0.2-py313h8060acc_1.conda#21b62c55924f01b6eef6827167b46acb https://conda.anaconda.org/conda-forge/noarch/meson-1.8.0-pyh29332c3_0.conda#8e25221b702272394b86b0f4d7217f77 https://conda.anaconda.org/conda-forge/linux-64/mpfr-4.2.1-h90cbb55_3.conda#2eeb50cab6652538eee8fc0bc3340c81 @@ -143,7 +143,7 @@ https://conda.anaconda.org/conda-forge/noarch/munkres-1.1.4-pyh9f0ad1d_0.tar.bz2 https://conda.anaconda.org/conda-forge/noarch/networkx-3.4.2-pyh267e887_2.conda#fd40bf7f7f4bc4b647dc8512053d9873 https://conda.anaconda.org/conda-forge/linux-64/openblas-0.3.29-pthreads_h6ec200e_0.conda#7e4d48870b3258bea920d51b7f495a81 https://conda.anaconda.org/conda-forge/linux-64/openjpeg-2.5.3-h5fbd93e_0.conda#9e5816bc95d285c115a3ebc2f8563564 -https://conda.anaconda.org/conda-forge/linux-64/orc-2.0.3-h97ab989_1.conda#2f46eae652623114e112df13fae311cf +https://conda.anaconda.org/conda-forge/linux-64/orc-2.1.1-h2271f48_0.conda#67075ef2cb33079efee3abfe58127a3b https://conda.anaconda.org/conda-forge/noarch/packaging-25.0-pyh29332c3_1.conda#58335b26c38bf4a20f399384c33cbcf9 https://conda.anaconda.org/conda-forge/noarch/pip-25.1.1-pyh145f28c_0.conda#01384ff1639c6330a0924791413b8714 https://conda.anaconda.org/conda-forge/noarch/pluggy-1.5.0-pyhd8ed1ab_1.conda#e9dcbce5f45f9ee500e728ae58b605b6 @@ -163,19 +163,20 @@ https://conda.anaconda.org/conda-forge/linux-64/xkeyboard-config-2.44-hb9d3cd8_0 https://conda.anaconda.org/conda-forge/linux-64/xorg-libxext-1.3.6-hb9d3cd8_0.conda#febbab7d15033c913d53c7a2c102309d https://conda.anaconda.org/conda-forge/linux-64/xorg-libxfixes-6.0.1-hb9d3cd8_0.conda#4bdb303603e9821baf5fe5fdff1dc8f8 https://conda.anaconda.org/conda-forge/linux-64/xorg-libxrender-0.9.12-hb9d3cd8_0.conda#96d57aba173e878a2089d5638016dc5e -https://conda.anaconda.org/conda-forge/linux-64/aws-c-auth-0.8.0-hb921021_15.conda#c79d50f64cffa5ad51ecc1a81057962f -https://conda.anaconda.org/conda-forge/linux-64/aws-c-mqtt-0.11.0-h11f4f37_12.conda#96c3e0221fa2da97619ee82faa341a73 +https://conda.anaconda.org/conda-forge/linux-64/aws-c-auth-0.8.6-hd08a7f5_4.conda#f5a770ac1fd2cb34b21327fc513013a7 +https://conda.anaconda.org/conda-forge/linux-64/aws-c-mqtt-0.12.2-h108da3e_2.conda#90e07c8bac8da6378ee1882ef0a9374a https://conda.anaconda.org/conda-forge/linux-64/azure-core-cpp-1.14.0-h5cfcd09_0.conda#0a8838771cc2e985cd295e01ae83baf1 https://conda.anaconda.org/conda-forge/linux-64/ccache-4.11.3-h80c52d3_0.conda#eb517c6a2b960c3ccb6f1db1005f063a https://conda.anaconda.org/conda-forge/linux-64/coverage-7.8.0-py313h8060acc_0.conda#375064d30e709bf7c1d4580e70aaea61 https://conda.anaconda.org/conda-forge/linux-64/dbus-1.13.6-h5008d03_3.tar.bz2#ecfff944ba3960ecb334b9a2663d708d -https://conda.anaconda.org/conda-forge/linux-64/fonttools-4.57.0-py313h8060acc_0.conda#76b3a3367ac578a7cc43f4b7814e7e87 +https://conda.anaconda.org/conda-forge/noarch/exceptiongroup-1.3.0-pyhd8ed1ab_0.conda#72e42d28960d875c7654614f8b50939a +https://conda.anaconda.org/conda-forge/linux-64/fonttools-4.58.0-py313h8060acc_0.conda#0bf58a605826e69e1c6b28f35f83ea32 https://conda.anaconda.org/conda-forge/linux-64/freetype-2.13.3-ha770c72_1.conda#9ccd736d31e0c6e41f54e704e5312811 https://conda.anaconda.org/conda-forge/noarch/jinja2-3.1.6-pyhd8ed1ab_0.conda#446bd6c8cb26050d528881df495ce646 https://conda.anaconda.org/conda-forge/noarch/joblib-1.5.0-pyhd8ed1ab_0.conda#3d7257f0a61c9aa4ffa3e324a887416b https://conda.anaconda.org/conda-forge/linux-64/libcblas-3.9.0-31_he106b2a_openblas.conda#abb32c727da370c481a1c206f5159ce9 https://conda.anaconda.org/conda-forge/linux-64/libgl-1.7.0-ha4b6fd6_2.conda#928b8be80851f5d8ffb016f9c81dae7a -https://conda.anaconda.org/conda-forge/linux-64/libgrpc-1.67.1-hc2c308b_0.conda#4606a4647bfe857e3cfe21ca12ac3afb +https://conda.anaconda.org/conda-forge/linux-64/libgrpc-1.67.1-h25350d4_2.conda#bfcedaf5f9b003029cc6abe9431f66bf https://conda.anaconda.org/conda-forge/linux-64/libhwloc-2.11.2-default_h0d58e46_1001.conda#804ca9e91bcaea0824a341d55b1684f2 https://conda.anaconda.org/conda-forge/linux-64/liblapack-3.9.0-31_h7ac8fdf_openblas.conda#452b98eafe050ecff932f0ec832dd03f https://conda.anaconda.org/conda-forge/linux-64/libllvm20-20.1.4-he9d0ab4_0.conda#96c33bbd084ef2b2463503fb7f1482ae @@ -183,8 +184,9 @@ https://conda.anaconda.org/conda-forge/linux-64/libxkbcommon-1.9.2-h65c71a3_0.co https://conda.anaconda.org/conda-forge/linux-64/libxslt-1.1.39-h76b75d6_0.conda#e71f31f8cfb0a91439f2086fc8aa0461 https://conda.anaconda.org/conda-forge/linux-64/mpc-1.3.1-h24ddda3_1.conda#aa14b9a5196a6d8dd364164b7ce56acf https://conda.anaconda.org/conda-forge/linux-64/openldap-2.6.9-he970967_0.conda#ca2de8bbdc871bce41dbf59e51324165 +https://conda.anaconda.org/conda-forge/linux-64/pillow-11.2.1-py313h8db990d_0.conda#91b00afee98d72d29dc3d1c1ab0008d7 +https://conda.anaconda.org/conda-forge/linux-64/prometheus-cpp-1.3.0-ha5d0236_0.conda#a83f6a2fdc079e643237887a37460668 https://conda.anaconda.org/conda-forge/noarch/pyproject-metadata-0.9.1-pyhd8ed1ab_0.conda#22ae7c6ea81e0c8661ef32168dda929b -https://conda.anaconda.org/conda-forge/noarch/pytest-8.3.5-pyhd8ed1ab_0.conda#c3c9316209dec74a705a36797970c6be https://conda.anaconda.org/conda-forge/noarch/python-dateutil-2.9.0.post0-pyhff2d567_1.conda#5ba79d7c71f03c678c8ead841f347d6e https://conda.anaconda.org/conda-forge/noarch/python-gil-3.13.3-h4df99d1_101.conda#82c2641f2f0f513f7d2d1b847a2588e3 https://conda.anaconda.org/conda-forge/linux-64/xcb-util-cursor-0.1.5-hb9d3cd8_0.conda#eb44b3b6deb1cab08d72cb61686fe64c @@ -195,55 +197,56 @@ https://conda.anaconda.org/conda-forge/linux-64/xorg-libxi-1.8.2-hb9d3cd8_0.cond https://conda.anaconda.org/conda-forge/linux-64/xorg-libxrandr-1.5.4-hb9d3cd8_0.conda#2de7f99d6581a4a7adbff607b5c278ca https://conda.anaconda.org/conda-forge/linux-64/xorg-libxxf86vm-1.1.6-hb9d3cd8_0.conda#5efa5fa6243a622445fdfd72aee15efa https://conda.anaconda.org/conda-forge/noarch/_python_abi3_support-1.0-hd8ed1ab_2.conda#aaa2a381ccc56eac91d63b6c1240312f -https://conda.anaconda.org/conda-forge/linux-64/aws-c-s3-0.7.7-hf454442_0.conda#947c82025693bebd557f782bb5d6b469 +https://conda.anaconda.org/conda-forge/linux-64/aws-c-s3-0.7.13-h822ba82_2.conda#9cf2c3c13468f2209ee814be2c88655f https://conda.anaconda.org/conda-forge/linux-64/azure-identity-cpp-1.10.0-h113e628_0.conda#73f73f60854f325a55f1d31459f2ab73 https://conda.anaconda.org/conda-forge/linux-64/azure-storage-common-cpp-12.8.0-h736e048_1.conda#13de36be8de3ae3f05ba127631599213 https://conda.anaconda.org/conda-forge/linux-64/fontconfig-2.15.0-h7e30c49_1.conda#8f5b0b297b59e1ac160ad4beec99dbee https://conda.anaconda.org/conda-forge/linux-64/gmpy2-2.2.1-py313h11186cd_0.conda#54d020e0eaacf1e99bfb2410b9aa2e5e https://conda.anaconda.org/conda-forge/linux-64/libclang-cpp20.1-20.1.4-default_h1df26ce_0.conda#96f8d5b2e94c9ba4fef19f1adf068a15 https://conda.anaconda.org/conda-forge/linux-64/libclang13-20.1.4-default_he06ed0a_0.conda#2d933632c8004be47deb2be61bf013be -https://conda.anaconda.org/conda-forge/linux-64/libgoogle-cloud-2.32.0-h804f50b_0.conda#3d96df4d6b1c88455e05b94ce8a14a53 +https://conda.anaconda.org/conda-forge/linux-64/libgoogle-cloud-2.36.0-h2b5623c_0.conda#c96ca58ad3352a964bfcb85de6cd1496 https://conda.anaconda.org/conda-forge/linux-64/liblapacke-3.9.0-31_he2f377e_openblas.conda#7e5fff7d0db69be3a266f7e79a3bb0e2 -https://conda.anaconda.org/conda-forge/linux-64/libmagma-2.8.0-h9ddd185_2.conda#8de40c4f75d36bb00a5870f682457f1d -https://conda.anaconda.org/conda-forge/linux-64/libpq-17.4-h27ae623_1.conda#37fba334855ef3b51549308e61ed7a3d +https://conda.anaconda.org/conda-forge/linux-64/libmagma-2.9.0-h45b15fe_0.conda#703a1ab01e36111d8bb40bc7517e900b +https://conda.anaconda.org/conda-forge/linux-64/libopentelemetry-cpp-1.18.0-hfcad708_1.conda#1f5a5d66e77a39dc5bd639ec953705cf +https://conda.anaconda.org/conda-forge/linux-64/libpq-17.5-h27ae623_0.conda#6458be24f09e1b034902ab44fe9de908 https://conda.anaconda.org/conda-forge/noarch/meson-python-0.18.0-pyh70fd9c4_0.conda#576c04b9d9f8e45285fb4d9452c26133 https://conda.anaconda.org/conda-forge/linux-64/numpy-2.2.5-py313h17eae1a_0.conda#6ceeff9ed72e54e4a2f9a1c88f47bdde -https://conda.anaconda.org/conda-forge/linux-64/pillow-11.1.0-py313h8db990d_0.conda#1e86810c6c3fb6d6aebdba26564eb2e8 -https://conda.anaconda.org/conda-forge/noarch/pytest-cov-6.1.1-pyhd8ed1ab_0.conda#1e35d8f975bc0e984a19819aa91c440a -https://conda.anaconda.org/conda-forge/noarch/pytest-xdist-3.6.1-pyhd8ed1ab_1.conda#59aad4fb37cabc0bacc73cf344612ddd +https://conda.anaconda.org/conda-forge/noarch/pytest-8.3.5-pyhd8ed1ab_0.conda#c3c9316209dec74a705a36797970c6be https://conda.anaconda.org/conda-forge/linux-64/tbb-2021.13.0-hceb3a55_1.conda#ba7726b8df7b9d34ea80e82b097a4893 https://conda.anaconda.org/conda-forge/linux-64/xorg-libxtst-1.2.5-hb9d3cd8_3.conda#7bbe9a0cc0df0ac5f5a8ad6d6a11af2f https://conda.anaconda.org/conda-forge/noarch/array-api-strict-2.3.1-pyhd8ed1ab_0.conda#11107d0aeb8c590a34fee0894909816b -https://conda.anaconda.org/conda-forge/linux-64/aws-crt-cpp-0.29.7-hd92328a_7.conda#02b95564257d5c3db9c06beccf711f95 +https://conda.anaconda.org/conda-forge/linux-64/aws-crt-cpp-0.31.0-h55f77e1_4.conda#0627af705ed70681f5bede31e72348e5 https://conda.anaconda.org/conda-forge/linux-64/azure-storage-blobs-cpp-12.13.0-h3cf044e_1.conda#7eb66060455c7a47d9dcdbfa9f46579b https://conda.anaconda.org/conda-forge/linux-64/blas-devel-3.9.0-31_h1ea3ea9_openblas.conda#ba652ee0576396d4765e567f043c57f9 https://conda.anaconda.org/conda-forge/linux-64/cairo-1.18.4-h3394656_0.conda#09262e66b19567aff4f592fb53b28760 https://conda.anaconda.org/conda-forge/linux-64/contourpy-1.3.2-py313h33d0bda_0.conda#5dc81fffe102f63045225007a33d6199 https://conda.anaconda.org/conda-forge/linux-64/cupy-core-13.4.1-py313hc2a895b_0.conda#46dd595e816b278b178e3bef8a6acf71 -https://conda.anaconda.org/conda-forge/linux-64/libgoogle-cloud-storage-2.32.0-h0121fbd_0.conda#877a5ec0431a5af83bf0cd0522bfe661 -https://conda.anaconda.org/conda-forge/linux-64/libmagma_sparse-2.8.0-h9ddd185_0.conda#f4eb3cfeaf9d91e72d5b2b8706bf059f +https://conda.anaconda.org/conda-forge/linux-64/libgoogle-cloud-storage-2.36.0-h0121fbd_0.conda#fc5efe1833a4d709953964037985bb72 +https://conda.anaconda.org/conda-forge/linux-64/libmagma_sparse-2.9.0-h45b15fe_0.conda#beac0a5bbe0af75db6b16d3d8fd24f7e https://conda.anaconda.org/conda-forge/linux-64/mkl-2024.2.2-ha957f24_16.conda#1459379c79dda834673426504d52b319 https://conda.anaconda.org/conda-forge/linux-64/pandas-2.2.3-py313ha87cce1_3.conda#6248b529e537b1d4cb5ab3ef7f537795 -https://conda.anaconda.org/conda-forge/linux-64/polars-1.27.1-py39h2a4a510_3.conda#fba08963eaa1f954480045d033d1221e +https://conda.anaconda.org/conda-forge/linux-64/polars-1.29.0-py39h441220d_0.conda#6be2bbd70bf401a6f59952ba1355d8b8 +https://conda.anaconda.org/conda-forge/noarch/pytest-cov-6.1.1-pyhd8ed1ab_0.conda#1e35d8f975bc0e984a19819aa91c440a +https://conda.anaconda.org/conda-forge/noarch/pytest-xdist-3.6.1-pyhd8ed1ab_1.conda#59aad4fb37cabc0bacc73cf344612ddd https://conda.anaconda.org/conda-forge/linux-64/scipy-1.15.2-py313h86fcf2b_0.conda#ca68acd9febc86448eeed68d0c6c8643 https://conda.anaconda.org/conda-forge/noarch/sympy-1.14.0-pyh2585a3b_105.conda#8c09fac3785696e1c477156192d64b91 -https://conda.anaconda.org/conda-forge/linux-64/aws-sdk-cpp-1.11.458-hc430e4a_4.conda#aeefac461bea1f126653c1285cf5af08 +https://conda.anaconda.org/conda-forge/linux-64/aws-sdk-cpp-1.11.510-h37a5c72_3.conda#beb8577571033140c6897d257acc7724 https://conda.anaconda.org/conda-forge/linux-64/azure-storage-files-datalake-cpp-12.12.0-ha633028_1.conda#7c1980f89dd41b097549782121a73490 https://conda.anaconda.org/conda-forge/linux-64/blas-2.131-openblas.conda#38b2ec894c69bb4be0e66d2ef7fc60bf https://conda.anaconda.org/conda-forge/linux-64/cupy-13.4.1-py313h66a2ee2_0.conda#784d6bd149ef2b5d9c733ea3dd4d15ad https://conda.anaconda.org/conda-forge/linux-64/harfbuzz-11.1.0-h3beb420_0.conda#95e3bb97f9cdc251c0c68640e9c10ed3 -https://conda.anaconda.org/conda-forge/linux-64/libtorch-2.5.1-cuda118_hb34f2e8_303.conda#da799bf557ff6376a1a58f40bddfb293 -https://conda.anaconda.org/conda-forge/linux-64/matplotlib-base-3.10.1-py313h129903b_0.conda#4e23b3fabf434b418e0d9c6975a6453f +https://conda.anaconda.org/conda-forge/linux-64/libtorch-2.4.1-cuda118_mkl_hee7131c_306.conda#28b3b3da11973494ed0100aa50f47328 +https://conda.anaconda.org/conda-forge/linux-64/matplotlib-base-3.10.3-py313h129903b_0.conda#4f8816d006b1c155ec416bcf7ff6cee2 https://conda.anaconda.org/conda-forge/linux-64/pyamg-5.2.1-py313hf0ab243_1.conda#4c769bf3858f424cb2ecf952175ec600 -https://conda.anaconda.org/conda-forge/linux-64/libarrow-18.1.0-h44a453e_6_cpu.conda#2cf6d608d6e66506f69797d5c6944c35 -https://conda.anaconda.org/conda-forge/linux-64/pytorch-2.5.1-cuda118_py313h40cdc2d_303.conda#19ad990954a4ed89358d91d0a3e7016d -https://conda.anaconda.org/conda-forge/linux-64/qt6-main-6.9.0-h6441bc3_1.conda#4029a8dcb1d97ea241dbe5abfda1fad6 -https://conda.anaconda.org/conda-forge/linux-64/libarrow-acero-18.1.0-hcb10f89_6_cpu.conda#143f9288b64759a6427563f058c62f2b -https://conda.anaconda.org/conda-forge/linux-64/libparquet-18.1.0-h081d1f1_6_cpu.conda#68788df49ce7480187eb6387f15b2b67 -https://conda.anaconda.org/conda-forge/linux-64/pyarrow-core-18.1.0-py313he5f92c8_0_cpu.conda#5380e12f4468e891911dbbd4248b521a +https://conda.anaconda.org/conda-forge/linux-64/libarrow-19.0.1-hc7b3859_3_cpu.conda#9ed3ded6da29dec8417f2e1db68798f2 +https://conda.anaconda.org/conda-forge/linux-64/pytorch-2.4.1-cuda118_mkl_py313_h909c4c2_306.conda#de6e45613bbdb51127e9ff483c31bf41 +https://conda.anaconda.org/conda-forge/linux-64/qt6-main-6.9.0-h8d00660_2.conda#ac0eb548e24a2cb3c2c8ba060aef7db2 +https://conda.anaconda.org/conda-forge/linux-64/libarrow-acero-19.0.1-hcb10f89_3_cpu.conda#8f8dc214d89e06933f1bc1dcd2310b9c +https://conda.anaconda.org/conda-forge/linux-64/libparquet-19.0.1-h081d1f1_3_cpu.conda#1d04307cdb1d8aeb5f55b047d5d403ea +https://conda.anaconda.org/conda-forge/linux-64/pyarrow-core-19.0.1-py313he5f92c8_0_cpu.conda#7d8649531c807b24295c8f9a0a396a78 https://conda.anaconda.org/conda-forge/linux-64/pyside6-6.9.0-py313h5f61773_0.conda#f51f25ec8fcbf777f8b186bb5deeed40 -https://conda.anaconda.org/conda-forge/linux-64/pytorch-gpu-2.5.1-cuda126hf7c78f0_303.conda#afaf760e55725108ae78ed41198c49bb -https://conda.anaconda.org/conda-forge/linux-64/libarrow-dataset-18.1.0-hcb10f89_6_cpu.conda#20ca46a6bc714a6ab189d5b3f46e66d8 -https://conda.anaconda.org/conda-forge/linux-64/matplotlib-3.10.1-py313h78bf25f_0.conda#d0c80dea550ca97fc0710b2ecef919ba -https://conda.anaconda.org/conda-forge/linux-64/libarrow-substrait-18.1.0-h3ee7192_6_cpu.conda#aa313b3168caf98d00b3753f5ba27650 -https://conda.anaconda.org/conda-forge/linux-64/pyarrow-18.1.0-py313h78bf25f_0.conda#a11d880ceedc33993c6f5c14a80ea9d3 +https://conda.anaconda.org/conda-forge/linux-64/pytorch-gpu-2.4.1-cuda118_mkl_hf8a3b2d_306.conda#b1802a39f1ca7ebed5f8c35755bffec1 +https://conda.anaconda.org/conda-forge/linux-64/libarrow-dataset-19.0.1-hcb10f89_3_cpu.conda#a28f04b6e68a1c76de76783108ad729d +https://conda.anaconda.org/conda-forge/linux-64/matplotlib-3.10.3-py313h78bf25f_0.conda#cc9324e614a297fdf23439d887d3513d +https://conda.anaconda.org/conda-forge/linux-64/libarrow-substrait-19.0.1-h08228c5_3_cpu.conda#a58e4763af8293deaac77b63bc7804d8 +https://conda.anaconda.org/conda-forge/linux-64/pyarrow-19.0.1-py313h78bf25f_0.conda#e8efe6998a383dd149787c83d3d6a92e From dff0eab233a051a8c908750d82b2ebe9d95e6cc7 Mon Sep 17 00:00:00 2001 From: Mohamed DHIFALLAH <40263854+Meddhif13@users.noreply.github.com> Date: Mon, 12 May 2025 10:41:10 +0200 Subject: [PATCH 149/182] DOC Add references to DetCurveDisplay docstring (#31307) --- sklearn/metrics/_plot/det_curve.py | 15 ++++++++++++--- 1 file changed, 12 insertions(+), 3 deletions(-) diff --git a/sklearn/metrics/_plot/det_curve.py b/sklearn/metrics/_plot/det_curve.py index f15fe0ae9e889..39b43429d3f6c 100644 --- a/sklearn/metrics/_plot/det_curve.py +++ b/sklearn/metrics/_plot/det_curve.py @@ -15,7 +15,10 @@ class DetCurveDisplay(_BinaryClassifierCurveDisplayMixin): or :func:`~sklearn.metrics.DetCurveDisplay.from_predictions` to create a visualizer. All parameters are stored as attributes. - Read more in the :ref:`User Guide `. + For general information regarding `scikit-learn` visualization tools, see + the :ref:`Visualization Guide `. + For guidance on interpreting these plots, refer to the + :ref:`Model Evaluation Guide `. .. versionadded:: 0.24 @@ -96,7 +99,10 @@ def from_estimator( ): """Plot DET curve given an estimator and data. - Read more in the :ref:`User Guide `. + For general information regarding `scikit-learn` visualization tools, see + the :ref:`Visualization Guide `. + For guidance on interpreting these plots, refer to the + :ref:`Model Evaluation Guide `. .. versionadded:: 1.0 @@ -207,7 +213,10 @@ def from_predictions( ): """Plot the DET curve given the true and predicted labels. - Read more in the :ref:`User Guide `. + For general information regarding `scikit-learn` visualization tools, see + the :ref:`Visualization Guide `. + For guidance on interpreting these plots, refer to the + :ref:`Model Evaluation Guide `. .. versionadded:: 1.0 From 7aab308f113bd83404a683c4773d3367e4770dd0 Mon Sep 17 00:00:00 2001 From: scikit-learn-bot Date: Mon, 12 May 2025 11:24:42 +0200 Subject: [PATCH 150/182] :lock: :robot: CI Update lock files for scipy-dev CI build(s) :lock: :robot: (#31352) Co-authored-by: Lock file bot --- build_tools/azure/pylatest_pip_scipy_dev_linux-64_conda.lock | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/build_tools/azure/pylatest_pip_scipy_dev_linux-64_conda.lock b/build_tools/azure/pylatest_pip_scipy_dev_linux-64_conda.lock index 9546a87a15657..f91a00242b5fd 100644 --- a/build_tools/azure/pylatest_pip_scipy_dev_linux-64_conda.lock +++ b/build_tools/azure/pylatest_pip_scipy_dev_linux-64_conda.lock @@ -42,12 +42,12 @@ https://repo.anaconda.com/pkgs/main/noarch/pip-25.1-pyhc872135_2.conda#2778327d2 # pip meson @ https://files.pythonhosted.org/packages/df/d7/f1c8acf0e597d4d07532f519780ee6e11ba285a9b092f18706b4c9118331/meson-1.8.0-py3-none-any.whl#sha256=472b7b25da286447333d32872b82d1c6f1a34024fb8ee017d7308056c25fec1f # pip ninja @ https://files.pythonhosted.org/packages/eb/7a/455d2877fe6cf99886849c7f9755d897df32eaf3a0fba47b56e615f880f7/ninja-1.11.1.4-py3-none-manylinux_2_12_x86_64.manylinux2010_x86_64.whl#sha256=096487995473320de7f65d622c3f1d16c3ad174797602218ca8c967f51ec38a0 # pip packaging @ https://files.pythonhosted.org/packages/20/12/38679034af332785aac8774540895e234f4d07f7545804097de4b666afd8/packaging-25.0-py3-none-any.whl#sha256=29572ef2b1f17581046b3a2227d5c611fb25ec70ca1ba8554b24b0e69331a484 -# pip platformdirs @ https://files.pythonhosted.org/packages/6d/45/59578566b3275b8fd9157885918fcd0c4d74162928a5310926887b856a51/platformdirs-4.3.7-py3-none-any.whl#sha256=a03875334331946f13c549dbd8f4bac7a13a50a895a0eb1e8c6a8ace80d40a94 +# pip platformdirs @ https://files.pythonhosted.org/packages/fe/39/979e8e21520d4e47a0bbe349e2713c0aac6f3d853d0e5b34d76206c439aa/platformdirs-4.3.8-py3-none-any.whl#sha256=ff7059bb7eb1179e2685604f4aaf157cfd9535242bd23742eadc3c13542139b4 # pip pluggy @ https://files.pythonhosted.org/packages/88/5f/e351af9a41f866ac3f1fac4ca0613908d9a41741cfcf2228f4ad853b697d/pluggy-1.5.0-py3-none-any.whl#sha256=44e1ad92c8ca002de6377e165f3e0f1be63266ab4d554740532335b9d75ea669 # pip pygments @ https://files.pythonhosted.org/packages/8a/0b/9fcc47d19c48b59121088dd6da2488a49d5f72dacf8262e2790a1d2c7d15/pygments-2.19.1-py3-none-any.whl#sha256=9ea1544ad55cecf4b8242fab6dd35a93bbce657034b0611ee383099054ab6d8c # pip roman-numerals-py @ https://files.pythonhosted.org/packages/53/97/d2cbbaa10c9b826af0e10fdf836e1bf344d9f0abb873ebc34d1f49642d3f/roman_numerals_py-3.1.0-py3-none-any.whl#sha256=9da2ad2fb670bcf24e81070ceb3be72f6c11c440d73bd579fbeca1e9f330954c # pip six @ https://files.pythonhosted.org/packages/b7/ce/149a00dd41f10bc29e5921b496af8b574d8413afcd5e30dfa0ed46c2cc5e/six-1.17.0-py2.py3-none-any.whl#sha256=4721f391ed90541fddacab5acf947aa0d3dc7d27b2e1e8eda2be8970586c3274 -# pip snowballstemmer @ https://files.pythonhosted.org/packages/ed/dc/c02e01294f7265e63a7315fe086dd1df7dacb9f840a804da846b96d01b96/snowballstemmer-2.2.0-py2.py3-none-any.whl#sha256=c8e1716e83cc398ae16824e5572ae04e0d9fc2c6b985fb0f900f5f0c96ecba1a +# pip snowballstemmer @ https://files.pythonhosted.org/packages/c8/78/3565d011c61f5a43488987ee32b6f3f656e7f107ac2782dd57bdd7d91d9a/snowballstemmer-3.0.1-py3-none-any.whl#sha256=6cd7b3897da8d6c9ffb968a6781fa6532dce9c3618a4b127d920dab764a19064 # pip sphinxcontrib-applehelp @ https://files.pythonhosted.org/packages/5d/85/9ebeae2f76e9e77b952f4b274c27238156eae7979c5421fba91a28f4970d/sphinxcontrib_applehelp-2.0.0-py3-none-any.whl#sha256=4cd3f0ec4ac5dd9c17ec65e9ab272c9b867ea77425228e68ecf08d6b28ddbdb5 # pip sphinxcontrib-devhelp @ https://files.pythonhosted.org/packages/35/7a/987e583882f985fe4d7323774889ec58049171828b58c2217e7f79cdf44e/sphinxcontrib_devhelp-2.0.0-py3-none-any.whl#sha256=aefb8b83854e4b0998877524d1029fd3e6879210422ee3780459e28a1f03a8a2 # pip sphinxcontrib-htmlhelp @ https://files.pythonhosted.org/packages/0a/7b/18a8c0bcec9182c05a0b3ec2a776bba4ead82750a55ff798e8d406dae604/sphinxcontrib_htmlhelp-2.1.0-py3-none-any.whl#sha256=166759820b47002d22914d64a075ce08f4c46818e17cfc9470a9786b759b19f8 From 4c453e95b3162579ac5bc6e0cd7c0ba32c02a16a Mon Sep 17 00:00:00 2001 From: scikit-learn-bot Date: Mon, 12 May 2025 11:25:40 +0200 Subject: [PATCH 151/182] :lock: :robot: CI Update lock files for main CI build(s) :lock: :robot: (#31355) Co-authored-by: Lock file bot --- build_tools/azure/debian_32bit_lock.txt | 2 +- ...latest_conda_forge_mkl_linux-64_conda.lock | 74 +++++++++---------- ...pylatest_conda_forge_mkl_osx-64_conda.lock | 23 +++--- ...test_conda_mkl_no_openmp_osx-64_conda.lock | 2 +- ...st_pip_openblas_pandas_linux-64_conda.lock | 12 +-- .../pymin_conda_forge_mkl_win-64_conda.lock | 29 ++++---- ...nblas_min_dependencies_linux-64_conda.lock | 40 +++++----- ...e_openblas_ubuntu_2204_linux-64_conda.lock | 30 ++++---- build_tools/azure/ubuntu_atlas_lock.txt | 4 +- build_tools/circle/doc_linux-64_conda.lock | 56 +++++++------- .../doc_min_dependencies_linux-64_conda.lock | 56 +++++++------- ...n_conda_forge_arm_linux-aarch64_conda.lock | 43 ++++++----- 12 files changed, 187 insertions(+), 184 deletions(-) diff --git a/build_tools/azure/debian_32bit_lock.txt b/build_tools/azure/debian_32bit_lock.txt index 8a6f9762399ca..983c730d920fd 100644 --- a/build_tools/azure/debian_32bit_lock.txt +++ b/build_tools/azure/debian_32bit_lock.txt @@ -6,7 +6,7 @@ # coverage[toml]==7.8.0 # via pytest-cov -cython==3.0.12 +cython==3.1.0 # via -r build_tools/azure/debian_32bit_requirements.txt iniconfig==2.1.0 # via pytest diff --git a/build_tools/azure/pylatest_conda_forge_mkl_linux-64_conda.lock b/build_tools/azure/pylatest_conda_forge_mkl_linux-64_conda.lock index 78f45bec169ac..67a9fef5b21a8 100644 --- a/build_tools/azure/pylatest_conda_forge_mkl_linux-64_conda.lock +++ b/build_tools/azure/pylatest_conda_forge_mkl_linux-64_conda.lock @@ -20,7 +20,7 @@ https://conda.anaconda.org/conda-forge/linux-64/_openmp_mutex-4.5-3_kmp_llvm.con https://conda.anaconda.org/conda-forge/noarch/fonts-conda-ecosystem-1-0.tar.bz2#fee5683a3f04bd15cbd8318b096a27ab https://conda.anaconda.org/conda-forge/linux-64/libegl-1.7.0-ha4b6fd6_2.conda#c151d5eb730e9b7480e6d48c0fc44048 https://conda.anaconda.org/conda-forge/linux-64/libopengl-1.7.0-ha4b6fd6_2.conda#7df50d44d4a14d6c31a2c54f2cd92157 -https://conda.anaconda.org/conda-forge/linux-64/libgcc-14.2.0-h767d61c_2.conda#ef504d1acbd74b7cc6849ef8af47dd03 +https://conda.anaconda.org/conda-forge/linux-64/libgcc-15.1.0-h767d61c_2.conda#ea8ac52380885ed41c1baa8f1d6d2b93 https://conda.anaconda.org/conda-forge/linux-64/alsa-lib-1.2.14-hb9d3cd8_0.conda#76df83c2a9035c54df5d04ff81bcc02d https://conda.anaconda.org/conda-forge/linux-64/aws-c-common-0.12.2-hb9d3cd8_0.conda#bd52f376d1d34d7823a7bf0773be86e8 https://conda.anaconda.org/conda-forge/linux-64/c-ares-1.34.5-hb9d3cd8_0.conda#f7f0d6cc2dc986d42ac2689ec88192be @@ -28,13 +28,13 @@ https://conda.anaconda.org/conda-forge/linux-64/libbrotlicommon-1.1.0-hb9d3cd8_2 https://conda.anaconda.org/conda-forge/linux-64/libdeflate-1.23-h86f0d12_0.conda#27fe770decaf469a53f3e3a6d593067f https://conda.anaconda.org/conda-forge/linux-64/libexpat-2.7.0-h5888daf_0.conda#db0bfbe7dd197b68ad5f30333bae6ce0 https://conda.anaconda.org/conda-forge/linux-64/libffi-3.4.6-h2dba641_1.conda#ede4673863426c0883c0063d853bbd85 -https://conda.anaconda.org/conda-forge/linux-64/libgcc-ng-14.2.0-h69a702a_2.conda#a2222a6ada71fb478682efe483ce0f92 -https://conda.anaconda.org/conda-forge/linux-64/libgfortran5-14.2.0-hf1ad2bd_2.conda#556a4fdfac7287d349b8f09aba899693 +https://conda.anaconda.org/conda-forge/linux-64/libgcc-ng-15.1.0-h69a702a_2.conda#ddca86c7040dd0e73b2b69bd7833d225 +https://conda.anaconda.org/conda-forge/linux-64/libgfortran5-15.1.0-hcea5267_2.conda#01de444988ed960031dbe84cf4f9b1fc https://conda.anaconda.org/conda-forge/linux-64/libiconv-1.18-h4ce23a2_1.conda#e796ff8ddc598affdf7c173d6145f087 https://conda.anaconda.org/conda-forge/linux-64/libjpeg-turbo-3.1.0-hb9d3cd8_0.conda#9fa334557db9f63da6c9285fd2a48638 https://conda.anaconda.org/conda-forge/linux-64/liblzma-5.8.1-hb9d3cd8_1.conda#a76fd702c93cd2dfd89eff30a5fd45a8 https://conda.anaconda.org/conda-forge/linux-64/libntlm-1.8-hb9d3cd8_0.conda#7c7927b404672409d9917d49bff5f2d6 -https://conda.anaconda.org/conda-forge/linux-64/libstdcxx-14.2.0-h8f9b012_2.conda#a78c856b6dc6bf4ea8daeb9beaaa3fb0 +https://conda.anaconda.org/conda-forge/linux-64/libstdcxx-15.1.0-h8f9b012_2.conda#1cb1c67961f6dd257eae9e9691b341aa https://conda.anaconda.org/conda-forge/linux-64/libutf8proc-2.10.0-h4c51ac1_0.conda#aeccfff2806ae38430638ffbb4be9610 https://conda.anaconda.org/conda-forge/linux-64/libuv-1.50.0-hb9d3cd8_0.conda#771ee65e13bc599b0b62af5359d80169 https://conda.anaconda.org/conda-forge/linux-64/libwebp-base-1.5.0-h851e524_0.conda#63f790534398730f59e1b899c3644d4a @@ -61,28 +61,27 @@ https://conda.anaconda.org/conda-forge/linux-64/libbrotlienc-1.1.0-hb9d3cd8_2.co https://conda.anaconda.org/conda-forge/linux-64/libedit-3.1.20250104-pl5321h7949ede_0.conda#c277e0a4d549b03ac1e9d6cbbe3d017b https://conda.anaconda.org/conda-forge/linux-64/libev-4.33-hd590300_2.conda#172bf1cd1ff8629f2b1179945ed45055 https://conda.anaconda.org/conda-forge/linux-64/libevent-2.1.12-hf998b51_1.conda#a1cfcc585f0c42bf8d5546bb1dfb668d -https://conda.anaconda.org/conda-forge/linux-64/libgfortran-14.2.0-h69a702a_2.conda#fb54c4ea68b460c278d26eea89cfbcc3 +https://conda.anaconda.org/conda-forge/linux-64/libgfortran-15.1.0-h69a702a_2.conda#f92e6e0a3c0c0c85561ef61aa59d555d https://conda.anaconda.org/conda-forge/linux-64/libmpdec-4.0.0-h4bc722e_0.conda#aeb98fdeb2e8f25d43ef71fbacbeec80 https://conda.anaconda.org/conda-forge/linux-64/libpciaccess-0.18-hd590300_0.conda#48f4330bfcd959c3cfb704d424903c82 https://conda.anaconda.org/conda-forge/linux-64/libpng-1.6.47-h943b412_0.conda#55199e2ae2c3651f6f9b2a447b47bdc9 -https://conda.anaconda.org/conda-forge/linux-64/libsqlite-3.49.1-hee588c1_2.conda#962d6ac93c30b1dfc54c9cccafd1003e +https://conda.anaconda.org/conda-forge/linux-64/libsqlite-3.49.2-hee588c1_0.conda#93048463501053a00739215ea3f36324 https://conda.anaconda.org/conda-forge/linux-64/libssh2-1.11.1-hcf80075_0.conda#eecce068c7e4eddeb169591baac20ac4 -https://conda.anaconda.org/conda-forge/linux-64/libstdcxx-ng-14.2.0-h4852527_2.conda#c75da67f045c2627f59e6fcb5f4e3a9b +https://conda.anaconda.org/conda-forge/linux-64/libstdcxx-ng-15.1.0-h4852527_2.conda#9d2072af184b5caa29492bf2344597bb https://conda.anaconda.org/conda-forge/linux-64/libuuid-2.38.1-h0b41bf4_0.conda#40b61aab5c7ba9ff276c41cfffe6b80b https://conda.anaconda.org/conda-forge/linux-64/libxcb-1.17.0-h8a09558_0.conda#92ed62436b625154323d40d5f2f11dd7 https://conda.anaconda.org/conda-forge/linux-64/lz4-c-1.10.0-h5888daf_1.conda#9de5350a85c4a20c685259b889aa6393 -https://conda.anaconda.org/conda-forge/linux-64/mysql-common-9.2.0-h266115a_0.conda#db22a0962c953e81a2a679ecb1fc6027 https://conda.anaconda.org/conda-forge/linux-64/ninja-1.12.1-hff21bea_1.conda#2322531904f27501ee19847b87ba7c64 https://conda.anaconda.org/conda-forge/linux-64/pixman-0.46.0-h29eaf8c_0.conda#d2f1c87d4416d1e7344cf92b1aaee1c4 https://conda.anaconda.org/conda-forge/linux-64/readline-8.2-h8c095d6_2.conda#283b96675859b20a825f8fa30f311446 -https://conda.anaconda.org/conda-forge/linux-64/s2n-1.5.17-hba75a32_0.conda#dbb899164b5451c34969e67a35ca17a9 +https://conda.anaconda.org/conda-forge/linux-64/s2n-1.5.18-h763c568_1.conda#0bf75253494a85260575e23c3b29db90 https://conda.anaconda.org/conda-forge/linux-64/sleef-3.8-h1b44611_0.conda#aec4dba5d4c2924730088753f6fa164b https://conda.anaconda.org/conda-forge/linux-64/snappy-1.2.1-h8bd8927_1.conda#3b3e64af585eadfb52bb90b553db5edf https://conda.anaconda.org/conda-forge/linux-64/tk-8.6.13-noxft_h4845f30_101.conda#d453b98d9c83e71da0741bb0ff4d76bc https://conda.anaconda.org/conda-forge/linux-64/wayland-1.23.1-h3e06ad9_1.conda#a37843723437ba75f42c9270ffe800b1 https://conda.anaconda.org/conda-forge/linux-64/zlib-1.3.1-hb9d3cd8_2.conda#c9f075ab2f33b3bbee9e62d4ad0a6cd8 https://conda.anaconda.org/conda-forge/linux-64/zstd-1.5.7-hb8e6e7a_2.conda#6432cb5d4ac0046c3ac0a8a0f95842f9 -https://conda.anaconda.org/conda-forge/linux-64/aws-c-io-0.18.1-h1a9f769_2.conda#19221489bff45371c13b983848f79a24 +https://conda.anaconda.org/conda-forge/linux-64/aws-c-io-0.19.0-h756d8c7_1.conda#35ffc73105ad0bdb8e5c2555f4a3c5d6 https://conda.anaconda.org/conda-forge/linux-64/brotli-bin-1.1.0-hb9d3cd8_2.conda#c63b5e52939e795ba8d26e35d767a843 https://conda.anaconda.org/conda-forge/linux-64/glog-0.7.1-hbabe93e_0.conda#ff862eebdfeb2fd048ae9dc92510baca https://conda.anaconda.org/conda-forge/linux-64/gmp-6.3.0-hac33072_2.conda#c94a5994ef49749880a8139cf9afcbe1 @@ -92,13 +91,12 @@ https://conda.anaconda.org/conda-forge/linux-64/krb5-1.21.3-h659f571_0.conda#3f4 https://conda.anaconda.org/conda-forge/linux-64/libcrc32c-1.1.2-h9c3ff4c_0.tar.bz2#c965a5aa0d5c1c37ffc62dff36e28400 https://conda.anaconda.org/conda-forge/linux-64/libdrm-2.4.124-hb9d3cd8_0.conda#8bc89311041d7fcb510238cf0848ccae https://conda.anaconda.org/conda-forge/linux-64/libfreetype6-2.13.3-h48d6fc4_1.conda#3c255be50a506c50765a93a6644f32fe -https://conda.anaconda.org/conda-forge/linux-64/libgfortran-ng-14.2.0-h69a702a_2.conda#4056c857af1a99ee50589a941059ec55 +https://conda.anaconda.org/conda-forge/linux-64/libgfortran-ng-15.1.0-h69a702a_2.conda#a483a87b71e974bb75d1b9413d4436dd https://conda.anaconda.org/conda-forge/linux-64/libnghttp2-1.64.0-h161d5f1_0.conda#19e57602824042dfd0446292ef90488b https://conda.anaconda.org/conda-forge/linux-64/libprotobuf-5.29.3-h501fc15_1.conda#edb86556cf4a0c133e7932a1597ff236 https://conda.anaconda.org/conda-forge/linux-64/libre2-11-2024.07.02-hba17884_3.conda#545e93a513c10603327c76c15485e946 https://conda.anaconda.org/conda-forge/linux-64/libthrift-0.21.0-h0e7cc3e_0.conda#dcb95c0a98ba9ff737f7ae482aef7833 https://conda.anaconda.org/conda-forge/linux-64/libtiff-4.7.0-hd9ff511_4.conda#6c1028898cf3a2032d9af46689e1b81a -https://conda.anaconda.org/conda-forge/linux-64/mysql-libs-9.2.0-he0572af_0.conda#93340b072c393d23c4700a1d40565dca https://conda.anaconda.org/conda-forge/linux-64/pcre2-10.44-hc749103_2.conda#31614c73d7b103ef76faa4d83d261d34 https://conda.anaconda.org/conda-forge/linux-64/python-3.13.3-hf636f53_101_cp313.conda#10622e12d649154af0bd76bcf33a7c5c https://conda.anaconda.org/conda-forge/linux-64/qhull-2020.2-h434a139_5.conda#353823361b1d27eb3960efb076dfcaf6 @@ -108,15 +106,14 @@ https://conda.anaconda.org/conda-forge/linux-64/xcb-util-renderutil-0.3.10-hb711 https://conda.anaconda.org/conda-forge/linux-64/xcb-util-wm-0.4.2-hb711507_0.conda#608e0ef8256b81d04456e8d211eee3e8 https://conda.anaconda.org/conda-forge/linux-64/xorg-libsm-1.2.6-he73a12e_0.conda#1c74ff8c35dcadf952a16f752ca5aa49 https://conda.anaconda.org/conda-forge/linux-64/xorg-libx11-1.8.12-h4f16b4b_0.conda#db038ce880f100acc74dba10302b5630 -https://conda.anaconda.org/conda-forge/linux-64/aws-c-event-stream-0.5.4-hc5e5e9e_7.conda#eb339cb6cd7c881b3f0e7910e99c261b -https://conda.anaconda.org/conda-forge/linux-64/aws-c-http-0.10.0-h6884c39_0.conda#76a0f88aeb377e0eee84d48ac65ca747 +https://conda.anaconda.org/conda-forge/linux-64/aws-c-event-stream-0.5.4-h9312af0_8.conda#32789e527d9a9ca6fd71f463df708188 +https://conda.anaconda.org/conda-forge/linux-64/aws-c-http-0.10.1-hc373b34_0.conda#ce674c8395070748d89f0f907a6caa59 https://conda.anaconda.org/conda-forge/linux-64/brotli-1.1.0-hb9d3cd8_2.conda#98514fe74548d768907ce7a13f680e8f https://conda.anaconda.org/conda-forge/noarch/colorama-0.4.6-pyhd8ed1ab_1.conda#962b9857ee8e7018c22f2776ffa0b2d7 https://conda.anaconda.org/conda-forge/noarch/cpython-3.13.3-py313hd8ed1ab_101.conda#904a822cbd380adafb9070debf8579a8 https://conda.anaconda.org/conda-forge/noarch/cycler-0.12.1-pyhd8ed1ab_1.conda#44600c4667a319d67dbe0681fc0bc833 https://conda.anaconda.org/conda-forge/linux-64/cyrus-sasl-2.1.27-h54b06d7_7.conda#dce22f70b4e5a407ce88f2be046f4ceb -https://conda.anaconda.org/conda-forge/linux-64/cython-3.0.12-py313h5dec8f5_0.conda#24a42a0c1cc33743e33572d63d489b54 -https://conda.anaconda.org/conda-forge/noarch/exceptiongroup-1.2.2-pyhd8ed1ab_1.conda#a16662747cdeb9abbac74d0057cc976e +https://conda.anaconda.org/conda-forge/linux-64/cython-3.1.0-py313h5dec8f5_0.conda#43ede3c67f0001ebc9dbf9a5e5e2b218 https://conda.anaconda.org/conda-forge/noarch/execnet-2.1.1-pyhd8ed1ab_1.conda#a71efeae2c160f6789900ba2631a2c90 https://conda.anaconda.org/conda-forge/noarch/filelock-3.18.0-pyhd8ed1ab_0.conda#4547b39256e296bb758166893e909a7c https://conda.anaconda.org/conda-forge/noarch/fsspec-2025.3.2-pyhd8ed1ab_0.conda#9c40692c3d24c7aaf335f673ac09d308 @@ -129,7 +126,7 @@ https://conda.anaconda.org/conda-forge/linux-64/libfreetype-2.13.3-ha770c72_1.co https://conda.anaconda.org/conda-forge/linux-64/libglib-2.84.1-h2ff4ddf_0.conda#0305434da649d4fb48a425e588b79ea6 https://conda.anaconda.org/conda-forge/linux-64/libglx-1.7.0-ha4b6fd6_2.conda#c8013e438185f33b13814c5c488acd5c https://conda.anaconda.org/conda-forge/linux-64/libhiredis-1.0.2-h2cc385e_0.tar.bz2#b34907d3a81a3cd8095ee83d174c074a -https://conda.anaconda.org/conda-forge/linux-64/libxml2-2.13.7-h4bc477f_1.conda#ad1f1f8238834cd3c88ceeaee8da444a +https://conda.anaconda.org/conda-forge/linux-64/libxml2-2.13.8-h4bc477f_0.conda#14dbe05b929e329dbaa6f2d0aa19466d https://conda.anaconda.org/conda-forge/linux-64/markupsafe-3.0.2-py313h8060acc_1.conda#21b62c55924f01b6eef6827167b46acb https://conda.anaconda.org/conda-forge/noarch/meson-1.8.0-pyh29332c3_0.conda#8e25221b702272394b86b0f4d7217f77 https://conda.anaconda.org/conda-forge/linux-64/mpfr-4.2.1-h90cbb55_3.conda#2eeb50cab6652538eee8fc0bc3340c81 @@ -137,7 +134,7 @@ https://conda.anaconda.org/conda-forge/noarch/mpmath-1.3.0-pyhd8ed1ab_1.conda#35 https://conda.anaconda.org/conda-forge/noarch/munkres-1.1.4-pyh9f0ad1d_0.tar.bz2#2ba8498c1018c1e9c61eb99b973dfe19 https://conda.anaconda.org/conda-forge/noarch/networkx-3.4.2-pyh267e887_2.conda#fd40bf7f7f4bc4b647dc8512053d9873 https://conda.anaconda.org/conda-forge/linux-64/openjpeg-2.5.3-h5fbd93e_0.conda#9e5816bc95d285c115a3ebc2f8563564 -https://conda.anaconda.org/conda-forge/linux-64/orc-2.1.1-h17f744e_1.conda#cfe9bc267c22b6d53438eff187649d43 +https://conda.anaconda.org/conda-forge/linux-64/orc-2.1.2-h17f744e_0.conda#ef7f9897a244b2023a066c22a1089ce4 https://conda.anaconda.org/conda-forge/noarch/packaging-25.0-pyh29332c3_1.conda#58335b26c38bf4a20f399384c33cbcf9 https://conda.anaconda.org/conda-forge/noarch/pip-25.1.1-pyh145f28c_0.conda#01384ff1639c6330a0924791413b8714 https://conda.anaconda.org/conda-forge/noarch/pluggy-1.5.0-pyhd8ed1ab_1.conda#e9dcbce5f45f9ee500e728ae58b605b6 @@ -158,13 +155,14 @@ https://conda.anaconda.org/conda-forge/linux-64/xkeyboard-config-2.44-hb9d3cd8_0 https://conda.anaconda.org/conda-forge/linux-64/xorg-libxext-1.3.6-hb9d3cd8_0.conda#febbab7d15033c913d53c7a2c102309d https://conda.anaconda.org/conda-forge/linux-64/xorg-libxfixes-6.0.1-hb9d3cd8_0.conda#4bdb303603e9821baf5fe5fdff1dc8f8 https://conda.anaconda.org/conda-forge/linux-64/xorg-libxrender-0.9.12-hb9d3cd8_0.conda#96d57aba173e878a2089d5638016dc5e -https://conda.anaconda.org/conda-forge/linux-64/aws-c-auth-0.9.0-h9a6e2ae_4.conda#a948110dbbde6491c62815643a96d589 -https://conda.anaconda.org/conda-forge/linux-64/aws-c-mqtt-0.12.3-hef6a231_4.conda#fd1d89d79c8287e6bcb2a529292f537a +https://conda.anaconda.org/conda-forge/linux-64/aws-c-auth-0.9.0-h66f1c83_6.conda#08e6c1487ed4a40ee2771c760020bdf4 +https://conda.anaconda.org/conda-forge/linux-64/aws-c-mqtt-0.13.0-h034c9a0_2.conda#c5fe6225b205100049d90afbfc000dd1 https://conda.anaconda.org/conda-forge/linux-64/azure-core-cpp-1.14.0-h5cfcd09_0.conda#0a8838771cc2e985cd295e01ae83baf1 https://conda.anaconda.org/conda-forge/linux-64/ccache-4.11.3-h80c52d3_0.conda#eb517c6a2b960c3ccb6f1db1005f063a https://conda.anaconda.org/conda-forge/linux-64/coverage-7.8.0-py313h8060acc_0.conda#375064d30e709bf7c1d4580e70aaea61 https://conda.anaconda.org/conda-forge/linux-64/dbus-1.13.6-h5008d03_3.tar.bz2#ecfff944ba3960ecb334b9a2663d708d -https://conda.anaconda.org/conda-forge/linux-64/fonttools-4.57.0-py313h8060acc_0.conda#76b3a3367ac578a7cc43f4b7814e7e87 +https://conda.anaconda.org/conda-forge/noarch/exceptiongroup-1.3.0-pyhd8ed1ab_0.conda#72e42d28960d875c7654614f8b50939a +https://conda.anaconda.org/conda-forge/linux-64/fonttools-4.58.0-py313h8060acc_0.conda#0bf58a605826e69e1c6b28f35f83ea32 https://conda.anaconda.org/conda-forge/linux-64/freetype-2.13.3-ha770c72_1.conda#9ccd736d31e0c6e41f54e704e5312811 https://conda.anaconda.org/conda-forge/noarch/jinja2-3.1.6-pyhd8ed1ab_0.conda#446bd6c8cb26050d528881df495ce646 https://conda.anaconda.org/conda-forge/noarch/joblib-1.5.0-pyhd8ed1ab_0.conda#3d7257f0a61c9aa4ffa3e324a887416b @@ -176,10 +174,10 @@ https://conda.anaconda.org/conda-forge/linux-64/libxkbcommon-1.9.2-h65c71a3_0.co https://conda.anaconda.org/conda-forge/linux-64/libxslt-1.1.39-h76b75d6_0.conda#e71f31f8cfb0a91439f2086fc8aa0461 https://conda.anaconda.org/conda-forge/linux-64/mpc-1.3.1-h24ddda3_1.conda#aa14b9a5196a6d8dd364164b7ce56acf https://conda.anaconda.org/conda-forge/linux-64/openldap-2.6.9-he970967_0.conda#ca2de8bbdc871bce41dbf59e51324165 +https://conda.anaconda.org/conda-forge/linux-64/pillow-11.2.1-py313h8db990d_0.conda#91b00afee98d72d29dc3d1c1ab0008d7 https://conda.anaconda.org/conda-forge/linux-64/prometheus-cpp-1.3.0-ha5d0236_0.conda#a83f6a2fdc079e643237887a37460668 https://conda.anaconda.org/conda-forge/noarch/pybind11-2.13.6-pyh1ec8472_2.conda#8088a5e7b2888c780738c3130f2a969d https://conda.anaconda.org/conda-forge/noarch/pyproject-metadata-0.9.1-pyhd8ed1ab_0.conda#22ae7c6ea81e0c8661ef32168dda929b -https://conda.anaconda.org/conda-forge/noarch/pytest-8.3.5-pyhd8ed1ab_0.conda#c3c9316209dec74a705a36797970c6be https://conda.anaconda.org/conda-forge/noarch/python-dateutil-2.9.0.post0-pyhff2d567_1.conda#5ba79d7c71f03c678c8ead841f347d6e https://conda.anaconda.org/conda-forge/noarch/python-gil-3.13.3-h4df99d1_101.conda#82c2641f2f0f513f7d2d1b847a2588e3 https://conda.anaconda.org/conda-forge/noarch/typing-extensions-4.13.2-h0e9735f_0.conda#568ed1300869dca0ba09fb750cda5dbb @@ -191,7 +189,7 @@ https://conda.anaconda.org/conda-forge/linux-64/xorg-libxi-1.8.2-hb9d3cd8_0.cond https://conda.anaconda.org/conda-forge/linux-64/xorg-libxrandr-1.5.4-hb9d3cd8_0.conda#2de7f99d6581a4a7adbff607b5c278ca https://conda.anaconda.org/conda-forge/linux-64/xorg-libxxf86vm-1.1.6-hb9d3cd8_0.conda#5efa5fa6243a622445fdfd72aee15efa https://conda.anaconda.org/conda-forge/noarch/_python_abi3_support-1.0-hd8ed1ab_2.conda#aaa2a381ccc56eac91d63b6c1240312f -https://conda.anaconda.org/conda-forge/linux-64/aws-c-s3-0.7.16-h7dfd680_1.conda#d8870015dbf8a8bb44832f4c330bf044 +https://conda.anaconda.org/conda-forge/linux-64/aws-c-s3-0.7.17-h73c4702_1.conda#7283d4d0d39d97dcb5ef06412375478f https://conda.anaconda.org/conda-forge/linux-64/azure-identity-cpp-1.10.0-h113e628_0.conda#73f73f60854f325a55f1d31459f2ab73 https://conda.anaconda.org/conda-forge/linux-64/azure-storage-common-cpp-12.8.0-h736e048_1.conda#13de36be8de3ae3f05ba127631599213 https://conda.anaconda.org/conda-forge/linux-64/fontconfig-2.15.0-h7e30c49_1.conda#8f5b0b297b59e1ac160ad4beec99dbee @@ -200,32 +198,32 @@ https://conda.anaconda.org/conda-forge/linux-64/libclang-cpp20.1-20.1.4-default_ https://conda.anaconda.org/conda-forge/linux-64/libclang13-20.1.4-default_he06ed0a_0.conda#2d933632c8004be47deb2be61bf013be https://conda.anaconda.org/conda-forge/linux-64/libgoogle-cloud-2.36.0-hc4361e1_1.conda#ae36e6296a8dd8e8a9a8375965bf6398 https://conda.anaconda.org/conda-forge/linux-64/libopentelemetry-cpp-1.20.0-hd1b1c89_0.conda#e1185384cc23e3bbf85486987835df94 -https://conda.anaconda.org/conda-forge/linux-64/libpq-17.4-h27ae623_1.conda#37fba334855ef3b51549308e61ed7a3d +https://conda.anaconda.org/conda-forge/linux-64/libpq-17.5-h27ae623_0.conda#6458be24f09e1b034902ab44fe9de908 https://conda.anaconda.org/conda-forge/noarch/meson-python-0.18.0-pyh70fd9c4_0.conda#576c04b9d9f8e45285fb4d9452c26133 https://conda.anaconda.org/conda-forge/linux-64/optree-0.15.0-py313h33d0bda_0.conda#151f92ff0806c7c700419c8b8cf7cb4b -https://conda.anaconda.org/conda-forge/linux-64/pillow-11.1.0-py313h8db990d_0.conda#1e86810c6c3fb6d6aebdba26564eb2e8 -https://conda.anaconda.org/conda-forge/noarch/pytest-cov-6.1.1-pyhd8ed1ab_0.conda#1e35d8f975bc0e984a19819aa91c440a -https://conda.anaconda.org/conda-forge/noarch/pytest-xdist-3.6.1-pyhd8ed1ab_1.conda#59aad4fb37cabc0bacc73cf344612ddd +https://conda.anaconda.org/conda-forge/noarch/pytest-8.3.5-pyhd8ed1ab_0.conda#c3c9316209dec74a705a36797970c6be https://conda.anaconda.org/conda-forge/linux-64/tbb-2021.13.0-hceb3a55_1.conda#ba7726b8df7b9d34ea80e82b097a4893 https://conda.anaconda.org/conda-forge/linux-64/xorg-libxtst-1.2.5-hb9d3cd8_3.conda#7bbe9a0cc0df0ac5f5a8ad6d6a11af2f -https://conda.anaconda.org/conda-forge/linux-64/aws-crt-cpp-0.32.4-h0cee55f_2.conda#bc519b9909ef60e85ef2d59cd9542a0f +https://conda.anaconda.org/conda-forge/linux-64/aws-crt-cpp-0.32.5-h5e5e39d_2.conda#70ae8529a42baa6fdac9e037b6ccc0c3 https://conda.anaconda.org/conda-forge/linux-64/azure-storage-blobs-cpp-12.13.0-h3cf044e_1.conda#7eb66060455c7a47d9dcdbfa9f46579b https://conda.anaconda.org/conda-forge/linux-64/cairo-1.18.4-h3394656_0.conda#09262e66b19567aff4f592fb53b28760 https://conda.anaconda.org/conda-forge/linux-64/libgoogle-cloud-storage-2.36.0-h0121fbd_1.conda#a0f7588c1f0a26d550e7bae4fb49427a https://conda.anaconda.org/conda-forge/linux-64/mkl-2024.2.2-ha957f24_16.conda#1459379c79dda834673426504d52b319 +https://conda.anaconda.org/conda-forge/noarch/pytest-cov-6.1.1-pyhd8ed1ab_0.conda#1e35d8f975bc0e984a19819aa91c440a +https://conda.anaconda.org/conda-forge/noarch/pytest-xdist-3.6.1-pyhd8ed1ab_1.conda#59aad4fb37cabc0bacc73cf344612ddd https://conda.anaconda.org/conda-forge/noarch/sympy-1.14.0-pyh2585a3b_105.conda#8c09fac3785696e1c477156192d64b91 -https://conda.anaconda.org/conda-forge/linux-64/aws-sdk-cpp-1.11.510-h5b777a2_6.conda#2fd0b0d4cc7fc86024b2965feedd628a +https://conda.anaconda.org/conda-forge/linux-64/aws-sdk-cpp-1.11.510-h7cc6b5f_7.conda#35c4d2ece6b4b098501e595f04250bee https://conda.anaconda.org/conda-forge/linux-64/azure-storage-files-datalake-cpp-12.12.0-ha633028_1.conda#7c1980f89dd41b097549782121a73490 https://conda.anaconda.org/conda-forge/linux-64/harfbuzz-11.1.0-h3beb420_0.conda#95e3bb97f9cdc251c0c68640e9c10ed3 https://conda.anaconda.org/conda-forge/linux-64/libblas-3.9.0-31_hfdb39a5_mkl.conda#bdf4a57254e8248222cb631db4393ff1 https://conda.anaconda.org/conda-forge/linux-64/mkl-devel-2024.2.2-ha770c72_16.conda#140891ea14285fc634353b31e9e40a95 -https://conda.anaconda.org/conda-forge/linux-64/libarrow-20.0.0-h27f8bab_0_cpu.conda#6dacb4d072204ce0fd13835759418872 +https://conda.anaconda.org/conda-forge/linux-64/libarrow-20.0.0-hebdba27_3_cpu.conda#5be86a1b5f496f82c7dfeb0dbe19ef03 https://conda.anaconda.org/conda-forge/linux-64/libcblas-3.9.0-31_h372d94f_mkl.conda#2a06a6c16b45bd3d10002927ca204b67 https://conda.anaconda.org/conda-forge/linux-64/liblapack-3.9.0-31_hc41d3b0_mkl.conda#10d012ddd7cc1c7ff9093d4974a34e53 -https://conda.anaconda.org/conda-forge/linux-64/qt6-main-6.9.0-h6441bc3_1.conda#4029a8dcb1d97ea241dbe5abfda1fad6 -https://conda.anaconda.org/conda-forge/linux-64/libarrow-acero-20.0.0-hcb10f89_0_cpu.conda#025bf09c4f59e6f5d9a6a4b82dd5894f +https://conda.anaconda.org/conda-forge/linux-64/qt6-main-6.9.0-h8d00660_2.conda#ac0eb548e24a2cb3c2c8ba060aef7db2 +https://conda.anaconda.org/conda-forge/linux-64/libarrow-acero-20.0.0-hcb10f89_3_cpu.conda#679cd6bb558cd6565d98ad66af6ff6ed https://conda.anaconda.org/conda-forge/linux-64/liblapacke-3.9.0-31_hbc6e62b_mkl.conda#562026e418363dc346ad5a9e18cce73c -https://conda.anaconda.org/conda-forge/linux-64/libparquet-20.0.0-h081d1f1_0_cpu.conda#4ad62607dd9f9902e0bd3d91c5bbce58 +https://conda.anaconda.org/conda-forge/linux-64/libparquet-20.0.0-h081d1f1_3_cpu.conda#f15cc1214c08019be884e3defd93e000 https://conda.anaconda.org/conda-forge/linux-64/libtorch-2.7.0-cpu_mkl_hf6ddc5a_100.conda#6bdda0b10852c6d03b030bab7ec251f0 https://conda.anaconda.org/conda-forge/linux-64/numpy-2.2.5-py313h17eae1a_0.conda#6ceeff9ed72e54e4a2f9a1c88f47bdde https://conda.anaconda.org/conda-forge/linux-64/pyarrow-core-20.0.0-py313he5f92c8_0_cpu.conda#2afdef63d9fbc2cd0e52f8e8f3472404 @@ -233,16 +231,16 @@ https://conda.anaconda.org/conda-forge/linux-64/pyside6-6.9.0-py313h5f61773_0.co https://conda.anaconda.org/conda-forge/noarch/array-api-strict-2.3.1-pyhd8ed1ab_0.conda#11107d0aeb8c590a34fee0894909816b https://conda.anaconda.org/conda-forge/linux-64/blas-devel-3.9.0-31_hcf00494_mkl.conda#368c93bde87a67d24a74de15bf4c49fd https://conda.anaconda.org/conda-forge/linux-64/contourpy-1.3.2-py313h33d0bda_0.conda#5dc81fffe102f63045225007a33d6199 -https://conda.anaconda.org/conda-forge/linux-64/libarrow-dataset-20.0.0-hcb10f89_0_cpu.conda#ebdbd9d4522b4106246866054f7520bf +https://conda.anaconda.org/conda-forge/linux-64/libarrow-dataset-20.0.0-hcb10f89_3_cpu.conda#0e84685fdecbd83666dd73292cc7d05a https://conda.anaconda.org/conda-forge/linux-64/pandas-2.2.3-py313ha87cce1_3.conda#6248b529e537b1d4cb5ab3ef7f537795 -https://conda.anaconda.org/conda-forge/linux-64/polars-1.27.1-py39h2a4a510_3.conda#fba08963eaa1f954480045d033d1221e +https://conda.anaconda.org/conda-forge/linux-64/polars-1.29.0-py39h441220d_0.conda#6be2bbd70bf401a6f59952ba1355d8b8 https://conda.anaconda.org/conda-forge/linux-64/pytorch-2.7.0-cpu_mkl_py313_hea9ba1b_100.conda#3c2ce6a304aa827f1e3cc21f7df9190d https://conda.anaconda.org/conda-forge/linux-64/scipy-1.15.2-py313h86fcf2b_0.conda#ca68acd9febc86448eeed68d0c6c8643 https://conda.anaconda.org/conda-forge/noarch/scipy-doctest-1.7.1-pyh29332c3_0.conda#d3b3b7b88385648eff6ae39694692f27 https://conda.anaconda.org/conda-forge/linux-64/blas-2.131-mkl.conda#9bb865b7e01104255ca54e61a58ded15 -https://conda.anaconda.org/conda-forge/linux-64/libarrow-substrait-20.0.0-h1bed206_0_cpu.conda#1763dd016d6eee48e2bb29382f8d1562 -https://conda.anaconda.org/conda-forge/linux-64/matplotlib-base-3.10.1-py313h129903b_0.conda#4e23b3fabf434b418e0d9c6975a6453f +https://conda.anaconda.org/conda-forge/linux-64/libarrow-substrait-20.0.0-h1bed206_3_cpu.conda#c4d2a874f1ca439fb3c2a17060d6b911 +https://conda.anaconda.org/conda-forge/linux-64/matplotlib-base-3.10.3-py313h129903b_0.conda#4f8816d006b1c155ec416bcf7ff6cee2 https://conda.anaconda.org/conda-forge/linux-64/pyamg-5.2.1-py313hf0ab243_1.conda#4c769bf3858f424cb2ecf952175ec600 https://conda.anaconda.org/conda-forge/linux-64/pytorch-cpu-2.7.0-cpu_mkl_hc60beec_100.conda#20b3051f55ad823a27818dfa46a41c8f -https://conda.anaconda.org/conda-forge/linux-64/matplotlib-3.10.1-py313h78bf25f_0.conda#d0c80dea550ca97fc0710b2ecef919ba +https://conda.anaconda.org/conda-forge/linux-64/matplotlib-3.10.3-py313h78bf25f_0.conda#cc9324e614a297fdf23439d887d3513d https://conda.anaconda.org/conda-forge/linux-64/pyarrow-20.0.0-py313h78bf25f_0.conda#6b8d388845ce750fe2ad8436669182f3 diff --git a/build_tools/azure/pylatest_conda_forge_mkl_osx-64_conda.lock b/build_tools/azure/pylatest_conda_forge_mkl_osx-64_conda.lock index cc98410d95f1a..979272dedc9d3 100644 --- a/build_tools/azure/pylatest_conda_forge_mkl_osx-64_conda.lock +++ b/build_tools/azure/pylatest_conda_forge_mkl_osx-64_conda.lock @@ -11,7 +11,7 @@ https://conda.anaconda.org/conda-forge/osx-64/bzip2-1.0.8-hfdf4475_7.conda#7ed43 https://conda.anaconda.org/conda-forge/noarch/ca-certificates-2025.4.26-hbd8a1cb_0.conda#95db94f75ba080a22eb623590993167b https://conda.anaconda.org/conda-forge/osx-64/icu-75.1-h120a0e1_0.conda#d68d48a3060eb5abdc1cdc8e2a3a5966 https://conda.anaconda.org/conda-forge/osx-64/libbrotlicommon-1.1.0-h00291cd_2.conda#58f2c4bdd56c46cc7451596e4ae68e0b -https://conda.anaconda.org/conda-forge/osx-64/libcxx-20.1.4-hf95d169_0.conda#9a38a63cfe950dd3e1b3adfcba731d3a +https://conda.anaconda.org/conda-forge/osx-64/libcxx-20.1.4-hf95d169_1.conda#2d8e0efc0788d49051e7e02ad6571340 https://conda.anaconda.org/conda-forge/osx-64/libdeflate-1.23-hcc1b750_0.conda#5d3507f22dda24f7d9a79325ad313e44 https://conda.anaconda.org/conda-forge/osx-64/libexpat-2.7.0-h240833e_0.conda#026d0a1056ba2a3dbbea6d4b08188676 https://conda.anaconda.org/conda-forge/osx-64/libffi-3.4.6-h281671d_1.conda#4ca9ea59839a9ca8df84170fab4ceb41 @@ -34,7 +34,7 @@ https://conda.anaconda.org/conda-forge/osx-64/libbrotlienc-1.1.0-h00291cd_2.cond https://conda.anaconda.org/conda-forge/osx-64/libcxx-devel-18.1.8-h7c275be_8.conda#a9513c41f070a9e2d5c370ba5d6c0c00 https://conda.anaconda.org/conda-forge/osx-64/libgfortran5-14.2.0-h58528f3_105.conda#94560312ff3c78225bed62ab59854c31 https://conda.anaconda.org/conda-forge/osx-64/libpng-1.6.47-h3c4a55f_0.conda#8461ab86d2cdb76d6e971aab225be73f -https://conda.anaconda.org/conda-forge/osx-64/libsqlite-3.49.1-hdb6dae5_2.conda#1819e770584a7e83a81541d8253cbabe +https://conda.anaconda.org/conda-forge/osx-64/libsqlite-3.49.2-hdb6dae5_0.conda#9377ba1ade655ea3fc831b456f4a2351 https://conda.anaconda.org/conda-forge/osx-64/libxcb-1.17.0-hf1f96e2_0.conda#bbeca862892e2898bdb45792a61c4afc https://conda.anaconda.org/conda-forge/osx-64/libxml2-2.14.2-h8c082e5_0.conda#4adac80accf99fa253f0620444ad01fb https://conda.anaconda.org/conda-forge/osx-64/mkl-2023.2.0-h54c2260_50500.conda#0a342ccdc79e4fcd359245ac51941e7b @@ -59,8 +59,7 @@ https://conda.anaconda.org/conda-forge/osx-64/sigtool-0.1.3-h88f4db0_0.tar.bz2#f https://conda.anaconda.org/conda-forge/osx-64/brotli-1.1.0-h00291cd_2.conda#2db0c38a7f2321c5bdaf32b181e832c7 https://conda.anaconda.org/conda-forge/noarch/colorama-0.4.6-pyhd8ed1ab_1.conda#962b9857ee8e7018c22f2776ffa0b2d7 https://conda.anaconda.org/conda-forge/noarch/cycler-0.12.1-pyhd8ed1ab_1.conda#44600c4667a319d67dbe0681fc0bc833 -https://conda.anaconda.org/conda-forge/osx-64/cython-3.0.12-py313h9efc8c2_0.conda#ddace7cae5c3073c031ad08ef01881da -https://conda.anaconda.org/conda-forge/noarch/exceptiongroup-1.2.2-pyhd8ed1ab_1.conda#a16662747cdeb9abbac74d0057cc976e +https://conda.anaconda.org/conda-forge/osx-64/cython-3.1.0-py313h9efc8c2_0.conda#350136d94f7df428dd6803ee062debc0 https://conda.anaconda.org/conda-forge/noarch/execnet-2.1.1-pyhd8ed1ab_1.conda#a71efeae2c160f6789900ba2631a2c90 https://conda.anaconda.org/conda-forge/noarch/iniconfig-2.0.0-pyhd8ed1ab_1.conda#6837f3eff7dcea42ecd714ce1ac2b108 https://conda.anaconda.org/conda-forge/osx-64/kiwisolver-1.4.7-py313h0c4e38b_0.conda#c37fceab459e104e77bb5456e219fc37 @@ -88,10 +87,12 @@ https://conda.anaconda.org/conda-forge/noarch/threadpoolctl-3.6.0-pyhecae5ae_0.c https://conda.anaconda.org/conda-forge/noarch/toml-0.10.2-pyhd8ed1ab_1.conda#b0dd904de08b7db706167240bf37b164 https://conda.anaconda.org/conda-forge/noarch/tomli-2.2.1-pyhd8ed1ab_1.conda#ac944244f1fed2eb49bae07193ae8215 https://conda.anaconda.org/conda-forge/osx-64/tornado-6.4.2-py313h63b0ddb_0.conda#74a3a14f82dc65fa19f4fd4e2eb8da93 +https://conda.anaconda.org/conda-forge/noarch/typing_extensions-4.13.2-pyh29332c3_0.conda#83fc6ae00127671e301c9f44254c31b8 https://conda.anaconda.org/conda-forge/osx-64/ccache-4.11.3-h33566b8_0.conda#b65cad834bd6c1f660c101cca09430bf https://conda.anaconda.org/conda-forge/osx-64/clang-18-18.1.8-default_h3571c67_9.conda#e29d8d2866f15f3b167938cc0e775b2f https://conda.anaconda.org/conda-forge/osx-64/coverage-7.8.0-py313h717bdf5_0.conda#1215b56c8d9915318d1714cbd004035f -https://conda.anaconda.org/conda-forge/osx-64/fonttools-4.57.0-py313h717bdf5_0.conda#190b8625dd6c38afe4f10e3be50122e4 +https://conda.anaconda.org/conda-forge/noarch/exceptiongroup-1.3.0-pyhd8ed1ab_0.conda#72e42d28960d875c7654614f8b50939a +https://conda.anaconda.org/conda-forge/osx-64/fonttools-4.58.0-py313h717bdf5_0.conda#35452b432b5255dcdb2d751f1eb4087e https://conda.anaconda.org/conda-forge/osx-64/freetype-2.13.3-h694c41f_1.conda#126dba1baf5030cb6f34533718924577 https://conda.anaconda.org/conda-forge/osx-64/gfortran_impl_osx-64-13.3.0-hbf5bf67_105.conda#f56a107c8d1253346d01785ecece7977 https://conda.anaconda.org/conda-forge/noarch/joblib-1.5.0-pyhd8ed1ab_0.conda#3d7257f0a61c9aa4ffa3e324a887416b @@ -99,8 +100,8 @@ https://conda.anaconda.org/conda-forge/osx-64/ld64-951.9-h4e51db5_6.conda#45bf52 https://conda.anaconda.org/conda-forge/osx-64/liblapacke-3.9.0-20_osx64_mkl.conda#124ae8e384268a8da66f1d64114a1eda https://conda.anaconda.org/conda-forge/osx-64/llvm-tools-18.1.8-default_h3571c67_5.conda#cc07ff74d2547da1f1452c42b67bafd6 https://conda.anaconda.org/conda-forge/osx-64/numpy-2.2.5-py313hc518a0f_0.conda#eba644ccc203cfde2fa1f450f528c70d +https://conda.anaconda.org/conda-forge/osx-64/pillow-11.2.1-py313h0c4f865_0.conda#b4647eda8779d0e5d25cc8c9b124b303 https://conda.anaconda.org/conda-forge/noarch/pyproject-metadata-0.9.1-pyhd8ed1ab_0.conda#22ae7c6ea81e0c8661ef32168dda929b -https://conda.anaconda.org/conda-forge/noarch/pytest-8.3.5-pyhd8ed1ab_0.conda#c3c9316209dec74a705a36797970c6be https://conda.anaconda.org/conda-forge/noarch/python-dateutil-2.9.0.post0-pyhff2d567_1.conda#5ba79d7c71f03c678c8ead841f347d6e https://conda.anaconda.org/conda-forge/osx-64/blas-devel-3.9.0-20_osx64_mkl.conda#cc3260179093918b801e373c6e888e02 https://conda.anaconda.org/conda-forge/osx-64/cctools_osx-64-1010.6-hd19c6af_6.conda#4694e9e497454a8ce5b9fb61e50d9c5d @@ -108,17 +109,17 @@ https://conda.anaconda.org/conda-forge/osx-64/clang-18.1.8-default_h576c50e_9.co https://conda.anaconda.org/conda-forge/osx-64/contourpy-1.3.2-py313ha0b1807_0.conda#2c2d1f840df1c512b34e0537ef928169 https://conda.anaconda.org/conda-forge/noarch/meson-python-0.18.0-pyh70fd9c4_0.conda#576c04b9d9f8e45285fb4d9452c26133 https://conda.anaconda.org/conda-forge/osx-64/pandas-2.2.3-py313h2e7108f_3.conda#5c37fc7549913fc4895d7d2e097091ed -https://conda.anaconda.org/conda-forge/osx-64/pillow-11.1.0-py313h0c4f865_0.conda#11b4dd7a814202f2a0b655420f1c1c3a -https://conda.anaconda.org/conda-forge/noarch/pytest-cov-6.1.1-pyhd8ed1ab_0.conda#1e35d8f975bc0e984a19819aa91c440a -https://conda.anaconda.org/conda-forge/noarch/pytest-xdist-3.6.1-pyhd8ed1ab_1.conda#59aad4fb37cabc0bacc73cf344612ddd +https://conda.anaconda.org/conda-forge/noarch/pytest-8.3.5-pyhd8ed1ab_0.conda#c3c9316209dec74a705a36797970c6be https://conda.anaconda.org/conda-forge/osx-64/scipy-1.15.2-py313h7e69c36_0.conda#53c23f87aedf2d139d54c88894c8a07f https://conda.anaconda.org/conda-forge/osx-64/blas-2.120-mkl.conda#b041a7677a412f3d925d8208936cb1e2 https://conda.anaconda.org/conda-forge/osx-64/cctools-1010.6-ha66f10e_6.conda#a126dcde2752751ac781b67238f7fac4 https://conda.anaconda.org/conda-forge/osx-64/clangxx-18.1.8-default_heb2e8d1_9.conda#4ba6bd39da787a7306eba77555e86dd3 -https://conda.anaconda.org/conda-forge/osx-64/matplotlib-base-3.10.1-py313he981572_0.conda#45a80d45944fbc43f081d719b23bf366 +https://conda.anaconda.org/conda-forge/osx-64/matplotlib-base-3.10.3-py313he981572_0.conda#91c22969c0974f2f23470d517774d457 https://conda.anaconda.org/conda-forge/osx-64/pyamg-5.2.1-py313h0322a6a_1.conda#4bda5182eeaef3d2017a2ec625802e1a +https://conda.anaconda.org/conda-forge/noarch/pytest-cov-6.1.1-pyhd8ed1ab_0.conda#1e35d8f975bc0e984a19819aa91c440a +https://conda.anaconda.org/conda-forge/noarch/pytest-xdist-3.6.1-pyhd8ed1ab_1.conda#59aad4fb37cabc0bacc73cf344612ddd https://conda.anaconda.org/conda-forge/noarch/compiler-rt_osx-64-18.1.8-hf2b8a54_1.conda#76f906e6bdc58976c5593f650290ae20 -https://conda.anaconda.org/conda-forge/osx-64/matplotlib-3.10.1-py313habf4b1d_0.conda#81ea3344e4fc2066a38199a64738ca6b +https://conda.anaconda.org/conda-forge/osx-64/matplotlib-3.10.3-py313habf4b1d_0.conda#c1043254f405998ece984e5f66a10943 https://conda.anaconda.org/conda-forge/osx-64/compiler-rt-18.1.8-h1020d70_1.conda#bc1714a1e73be18e411cff30dc1fe011 https://conda.anaconda.org/conda-forge/osx-64/clang_impl_osx-64-18.1.8-h6a44ed1_24.conda#5224d53acc2604a86d790f664d7fcbc4 https://conda.anaconda.org/conda-forge/osx-64/clang_osx-64-18.1.8-h7e5c614_24.conda#24e1a9c1296772ec45bfcd6a0d855fa5 diff --git a/build_tools/azure/pylatest_conda_mkl_no_openmp_osx-64_conda.lock b/build_tools/azure/pylatest_conda_mkl_no_openmp_osx-64_conda.lock index da996af94f867..8716bbf973504 100644 --- a/build_tools/azure/pylatest_conda_mkl_no_openmp_osx-64_conda.lock +++ b/build_tools/azure/pylatest_conda_mkl_no_openmp_osx-64_conda.lock @@ -75,7 +75,7 @@ https://repo.anaconda.com/pkgs/main/osx-64/numexpr-2.8.7-py312hac873b0_0.conda#6 https://repo.anaconda.com/pkgs/main/osx-64/scipy-1.11.4-py312h81688c2_0.conda#7d57b4c21a9261f97fa511e0940c5d93 https://repo.anaconda.com/pkgs/main/osx-64/pandas-2.2.3-py312h6d0c2b6_0.conda#84ce5b8ec4a986d13a5df17811f556a2 https://repo.anaconda.com/pkgs/main/osx-64/pyamg-5.2.1-py312h1962661_0.conda#58881950d4ce74c9302b56961f97a43c -# pip cython @ https://files.pythonhosted.org/packages/e6/6c/3be501a6520a93449b1e7e6f63e598ec56f3b5d1bc7ad14167c72a22ddf7/Cython-3.0.12-cp312-cp312-macosx_10_9_x86_64.whl#sha256=fe030d4a00afb2844f5f70896b7f2a1a0d7da09bf3aa3d884cbe5f73fff5d310 +# pip cython @ https://files.pythonhosted.org/packages/e9/64/ae1d8848550ec3975634fcf189ccc85e73c3b9f76369dd85c484f2f8f1c3/cython-3.1.0-cp312-cp312-macosx_10_13_x86_64.whl#sha256=8f8c4753f6b926046c0cdf6037ba8560f6677730bf0ab9c1db4e0163b4bb30f9 # pip meson @ https://files.pythonhosted.org/packages/df/d7/f1c8acf0e597d4d07532f519780ee6e11ba285a9b092f18706b4c9118331/meson-1.8.0-py3-none-any.whl#sha256=472b7b25da286447333d32872b82d1c6f1a34024fb8ee017d7308056c25fec1f # pip threadpoolctl @ https://files.pythonhosted.org/packages/32/d5/f9a850d79b0851d1d4ef6456097579a9005b31fea68726a4ae5f2d82ddd9/threadpoolctl-3.6.0-py3-none-any.whl#sha256=43a0b8fd5a2928500110039e43a5eed8480b918967083ea48dc3ab9f13c4a7fb # pip pyproject-metadata @ https://files.pythonhosted.org/packages/7e/b1/8e63033b259e0a4e40dd1ec4a9fee17718016845048b43a36ec67d62e6fe/pyproject_metadata-0.9.1-py3-none-any.whl#sha256=ee5efde548c3ed9b75a354fc319d5afd25e9585fa918a34f62f904cc731973ad diff --git a/build_tools/azure/pylatest_pip_openblas_pandas_linux-64_conda.lock b/build_tools/azure/pylatest_pip_openblas_pandas_linux-64_conda.lock index b2e928b578212..d897f193fbb6f 100644 --- a/build_tools/azure/pylatest_pip_openblas_pandas_linux-64_conda.lock +++ b/build_tools/azure/pylatest_pip_openblas_pandas_linux-64_conda.lock @@ -34,10 +34,10 @@ https://repo.anaconda.com/pkgs/main/noarch/pip-25.1-pyhc872135_2.conda#2778327d2 # pip charset-normalizer @ https://files.pythonhosted.org/packages/e2/28/ffc026b26f441fc67bd21ab7f03b313ab3fe46714a14b516f931abe1a2d8/charset_normalizer-3.4.2-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl#sha256=6c9379d65defcab82d07b2a9dfbfc2e95bc8fe0ebb1b176a3190230a3ef0e07c # pip coverage @ https://files.pythonhosted.org/packages/cb/74/2f8cc196643b15bc096d60e073691dadb3dca48418f08bc78dd6e899383e/coverage-7.8.0-cp313-cp313-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl#sha256=5aaeb00761f985007b38cf463b1d160a14a22c34eb3f6a39d9ad6fc27cb73008 # pip cycler @ https://files.pythonhosted.org/packages/e7/05/c19819d5e3d95294a6f5947fb9b9629efb316b96de511b418c53d245aae6/cycler-0.12.1-py3-none-any.whl#sha256=85cef7cff222d8644161529808465972e51340599459b8ac3ccbac5a854e0d30 -# pip cython @ https://files.pythonhosted.org/packages/a8/30/7f48207ea13dab46604db0dd388e807d53513ba6ad1c34462892072f8f8c/Cython-3.0.12-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl#sha256=879ae9023958d63c0675015369384642d0afb9c9d1f3473df9186c42f7a9d265 +# pip cython @ https://files.pythonhosted.org/packages/8f/14/3676fcf2936c3a01538c01069f649440d3948d77ac117934896ed20f724b/cython-3.1.0-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl#sha256=c088ac33f4fa04b3589c4e5cfb8a81e9d9a990405409f9c8bfab0f5a9e8b724f # pip docutils @ https://files.pythonhosted.org/packages/8f/d7/9322c609343d929e75e7e5e6255e614fcc67572cfd083959cdef3b7aad79/docutils-0.21.2-py3-none-any.whl#sha256=dafca5b9e384f0e419294eb4d2ff9fa826435bf15f15b7bd45723e8ad76811b2 # pip execnet @ https://files.pythonhosted.org/packages/43/09/2aea36ff60d16dd8879bdb2f5b3ee0ba8d08cbbdcdfe870e695ce3784385/execnet-2.1.1-py3-none-any.whl#sha256=26dee51f1b80cebd6d0ca8e74dd8745419761d3bef34163928cbebbdc4749fdc -# pip fonttools @ https://files.pythonhosted.org/packages/f8/ad/c25116352f456c0d1287545a7aa24e98987b6d99c5b0456c4bd14321f20f/fonttools-4.57.0-cp313-cp313-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl#sha256=4dea5893b58d4637ffa925536462ba626f8a1b9ffbe2f5c272cdf2c6ebadb817 +# pip fonttools @ https://files.pythonhosted.org/packages/60/49/aaecb1b3cea2b9b9c7cea6240d6bc8090feb5489a6fbf93cb68003be979b/fonttools-4.58.0-cp313-cp313-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl#sha256=2ceef6f6ab58061a811967e3e32e630747fcb823dcc33a9a2c80e2d0d17cb292 # pip idna @ https://files.pythonhosted.org/packages/76/c6/c88e154df9c4e1a2a66ccf0005a88dfb2650c1dffb6f5ce603dfbd452ce3/idna-3.10-py3-none-any.whl#sha256=946d195a0d259cbba61165e88e65941f16e9b36ea6ddb97f00452bae8b1287d3 # pip imagesize @ https://files.pythonhosted.org/packages/ff/62/85c4c919272577931d407be5ba5d71c20f0b616d31a0befe0ae45bb79abd/imagesize-1.4.1-py2.py3-none-any.whl#sha256=0d8d18d08f840c19d0ee7ca1fd82490fdc3729b7ac93f49870406ddde8ef8d8b # pip iniconfig @ https://files.pythonhosted.org/packages/2c/e1/e6716421ea10d38022b952c159d5161ca1193197fb744506875fbb87ea7b/iniconfig-2.1.0-py3-none-any.whl#sha256=9deba5723312380e77435581c6bf4935c94cbfab9b1ed33ef8d238ea168eb760 @@ -56,7 +56,7 @@ https://repo.anaconda.com/pkgs/main/noarch/pip-25.1-pyhc872135_2.conda#2778327d2 # pip pytz @ https://files.pythonhosted.org/packages/81/c4/34e93fe5f5429d7570ec1fa436f1986fb1f00c3e0f43a589fe2bbcd22c3f/pytz-2025.2-py2.py3-none-any.whl#sha256=5ddf76296dd8c44c26eb8f4b6f35488f3ccbf6fbbd7adee0b7262d43f0ec2f00 # pip roman-numerals-py @ https://files.pythonhosted.org/packages/53/97/d2cbbaa10c9b826af0e10fdf836e1bf344d9f0abb873ebc34d1f49642d3f/roman_numerals_py-3.1.0-py3-none-any.whl#sha256=9da2ad2fb670bcf24e81070ceb3be72f6c11c440d73bd579fbeca1e9f330954c # pip six @ https://files.pythonhosted.org/packages/b7/ce/149a00dd41f10bc29e5921b496af8b574d8413afcd5e30dfa0ed46c2cc5e/six-1.17.0-py2.py3-none-any.whl#sha256=4721f391ed90541fddacab5acf947aa0d3dc7d27b2e1e8eda2be8970586c3274 -# pip snowballstemmer @ https://files.pythonhosted.org/packages/ed/dc/c02e01294f7265e63a7315fe086dd1df7dacb9f840a804da846b96d01b96/snowballstemmer-2.2.0-py2.py3-none-any.whl#sha256=c8e1716e83cc398ae16824e5572ae04e0d9fc2c6b985fb0f900f5f0c96ecba1a +# pip snowballstemmer @ https://files.pythonhosted.org/packages/c8/78/3565d011c61f5a43488987ee32b6f3f656e7f107ac2782dd57bdd7d91d9a/snowballstemmer-3.0.1-py3-none-any.whl#sha256=6cd7b3897da8d6c9ffb968a6781fa6532dce9c3618a4b127d920dab764a19064 # pip sphinxcontrib-applehelp @ https://files.pythonhosted.org/packages/5d/85/9ebeae2f76e9e77b952f4b274c27238156eae7979c5421fba91a28f4970d/sphinxcontrib_applehelp-2.0.0-py3-none-any.whl#sha256=4cd3f0ec4ac5dd9c17ec65e9ab272c9b867ea77425228e68ecf08d6b28ddbdb5 # pip sphinxcontrib-devhelp @ https://files.pythonhosted.org/packages/35/7a/987e583882f985fe4d7323774889ec58049171828b58c2217e7f79cdf44e/sphinxcontrib_devhelp-2.0.0-py3-none-any.whl#sha256=aefb8b83854e4b0998877524d1029fd3e6879210422ee3780459e28a1f03a8a2 # pip sphinxcontrib-htmlhelp @ https://files.pythonhosted.org/packages/0a/7b/18a8c0bcec9182c05a0b3ec2a776bba4ead82750a55ff798e8d406dae604/sphinxcontrib_htmlhelp-2.1.0-py3-none-any.whl#sha256=166759820b47002d22914d64a075ce08f4c46818e17cfc9470a9786b759b19f8 @@ -76,10 +76,10 @@ https://repo.anaconda.com/pkgs/main/noarch/pip-25.1-pyhc872135_2.conda#2778327d2 # pip pytest @ https://files.pythonhosted.org/packages/30/3d/64ad57c803f1fa1e963a7946b6e0fea4a70df53c1a7fed304586539c2bac/pytest-8.3.5-py3-none-any.whl#sha256=c69214aa47deac29fad6c2a4f590b9c4a9fdb16a403176fe154b79c0b4d4d820 # pip python-dateutil @ https://files.pythonhosted.org/packages/ec/57/56b9bcc3c9c6a792fcbaf139543cee77261f3651ca9da0c93f5c1221264b/python_dateutil-2.9.0.post0-py2.py3-none-any.whl#sha256=a8b2bc7bffae282281c8140a97d3aa9c14da0b136dfe83f850eea9a5f7470427 # pip requests @ https://files.pythonhosted.org/packages/f9/9b/335f9764261e915ed497fcdeb11df5dfd6f7bf257d4a6a2a686d80da4d54/requests-2.32.3-py3-none-any.whl#sha256=70761cfe03c773ceb22aa2f671b4757976145175cdfca038c02654d061d6dcc6 -# pip scipy @ https://files.pythonhosted.org/packages/03/5a/fc34bf1aa14dc7c0e701691fa8685f3faec80e57d816615e3625f28feb43/scipy-1.15.2-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl#sha256=fb530e4794fc8ea76a4a21ccb67dea33e5e0e60f07fc38a49e821e1eae3b71a0 -# pip tifffile @ https://files.pythonhosted.org/packages/6e/be/10d23cfd4078fbec6aba768a357eff9e70c0b6d2a07398425985c524ad2a/tifffile-2025.3.30-py3-none-any.whl#sha256=0ed6eee7b66771db2d1bfc42262a51b01887505d35539daef118f4ff8c0f629c +# pip scipy @ https://files.pythonhosted.org/packages/b5/09/c5b6734a50ad4882432b6bb7c02baf757f5b2f256041da5df242e2d7e6b6/scipy-1.15.3-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl#sha256=c9deabd6d547aee2c9a81dee6cc96c6d7e9a9b1953f74850c179f91fdc729cb7 +# pip tifffile @ https://files.pythonhosted.org/packages/5d/06/bd0a6097da704a7a7c34a94cfd771c3ea3c2f405dd214e790d22c93f6be1/tifffile-2025.5.10-py3-none-any.whl#sha256=e37147123c0542d67bc37ba5cdd67e12ea6fbe6e86c52bee037a9eb6a064e5ad # pip lightgbm @ https://files.pythonhosted.org/packages/42/86/dabda8fbcb1b00bcfb0003c3776e8ade1aa7b413dff0a2c08f457dace22f/lightgbm-4.6.0-py3-none-manylinux_2_28_x86_64.whl#sha256=cb19b5afea55b5b61cbb2131095f50538bd608a00655f23ad5d25ae3e3bf1c8d -# pip matplotlib @ https://files.pythonhosted.org/packages/51/d0/2bc4368abf766203e548dc7ab57cf7e9c621f1a3c72b516cc7715347b179/matplotlib-3.10.1-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl#sha256=7e496c01441be4c7d5f96d4e40f7fca06e20dcb40e44c8daa2e740e1757ad9e6 +# pip matplotlib @ https://files.pythonhosted.org/packages/f5/64/41c4367bcaecbc03ef0d2a3ecee58a7065d0a36ae1aa817fe573a2da66d4/matplotlib-3.10.3-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl#sha256=a80fcccbef63302c0efd78042ea3c2436104c5b1a4d3ae20f864593696364ac7 # pip meson-python @ https://files.pythonhosted.org/packages/28/58/66db620a8a7ccb32633de9f403fe49f1b63c68ca94e5c340ec5cceeb9821/meson_python-0.18.0-py3-none-any.whl#sha256=3b0fe051551cc238f5febb873247c0949cd60ded556efa130aa57021804868e2 # pip pandas @ https://files.pythonhosted.org/packages/e8/31/aa8da88ca0eadbabd0a639788a6da13bb2ff6edbbb9f29aa786450a30a91/pandas-2.2.3-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl#sha256=f3a255b2c19987fbbe62a9dfd6cff7ff2aa9ccab3fc75218fd4b7530f01efa24 # pip pyamg @ https://files.pythonhosted.org/packages/cd/a7/0df731cbfb09e73979a1a032fc7bc5be0eba617d798b998a0f887afe8ade/pyamg-5.2.1-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl#sha256=6999b351ab969c79faacb81faa74c0fa9682feeff3954979212872a3ee40c298 diff --git a/build_tools/azure/pymin_conda_forge_mkl_win-64_conda.lock b/build_tools/azure/pymin_conda_forge_mkl_win-64_conda.lock index 6f8eb6175fa27..3c55d28fac4ce 100644 --- a/build_tools/azure/pymin_conda_forge_mkl_win-64_conda.lock +++ b/build_tools/azure/pymin_conda_forge_mkl_win-64_conda.lock @@ -16,7 +16,7 @@ https://conda.anaconda.org/conda-forge/noarch/fonts-conda-forge-1-0.tar.bz2#f766 https://conda.anaconda.org/conda-forge/win-64/libwinpthread-12.0.0.r4.gg4f2fc60ca-h57928b3_9.conda#08bfa5da6e242025304b206d152479ef https://conda.anaconda.org/conda-forge/win-64/vc14_runtime-14.42.34438-hfd919c2_26.conda#91651a36d31aa20c7ba36299fb7068f4 https://conda.anaconda.org/conda-forge/noarch/fonts-conda-ecosystem-1-0.tar.bz2#fee5683a3f04bd15cbd8318b096a27ab -https://conda.anaconda.org/conda-forge/win-64/libgomp-14.2.0-h1383e82_2.conda#dd6b1ab49e28bcb6154cd131acec985b +https://conda.anaconda.org/conda-forge/win-64/libgomp-15.1.0-h1383e82_2.conda#5fbacaa9b41e294a6966602205b99747 https://conda.anaconda.org/conda-forge/win-64/vc-14.3-h2b53caa_26.conda#d3f0381e38093bde620a8d85f266ae55 https://conda.anaconda.org/conda-forge/win-64/_openmp_mutex-4.5-2_gnu.conda#37e16618af5c4851a3f3d66dd0e11141 https://conda.anaconda.org/conda-forge/win-64/bzip2-1.0.8-h2466b09_7.conda#276e7ffe9ffe39688abc665ef0f45596 @@ -31,7 +31,7 @@ https://conda.anaconda.org/conda-forge/win-64/libffi-3.4.6-h537db12_1.conda#85d8 https://conda.anaconda.org/conda-forge/win-64/libiconv-1.18-h135ad9c_1.conda#21fc5dba2cbcd8e5e26ff976a312122c https://conda.anaconda.org/conda-forge/win-64/libjpeg-turbo-3.1.0-h2466b09_0.conda#7c51d27540389de84852daa1cdb9c63c https://conda.anaconda.org/conda-forge/win-64/liblzma-5.8.1-h2466b09_1.conda#14a1042c163181e143a7522dfb8ad6ab -https://conda.anaconda.org/conda-forge/win-64/libsqlite-3.49.1-h67fdade_2.conda#b58b66d4ad1aaf1c2543cbbd6afb1a59 +https://conda.anaconda.org/conda-forge/win-64/libsqlite-3.49.2-h67fdade_0.conda#a3900c97ba9e03332e9a911fe63f7d64 https://conda.anaconda.org/conda-forge/win-64/libwebp-base-1.5.0-h3b0e114_0.conda#33f7313967072c6e6d8f865f5493c7ae https://conda.anaconda.org/conda-forge/win-64/libzlib-1.3.1-h2466b09_2.conda#41fbfac52c601159df6c01f875de31b9 https://conda.anaconda.org/conda-forge/win-64/ninja-1.12.1-hc790b64_1.conda#3974c522f3248d4a93e6940c463d2de7 @@ -42,18 +42,17 @@ https://conda.anaconda.org/conda-forge/win-64/tk-8.6.13-h5226925_1.conda#fc04836 https://conda.anaconda.org/conda-forge/win-64/krb5-1.21.3-hdf4eb48_0.conda#31aec030344e962fbd7dbbbbd68e60a9 https://conda.anaconda.org/conda-forge/win-64/libbrotlidec-1.1.0-h2466b09_2.conda#9bae75ce723fa34e98e239d21d752a7e https://conda.anaconda.org/conda-forge/win-64/libbrotlienc-1.1.0-h2466b09_2.conda#85741a24d97954a991e55e34bc55990b -https://conda.anaconda.org/conda-forge/win-64/libgcc-14.2.0-h1383e82_2.conda#4a74c1461a0ba47a3346c04bdccbe2ad +https://conda.anaconda.org/conda-forge/win-64/libgcc-15.1.0-h1383e82_2.conda#9bedb24480136bfeb81ebc81d4285e70 https://conda.anaconda.org/conda-forge/win-64/libintl-0.22.5-h5728263_3.conda#2cf0cf76cc15d360dfa2f17fd6cf9772 https://conda.anaconda.org/conda-forge/win-64/libpng-1.6.47-h7a4582a_0.conda#ad620e92b82d2948bc019e029c574ebb -https://conda.anaconda.org/conda-forge/win-64/libxml2-2.13.7-h442d1da_1.conda#c14ff7f05e57489df9244917d2b55763 +https://conda.anaconda.org/conda-forge/win-64/libxml2-2.13.8-h442d1da_0.conda#833c2dbc1a5020007b520b044c713ed3 https://conda.anaconda.org/conda-forge/win-64/pcre2-10.44-h99c9b8b_2.conda#a912b2c4ff0f03101c751aa79a331831 https://conda.anaconda.org/conda-forge/win-64/python-3.10.17-h8c5b53a_0_cpython.conda#0c59918f056ab2e9c7bb45970d32b2ea https://conda.anaconda.org/conda-forge/win-64/zstd-1.5.7-hbeecb71_2.conda#21f56217d6125fb30c3c3f10c786d751 https://conda.anaconda.org/conda-forge/win-64/brotli-bin-1.1.0-h2466b09_2.conda#d22534a9be5771fc58eb7564947f669d https://conda.anaconda.org/conda-forge/noarch/colorama-0.4.6-pyhd8ed1ab_1.conda#962b9857ee8e7018c22f2776ffa0b2d7 https://conda.anaconda.org/conda-forge/noarch/cycler-0.12.1-pyhd8ed1ab_1.conda#44600c4667a319d67dbe0681fc0bc833 -https://conda.anaconda.org/conda-forge/win-64/cython-3.0.12-py310h6bd2d47_0.conda#8b4e32766e91dfad20bdfd9747e66d54 -https://conda.anaconda.org/conda-forge/noarch/exceptiongroup-1.2.2-pyhd8ed1ab_1.conda#a16662747cdeb9abbac74d0057cc976e +https://conda.anaconda.org/conda-forge/win-64/cython-3.1.0-py310h6bd2d47_0.conda#2e715850183850c69cf2b1fa3933a0e6 https://conda.anaconda.org/conda-forge/noarch/execnet-2.1.1-pyhd8ed1ab_1.conda#a71efeae2c160f6789900ba2631a2c90 https://conda.anaconda.org/conda-forge/noarch/iniconfig-2.0.0-pyhd8ed1ab_1.conda#6837f3eff7dcea42ecd714ce1ac2b108 https://conda.anaconda.org/conda-forge/win-64/kiwisolver-1.4.7-py310hc19bc0b_0.conda#50d96539497fc7493cbe469fbb6b8b6e @@ -75,12 +74,14 @@ https://conda.anaconda.org/conda-forge/noarch/threadpoolctl-3.6.0-pyhecae5ae_0.c https://conda.anaconda.org/conda-forge/noarch/toml-0.10.2-pyhd8ed1ab_1.conda#b0dd904de08b7db706167240bf37b164 https://conda.anaconda.org/conda-forge/noarch/tomli-2.2.1-pyhd8ed1ab_1.conda#ac944244f1fed2eb49bae07193ae8215 https://conda.anaconda.org/conda-forge/win-64/tornado-6.4.2-py310ha8f682b_0.conda#e6819d3a0cae0f1b1838875f858421d1 +https://conda.anaconda.org/conda-forge/noarch/typing_extensions-4.13.2-pyh29332c3_0.conda#83fc6ae00127671e301c9f44254c31b8 https://conda.anaconda.org/conda-forge/win-64/unicodedata2-16.0.0-py310ha8f682b_0.conda#b28aead44c6e19a1fbba7752aa242b34 https://conda.anaconda.org/conda-forge/noarch/wheel-0.45.1-pyhd8ed1ab_1.conda#75cb7132eb58d97896e173ef12ac9986 https://conda.anaconda.org/conda-forge/win-64/xorg-libxau-1.0.12-h0e40799_0.conda#2ffbfae4548098297c033228256eb96e https://conda.anaconda.org/conda-forge/win-64/xorg-libxdmcp-1.1.5-h0e40799_0.conda#8393c0f7e7870b4eb45553326f81f0ff https://conda.anaconda.org/conda-forge/win-64/brotli-1.1.0-h2466b09_2.conda#378f1c9421775dfe644731cb121c8979 https://conda.anaconda.org/conda-forge/win-64/coverage-7.8.0-py310h38315fa_0.conda#30a825dae940c63c55bca8df4f806f3e +https://conda.anaconda.org/conda-forge/noarch/exceptiongroup-1.3.0-pyhd8ed1ab_0.conda#72e42d28960d875c7654614f8b50939a https://conda.anaconda.org/conda-forge/noarch/joblib-1.5.0-pyhd8ed1ab_0.conda#3d7257f0a61c9aa4ffa3e324a887416b https://conda.anaconda.org/conda-forge/win-64/lcms2-2.17-hbcf6048_0.conda#3538827f77b82a837fa681a4579e37a1 https://conda.anaconda.org/conda-forge/win-64/libfreetype-2.13.3-h57928b3_1.conda#410ba2c8e7bdb278dfbb5d40220e39d2 @@ -88,19 +89,19 @@ https://conda.anaconda.org/conda-forge/win-64/libxcb-1.17.0-h0e4246c_0.conda#a69 https://conda.anaconda.org/conda-forge/win-64/openjpeg-2.5.3-h4d64b90_0.conda#fc050366dd0b8313eb797ed1ffef3a29 https://conda.anaconda.org/conda-forge/noarch/pip-25.1.1-pyh8b19718_0.conda#32d0781ace05105cc99af55d36cbec7c https://conda.anaconda.org/conda-forge/noarch/pyproject-metadata-0.9.1-pyhd8ed1ab_0.conda#22ae7c6ea81e0c8661ef32168dda929b -https://conda.anaconda.org/conda-forge/noarch/pytest-8.3.5-pyhd8ed1ab_0.conda#c3c9316209dec74a705a36797970c6be https://conda.anaconda.org/conda-forge/noarch/python-dateutil-2.9.0.post0-pyhff2d567_1.conda#5ba79d7c71f03c678c8ead841f347d6e https://conda.anaconda.org/conda-forge/win-64/tbb-2021.13.0-h62715c5_1.conda#9190dd0a23d925f7602f9628b3aed511 -https://conda.anaconda.org/conda-forge/win-64/fonttools-4.57.0-py310h38315fa_0.conda#1f25f742c39582715cc058f5fe451975 +https://conda.anaconda.org/conda-forge/win-64/fonttools-4.58.0-py310h38315fa_0.conda#87b6ddf29c7ee0e327f76c546edb3346 https://conda.anaconda.org/conda-forge/win-64/freetype-2.13.3-h57928b3_1.conda#633504fe3f96031192e40e3e6c18ef06 https://conda.anaconda.org/conda-forge/noarch/meson-python-0.18.0-pyh70fd9c4_0.conda#576c04b9d9f8e45285fb4d9452c26133 https://conda.anaconda.org/conda-forge/win-64/mkl-2024.2.2-h66d3029_15.conda#302dff2807f2927b3e9e0d19d60121de -https://conda.anaconda.org/conda-forge/noarch/pytest-cov-6.1.1-pyhd8ed1ab_0.conda#1e35d8f975bc0e984a19819aa91c440a -https://conda.anaconda.org/conda-forge/noarch/pytest-xdist-3.6.1-pyhd8ed1ab_1.conda#59aad4fb37cabc0bacc73cf344612ddd +https://conda.anaconda.org/conda-forge/win-64/pillow-11.2.1-py310h9595edc_0.conda#33d0663d469cc146b5fc68587348f450 +https://conda.anaconda.org/conda-forge/noarch/pytest-8.3.5-pyhd8ed1ab_0.conda#c3c9316209dec74a705a36797970c6be https://conda.anaconda.org/conda-forge/win-64/fontconfig-2.15.0-h765892d_1.conda#9bb0026a2131b09404c59c4290c697cd https://conda.anaconda.org/conda-forge/win-64/libblas-3.9.0-31_h641d27c_mkl.conda#d05563c577fe2f37693a554b3f271e8f https://conda.anaconda.org/conda-forge/win-64/mkl-devel-2024.2.2-h57928b3_15.conda#a85f53093da069c7c657f090e388f3ef -https://conda.anaconda.org/conda-forge/win-64/pillow-11.1.0-py310h9595edc_0.conda#67a38507ac20bd85226fe6dd7ed87462 +https://conda.anaconda.org/conda-forge/noarch/pytest-cov-6.1.1-pyhd8ed1ab_0.conda#1e35d8f975bc0e984a19819aa91c440a +https://conda.anaconda.org/conda-forge/noarch/pytest-xdist-3.6.1-pyhd8ed1ab_1.conda#59aad4fb37cabc0bacc73cf344612ddd https://conda.anaconda.org/conda-forge/win-64/cairo-1.18.4-h5782bbf_0.conda#20e32ced54300292aff690a69c5e7b97 https://conda.anaconda.org/conda-forge/win-64/libcblas-3.9.0-31_h5e41251_mkl.conda#43c100b94ad2607382b0cf0f3a6b0bf3 https://conda.anaconda.org/conda-forge/win-64/liblapack-3.9.0-31_h1aa476e_mkl.conda#40b47ee720a185289760960fc6185750 @@ -109,9 +110,9 @@ https://conda.anaconda.org/conda-forge/win-64/liblapacke-3.9.0-31_h845c4fa_mkl.c https://conda.anaconda.org/conda-forge/win-64/numpy-2.2.5-py310h4987827_0.conda#19e9c5868faa8046020ce870a9a9d0fc https://conda.anaconda.org/conda-forge/win-64/blas-devel-3.9.0-31_hfb1a452_mkl.conda#0deeb3d9d6f0e56393c55ef382899010 https://conda.anaconda.org/conda-forge/win-64/contourpy-1.3.2-py310hc19bc0b_0.conda#039416813b5290e7d100a05bb4326110 -https://conda.anaconda.org/conda-forge/win-64/qt6-main-6.9.0-h83cda92_1.conda#412f970fc305449b6ee626fe9c6638a8 +https://conda.anaconda.org/conda-forge/win-64/qt6-main-6.9.0-h1ab902a_2.conda#99a8af7791ea42b4994cea09dd858ca8 https://conda.anaconda.org/conda-forge/win-64/scipy-1.15.2-py310h15c175c_0.conda#81798168111d1021e3d815217c444418 https://conda.anaconda.org/conda-forge/win-64/blas-2.131-mkl.conda#1842bfaa4e349875c47bde1d9871bda6 -https://conda.anaconda.org/conda-forge/win-64/matplotlib-base-3.10.1-py310h37e0a56_0.conda#1b78c5c0741473537e39e425ff30ea80 +https://conda.anaconda.org/conda-forge/win-64/matplotlib-base-3.10.3-py310h37e0a56_0.conda#de9ddae6f97b78860c256de480ea1a84 https://conda.anaconda.org/conda-forge/win-64/pyside6-6.9.0-py310hc1b6536_0.conda#e90c8d8a817b5d63b7785d7d18c99ae0 -https://conda.anaconda.org/conda-forge/win-64/matplotlib-3.10.1-py310h5588dad_0.conda#246bfc9ca36dccad2d78a020ab8d2aab +https://conda.anaconda.org/conda-forge/win-64/matplotlib-3.10.3-py310h5588dad_0.conda#103adee33db124a0263d0b4551e232e3 diff --git a/build_tools/azure/pymin_conda_forge_openblas_min_dependencies_linux-64_conda.lock b/build_tools/azure/pymin_conda_forge_openblas_min_dependencies_linux-64_conda.lock index d68f376c0d376..248133099b701 100644 --- a/build_tools/azure/pymin_conda_forge_openblas_min_dependencies_linux-64_conda.lock +++ b/build_tools/azure/pymin_conda_forge_openblas_min_dependencies_linux-64_conda.lock @@ -16,23 +16,24 @@ https://conda.anaconda.org/conda-forge/linux-64/llvm-openmp-20.1.4-h024ca30_0.co https://conda.anaconda.org/conda-forge/linux-64/_openmp_mutex-4.5-3_kmp_llvm.conda#ee5c2118262e30b972bc0b4db8ef0ba5 https://conda.anaconda.org/conda-forge/noarch/fonts-conda-ecosystem-1-0.tar.bz2#fee5683a3f04bd15cbd8318b096a27ab https://conda.anaconda.org/conda-forge/linux-64/libegl-1.7.0-ha4b6fd6_2.conda#c151d5eb730e9b7480e6d48c0fc44048 -https://conda.anaconda.org/conda-forge/linux-64/libgcc-14.2.0-h767d61c_2.conda#ef504d1acbd74b7cc6849ef8af47dd03 +https://conda.anaconda.org/conda-forge/linux-64/libopengl-1.7.0-ha4b6fd6_2.conda#7df50d44d4a14d6c31a2c54f2cd92157 +https://conda.anaconda.org/conda-forge/linux-64/libgcc-15.1.0-h767d61c_2.conda#ea8ac52380885ed41c1baa8f1d6d2b93 https://conda.anaconda.org/conda-forge/linux-64/alsa-lib-1.2.14-hb9d3cd8_0.conda#76df83c2a9035c54df5d04ff81bcc02d https://conda.anaconda.org/conda-forge/linux-64/gettext-tools-0.24.1-h5888daf_0.conda#d54305672f0361c2f3886750e7165b5f https://conda.anaconda.org/conda-forge/linux-64/libbrotlicommon-1.1.0-hb9d3cd8_2.conda#41b599ed2b02abcfdd84302bff174b23 https://conda.anaconda.org/conda-forge/linux-64/libdeflate-1.23-h86f0d12_0.conda#27fe770decaf469a53f3e3a6d593067f https://conda.anaconda.org/conda-forge/linux-64/libexpat-2.7.0-h5888daf_0.conda#db0bfbe7dd197b68ad5f30333bae6ce0 https://conda.anaconda.org/conda-forge/linux-64/libffi-3.4.6-h2dba641_1.conda#ede4673863426c0883c0063d853bbd85 -https://conda.anaconda.org/conda-forge/linux-64/libgcc-ng-14.2.0-h69a702a_2.conda#a2222a6ada71fb478682efe483ce0f92 +https://conda.anaconda.org/conda-forge/linux-64/libgcc-ng-15.1.0-h69a702a_2.conda#ddca86c7040dd0e73b2b69bd7833d225 https://conda.anaconda.org/conda-forge/linux-64/libgettextpo-0.24.1-h5888daf_0.conda#2ee6d71b72f75d50581f2f68e965efdb -https://conda.anaconda.org/conda-forge/linux-64/libgfortran5-14.2.0-hf1ad2bd_2.conda#556a4fdfac7287d349b8f09aba899693 +https://conda.anaconda.org/conda-forge/linux-64/libgfortran5-15.1.0-hcea5267_2.conda#01de444988ed960031dbe84cf4f9b1fc https://conda.anaconda.org/conda-forge/linux-64/libiconv-1.18-h4ce23a2_1.conda#e796ff8ddc598affdf7c173d6145f087 https://conda.anaconda.org/conda-forge/linux-64/libjpeg-turbo-3.1.0-hb9d3cd8_0.conda#9fa334557db9f63da6c9285fd2a48638 https://conda.anaconda.org/conda-forge/linux-64/liblzma-5.8.1-hb9d3cd8_1.conda#a76fd702c93cd2dfd89eff30a5fd45a8 https://conda.anaconda.org/conda-forge/linux-64/libntlm-1.8-hb9d3cd8_0.conda#7c7927b404672409d9917d49bff5f2d6 https://conda.anaconda.org/conda-forge/linux-64/libogg-1.3.5-hd0c01bc_1.conda#68e52064ed3897463c0e958ab5c8f91b https://conda.anaconda.org/conda-forge/linux-64/libopus-1.5.2-hd0c01bc_0.conda#b64523fb87ac6f87f0790f324ad43046 -https://conda.anaconda.org/conda-forge/linux-64/libstdcxx-14.2.0-h8f9b012_2.conda#a78c856b6dc6bf4ea8daeb9beaaa3fb0 +https://conda.anaconda.org/conda-forge/linux-64/libstdcxx-15.1.0-h8f9b012_2.conda#1cb1c67961f6dd257eae9e9691b341aa https://conda.anaconda.org/conda-forge/linux-64/libwebp-base-1.5.0-h851e524_0.conda#63f790534398730f59e1b899c3644d4a https://conda.anaconda.org/conda-forge/linux-64/libzlib-1.3.1-hb9d3cd8_2.conda#edb0dca6bc32e4f4789199455a1dbeb8 https://conda.anaconda.org/conda-forge/linux-64/ncurses-6.5-h2d0b736_3.conda#47e340acb35de30501a76c7c799c41d7 @@ -54,13 +55,13 @@ https://conda.anaconda.org/conda-forge/linux-64/libbrotlienc-1.1.0-hb9d3cd8_2.co https://conda.anaconda.org/conda-forge/linux-64/libedit-3.1.20250104-pl5321h7949ede_0.conda#c277e0a4d549b03ac1e9d6cbbe3d017b https://conda.anaconda.org/conda-forge/linux-64/libevent-2.1.12-hf998b51_1.conda#a1cfcc585f0c42bf8d5546bb1dfb668d https://conda.anaconda.org/conda-forge/linux-64/libgettextpo-devel-0.24.1-h5888daf_0.conda#8f04c7aae6a46503bc36d1ed5abc8c7c -https://conda.anaconda.org/conda-forge/linux-64/libgfortran-14.2.0-h69a702a_2.conda#fb54c4ea68b460c278d26eea89cfbcc3 +https://conda.anaconda.org/conda-forge/linux-64/libgfortran-15.1.0-h69a702a_2.conda#f92e6e0a3c0c0c85561ef61aa59d555d https://conda.anaconda.org/conda-forge/linux-64/libgpg-error-1.55-h3f2d84a_0.conda#2bd47db5807daade8500ed7ca4c512a4 https://conda.anaconda.org/conda-forge/linux-64/libnsl-2.0.1-hd590300_0.conda#30fd6e37fe21f86f4bd26d6ee73eeec7 https://conda.anaconda.org/conda-forge/linux-64/libpciaccess-0.18-hd590300_0.conda#48f4330bfcd959c3cfb704d424903c82 https://conda.anaconda.org/conda-forge/linux-64/libpng-1.6.47-h943b412_0.conda#55199e2ae2c3651f6f9b2a447b47bdc9 -https://conda.anaconda.org/conda-forge/linux-64/libsqlite-3.49.1-hee588c1_2.conda#962d6ac93c30b1dfc54c9cccafd1003e -https://conda.anaconda.org/conda-forge/linux-64/libstdcxx-ng-14.2.0-h4852527_2.conda#c75da67f045c2627f59e6fcb5f4e3a9b +https://conda.anaconda.org/conda-forge/linux-64/libsqlite-3.49.2-hee588c1_0.conda#93048463501053a00739215ea3f36324 +https://conda.anaconda.org/conda-forge/linux-64/libstdcxx-ng-15.1.0-h4852527_2.conda#9d2072af184b5caa29492bf2344597bb https://conda.anaconda.org/conda-forge/linux-64/libuuid-2.38.1-h0b41bf4_0.conda#40b61aab5c7ba9ff276c41cfffe6b80b https://conda.anaconda.org/conda-forge/linux-64/libxcb-1.17.0-h8a09558_0.conda#92ed62436b625154323d40d5f2f11dd7 https://conda.anaconda.org/conda-forge/linux-64/libxcrypt-4.4.36-hd590300_1.conda#5aa797f8787fe7a17d1b0821485b5adc @@ -82,7 +83,7 @@ https://conda.anaconda.org/conda-forge/linux-64/libcap-2.75-h39aace5_0.conda#c44 https://conda.anaconda.org/conda-forge/linux-64/libdrm-2.4.124-hb9d3cd8_0.conda#8bc89311041d7fcb510238cf0848ccae https://conda.anaconda.org/conda-forge/linux-64/libfreetype6-2.13.3-h48d6fc4_1.conda#3c255be50a506c50765a93a6644f32fe https://conda.anaconda.org/conda-forge/linux-64/libgcrypt-lib-1.11.0-hb9d3cd8_2.conda#e55712ff40a054134d51b89afca57dbc -https://conda.anaconda.org/conda-forge/linux-64/libgfortran-ng-14.2.0-h69a702a_2.conda#4056c857af1a99ee50589a941059ec55 +https://conda.anaconda.org/conda-forge/linux-64/libgfortran-ng-15.1.0-h69a702a_2.conda#a483a87b71e974bb75d1b9413d4436dd https://conda.anaconda.org/conda-forge/linux-64/libtiff-4.7.0-hd9ff511_4.conda#6c1028898cf3a2032d9af46689e1b81a https://conda.anaconda.org/conda-forge/linux-64/libvorbis-1.3.7-h9c3ff4c_0.tar.bz2#309dec04b70a3cc0f1e84a4013683bc0 https://conda.anaconda.org/conda-forge/linux-64/mysql-libs-9.0.1-he0572af_6.conda#9802ae6d20982f42c0f5d69008988763 @@ -101,7 +102,6 @@ https://conda.anaconda.org/conda-forge/noarch/colorama-0.4.6-pyhd8ed1ab_1.conda# https://conda.anaconda.org/conda-forge/noarch/cycler-0.12.1-pyhd8ed1ab_1.conda#44600c4667a319d67dbe0681fc0bc833 https://conda.anaconda.org/conda-forge/linux-64/cyrus-sasl-2.1.27-h54b06d7_7.conda#dce22f70b4e5a407ce88f2be046f4ceb https://conda.anaconda.org/conda-forge/linux-64/cython-3.0.10-py310hc6cd4ac_0.conda#bd1d71ee240be36f1d85c86177d6964f -https://conda.anaconda.org/conda-forge/noarch/exceptiongroup-1.2.2-pyhd8ed1ab_1.conda#a16662747cdeb9abbac74d0057cc976e https://conda.anaconda.org/conda-forge/noarch/execnet-2.1.1-pyhd8ed1ab_1.conda#a71efeae2c160f6789900ba2631a2c90 https://conda.anaconda.org/conda-forge/linux-64/gettext-0.24.1-h5888daf_0.conda#c63e7590d4d6f4c85721040ed8b12888 https://conda.anaconda.org/conda-forge/noarch/iniconfig-2.0.0-pyhd8ed1ab_1.conda#6837f3eff7dcea42ecd714ce1ac2b108 @@ -114,7 +114,7 @@ https://conda.anaconda.org/conda-forge/linux-64/libglx-1.7.0-ha4b6fd6_2.conda#c8 https://conda.anaconda.org/conda-forge/linux-64/libhiredis-1.0.2-h2cc385e_0.tar.bz2#b34907d3a81a3cd8095ee83d174c074a https://conda.anaconda.org/conda-forge/linux-64/libopenblas-0.3.25-pthreads_h413a1c8_0.conda#d172b34a443b95f86089e8229ddc9a17 https://conda.anaconda.org/conda-forge/linux-64/libsystemd0-257.4-h4e0b6ca_1.conda#04bcf3055e51f8dde6fab9672fb9fca0 -https://conda.anaconda.org/conda-forge/linux-64/libxml2-2.13.7-h4bc477f_1.conda#ad1f1f8238834cd3c88ceeaee8da444a +https://conda.anaconda.org/conda-forge/linux-64/libxml2-2.13.8-h4bc477f_0.conda#14dbe05b929e329dbaa6f2d0aa19466d https://conda.anaconda.org/conda-forge/noarch/meson-1.8.0-pyh29332c3_0.conda#8e25221b702272394b86b0f4d7217f77 https://conda.anaconda.org/conda-forge/noarch/munkres-1.1.4-pyh9f0ad1d_0.tar.bz2#2ba8498c1018c1e9c61eb99b973dfe19 https://conda.anaconda.org/conda-forge/linux-64/openjpeg-2.5.3-h5fbd93e_0.conda#9e5816bc95d285c115a3ebc2f8563564 @@ -140,7 +140,8 @@ https://conda.anaconda.org/conda-forge/linux-64/xorg-libxrender-0.9.12-hb9d3cd8_ https://conda.anaconda.org/conda-forge/linux-64/ccache-4.11.3-h80c52d3_0.conda#eb517c6a2b960c3ccb6f1db1005f063a https://conda.anaconda.org/conda-forge/linux-64/coverage-7.8.0-py310h89163eb_0.conda#9f7865c17117d16f804b687b498e35fa https://conda.anaconda.org/conda-forge/linux-64/dbus-1.13.6-h5008d03_3.tar.bz2#ecfff944ba3960ecb334b9a2663d708d -https://conda.anaconda.org/conda-forge/linux-64/fonttools-4.57.0-py310h89163eb_0.conda#34378af82141b3c1725dcdf898b28fc6 +https://conda.anaconda.org/conda-forge/noarch/exceptiongroup-1.3.0-pyhd8ed1ab_0.conda#72e42d28960d875c7654614f8b50939a +https://conda.anaconda.org/conda-forge/linux-64/fonttools-4.58.0-py310h89163eb_0.conda#4532df8a45ab4e37b2cc71186304dd5a https://conda.anaconda.org/conda-forge/linux-64/freetype-2.13.3-ha770c72_1.conda#9ccd736d31e0c6e41f54e704e5312811 https://conda.anaconda.org/conda-forge/linux-64/glib-tools-2.84.1-h4833e2c_1.conda#418de18c9b79a3d8583d90d27e0937c2 https://conda.anaconda.org/conda-forge/noarch/joblib-1.2.0-pyhd8ed1ab_0.tar.bz2#7583652522d71ad78ba536bba06940eb @@ -151,11 +152,12 @@ https://conda.anaconda.org/conda-forge/linux-64/libllvm20-20.1.4-he9d0ab4_0.cond https://conda.anaconda.org/conda-forge/linux-64/libxkbcommon-1.9.2-h65c71a3_0.conda#d045b1d878031eb497cab44e6392b1df https://conda.anaconda.org/conda-forge/linux-64/openblas-0.3.25-pthreads_h7a3da1a_0.conda#87661673941b5e702275fdf0fc095ad0 https://conda.anaconda.org/conda-forge/linux-64/openldap-2.6.9-he970967_0.conda#ca2de8bbdc871bce41dbf59e51324165 +https://conda.anaconda.org/conda-forge/linux-64/pillow-11.2.1-py310h7e6dc6c_0.conda#5645a243d90adb50909b9edc209d84fe https://conda.anaconda.org/conda-forge/noarch/pip-25.1.1-pyh8b19718_0.conda#32d0781ace05105cc99af55d36cbec7c https://conda.anaconda.org/conda-forge/noarch/pyproject-metadata-0.9.1-pyhd8ed1ab_0.conda#22ae7c6ea81e0c8661ef32168dda929b -https://conda.anaconda.org/conda-forge/noarch/pytest-8.3.5-pyhd8ed1ab_0.conda#c3c9316209dec74a705a36797970c6be https://conda.anaconda.org/conda-forge/noarch/python-dateutil-2.9.0.post0-pyhff2d567_1.conda#5ba79d7c71f03c678c8ead841f347d6e -https://conda.anaconda.org/conda-forge/linux-64/sip-6.8.6-py310hf71b8c6_2.conda#a50d1007fecaff3f98b19034a8e0b2e7 +https://conda.anaconda.org/conda-forge/linux-64/sip-6.10.0-py310hf71b8c6_0.conda#2d7e4445be227e8210140b75725689ad +https://conda.anaconda.org/conda-forge/linux-64/xorg-libxcomposite-0.4.6-hb9d3cd8_2.conda#d3c295b50f092ab525ffe3c2aa4b7413 https://conda.anaconda.org/conda-forge/linux-64/xorg-libxdamage-1.1.6-hb9d3cd8_0.conda#b5fcc7172d22516e1f965490e65e33a4 https://conda.anaconda.org/conda-forge/linux-64/xorg-libxxf86vm-1.1.6-hb9d3cd8_0.conda#5efa5fa6243a622445fdfd72aee15efa https://conda.anaconda.org/conda-forge/linux-64/fontconfig-2.15.0-h7e30c49_1.conda#8f5b0b297b59e1ac160ad4beec99dbee @@ -164,18 +166,18 @@ https://conda.anaconda.org/conda-forge/linux-64/libcblas-3.9.0-20_linux64_openbl https://conda.anaconda.org/conda-forge/linux-64/libclang-cpp20.1-20.1.4-default_h1df26ce_0.conda#96f8d5b2e94c9ba4fef19f1adf068a15 https://conda.anaconda.org/conda-forge/linux-64/libclang13-20.1.4-default_he06ed0a_0.conda#2d933632c8004be47deb2be61bf013be https://conda.anaconda.org/conda-forge/linux-64/liblapack-3.9.0-20_linux64_openblas.conda#6fabc51f5e647d09cc010c40061557e0 -https://conda.anaconda.org/conda-forge/linux-64/libpq-17.4-h27ae623_1.conda#37fba334855ef3b51549308e61ed7a3d +https://conda.anaconda.org/conda-forge/linux-64/libpq-17.5-h27ae623_0.conda#6458be24f09e1b034902ab44fe9de908 https://conda.anaconda.org/conda-forge/linux-64/libsndfile-1.2.2-hc60ed4a_1.conda#ef1910918dd895516a769ed36b5b3a4e https://conda.anaconda.org/conda-forge/noarch/meson-python-0.16.0-pyh0c530f3_0.conda#e16f0dbf502da873be9f9adb0dc52547 -https://conda.anaconda.org/conda-forge/linux-64/pillow-11.1.0-py310h7e6dc6c_0.conda#14d300b9e1504748e70cc6499a7b4d25 -https://conda.anaconda.org/conda-forge/linux-64/pyqt5-sip-12.13.0-py310hf71b8c6_1.conda#0c8cbfbe70f4c8a47b040a14615e6f1f -https://conda.anaconda.org/conda-forge/noarch/pytest-cov-6.1.1-pyhd8ed1ab_0.conda#1e35d8f975bc0e984a19819aa91c440a -https://conda.anaconda.org/conda-forge/noarch/pytest-xdist-3.6.1-pyhd8ed1ab_1.conda#59aad4fb37cabc0bacc73cf344612ddd +https://conda.anaconda.org/conda-forge/linux-64/pyqt5-sip-12.17.0-py310hf71b8c6_0.conda#012465861673a67a30bc8ca6284074f3 +https://conda.anaconda.org/conda-forge/noarch/pytest-8.3.5-pyhd8ed1ab_0.conda#c3c9316209dec74a705a36797970c6be https://conda.anaconda.org/conda-forge/linux-64/cairo-1.18.4-h3394656_0.conda#09262e66b19567aff4f592fb53b28760 https://conda.anaconda.org/conda-forge/linux-64/gstreamer-1.24.11-hc37bda9_0.conda#056d86cacf2b48c79c6a562a2486eb8c https://conda.anaconda.org/conda-forge/linux-64/liblapacke-3.9.0-20_linux64_openblas.conda#05c5862c7dc25e65ba6c471d96429dae https://conda.anaconda.org/conda-forge/linux-64/numpy-1.22.0-py310h454958d_1.tar.bz2#607c66f0cce2986515a8fe9e136b2b57 https://conda.anaconda.org/conda-forge/linux-64/pulseaudio-client-17.0-hac146a9_1.conda#66b1fa9608d8836e25f9919159adc9c6 +https://conda.anaconda.org/conda-forge/noarch/pytest-cov-6.1.1-pyhd8ed1ab_0.conda#1e35d8f975bc0e984a19819aa91c440a +https://conda.anaconda.org/conda-forge/noarch/pytest-xdist-3.6.1-pyhd8ed1ab_1.conda#59aad4fb37cabc0bacc73cf344612ddd https://conda.anaconda.org/conda-forge/linux-64/blas-devel-3.9.0-20_linux64_openblas.conda#9932a1d4e9ecf2d35fb19475446e361e https://conda.anaconda.org/conda-forge/linux-64/gst-plugins-base-1.24.11-h651a532_0.conda#d8d8894f8ced2c9be76dc9ad1ae531ce https://conda.anaconda.org/conda-forge/linux-64/harfbuzz-11.1.0-h3beb420_0.conda#95e3bb97f9cdc251c0c68640e9c10ed3 @@ -186,5 +188,5 @@ https://conda.anaconda.org/conda-forge/linux-64/scipy-1.8.0-py310hea5193d_1.tar. https://conda.anaconda.org/conda-forge/linux-64/blas-2.120-openblas.conda#c8f6916a81a340650078171b1d852574 https://conda.anaconda.org/conda-forge/linux-64/pyamg-4.2.1-py310h7c3ba0c_0.tar.bz2#89f5a48e1f23b5cf3163a6094903d181 https://conda.anaconda.org/conda-forge/linux-64/qt-main-5.15.15-h993ce98_3.conda#aa49f5308f39277477d47cd6687eb8f3 -https://conda.anaconda.org/conda-forge/linux-64/pyqt-5.15.10-py310hb3b5edb_1.conda#c370972fc4557cb54d265c9c1f71bd20 +https://conda.anaconda.org/conda-forge/linux-64/pyqt-5.15.11-py310hf392a12_0.conda#65924d3e57be25342c76530d23d75f0f https://conda.anaconda.org/conda-forge/linux-64/matplotlib-3.5.0-py310hff52083_0.tar.bz2#1b2f3b135d5d9c594b5e0e6150c03b7b diff --git a/build_tools/azure/pymin_conda_forge_openblas_ubuntu_2204_linux-64_conda.lock b/build_tools/azure/pymin_conda_forge_openblas_ubuntu_2204_linux-64_conda.lock index b7899b98ba3fa..036882c691173 100644 --- a/build_tools/azure/pymin_conda_forge_openblas_ubuntu_2204_linux-64_conda.lock +++ b/build_tools/azure/pymin_conda_forge_openblas_ubuntu_2204_linux-64_conda.lock @@ -7,17 +7,17 @@ https://conda.anaconda.org/conda-forge/noarch/python_abi-3.10-7_cp310.conda#44e8 https://conda.anaconda.org/conda-forge/noarch/tzdata-2025b-h78e105d_0.conda#4222072737ccff51314b5ece9c7d6f5a https://conda.anaconda.org/conda-forge/noarch/ca-certificates-2025.4.26-hbd8a1cb_0.conda#95db94f75ba080a22eb623590993167b https://conda.anaconda.org/conda-forge/linux-64/ld_impl_linux-64-2.43-h712a8e2_4.conda#01f8d123c96816249efd255a31ad7712 -https://conda.anaconda.org/conda-forge/linux-64/libgomp-14.2.0-h767d61c_2.conda#06d02030237f4d5b3d9a7e7d348fe3c6 +https://conda.anaconda.org/conda-forge/linux-64/libgomp-15.1.0-h767d61c_2.conda#fbe7d535ff9d3a168c148e07358cd5b1 https://conda.anaconda.org/conda-forge/linux-64/_openmp_mutex-4.5-2_gnu.tar.bz2#73aaf86a425cc6e73fcf236a5a46396d -https://conda.anaconda.org/conda-forge/linux-64/libgcc-14.2.0-h767d61c_2.conda#ef504d1acbd74b7cc6849ef8af47dd03 +https://conda.anaconda.org/conda-forge/linux-64/libgcc-15.1.0-h767d61c_2.conda#ea8ac52380885ed41c1baa8f1d6d2b93 https://conda.anaconda.org/conda-forge/linux-64/libdeflate-1.23-h86f0d12_0.conda#27fe770decaf469a53f3e3a6d593067f https://conda.anaconda.org/conda-forge/linux-64/libexpat-2.7.0-h5888daf_0.conda#db0bfbe7dd197b68ad5f30333bae6ce0 https://conda.anaconda.org/conda-forge/linux-64/libffi-3.4.6-h2dba641_1.conda#ede4673863426c0883c0063d853bbd85 -https://conda.anaconda.org/conda-forge/linux-64/libgcc-ng-14.2.0-h69a702a_2.conda#a2222a6ada71fb478682efe483ce0f92 -https://conda.anaconda.org/conda-forge/linux-64/libgfortran5-14.2.0-hf1ad2bd_2.conda#556a4fdfac7287d349b8f09aba899693 +https://conda.anaconda.org/conda-forge/linux-64/libgcc-ng-15.1.0-h69a702a_2.conda#ddca86c7040dd0e73b2b69bd7833d225 +https://conda.anaconda.org/conda-forge/linux-64/libgfortran5-15.1.0-hcea5267_2.conda#01de444988ed960031dbe84cf4f9b1fc https://conda.anaconda.org/conda-forge/linux-64/libjpeg-turbo-3.1.0-hb9d3cd8_0.conda#9fa334557db9f63da6c9285fd2a48638 https://conda.anaconda.org/conda-forge/linux-64/liblzma-5.8.1-hb9d3cd8_1.conda#a76fd702c93cd2dfd89eff30a5fd45a8 -https://conda.anaconda.org/conda-forge/linux-64/libstdcxx-14.2.0-h8f9b012_2.conda#a78c856b6dc6bf4ea8daeb9beaaa3fb0 +https://conda.anaconda.org/conda-forge/linux-64/libstdcxx-15.1.0-h8f9b012_2.conda#1cb1c67961f6dd257eae9e9691b341aa https://conda.anaconda.org/conda-forge/linux-64/libwebp-base-1.5.0-h851e524_0.conda#63f790534398730f59e1b899c3644d4a https://conda.anaconda.org/conda-forge/linux-64/libzlib-1.3.1-hb9d3cd8_2.conda#edb0dca6bc32e4f4789199455a1dbeb8 https://conda.anaconda.org/conda-forge/linux-64/ncurses-6.5-h2d0b736_3.conda#47e340acb35de30501a76c7c799c41d7 @@ -27,11 +27,11 @@ https://conda.anaconda.org/conda-forge/linux-64/xorg-libxau-1.0.12-hb9d3cd8_0.co https://conda.anaconda.org/conda-forge/linux-64/xorg-libxdmcp-1.1.5-hb9d3cd8_0.conda#8035c64cb77ed555e3f150b7b3972480 https://conda.anaconda.org/conda-forge/linux-64/bzip2-1.0.8-h4bc722e_7.conda#62ee74e96c5ebb0af99386de58cf9553 https://conda.anaconda.org/conda-forge/linux-64/lerc-4.0.0-h0aef613_1.conda#9344155d33912347b37f0ae6c410a835 -https://conda.anaconda.org/conda-forge/linux-64/libgfortran-14.2.0-h69a702a_2.conda#fb54c4ea68b460c278d26eea89cfbcc3 +https://conda.anaconda.org/conda-forge/linux-64/libgfortran-15.1.0-h69a702a_2.conda#f92e6e0a3c0c0c85561ef61aa59d555d https://conda.anaconda.org/conda-forge/linux-64/libnsl-2.0.1-hd590300_0.conda#30fd6e37fe21f86f4bd26d6ee73eeec7 https://conda.anaconda.org/conda-forge/linux-64/libpng-1.6.47-h943b412_0.conda#55199e2ae2c3651f6f9b2a447b47bdc9 -https://conda.anaconda.org/conda-forge/linux-64/libsqlite-3.49.1-hee588c1_2.conda#962d6ac93c30b1dfc54c9cccafd1003e -https://conda.anaconda.org/conda-forge/linux-64/libstdcxx-ng-14.2.0-h4852527_2.conda#c75da67f045c2627f59e6fcb5f4e3a9b +https://conda.anaconda.org/conda-forge/linux-64/libsqlite-3.49.2-hee588c1_0.conda#93048463501053a00739215ea3f36324 +https://conda.anaconda.org/conda-forge/linux-64/libstdcxx-ng-15.1.0-h4852527_2.conda#9d2072af184b5caa29492bf2344597bb https://conda.anaconda.org/conda-forge/linux-64/libuuid-2.38.1-h0b41bf4_0.conda#40b61aab5c7ba9ff276c41cfffe6b80b https://conda.anaconda.org/conda-forge/linux-64/libxcb-1.17.0-h8a09558_0.conda#92ed62436b625154323d40d5f2f11dd7 https://conda.anaconda.org/conda-forge/linux-64/libxcrypt-4.4.36-hd590300_1.conda#5aa797f8787fe7a17d1b0821485b5adc @@ -40,7 +40,7 @@ https://conda.anaconda.org/conda-forge/linux-64/readline-8.2-h8c095d6_2.conda#28 https://conda.anaconda.org/conda-forge/linux-64/tk-8.6.13-noxft_h4845f30_101.conda#d453b98d9c83e71da0741bb0ff4d76bc https://conda.anaconda.org/conda-forge/linux-64/zstd-1.5.7-hb8e6e7a_2.conda#6432cb5d4ac0046c3ac0a8a0f95842f9 https://conda.anaconda.org/conda-forge/linux-64/libfreetype6-2.13.3-h48d6fc4_1.conda#3c255be50a506c50765a93a6644f32fe -https://conda.anaconda.org/conda-forge/linux-64/libgfortran-ng-14.2.0-h69a702a_2.conda#4056c857af1a99ee50589a941059ec55 +https://conda.anaconda.org/conda-forge/linux-64/libgfortran-ng-15.1.0-h69a702a_2.conda#a483a87b71e974bb75d1b9413d4436dd https://conda.anaconda.org/conda-forge/linux-64/libopenblas-0.3.29-pthreads_h94d23a6_0.conda#0a4d0252248ef9a0f88f2ba8b8a08e12 https://conda.anaconda.org/conda-forge/linux-64/libtiff-4.7.0-hd9ff511_4.conda#6c1028898cf3a2032d9af46689e1b81a https://conda.anaconda.org/conda-forge/linux-64/python-3.10.17-hd6af730_0_cpython.conda#7bb89638dae9ce1b8e051d0b721e83c2 @@ -49,9 +49,8 @@ https://conda.anaconda.org/conda-forge/linux-64/brotli-python-1.1.0-py310hf71b8c https://conda.anaconda.org/conda-forge/noarch/certifi-2025.4.26-pyhd8ed1ab_0.conda#c33eeaaa33f45031be34cda513df39b6 https://conda.anaconda.org/conda-forge/noarch/charset-normalizer-3.4.2-pyhd8ed1ab_0.conda#40fe4284b8b5835a9073a645139f35af https://conda.anaconda.org/conda-forge/noarch/colorama-0.4.6-pyhd8ed1ab_1.conda#962b9857ee8e7018c22f2776ffa0b2d7 -https://conda.anaconda.org/conda-forge/linux-64/cython-3.0.12-py310had8cdd9_0.conda#b630fe36f0b621d23e74872dc4fd2bd7 +https://conda.anaconda.org/conda-forge/linux-64/cython-3.1.0-py310had8cdd9_0.conda#cb0972064e60dcfb49b3b4de71dafd4f https://conda.anaconda.org/conda-forge/noarch/docutils-0.21.2-pyhd8ed1ab_1.conda#24c1ca34138ee57de72a943237cde4cc -https://conda.anaconda.org/conda-forge/noarch/exceptiongroup-1.2.2-pyhd8ed1ab_1.conda#a16662747cdeb9abbac74d0057cc976e https://conda.anaconda.org/conda-forge/noarch/execnet-2.1.1-pyhd8ed1ab_1.conda#a71efeae2c160f6789900ba2631a2c90 https://conda.anaconda.org/conda-forge/noarch/hpack-4.1.0-pyhd8ed1ab_0.conda#0a802cb9888dd14eeefc611f05c40b6e https://conda.anaconda.org/conda-forge/noarch/hyperframe-6.1.0-pyhd8ed1ab_0.conda#8e6923fc12f1fe8f8c4e5c9f343256ac @@ -80,28 +79,29 @@ https://conda.anaconda.org/conda-forge/noarch/sphinxcontrib-jsmath-1.0.1-pyhd8ed https://conda.anaconda.org/conda-forge/noarch/tabulate-0.9.0-pyhd8ed1ab_2.conda#959484a66b4b76befcddc4fa97c95567 https://conda.anaconda.org/conda-forge/noarch/threadpoolctl-3.6.0-pyhecae5ae_0.conda#9d64911b31d57ca443e9f1e36b04385f https://conda.anaconda.org/conda-forge/noarch/tomli-2.2.1-pyhd8ed1ab_1.conda#ac944244f1fed2eb49bae07193ae8215 +https://conda.anaconda.org/conda-forge/noarch/typing_extensions-4.13.2-pyh29332c3_0.conda#83fc6ae00127671e301c9f44254c31b8 https://conda.anaconda.org/conda-forge/noarch/wheel-0.45.1-pyhd8ed1ab_1.conda#75cb7132eb58d97896e173ef12ac9986 https://conda.anaconda.org/conda-forge/noarch/babel-2.17.0-pyhd8ed1ab_0.conda#0a01c169f0ab0f91b26e77a3301fbfe4 https://conda.anaconda.org/conda-forge/linux-64/ccache-4.11.3-h80c52d3_0.conda#eb517c6a2b960c3ccb6f1db1005f063a https://conda.anaconda.org/conda-forge/linux-64/cffi-1.17.1-py310h8deb56e_0.conda#1fc24a3196ad5ede2a68148be61894f4 -https://conda.anaconda.org/conda-forge/linux-64/freetype-2.13.3-ha770c72_1.conda#9ccd736d31e0c6e41f54e704e5312811 +https://conda.anaconda.org/conda-forge/noarch/exceptiongroup-1.3.0-pyhd8ed1ab_0.conda#72e42d28960d875c7654614f8b50939a https://conda.anaconda.org/conda-forge/noarch/h2-4.2.0-pyhd8ed1ab_0.conda#b4754fb1bdcb70c8fd54f918301582c6 https://conda.anaconda.org/conda-forge/noarch/jinja2-3.1.6-pyhd8ed1ab_0.conda#446bd6c8cb26050d528881df495ce646 https://conda.anaconda.org/conda-forge/noarch/joblib-1.5.0-pyhd8ed1ab_0.conda#3d7257f0a61c9aa4ffa3e324a887416b https://conda.anaconda.org/conda-forge/linux-64/libcblas-3.9.0-31_he106b2a_openblas.conda#abb32c727da370c481a1c206f5159ce9 https://conda.anaconda.org/conda-forge/linux-64/liblapack-3.9.0-31_h7ac8fdf_openblas.conda#452b98eafe050ecff932f0ec832dd03f +https://conda.anaconda.org/conda-forge/linux-64/pillow-11.2.1-py310h7e6dc6c_0.conda#5645a243d90adb50909b9edc209d84fe https://conda.anaconda.org/conda-forge/noarch/pip-25.1.1-pyh8b19718_0.conda#32d0781ace05105cc99af55d36cbec7c https://conda.anaconda.org/conda-forge/noarch/pyproject-metadata-0.9.1-pyhd8ed1ab_0.conda#22ae7c6ea81e0c8661ef32168dda929b -https://conda.anaconda.org/conda-forge/noarch/pytest-8.3.5-pyhd8ed1ab_0.conda#c3c9316209dec74a705a36797970c6be https://conda.anaconda.org/conda-forge/noarch/python-dateutil-2.9.0.post0-pyhff2d567_1.conda#5ba79d7c71f03c678c8ead841f347d6e https://conda.anaconda.org/conda-forge/linux-64/liblapacke-3.9.0-31_he2f377e_openblas.conda#7e5fff7d0db69be3a266f7e79a3bb0e2 https://conda.anaconda.org/conda-forge/noarch/meson-python-0.18.0-pyh70fd9c4_0.conda#576c04b9d9f8e45285fb4d9452c26133 https://conda.anaconda.org/conda-forge/linux-64/numpy-2.2.5-py310hefbff90_0.conda#5526bc875ec897f0d335e38da832b6ee -https://conda.anaconda.org/conda-forge/linux-64/pillow-11.1.0-py310h7e6dc6c_0.conda#14d300b9e1504748e70cc6499a7b4d25 -https://conda.anaconda.org/conda-forge/noarch/pytest-xdist-3.6.1-pyhd8ed1ab_1.conda#59aad4fb37cabc0bacc73cf344612ddd +https://conda.anaconda.org/conda-forge/noarch/pytest-8.3.5-pyhd8ed1ab_0.conda#c3c9316209dec74a705a36797970c6be https://conda.anaconda.org/conda-forge/linux-64/zstandard-0.23.0-py310ha75aee5_2.conda#f9254b5b0193982416b91edcb4b2676f https://conda.anaconda.org/conda-forge/linux-64/blas-devel-3.9.0-31_h1ea3ea9_openblas.conda#ba652ee0576396d4765e567f043c57f9 https://conda.anaconda.org/conda-forge/linux-64/pandas-2.2.3-py310h5eaa309_3.conda#07697a584fab513ce895c4511f7a2403 +https://conda.anaconda.org/conda-forge/noarch/pytest-xdist-3.6.1-pyhd8ed1ab_1.conda#59aad4fb37cabc0bacc73cf344612ddd https://conda.anaconda.org/conda-forge/linux-64/scipy-1.15.2-py310h1d65ade_0.conda#8c29cd33b64b2eb78597fa28b5595c8d https://conda.anaconda.org/conda-forge/noarch/urllib3-2.4.0-pyhd8ed1ab_0.conda#c1e349028e0052c4eea844e94f773065 https://conda.anaconda.org/conda-forge/linux-64/blas-2.131-openblas.conda#38b2ec894c69bb4be0e66d2ef7fc60bf diff --git a/build_tools/azure/ubuntu_atlas_lock.txt b/build_tools/azure/ubuntu_atlas_lock.txt index bb4ee75928009..78b769cef4b6e 100644 --- a/build_tools/azure/ubuntu_atlas_lock.txt +++ b/build_tools/azure/ubuntu_atlas_lock.txt @@ -6,7 +6,7 @@ # cython==3.0.10 # via -r build_tools/azure/ubuntu_atlas_requirements.txt -exceptiongroup==1.2.2 +exceptiongroup==1.3.0 # via pytest execnet==2.1.1 # via pytest-xdist @@ -41,3 +41,5 @@ tomli==2.2.1 # via # meson-python # pytest +typing-extensions==4.13.2 + # via exceptiongroup diff --git a/build_tools/circle/doc_linux-64_conda.lock b/build_tools/circle/doc_linux-64_conda.lock index 76f56da3a9681..f0c867fe5a1b2 100644 --- a/build_tools/circle/doc_linux-64_conda.lock +++ b/build_tools/circle/doc_linux-64_conda.lock @@ -15,7 +15,7 @@ https://conda.anaconda.org/conda-forge/noarch/fonts-conda-forge-1-0.tar.bz2#f766 https://conda.anaconda.org/conda-forge/linux-64/ld_impl_linux-64-2.43-h712a8e2_4.conda#01f8d123c96816249efd255a31ad7712 https://conda.anaconda.org/conda-forge/noarch/libgcc-devel_linux-64-13.3.0-hc03c837_102.conda#4c1d6961a6a54f602ae510d9bf31fa60 https://conda.anaconda.org/conda-forge/linux-64/libglvnd-1.7.0-ha4b6fd6_2.conda#434ca7e50e40f4918ab701e3facd59a0 -https://conda.anaconda.org/conda-forge/linux-64/libgomp-14.2.0-h767d61c_2.conda#06d02030237f4d5b3d9a7e7d348fe3c6 +https://conda.anaconda.org/conda-forge/linux-64/libgomp-15.1.0-h767d61c_2.conda#fbe7d535ff9d3a168c148e07358cd5b1 https://conda.anaconda.org/conda-forge/noarch/libstdcxx-devel_linux-64-13.3.0-hc03c837_102.conda#aa38de2738c5f4a72a880e3d31ffe8b4 https://conda.anaconda.org/conda-forge/noarch/sysroot_linux-64-2.17-h0157908_18.conda#460eba7851277ec1fd80a1a24080787a https://conda.anaconda.org/conda-forge/linux-64/_openmp_mutex-4.5-2_gnu.tar.bz2#73aaf86a425cc6e73fcf236a5a46396d @@ -25,24 +25,25 @@ https://conda.anaconda.org/conda-forge/linux-64/libegl-1.7.0-ha4b6fd6_2.conda#c1 https://conda.anaconda.org/conda-forge/linux-64/libopengl-1.7.0-ha4b6fd6_2.conda#7df50d44d4a14d6c31a2c54f2cd92157 https://conda.anaconda.org/conda-forge/linux-64/binutils-2.43-h4852527_4.conda#29782348a527eda3ecfc673109d28e93 https://conda.anaconda.org/conda-forge/linux-64/binutils_linux-64-2.43-h4852527_4.conda#c87e146f5b685672d4aa6b527c6d3b5e -https://conda.anaconda.org/conda-forge/linux-64/libgcc-14.2.0-h767d61c_2.conda#ef504d1acbd74b7cc6849ef8af47dd03 +https://conda.anaconda.org/conda-forge/linux-64/libgcc-15.1.0-h767d61c_2.conda#ea8ac52380885ed41c1baa8f1d6d2b93 https://conda.anaconda.org/conda-forge/linux-64/alsa-lib-1.2.14-hb9d3cd8_0.conda#76df83c2a9035c54df5d04ff81bcc02d https://conda.anaconda.org/conda-forge/linux-64/libbrotlicommon-1.1.0-hb9d3cd8_2.conda#41b599ed2b02abcfdd84302bff174b23 https://conda.anaconda.org/conda-forge/linux-64/libdeflate-1.23-h86f0d12_0.conda#27fe770decaf469a53f3e3a6d593067f https://conda.anaconda.org/conda-forge/linux-64/libexpat-2.7.0-h5888daf_0.conda#db0bfbe7dd197b68ad5f30333bae6ce0 https://conda.anaconda.org/conda-forge/linux-64/libffi-3.4.6-h2dba641_1.conda#ede4673863426c0883c0063d853bbd85 -https://conda.anaconda.org/conda-forge/linux-64/libgcc-ng-14.2.0-h69a702a_2.conda#a2222a6ada71fb478682efe483ce0f92 -https://conda.anaconda.org/conda-forge/linux-64/libgfortran5-14.2.0-hf1ad2bd_2.conda#556a4fdfac7287d349b8f09aba899693 +https://conda.anaconda.org/conda-forge/linux-64/libgcc-ng-15.1.0-h69a702a_2.conda#ddca86c7040dd0e73b2b69bd7833d225 +https://conda.anaconda.org/conda-forge/linux-64/libgfortran5-15.1.0-hcea5267_2.conda#01de444988ed960031dbe84cf4f9b1fc https://conda.anaconda.org/conda-forge/linux-64/libiconv-1.18-h4ce23a2_1.conda#e796ff8ddc598affdf7c173d6145f087 https://conda.anaconda.org/conda-forge/linux-64/libjpeg-turbo-3.1.0-hb9d3cd8_0.conda#9fa334557db9f63da6c9285fd2a48638 https://conda.anaconda.org/conda-forge/linux-64/liblzma-5.8.1-hb9d3cd8_1.conda#a76fd702c93cd2dfd89eff30a5fd45a8 https://conda.anaconda.org/conda-forge/linux-64/libntlm-1.8-hb9d3cd8_0.conda#7c7927b404672409d9917d49bff5f2d6 -https://conda.anaconda.org/conda-forge/linux-64/libstdcxx-14.2.0-h8f9b012_2.conda#a78c856b6dc6bf4ea8daeb9beaaa3fb0 +https://conda.anaconda.org/conda-forge/linux-64/libstdcxx-15.1.0-h8f9b012_2.conda#1cb1c67961f6dd257eae9e9691b341aa https://conda.anaconda.org/conda-forge/linux-64/libwebp-base-1.5.0-h851e524_0.conda#63f790534398730f59e1b899c3644d4a https://conda.anaconda.org/conda-forge/linux-64/libzlib-1.3.1-hb9d3cd8_2.conda#edb0dca6bc32e4f4789199455a1dbeb8 https://conda.anaconda.org/conda-forge/linux-64/ncurses-6.5-h2d0b736_3.conda#47e340acb35de30501a76c7c799c41d7 https://conda.anaconda.org/conda-forge/linux-64/openssl-3.5.0-h7b32b05_1.conda#de356753cfdbffcde5bb1e86e3aa6cd0 https://conda.anaconda.org/conda-forge/linux-64/pthread-stubs-0.4-hb9d3cd8_1002.conda#b3c17d95b5a10c6e64a21fa17573e70e +https://conda.anaconda.org/conda-forge/linux-64/rav1e-0.7.1-h8fae777_3.conda#2c42649888aac645608191ffdc80d13a https://conda.anaconda.org/conda-forge/linux-64/xorg-libice-1.1.2-hb9d3cd8_0.conda#fb901ff28063514abb6046c9ec2c4a45 https://conda.anaconda.org/conda-forge/linux-64/xorg-libxau-1.0.12-hb9d3cd8_0.conda#f6ebe2cb3f82ba6c057dde5d9debe4f7 https://conda.anaconda.org/conda-forge/linux-64/xorg-libxdmcp-1.1.5-hb9d3cd8_0.conda#8035c64cb77ed555e3f150b7b3972480 @@ -57,22 +58,20 @@ https://conda.anaconda.org/conda-forge/linux-64/lerc-4.0.0-h0aef613_1.conda#9344 https://conda.anaconda.org/conda-forge/linux-64/libbrotlidec-1.1.0-hb9d3cd8_2.conda#9566f0bd264fbd463002e759b8a82401 https://conda.anaconda.org/conda-forge/linux-64/libbrotlienc-1.1.0-hb9d3cd8_2.conda#06f70867945ea6a84d35836af780f1de https://conda.anaconda.org/conda-forge/linux-64/libedit-3.1.20250104-pl5321h7949ede_0.conda#c277e0a4d549b03ac1e9d6cbbe3d017b -https://conda.anaconda.org/conda-forge/linux-64/libgfortran-14.2.0-h69a702a_2.conda#fb54c4ea68b460c278d26eea89cfbcc3 +https://conda.anaconda.org/conda-forge/linux-64/libgfortran-15.1.0-h69a702a_2.conda#f92e6e0a3c0c0c85561ef61aa59d555d https://conda.anaconda.org/conda-forge/linux-64/libhwy-1.2.0-hf40a0c7_0.conda#2f433d593a66044c3f163cb25f0a09de https://conda.anaconda.org/conda-forge/linux-64/libnsl-2.0.1-hd590300_0.conda#30fd6e37fe21f86f4bd26d6ee73eeec7 https://conda.anaconda.org/conda-forge/linux-64/libpciaccess-0.18-hd590300_0.conda#48f4330bfcd959c3cfb704d424903c82 https://conda.anaconda.org/conda-forge/linux-64/libpng-1.6.47-h943b412_0.conda#55199e2ae2c3651f6f9b2a447b47bdc9 https://conda.anaconda.org/conda-forge/linux-64/libsanitizer-13.3.0-he8ea267_2.conda#2b6cdf7bb95d3d10ef4e38ce0bc95dba -https://conda.anaconda.org/conda-forge/linux-64/libsqlite-3.49.1-hee588c1_2.conda#962d6ac93c30b1dfc54c9cccafd1003e -https://conda.anaconda.org/conda-forge/linux-64/libstdcxx-ng-14.2.0-h4852527_2.conda#c75da67f045c2627f59e6fcb5f4e3a9b +https://conda.anaconda.org/conda-forge/linux-64/libsqlite-3.49.2-hee588c1_0.conda#93048463501053a00739215ea3f36324 +https://conda.anaconda.org/conda-forge/linux-64/libstdcxx-ng-15.1.0-h4852527_2.conda#9d2072af184b5caa29492bf2344597bb https://conda.anaconda.org/conda-forge/linux-64/libuuid-2.38.1-h0b41bf4_0.conda#40b61aab5c7ba9ff276c41cfffe6b80b https://conda.anaconda.org/conda-forge/linux-64/libxcb-1.17.0-h8a09558_0.conda#92ed62436b625154323d40d5f2f11dd7 https://conda.anaconda.org/conda-forge/linux-64/libxcrypt-4.4.36-hd590300_1.conda#5aa797f8787fe7a17d1b0821485b5adc https://conda.anaconda.org/conda-forge/linux-64/lz4-c-1.10.0-h5888daf_1.conda#9de5350a85c4a20c685259b889aa6393 -https://conda.anaconda.org/conda-forge/linux-64/mysql-common-9.2.0-h266115a_0.conda#db22a0962c953e81a2a679ecb1fc6027 https://conda.anaconda.org/conda-forge/linux-64/ninja-1.12.1-hff21bea_1.conda#2322531904f27501ee19847b87ba7c64 https://conda.anaconda.org/conda-forge/linux-64/pixman-0.46.0-h29eaf8c_0.conda#d2f1c87d4416d1e7344cf92b1aaee1c4 -https://conda.anaconda.org/conda-forge/linux-64/rav1e-0.6.6-he8a937b_2.conda#77d9955b4abddb811cb8ab1aa7d743e4 https://conda.anaconda.org/conda-forge/linux-64/readline-8.2-h8c095d6_2.conda#283b96675859b20a825f8fa30f311446 https://conda.anaconda.org/conda-forge/linux-64/snappy-1.2.1-h8bd8927_1.conda#3b3e64af585eadfb52bb90b553db5edf https://conda.anaconda.org/conda-forge/linux-64/svt-av1-3.0.2-h5888daf_0.conda#0096882bd623e6cc09e8bf920fc8fb47 @@ -97,7 +96,6 @@ https://conda.anaconda.org/conda-forge/linux-64/libjxl-0.11.1-h7b0646d_1.conda#9 https://conda.anaconda.org/conda-forge/linux-64/libopenblas-0.3.29-pthreads_h94d23a6_0.conda#0a4d0252248ef9a0f88f2ba8b8a08e12 https://conda.anaconda.org/conda-forge/linux-64/libtiff-4.7.0-hd9ff511_4.conda#6c1028898cf3a2032d9af46689e1b81a https://conda.anaconda.org/conda-forge/linux-64/libzopfli-1.0.3-h9c3ff4c_0.tar.bz2#c66fe2d123249af7651ebde8984c51c2 -https://conda.anaconda.org/conda-forge/linux-64/mysql-libs-9.2.0-he0572af_0.conda#93340b072c393d23c4700a1d40565dca https://conda.anaconda.org/conda-forge/linux-64/pcre2-10.44-hc749103_2.conda#31614c73d7b103ef76faa4d83d261d34 https://conda.anaconda.org/conda-forge/linux-64/python-3.10.17-hd6af730_0_cpython.conda#7bb89638dae9ce1b8e051d0b721e83c2 https://conda.anaconda.org/conda-forge/linux-64/qhull-2020.2-h434a139_5.conda#353823361b1d27eb3960efb076dfcaf6 @@ -112,14 +110,13 @@ https://conda.anaconda.org/conda-forge/linux-64/brotli-1.1.0-hb9d3cd8_2.conda#98 https://conda.anaconda.org/conda-forge/linux-64/brotli-python-1.1.0-py310hf71b8c6_2.conda#bf502c169c71e3c6ac0d6175addfacc2 https://conda.anaconda.org/conda-forge/noarch/certifi-2025.4.26-pyhd8ed1ab_0.conda#c33eeaaa33f45031be34cda513df39b6 https://conda.anaconda.org/conda-forge/noarch/charset-normalizer-3.4.2-pyhd8ed1ab_0.conda#40fe4284b8b5835a9073a645139f35af -https://conda.anaconda.org/conda-forge/noarch/click-8.1.8-pyh707e725_0.conda#f22f4d4970e09d68a10b922cbb0408d3 +https://conda.anaconda.org/conda-forge/noarch/click-8.2.0-pyh707e725_0.conda#4d4f33c3d9e5a23a7f4795d327a5d1f0 https://conda.anaconda.org/conda-forge/noarch/colorama-0.4.6-pyhd8ed1ab_1.conda#962b9857ee8e7018c22f2776ffa0b2d7 https://conda.anaconda.org/conda-forge/noarch/cpython-3.10.17-py310hd8ed1ab_0.conda#e2b81369f0473107784f8b7da8e6a8e9 https://conda.anaconda.org/conda-forge/noarch/cycler-0.12.1-pyhd8ed1ab_1.conda#44600c4667a319d67dbe0681fc0bc833 https://conda.anaconda.org/conda-forge/linux-64/cyrus-sasl-2.1.27-h54b06d7_7.conda#dce22f70b4e5a407ce88f2be046f4ceb -https://conda.anaconda.org/conda-forge/linux-64/cython-3.0.12-py310had8cdd9_0.conda#b630fe36f0b621d23e74872dc4fd2bd7 +https://conda.anaconda.org/conda-forge/linux-64/cython-3.1.0-py310had8cdd9_0.conda#cb0972064e60dcfb49b3b4de71dafd4f https://conda.anaconda.org/conda-forge/noarch/docutils-0.21.2-pyhd8ed1ab_1.conda#24c1ca34138ee57de72a943237cde4cc -https://conda.anaconda.org/conda-forge/noarch/exceptiongroup-1.2.2-pyhd8ed1ab_1.conda#a16662747cdeb9abbac74d0057cc976e https://conda.anaconda.org/conda-forge/noarch/execnet-2.1.1-pyhd8ed1ab_1.conda#a71efeae2c160f6789900ba2631a2c90 https://conda.anaconda.org/conda-forge/linux-64/gcc-13.3.0-h9576a4e_2.conda#d92e51bf4b6bdbfe45e5884fb0755afe https://conda.anaconda.org/conda-forge/linux-64/gcc_linux-64-13.3.0-hc28eda2_10.conda#d151142bbafe5e68ec7fc065c5e6f80c @@ -132,22 +129,22 @@ https://conda.anaconda.org/conda-forge/noarch/imagesize-1.4.1-pyhd8ed1ab_0.tar.b https://conda.anaconda.org/conda-forge/noarch/iniconfig-2.0.0-pyhd8ed1ab_1.conda#6837f3eff7dcea42ecd714ce1ac2b108 https://conda.anaconda.org/conda-forge/linux-64/kiwisolver-1.4.7-py310h3788b33_0.conda#4186d9b4d004b0fe0de6aa62496fb48a https://conda.anaconda.org/conda-forge/linux-64/lcms2-2.17-h717163a_0.conda#000e85703f0fd9594c81710dd5066471 -https://conda.anaconda.org/conda-forge/linux-64/libavif16-1.2.1-hbb36593_2.conda#971387a27e61235b97cacb440a37e991 +https://conda.anaconda.org/conda-forge/linux-64/libavif16-1.3.0-h766b0b6_0.conda#f17f2d0e5c9ad6b958547fd67b155771 https://conda.anaconda.org/conda-forge/linux-64/libblas-3.9.0-31_h59b9bed_openblas.conda#728dbebd0f7a20337218beacffd37916 https://conda.anaconda.org/conda-forge/linux-64/libcups-2.3.3-h4637d8d_4.conda#d4529f4dff3057982a7617c7ac58fde3 https://conda.anaconda.org/conda-forge/linux-64/libfreetype-2.13.3-ha770c72_1.conda#51f5be229d83ecd401fb369ab96ae669 https://conda.anaconda.org/conda-forge/linux-64/libglib-2.84.1-h2ff4ddf_0.conda#0305434da649d4fb48a425e588b79ea6 https://conda.anaconda.org/conda-forge/linux-64/libglx-1.7.0-ha4b6fd6_2.conda#c8013e438185f33b13814c5c488acd5c -https://conda.anaconda.org/conda-forge/linux-64/libxml2-2.13.7-h4bc477f_1.conda#ad1f1f8238834cd3c88ceeaee8da444a +https://conda.anaconda.org/conda-forge/linux-64/libxml2-2.13.8-h4bc477f_0.conda#14dbe05b929e329dbaa6f2d0aa19466d https://conda.anaconda.org/conda-forge/linux-64/markupsafe-3.0.2-py310h89163eb_1.conda#8ce3f0332fd6de0d737e2911d329523f https://conda.anaconda.org/conda-forge/noarch/meson-1.8.0-pyh29332c3_0.conda#8e25221b702272394b86b0f4d7217f77 https://conda.anaconda.org/conda-forge/noarch/munkres-1.1.4-pyh9f0ad1d_0.tar.bz2#2ba8498c1018c1e9c61eb99b973dfe19 -https://conda.anaconda.org/conda-forge/noarch/narwhals-1.38.0-pyhe01879c_0.conda#6d3bd92df4504d07c0ab7cfb81d7e4b1 +https://conda.anaconda.org/conda-forge/noarch/narwhals-1.38.2-pyhe01879c_0.conda#cd7799e415324fcc94dcf2405095c7da https://conda.anaconda.org/conda-forge/noarch/networkx-3.4.2-pyh267e887_2.conda#fd40bf7f7f4bc4b647dc8512053d9873 https://conda.anaconda.org/conda-forge/linux-64/openblas-0.3.29-pthreads_h6ec200e_0.conda#7e4d48870b3258bea920d51b7f495a81 https://conda.anaconda.org/conda-forge/linux-64/openjpeg-2.5.3-h5fbd93e_0.conda#9e5816bc95d285c115a3ebc2f8563564 https://conda.anaconda.org/conda-forge/noarch/packaging-25.0-pyh29332c3_1.conda#58335b26c38bf4a20f399384c33cbcf9 -https://conda.anaconda.org/conda-forge/noarch/platformdirs-4.3.7-pyh29332c3_0.conda#e57da6fe54bb3a5556cf36d199ff07d8 +https://conda.anaconda.org/conda-forge/noarch/platformdirs-4.3.8-pyhe01879c_0.conda#424844562f5d337077b445ec6b1398a7 https://conda.anaconda.org/conda-forge/noarch/pluggy-1.5.0-pyhd8ed1ab_1.conda#e9dcbce5f45f9ee500e728ae58b605b6 https://conda.anaconda.org/conda-forge/linux-64/psutil-7.0.0-py310ha75aee5_0.conda#da7d592394ff9084a23f62a1186451a2 https://conda.anaconda.org/conda-forge/noarch/pycparser-2.22-pyh29332c3_1.conda#12c566707c80111f9799308d9e265aef @@ -180,7 +177,8 @@ https://conda.anaconda.org/conda-forge/linux-64/brunsli-0.1-h9c3ff4c_0.tar.bz2#c https://conda.anaconda.org/conda-forge/linux-64/c-compiler-1.9.0-h2b85faf_0.conda#3cb814f83f1f71ac1985013697f80cc1 https://conda.anaconda.org/conda-forge/linux-64/cffi-1.17.1-py310h8deb56e_0.conda#1fc24a3196ad5ede2a68148be61894f4 https://conda.anaconda.org/conda-forge/linux-64/dbus-1.13.6-h5008d03_3.tar.bz2#ecfff944ba3960ecb334b9a2663d708d -https://conda.anaconda.org/conda-forge/linux-64/fonttools-4.57.0-py310h89163eb_0.conda#34378af82141b3c1725dcdf898b28fc6 +https://conda.anaconda.org/conda-forge/noarch/exceptiongroup-1.3.0-pyhd8ed1ab_0.conda#72e42d28960d875c7654614f8b50939a +https://conda.anaconda.org/conda-forge/linux-64/fonttools-4.58.0-py310h89163eb_0.conda#4532df8a45ab4e37b2cc71186304dd5a https://conda.anaconda.org/conda-forge/linux-64/freetype-2.13.3-ha770c72_1.conda#9ccd736d31e0c6e41f54e704e5312811 https://conda.anaconda.org/conda-forge/linux-64/gfortran-13.3.0-h9576a4e_2.conda#19e6d3c9cde10a0a9a170a684082588e https://conda.anaconda.org/conda-forge/linux-64/gfortran_linux-64-13.3.0-hb919d3a_10.conda#7ce070e3329cd10bf79dbed562a21bd4 @@ -199,10 +197,10 @@ https://conda.anaconda.org/conda-forge/linux-64/libxkbcommon-1.9.2-h65c71a3_0.co https://conda.anaconda.org/conda-forge/linux-64/libxslt-1.1.39-h76b75d6_0.conda#e71f31f8cfb0a91439f2086fc8aa0461 https://conda.anaconda.org/conda-forge/noarch/memory_profiler-0.61.0-pyhd8ed1ab_1.conda#71abbefb6f3b95e1668cd5e0af3affb9 https://conda.anaconda.org/conda-forge/linux-64/openldap-2.6.9-he970967_0.conda#ca2de8bbdc871bce41dbf59e51324165 +https://conda.anaconda.org/conda-forge/linux-64/pillow-11.2.1-py310h7e6dc6c_0.conda#5645a243d90adb50909b9edc209d84fe https://conda.anaconda.org/conda-forge/noarch/pip-25.1.1-pyh8b19718_0.conda#32d0781ace05105cc99af55d36cbec7c https://conda.anaconda.org/conda-forge/noarch/plotly-6.0.1-pyhd8ed1ab_0.conda#37ce02c899ff42ac5c554257b1a5906e https://conda.anaconda.org/conda-forge/noarch/pyproject-metadata-0.9.1-pyhd8ed1ab_0.conda#22ae7c6ea81e0c8661ef32168dda929b -https://conda.anaconda.org/conda-forge/noarch/pytest-8.3.5-pyhd8ed1ab_0.conda#c3c9316209dec74a705a36797970c6be https://conda.anaconda.org/conda-forge/noarch/python-dateutil-2.9.0.post0-pyhff2d567_1.conda#5ba79d7c71f03c678c8ead841f347d6e https://conda.anaconda.org/conda-forge/noarch/python-gil-3.10.17-hd8ed1ab_0.conda#c856adbd93a57004e21cd26564f4f724 https://conda.anaconda.org/conda-forge/noarch/typing-extensions-4.13.2-h0e9735f_0.conda#568ed1300869dca0ba09fb750cda5dbb @@ -223,11 +221,10 @@ https://conda.anaconda.org/conda-forge/noarch/lazy-loader-0.4-pyhd8ed1ab_2.conda https://conda.anaconda.org/conda-forge/linux-64/libclang-cpp20.1-20.1.4-default_h1df26ce_0.conda#96f8d5b2e94c9ba4fef19f1adf068a15 https://conda.anaconda.org/conda-forge/linux-64/libclang13-20.1.4-default_he06ed0a_0.conda#2d933632c8004be47deb2be61bf013be https://conda.anaconda.org/conda-forge/linux-64/liblapacke-3.9.0-31_he2f377e_openblas.conda#7e5fff7d0db69be3a266f7e79a3bb0e2 -https://conda.anaconda.org/conda-forge/linux-64/libpq-17.4-h27ae623_1.conda#37fba334855ef3b51549308e61ed7a3d +https://conda.anaconda.org/conda-forge/linux-64/libpq-17.5-h27ae623_0.conda#6458be24f09e1b034902ab44fe9de908 https://conda.anaconda.org/conda-forge/noarch/meson-python-0.18.0-pyh70fd9c4_0.conda#576c04b9d9f8e45285fb4d9452c26133 https://conda.anaconda.org/conda-forge/linux-64/numpy-2.2.5-py310hefbff90_0.conda#5526bc875ec897f0d335e38da832b6ee -https://conda.anaconda.org/conda-forge/linux-64/pillow-11.1.0-py310h7e6dc6c_0.conda#14d300b9e1504748e70cc6499a7b4d25 -https://conda.anaconda.org/conda-forge/noarch/pytest-xdist-3.6.1-pyhd8ed1ab_1.conda#59aad4fb37cabc0bacc73cf344612ddd +https://conda.anaconda.org/conda-forge/noarch/pytest-8.3.5-pyhd8ed1ab_0.conda#c3c9316209dec74a705a36797970c6be https://conda.anaconda.org/conda-forge/linux-64/xorg-libxtst-1.2.5-hb9d3cd8_3.conda#7bbe9a0cc0df0ac5f5a8ad6d6a11af2f https://conda.anaconda.org/conda-forge/linux-64/zstandard-0.23.0-py310ha75aee5_2.conda#f9254b5b0193982416b91edcb4b2676f https://conda.anaconda.org/conda-forge/linux-64/blas-devel-3.9.0-31_h1ea3ea9_openblas.conda#ba652ee0576396d4765e567f043c57f9 @@ -239,25 +236,26 @@ https://conda.anaconda.org/conda-forge/noarch/imageio-2.37.0-pyhfb79c49_0.conda# https://conda.anaconda.org/conda-forge/noarch/lazy_loader-0.4-pyhd8ed1ab_2.conda#bb0230917e2473c77d615104dbe8a49d https://conda.anaconda.org/conda-forge/linux-64/pandas-2.2.3-py310h5eaa309_3.conda#07697a584fab513ce895c4511f7a2403 https://conda.anaconda.org/conda-forge/noarch/patsy-1.0.1-pyhd8ed1ab_1.conda#ee23fabfd0a8c6b8d6f3729b47b2859d -https://conda.anaconda.org/conda-forge/linux-64/polars-1.27.1-py39h2a4a510_3.conda#fba08963eaa1f954480045d033d1221e +https://conda.anaconda.org/conda-forge/linux-64/polars-1.29.0-py39h441220d_0.conda#6be2bbd70bf401a6f59952ba1355d8b8 +https://conda.anaconda.org/conda-forge/noarch/pytest-xdist-3.6.1-pyhd8ed1ab_1.conda#59aad4fb37cabc0bacc73cf344612ddd https://conda.anaconda.org/conda-forge/linux-64/pywavelets-1.8.0-py310hf462985_0.conda#4c441eff2be2e65bd67765c5642051c5 https://conda.anaconda.org/conda-forge/linux-64/scipy-1.15.2-py310h1d65ade_0.conda#8c29cd33b64b2eb78597fa28b5595c8d https://conda.anaconda.org/conda-forge/noarch/towncrier-24.8.0-pyhd8ed1ab_1.conda#820b6a1ddf590fba253f8204f7200d82 https://conda.anaconda.org/conda-forge/noarch/urllib3-2.4.0-pyhd8ed1ab_0.conda#c1e349028e0052c4eea844e94f773065 https://conda.anaconda.org/conda-forge/linux-64/blas-2.131-openblas.conda#38b2ec894c69bb4be0e66d2ef7fc60bf https://conda.anaconda.org/conda-forge/linux-64/harfbuzz-11.1.0-h3beb420_0.conda#95e3bb97f9cdc251c0c68640e9c10ed3 -https://conda.anaconda.org/conda-forge/linux-64/matplotlib-base-3.10.1-py310h68603db_0.conda#29cf3f5959afb841eda926541f26b0fb +https://conda.anaconda.org/conda-forge/linux-64/matplotlib-base-3.10.3-py310h68603db_0.conda#50084ca38bf28440e2762966bac143fc https://conda.anaconda.org/conda-forge/linux-64/pyamg-5.2.1-py310ha2bacc8_1.conda#817d32861729e14f474249f1036291c4 https://conda.anaconda.org/conda-forge/noarch/requests-2.32.3-pyhd8ed1ab_1.conda#a9b9368f3701a417eac9edbcae7cb737 https://conda.anaconda.org/conda-forge/linux-64/statsmodels-0.14.4-py310hf462985_0.conda#636d3c500d8a851e377360e88ec95372 -https://conda.anaconda.org/conda-forge/noarch/tifffile-2025.3.30-pyhd8ed1ab_0.conda#14f46147fae19bb867f82a787c7059e9 +https://conda.anaconda.org/conda-forge/noarch/tifffile-2025.5.10-pyhd8ed1ab_0.conda#1fdb801f28bf4987294c49aaa314bf5e https://conda.anaconda.org/conda-forge/noarch/pooch-1.8.2-pyhd8ed1ab_1.conda#b3e783e8e8ed7577cf0b6dee37d1fbac -https://conda.anaconda.org/conda-forge/linux-64/qt6-main-6.9.0-h6441bc3_1.conda#4029a8dcb1d97ea241dbe5abfda1fad6 +https://conda.anaconda.org/conda-forge/linux-64/qt6-main-6.9.0-h8d00660_2.conda#ac0eb548e24a2cb3c2c8ba060aef7db2 https://conda.anaconda.org/conda-forge/linux-64/scikit-image-0.25.2-py310h5eaa309_0.conda#4cc3a231679ecb3c0ba20ebf3c27d12e https://conda.anaconda.org/conda-forge/noarch/seaborn-base-0.13.2-pyhd8ed1ab_3.conda#fd96da444e81f9e6fcaac38590f3dd42 https://conda.anaconda.org/conda-forge/linux-64/pyside6-6.9.0-py310hfd10a26_0.conda#1610ccfe262ee519716bb69bd4395572 https://conda.anaconda.org/conda-forge/noarch/seaborn-0.13.2-hd8ed1ab_3.conda#62afb877ca2c2b4b6f9ecb37320085b6 -https://conda.anaconda.org/conda-forge/linux-64/matplotlib-3.10.1-py310hff52083_0.conda#45c1ad6a0351492b56d1b2bb5442cdfa +https://conda.anaconda.org/conda-forge/linux-64/matplotlib-3.10.3-py310hff52083_0.conda#4162a00ddf1d805557aff34ddf113f46 https://conda.anaconda.org/conda-forge/noarch/numpydoc-1.8.0-pyhd8ed1ab_1.conda#5af206d64d18d6c8dfb3122b4d9e643b https://conda.anaconda.org/conda-forge/noarch/pydata-sphinx-theme-0.16.1-pyhd8ed1ab_0.conda#837aaf71ddf3b27acae0e7e9015eebc6 https://conda.anaconda.org/conda-forge/noarch/sphinx-copybutton-0.5.2-pyhd8ed1ab_1.conda#bf22cb9c439572760316ce0748af3713 @@ -329,4 +327,4 @@ https://conda.anaconda.org/conda-forge/noarch/sphinxext-opengraph-0.9.1-pyhd8ed1 # pip nbconvert @ https://files.pythonhosted.org/packages/cc/9a/cd673b2f773a12c992f41309ef81b99da1690426bd2f96957a7ade0d3ed7/nbconvert-7.16.6-py3-none-any.whl#sha256=1375a7b67e0c2883678c48e506dc320febb57685e5ee67faa51b18a90f3a712b # pip jupyter-server @ https://files.pythonhosted.org/packages/e2/a2/89eeaf0bb954a123a909859fa507fa86f96eb61b62dc30667b60dbd5fdaf/jupyter_server-2.15.0-py3-none-any.whl#sha256=872d989becf83517012ee669f09604aa4a28097c0bd90b2f424310156c2cdae3 # pip jupyterlab-server @ https://files.pythonhosted.org/packages/54/09/2032e7d15c544a0e3cd831c51d77a8ca57f7555b2e1b2922142eddb02a84/jupyterlab_server-2.27.3-py3-none-any.whl#sha256=e697488f66c3db49df675158a77b3b017520d772c6e1548c7d9bcc5df7944ee4 -# pip jupyterlite-sphinx @ https://files.pythonhosted.org/packages/a9/f2/b64ad053b8b6fed95c46e8df85ee3349a1cca47e006eb6a65671c9a1c6e5/jupyterlite_sphinx-0.20.0-py3-none-any.whl#sha256=de2cb966f389d70cc269f501af24f0cbb1f47d521a89ee79ac83f0ad302214fc +# pip jupyterlite-sphinx @ https://files.pythonhosted.org/packages/b8/68/d35f70a5ae17b30da996c48138c2d655232c2ee839c881ef44587d75d0d3/jupyterlite_sphinx-0.20.1-py3-none-any.whl#sha256=6f477879e9793813b5ed554f08d87b2d949b68595ec5b7570332aa2d0fe0a8c1 diff --git a/build_tools/circle/doc_min_dependencies_linux-64_conda.lock b/build_tools/circle/doc_min_dependencies_linux-64_conda.lock index 7801c08740653..6c49a8e68e591 100644 --- a/build_tools/circle/doc_min_dependencies_linux-64_conda.lock +++ b/build_tools/circle/doc_min_dependencies_linux-64_conda.lock @@ -15,37 +15,39 @@ https://conda.anaconda.org/conda-forge/noarch/fonts-conda-forge-1-0.tar.bz2#f766 https://conda.anaconda.org/conda-forge/linux-64/ld_impl_linux-64-2.43-h712a8e2_4.conda#01f8d123c96816249efd255a31ad7712 https://conda.anaconda.org/conda-forge/noarch/libgcc-devel_linux-64-13.3.0-hc03c837_102.conda#4c1d6961a6a54f602ae510d9bf31fa60 https://conda.anaconda.org/conda-forge/linux-64/libglvnd-1.7.0-ha4b6fd6_2.conda#434ca7e50e40f4918ab701e3facd59a0 -https://conda.anaconda.org/conda-forge/linux-64/libgomp-14.2.0-h767d61c_2.conda#06d02030237f4d5b3d9a7e7d348fe3c6 +https://conda.anaconda.org/conda-forge/linux-64/libgomp-15.1.0-h767d61c_2.conda#fbe7d535ff9d3a168c148e07358cd5b1 https://conda.anaconda.org/conda-forge/noarch/libstdcxx-devel_linux-64-13.3.0-hc03c837_102.conda#aa38de2738c5f4a72a880e3d31ffe8b4 https://conda.anaconda.org/conda-forge/noarch/sysroot_linux-64-2.17-h0157908_18.conda#460eba7851277ec1fd80a1a24080787a https://conda.anaconda.org/conda-forge/linux-64/_openmp_mutex-4.5-2_gnu.tar.bz2#73aaf86a425cc6e73fcf236a5a46396d https://conda.anaconda.org/conda-forge/linux-64/binutils_impl_linux-64-2.43-h4bf12b8_4.conda#ef67db625ad0d2dce398837102f875ed https://conda.anaconda.org/conda-forge/noarch/fonts-conda-ecosystem-1-0.tar.bz2#fee5683a3f04bd15cbd8318b096a27ab https://conda.anaconda.org/conda-forge/linux-64/libegl-1.7.0-ha4b6fd6_2.conda#c151d5eb730e9b7480e6d48c0fc44048 +https://conda.anaconda.org/conda-forge/linux-64/libopengl-1.7.0-ha4b6fd6_2.conda#7df50d44d4a14d6c31a2c54f2cd92157 https://conda.anaconda.org/conda-forge/linux-64/binutils-2.43-h4852527_4.conda#29782348a527eda3ecfc673109d28e93 https://conda.anaconda.org/conda-forge/linux-64/binutils_linux-64-2.43-h4852527_4.conda#c87e146f5b685672d4aa6b527c6d3b5e -https://conda.anaconda.org/conda-forge/linux-64/libgcc-14.2.0-h767d61c_2.conda#ef504d1acbd74b7cc6849ef8af47dd03 +https://conda.anaconda.org/conda-forge/linux-64/libgcc-15.1.0-h767d61c_2.conda#ea8ac52380885ed41c1baa8f1d6d2b93 https://conda.anaconda.org/conda-forge/linux-64/alsa-lib-1.2.14-hb9d3cd8_0.conda#76df83c2a9035c54df5d04ff81bcc02d https://conda.anaconda.org/conda-forge/linux-64/gettext-tools-0.24.1-h5888daf_0.conda#d54305672f0361c2f3886750e7165b5f https://conda.anaconda.org/conda-forge/linux-64/libbrotlicommon-1.1.0-hb9d3cd8_2.conda#41b599ed2b02abcfdd84302bff174b23 https://conda.anaconda.org/conda-forge/linux-64/libdeflate-1.23-h86f0d12_0.conda#27fe770decaf469a53f3e3a6d593067f https://conda.anaconda.org/conda-forge/linux-64/libexpat-2.7.0-h5888daf_0.conda#db0bfbe7dd197b68ad5f30333bae6ce0 https://conda.anaconda.org/conda-forge/linux-64/libffi-3.4.6-h2dba641_1.conda#ede4673863426c0883c0063d853bbd85 -https://conda.anaconda.org/conda-forge/linux-64/libgcc-ng-14.2.0-h69a702a_2.conda#a2222a6ada71fb478682efe483ce0f92 +https://conda.anaconda.org/conda-forge/linux-64/libgcc-ng-15.1.0-h69a702a_2.conda#ddca86c7040dd0e73b2b69bd7833d225 https://conda.anaconda.org/conda-forge/linux-64/libgettextpo-0.24.1-h5888daf_0.conda#2ee6d71b72f75d50581f2f68e965efdb -https://conda.anaconda.org/conda-forge/linux-64/libgfortran5-14.2.0-hf1ad2bd_2.conda#556a4fdfac7287d349b8f09aba899693 +https://conda.anaconda.org/conda-forge/linux-64/libgfortran5-15.1.0-hcea5267_2.conda#01de444988ed960031dbe84cf4f9b1fc https://conda.anaconda.org/conda-forge/linux-64/libiconv-1.18-h4ce23a2_1.conda#e796ff8ddc598affdf7c173d6145f087 https://conda.anaconda.org/conda-forge/linux-64/libjpeg-turbo-3.1.0-hb9d3cd8_0.conda#9fa334557db9f63da6c9285fd2a48638 https://conda.anaconda.org/conda-forge/linux-64/liblzma-5.8.1-hb9d3cd8_1.conda#a76fd702c93cd2dfd89eff30a5fd45a8 https://conda.anaconda.org/conda-forge/linux-64/libntlm-1.8-hb9d3cd8_0.conda#7c7927b404672409d9917d49bff5f2d6 https://conda.anaconda.org/conda-forge/linux-64/libogg-1.3.5-hd0c01bc_1.conda#68e52064ed3897463c0e958ab5c8f91b https://conda.anaconda.org/conda-forge/linux-64/libopus-1.5.2-hd0c01bc_0.conda#b64523fb87ac6f87f0790f324ad43046 -https://conda.anaconda.org/conda-forge/linux-64/libstdcxx-14.2.0-h8f9b012_2.conda#a78c856b6dc6bf4ea8daeb9beaaa3fb0 +https://conda.anaconda.org/conda-forge/linux-64/libstdcxx-15.1.0-h8f9b012_2.conda#1cb1c67961f6dd257eae9e9691b341aa https://conda.anaconda.org/conda-forge/linux-64/libwebp-base-1.5.0-h851e524_0.conda#63f790534398730f59e1b899c3644d4a https://conda.anaconda.org/conda-forge/linux-64/libzlib-1.3.1-hb9d3cd8_2.conda#edb0dca6bc32e4f4789199455a1dbeb8 https://conda.anaconda.org/conda-forge/linux-64/ncurses-6.5-h2d0b736_3.conda#47e340acb35de30501a76c7c799c41d7 https://conda.anaconda.org/conda-forge/linux-64/openssl-3.5.0-h7b32b05_1.conda#de356753cfdbffcde5bb1e86e3aa6cd0 https://conda.anaconda.org/conda-forge/linux-64/pthread-stubs-0.4-hb9d3cd8_1002.conda#b3c17d95b5a10c6e64a21fa17573e70e +https://conda.anaconda.org/conda-forge/linux-64/rav1e-0.7.1-h8fae777_3.conda#2c42649888aac645608191ffdc80d13a https://conda.anaconda.org/conda-forge/linux-64/xorg-libice-1.1.2-hb9d3cd8_0.conda#fb901ff28063514abb6046c9ec2c4a45 https://conda.anaconda.org/conda-forge/linux-64/xorg-libxau-1.0.12-hb9d3cd8_0.conda#f6ebe2cb3f82ba6c057dde5d9debe4f7 https://conda.anaconda.org/conda-forge/linux-64/xorg-libxdmcp-1.1.5-hb9d3cd8_0.conda#8035c64cb77ed555e3f150b7b3972480 @@ -66,15 +68,15 @@ https://conda.anaconda.org/conda-forge/linux-64/libbrotlienc-1.1.0-hb9d3cd8_2.co https://conda.anaconda.org/conda-forge/linux-64/libedit-3.1.20250104-pl5321h7949ede_0.conda#c277e0a4d549b03ac1e9d6cbbe3d017b https://conda.anaconda.org/conda-forge/linux-64/libevent-2.1.12-hf998b51_1.conda#a1cfcc585f0c42bf8d5546bb1dfb668d https://conda.anaconda.org/conda-forge/linux-64/libgettextpo-devel-0.24.1-h5888daf_0.conda#8f04c7aae6a46503bc36d1ed5abc8c7c -https://conda.anaconda.org/conda-forge/linux-64/libgfortran-14.2.0-h69a702a_2.conda#fb54c4ea68b460c278d26eea89cfbcc3 +https://conda.anaconda.org/conda-forge/linux-64/libgfortran-15.1.0-h69a702a_2.conda#f92e6e0a3c0c0c85561ef61aa59d555d https://conda.anaconda.org/conda-forge/linux-64/libgpg-error-1.55-h3f2d84a_0.conda#2bd47db5807daade8500ed7ca4c512a4 https://conda.anaconda.org/conda-forge/linux-64/libhwy-1.2.0-hf40a0c7_0.conda#2f433d593a66044c3f163cb25f0a09de https://conda.anaconda.org/conda-forge/linux-64/libnsl-2.0.1-hd590300_0.conda#30fd6e37fe21f86f4bd26d6ee73eeec7 https://conda.anaconda.org/conda-forge/linux-64/libpciaccess-0.18-hd590300_0.conda#48f4330bfcd959c3cfb704d424903c82 https://conda.anaconda.org/conda-forge/linux-64/libpng-1.6.47-h943b412_0.conda#55199e2ae2c3651f6f9b2a447b47bdc9 https://conda.anaconda.org/conda-forge/linux-64/libsanitizer-13.3.0-he8ea267_2.conda#2b6cdf7bb95d3d10ef4e38ce0bc95dba -https://conda.anaconda.org/conda-forge/linux-64/libsqlite-3.49.1-hee588c1_2.conda#962d6ac93c30b1dfc54c9cccafd1003e -https://conda.anaconda.org/conda-forge/linux-64/libstdcxx-ng-14.2.0-h4852527_2.conda#c75da67f045c2627f59e6fcb5f4e3a9b +https://conda.anaconda.org/conda-forge/linux-64/libsqlite-3.49.2-hee588c1_0.conda#93048463501053a00739215ea3f36324 +https://conda.anaconda.org/conda-forge/linux-64/libstdcxx-ng-15.1.0-h4852527_2.conda#9d2072af184b5caa29492bf2344597bb https://conda.anaconda.org/conda-forge/linux-64/libuuid-2.38.1-h0b41bf4_0.conda#40b61aab5c7ba9ff276c41cfffe6b80b https://conda.anaconda.org/conda-forge/linux-64/libxcb-1.17.0-h8a09558_0.conda#92ed62436b625154323d40d5f2f11dd7 https://conda.anaconda.org/conda-forge/linux-64/libxcrypt-4.4.36-hd590300_1.conda#5aa797f8787fe7a17d1b0821485b5adc @@ -84,7 +86,6 @@ https://conda.anaconda.org/conda-forge/linux-64/mysql-common-9.0.1-h266115a_6.co https://conda.anaconda.org/conda-forge/linux-64/ninja-1.12.1-hff21bea_1.conda#2322531904f27501ee19847b87ba7c64 https://conda.anaconda.org/conda-forge/linux-64/nspr-4.36-h5888daf_0.conda#de9cd5bca9e4918527b9b72b6e2e1409 https://conda.anaconda.org/conda-forge/linux-64/pixman-0.46.0-h29eaf8c_0.conda#d2f1c87d4416d1e7344cf92b1aaee1c4 -https://conda.anaconda.org/conda-forge/linux-64/rav1e-0.6.6-he8a937b_2.conda#77d9955b4abddb811cb8ab1aa7d743e4 https://conda.anaconda.org/conda-forge/linux-64/readline-8.2-h8c095d6_2.conda#283b96675859b20a825f8fa30f311446 https://conda.anaconda.org/conda-forge/linux-64/snappy-1.2.1-h8bd8927_1.conda#3b3e64af585eadfb52bb90b553db5edf https://conda.anaconda.org/conda-forge/linux-64/svt-av1-3.0.2-h5888daf_0.conda#0096882bd623e6cc09e8bf920fc8fb47 @@ -109,7 +110,7 @@ https://conda.anaconda.org/conda-forge/linux-64/libcap-2.75-h39aace5_0.conda#c44 https://conda.anaconda.org/conda-forge/linux-64/libdrm-2.4.124-hb9d3cd8_0.conda#8bc89311041d7fcb510238cf0848ccae https://conda.anaconda.org/conda-forge/linux-64/libfreetype6-2.13.3-h48d6fc4_1.conda#3c255be50a506c50765a93a6644f32fe https://conda.anaconda.org/conda-forge/linux-64/libgcrypt-lib-1.11.0-hb9d3cd8_2.conda#e55712ff40a054134d51b89afca57dbc -https://conda.anaconda.org/conda-forge/linux-64/libgfortran-ng-14.2.0-h69a702a_2.conda#4056c857af1a99ee50589a941059ec55 +https://conda.anaconda.org/conda-forge/linux-64/libgfortran-ng-15.1.0-h69a702a_2.conda#a483a87b71e974bb75d1b9413d4436dd https://conda.anaconda.org/conda-forge/linux-64/libjxl-0.11.1-h7b0646d_1.conda#959fc2b6c0df7883e070b3fe525219a5 https://conda.anaconda.org/conda-forge/linux-64/libtiff-4.7.0-hd9ff511_4.conda#6c1028898cf3a2032d9af46689e1b81a https://conda.anaconda.org/conda-forge/linux-64/libvorbis-1.3.7-h9c3ff4c_0.tar.bz2#309dec04b70a3cc0f1e84a4013683bc0 @@ -130,14 +131,13 @@ https://conda.anaconda.org/conda-forge/linux-64/brotli-1.1.0-hb9d3cd8_2.conda#98 https://conda.anaconda.org/conda-forge/linux-64/brotli-python-1.1.0-py310hf71b8c6_2.conda#bf502c169c71e3c6ac0d6175addfacc2 https://conda.anaconda.org/conda-forge/noarch/certifi-2025.4.26-pyhd8ed1ab_0.conda#c33eeaaa33f45031be34cda513df39b6 https://conda.anaconda.org/conda-forge/noarch/charset-normalizer-3.4.2-pyhd8ed1ab_0.conda#40fe4284b8b5835a9073a645139f35af -https://conda.anaconda.org/conda-forge/noarch/click-8.1.8-pyh707e725_0.conda#f22f4d4970e09d68a10b922cbb0408d3 +https://conda.anaconda.org/conda-forge/noarch/click-8.2.0-pyh707e725_0.conda#4d4f33c3d9e5a23a7f4795d327a5d1f0 https://conda.anaconda.org/conda-forge/noarch/cloudpickle-3.1.1-pyhd8ed1ab_0.conda#364ba6c9fb03886ac979b482f39ebb92 https://conda.anaconda.org/conda-forge/noarch/colorama-0.4.6-pyhd8ed1ab_1.conda#962b9857ee8e7018c22f2776ffa0b2d7 https://conda.anaconda.org/conda-forge/noarch/cycler-0.12.1-pyhd8ed1ab_1.conda#44600c4667a319d67dbe0681fc0bc833 https://conda.anaconda.org/conda-forge/linux-64/cyrus-sasl-2.1.27-h54b06d7_7.conda#dce22f70b4e5a407ce88f2be046f4ceb https://conda.anaconda.org/conda-forge/linux-64/cython-3.0.10-py310hc6cd4ac_0.conda#bd1d71ee240be36f1d85c86177d6964f https://conda.anaconda.org/conda-forge/noarch/docutils-0.21.2-pyhd8ed1ab_1.conda#24c1ca34138ee57de72a943237cde4cc -https://conda.anaconda.org/conda-forge/noarch/exceptiongroup-1.2.2-pyhd8ed1ab_1.conda#a16662747cdeb9abbac74d0057cc976e https://conda.anaconda.org/conda-forge/noarch/execnet-2.1.1-pyhd8ed1ab_1.conda#a71efeae2c160f6789900ba2631a2c90 https://conda.anaconda.org/conda-forge/noarch/fsspec-2025.3.2-pyhd8ed1ab_0.conda#9c40692c3d24c7aaf335f673ac09d308 https://conda.anaconda.org/conda-forge/linux-64/gcc-13.3.0-h9576a4e_2.conda#d92e51bf4b6bdbfe45e5884fb0755afe @@ -152,7 +152,7 @@ https://conda.anaconda.org/conda-forge/noarch/imagesize-1.4.1-pyhd8ed1ab_0.tar.b https://conda.anaconda.org/conda-forge/noarch/iniconfig-2.0.0-pyhd8ed1ab_1.conda#6837f3eff7dcea42ecd714ce1ac2b108 https://conda.anaconda.org/conda-forge/linux-64/kiwisolver-1.4.7-py310h3788b33_0.conda#4186d9b4d004b0fe0de6aa62496fb48a https://conda.anaconda.org/conda-forge/linux-64/lcms2-2.17-h717163a_0.conda#000e85703f0fd9594c81710dd5066471 -https://conda.anaconda.org/conda-forge/linux-64/libavif16-1.2.1-hbb36593_2.conda#971387a27e61235b97cacb440a37e991 +https://conda.anaconda.org/conda-forge/linux-64/libavif16-1.3.0-h766b0b6_0.conda#f17f2d0e5c9ad6b958547fd67b155771 https://conda.anaconda.org/conda-forge/linux-64/libcblas-3.9.0-31_hba4ea11_blis.conda#1ea7ae3db0fea0c5222388d841583c51 https://conda.anaconda.org/conda-forge/linux-64/libcups-2.3.3-h4637d8d_4.conda#d4529f4dff3057982a7617c7ac58fde3 https://conda.anaconda.org/conda-forge/linux-64/libfreetype-2.13.3-ha770c72_1.conda#51f5be229d83ecd401fb369ab96ae669 @@ -160,7 +160,7 @@ https://conda.anaconda.org/conda-forge/linux-64/libglib-2.84.1-h3618099_1.conda# https://conda.anaconda.org/conda-forge/linux-64/libglx-1.7.0-ha4b6fd6_2.conda#c8013e438185f33b13814c5c488acd5c https://conda.anaconda.org/conda-forge/linux-64/liblapack-3.9.0-12_hd37a5e2_netlib.conda#4b181b55915cefcd35c8398c9274e629 https://conda.anaconda.org/conda-forge/linux-64/libsystemd0-257.4-h4e0b6ca_1.conda#04bcf3055e51f8dde6fab9672fb9fca0 -https://conda.anaconda.org/conda-forge/linux-64/libxml2-2.13.7-h4bc477f_1.conda#ad1f1f8238834cd3c88ceeaee8da444a +https://conda.anaconda.org/conda-forge/linux-64/libxml2-2.13.8-h4bc477f_0.conda#14dbe05b929e329dbaa6f2d0aa19466d https://conda.anaconda.org/conda-forge/noarch/locket-1.0.0-pyhd8ed1ab_0.tar.bz2#91e27ef3d05cc772ce627e51cff111c4 https://conda.anaconda.org/conda-forge/linux-64/markupsafe-3.0.2-py310h89163eb_1.conda#8ce3f0332fd6de0d737e2911d329523f https://conda.anaconda.org/conda-forge/noarch/meson-1.8.0-pyh29332c3_0.conda#8e25221b702272394b86b0f4d7217f77 @@ -204,7 +204,8 @@ https://conda.anaconda.org/conda-forge/linux-64/c-compiler-1.9.0-h2b85faf_0.cond https://conda.anaconda.org/conda-forge/linux-64/cffi-1.17.1-py310h8deb56e_0.conda#1fc24a3196ad5ede2a68148be61894f4 https://conda.anaconda.org/conda-forge/linux-64/cytoolz-1.0.1-py310ha75aee5_0.conda#d0be1adaa04a03aed745f3d02afb59ce https://conda.anaconda.org/conda-forge/linux-64/dbus-1.13.6-h5008d03_3.tar.bz2#ecfff944ba3960ecb334b9a2663d708d -https://conda.anaconda.org/conda-forge/linux-64/fonttools-4.57.0-py310h89163eb_0.conda#34378af82141b3c1725dcdf898b28fc6 +https://conda.anaconda.org/conda-forge/noarch/exceptiongroup-1.3.0-pyhd8ed1ab_0.conda#72e42d28960d875c7654614f8b50939a +https://conda.anaconda.org/conda-forge/linux-64/fonttools-4.58.0-py310h89163eb_0.conda#4532df8a45ab4e37b2cc71186304dd5a https://conda.anaconda.org/conda-forge/linux-64/freetype-2.13.3-ha770c72_1.conda#9ccd736d31e0c6e41f54e704e5312811 https://conda.anaconda.org/conda-forge/linux-64/gfortran-13.3.0-h9576a4e_2.conda#19e6d3c9cde10a0a9a170a684082588e https://conda.anaconda.org/conda-forge/linux-64/gfortran_linux-64-13.3.0-hb919d3a_10.conda#7ce070e3329cd10bf79dbed562a21bd4 @@ -225,13 +226,14 @@ https://conda.anaconda.org/conda-forge/noarch/memory_profiler-0.61.0-pyhd8ed1ab_ https://conda.anaconda.org/conda-forge/linux-64/numpy-1.22.0-py310h454958d_1.tar.bz2#607c66f0cce2986515a8fe9e136b2b57 https://conda.anaconda.org/conda-forge/linux-64/openldap-2.6.9-he970967_0.conda#ca2de8bbdc871bce41dbf59e51324165 https://conda.anaconda.org/conda-forge/noarch/partd-1.4.2-pyhd8ed1ab_0.conda#0badf9c54e24cecfb0ad2f99d680c163 +https://conda.anaconda.org/conda-forge/linux-64/pillow-11.2.1-py310h7e6dc6c_0.conda#5645a243d90adb50909b9edc209d84fe https://conda.anaconda.org/conda-forge/noarch/pip-25.1.1-pyh8b19718_0.conda#32d0781ace05105cc99af55d36cbec7c https://conda.anaconda.org/conda-forge/noarch/plotly-5.14.0-pyhd8ed1ab_0.conda#6a7bcc42ef58dd6cf3da9333ea102433 https://conda.anaconda.org/conda-forge/noarch/pyproject-metadata-0.9.1-pyhd8ed1ab_0.conda#22ae7c6ea81e0c8661ef32168dda929b -https://conda.anaconda.org/conda-forge/noarch/pytest-8.3.5-pyhd8ed1ab_0.conda#c3c9316209dec74a705a36797970c6be https://conda.anaconda.org/conda-forge/noarch/python-dateutil-2.9.0.post0-pyhff2d567_1.conda#5ba79d7c71f03c678c8ead841f347d6e -https://conda.anaconda.org/conda-forge/linux-64/sip-6.8.6-py310hf71b8c6_2.conda#a50d1007fecaff3f98b19034a8e0b2e7 +https://conda.anaconda.org/conda-forge/linux-64/sip-6.10.0-py310hf71b8c6_0.conda#2d7e4445be227e8210140b75725689ad https://conda.anaconda.org/conda-forge/noarch/typing-extensions-4.13.2-h0e9735f_0.conda#568ed1300869dca0ba09fb750cda5dbb +https://conda.anaconda.org/conda-forge/linux-64/xorg-libxcomposite-0.4.6-hb9d3cd8_2.conda#d3c295b50f092ab525ffe3c2aa4b7413 https://conda.anaconda.org/conda-forge/linux-64/xorg-libxdamage-1.1.6-hb9d3cd8_0.conda#b5fcc7172d22516e1f965490e65e33a4 https://conda.anaconda.org/conda-forge/linux-64/xorg-libxxf86vm-1.1.6-hb9d3cd8_0.conda#5efa5fa6243a622445fdfd72aee15efa https://conda.anaconda.org/conda-forge/noarch/beautifulsoup4-4.13.4-pyha770c72_0.conda#9f07c4fc992adb2d6c30da7fab3959a7 @@ -242,18 +244,19 @@ https://conda.anaconda.org/conda-forge/linux-64/fontconfig-2.15.0-h7e30c49_1.con https://conda.anaconda.org/conda-forge/linux-64/fortran-compiler-1.9.0-h36df796_0.conda#cc0cf942201f9d3b0e9654ea02e12486 https://conda.anaconda.org/conda-forge/linux-64/glib-2.84.1-h6287aef_1.conda#35012688d30e1b52bff2ba5d1f342a50 https://conda.anaconda.org/conda-forge/linux-64/imagecodecs-2024.12.30-py310h78a9a29_0.conda#e0c50079904122427bcf52e1afcd1cdb +https://conda.anaconda.org/conda-forge/noarch/imageio-2.37.0-pyhfb79c49_0.conda#b5577bc2212219566578fd5af9993af6 https://conda.anaconda.org/conda-forge/noarch/importlib-resources-6.5.2-pyhd8ed1ab_0.conda#e376ea42e9ae40f3278b0f79c9bf9826 https://conda.anaconda.org/conda-forge/linux-64/libclang-cpp20.1-20.1.4-default_h1df26ce_0.conda#96f8d5b2e94c9ba4fef19f1adf068a15 https://conda.anaconda.org/conda-forge/linux-64/libclang13-20.1.4-default_he06ed0a_0.conda#2d933632c8004be47deb2be61bf013be -https://conda.anaconda.org/conda-forge/linux-64/libpq-17.4-h27ae623_1.conda#37fba334855ef3b51549308e61ed7a3d +https://conda.anaconda.org/conda-forge/linux-64/libpq-17.5-h27ae623_0.conda#6458be24f09e1b034902ab44fe9de908 https://conda.anaconda.org/conda-forge/linux-64/libsndfile-1.2.2-hc60ed4a_1.conda#ef1910918dd895516a769ed36b5b3a4e +https://conda.anaconda.org/conda-forge/linux-64/matplotlib-base-3.5.0-py310h23f4a51_0.tar.bz2#9911225650b298776c8e8c083b5cacf1 https://conda.anaconda.org/conda-forge/noarch/meson-python-0.18.0-pyh70fd9c4_0.conda#576c04b9d9f8e45285fb4d9452c26133 https://conda.anaconda.org/conda-forge/linux-64/pandas-1.4.0-py310hb5077e9_0.tar.bz2#43e920bc9856daa7d8d18fcbfb244c4e https://conda.anaconda.org/conda-forge/noarch/patsy-1.0.1-pyhd8ed1ab_1.conda#ee23fabfd0a8c6b8d6f3729b47b2859d -https://conda.anaconda.org/conda-forge/linux-64/pillow-11.1.0-py310h7e6dc6c_0.conda#14d300b9e1504748e70cc6499a7b4d25 https://conda.anaconda.org/conda-forge/linux-64/polars-0.20.30-py310h031f9ce_0.conda#0743f5db9f978b6df92d412935ff8371 -https://conda.anaconda.org/conda-forge/linux-64/pyqt5-sip-12.13.0-py310hf71b8c6_1.conda#0c8cbfbe70f4c8a47b040a14615e6f1f -https://conda.anaconda.org/conda-forge/noarch/pytest-xdist-3.6.1-pyhd8ed1ab_1.conda#59aad4fb37cabc0bacc73cf344612ddd +https://conda.anaconda.org/conda-forge/linux-64/pyqt5-sip-12.17.0-py310hf71b8c6_0.conda#012465861673a67a30bc8ca6284074f3 +https://conda.anaconda.org/conda-forge/noarch/pytest-8.3.5-pyhd8ed1ab_0.conda#c3c9316209dec74a705a36797970c6be https://conda.anaconda.org/conda-forge/linux-64/pywavelets-1.6.0-py310h261611a_0.conda#04a405ee0bccb4de8d1ed0c87704f5f6 https://conda.anaconda.org/conda-forge/linux-64/scipy-1.8.0-py310hea5193d_1.tar.bz2#664d80ddeb51241629b3ada5ea926e4d https://conda.anaconda.org/conda-forge/linux-64/zstandard-0.23.0-py310ha75aee5_2.conda#f9254b5b0193982416b91edcb4b2676f @@ -261,23 +264,22 @@ https://conda.anaconda.org/conda-forge/linux-64/blas-2.131-blis.conda#87829e6b9f https://conda.anaconda.org/conda-forge/linux-64/cairo-1.18.4-h3394656_0.conda#09262e66b19567aff4f592fb53b28760 https://conda.anaconda.org/conda-forge/linux-64/compilers-1.9.0-ha770c72_0.conda#5859096e397aba423340d0bbbb11ec64 https://conda.anaconda.org/conda-forge/linux-64/gstreamer-1.24.11-hc37bda9_0.conda#056d86cacf2b48c79c6a562a2486eb8c -https://conda.anaconda.org/conda-forge/noarch/imageio-2.37.0-pyhfb79c49_0.conda#b5577bc2212219566578fd5af9993af6 -https://conda.anaconda.org/conda-forge/linux-64/matplotlib-base-3.5.0-py310h23f4a51_0.tar.bz2#9911225650b298776c8e8c083b5cacf1 https://conda.anaconda.org/conda-forge/linux-64/pulseaudio-client-17.0-hac146a9_1.conda#66b1fa9608d8836e25f9919159adc9c6 https://conda.anaconda.org/conda-forge/linux-64/pyamg-4.2.1-py310h7c3ba0c_0.tar.bz2#89f5a48e1f23b5cf3163a6094903d181 +https://conda.anaconda.org/conda-forge/noarch/pytest-xdist-3.6.1-pyhd8ed1ab_1.conda#59aad4fb37cabc0bacc73cf344612ddd +https://conda.anaconda.org/conda-forge/noarch/seaborn-base-0.13.2-pyhd8ed1ab_3.conda#fd96da444e81f9e6fcaac38590f3dd42 https://conda.anaconda.org/conda-forge/linux-64/statsmodels-0.14.2-py310h261611a_0.conda#4b8508bab02b2aa2cef12eab4883f4a1 -https://conda.anaconda.org/conda-forge/noarch/tifffile-2025.3.30-pyhd8ed1ab_0.conda#14f46147fae19bb867f82a787c7059e9 +https://conda.anaconda.org/conda-forge/noarch/tifffile-2025.5.10-pyhd8ed1ab_0.conda#1fdb801f28bf4987294c49aaa314bf5e https://conda.anaconda.org/conda-forge/noarch/towncrier-24.8.0-pyhd8ed1ab_1.conda#820b6a1ddf590fba253f8204f7200d82 https://conda.anaconda.org/conda-forge/noarch/urllib3-2.4.0-pyhd8ed1ab_0.conda#c1e349028e0052c4eea844e94f773065 https://conda.anaconda.org/conda-forge/linux-64/gst-plugins-base-1.24.11-h651a532_0.conda#d8d8894f8ced2c9be76dc9ad1ae531ce https://conda.anaconda.org/conda-forge/linux-64/harfbuzz-11.1.0-h3beb420_0.conda#95e3bb97f9cdc251c0c68640e9c10ed3 https://conda.anaconda.org/conda-forge/noarch/requests-2.32.3-pyhd8ed1ab_1.conda#a9b9368f3701a417eac9edbcae7cb737 https://conda.anaconda.org/conda-forge/linux-64/scikit-image-0.19.0-py310hb5077e9_0.tar.bz2#aa24b3a4aa979641ac3144405209cd89 -https://conda.anaconda.org/conda-forge/noarch/seaborn-base-0.13.2-pyhd8ed1ab_3.conda#fd96da444e81f9e6fcaac38590f3dd42 +https://conda.anaconda.org/conda-forge/noarch/seaborn-0.13.2-hd8ed1ab_3.conda#62afb877ca2c2b4b6f9ecb37320085b6 https://conda.anaconda.org/conda-forge/noarch/pooch-1.6.0-pyhd8ed1ab_0.tar.bz2#6429e1d1091c51f626b5dcfdd38bf429 https://conda.anaconda.org/conda-forge/linux-64/qt-main-5.15.15-h993ce98_3.conda#aa49f5308f39277477d47cd6687eb8f3 -https://conda.anaconda.org/conda-forge/noarch/seaborn-0.13.2-hd8ed1ab_3.conda#62afb877ca2c2b4b6f9ecb37320085b6 -https://conda.anaconda.org/conda-forge/linux-64/pyqt-5.15.10-py310hb3b5edb_1.conda#c370972fc4557cb54d265c9c1f71bd20 +https://conda.anaconda.org/conda-forge/linux-64/pyqt-5.15.11-py310hf392a12_0.conda#65924d3e57be25342c76530d23d75f0f https://conda.anaconda.org/conda-forge/linux-64/matplotlib-3.5.0-py310hff52083_0.tar.bz2#1b2f3b135d5d9c594b5e0e6150c03b7b https://conda.anaconda.org/conda-forge/noarch/numpydoc-1.2-pyhd8ed1ab_0.tar.bz2#025ad7ca2c7f65007ab6b6f5d93a56eb https://conda.anaconda.org/conda-forge/noarch/pydata-sphinx-theme-0.15.3-pyhd8ed1ab_0.conda#55e445f4fcb07f2471fb0e1102d36488 diff --git a/build_tools/github/pymin_conda_forge_arm_linux-aarch64_conda.lock b/build_tools/github/pymin_conda_forge_arm_linux-aarch64_conda.lock index dc7b4ae5c066e..9ade6530eab80 100644 --- a/build_tools/github/pymin_conda_forge_arm_linux-aarch64_conda.lock +++ b/build_tools/github/pymin_conda_forge_arm_linux-aarch64_conda.lock @@ -8,7 +8,7 @@ https://conda.anaconda.org/conda-forge/noarch/font-ttf-source-code-pro-2.038-h77 https://conda.anaconda.org/conda-forge/noarch/font-ttf-ubuntu-0.83-h77eed37_3.conda#49023d73832ef61042f6a237cb2687e7 https://conda.anaconda.org/conda-forge/linux-aarch64/ld_impl_linux-aarch64-2.43-h80caac9_4.conda#80c9ad5e05e91bb6c0967af3880c9742 https://conda.anaconda.org/conda-forge/linux-aarch64/libglvnd-1.7.0-hd24410f_2.conda#9e115653741810778c9a915a2f8439e7 -https://conda.anaconda.org/conda-forge/linux-aarch64/libgomp-14.2.0-he277a41_2.conda#b11c09d9463daf4cae492d29806b1889 +https://conda.anaconda.org/conda-forge/linux-aarch64/libgomp-15.1.0-he277a41_2.conda#a28544b28961994eab37e1132a7dadcf https://conda.anaconda.org/conda-forge/noarch/python_abi-3.10-7_cp310.conda#44e871cba2b162368476a84b8d040b6c https://conda.anaconda.org/conda-forge/noarch/tzdata-2025b-h78e105d_0.conda#4222072737ccff51314b5ece9c7d6f5a https://conda.anaconda.org/conda-forge/linux-aarch64/_openmp_mutex-4.5-2_gnu.tar.bz2#6168d71addc746e8f2b8d57dfd2edcea @@ -17,18 +17,18 @@ https://conda.anaconda.org/conda-forge/noarch/fonts-conda-forge-1-0.tar.bz2#f766 https://conda.anaconda.org/conda-forge/linux-aarch64/libegl-1.7.0-hd24410f_2.conda#cf105bce884e4ef8c8ccdca9fe6695e7 https://conda.anaconda.org/conda-forge/linux-aarch64/libopengl-1.7.0-hd24410f_2.conda#cf9d12bfab305e48d095a4c79002c922 https://conda.anaconda.org/conda-forge/noarch/fonts-conda-ecosystem-1-0.tar.bz2#fee5683a3f04bd15cbd8318b096a27ab -https://conda.anaconda.org/conda-forge/linux-aarch64/libgcc-14.2.0-he277a41_2.conda#6b4268a60b10f29257b51b9b67ff8d76 +https://conda.anaconda.org/conda-forge/linux-aarch64/libgcc-15.1.0-he277a41_2.conda#224e999bbcad260d7bd4c0c27fdb99a4 https://conda.anaconda.org/conda-forge/linux-aarch64/alsa-lib-1.2.14-h86ecc28_0.conda#a696b24c1b473ecc4774bcb5a6ac6337 https://conda.anaconda.org/conda-forge/linux-aarch64/libbrotlicommon-1.1.0-h86ecc28_2.conda#3ee026955c688f551a9999840cff4c67 https://conda.anaconda.org/conda-forge/linux-aarch64/libdeflate-1.23-he377734_0.conda#308ad7cbe9fd92add59ef3d547a42c17 https://conda.anaconda.org/conda-forge/linux-aarch64/libexpat-2.7.0-h5ad3122_0.conda#d41a057e7968705dae8dcb7c8ba2c8dd https://conda.anaconda.org/conda-forge/linux-aarch64/libffi-3.4.6-he21f813_1.conda#15a131f30cae36e9a655ca81fee9a285 -https://conda.anaconda.org/conda-forge/linux-aarch64/libgcc-ng-14.2.0-he9431aa_2.conda#692c2bb75f32cfafb6799cf6d1c5d0e0 -https://conda.anaconda.org/conda-forge/linux-aarch64/libgfortran5-14.2.0-hb6113d0_2.conda#cd754566661513808ef2408c4ab99a2f +https://conda.anaconda.org/conda-forge/linux-aarch64/libgcc-ng-15.1.0-he9431aa_2.conda#d12a4b26073751bbc3db18de83ccba5f +https://conda.anaconda.org/conda-forge/linux-aarch64/libgfortran5-15.1.0-hbc25352_2.conda#4b5f4d119f9b28f254f82dbe56b2406f https://conda.anaconda.org/conda-forge/linux-aarch64/libiconv-1.18-hc99b53d_1.conda#81541d85a45fbf4d0a29346176f1f21c https://conda.anaconda.org/conda-forge/linux-aarch64/libjpeg-turbo-3.1.0-h86ecc28_0.conda#a689388210d502364b79e8b19e7fa2cb https://conda.anaconda.org/conda-forge/linux-aarch64/liblzma-5.8.1-h86ecc28_1.conda#8ced9a547a29f7a71b7f15a4443ad1de -https://conda.anaconda.org/conda-forge/linux-aarch64/libstdcxx-14.2.0-h3f4de04_2.conda#eadee2cda99697e29411c1013c187b92 +https://conda.anaconda.org/conda-forge/linux-aarch64/libstdcxx-15.1.0-h3f4de04_2.conda#6247ea6d1ecac20a9e98674342984726 https://conda.anaconda.org/conda-forge/linux-aarch64/libwebp-base-1.5.0-h0886dbf_0.conda#95ef4a689b8cc1b7e18b53784d88f96b https://conda.anaconda.org/conda-forge/linux-aarch64/libzlib-1.3.1-h86ecc28_2.conda#08aad7cbe9f5a6b460d0976076b6ae64 https://conda.anaconda.org/conda-forge/linux-aarch64/ncurses-6.5-ha32ae93_3.conda#182afabe009dc78d8b73100255ee6868 @@ -45,17 +45,16 @@ https://conda.anaconda.org/conda-forge/linux-aarch64/lerc-4.0.0-hfdc4d58_1.conda https://conda.anaconda.org/conda-forge/linux-aarch64/libbrotlidec-1.1.0-h86ecc28_2.conda#e64d0f3b59c7c4047446b97a8624a72d https://conda.anaconda.org/conda-forge/linux-aarch64/libbrotlienc-1.1.0-h86ecc28_2.conda#0e9bd365480c72b25c71a448257b537d https://conda.anaconda.org/conda-forge/linux-aarch64/libedit-3.1.20250104-pl5321h976ea20_0.conda#fb640d776fc92b682a14e001980825b1 -https://conda.anaconda.org/conda-forge/linux-aarch64/libgfortran-14.2.0-he9431aa_2.conda#d8b9d9dc0c8cd97d375b48e55947ba70 +https://conda.anaconda.org/conda-forge/linux-aarch64/libgfortran-15.1.0-he9431aa_2.conda#dc8675aa2658bb0d92cefbff83ce2db8 https://conda.anaconda.org/conda-forge/linux-aarch64/libnsl-2.0.1-h31becfc_0.conda#c14f32510f694e3185704d89967ec422 https://conda.anaconda.org/conda-forge/linux-aarch64/libntlm-1.4-hf897c2e_1002.tar.bz2#835c7c4137821de5c309f4266a51ba89 https://conda.anaconda.org/conda-forge/linux-aarch64/libpciaccess-0.18-h31becfc_0.conda#6d48179630f00e8c9ad9e30879ce1e54 https://conda.anaconda.org/conda-forge/linux-aarch64/libpng-1.6.47-hec79eb8_0.conda#c4b1ba0d7cef5002759d2f156722feee -https://conda.anaconda.org/conda-forge/linux-aarch64/libsqlite-3.49.1-h5eb1b54_2.conda#7c45959e187fd3313f9f1734464baecc -https://conda.anaconda.org/conda-forge/linux-aarch64/libstdcxx-ng-14.2.0-hf1166c9_2.conda#c934c1fddad582fcc385b608eb06a70c +https://conda.anaconda.org/conda-forge/linux-aarch64/libsqlite-3.49.2-h5eb1b54_0.conda#462e571b023e916587ff0925ae22522d +https://conda.anaconda.org/conda-forge/linux-aarch64/libstdcxx-ng-15.1.0-hf1166c9_2.conda#18e532d1a39ae9f78cc8988a034f1cae https://conda.anaconda.org/conda-forge/linux-aarch64/libuuid-2.38.1-hb4cce97_0.conda#000e30b09db0b7c775b21695dff30969 https://conda.anaconda.org/conda-forge/linux-aarch64/libxcb-1.17.0-h262b8f6_0.conda#cd14ee5cca2464a425b1dbfc24d90db2 https://conda.anaconda.org/conda-forge/linux-aarch64/libxcrypt-4.4.36-h31becfc_1.conda#b4df5d7d4b63579d081fd3a4cf99740e -https://conda.anaconda.org/conda-forge/linux-aarch64/mysql-common-9.2.0-h3f5c77f_0.conda#f9db1ad1a8897483edb3ac321d662e7b https://conda.anaconda.org/conda-forge/linux-aarch64/ninja-1.12.1-h17cf362_1.conda#885414635e2a65ed06f284f6d569cdff https://conda.anaconda.org/conda-forge/linux-aarch64/pixman-0.46.0-h86a87f0_0.conda#1328d5bad76f7b31926ccd2a33e0d6ef https://conda.anaconda.org/conda-forge/linux-aarch64/readline-8.2-h8382b9d_2.conda#c0f08fc2737967edde1a272d4bf41ed9 @@ -68,10 +67,9 @@ https://conda.anaconda.org/conda-forge/linux-aarch64/icu-75.1-hf9b3779_0.conda#2 https://conda.anaconda.org/conda-forge/linux-aarch64/krb5-1.21.3-h50a48e9_0.conda#29c10432a2ca1472b53f299ffb2ffa37 https://conda.anaconda.org/conda-forge/linux-aarch64/libdrm-2.4.124-h86ecc28_0.conda#a8058bcb6b4fa195aaa20452437c7727 https://conda.anaconda.org/conda-forge/linux-aarch64/libfreetype6-2.13.3-he93130f_1.conda#51eae9012d75b8f7e4b0adfe61a83330 -https://conda.anaconda.org/conda-forge/linux-aarch64/libgfortran-ng-14.2.0-he9431aa_2.conda#0980d7d931474a6a037ae66f1da4d2fe +https://conda.anaconda.org/conda-forge/linux-aarch64/libgfortran-ng-15.1.0-he9431aa_2.conda#55c5691e8b65612aaa0ef109cf645724 https://conda.anaconda.org/conda-forge/linux-aarch64/libopenblas-0.3.29-pthreads_h9d3fd7e_0.conda#a99e2bfcb1ad6362544c71281eb617e9 https://conda.anaconda.org/conda-forge/linux-aarch64/libtiff-4.7.0-h88f7998_4.conda#6edd78ac9bee9a972f25cb6e8c6e21ad -https://conda.anaconda.org/conda-forge/linux-aarch64/mysql-libs-9.2.0-h11569fd_0.conda#72f21962b1205535d810b82f8f0fa342 https://conda.anaconda.org/conda-forge/linux-aarch64/pcre2-10.44-hf4ec17f_2.conda#ab9d0f9a3c9ce23e4fd2af4edc6fa245 https://conda.anaconda.org/conda-forge/linux-aarch64/python-3.10.17-h256493d_0_cpython.conda#c496213b6ede3c5a30ce1bf02bebf382 https://conda.anaconda.org/conda-forge/linux-aarch64/qhull-2020.2-h70be974_5.conda#bb138086d938e2b64f5f364945793ebf @@ -85,8 +83,7 @@ https://conda.anaconda.org/conda-forge/linux-aarch64/brotli-1.1.0-h86ecc28_2.con https://conda.anaconda.org/conda-forge/noarch/colorama-0.4.6-pyhd8ed1ab_1.conda#962b9857ee8e7018c22f2776ffa0b2d7 https://conda.anaconda.org/conda-forge/noarch/cycler-0.12.1-pyhd8ed1ab_1.conda#44600c4667a319d67dbe0681fc0bc833 https://conda.anaconda.org/conda-forge/linux-aarch64/cyrus-sasl-2.1.27-hf6b2984_7.conda#7a85d417c8acd7a5215c082c5b9219e5 -https://conda.anaconda.org/conda-forge/linux-aarch64/cython-3.0.12-py310hc86cfe9_0.conda#4bd71650f315b643774841272d02911a -https://conda.anaconda.org/conda-forge/noarch/exceptiongroup-1.2.2-pyhd8ed1ab_1.conda#a16662747cdeb9abbac74d0057cc976e +https://conda.anaconda.org/conda-forge/linux-aarch64/cython-3.1.0-py310hc86cfe9_0.conda#5d1b56d9fa3f159dfa7429358abc3574 https://conda.anaconda.org/conda-forge/noarch/execnet-2.1.1-pyhd8ed1ab_1.conda#a71efeae2c160f6789900ba2631a2c90 https://conda.anaconda.org/conda-forge/noarch/iniconfig-2.0.0-pyhd8ed1ab_1.conda#6837f3eff7dcea42ecd714ce1ac2b108 https://conda.anaconda.org/conda-forge/linux-aarch64/kiwisolver-1.4.7-py310h5d7f10c_0.conda#b86d594bf17c9ad7a291593368ae8ba7 @@ -97,7 +94,7 @@ https://conda.anaconda.org/conda-forge/linux-aarch64/libfreetype-2.13.3-h8af1aa0 https://conda.anaconda.org/conda-forge/linux-aarch64/libglib-2.84.1-hc486b8e_0.conda#07cb059040220481ab9eda17cb86f644 https://conda.anaconda.org/conda-forge/linux-aarch64/libglx-1.7.0-hd24410f_2.conda#1d4269e233636148696a67e2d30dad2a https://conda.anaconda.org/conda-forge/linux-aarch64/libhiredis-1.0.2-h05efe27_0.tar.bz2#a87f068744fd20334cd41489eb163bee -https://conda.anaconda.org/conda-forge/linux-aarch64/libxml2-2.13.7-he060846_1.conda#b461618b5dafbc95c6f9492043cd991a +https://conda.anaconda.org/conda-forge/linux-aarch64/libxml2-2.13.8-he060846_0.conda#c73dfe6886cc8d39a09c357a36f91fb2 https://conda.anaconda.org/conda-forge/noarch/meson-1.8.0-pyh29332c3_0.conda#8e25221b702272394b86b0f4d7217f77 https://conda.anaconda.org/conda-forge/noarch/munkres-1.1.4-pyh9f0ad1d_0.tar.bz2#2ba8498c1018c1e9c61eb99b973dfe19 https://conda.anaconda.org/conda-forge/linux-aarch64/openblas-0.3.29-pthreads_h3a8cbd8_0.conda#4ec5b6144709ced5e7933977675f61c6 @@ -110,6 +107,7 @@ https://conda.anaconda.org/conda-forge/noarch/six-1.17.0-pyhd8ed1ab_0.conda#a451 https://conda.anaconda.org/conda-forge/noarch/threadpoolctl-3.6.0-pyhecae5ae_0.conda#9d64911b31d57ca443e9f1e36b04385f https://conda.anaconda.org/conda-forge/noarch/tomli-2.2.1-pyhd8ed1ab_1.conda#ac944244f1fed2eb49bae07193ae8215 https://conda.anaconda.org/conda-forge/linux-aarch64/tornado-6.4.2-py310h78583b1_0.conda#68a2bd5dcbb6feac96dee39f4b49fe0f +https://conda.anaconda.org/conda-forge/noarch/typing_extensions-4.13.2-pyh29332c3_0.conda#83fc6ae00127671e301c9f44254c31b8 https://conda.anaconda.org/conda-forge/linux-aarch64/unicodedata2-16.0.0-py310ha766c32_0.conda#2936ce19a675e162962f396c7b40b905 https://conda.anaconda.org/conda-forge/noarch/wheel-0.45.1-pyhd8ed1ab_1.conda#75cb7132eb58d97896e173ef12ac9986 https://conda.anaconda.org/conda-forge/linux-aarch64/xcb-util-image-0.4.0-h5c728e9_2.conda#b82e5c78dbbfa931980e8bfe83bce913 @@ -119,7 +117,8 @@ https://conda.anaconda.org/conda-forge/linux-aarch64/xorg-libxfixes-6.0.1-h57736 https://conda.anaconda.org/conda-forge/linux-aarch64/xorg-libxrender-0.9.12-h86ecc28_0.conda#ae2c2dd0e2d38d249887727db2af960e https://conda.anaconda.org/conda-forge/linux-aarch64/ccache-4.11.3-h4889ad1_0.conda#e0b9e519da2bf0fb8c48381daf87a194 https://conda.anaconda.org/conda-forge/linux-aarch64/dbus-1.13.6-h12b9eeb_3.tar.bz2#f3d63805602166bac09386741e00935e -https://conda.anaconda.org/conda-forge/linux-aarch64/fonttools-4.57.0-py310heeae437_0.conda#548b750f1b3ec57d07b0014f8081e9c2 +https://conda.anaconda.org/conda-forge/noarch/exceptiongroup-1.3.0-pyhd8ed1ab_0.conda#72e42d28960d875c7654614f8b50939a +https://conda.anaconda.org/conda-forge/linux-aarch64/fonttools-4.58.0-py310heeae437_0.conda#426a52d57550926ebe1735ba0eacd99d https://conda.anaconda.org/conda-forge/linux-aarch64/freetype-2.13.3-h8af1aa0_1.conda#71c4cbe1b384a8e7b56993394a435343 https://conda.anaconda.org/conda-forge/noarch/joblib-1.5.0-pyhd8ed1ab_0.conda#3d7257f0a61c9aa4ffa3e324a887416b https://conda.anaconda.org/conda-forge/linux-aarch64/libcblas-3.9.0-31_hab92f65_openblas.conda#6b81dbae56a519f1ec2f25e0ee2f4334 @@ -129,9 +128,9 @@ https://conda.anaconda.org/conda-forge/linux-aarch64/libllvm20-20.1.4-h07bd352_0 https://conda.anaconda.org/conda-forge/linux-aarch64/libxkbcommon-1.9.2-hbab7b08_0.conda#7b47a2ccfb81b4be6be320b365e1cf33 https://conda.anaconda.org/conda-forge/linux-aarch64/libxslt-1.1.39-h1cc9640_0.conda#13e1d3f9188e85c6d59a98651aced002 https://conda.anaconda.org/conda-forge/linux-aarch64/openldap-2.6.9-h30c48ee_0.conda#c07822a5de65ce9797b9afa257faa917 +https://conda.anaconda.org/conda-forge/linux-aarch64/pillow-11.2.1-py310h34c99de_0.conda#116816e9f034fcaeafcd878ef8b1e323 https://conda.anaconda.org/conda-forge/noarch/pip-25.1.1-pyh8b19718_0.conda#32d0781ace05105cc99af55d36cbec7c https://conda.anaconda.org/conda-forge/noarch/pyproject-metadata-0.9.1-pyhd8ed1ab_0.conda#22ae7c6ea81e0c8661ef32168dda929b -https://conda.anaconda.org/conda-forge/noarch/pytest-8.3.5-pyhd8ed1ab_0.conda#c3c9316209dec74a705a36797970c6be https://conda.anaconda.org/conda-forge/noarch/python-dateutil-2.9.0.post0-pyhff2d567_1.conda#5ba79d7c71f03c678c8ead841f347d6e https://conda.anaconda.org/conda-forge/linux-aarch64/xcb-util-cursor-0.1.5-h86ecc28_0.conda#d6bb2038d26fa118d5cbc2761116f3e5 https://conda.anaconda.org/conda-forge/linux-aarch64/xorg-libxcomposite-0.4.6-h86ecc28_2.conda#86051eee0766c3542be24844a9c3cf36 @@ -144,19 +143,19 @@ https://conda.anaconda.org/conda-forge/linux-aarch64/fontconfig-2.15.0-h8dda3cd_ https://conda.anaconda.org/conda-forge/linux-aarch64/libclang-cpp20.1-20.1.4-default_h7d4303a_0.conda#d71665eccdb65183c72e149424ec3928 https://conda.anaconda.org/conda-forge/linux-aarch64/libclang13-20.1.4-default_h9e36cb9_0.conda#6d587caa650694fa5f6d04fda1bcfee2 https://conda.anaconda.org/conda-forge/linux-aarch64/liblapacke-3.9.0-31_hc659ca5_openblas.conda#256bb281d78e5b8927ff13a1cde9f6f5 -https://conda.anaconda.org/conda-forge/linux-aarch64/libpq-17.4-hf590da8_1.conda#10fdc78be541c9017e2144f86d092aa2 +https://conda.anaconda.org/conda-forge/linux-aarch64/libpq-17.5-hf590da8_0.conda#b5a01e5aa04651ccf5865c2d029affa3 https://conda.anaconda.org/conda-forge/noarch/meson-python-0.18.0-pyh70fd9c4_0.conda#576c04b9d9f8e45285fb4d9452c26133 https://conda.anaconda.org/conda-forge/linux-aarch64/numpy-2.2.5-py310h6e5608f_0.conda#5c521c566cbcf058769c613dee3a18d6 -https://conda.anaconda.org/conda-forge/linux-aarch64/pillow-11.1.0-py310h34c99de_0.conda#c4fa80647a708505d65573c2353bc216 -https://conda.anaconda.org/conda-forge/noarch/pytest-xdist-3.6.1-pyhd8ed1ab_1.conda#59aad4fb37cabc0bacc73cf344612ddd +https://conda.anaconda.org/conda-forge/noarch/pytest-8.3.5-pyhd8ed1ab_0.conda#c3c9316209dec74a705a36797970c6be https://conda.anaconda.org/conda-forge/linux-aarch64/xorg-libxtst-1.2.5-h57736b2_3.conda#c05698071b5c8e0da82a282085845860 https://conda.anaconda.org/conda-forge/linux-aarch64/blas-devel-3.9.0-31_h9678261_openblas.conda#a2cc143d7e25e52a915cb320e5b0d592 https://conda.anaconda.org/conda-forge/linux-aarch64/cairo-1.18.4-h83712da_0.conda#cd55953a67ec727db5dc32b167201aa6 https://conda.anaconda.org/conda-forge/linux-aarch64/contourpy-1.3.2-py310hf54e67a_0.conda#779694434d1f0a67c5260db76b7b7907 +https://conda.anaconda.org/conda-forge/noarch/pytest-xdist-3.6.1-pyhd8ed1ab_1.conda#59aad4fb37cabc0bacc73cf344612ddd https://conda.anaconda.org/conda-forge/linux-aarch64/scipy-1.15.2-py310hf37559f_0.conda#5c9b72f10d2118d943a5eaaf2f396891 https://conda.anaconda.org/conda-forge/linux-aarch64/blas-2.131-openblas.conda#51c5f346e1ebee750f76066490059df9 https://conda.anaconda.org/conda-forge/linux-aarch64/harfbuzz-11.1.0-h405b6a2_0.conda#6fd48c127b76a95ed3858c47fa9db7b0 -https://conda.anaconda.org/conda-forge/linux-aarch64/matplotlib-base-3.10.1-py310h2cc5e2d_0.conda#5652e355346f4823f6b4bfdd4860359d -https://conda.anaconda.org/conda-forge/linux-aarch64/qt6-main-6.9.0-ha483c8b_1.conda#fb32973c68de1f23a7e4de3651442b15 +https://conda.anaconda.org/conda-forge/linux-aarch64/matplotlib-base-3.10.3-py310h2cc5e2d_0.conda#e29f4329f4f76cf14f74ed86dcc59bac +https://conda.anaconda.org/conda-forge/linux-aarch64/qt6-main-6.9.0-hf89e03d_2.conda#20d9298303224f9460a0c413327cca1d https://conda.anaconda.org/conda-forge/linux-aarch64/pyside6-6.9.0-py310hee8ad4f_0.conda#68f556281ac23f1780381f00de99d66d -https://conda.anaconda.org/conda-forge/linux-aarch64/matplotlib-3.10.1-py310hbbe02a8_0.conda#c6aa0ea00ec104d0ad260c2ed2bb5582 +https://conda.anaconda.org/conda-forge/linux-aarch64/matplotlib-3.10.3-py310hbbe02a8_0.conda#08982f6ac753e962d59160b08839221b From f16de742f403ad0cde83d9e152b7f4f3ccf00e96 Mon Sep 17 00:00:00 2001 From: Henri Bonamy Date: Mon, 12 May 2025 14:14:24 +0200 Subject: [PATCH 152/182] DOC Add reference to PrecisionRecallDisplay in average_precision_score docstring (#31305) --- sklearn/metrics/_ranking.py | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/sklearn/metrics/_ranking.py b/sklearn/metrics/_ranking.py index d4fba69440f13..2d0e5211c236c 100644 --- a/sklearn/metrics/_ranking.py +++ b/sklearn/metrics/_ranking.py @@ -183,6 +183,10 @@ def average_precision_score( roc_auc_score : Compute the area under the ROC curve. precision_recall_curve : Compute precision-recall pairs for different probability thresholds. + PrecisionRecallDisplay.from_estimator : Plot the precision recall curve + using an estimator and data. + PrecisionRecallDisplay.from_predictions : Plot the precision recall curve + using true and predicted labels. Notes ----- From 4480163137003a520ccf7d134426638b466db0fb Mon Sep 17 00:00:00 2001 From: Lucy Liu Date: Mon, 12 May 2025 22:15:15 +1000 Subject: [PATCH 153/182] TST Add unit tests for `_BinaryClassifierCurveDisplayMixin` (#31193) --- sklearn/utils/tests/test_plotting.py | 108 +++++++++++++++++++++++++++ 1 file changed, 108 insertions(+) diff --git a/sklearn/utils/tests/test_plotting.py b/sklearn/utils/tests/test_plotting.py index 1f0c675577bca..5f0287c1d0d66 100644 --- a/sklearn/utils/tests/test_plotting.py +++ b/sklearn/utils/tests/test_plotting.py @@ -1,12 +1,120 @@ import numpy as np import pytest +from sklearn.linear_model import LogisticRegression from sklearn.utils._plotting import ( + _BinaryClassifierCurveDisplayMixin, _despine, _interval_max_min_ratio, _validate_score_name, _validate_style_kwargs, ) +from sklearn.utils._response import _get_response_values_binary +from sklearn.utils._testing import assert_allclose + + +@pytest.mark.parametrize("ax", [None, "Ax"]) +@pytest.mark.parametrize( + "name, expected_name_out", [(None, "TestEstimator"), ("CustomName", "CustomName")] +) +def test_validate_plot_params(pyplot, ax, name, expected_name_out): + """Check `_validate_plot_params` returns the correct values.""" + display = _BinaryClassifierCurveDisplayMixin() + display.estimator_name = "TestEstimator" + if ax: + _, ax = pyplot.subplots() + ax_out, _, name_out = display._validate_plot_params(ax=ax, name=name) + + assert name_out == expected_name_out + + if ax: + assert ax == ax_out + + +@pytest.mark.parametrize("pos_label", [None, 0]) +@pytest.mark.parametrize("name", [None, "CustomName"]) +@pytest.mark.parametrize( + "response_method", ["auto", "predict_proba", "decision_function"] +) +def test_validate_and_get_response_values(pyplot, pos_label, name, response_method): + """Check `_validate_and_get_response_values` returns the correct values.""" + X = np.array([[0, 0], [1, 1], [2, 2], [3, 3]]) + y = np.array([0, 0, 2, 2]) + estimator = LogisticRegression().fit(X, y) + + y_pred, pos_label, name_out = ( + _BinaryClassifierCurveDisplayMixin._validate_and_get_response_values( + estimator, + X, + y, + response_method=response_method, + pos_label=pos_label, + name=name, + ) + ) + + expected_y_pred, expected_pos_label = _get_response_values_binary( + estimator, X, response_method=response_method, pos_label=pos_label + ) + + assert_allclose(y_pred, expected_y_pred) + assert pos_label == expected_pos_label + + # Check name is handled correctly + expected_name = name if name is not None else "LogisticRegression" + assert name_out == expected_name + + +@pytest.mark.parametrize( + "y_true, error_message", + [ + (np.array([0, 1, 2]), "The target y is not binary."), + (np.array([0, 1]), "Found input variables with inconsistent"), + (np.array([0, 2, 0, 2]), r"y_true takes value in \{0, 2\} and pos_label"), + ], +) +def test_validate_from_predictions_params_errors(pyplot, y_true, error_message): + """Check `_validate_from_predictions_params` raises the correct errors.""" + y_pred = np.array([0.1, 0.2, 0.3, 0.4]) + sample_weight = np.ones(4) + + with pytest.raises(ValueError, match=error_message): + _BinaryClassifierCurveDisplayMixin._validate_from_predictions_params( + y_true=y_true, + y_pred=y_pred, + sample_weight=sample_weight, + pos_label=None, + ) + + +@pytest.mark.parametrize("name", [None, "CustomName"]) +@pytest.mark.parametrize( + "pos_label, y_true", + [ + (None, np.array([0, 1, 0, 1])), + (2, np.array([0, 2, 0, 2])), + ], +) +def test_validate_from_predictions_params_returns(pyplot, name, pos_label, y_true): + """Check `_validate_from_predictions_params` returns the correct values.""" + y_pred = np.array([0.1, 0.2, 0.3, 0.4]) + pos_label_out, name_out = ( + _BinaryClassifierCurveDisplayMixin._validate_from_predictions_params( + y_true=y_true, + y_pred=y_pred, + sample_weight=None, + pos_label=pos_label, + name=name, + ) + ) + + # Check name is handled correctly + expected_name = name if name is not None else "Classifier" + assert name_out == expected_name + + # Check pos_label is handled correctly + expected_pos_label = pos_label if pos_label is not None else 1 + assert pos_label_out == expected_pos_label def metric(): From c1e6494c81c23dc17c5140dcef0c7722c739d9c0 Mon Sep 17 00:00:00 2001 From: Chems Ben <43786170+chemousesi@users.noreply.github.com> Date: Mon, 12 May 2025 14:18:51 +0200 Subject: [PATCH 154/182] DOC Add "see also" section to learning_curve docstring (#31321) --- sklearn/model_selection/_validation.py | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/sklearn/model_selection/_validation.py b/sklearn/model_selection/_validation.py index e9aa7dc77f4c6..79e8a77803292 100644 --- a/sklearn/model_selection/_validation.py +++ b/sklearn/model_selection/_validation.py @@ -1929,6 +1929,11 @@ def learning_curve( Times spent for scoring in seconds. Only present if ``return_times`` is True. + See Also + -------- + LearningCurveDisplay.from_estimator : Plot a learning curve using an + estimator and data. + Examples -------- >>> from sklearn.datasets import make_classification From 8c508c48d5aefff5ed0b2d675672f4aeb23aeac2 Mon Sep 17 00:00:00 2001 From: Olivier Grisel Date: Mon, 12 May 2025 14:46:07 +0200 Subject: [PATCH 155/182] Fix do not recommend to increase `max_iter` in `ConvergenceWarning` when not appropriate (#31316) Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com> Co-authored-by: Thomas J. Fan --- .../changed-models/31316.fix.rst | 5 ++ sklearn/linear_model/_glm/_newton_solver.py | 5 +- sklearn/linear_model/_glm/glm.py | 4 +- sklearn/linear_model/tests/test_logistic.py | 2 +- sklearn/utils/optimize.py | 36 +++++++---- sklearn/utils/tests/test_optimize.py | 60 ++++++++++++++++++- 6 files changed, 95 insertions(+), 17 deletions(-) create mode 100644 doc/whats_new/upcoming_changes/changed-models/31316.fix.rst diff --git a/doc/whats_new/upcoming_changes/changed-models/31316.fix.rst b/doc/whats_new/upcoming_changes/changed-models/31316.fix.rst new file mode 100644 index 0000000000000..06071e40affbc --- /dev/null +++ b/doc/whats_new/upcoming_changes/changed-models/31316.fix.rst @@ -0,0 +1,5 @@ +- Change the `ConvergenceWarning` message of estimators that rely on the + `"lbfgs"` optimizer internally to be more informative and to avoid + suggesting to increase the maximum number of iterations when it is not + user-settable or when the convergence problem happens before reaching it. + By :user:`Olivier Grisel `. diff --git a/sklearn/linear_model/_glm/_newton_solver.py b/sklearn/linear_model/_glm/_newton_solver.py index d7c8ed8f0943d..c5c940bed6c39 100644 --- a/sklearn/linear_model/_glm/_newton_solver.py +++ b/sklearn/linear_model/_glm/_newton_solver.py @@ -178,13 +178,14 @@ def fallback_lbfgs_solve(self, X, y, sample_weight): - self.coef - self.converged """ + max_iter = self.max_iter - self.iteration opt_res = scipy.optimize.minimize( self.linear_loss.loss_gradient, self.coef, method="L-BFGS-B", jac=True, options={ - "maxiter": self.max_iter - self.iteration, + "maxiter": max_iter, "maxls": 50, # default is 20 "iprint": self.verbose - 1, "gtol": self.tol, @@ -192,7 +193,7 @@ def fallback_lbfgs_solve(self, X, y, sample_weight): }, args=(X, y, sample_weight, self.l2_reg_strength, self.n_threads), ) - self.iteration += _check_optimize_result("lbfgs", opt_res) + self.iteration += _check_optimize_result("lbfgs", opt_res, max_iter=max_iter) self.coef = opt_res.x self.converged = opt_res.status == 0 diff --git a/sklearn/linear_model/_glm/glm.py b/sklearn/linear_model/_glm/glm.py index c9e10c6378bac..7f138f420dc36 100644 --- a/sklearn/linear_model/_glm/glm.py +++ b/sklearn/linear_model/_glm/glm.py @@ -282,7 +282,9 @@ def fit(self, X, y, sample_weight=None): }, args=(X, y, sample_weight, l2_reg_strength, n_threads), ) - self.n_iter_ = _check_optimize_result("lbfgs", opt_res) + self.n_iter_ = _check_optimize_result( + "lbfgs", opt_res, max_iter=self.max_iter + ) coef = opt_res.x elif self.solver == "newton-cholesky": sol = NewtonCholeskySolver( diff --git a/sklearn/linear_model/tests/test_logistic.py b/sklearn/linear_model/tests/test_logistic.py index bbb291facdaf9..e8e41a25c6e2b 100644 --- a/sklearn/linear_model/tests/test_logistic.py +++ b/sklearn/linear_model/tests/test_logistic.py @@ -444,7 +444,7 @@ def test_logistic_regression_path_convergence_fail(): assert len(record) == 1 warn_msg = record[0].message.args[0] - assert "lbfgs failed to converge" in warn_msg + assert "lbfgs failed to converge after 1 iteration(s)" in warn_msg assert "Increase the number of iterations" in warn_msg assert "scale the data" in warn_msg assert "linear_model.html#logistic-regression" in warn_msg diff --git a/sklearn/utils/optimize.py b/sklearn/utils/optimize.py index cddabfd419376..a0d21b1796582 100644 --- a/sklearn/utils/optimize.py +++ b/sklearn/utils/optimize.py @@ -352,25 +352,37 @@ def _check_optimize_result(solver, result, max_iter=None, extra_warning_msg=None """ # handle both scipy and scikit-learn solver names if solver == "lbfgs": - if result.status != 0: - result_message = result.message + if max_iter is not None: + # In scipy <= 1.0.0, nit may exceed maxiter for lbfgs. + # See https://github.com/scipy/scipy/issues/7854 + n_iter_i = min(result.nit, max_iter) + else: + n_iter_i = result.nit + if result.status != 0: warning_msg = ( - "{} failed to converge (status={}):\n{}.\n\n" - "Increase the number of iterations (max_iter) " - "or scale the data as shown in:\n" + f"{solver} failed to converge after {n_iter_i} iteration(s) " + f"(status={result.status}):\n" + f"{result.message}\n" + ) + # Append a recommendation to increase iterations only when the + # number of iterations reaches the maximum allowed (max_iter), + # as this suggests the optimization may have been prematurely + # terminated due to the iteration limit. + if max_iter is not None and n_iter_i == max_iter: + warning_msg += ( + f"\nIncrease the number of iterations to improve the " + f"convergence (max_iter={max_iter})." + ) + warning_msg += ( + "\nYou might also want to scale the data as shown in:\n" " https://scikit-learn.org/stable/modules/" "preprocessing.html" - ).format(solver, result.status, result_message) + ) if extra_warning_msg is not None: warning_msg += "\n" + extra_warning_msg warnings.warn(warning_msg, ConvergenceWarning, stacklevel=2) - if max_iter is not None: - # In scipy <= 1.0.0, nit may exceed maxiter for lbfgs. - # See https://github.com/scipy/scipy/issues/7854 - n_iter_i = min(result.nit, max_iter) - else: - n_iter_i = result.nit + else: raise NotImplementedError diff --git a/sklearn/utils/tests/test_optimize.py b/sklearn/utils/tests/test_optimize.py index 775da5791b9a6..f99f3a9131808 100644 --- a/sklearn/utils/tests/test_optimize.py +++ b/sklearn/utils/tests/test_optimize.py @@ -1,10 +1,13 @@ +import warnings + import numpy as np import pytest from scipy.optimize import fmin_ncg from sklearn.exceptions import ConvergenceWarning +from sklearn.utils._bunch import Bunch from sklearn.utils._testing import assert_allclose -from sklearn.utils.optimize import _newton_cg +from sklearn.utils.optimize import _check_optimize_result, _newton_cg def test_newton_cg(global_random_seed): @@ -160,3 +163,58 @@ def test_newton_cg_verbosity(capsys, verbose): ] for m in msg: assert m in captured.out + + +def test_check_optimize(): + # Mock some lbfgs output using a Bunch instance: + result = Bunch() + + # First case: no warnings + result.nit = 1 + result.status = 0 + result.message = "OK" + + with warnings.catch_warnings(): + warnings.simplefilter("error") + _check_optimize_result("lbfgs", result) + + # Second case: warning about implicit `max_iter`: do not recommend the user + # to increase `max_iter` this is not a user settable parameter. + result.status = 1 + result.message = "STOP: TOTAL NO. OF ITERATIONS REACHED LIMIT" + with pytest.warns(ConvergenceWarning) as record: + _check_optimize_result("lbfgs", result) + + assert len(record) == 1 + warn_msg = record[0].message.args[0] + assert "lbfgs failed to converge after 1 iteration(s)" in warn_msg + assert result.message in warn_msg + assert "Increase the number of iterations" not in warn_msg + assert "scale the data" in warn_msg + + # Third case: warning about explicit `max_iter`: recommend user to increase + # `max_iter`. + with pytest.warns(ConvergenceWarning) as record: + _check_optimize_result("lbfgs", result, max_iter=1) + + assert len(record) == 1 + warn_msg = record[0].message.args[0] + assert "lbfgs failed to converge after 1 iteration(s)" in warn_msg + assert result.message in warn_msg + assert "Increase the number of iterations" in warn_msg + assert "scale the data" in warn_msg + + # Fourth case: other convergence problem before reaching `max_iter`: do not + # recommend increasing `max_iter`. + result.nit = 2 + result.status = 2 + result.message = "ABNORMAL" + with pytest.warns(ConvergenceWarning) as record: + _check_optimize_result("lbfgs", result, max_iter=10) + + assert len(record) == 1 + warn_msg = record[0].message.args[0] + assert "lbfgs failed to converge after 2 iteration(s)" in warn_msg + assert result.message in warn_msg + assert "Increase the number of iterations" not in warn_msg + assert "scale the data" in warn_msg From efe3b63589f628516a16ac9d620ccf172052572f Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Lo=C3=AFc=20Est=C3=A8ve?= Date: Mon, 12 May 2025 16:23:06 +0200 Subject: [PATCH 156/182] CI Use Cython 3.1 for free-threaded build (#31357) --- build_tools/azure/install.sh | 12 +----------- .../azure/pylatest_free_threaded_environment.yml | 2 ++ .../azure/pylatest_free_threaded_linux-64_conda.lock | 4 +++- build_tools/update_environments_and_lock_files.py | 7 ++----- 4 files changed, 8 insertions(+), 17 deletions(-) diff --git a/build_tools/azure/install.sh b/build_tools/azure/install.sh index c009e2972036e..9ae67f8db5e29 100755 --- a/build_tools/azure/install.sh +++ b/build_tools/azure/install.sh @@ -67,17 +67,7 @@ python_environment_install_and_activate() { fi # Install additional packages on top of the lock-file in specific cases - if [[ "$DISTRIB" == "conda-free-threaded" ]]; then - # TODO: we install scipy with pip. When there is a conda-forge package, - # we can update build_tools/update_environments_and_lock_files.py and - # remove the line below - pip install scipy --only-binary :all: - # TODO: we install cython 3.1 alpha from pip. When there is a conda-forge package, - # we can update build_tools/update_environments_and_lock_files.py and - # remove the line below - pip install --pre cython --only-binary :all: - - elif [[ "$DISTRIB" == "conda-pip-scipy-dev" ]]; then + if [[ "$DISTRIB" == "conda-pip-scipy-dev" ]]; then echo "Installing development dependency wheels" dev_anaconda_url=https://pypi.anaconda.org/scientific-python-nightly-wheels/simple dev_packages="numpy scipy pandas Cython" diff --git a/build_tools/azure/pylatest_free_threaded_environment.yml b/build_tools/azure/pylatest_free_threaded_environment.yml index b947f31beb14a..8980bfce4adaf 100644 --- a/build_tools/azure/pylatest_free_threaded_environment.yml +++ b/build_tools/azure/pylatest_free_threaded_environment.yml @@ -6,6 +6,8 @@ channels: dependencies: - python-freethreading - numpy + - scipy + - cython - joblib - threadpoolctl - pytest diff --git a/build_tools/azure/pylatest_free_threaded_linux-64_conda.lock b/build_tools/azure/pylatest_free_threaded_linux-64_conda.lock index 0b3a9dc35c383..210839a6969fc 100644 --- a/build_tools/azure/pylatest_free_threaded_linux-64_conda.lock +++ b/build_tools/azure/pylatest_free_threaded_linux-64_conda.lock @@ -1,6 +1,6 @@ # Generated by conda-lock. # platform: linux-64 -# input_hash: c7db5547fb9ea583bb70736e98b526e9e435c63cb5f6f3c4f38e0f0925e28535 +# input_hash: b76364b5635e8c36a0fc0777955b5664a336ba94ac96f3ade7aad842ab7e15c5 @EXPLICIT https://conda.anaconda.org/conda-forge/linux-64/_libgcc_mutex-0.1-conda_forge.tar.bz2#d7c89558ba9fa0495403155b64376d81 https://conda.anaconda.org/conda-forge/noarch/python_abi-3.13-7_cp313t.conda#df81edcc11a1176315e8226acab83eec @@ -34,6 +34,7 @@ https://conda.anaconda.org/conda-forge/linux-64/libopenblas-0.3.29-pthreads_h94d https://conda.anaconda.org/conda-forge/linux-64/python-3.13.3-h4724d56_1_cp313t.conda#8193603fe48ace3d8801cfb246f44491 https://conda.anaconda.org/conda-forge/noarch/colorama-0.4.6-pyhd8ed1ab_1.conda#962b9857ee8e7018c22f2776ffa0b2d7 https://conda.anaconda.org/conda-forge/noarch/cpython-3.13.3-py313hd8ed1ab_1.conda#6ba9ba47b91b7758cb963d0f0eaf3422 +https://conda.anaconda.org/conda-forge/noarch/cython-3.1.0-pyh2c78169_100.conda#89943f37072ca254aa4b7de98c6d7f0a https://conda.anaconda.org/conda-forge/noarch/execnet-2.1.1-pyhd8ed1ab_1.conda#a71efeae2c160f6789900ba2631a2c90 https://conda.anaconda.org/conda-forge/noarch/iniconfig-2.0.0-pyhd8ed1ab_1.conda#6837f3eff7dcea42ecd714ce1ac2b108 https://conda.anaconda.org/conda-forge/linux-64/libblas-3.9.0-31_h59b9bed_openblas.conda#728dbebd0f7a20337218beacffd37916 @@ -57,3 +58,4 @@ https://conda.anaconda.org/conda-forge/noarch/meson-python-0.18.0-pyh70fd9c4_0.c https://conda.anaconda.org/conda-forge/linux-64/numpy-2.2.5-py313h103f029_0.conda#7dcbd568d6f8a4ffba5ace28915f1230 https://conda.anaconda.org/conda-forge/noarch/pytest-8.3.5-pyhd8ed1ab_0.conda#c3c9316209dec74a705a36797970c6be https://conda.anaconda.org/conda-forge/noarch/pytest-xdist-3.6.1-pyhd8ed1ab_1.conda#59aad4fb37cabc0bacc73cf344612ddd +https://conda.anaconda.org/conda-forge/linux-64/scipy-1.15.2-py313h7f7b39c_0.conda#65f0c403e4324062633e648933f20a2e diff --git a/build_tools/update_environments_and_lock_files.py b/build_tools/update_environments_and_lock_files.py index 0edf62b5a0d7b..5efd7f12cffd7 100644 --- a/build_tools/update_environments_and_lock_files.py +++ b/build_tools/update_environments_and_lock_files.py @@ -271,11 +271,8 @@ def remove_from(alist, to_remove): "conda_dependencies": [ "python-freethreading", "numpy", - # TODO add cython and scipy when there are conda-forge packages for - # them and remove dev version install in - # build_tools/azure/install.sh. Note that for now conda-lock does - # not deal with free-threaded wheels correctly, see - # https://github.com/conda/conda-lock/issues/754. + "scipy", + "cython", "joblib", "threadpoolctl", "pytest", From 637bb470f76bd8d0149e90c1c819592c0437a665 Mon Sep 17 00:00:00 2001 From: Lucy Liu Date: Tue, 13 May 2025 22:43:12 +1000 Subject: [PATCH 157/182] DOC Fix typos in visualization tools docstrings (#31351) --- sklearn/metrics/_plot/confusion_matrix.py | 2 +- sklearn/metrics/_plot/det_curve.py | 2 +- sklearn/metrics/_plot/precision_recall_curve.py | 2 +- sklearn/metrics/_plot/roc_curve.py | 2 +- 4 files changed, 4 insertions(+), 4 deletions(-) diff --git a/sklearn/metrics/_plot/confusion_matrix.py b/sklearn/metrics/_plot/confusion_matrix.py index 25aa21eab2fc2..cee515bebe08e 100644 --- a/sklearn/metrics/_plot/confusion_matrix.py +++ b/sklearn/metrics/_plot/confusion_matrix.py @@ -15,7 +15,7 @@ class ConfusionMatrixDisplay: """Confusion Matrix visualization. - It is recommend to use + It is recommended to use :func:`~sklearn.metrics.ConfusionMatrixDisplay.from_estimator` or :func:`~sklearn.metrics.ConfusionMatrixDisplay.from_predictions` to create a :class:`ConfusionMatrixDisplay`. All parameters are stored as diff --git a/sklearn/metrics/_plot/det_curve.py b/sklearn/metrics/_plot/det_curve.py index 39b43429d3f6c..590b908d91723 100644 --- a/sklearn/metrics/_plot/det_curve.py +++ b/sklearn/metrics/_plot/det_curve.py @@ -11,7 +11,7 @@ class DetCurveDisplay(_BinaryClassifierCurveDisplayMixin): """Detection Error Tradeoff (DET) curve visualization. - It is recommend to use :func:`~sklearn.metrics.DetCurveDisplay.from_estimator` + It is recommended to use :func:`~sklearn.metrics.DetCurveDisplay.from_estimator` or :func:`~sklearn.metrics.DetCurveDisplay.from_predictions` to create a visualizer. All parameters are stored as attributes. diff --git a/sklearn/metrics/_plot/precision_recall_curve.py b/sklearn/metrics/_plot/precision_recall_curve.py index 286fc26d0e208..30dd1fba08761 100644 --- a/sklearn/metrics/_plot/precision_recall_curve.py +++ b/sklearn/metrics/_plot/precision_recall_curve.py @@ -14,7 +14,7 @@ class PrecisionRecallDisplay(_BinaryClassifierCurveDisplayMixin): """Precision Recall visualization. - It is recommend to use + It is recommended to use :func:`~sklearn.metrics.PrecisionRecallDisplay.from_estimator` or :func:`~sklearn.metrics.PrecisionRecallDisplay.from_predictions` to create a :class:`~sklearn.metrics.PrecisionRecallDisplay`. All parameters are diff --git a/sklearn/metrics/_plot/roc_curve.py b/sklearn/metrics/_plot/roc_curve.py index 4a198080e0d0a..b20569ea17f0b 100644 --- a/sklearn/metrics/_plot/roc_curve.py +++ b/sklearn/metrics/_plot/roc_curve.py @@ -14,7 +14,7 @@ class RocCurveDisplay(_BinaryClassifierCurveDisplayMixin): """ROC Curve visualization. - It is recommend to use + It is recommended to use :func:`~sklearn.metrics.RocCurveDisplay.from_estimator` or :func:`~sklearn.metrics.RocCurveDisplay.from_predictions` to create a :class:`~sklearn.metrics.RocCurveDisplay`. All parameters are From e906f0e45d3667ce696d24f76b0d57f2041fb8dd Mon Sep 17 00:00:00 2001 From: Tim Head Date: Tue, 13 May 2025 14:48:07 +0200 Subject: [PATCH 158/182] DOC Update array API common checks docs (#31050) Co-authored-by: Olivier Grisel --- doc/modules/array_api.rst | 21 ++++++++++++++++++--- 1 file changed, 18 insertions(+), 3 deletions(-) diff --git a/doc/modules/array_api.rst b/doc/modules/array_api.rst index d24ce3573e7b6..e1a499c97506b 100644 --- a/doc/modules/array_api.rst +++ b/doc/modules/array_api.rst @@ -202,17 +202,32 @@ it supports the Array API. This will enable dedicated checks as part of the common tests to verify that the estimators' results are the same when using vanilla NumPy and Array API inputs. -To run the full set of checks you need to install both -`PyTorch `_ and `CuPy `_ and have +To run these checks you need to install +`array-api-strict `_ in your +test environment. This allows you to run checks without having a +GPU. To run the full set of checks you also need to install +`PyTorch `_, `CuPy `_ and have a GPU. Checks that can not be executed or have missing dependencies will be automatically skipped. Therefore it's important to run the tests with the `-v` flag to see which checks are skipped: .. prompt:: bash $ - pip install ... # selected libraries as needed + pip install array-api-strict # and other libraries as needed pytest -k "array_api" -v +Running the scikit-learn tests against `array-api-strict` should help reveal +most code problems related to handling multiple device inputs via the use of +simulated non-CPU devices. This allows for fast iterative development and debugging of +array API related code. + +However, to ensure full handling of PyTorch or CuPy inputs allocated on actual GPU +devices, it is necessary to run the tests against those libraries and hardware. +This can either be achieved by using +`Google Colab `_ +or leveraging our CI infrastructure on pull requests (manually triggered by maintainers +for cost reasons). + .. _mps_support: Note on MPS device support From ce4a40ffae5005ffa30f87b198b176dc6eb0f160 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?J=C3=A9r=C3=A9mie=20du=20Boisberranger?= Date: Tue, 13 May 2025 15:30:55 +0200 Subject: [PATCH 159/182] DOC Add policy to upper bound build deps in maintainers page (#31345) Co-authored-by: Lucy Liu --- doc/developers/maintainer.rst.template | 14 ++++++++++++++ 1 file changed, 14 insertions(+) diff --git a/doc/developers/maintainer.rst.template b/doc/developers/maintainer.rst.template index b7134d4170521..5211d9a575389 100644 --- a/doc/developers/maintainer.rst.template +++ b/doc/developers/maintainer.rst.template @@ -121,6 +121,9 @@ Reference Steps * [ ] Update the sklearn dev0 version in main branch {%- endif %} * [ ] Set the version number in the release branch + {% if key == "rc" -%} + * [ ] Set an upper bound on build dependencies in the release branch + {%- endif %} * [ ] Generate the changelog in the release branch * [ ] Check that the wheels for the release can be built successfully * [ ] Merge the PR with `[cd build]` commit message to upload wheels to the staging repo @@ -162,6 +165,17 @@ Reference Steps - In the release branch, change the version number `__version__` in `sklearn/__init__.py` to `{{ version_full }}`. + {% if key == "rc" %} + - Still in the release branch, set or update the upper bound on the build + dependencies in the `[build-system]` section of `pyproject.toml`. The goal is to + prevent future backward incompatible releases of the dependencies to break the + build in the maintenance branch. + + The upper bounds should match the latest already-released minor versions of the + dependencies and should allow future micro (bug-fix) versions. For instance, if + numpy 2.2.5 is the most recent version, its upper bound should be set to <2.3.0. + {% endif %} + - In the release branch, generate the changelog for the incoming version, i.e., `doc/whats_new/{{ version_short }}.rst`. {%- if key == "rc" %} From 8cfc72b81f7f19a03b5316440efc7d6bebd3c27c Mon Sep 17 00:00:00 2001 From: Josh <25337478+joshhilton@users.noreply.github.com> Date: Wed, 14 May 2025 04:38:14 -0400 Subject: [PATCH 160/182] DOC Math/code formatting in docs (#31325) --- doc/modules/calibration.rst | 12 +++--- doc/modules/cross_validation.rst | 19 +++++---- doc/modules/kernel_ridge.rst | 6 +-- doc/modules/lda_qda.rst | 14 +++---- doc/modules/partial_dependence.rst | 18 ++++----- doc/modules/sgd.rst | 63 +++++++++++++++--------------- 6 files changed, 66 insertions(+), 66 deletions(-) diff --git a/doc/modules/calibration.rst b/doc/modules/calibration.rst index a7b34065fe330..e8e6aa8b9953a 100644 --- a/doc/modules/calibration.rst +++ b/doc/modules/calibration.rst @@ -103,7 +103,7 @@ difficulty making predictions near 0 and 1 because variance in the underlying base models will bias predictions that should be near zero or one away from these values. Because predictions are restricted to the interval [0,1], errors caused by variance tend to be one-sided near zero and one. For -example, if a model should predict p = 0 for a case, the only way bagging +example, if a model should predict :math:`p = 0` for a case, the only way bagging can achieve this is if all bagged trees predict zero. If we add noise to the trees that bagging is averaging over, this noise will cause some trees to predict values larger than 0 for this case, thus moving the average @@ -146,7 +146,7 @@ Usage The :class:`CalibratedClassifierCV` class is used to calibrate a classifier. :class:`CalibratedClassifierCV` uses a cross-validation approach to ensure -unbiased data is always used to fit the calibrator. The data is split into k +unbiased data is always used to fit the calibrator. The data is split into :math:`k` `(train_set, test_set)` couples (as determined by `cv`). When `ensemble=True` (default), the following procedure is repeated independently for each cross-validation split: @@ -157,13 +157,13 @@ cross-validation split: regressor) (when the data is multiclass, a calibrator is fit for every class) This results in an -ensemble of k `(classifier, calibrator)` couples where each calibrator maps +ensemble of :math:`k` `(classifier, calibrator)` couples where each calibrator maps the output of its corresponding classifier into [0, 1]. Each couple is exposed in the `calibrated_classifiers_` attribute, where each entry is a calibrated classifier with a :term:`predict_proba` method that outputs calibrated probabilities. The output of :term:`predict_proba` for the main :class:`CalibratedClassifierCV` instance corresponds to the average of the -predicted probabilities of the `k` estimators in the `calibrated_classifiers_` +predicted probabilities of the :math:`k` estimators in the `calibrated_classifiers_` list. The output of :term:`predict` is the class that has the highest probability. @@ -244,12 +244,12 @@ subject to :math:`\hat{f}_i \geq \hat{f}_j` whenever :math:`f_i \geq f_j`. :math:`y_i` is the true label of sample :math:`i` and :math:`\hat{f}_i` is the output of the calibrated classifier for sample :math:`i` (i.e., the calibrated probability). -This method is more general when compared to 'sigmoid' as the only restriction +This method is more general when compared to `'sigmoid'` as the only restriction is that the mapping function is monotonically increasing. It is thus more powerful as it can correct any monotonic distortion of the un-calibrated model. However, it is more prone to overfitting, especially on small datasets [6]_. -Overall, 'isotonic' will perform as well as or better than 'sigmoid' when +Overall, `'isotonic'` will perform as well as or better than `'sigmoid'` when there is enough data (greater than ~ 1000 samples) to avoid overfitting [3]_. .. note:: Impact on ranking metrics like AUC diff --git a/doc/modules/cross_validation.rst b/doc/modules/cross_validation.rst index bfdee6c8a043d..b1c9ccec8f641 100644 --- a/doc/modules/cross_validation.rst +++ b/doc/modules/cross_validation.rst @@ -372,8 +372,7 @@ Thus, one can create the training/test sets using numpy indexing:: Repeated K-Fold ^^^^^^^^^^^^^^^ -:class:`RepeatedKFold` repeats K-Fold n times. It can be used when one -requires to run :class:`KFold` n times, producing different splits in +:class:`RepeatedKFold` repeats :class:`KFold` :math:`n` times, producing different splits in each repetition. Example of 2-fold K-Fold repeated 2 times:: @@ -392,7 +391,7 @@ Example of 2-fold K-Fold repeated 2 times:: [1 3] [0 2] -Similarly, :class:`RepeatedStratifiedKFold` repeats Stratified K-Fold n times +Similarly, :class:`RepeatedStratifiedKFold` repeats :class:`StratifiedKFold` :math:`n` times with different randomization in each repetition. .. _leave_one_out: @@ -434,10 +433,10 @@ folds are virtually identical to each other and to the model built from the entire training set. However, if the learning curve is steep for the training size in question, -then 5- or 10- fold cross validation can overestimate the generalization error. +then 5 or 10-fold cross validation can overestimate the generalization error. -As a general rule, most authors, and empirical evidence, suggest that 5- or 10- -fold cross validation should be preferred to LOO. +As a general rule, most authors and empirical evidence suggest that 5 or 10-fold +cross validation should be preferred to LOO. .. dropdown:: References @@ -553,10 +552,10 @@ relative class frequencies are approximately preserved in each fold. .. _stratified_k_fold: -Stratified k-fold +Stratified K-fold ^^^^^^^^^^^^^^^^^ -:class:`StratifiedKFold` is a variation of *k-fold* which returns *stratified* +:class:`StratifiedKFold` is a variation of *K-fold* which returns *stratified* folds: each set contains approximately the same percentage of samples of each target class as the complete set. @@ -648,10 +647,10 @@ parameter. .. _group_k_fold: -Group k-fold +Group K-fold ^^^^^^^^^^^^ -:class:`GroupKFold` is a variation of k-fold which ensures that the same group is +:class:`GroupKFold` is a variation of K-fold which ensures that the same group is not represented in both testing and training sets. For example if the data is obtained from different subjects with several samples per-subject and if the model is flexible enough to learn from highly person specific features it diff --git a/doc/modules/kernel_ridge.rst b/doc/modules/kernel_ridge.rst index fcc19a49628c4..64267f4233a53 100644 --- a/doc/modules/kernel_ridge.rst +++ b/doc/modules/kernel_ridge.rst @@ -7,7 +7,7 @@ Kernel ridge regression .. currentmodule:: sklearn.kernel_ridge Kernel ridge regression (KRR) [M2012]_ combines :ref:`ridge_regression` -(linear least squares with l2-norm regularization) with the `kernel trick +(linear least squares with :math:`L_2`-norm regularization) with the `kernel trick `_. It thus learns a linear function in the space induced by the respective kernel and the data. For non-linear kernels, this corresponds to a non-linear function in the original @@ -16,7 +16,7 @@ space. The form of the model learned by :class:`KernelRidge` is identical to support vector regression (:class:`~sklearn.svm.SVR`). However, different loss functions are used: KRR uses squared error loss while support vector -regression uses :math:`\epsilon`-insensitive loss, both combined with l2 +regression uses :math:`\epsilon`-insensitive loss, both combined with :math:`L_2` regularization. In contrast to :class:`~sklearn.svm.SVR`, fitting :class:`KernelRidge` can be done in closed-form and is typically faster for medium-sized datasets. On the other hand, the learned model is non-sparse and @@ -31,7 +31,7 @@ plotted, where both complexity/regularization and bandwidth of the RBF kernel have been optimized using grid-search. The learned functions are very similar; however, fitting :class:`KernelRidge` is approximately seven times faster than fitting :class:`~sklearn.svm.SVR` (both with grid-search). -However, prediction of 100000 target values is more than three times faster +However, prediction of 100,000 target values is more than three times faster with :class:`~sklearn.svm.SVR` since it has learned a sparse model using only approximately 1/3 of the 100 training datapoints as support vectors. diff --git a/doc/modules/lda_qda.rst b/doc/modules/lda_qda.rst index 405ef8e5d3a8b..c18835d514a9f 100644 --- a/doc/modules/lda_qda.rst +++ b/doc/modules/lda_qda.rst @@ -173,11 +173,11 @@ In this scenario, the empirical sample covariance is a poor estimator, and shrinkage helps improving the generalization performance of the classifier. Shrinkage LDA can be used by setting the ``shrinkage`` parameter of -the :class:`~discriminant_analysis.LinearDiscriminantAnalysis` class to 'auto'. +the :class:`~discriminant_analysis.LinearDiscriminantAnalysis` class to `'auto'`. This automatically determines the optimal shrinkage parameter in an analytic way following the lemma introduced by Ledoit and Wolf [2]_. Note that -currently shrinkage only works when setting the ``solver`` parameter to 'lsqr' -or 'eigen'. +currently shrinkage only works when setting the ``solver`` parameter to `'lsqr'` +or `'eigen'`. The ``shrinkage`` parameter can also be manually set between 0 and 1. In particular, a value of 0 corresponds to no shrinkage (which means the empirical @@ -192,7 +192,7 @@ best choice. For example if the distribution of the data is normally distributed, the Oracle Approximating Shrinkage estimator :class:`sklearn.covariance.OAS` yields a smaller Mean Squared Error than the one given by Ledoit and Wolf's -formula used with shrinkage="auto". In LDA, the data are assumed to be gaussian +formula used with `shrinkage="auto"`. In LDA, the data are assumed to be gaussian conditionally to the class. If these assumptions hold, using LDA with the OAS estimator of covariance will yield a better classification accuracy than if Ledoit and Wolf or the empirical covariance estimator is used. @@ -239,7 +239,7 @@ computing :math:`S` and :math:`V` via the SVD of :math:`X` is enough. For LDA, two SVDs are computed: the SVD of the centered input matrix :math:`X` and the SVD of the class-wise mean vectors. -The 'lsqr' solver is an efficient algorithm that only works for +The `'lsqr'` solver is an efficient algorithm that only works for classification. It needs to explicitly compute the covariance matrix :math:`\Sigma`, and supports shrinkage and custom covariance estimators. This solver computes the coefficients @@ -247,9 +247,9 @@ This solver computes the coefficients \mu_k`, thus avoiding the explicit computation of the inverse :math:`\Sigma^{-1}`. -The 'eigen' solver is based on the optimization of the between class scatter to +The `'eigen'` solver is based on the optimization of the between class scatter to within class scatter ratio. It can be used for both classification and -transform, and it supports shrinkage. However, the 'eigen' solver needs to +transform, and it supports shrinkage. However, the `'eigen'` solver needs to compute the covariance matrix, so it might not be suitable for situations with a high number of features. diff --git a/doc/modules/partial_dependence.rst b/doc/modules/partial_dependence.rst index 083b23c1f1c91..7f30a3a7e6731 100644 --- a/doc/modules/partial_dependence.rst +++ b/doc/modules/partial_dependence.rst @@ -211,11 +211,11 @@ Computation methods =================== There are two main methods to approximate the integral above, namely the -'brute' and 'recursion' methods. The `method` parameter controls which method +`'brute'` and `'recursion'` methods. The `method` parameter controls which method to use. -The 'brute' method is a generic method that works with any estimator. Note that -computing ICE plots is only supported with the 'brute' method. It +The `'brute'` method is a generic method that works with any estimator. Note that +computing ICE plots is only supported with the `'brute'` method. It approximates the above integral by computing an average over the data `X`: .. math:: @@ -231,7 +231,7 @@ at :math:`x_{S}`. Computing this for multiple values of :math:`x_{S}`, one obtains a full ICE line. As one can see, the average of the ICE lines corresponds to the partial dependence line. -The 'recursion' method is faster than the 'brute' method, but it is only +The `'recursion'` method is faster than the `'brute'` method, but it is only supported for PDP plots by some tree-based estimators. It is computed as follows. For a given point :math:`x_S`, a weighted tree traversal is performed: if a split node involves an input feature of interest, the corresponding left @@ -240,12 +240,12 @@ being weighted by the fraction of training samples that entered that branch. Finally, the partial dependence is given by a weighted average of all the visited leaves' values. -With the 'brute' method, the parameter `X` is used both for generating the +With the `'brute'` method, the parameter `X` is used both for generating the grid of values :math:`x_S` and the complement feature values :math:`x_C`. However with the 'recursion' method, `X` is only used for the grid values: implicitly, the :math:`x_C` values are those of the training data. -By default, the 'recursion' method is used for plotting PDPs on tree-based +By default, the `'recursion'` method is used for plotting PDPs on tree-based estimators that support it, and 'brute' is used for the rest. .. _pdp_method_differences: @@ -253,10 +253,10 @@ estimators that support it, and 'brute' is used for the rest. .. note:: While both methods should be close in general, they might differ in some - specific settings. The 'brute' method assumes the existence of the + specific settings. The `'brute'` method assumes the existence of the data points :math:`(x_S, x_C^{(i)})`. When the features are correlated, - such artificial samples may have a very low probability mass. The 'brute' - and 'recursion' methods will likely disagree regarding the value of the + such artificial samples may have a very low probability mass. The `'brute'` + and `'recursion'` methods will likely disagree regarding the value of the partial dependence, because they will treat these unlikely samples differently. Remember, however, that the primary assumption for interpreting PDPs is that the features should be independent. diff --git a/doc/modules/sgd.rst b/doc/modules/sgd.rst index 103ae205387e3..4f34b7f50e072 100644 --- a/doc/modules/sgd.rst +++ b/doc/modules/sgd.rst @@ -71,7 +71,7 @@ penalties for classification. Below is the decision boundary of a As other classifiers, SGD has to be fitted with two arrays: an array `X` of shape (n_samples, n_features) holding the training samples, and an -array y of shape (n_samples,) holding the target values (class labels) +array `y` of shape (n_samples,) holding the target values (class labels) for the training samples:: >>> from sklearn.linear_model import SGDClassifier @@ -114,8 +114,8 @@ parameter. :class:`SGDClassifier` supports the following loss functions: * ``loss="hinge"``: (soft-margin) linear Support Vector Machine, * ``loss="modified_huber"``: smoothed hinge loss, * ``loss="log_loss"``: logistic regression, -* and all regression losses below. In this case the target is encoded as -1 - or 1, and the problem is treated as a regression problem. The predicted +* and all regression losses below. In this case the target is encoded as :math:`-1` + or :math:`1`, and the problem is treated as a regression problem. The predicted class then corresponds to the sign of the predicted target. Please refer to the :ref:`mathematical section below @@ -123,7 +123,7 @@ Please refer to the :ref:`mathematical section below The first two loss functions are lazy, they only update the model parameters if an example violates the margin constraint, which makes training very efficient and may result in sparser models (i.e. with more zero -coefficients), even when L2 penalty is used. +coefficients), even when :math:`L_2` penalty is used. Using ``loss="log_loss"`` or ``loss="modified_huber"`` enables the ``predict_proba`` method, which gives a vector of probability estimates @@ -136,16 +136,16 @@ Using ``loss="log_loss"`` or ``loss="modified_huber"`` enables the The concrete penalty can be set via the ``penalty`` parameter. SGD supports the following penalties: -* ``penalty="l2"``: L2 norm penalty on ``coef_``. -* ``penalty="l1"``: L1 norm penalty on ``coef_``. -* ``penalty="elasticnet"``: Convex combination of L2 and L1; +* ``penalty="l2"``: :math:`L_2` norm penalty on ``coef_``. +* ``penalty="l1"``: :math:`L_1` norm penalty on ``coef_``. +* ``penalty="elasticnet"``: Convex combination of :math:`L_2` and :math:`L_1`; ``(1 - l1_ratio) * L2 + l1_ratio * L1``. -The default setting is ``penalty="l2"``. The L1 penalty leads to sparse +The default setting is ``penalty="l2"``. The :math:`L_1` penalty leads to sparse solutions, driving most coefficients to zero. The Elastic Net [#5]_ solves -some deficiencies of the L1 penalty in the presence of highly correlated +some deficiencies of the :math:`L_1` penalty in the presence of highly correlated attributes. The parameter ``l1_ratio`` controls the convex combination -of L1 and L2 penalty. +of :math:`L_1` and :math:`L_2` penalty. :class:`SGDClassifier` supports multi-class classification by combining multiple binary classifiers in a "one versus all" (OVA) scheme. For each @@ -164,8 +164,8 @@ the decision surface induced by the three classifiers. In the case of multi-class classification ``coef_`` is a two-dimensional array of shape (n_classes, n_features) and ``intercept_`` is a -one-dimensional array of shape (n_classes,). The i-th row of ``coef_`` holds -the weight vector of the OVA classifier for the i-th class; classes are +one-dimensional array of shape (n_classes,). The :math:`i`-th row of ``coef_`` holds +the weight vector of the OVA classifier for the :math:`i`-th class; classes are indexed in ascending order (see attribute ``classes_``). Note that, in principle, since they allow to create a probability model, ``loss="log_loss"`` and ``loss="modified_huber"`` are more suitable for @@ -227,7 +227,7 @@ description above in the classification section). :class:`SGDRegressor` also supports averaged SGD [#4]_ (here again, see description above in the classification section). -For regression with a squared loss and a l2 penalty, another variant of +For regression with a squared loss and a :math:`L_2` penalty, another variant of SGD with an averaging strategy is available with Stochastic Average Gradient (SAG) algorithm, available as a solver in :class:`Ridge`. @@ -245,7 +245,7 @@ solution of a kernelized One-Class SVM, implemented in samples. Note that the complexity of a kernelized One-Class SVM is at best quadratic in the number of samples. :class:`sklearn.linear_model.SGDOneClassSVM` is thus well suited for datasets -with a large number of training samples (> 10,000) for which the SGD +with a large number of training samples (over 10,000) for which the SGD variant can be several orders of magnitude faster. .. dropdown:: Mathematical details @@ -280,7 +280,7 @@ variant can be several orders of magnitude faster. This is similar to the optimization problems studied in section :ref:`sgd_mathematical_formulation` with :math:`y_i = 1, 1 \leq i \leq n` and :math:`\alpha = \nu/2`, :math:`L` being the hinge loss function and :math:`R` - being the L2 norm. We just need to add the term :math:`b\nu` in the + being the :math:`L_2` norm. We just need to add the term :math:`b\nu` in the optimization loop. As :class:`SGDClassifier` and :class:`SGDRegressor`, :class:`SGDOneClassSVM` @@ -312,8 +312,9 @@ Complexity ========== The major advantage of SGD is its efficiency, which is basically -linear in the number of training examples. If X is a matrix of size (n, p) -training has a cost of :math:`O(k n \bar p)`, where k is the number +linear in the number of training examples. If :math:`X` is a matrix of size +:math:`n \times p` (with :math:`n` samples and :math:`p` features), +training has a cost of :math:`O(k n \bar p)`, where :math:`k` is the number of iterations (epochs) and :math:`\bar p` is the average number of non-zero attributes per sample. @@ -348,8 +349,8 @@ Tips on Practical Use * Stochastic Gradient Descent is sensitive to feature scaling, so it is highly recommended to scale your data. For example, scale each - attribute on the input vector X to [0,1] or [-1,+1], or standardize - it to have mean 0 and variance 1. Note that the *same* scaling must be + attribute on the input vector :math:`X` to :math:`[0,1]` or :math:`[-1,1]`, or standardize + it to have mean :math:`0` and variance :math:`1`. Note that the *same* scaling must be applied to the test vector to obtain meaningful results. This can be easily done using :class:`~sklearn.preprocessing.StandardScaler`:: @@ -375,16 +376,16 @@ Tips on Practical Use range ``10.0**-np.arange(1,7)``. * Empirically, we found that SGD converges after observing - approximately 10^6 training samples. Thus, a reasonable first guess + approximately :math:`10^6` training samples. Thus, a reasonable first guess for the number of iterations is ``max_iter = np.ceil(10**6 / n)``, where ``n`` is the size of the training set. * If you apply SGD to features extracted using PCA we found that it is often wise to scale the feature values by some constant `c` - such that the average L2 norm of the training data equals one. + such that the average :math:`L_2` norm of the training data equals one. * We found that Averaged SGD works best with a larger number of features - and a higher eta0. + and a higher `eta0`. .. rubric:: References @@ -452,11 +453,11 @@ misclassification error (Zero-one loss) as shown in the Figure below. Popular choices for the regularization term :math:`R` (the `penalty` parameter) include: -- L2 norm: :math:`R(w) := \frac{1}{2} \sum_{j=1}^{m} w_j^2 = ||w||_2^2`, -- L1 norm: :math:`R(w) := \sum_{j=1}^{m} |w_j|`, which leads to sparse +- :math:`L_2` norm: :math:`R(w) := \frac{1}{2} \sum_{j=1}^{m} w_j^2 = ||w||_2^2`, +- :math:`L_1` norm: :math:`R(w) := \sum_{j=1}^{m} |w_j|`, which leads to sparse solutions. - Elastic Net: :math:`R(w) := \frac{\rho}{2} \sum_{j=1}^{n} w_j^2 + - (1-\rho) \sum_{j=1}^{m} |w_j|`, a convex combination of L2 and L1, where + (1-\rho) \sum_{j=1}^{m} |w_j|`, a convex combination of :math:`L_2` and :math:`L_1`, where :math:`\rho` is given by ``1 - l1_ratio``. The Figure below shows the contours of the different regularization terms @@ -500,8 +501,8 @@ is given by where :math:`t` is the time step (there are a total of `n_samples * n_iter` time steps), :math:`t_0` is determined based on a heuristic proposed by Léon Bottou such that the expected initial updates are comparable with the expected -size of the weights (this assuming that the norm of the training samples is -approx. 1). The exact definition can be found in ``_init_t`` in `BaseSGD`. +size of the weights (this assumes that the norm of the training samples is +approximately 1). The exact definition can be found in ``_init_t`` in `BaseSGD`. For regression the default learning rate schedule is inverse scaling @@ -512,7 +513,7 @@ For regression the default learning rate schedule is inverse scaling \eta^{(t)} = \frac{eta_0}{t^{power\_t}} where :math:`eta_0` and :math:`power\_t` are hyperparameters chosen by the -user via ``eta0`` and ``power_t``, resp. +user via ``eta0`` and ``power_t``, respectively. For a constant learning rate use ``learning_rate='constant'`` and use ``eta0`` to specify the learning rate. @@ -520,7 +521,7 @@ to specify the learning rate. For an adaptively decreasing learning rate, use ``learning_rate='adaptive'`` and use ``eta0`` to specify the starting learning rate. When the stopping criterion is reached, the learning rate is divided by 5, and the algorithm -does not stop. The algorithm stops when the learning rate goes below 1e-6. +does not stop. The algorithm stops when the learning rate goes below `1e-6`. The model parameters can be accessed through the ``coef_`` and ``intercept_`` attributes: ``coef_`` holds the weights :math:`w` and @@ -540,7 +541,7 @@ The implementation of SGD is influenced by the `Stochastic Gradient SVM` of [#1]_. Similar to SvmSGD, the weight vector is represented as the product of a scalar and a vector -which allows an efficient weight update in the case of L2 regularization. +which allows an efficient weight update in the case of :math:`L_2` regularization. In the case of sparse input `X`, the intercept is updated with a smaller learning rate (multiplied by 0.01) to account for the fact that it is updated more frequently. Training examples are picked up sequentially @@ -548,7 +549,7 @@ and the learning rate is lowered after each observed example. We adopted the learning rate schedule from [#2]_. For multi-class classification, a "one versus all" approach is used. We use the truncated gradient algorithm proposed in [#3]_ -for L1 regularization (and the Elastic Net). +for :math:`L_1` regularization (and the Elastic Net). The code is written in Cython. .. rubric:: References From fc40a1472d8ac2e8dc01a1d98993f4a19382d3cb Mon Sep 17 00:00:00 2001 From: Aitsaid Azzedine Idir <81826283+Azzedde@users.noreply.github.com> Date: Thu, 15 May 2025 17:01:30 +0200 Subject: [PATCH 161/182] DOC Update docstring in partial_dependence.py (#31309) --- .../inspection/_plot/partial_dependence.py | 37 ++++++++++--------- 1 file changed, 19 insertions(+), 18 deletions(-) diff --git a/sklearn/inspection/_plot/partial_dependence.py b/sklearn/inspection/_plot/partial_dependence.py index bf4975cdfd2d9..b31a5070b236b 100644 --- a/sklearn/inspection/_plot/partial_dependence.py +++ b/sklearn/inspection/_plot/partial_dependence.py @@ -25,20 +25,17 @@ class PartialDependenceDisplay: - """Partial Dependence Plot (PDP). - - This can also display individual partial dependencies which are often - referred to as: Individual Condition Expectation (ICE). + """Partial Dependence Plot (PDP) and Individual Conditional Expectation (ICE). It is recommended to use :func:`~sklearn.inspection.PartialDependenceDisplay.from_estimator` to create a - :class:`~sklearn.inspection.PartialDependenceDisplay`. All parameters are - stored as attributes. + :class:`~sklearn.inspection.PartialDependenceDisplay`. All parameters are stored + as attributes. For general information regarding `scikit-learn` visualization tools, see the :ref:`Visualization Guide `. For guidance on interpreting these plots, refer to the - :ref:`Partial Dependence and ICE plots `. + :ref:`Inspection Guide `. For an example on how to use this class, see the following example: :ref:`sphx_glr_auto_examples_miscellaneous_plot_partial_dependence_visualization_api.py`. @@ -280,17 +277,21 @@ def from_estimator( ): """Partial dependence (PD) and individual conditional expectation (ICE) plots. - Partial dependence plots, individual conditional expectation plots or an - overlay of both of them can be plotted by setting the ``kind`` - parameter. The ``len(features)`` plots are arranged in a grid with - ``n_cols`` columns. Two-way partial dependence plots are plotted as - contour plots. The deciles of the feature values will be shown with tick - marks on the x-axes for one-way plots, and on both axes for two-way - plots. - - Read more in - :ref:`sphx_glr_auto_examples_inspection_plot_partial_dependence.py` - and the :ref:`User Guide `. + Partial dependence plots, individual conditional expectation plots, or an + overlay of both can be plotted by setting the `kind` parameter. + This method generates one plot for each entry in `features`. The plots + are arranged in a grid with `n_cols` columns. For one-way partial + dependence plots, the deciles of the feature values are shown on the + x-axis. For two-way plots, the deciles are shown on both axes and PDPs + are contour plots. + + For general information regarding `scikit-learn` visualization tools, see + the :ref:`Visualization Guide `. + For guidance on interpreting these plots, refer to the + :ref:`Inspection Guide `. + + For an example on how to use this class method, see + :ref:`sphx_glr_auto_examples_inspection_plot_partial_dependence.py`. .. note:: From 675736ae9e3f360975e1f5b477a8eba68a376ba9 Mon Sep 17 00:00:00 2001 From: "ayoub.agouzoul" <34219939+TheAyos@users.noreply.github.com> Date: Thu, 15 May 2025 16:41:10 +0100 Subject: [PATCH 162/182] DOC Add "See Also" reference to ValidationCurveDisplay in validation_curve docstring (#31314) --- sklearn/model_selection/_validation.py | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/sklearn/model_selection/_validation.py b/sklearn/model_selection/_validation.py index 79e8a77803292..8b70bf42603ef 100644 --- a/sklearn/model_selection/_validation.py +++ b/sklearn/model_selection/_validation.py @@ -2396,6 +2396,11 @@ def validation_curve( test_scores : array of shape (n_ticks, n_cv_folds) Scores on test set. + See Also + -------- + ValidationCurveDisplay.from_estimator : Plot the validation curve + given an estimator, the data, and the parameter to vary. + Notes ----- See :ref:`sphx_glr_auto_examples_model_selection_plot_train_error_vs_test_error.py` From bfca92285b1e0a23f475e738f83b9b57df6a030f Mon Sep 17 00:00:00 2001 From: scikit-learn-bot Date: Mon, 19 May 2025 13:52:31 +0200 Subject: [PATCH 163/182] :lock: :robot: CI Update lock files for scipy-dev CI build(s) :lock: :robot: (#31383) Co-authored-by: Lock file bot --- build_tools/azure/pylatest_pip_scipy_dev_linux-64_conda.lock | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/build_tools/azure/pylatest_pip_scipy_dev_linux-64_conda.lock b/build_tools/azure/pylatest_pip_scipy_dev_linux-64_conda.lock index f91a00242b5fd..06f78703619e1 100644 --- a/build_tools/azure/pylatest_pip_scipy_dev_linux-64_conda.lock +++ b/build_tools/azure/pylatest_pip_scipy_dev_linux-64_conda.lock @@ -43,7 +43,7 @@ https://repo.anaconda.com/pkgs/main/noarch/pip-25.1-pyhc872135_2.conda#2778327d2 # pip ninja @ https://files.pythonhosted.org/packages/eb/7a/455d2877fe6cf99886849c7f9755d897df32eaf3a0fba47b56e615f880f7/ninja-1.11.1.4-py3-none-manylinux_2_12_x86_64.manylinux2010_x86_64.whl#sha256=096487995473320de7f65d622c3f1d16c3ad174797602218ca8c967f51ec38a0 # pip packaging @ https://files.pythonhosted.org/packages/20/12/38679034af332785aac8774540895e234f4d07f7545804097de4b666afd8/packaging-25.0-py3-none-any.whl#sha256=29572ef2b1f17581046b3a2227d5c611fb25ec70ca1ba8554b24b0e69331a484 # pip platformdirs @ https://files.pythonhosted.org/packages/fe/39/979e8e21520d4e47a0bbe349e2713c0aac6f3d853d0e5b34d76206c439aa/platformdirs-4.3.8-py3-none-any.whl#sha256=ff7059bb7eb1179e2685604f4aaf157cfd9535242bd23742eadc3c13542139b4 -# pip pluggy @ https://files.pythonhosted.org/packages/88/5f/e351af9a41f866ac3f1fac4ca0613908d9a41741cfcf2228f4ad853b697d/pluggy-1.5.0-py3-none-any.whl#sha256=44e1ad92c8ca002de6377e165f3e0f1be63266ab4d554740532335b9d75ea669 +# pip pluggy @ https://files.pythonhosted.org/packages/54/20/4d324d65cc6d9205fabedc306948156824eb9f0ee1633355a8f7ec5c66bf/pluggy-1.6.0-py3-none-any.whl#sha256=e920276dd6813095e9377c0bc5566d94c932c33b27a3e3945d8389c374dd4746 # pip pygments @ https://files.pythonhosted.org/packages/8a/0b/9fcc47d19c48b59121088dd6da2488a49d5f72dacf8262e2790a1d2c7d15/pygments-2.19.1-py3-none-any.whl#sha256=9ea1544ad55cecf4b8242fab6dd35a93bbce657034b0611ee383099054ab6d8c # pip roman-numerals-py @ https://files.pythonhosted.org/packages/53/97/d2cbbaa10c9b826af0e10fdf836e1bf344d9f0abb873ebc34d1f49642d3f/roman_numerals_py-3.1.0-py3-none-any.whl#sha256=9da2ad2fb670bcf24e81070ceb3be72f6c11c440d73bd579fbeca1e9f330954c # pip six @ https://files.pythonhosted.org/packages/b7/ce/149a00dd41f10bc29e5921b496af8b574d8413afcd5e30dfa0ed46c2cc5e/six-1.17.0-py2.py3-none-any.whl#sha256=4721f391ed90541fddacab5acf947aa0d3dc7d27b2e1e8eda2be8970586c3274 From 0b4b22a97587d750075f1afd81a0a19a02452082 Mon Sep 17 00:00:00 2001 From: scikit-learn-bot Date: Mon, 19 May 2025 13:52:59 +0200 Subject: [PATCH 164/182] :lock: :robot: CI Update lock files for free-threaded CI build(s) :lock: :robot: (#31384) Co-authored-by: Lock file bot --- .../azure/pylatest_free_threaded_linux-64_conda.lock | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/build_tools/azure/pylatest_free_threaded_linux-64_conda.lock b/build_tools/azure/pylatest_free_threaded_linux-64_conda.lock index 210839a6969fc..c77b64e6d4d66 100644 --- a/build_tools/azure/pylatest_free_threaded_linux-64_conda.lock +++ b/build_tools/azure/pylatest_free_threaded_linux-64_conda.lock @@ -34,7 +34,7 @@ https://conda.anaconda.org/conda-forge/linux-64/libopenblas-0.3.29-pthreads_h94d https://conda.anaconda.org/conda-forge/linux-64/python-3.13.3-h4724d56_1_cp313t.conda#8193603fe48ace3d8801cfb246f44491 https://conda.anaconda.org/conda-forge/noarch/colorama-0.4.6-pyhd8ed1ab_1.conda#962b9857ee8e7018c22f2776ffa0b2d7 https://conda.anaconda.org/conda-forge/noarch/cpython-3.13.3-py313hd8ed1ab_1.conda#6ba9ba47b91b7758cb963d0f0eaf3422 -https://conda.anaconda.org/conda-forge/noarch/cython-3.1.0-pyh2c78169_100.conda#89943f37072ca254aa4b7de98c6d7f0a +https://conda.anaconda.org/conda-forge/noarch/cython-3.1.0-pyh2c78169_101.conda#3db6841854d296919c98e870276d0377 https://conda.anaconda.org/conda-forge/noarch/execnet-2.1.1-pyhd8ed1ab_1.conda#a71efeae2c160f6789900ba2631a2c90 https://conda.anaconda.org/conda-forge/noarch/iniconfig-2.0.0-pyhd8ed1ab_1.conda#6837f3eff7dcea42ecd714ce1ac2b108 https://conda.anaconda.org/conda-forge/linux-64/libblas-3.9.0-31_h59b9bed_openblas.conda#728dbebd0f7a20337218beacffd37916 @@ -42,7 +42,7 @@ https://conda.anaconda.org/conda-forge/linux-64/libhiredis-1.0.2-h2cc385e_0.tar. https://conda.anaconda.org/conda-forge/noarch/meson-1.8.0-pyh29332c3_0.conda#8e25221b702272394b86b0f4d7217f77 https://conda.anaconda.org/conda-forge/noarch/packaging-25.0-pyh29332c3_1.conda#58335b26c38bf4a20f399384c33cbcf9 https://conda.anaconda.org/conda-forge/noarch/pip-25.1.1-pyh145f28c_0.conda#01384ff1639c6330a0924791413b8714 -https://conda.anaconda.org/conda-forge/noarch/pluggy-1.5.0-pyhd8ed1ab_1.conda#e9dcbce5f45f9ee500e728ae58b605b6 +https://conda.anaconda.org/conda-forge/noarch/pluggy-1.6.0-pyhd8ed1ab_0.conda#7da7ccd349dbf6487a7778579d2bb971 https://conda.anaconda.org/conda-forge/noarch/setuptools-80.1.0-pyhff2d567_0.conda#f6f72d0837c79eaec77661be43e8a691 https://conda.anaconda.org/conda-forge/noarch/threadpoolctl-3.6.0-pyhecae5ae_0.conda#9d64911b31d57ca443e9f1e36b04385f https://conda.anaconda.org/conda-forge/noarch/tomli-2.2.1-pyhd8ed1ab_1.conda#ac944244f1fed2eb49bae07193ae8215 @@ -55,7 +55,7 @@ https://conda.anaconda.org/conda-forge/linux-64/liblapack-3.9.0-31_h7ac8fdf_open https://conda.anaconda.org/conda-forge/noarch/pyproject-metadata-0.9.1-pyhd8ed1ab_0.conda#22ae7c6ea81e0c8661ef32168dda929b https://conda.anaconda.org/conda-forge/noarch/python-freethreading-3.13.3-h92d6c8b_1.conda#4fa25290aec662a01642ba4b3c0ff5c1 https://conda.anaconda.org/conda-forge/noarch/meson-python-0.18.0-pyh70fd9c4_0.conda#576c04b9d9f8e45285fb4d9452c26133 -https://conda.anaconda.org/conda-forge/linux-64/numpy-2.2.5-py313h103f029_0.conda#7dcbd568d6f8a4ffba5ace28915f1230 +https://conda.anaconda.org/conda-forge/linux-64/numpy-2.2.6-py313h103f029_0.conda#7ae0a483b2cbbdf15d8429eb38f74a9e https://conda.anaconda.org/conda-forge/noarch/pytest-8.3.5-pyhd8ed1ab_0.conda#c3c9316209dec74a705a36797970c6be https://conda.anaconda.org/conda-forge/noarch/pytest-xdist-3.6.1-pyhd8ed1ab_1.conda#59aad4fb37cabc0bacc73cf344612ddd https://conda.anaconda.org/conda-forge/linux-64/scipy-1.15.2-py313h7f7b39c_0.conda#65f0c403e4324062633e648933f20a2e From b92c49cb4c1314c3b9d1374d1cd7b4f5ce92191b Mon Sep 17 00:00:00 2001 From: scikit-learn-bot Date: Mon, 19 May 2025 13:53:34 +0200 Subject: [PATCH 165/182] :lock: :robot: CI Update lock files for array-api CI build(s) :lock: :robot: (#31385) Co-authored-by: Lock file bot --- ...a_forge_cuda_array-api_linux-64_conda.lock | 35 ++++++++++--------- 1 file changed, 19 insertions(+), 16 deletions(-) diff --git a/build_tools/github/pylatest_conda_forge_cuda_array-api_linux-64_conda.lock b/build_tools/github/pylatest_conda_forge_cuda_array-api_linux-64_conda.lock index 106a6da8fbcb2..2acb45fbbe9c5 100644 --- a/build_tools/github/pylatest_conda_forge_cuda_array-api_linux-64_conda.lock +++ b/build_tools/github/pylatest_conda_forge_cuda_array-api_linux-64_conda.lock @@ -16,7 +16,7 @@ https://conda.anaconda.org/conda-forge/noarch/ca-certificates-2025.4.26-hbd8a1cb https://conda.anaconda.org/conda-forge/noarch/fonts-conda-forge-1-0.tar.bz2#f766549260d6815b0c52253f1fb1bb29 https://conda.anaconda.org/conda-forge/linux-64/ld_impl_linux-64-2.43-h712a8e2_4.conda#01f8d123c96816249efd255a31ad7712 https://conda.anaconda.org/conda-forge/linux-64/libglvnd-1.7.0-ha4b6fd6_2.conda#434ca7e50e40f4918ab701e3facd59a0 -https://conda.anaconda.org/conda-forge/linux-64/llvm-openmp-20.1.4-h024ca30_0.conda#4fc395cda27912a7d904b86b5dbf3a4d +https://conda.anaconda.org/conda-forge/linux-64/llvm-openmp-20.1.5-h024ca30_0.conda#86f58be65a51d62ccc06cacfd83ff987 https://conda.anaconda.org/conda-forge/noarch/sysroot_linux-64-2.17-h0157908_18.conda#460eba7851277ec1fd80a1a24080787a https://conda.anaconda.org/conda-forge/linux-64/_openmp_mutex-4.5-3_kmp_llvm.conda#ee5c2118262e30b972bc0b4db8ef0ba5 https://conda.anaconda.org/conda-forge/noarch/fonts-conda-ecosystem-1-0.tar.bz2#fee5683a3f04bd15cbd8318b096a27ab @@ -27,7 +27,7 @@ https://conda.anaconda.org/conda-forge/linux-64/alsa-lib-1.2.14-hb9d3cd8_0.conda https://conda.anaconda.org/conda-forge/linux-64/aws-c-common-0.12.0-hb9d3cd8_0.conda#f65c946f28f0518f41ced702f44c52b7 https://conda.anaconda.org/conda-forge/linux-64/c-ares-1.34.5-hb9d3cd8_0.conda#f7f0d6cc2dc986d42ac2689ec88192be https://conda.anaconda.org/conda-forge/linux-64/libbrotlicommon-1.1.0-hb9d3cd8_2.conda#41b599ed2b02abcfdd84302bff174b23 -https://conda.anaconda.org/conda-forge/linux-64/libdeflate-1.23-h86f0d12_0.conda#27fe770decaf469a53f3e3a6d593067f +https://conda.anaconda.org/conda-forge/linux-64/libdeflate-1.24-h86f0d12_0.conda#64f0c503da58ec25ebd359e4d990afa8 https://conda.anaconda.org/conda-forge/linux-64/libexpat-2.7.0-h5888daf_0.conda#db0bfbe7dd197b68ad5f30333bae6ce0 https://conda.anaconda.org/conda-forge/linux-64/libffi-3.4.6-h2dba641_1.conda#ede4673863426c0883c0063d853bbd85 https://conda.anaconda.org/conda-forge/linux-64/libgcc-ng-15.1.0-h69a702a_2.conda#ddca86c7040dd0e73b2b69bd7833d225 @@ -100,9 +100,9 @@ https://conda.anaconda.org/conda-forge/linux-64/libopenblas-0.3.29-pthreads_h94d https://conda.anaconda.org/conda-forge/linux-64/libprotobuf-5.28.3-h6128344_1.conda#d8703f1ffe5a06356f06467f1d0b9464 https://conda.anaconda.org/conda-forge/linux-64/libre2-11-2024.07.02-hbbce691_2.conda#b2fede24428726dd867611664fb372e8 https://conda.anaconda.org/conda-forge/linux-64/libthrift-0.21.0-h0e7cc3e_0.conda#dcb95c0a98ba9ff737f7ae482aef7833 -https://conda.anaconda.org/conda-forge/linux-64/libtiff-4.7.0-hd9ff511_4.conda#6c1028898cf3a2032d9af46689e1b81a +https://conda.anaconda.org/conda-forge/linux-64/libtiff-4.7.0-hf01ce69_5.conda#e79a094918988bb1807462cd42c83962 https://conda.anaconda.org/conda-forge/linux-64/nccl-2.26.5.1-h03a54cd_0.conda#47dc81d35df91d38609df9c93d608b2b -https://conda.anaconda.org/conda-forge/linux-64/pcre2-10.44-hc749103_2.conda#31614c73d7b103ef76faa4d83d261d34 +https://conda.anaconda.org/conda-forge/linux-64/pcre2-10.45-hc749103_0.conda#b90bece58b4c2bf25969b70f3be42d25 https://conda.anaconda.org/conda-forge/linux-64/python-3.13.3-hf636f53_101_cp313.conda#10622e12d649154af0bd76bcf33a7c5c https://conda.anaconda.org/conda-forge/linux-64/qhull-2020.2-h434a139_5.conda#353823361b1d27eb3960efb076dfcaf6 https://conda.anaconda.org/conda-forge/linux-64/xcb-util-0.4.1-hb711507_2.conda#8637c3e5821654d0edf97e2b0404b443 @@ -116,10 +116,9 @@ https://conda.anaconda.org/conda-forge/linux-64/aws-c-http-0.9.4-hb9b18c6_4.cond https://conda.anaconda.org/conda-forge/linux-64/brotli-1.1.0-hb9d3cd8_2.conda#98514fe74548d768907ce7a13f680e8f https://conda.anaconda.org/conda-forge/noarch/colorama-0.4.6-pyhd8ed1ab_1.conda#962b9857ee8e7018c22f2776ffa0b2d7 https://conda.anaconda.org/conda-forge/noarch/cpython-3.13.3-py313hd8ed1ab_101.conda#904a822cbd380adafb9070debf8579a8 -https://conda.anaconda.org/conda-forge/linux-64/cudnn-9.9.0.52-hf36481c_0.conda#5586a7f60b88d82c6d8ee5e0309c34d8 https://conda.anaconda.org/conda-forge/noarch/cycler-0.12.1-pyhd8ed1ab_1.conda#44600c4667a319d67dbe0681fc0bc833 https://conda.anaconda.org/conda-forge/linux-64/cyrus-sasl-2.1.27-h54b06d7_7.conda#dce22f70b4e5a407ce88f2be046f4ceb -https://conda.anaconda.org/conda-forge/linux-64/cython-3.1.0-py313h5dec8f5_0.conda#43ede3c67f0001ebc9dbf9a5e5e2b218 +https://conda.anaconda.org/conda-forge/linux-64/cython-3.1.0-py313h5dec8f5_1.conda#43ad5286d089949501cf07064693d070 https://conda.anaconda.org/conda-forge/noarch/execnet-2.1.1-pyhd8ed1ab_1.conda#a71efeae2c160f6789900ba2631a2c90 https://conda.anaconda.org/conda-forge/linux-64/fastrlock-0.8.3-py313h9800cb9_1.conda#54dd71b3be2ed6ccc50f180347c901db https://conda.anaconda.org/conda-forge/noarch/filelock-3.18.0-pyhd8ed1ab_0.conda#4547b39256e296bb758166893e909a7c @@ -128,10 +127,11 @@ https://conda.anaconda.org/conda-forge/noarch/iniconfig-2.0.0-pyhd8ed1ab_1.conda https://conda.anaconda.org/conda-forge/linux-64/kiwisolver-1.4.7-py313h33d0bda_0.conda#9862d13a5e466273d5a4738cffcb8d6c https://conda.anaconda.org/conda-forge/linux-64/lcms2-2.17-h717163a_0.conda#000e85703f0fd9594c81710dd5066471 https://conda.anaconda.org/conda-forge/linux-64/libblas-3.9.0-31_h59b9bed_openblas.conda#728dbebd0f7a20337218beacffd37916 +https://conda.anaconda.org/conda-forge/linux-64/libcudnn-9.10.0.56-h7d33bf5_1.conda#e05296c6fbac13686336684c97f9ae59 https://conda.anaconda.org/conda-forge/linux-64/libcups-2.3.3-h4637d8d_4.conda#d4529f4dff3057982a7617c7ac58fde3 https://conda.anaconda.org/conda-forge/linux-64/libcurl-8.13.0-h332b0f4_0.conda#cbdc92ac0d93fe3c796e36ad65c7905c https://conda.anaconda.org/conda-forge/linux-64/libfreetype-2.13.3-ha770c72_1.conda#51f5be229d83ecd401fb369ab96ae669 -https://conda.anaconda.org/conda-forge/linux-64/libglib-2.84.1-h2ff4ddf_0.conda#0305434da649d4fb48a425e588b79ea6 +https://conda.anaconda.org/conda-forge/linux-64/libglib-2.84.1-h3618099_1.conda#714c97d4ff495ab69d1fdfcadbcae985 https://conda.anaconda.org/conda-forge/linux-64/libglx-1.7.0-ha4b6fd6_2.conda#c8013e438185f33b13814c5c488acd5c https://conda.anaconda.org/conda-forge/linux-64/libhiredis-1.0.2-h2cc385e_0.tar.bz2#b34907d3a81a3cd8095ee83d174c074a https://conda.anaconda.org/conda-forge/linux-64/libxml2-2.13.8-h4bc477f_0.conda#14dbe05b929e329dbaa6f2d0aa19466d @@ -146,7 +146,7 @@ https://conda.anaconda.org/conda-forge/linux-64/openjpeg-2.5.3-h5fbd93e_0.conda# https://conda.anaconda.org/conda-forge/linux-64/orc-2.1.1-h2271f48_0.conda#67075ef2cb33079efee3abfe58127a3b https://conda.anaconda.org/conda-forge/noarch/packaging-25.0-pyh29332c3_1.conda#58335b26c38bf4a20f399384c33cbcf9 https://conda.anaconda.org/conda-forge/noarch/pip-25.1.1-pyh145f28c_0.conda#01384ff1639c6330a0924791413b8714 -https://conda.anaconda.org/conda-forge/noarch/pluggy-1.5.0-pyhd8ed1ab_1.conda#e9dcbce5f45f9ee500e728ae58b605b6 +https://conda.anaconda.org/conda-forge/noarch/pluggy-1.6.0-pyhd8ed1ab_0.conda#7da7ccd349dbf6487a7778579d2bb971 https://conda.anaconda.org/conda-forge/noarch/pyparsing-3.2.3-pyhd8ed1ab_1.conda#513d3c262ee49b54a8fec85c5bc99764 https://conda.anaconda.org/conda-forge/noarch/python-tzdata-2025.2-pyhd8ed1ab_0.conda#88476ae6ebd24f39261e0854ac244f33 https://conda.anaconda.org/conda-forge/noarch/pytz-2025.2-pyhd8ed1ab_0.conda#bc8e3267d44011051f2eb14d22fb0960 @@ -156,7 +156,7 @@ https://conda.anaconda.org/conda-forge/noarch/six-1.17.0-pyhd8ed1ab_0.conda#a451 https://conda.anaconda.org/conda-forge/noarch/threadpoolctl-3.6.0-pyhecae5ae_0.conda#9d64911b31d57ca443e9f1e36b04385f https://conda.anaconda.org/conda-forge/noarch/toml-0.10.2-pyhd8ed1ab_1.conda#b0dd904de08b7db706167240bf37b164 https://conda.anaconda.org/conda-forge/noarch/tomli-2.2.1-pyhd8ed1ab_1.conda#ac944244f1fed2eb49bae07193ae8215 -https://conda.anaconda.org/conda-forge/linux-64/tornado-6.4.2-py313h536fd9c_0.conda#5f5cbdd527d2e74e270d8b6255ba714f +https://conda.anaconda.org/conda-forge/linux-64/tornado-6.5-py313h536fd9c_0.conda#922c4f97a250416414fc393acf5fe53c https://conda.anaconda.org/conda-forge/noarch/typing_extensions-4.13.2-pyh29332c3_0.conda#83fc6ae00127671e301c9f44254c31b8 https://conda.anaconda.org/conda-forge/linux-64/xcb-util-image-0.4.0-hb711507_2.conda#a0901183f08b6c7107aab109733a3c91 https://conda.anaconda.org/conda-forge/linux-64/xkeyboard-config-2.44-hb9d3cd8_0.conda#7c91bfc90672888259675ad2ad28af9c @@ -175,11 +175,12 @@ https://conda.anaconda.org/conda-forge/linux-64/freetype-2.13.3-ha770c72_1.conda https://conda.anaconda.org/conda-forge/noarch/jinja2-3.1.6-pyhd8ed1ab_0.conda#446bd6c8cb26050d528881df495ce646 https://conda.anaconda.org/conda-forge/noarch/joblib-1.5.0-pyhd8ed1ab_0.conda#3d7257f0a61c9aa4ffa3e324a887416b https://conda.anaconda.org/conda-forge/linux-64/libcblas-3.9.0-31_he106b2a_openblas.conda#abb32c727da370c481a1c206f5159ce9 +https://conda.anaconda.org/conda-forge/linux-64/libcudnn-dev-9.10.0.56-h0fdc2d1_1.conda#7c4e5bc28bd4a1fcba8dcd4df1cf388a https://conda.anaconda.org/conda-forge/linux-64/libgl-1.7.0-ha4b6fd6_2.conda#928b8be80851f5d8ffb016f9c81dae7a https://conda.anaconda.org/conda-forge/linux-64/libgrpc-1.67.1-h25350d4_2.conda#bfcedaf5f9b003029cc6abe9431f66bf https://conda.anaconda.org/conda-forge/linux-64/libhwloc-2.11.2-default_h0d58e46_1001.conda#804ca9e91bcaea0824a341d55b1684f2 https://conda.anaconda.org/conda-forge/linux-64/liblapack-3.9.0-31_h7ac8fdf_openblas.conda#452b98eafe050ecff932f0ec832dd03f -https://conda.anaconda.org/conda-forge/linux-64/libllvm20-20.1.4-he9d0ab4_0.conda#96c33bbd084ef2b2463503fb7f1482ae +https://conda.anaconda.org/conda-forge/linux-64/libllvm20-20.1.5-he9d0ab4_0.conda#8d2f5a2f019bd76ccba5eb771852d411 https://conda.anaconda.org/conda-forge/linux-64/libxkbcommon-1.9.2-h65c71a3_0.conda#d045b1d878031eb497cab44e6392b1df https://conda.anaconda.org/conda-forge/linux-64/libxslt-1.1.39-h76b75d6_0.conda#e71f31f8cfb0a91439f2086fc8aa0461 https://conda.anaconda.org/conda-forge/linux-64/mpc-1.3.1-h24ddda3_1.conda#aa14b9a5196a6d8dd364164b7ce56acf @@ -200,17 +201,18 @@ https://conda.anaconda.org/conda-forge/noarch/_python_abi3_support-1.0-hd8ed1ab_ https://conda.anaconda.org/conda-forge/linux-64/aws-c-s3-0.7.13-h822ba82_2.conda#9cf2c3c13468f2209ee814be2c88655f https://conda.anaconda.org/conda-forge/linux-64/azure-identity-cpp-1.10.0-h113e628_0.conda#73f73f60854f325a55f1d31459f2ab73 https://conda.anaconda.org/conda-forge/linux-64/azure-storage-common-cpp-12.8.0-h736e048_1.conda#13de36be8de3ae3f05ba127631599213 +https://conda.anaconda.org/conda-forge/linux-64/cudnn-9.10.0.56-h0fdc2d1_1.conda#41596f6e8efb39da98aa320df5635a15 https://conda.anaconda.org/conda-forge/linux-64/fontconfig-2.15.0-h7e30c49_1.conda#8f5b0b297b59e1ac160ad4beec99dbee https://conda.anaconda.org/conda-forge/linux-64/gmpy2-2.2.1-py313h11186cd_0.conda#54d020e0eaacf1e99bfb2410b9aa2e5e -https://conda.anaconda.org/conda-forge/linux-64/libclang-cpp20.1-20.1.4-default_h1df26ce_0.conda#96f8d5b2e94c9ba4fef19f1adf068a15 -https://conda.anaconda.org/conda-forge/linux-64/libclang13-20.1.4-default_he06ed0a_0.conda#2d933632c8004be47deb2be61bf013be +https://conda.anaconda.org/conda-forge/linux-64/libclang-cpp20.1-20.1.5-default_h1df26ce_0.conda#79a1be1cd92a7f2b62e6c0a7c2da8bf8 +https://conda.anaconda.org/conda-forge/linux-64/libclang13-20.1.5-default_he06ed0a_0.conda#9a912cce23df3fea9d2adb75e505b153 https://conda.anaconda.org/conda-forge/linux-64/libgoogle-cloud-2.36.0-h2b5623c_0.conda#c96ca58ad3352a964bfcb85de6cd1496 https://conda.anaconda.org/conda-forge/linux-64/liblapacke-3.9.0-31_he2f377e_openblas.conda#7e5fff7d0db69be3a266f7e79a3bb0e2 https://conda.anaconda.org/conda-forge/linux-64/libmagma-2.9.0-h45b15fe_0.conda#703a1ab01e36111d8bb40bc7517e900b https://conda.anaconda.org/conda-forge/linux-64/libopentelemetry-cpp-1.18.0-hfcad708_1.conda#1f5a5d66e77a39dc5bd639ec953705cf https://conda.anaconda.org/conda-forge/linux-64/libpq-17.5-h27ae623_0.conda#6458be24f09e1b034902ab44fe9de908 https://conda.anaconda.org/conda-forge/noarch/meson-python-0.18.0-pyh70fd9c4_0.conda#576c04b9d9f8e45285fb4d9452c26133 -https://conda.anaconda.org/conda-forge/linux-64/numpy-2.2.5-py313h17eae1a_0.conda#6ceeff9ed72e54e4a2f9a1c88f47bdde +https://conda.anaconda.org/conda-forge/linux-64/numpy-2.2.6-py313h17eae1a_0.conda#7a2d2f9adecd86ed5c29c2115354f615 https://conda.anaconda.org/conda-forge/noarch/pytest-8.3.5-pyhd8ed1ab_0.conda#c3c9316209dec74a705a36797970c6be https://conda.anaconda.org/conda-forge/linux-64/tbb-2021.13.0-hceb3a55_1.conda#ba7726b8df7b9d34ea80e82b097a4893 https://conda.anaconda.org/conda-forge/linux-64/xorg-libxtst-1.2.5-hb9d3cd8_3.conda#7bbe9a0cc0df0ac5f5a8ad6d6a11af2f @@ -225,7 +227,7 @@ https://conda.anaconda.org/conda-forge/linux-64/libgoogle-cloud-storage-2.36.0-h https://conda.anaconda.org/conda-forge/linux-64/libmagma_sparse-2.9.0-h45b15fe_0.conda#beac0a5bbe0af75db6b16d3d8fd24f7e https://conda.anaconda.org/conda-forge/linux-64/mkl-2024.2.2-ha957f24_16.conda#1459379c79dda834673426504d52b319 https://conda.anaconda.org/conda-forge/linux-64/pandas-2.2.3-py313ha87cce1_3.conda#6248b529e537b1d4cb5ab3ef7f537795 -https://conda.anaconda.org/conda-forge/linux-64/polars-1.29.0-py39h441220d_0.conda#6be2bbd70bf401a6f59952ba1355d8b8 +https://conda.anaconda.org/conda-forge/linux-64/polars-default-1.29.0-py39hfac2b71_1.conda#3c9014d11acfd00121c3d275aea778ad https://conda.anaconda.org/conda-forge/noarch/pytest-cov-6.1.1-pyhd8ed1ab_0.conda#1e35d8f975bc0e984a19819aa91c440a https://conda.anaconda.org/conda-forge/noarch/pytest-xdist-3.6.1-pyhd8ed1ab_1.conda#59aad4fb37cabc0bacc73cf344612ddd https://conda.anaconda.org/conda-forge/linux-64/scipy-1.15.2-py313h86fcf2b_0.conda#ca68acd9febc86448eeed68d0c6c8643 @@ -234,13 +236,14 @@ https://conda.anaconda.org/conda-forge/linux-64/aws-sdk-cpp-1.11.510-h37a5c72_3. https://conda.anaconda.org/conda-forge/linux-64/azure-storage-files-datalake-cpp-12.12.0-ha633028_1.conda#7c1980f89dd41b097549782121a73490 https://conda.anaconda.org/conda-forge/linux-64/blas-2.131-openblas.conda#38b2ec894c69bb4be0e66d2ef7fc60bf https://conda.anaconda.org/conda-forge/linux-64/cupy-13.4.1-py313h66a2ee2_0.conda#784d6bd149ef2b5d9c733ea3dd4d15ad -https://conda.anaconda.org/conda-forge/linux-64/harfbuzz-11.1.0-h3beb420_0.conda#95e3bb97f9cdc251c0c68640e9c10ed3 +https://conda.anaconda.org/conda-forge/linux-64/harfbuzz-11.2.1-h3beb420_0.conda#0e6e192d4b3d95708ad192d957cf3163 https://conda.anaconda.org/conda-forge/linux-64/libtorch-2.4.1-cuda118_mkl_hee7131c_306.conda#28b3b3da11973494ed0100aa50f47328 https://conda.anaconda.org/conda-forge/linux-64/matplotlib-base-3.10.3-py313h129903b_0.conda#4f8816d006b1c155ec416bcf7ff6cee2 +https://conda.anaconda.org/conda-forge/linux-64/polars-1.29.0-default_h9d2e075_1.conda#7482bbd35de40c380fd2aa07c4babf90 https://conda.anaconda.org/conda-forge/linux-64/pyamg-5.2.1-py313hf0ab243_1.conda#4c769bf3858f424cb2ecf952175ec600 https://conda.anaconda.org/conda-forge/linux-64/libarrow-19.0.1-hc7b3859_3_cpu.conda#9ed3ded6da29dec8417f2e1db68798f2 https://conda.anaconda.org/conda-forge/linux-64/pytorch-2.4.1-cuda118_mkl_py313_h909c4c2_306.conda#de6e45613bbdb51127e9ff483c31bf41 -https://conda.anaconda.org/conda-forge/linux-64/qt6-main-6.9.0-h8d00660_2.conda#ac0eb548e24a2cb3c2c8ba060aef7db2 +https://conda.anaconda.org/conda-forge/linux-64/qt6-main-6.9.0-h0384650_3.conda#8aa69e15597a205fd6f81781fe62c232 https://conda.anaconda.org/conda-forge/linux-64/libarrow-acero-19.0.1-hcb10f89_3_cpu.conda#8f8dc214d89e06933f1bc1dcd2310b9c https://conda.anaconda.org/conda-forge/linux-64/libparquet-19.0.1-h081d1f1_3_cpu.conda#1d04307cdb1d8aeb5f55b047d5d403ea https://conda.anaconda.org/conda-forge/linux-64/pyarrow-core-19.0.1-py313he5f92c8_0_cpu.conda#7d8649531c807b24295c8f9a0a396a78 From ff6bf36f06ca80bf505f37a8c5c42047129952ec Mon Sep 17 00:00:00 2001 From: "Christine P. Chai" Date: Mon, 19 May 2025 04:57:43 -0700 Subject: [PATCH 166/182] DOC: Correct a typo in math equations (#31376) --- doc/modules/linear_model.rst | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/doc/modules/linear_model.rst b/doc/modules/linear_model.rst index 69a2bf9b7f477..007afdc592c29 100644 --- a/doc/modules/linear_model.rst +++ b/doc/modules/linear_model.rst @@ -971,7 +971,7 @@ logistic regression, see also `log-linear model .. dropdown:: Mathematical details - Let :math:`y_i \in {1, \ldots, K}` be the label (ordinal) encoded target variable for observation :math:`i`. + Let :math:`y_i \in \{1, \ldots, K\}` be the label (ordinal) encoded target variable for observation :math:`i`. Instead of a single coefficient vector, we now have a matrix of coefficients :math:`W` where each row vector :math:`W_k` corresponds to class :math:`k`. We aim at predicting the class probabilities :math:`P(y_i=k|X_i)` via From 9b40cbce33ed5c0ca7155c0dc4461e95c1de3943 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Lo=C3=AFc=20Est=C3=A8ve?= Date: Tue, 20 May 2025 11:50:43 +0200 Subject: [PATCH 167/182] MNT Update array-api-compat to 1.12 (#31388) --- maint_tools/vendor_array_api_compat.sh | 2 +- .../externals/array_api_compat/__init__.py | 2 +- .../externals/array_api_compat/_internal.py | 25 +- .../array_api_compat/common/__init__.py | 2 +- .../array_api_compat/common/_aliases.py | 508 +++++++++++------- .../externals/array_api_compat/common/_fft.py | 144 ++--- .../array_api_compat/common/_helpers.py | 487 ++++++++++------- .../array_api_compat/common/_linalg.py | 156 ++++-- .../array_api_compat/common/_typing.py | 192 ++++++- .../array_api_compat/cupy/__init__.py | 3 - .../array_api_compat/cupy/_aliases.py | 77 ++- .../externals/array_api_compat/cupy/_info.py | 20 +- .../array_api_compat/cupy/_typing.py | 63 +-- .../array_api_compat/dask/array/__init__.py | 9 +- .../array_api_compat/dask/array/_aliases.py | 205 +++---- .../array_api_compat/dask/array/_info.py | 137 +++-- .../array_api_compat/dask/array/fft.py | 13 +- .../array_api_compat/dask/array/linalg.py | 43 +- .../array_api_compat/numpy/__init__.py | 28 +- .../array_api_compat/numpy/_aliases.py | 136 +++-- .../externals/array_api_compat/numpy/_info.py | 50 +- .../array_api_compat/numpy/_typing.py | 70 +-- .../externals/array_api_compat/numpy/fft.py | 16 +- .../array_api_compat/numpy/linalg.py | 97 +++- sklearn/externals/array_api_compat/py.typed | 0 .../array_api_compat/torch/__init__.py | 6 +- .../array_api_compat/torch/_aliases.py | 324 ++++++----- .../externals/array_api_compat/torch/_info.py | 41 +- .../array_api_compat/torch/_typing.py | 3 + .../externals/array_api_compat/torch/fft.py | 35 +- .../array_api_compat/torch/linalg.py | 32 +- 31 files changed, 1823 insertions(+), 1103 deletions(-) create mode 100644 sklearn/externals/array_api_compat/py.typed create mode 100644 sklearn/externals/array_api_compat/torch/_typing.py diff --git a/maint_tools/vendor_array_api_compat.sh b/maint_tools/vendor_array_api_compat.sh index 52fa4c570a534..51056ce477cbb 100755 --- a/maint_tools/vendor_array_api_compat.sh +++ b/maint_tools/vendor_array_api_compat.sh @@ -6,7 +6,7 @@ set -o nounset set -o errexit URL="https://github.com/data-apis/array-api-compat.git" -VERSION="1.11.2" +VERSION="1.12" ROOT_DIR=sklearn/externals/array_api_compat diff --git a/sklearn/externals/array_api_compat/__init__.py b/sklearn/externals/array_api_compat/__init__.py index 96b061e721808..653cb40a37607 100644 --- a/sklearn/externals/array_api_compat/__init__.py +++ b/sklearn/externals/array_api_compat/__init__.py @@ -17,6 +17,6 @@ this implementation for the default when working with NumPy arrays. """ -__version__ = '1.11.2' +__version__ = '1.12.0' from .common import * # noqa: F401, F403 diff --git a/sklearn/externals/array_api_compat/_internal.py b/sklearn/externals/array_api_compat/_internal.py index 170a1ff9e6459..cd8d939f36de2 100644 --- a/sklearn/externals/array_api_compat/_internal.py +++ b/sklearn/externals/array_api_compat/_internal.py @@ -2,10 +2,16 @@ Internal helpers """ +from collections.abc import Callable from functools import wraps from inspect import signature +from types import ModuleType +from typing import TypeVar -def get_xp(xp): +_T = TypeVar("_T") + + +def get_xp(xp: ModuleType) -> Callable[[Callable[..., _T]], Callable[..., _T]]: """ Decorator to automatically replace xp with the corresponding array module. @@ -22,14 +28,14 @@ def func(x, /, xp, kwarg=None): """ - def inner(f): + def inner(f: Callable[..., _T], /) -> Callable[..., _T]: @wraps(f) - def wrapped_f(*args, **kwargs): + def wrapped_f(*args: object, **kwargs: object) -> object: return f(*args, xp=xp, **kwargs) sig = signature(f) new_sig = sig.replace( - parameters=[sig.parameters[i] for i in sig.parameters if i != "xp"] + parameters=[par for i, par in sig.parameters.items() if i != "xp"] ) if wrapped_f.__doc__ is None: @@ -40,7 +46,14 @@ def wrapped_f(*args, **kwargs): specification for more details. """ - wrapped_f.__signature__ = new_sig - return wrapped_f + wrapped_f.__signature__ = new_sig # pyright: ignore[reportAttributeAccessIssue] + return wrapped_f # pyright: ignore[reportReturnType] return inner + + +__all__ = ["get_xp"] + + +def __dir__() -> list[str]: + return __all__ diff --git a/sklearn/externals/array_api_compat/common/__init__.py b/sklearn/externals/array_api_compat/common/__init__.py index 91ab1c405e1d7..8236080738175 100644 --- a/sklearn/externals/array_api_compat/common/__init__.py +++ b/sklearn/externals/array_api_compat/common/__init__.py @@ -1 +1 @@ -from ._helpers import * # noqa: F403 +from ._helpers import * # noqa: F403 diff --git a/sklearn/externals/array_api_compat/common/_aliases.py b/sklearn/externals/array_api_compat/common/_aliases.py index 35262d3a93538..8ea9162a9edc8 100644 --- a/sklearn/externals/array_api_compat/common/_aliases.py +++ b/sklearn/externals/array_api_compat/common/_aliases.py @@ -4,142 +4,171 @@ from __future__ import annotations -from typing import TYPE_CHECKING -if TYPE_CHECKING: - from typing import Optional, Sequence, Tuple, Union - from ._typing import ndarray, Device, Dtype - -from typing import NamedTuple import inspect +from typing import TYPE_CHECKING, Any, NamedTuple, Optional, Sequence, cast -from ._helpers import array_namespace, _check_device, device, is_cupy_namespace +from ._helpers import _check_device, array_namespace +from ._helpers import device as _get_device +from ._helpers import is_cupy_namespace as _is_cupy_namespace +from ._typing import Array, Device, DType, Namespace + +if TYPE_CHECKING: + # TODO: import from typing (requires Python >=3.13) + from typing_extensions import TypeIs # These functions are modified from the NumPy versions. -# Creation functions add the device keyword (which does nothing for NumPy) +# Creation functions add the device keyword (which does nothing for NumPy and Dask) + def arange( - start: Union[int, float], + start: float, /, - stop: Optional[Union[int, float]] = None, - step: Union[int, float] = 1, + stop: float | None = None, + step: float = 1, *, - xp, - dtype: Optional[Dtype] = None, - device: Optional[Device] = None, - **kwargs -) -> ndarray: + xp: Namespace, + dtype: DType | None = None, + device: Device | None = None, + **kwargs: object, +) -> Array: _check_device(xp, device) return xp.arange(start, stop=stop, step=step, dtype=dtype, **kwargs) + def empty( - shape: Union[int, Tuple[int, ...]], - xp, + shape: int | tuple[int, ...], + xp: Namespace, *, - dtype: Optional[Dtype] = None, - device: Optional[Device] = None, - **kwargs -) -> ndarray: + dtype: DType | None = None, + device: Device | None = None, + **kwargs: object, +) -> Array: _check_device(xp, device) return xp.empty(shape, dtype=dtype, **kwargs) + def empty_like( - x: ndarray, /, xp, *, dtype: Optional[Dtype] = None, device: Optional[Device] = None, - **kwargs -) -> ndarray: + x: Array, + /, + xp: Namespace, + *, + dtype: DType | None = None, + device: Device | None = None, + **kwargs: object, +) -> Array: _check_device(xp, device) return xp.empty_like(x, dtype=dtype, **kwargs) + def eye( n_rows: int, - n_cols: Optional[int] = None, + n_cols: int | None = None, /, *, - xp, + xp: Namespace, k: int = 0, - dtype: Optional[Dtype] = None, - device: Optional[Device] = None, - **kwargs, -) -> ndarray: + dtype: DType | None = None, + device: Device | None = None, + **kwargs: object, +) -> Array: _check_device(xp, device) return xp.eye(n_rows, M=n_cols, k=k, dtype=dtype, **kwargs) + def full( - shape: Union[int, Tuple[int, ...]], - fill_value: Union[int, float], - xp, + shape: int | tuple[int, ...], + fill_value: complex, + xp: Namespace, *, - dtype: Optional[Dtype] = None, - device: Optional[Device] = None, - **kwargs, -) -> ndarray: + dtype: DType | None = None, + device: Device | None = None, + **kwargs: object, +) -> Array: _check_device(xp, device) return xp.full(shape, fill_value, dtype=dtype, **kwargs) + def full_like( - x: ndarray, + x: Array, /, - fill_value: Union[int, float], + fill_value: complex, *, - xp, - dtype: Optional[Dtype] = None, - device: Optional[Device] = None, - **kwargs, -) -> ndarray: + xp: Namespace, + dtype: DType | None = None, + device: Device | None = None, + **kwargs: object, +) -> Array: _check_device(xp, device) return xp.full_like(x, fill_value, dtype=dtype, **kwargs) + def linspace( - start: Union[int, float], - stop: Union[int, float], + start: float, + stop: float, /, num: int, *, - xp, - dtype: Optional[Dtype] = None, - device: Optional[Device] = None, + xp: Namespace, + dtype: DType | None = None, + device: Device | None = None, endpoint: bool = True, - **kwargs, -) -> ndarray: + **kwargs: object, +) -> Array: _check_device(xp, device) return xp.linspace(start, stop, num, dtype=dtype, endpoint=endpoint, **kwargs) + def ones( - shape: Union[int, Tuple[int, ...]], - xp, + shape: int | tuple[int, ...], + xp: Namespace, *, - dtype: Optional[Dtype] = None, - device: Optional[Device] = None, - **kwargs, -) -> ndarray: + dtype: DType | None = None, + device: Device | None = None, + **kwargs: object, +) -> Array: _check_device(xp, device) return xp.ones(shape, dtype=dtype, **kwargs) + def ones_like( - x: ndarray, /, xp, *, dtype: Optional[Dtype] = None, device: Optional[Device] = None, - **kwargs, -) -> ndarray: + x: Array, + /, + xp: Namespace, + *, + dtype: DType | None = None, + device: Device | None = None, + **kwargs: object, +) -> Array: _check_device(xp, device) return xp.ones_like(x, dtype=dtype, **kwargs) + def zeros( - shape: Union[int, Tuple[int, ...]], - xp, + shape: int | tuple[int, ...], + xp: Namespace, *, - dtype: Optional[Dtype] = None, - device: Optional[Device] = None, - **kwargs, -) -> ndarray: + dtype: DType | None = None, + device: Device | None = None, + **kwargs: object, +) -> Array: _check_device(xp, device) return xp.zeros(shape, dtype=dtype, **kwargs) + def zeros_like( - x: ndarray, /, xp, *, dtype: Optional[Dtype] = None, device: Optional[Device] = None, - **kwargs, -) -> ndarray: + x: Array, + /, + xp: Namespace, + *, + dtype: DType | None = None, + device: Device | None = None, + **kwargs: object, +) -> Array: _check_device(xp, device) return xp.zeros_like(x, dtype=dtype, **kwargs) + # np.unique() is split into four functions in the array API: # unique_all, unique_counts, unique_inverse, and unique_values (this is done # to remove polymorphic return types). @@ -147,35 +176,37 @@ def zeros_like( # The functions here return namedtuples (np.unique() returns a normal # tuple). + # Note that these named tuples aren't actually part of the standard namespace, # but I don't see any issue with exporting the names here regardless. class UniqueAllResult(NamedTuple): - values: ndarray - indices: ndarray - inverse_indices: ndarray - counts: ndarray + values: Array + indices: Array + inverse_indices: Array + counts: Array class UniqueCountsResult(NamedTuple): - values: ndarray - counts: ndarray + values: Array + counts: Array class UniqueInverseResult(NamedTuple): - values: ndarray - inverse_indices: ndarray + values: Array + inverse_indices: Array -def _unique_kwargs(xp): +def _unique_kwargs(xp: Namespace) -> dict[str, bool]: # Older versions of NumPy and CuPy do not have equal_nan. Rather than # trying to parse version numbers, just check if equal_nan is in the # signature. s = inspect.signature(xp.unique) - if 'equal_nan' in s.parameters: - return {'equal_nan': False} + if "equal_nan" in s.parameters: + return {"equal_nan": False} return {} -def unique_all(x: ndarray, /, xp) -> UniqueAllResult: + +def unique_all(x: Array, /, xp: Namespace) -> UniqueAllResult: kwargs = _unique_kwargs(xp) values, indices, inverse_indices, counts = xp.unique( x, @@ -195,20 +226,16 @@ def unique_all(x: ndarray, /, xp) -> UniqueAllResult: ) -def unique_counts(x: ndarray, /, xp) -> UniqueCountsResult: +def unique_counts(x: Array, /, xp: Namespace) -> UniqueCountsResult: kwargs = _unique_kwargs(xp) res = xp.unique( - x, - return_counts=True, - return_index=False, - return_inverse=False, - **kwargs + x, return_counts=True, return_index=False, return_inverse=False, **kwargs ) return UniqueCountsResult(*res) -def unique_inverse(x: ndarray, /, xp) -> UniqueInverseResult: +def unique_inverse(x: Array, /, xp: Namespace) -> UniqueInverseResult: kwargs = _unique_kwargs(xp) values, inverse_indices = xp.unique( x, @@ -223,7 +250,7 @@ def unique_inverse(x: ndarray, /, xp) -> UniqueInverseResult: return UniqueInverseResult(values, inverse_indices) -def unique_values(x: ndarray, /, xp) -> ndarray: +def unique_values(x: Array, /, xp: Namespace) -> Array: kwargs = _unique_kwargs(xp) return xp.unique( x, @@ -233,51 +260,58 @@ def unique_values(x: ndarray, /, xp) -> ndarray: **kwargs, ) + # These functions have different keyword argument names + def std( - x: ndarray, + x: Array, /, - xp, + xp: Namespace, *, - axis: Optional[Union[int, Tuple[int, ...]]] = None, - correction: Union[int, float] = 0.0, # correction instead of ddof + axis: int | tuple[int, ...] | None = None, + correction: float = 0.0, # correction instead of ddof keepdims: bool = False, - **kwargs, -) -> ndarray: + **kwargs: object, +) -> Array: return xp.std(x, axis=axis, ddof=correction, keepdims=keepdims, **kwargs) + def var( - x: ndarray, + x: Array, /, - xp, + xp: Namespace, *, - axis: Optional[Union[int, Tuple[int, ...]]] = None, - correction: Union[int, float] = 0.0, # correction instead of ddof + axis: int | tuple[int, ...] | None = None, + correction: float = 0.0, # correction instead of ddof keepdims: bool = False, - **kwargs, -) -> ndarray: + **kwargs: object, +) -> Array: return xp.var(x, axis=axis, ddof=correction, keepdims=keepdims, **kwargs) + # cumulative_sum is renamed from cumsum, and adds the include_initial keyword # argument + def cumulative_sum( - x: ndarray, + x: Array, /, - xp, + xp: Namespace, *, - axis: Optional[int] = None, - dtype: Optional[Dtype] = None, + axis: int | None = None, + dtype: DType | None = None, include_initial: bool = False, - **kwargs -) -> ndarray: + **kwargs: object, +) -> Array: wrapped_xp = array_namespace(x) # TODO: The standard is not clear about what should happen when x.ndim == 0. if axis is None: if x.ndim > 1: - raise ValueError("axis must be specified in cumulative_sum for more than one dimension") + raise ValueError( + "axis must be specified in cumulative_sum for more than one dimension" + ) axis = 0 res = xp.cumsum(x, axis=axis, dtype=dtype, **kwargs) @@ -287,27 +321,34 @@ def cumulative_sum( initial_shape = list(x.shape) initial_shape[axis] = 1 res = xp.concatenate( - [wrapped_xp.zeros(shape=initial_shape, dtype=res.dtype, device=device(res)), res], + [ + wrapped_xp.zeros( + shape=initial_shape, dtype=res.dtype, device=_get_device(res) + ), + res, + ], axis=axis, ) return res def cumulative_prod( - x: ndarray, + x: Array, /, - xp, + xp: Namespace, *, - axis: Optional[int] = None, - dtype: Optional[Dtype] = None, + axis: int | None = None, + dtype: DType | None = None, include_initial: bool = False, - **kwargs -) -> ndarray: + **kwargs: object, +) -> Array: wrapped_xp = array_namespace(x) if axis is None: if x.ndim > 1: - raise ValueError("axis must be specified in cumulative_prod for more than one dimension") + raise ValueError( + "axis must be specified in cumulative_prod for more than one dimension" + ) axis = 0 res = xp.cumprod(x, axis=axis, dtype=dtype, **kwargs) @@ -317,25 +358,32 @@ def cumulative_prod( initial_shape = list(x.shape) initial_shape[axis] = 1 res = xp.concatenate( - [wrapped_xp.ones(shape=initial_shape, dtype=res.dtype, device=device(res)), res], + [ + wrapped_xp.ones( + shape=initial_shape, dtype=res.dtype, device=_get_device(res) + ), + res, + ], axis=axis, ) return res + # The min and max argument names in clip are different and not optional in numpy, and type # promotion behavior is different. def clip( - x: ndarray, + x: Array, /, - min: Optional[Union[int, float, ndarray]] = None, - max: Optional[Union[int, float, ndarray]] = None, + min: float | Array | None = None, + max: float | Array | None = None, *, - xp, + xp: Namespace, # TODO: np.clip has other ufunc kwargs - out: Optional[ndarray] = None, -) -> ndarray: - def _isscalar(a): + out: Array | None = None, +) -> Array: + def _isscalar(a: object) -> TypeIs[int | float | None]: return isinstance(a, (int, float, type(None))) + min_shape = () if _isscalar(min) else min.shape max_shape = () if _isscalar(max) else max.shape @@ -360,7 +408,6 @@ def _isscalar(a): # but an answer of 0 might be preferred. See # https://github.com/numpy/numpy/issues/24976 for more discussion on this issue. - # At least handle the case of Python integers correctly (see # https://github.com/numpy/numpy/pull/26892). if wrapped_xp.isdtype(x.dtype, "integral"): @@ -369,9 +416,10 @@ def _isscalar(a): if type(max) is int and max >= wrapped_xp.iinfo(x.dtype).max: max = None - dev = device(x) + dev = _get_device(x) if out is None: out = wrapped_xp.empty(result_shape, dtype=x.dtype, device=dev) + assert out is not None # workaround for a type-narrowing issue in pyright out[()] = x if min is not None: @@ -389,16 +437,22 @@ def _isscalar(a): # Return a scalar for 0-D return out[()] + # Unlike transpose(), the axes argument to permute_dims() is required. -def permute_dims(x: ndarray, /, axes: Tuple[int, ...], xp) -> ndarray: +def permute_dims(x: Array, /, axes: tuple[int, ...], xp: Namespace) -> Array: return xp.transpose(x, axes) + # np.reshape calls the keyword argument 'newshape' instead of 'shape' -def reshape(x: ndarray, - /, - shape: Tuple[int, ...], - xp, copy: Optional[bool] = None, - **kwargs) -> ndarray: +def reshape( + x: Array, + /, + shape: tuple[int, ...], + xp: Namespace, + *, + copy: Optional[bool] = None, + **kwargs: object, +) -> Array: if copy is True: x = x.copy() elif copy is False: @@ -407,17 +461,24 @@ def reshape(x: ndarray, return y return xp.reshape(x, shape, **kwargs) + # The descending keyword is new in sort and argsort, and 'kind' replaced with # 'stable' def argsort( - x: ndarray, /, xp, *, axis: int = -1, descending: bool = False, stable: bool = True, - **kwargs, -) -> ndarray: + x: Array, + /, + xp: Namespace, + *, + axis: int = -1, + descending: bool = False, + stable: bool = True, + **kwargs: object, +) -> Array: # Note: this keyword argument is different, and the default is different. # We set it in kwargs like this because numpy.sort uses kind='quicksort' # as the default whereas cupy.sort uses kind=None. if stable: - kwargs['kind'] = "stable" + kwargs["kind"] = "stable" if not descending: res = xp.argsort(x, axis=axis, **kwargs) else: @@ -434,69 +495,87 @@ def argsort( res = max_i - res return res + def sort( - x: ndarray, /, xp, *, axis: int = -1, descending: bool = False, stable: bool = True, - **kwargs, -) -> ndarray: + x: Array, + /, + xp: Namespace, + *, + axis: int = -1, + descending: bool = False, + stable: bool = True, + **kwargs: object, +) -> Array: # Note: this keyword argument is different, and the default is different. # We set it in kwargs like this because numpy.sort uses kind='quicksort' # as the default whereas cupy.sort uses kind=None. if stable: - kwargs['kind'] = "stable" + kwargs["kind"] = "stable" res = xp.sort(x, axis=axis, **kwargs) if descending: res = xp.flip(res, axis=axis) return res + # nonzero should error for zero-dimensional arrays -def nonzero(x: ndarray, /, xp, **kwargs) -> Tuple[ndarray, ...]: +def nonzero(x: Array, /, xp: Namespace, **kwargs: object) -> tuple[Array, ...]: if x.ndim == 0: raise ValueError("nonzero() does not support zero-dimensional arrays") return xp.nonzero(x, **kwargs) + # ceil, floor, and trunc return integers for integer inputs -def ceil(x: ndarray, /, xp, **kwargs) -> ndarray: + +def ceil(x: Array, /, xp: Namespace, **kwargs: object) -> Array: if xp.issubdtype(x.dtype, xp.integer): return x return xp.ceil(x, **kwargs) -def floor(x: ndarray, /, xp, **kwargs) -> ndarray: + +def floor(x: Array, /, xp: Namespace, **kwargs: object) -> Array: if xp.issubdtype(x.dtype, xp.integer): return x return xp.floor(x, **kwargs) -def trunc(x: ndarray, /, xp, **kwargs) -> ndarray: + +def trunc(x: Array, /, xp: Namespace, **kwargs: object) -> Array: if xp.issubdtype(x.dtype, xp.integer): return x return xp.trunc(x, **kwargs) + # linear algebra functions -def matmul(x1: ndarray, x2: ndarray, /, xp, **kwargs) -> ndarray: + +def matmul(x1: Array, x2: Array, /, xp: Namespace, **kwargs: object) -> Array: return xp.matmul(x1, x2, **kwargs) + # Unlike transpose, matrix_transpose only transposes the last two axes. -def matrix_transpose(x: ndarray, /, xp) -> ndarray: +def matrix_transpose(x: Array, /, xp: Namespace) -> Array: if x.ndim < 2: raise ValueError("x must be at least 2-dimensional for matrix_transpose") return xp.swapaxes(x, -1, -2) -def tensordot(x1: ndarray, - x2: ndarray, - /, - xp, - *, - axes: Union[int, Tuple[Sequence[int], Sequence[int]]] = 2, - **kwargs, -) -> ndarray: + +def tensordot( + x1: Array, + x2: Array, + /, + xp: Namespace, + *, + axes: int | tuple[Sequence[int], Sequence[int]] = 2, + **kwargs: object, +) -> Array: return xp.tensordot(x1, x2, axes=axes, **kwargs) -def vecdot(x1: ndarray, x2: ndarray, /, xp, *, axis: int = -1) -> ndarray: + +def vecdot(x1: Array, x2: Array, /, xp: Namespace, *, axis: int = -1) -> Array: if x1.shape[axis] != x2.shape[axis]: raise ValueError("x1 and x2 must have the same size along the given axis") - if hasattr(xp, 'broadcast_tensors'): + if hasattr(xp, "broadcast_tensors"): _broadcast = xp.broadcast_tensors else: _broadcast = xp.broadcast_arrays @@ -508,11 +587,16 @@ def vecdot(x1: ndarray, x2: ndarray, /, xp, *, axis: int = -1) -> ndarray: res = xp.conj(x1_[..., None, :]) @ x2_[..., None] return res[..., 0, 0] + # isdtype is a new function in the 2022.12 array API specification. + def isdtype( - dtype: Dtype, kind: Union[Dtype, str, Tuple[Union[Dtype, str], ...]], xp, - *, _tuple=True, # Disallow nested tuples + dtype: DType, + kind: DType | str | tuple[DType | str, ...], + xp: Namespace, + *, + _tuple: bool = True, # Disallow nested tuples ) -> bool: """ Returns a boolean indicating whether a provided dtype is of a specified data type ``kind``. @@ -525,21 +609,24 @@ def isdtype( for more details """ if isinstance(kind, tuple) and _tuple: - return any(isdtype(dtype, k, xp, _tuple=False) for k in kind) + return any( + isdtype(dtype, k, xp, _tuple=False) + for k in cast("tuple[DType | str, ...]", kind) + ) elif isinstance(kind, str): - if kind == 'bool': + if kind == "bool": return dtype == xp.bool_ - elif kind == 'signed integer': + elif kind == "signed integer": return xp.issubdtype(dtype, xp.signedinteger) - elif kind == 'unsigned integer': + elif kind == "unsigned integer": return xp.issubdtype(dtype, xp.unsignedinteger) - elif kind == 'integral': + elif kind == "integral": return xp.issubdtype(dtype, xp.integer) - elif kind == 'real floating': + elif kind == "real floating": return xp.issubdtype(dtype, xp.floating) - elif kind == 'complex floating': + elif kind == "complex floating": return xp.issubdtype(dtype, xp.complexfloating) - elif kind == 'numeric': + elif kind == "numeric": return xp.issubdtype(dtype, xp.number) else: raise ValueError(f"Unrecognized data type kind: {kind!r}") @@ -550,32 +637,91 @@ def isdtype( # array_api_strict implementation will be very strict. return dtype == kind + # unstack is a new function in the 2023.12 array API standard -def unstack(x: ndarray, /, xp, *, axis: int = 0) -> Tuple[ndarray, ...]: +def unstack(x: Array, /, xp: Namespace, *, axis: int = 0) -> tuple[Array, ...]: if x.ndim == 0: raise ValueError("Input array must be at least 1-d.") return tuple(xp.moveaxis(x, axis, 0)) + # numpy 1.26 does not use the standard definition for sign on complex numbers -def sign(x: ndarray, /, xp, **kwargs) -> ndarray: - if isdtype(x.dtype, 'complex floating', xp=xp): - out = (x/xp.abs(x, **kwargs))[...] + +def sign(x: Array, /, xp: Namespace, **kwargs: object) -> Array: + if isdtype(x.dtype, "complex floating", xp=xp): + out = (x / xp.abs(x, **kwargs))[...] # sign(0) = 0 but the above formula would give nan - out[x == 0+0j] = 0+0j + out[x == 0j] = 0j else: out = xp.sign(x, **kwargs) # CuPy sign() does not propagate nans. See # https://github.com/data-apis/array-api-compat/issues/136 - if is_cupy_namespace(xp) and isdtype(x.dtype, 'real floating', xp=xp): + if _is_cupy_namespace(xp) and isdtype(x.dtype, "real floating", xp=xp): out[xp.isnan(x)] = xp.nan return out[()] -__all__ = ['arange', 'empty', 'empty_like', 'eye', 'full', 'full_like', - 'linspace', 'ones', 'ones_like', 'zeros', 'zeros_like', - 'UniqueAllResult', 'UniqueCountsResult', 'UniqueInverseResult', - 'unique_all', 'unique_counts', 'unique_inverse', 'unique_values', - 'std', 'var', 'cumulative_sum', 'cumulative_prod','clip', 'permute_dims', - 'reshape', 'argsort', 'sort', 'nonzero', 'ceil', 'floor', 'trunc', - 'matmul', 'matrix_transpose', 'tensordot', 'vecdot', 'isdtype', - 'unstack', 'sign'] + +def finfo(type_: DType | Array, /, xp: Namespace) -> Any: + # It is surprisingly difficult to recognize a dtype apart from an array. + # np.int64 is not the same as np.asarray(1).dtype! + try: + return xp.finfo(type_) + except (ValueError, TypeError): + return xp.finfo(type_.dtype) + + +def iinfo(type_: DType | Array, /, xp: Namespace) -> Any: + try: + return xp.iinfo(type_) + except (ValueError, TypeError): + return xp.iinfo(type_.dtype) + + +__all__ = [ + "arange", + "empty", + "empty_like", + "eye", + "full", + "full_like", + "linspace", + "ones", + "ones_like", + "zeros", + "zeros_like", + "UniqueAllResult", + "UniqueCountsResult", + "UniqueInverseResult", + "unique_all", + "unique_counts", + "unique_inverse", + "unique_values", + "std", + "var", + "cumulative_sum", + "cumulative_prod", + "clip", + "permute_dims", + "reshape", + "argsort", + "sort", + "nonzero", + "ceil", + "floor", + "trunc", + "matmul", + "matrix_transpose", + "tensordot", + "vecdot", + "isdtype", + "unstack", + "sign", + "finfo", + "iinfo", +] +_all_ignore = ["inspect", "array_namespace", "NamedTuple"] + + +def __dir__() -> list[str]: + return __all__ diff --git a/sklearn/externals/array_api_compat/common/_fft.py b/sklearn/externals/array_api_compat/common/_fft.py index e5caebef732c1..18839d37f8494 100644 --- a/sklearn/externals/array_api_compat/common/_fft.py +++ b/sklearn/externals/array_api_compat/common/_fft.py @@ -1,149 +1,150 @@ from __future__ import annotations -from typing import TYPE_CHECKING, Union, Optional, Literal +from collections.abc import Sequence +from typing import Literal, TypeAlias -if TYPE_CHECKING: - from ._typing import Device, ndarray, DType - from collections.abc import Sequence +from ._typing import Array, Device, DType, Namespace + +_Norm: TypeAlias = Literal["backward", "ortho", "forward"] # Note: NumPy fft functions improperly upcast float32 and complex64 to # complex128, which is why we require wrapping them all here. def fft( - x: ndarray, + x: Array, /, - xp, + xp: Namespace, *, - n: Optional[int] = None, + n: int | None = None, axis: int = -1, - norm: Literal["backward", "ortho", "forward"] = "backward", -) -> ndarray: + norm: _Norm = "backward", +) -> Array: res = xp.fft.fft(x, n=n, axis=axis, norm=norm) if x.dtype in [xp.float32, xp.complex64]: return res.astype(xp.complex64) return res def ifft( - x: ndarray, + x: Array, /, - xp, + xp: Namespace, *, - n: Optional[int] = None, + n: int | None = None, axis: int = -1, - norm: Literal["backward", "ortho", "forward"] = "backward", -) -> ndarray: + norm: _Norm = "backward", +) -> Array: res = xp.fft.ifft(x, n=n, axis=axis, norm=norm) if x.dtype in [xp.float32, xp.complex64]: return res.astype(xp.complex64) return res def fftn( - x: ndarray, + x: Array, /, - xp, + xp: Namespace, *, - s: Sequence[int] = None, - axes: Sequence[int] = None, - norm: Literal["backward", "ortho", "forward"] = "backward", -) -> ndarray: + s: Sequence[int] | None = None, + axes: Sequence[int] | None = None, + norm: _Norm = "backward", +) -> Array: res = xp.fft.fftn(x, s=s, axes=axes, norm=norm) if x.dtype in [xp.float32, xp.complex64]: return res.astype(xp.complex64) return res def ifftn( - x: ndarray, + x: Array, /, - xp, + xp: Namespace, *, - s: Sequence[int] = None, - axes: Sequence[int] = None, - norm: Literal["backward", "ortho", "forward"] = "backward", -) -> ndarray: + s: Sequence[int] | None = None, + axes: Sequence[int] | None = None, + norm: _Norm = "backward", +) -> Array: res = xp.fft.ifftn(x, s=s, axes=axes, norm=norm) if x.dtype in [xp.float32, xp.complex64]: return res.astype(xp.complex64) return res def rfft( - x: ndarray, + x: Array, /, - xp, + xp: Namespace, *, - n: Optional[int] = None, + n: int | None = None, axis: int = -1, - norm: Literal["backward", "ortho", "forward"] = "backward", -) -> ndarray: + norm: _Norm = "backward", +) -> Array: res = xp.fft.rfft(x, n=n, axis=axis, norm=norm) if x.dtype == xp.float32: return res.astype(xp.complex64) return res def irfft( - x: ndarray, + x: Array, /, - xp, + xp: Namespace, *, - n: Optional[int] = None, + n: int | None = None, axis: int = -1, - norm: Literal["backward", "ortho", "forward"] = "backward", -) -> ndarray: + norm: _Norm = "backward", +) -> Array: res = xp.fft.irfft(x, n=n, axis=axis, norm=norm) if x.dtype == xp.complex64: return res.astype(xp.float32) return res def rfftn( - x: ndarray, + x: Array, /, - xp, + xp: Namespace, *, - s: Sequence[int] = None, - axes: Sequence[int] = None, - norm: Literal["backward", "ortho", "forward"] = "backward", -) -> ndarray: + s: Sequence[int] | None = None, + axes: Sequence[int] | None = None, + norm: _Norm = "backward", +) -> Array: res = xp.fft.rfftn(x, s=s, axes=axes, norm=norm) if x.dtype == xp.float32: return res.astype(xp.complex64) return res def irfftn( - x: ndarray, + x: Array, /, - xp, + xp: Namespace, *, - s: Sequence[int] = None, - axes: Sequence[int] = None, - norm: Literal["backward", "ortho", "forward"] = "backward", -) -> ndarray: + s: Sequence[int] | None = None, + axes: Sequence[int] | None = None, + norm: _Norm = "backward", +) -> Array: res = xp.fft.irfftn(x, s=s, axes=axes, norm=norm) if x.dtype == xp.complex64: return res.astype(xp.float32) return res def hfft( - x: ndarray, + x: Array, /, - xp, + xp: Namespace, *, - n: Optional[int] = None, + n: int | None = None, axis: int = -1, - norm: Literal["backward", "ortho", "forward"] = "backward", -) -> ndarray: + norm: _Norm = "backward", +) -> Array: res = xp.fft.hfft(x, n=n, axis=axis, norm=norm) if x.dtype in [xp.float32, xp.complex64]: return res.astype(xp.float32) return res def ihfft( - x: ndarray, + x: Array, /, - xp, + xp: Namespace, *, - n: Optional[int] = None, + n: int | None = None, axis: int = -1, - norm: Literal["backward", "ortho", "forward"] = "backward", -) -> ndarray: + norm: _Norm = "backward", +) -> Array: res = xp.fft.ihfft(x, n=n, axis=axis, norm=norm) if x.dtype in [xp.float32, xp.complex64]: return res.astype(xp.complex64) @@ -152,12 +153,12 @@ def ihfft( def fftfreq( n: int, /, - xp, + xp: Namespace, *, d: float = 1.0, - dtype: Optional[DType] = None, - device: Optional[Device] = None -) -> ndarray: + dtype: DType | None = None, + device: Device | None = None, +) -> Array: if device not in ["cpu", None]: raise ValueError(f"Unsupported device {device!r}") res = xp.fft.fftfreq(n, d=d) @@ -168,12 +169,12 @@ def fftfreq( def rfftfreq( n: int, /, - xp, + xp: Namespace, *, d: float = 1.0, - dtype: Optional[DType] = None, - device: Optional[Device] = None -) -> ndarray: + dtype: DType | None = None, + device: Device | None = None, +) -> Array: if device not in ["cpu", None]: raise ValueError(f"Unsupported device {device!r}") res = xp.fft.rfftfreq(n, d=d) @@ -181,10 +182,14 @@ def rfftfreq( return res.astype(dtype) return res -def fftshift(x: ndarray, /, xp, *, axes: Union[int, Sequence[int]] = None) -> ndarray: +def fftshift( + x: Array, /, xp: Namespace, *, axes: int | Sequence[int] | None = None +) -> Array: return xp.fft.fftshift(x, axes=axes) -def ifftshift(x: ndarray, /, xp, *, axes: Union[int, Sequence[int]] = None) -> ndarray: +def ifftshift( + x: Array, /, xp: Namespace, *, axes: int | Sequence[int] | None = None +) -> Array: return xp.fft.ifftshift(x, axes=axes) __all__ = [ @@ -203,3 +208,6 @@ def ifftshift(x: ndarray, /, xp, *, axes: Union[int, Sequence[int]] = None) -> n "fftshift", "ifftshift", ] + +def __dir__() -> list[str]: + return __all__ diff --git a/sklearn/externals/array_api_compat/common/_helpers.py b/sklearn/externals/array_api_compat/common/_helpers.py index 970450e8ff2e9..77175d0d1e974 100644 --- a/sklearn/externals/array_api_compat/common/_helpers.py +++ b/sklearn/externals/array_api_compat/common/_helpers.py @@ -5,35 +5,97 @@ that are in __all__ are intended as additional helper functions for use by end users of the compat library. """ + from __future__ import annotations -from typing import TYPE_CHECKING +import inspect +import math +import sys +import warnings +from collections.abc import Collection, Hashable +from functools import lru_cache +from typing import ( + TYPE_CHECKING, + Any, + Final, + Literal, + SupportsIndex, + TypeAlias, + TypeGuard, + TypeVar, + cast, + overload, +) + +from ._typing import Array, Device, HasShape, Namespace, SupportsArrayNamespace if TYPE_CHECKING: - from typing import Optional, Union, Any - from ._typing import Array, Device, Namespace -import sys -import math -import inspect -import warnings + import dask.array as da + import jax + import ndonnx as ndx + import numpy as np + import numpy.typing as npt + import sparse # pyright: ignore[reportMissingTypeStubs] + import torch + + # TODO: import from typing (requires Python >=3.13) + from typing_extensions import TypeIs, TypeVar + + _SizeT = TypeVar("_SizeT", bound = int | None) -def _is_jax_zero_gradient_array(x: object) -> bool: + _ZeroGradientArray: TypeAlias = npt.NDArray[np.void] + _CupyArray: TypeAlias = Any # cupy has no py.typed + + _ArrayApiObj: TypeAlias = ( + npt.NDArray[Any] + | da.Array + | jax.Array + | ndx.Array + | sparse.SparseArray + | torch.Tensor + | SupportsArrayNamespace[Any] + | _CupyArray + ) + +_API_VERSIONS_OLD: Final = frozenset({"2021.12", "2022.12", "2023.12"}) +_API_VERSIONS: Final = _API_VERSIONS_OLD | frozenset({"2024.12"}) + + +@lru_cache(100) +def _issubclass_fast(cls: type, modname: str, clsname: str) -> bool: + try: + mod = sys.modules[modname] + except KeyError: + return False + parent_cls = getattr(mod, clsname) + return issubclass(cls, parent_cls) + + +def _is_jax_zero_gradient_array(x: object) -> TypeGuard[_ZeroGradientArray]: """Return True if `x` is a zero-gradient array. These arrays are a design quirk of Jax that may one day be removed. See https://github.com/google/jax/issues/20620. """ - if 'numpy' not in sys.modules or 'jax' not in sys.modules: + # Fast exit + try: + dtype = x.dtype # type: ignore[attr-defined] + except AttributeError: + return False + cls = cast(Hashable, type(dtype)) + if not _issubclass_fast(cls, "numpy.dtypes", "VoidDType"): return False - import numpy as np - import jax + if "jax" not in sys.modules: + return False - return isinstance(x, np.ndarray) and x.dtype == jax.float0 + import jax + # jax.float0 is a np.dtype([('float0', 'V')]) + return dtype == jax.float0 -def is_numpy_array(x: object) -> bool: +def is_numpy_array(x: object) -> TypeGuard[npt.NDArray[Any]]: """ Return True if `x` is a NumPy array. @@ -54,15 +116,12 @@ def is_numpy_array(x: object) -> bool: is_jax_array is_pydata_sparse_array """ - # Avoid importing NumPy if it isn't already - if 'numpy' not in sys.modules: - return False - - import numpy as np - # TODO: Should we reject ndarray subclasses? - return (isinstance(x, (np.ndarray, np.generic)) - and not _is_jax_zero_gradient_array(x)) + cls = cast(Hashable, type(x)) + return ( + _issubclass_fast(cls, "numpy", "ndarray") + or _issubclass_fast(cls, "numpy", "generic") + ) and not _is_jax_zero_gradient_array(x) def is_cupy_array(x: object) -> bool: @@ -86,17 +145,11 @@ def is_cupy_array(x: object) -> bool: is_jax_array is_pydata_sparse_array """ - # Avoid importing CuPy if it isn't already - if 'cupy' not in sys.modules: - return False - - import cupy as cp - - # TODO: Should we reject ndarray subclasses? - return isinstance(x, cp.ndarray) + cls = cast(Hashable, type(x)) + return _issubclass_fast(cls, "cupy", "ndarray") -def is_torch_array(x: object) -> bool: +def is_torch_array(x: object) -> TypeIs[torch.Tensor]: """ Return True if `x` is a PyTorch tensor. @@ -114,17 +167,11 @@ def is_torch_array(x: object) -> bool: is_jax_array is_pydata_sparse_array """ - # Avoid importing torch if it isn't already - if 'torch' not in sys.modules: - return False - - import torch - - # TODO: Should we reject ndarray subclasses? - return isinstance(x, torch.Tensor) + cls = cast(Hashable, type(x)) + return _issubclass_fast(cls, "torch", "Tensor") -def is_ndonnx_array(x: object) -> bool: +def is_ndonnx_array(x: object) -> TypeIs[ndx.Array]: """ Return True if `x` is a ndonnx Array. @@ -143,16 +190,11 @@ def is_ndonnx_array(x: object) -> bool: is_jax_array is_pydata_sparse_array """ - # Avoid importing torch if it isn't already - if 'ndonnx' not in sys.modules: - return False - - import ndonnx as ndx - - return isinstance(x, ndx.Array) + cls = cast(Hashable, type(x)) + return _issubclass_fast(cls, "ndonnx", "Array") -def is_dask_array(x: object) -> bool: +def is_dask_array(x: object) -> TypeIs[da.Array]: """ Return True if `x` is a dask.array Array. @@ -171,16 +213,11 @@ def is_dask_array(x: object) -> bool: is_jax_array is_pydata_sparse_array """ - # Avoid importing dask if it isn't already - if 'dask.array' not in sys.modules: - return False - - import dask.array - - return isinstance(x, dask.array.Array) + cls = cast(Hashable, type(x)) + return _issubclass_fast(cls, "dask.array", "Array") -def is_jax_array(x: object) -> bool: +def is_jax_array(x: object) -> TypeIs[jax.Array]: """ Return True if `x` is a JAX array. @@ -200,16 +237,11 @@ def is_jax_array(x: object) -> bool: is_dask_array is_pydata_sparse_array """ - # Avoid importing jax if it isn't already - if 'jax' not in sys.modules: - return False - - import jax - - return isinstance(x, jax.Array) or _is_jax_zero_gradient_array(x) + cls = cast(Hashable, type(x)) + return _issubclass_fast(cls, "jax", "Array") or _is_jax_zero_gradient_array(x) -def is_pydata_sparse_array(x) -> bool: +def is_pydata_sparse_array(x: object) -> TypeIs[sparse.SparseArray]: """ Return True if `x` is an array from the `sparse` package. @@ -229,17 +261,12 @@ def is_pydata_sparse_array(x) -> bool: is_dask_array is_jax_array """ - # Avoid importing jax if it isn't already - if 'sparse' not in sys.modules: - return False - - import sparse - # TODO: Account for other backends. - return isinstance(x, sparse.SparseArray) + cls = cast(Hashable, type(x)) + return _issubclass_fast(cls, "sparse", "SparseArray") -def is_array_api_obj(x: object) -> bool: +def is_array_api_obj(x: object) -> TypeIs[_ArrayApiObj]: # pyright: ignore[reportUnknownParameterType] """ Return True if `x` is an array API compatible array object. @@ -254,21 +281,34 @@ def is_array_api_obj(x: object) -> bool: is_dask_array is_jax_array """ - return is_numpy_array(x) \ - or is_cupy_array(x) \ - or is_torch_array(x) \ - or is_dask_array(x) \ - or is_jax_array(x) \ - or is_pydata_sparse_array(x) \ - or hasattr(x, '__array_namespace__') + return ( + hasattr(x, '__array_namespace__') + or _is_array_api_cls(cast(Hashable, type(x))) + ) + + +@lru_cache(100) +def _is_array_api_cls(cls: type) -> bool: + return ( + # TODO: drop support for numpy<2 which didn't have __array_namespace__ + _issubclass_fast(cls, "numpy", "ndarray") + or _issubclass_fast(cls, "numpy", "generic") + or _issubclass_fast(cls, "cupy", "ndarray") + or _issubclass_fast(cls, "torch", "Tensor") + or _issubclass_fast(cls, "dask.array", "Array") + or _issubclass_fast(cls, "sparse", "SparseArray") + # TODO: drop support for jax<0.4.32 which didn't have __array_namespace__ + or _issubclass_fast(cls, "jax", "Array") + ) def _compat_module_name() -> str: - assert __name__.endswith('.common._helpers') - return __name__.removesuffix('.common._helpers') + assert __name__.endswith(".common._helpers") + return __name__.removesuffix(".common._helpers") -def is_numpy_namespace(xp) -> bool: +@lru_cache(100) +def is_numpy_namespace(xp: Namespace) -> bool: """ Returns True if `xp` is a NumPy namespace. @@ -286,10 +326,11 @@ def is_numpy_namespace(xp) -> bool: is_pydata_sparse_namespace is_array_api_strict_namespace """ - return xp.__name__ in {'numpy', _compat_module_name() + '.numpy'} + return xp.__name__ in {"numpy", _compat_module_name() + ".numpy"} -def is_cupy_namespace(xp) -> bool: +@lru_cache(100) +def is_cupy_namespace(xp: Namespace) -> bool: """ Returns True if `xp` is a CuPy namespace. @@ -307,10 +348,11 @@ def is_cupy_namespace(xp) -> bool: is_pydata_sparse_namespace is_array_api_strict_namespace """ - return xp.__name__ in {'cupy', _compat_module_name() + '.cupy'} + return xp.__name__ in {"cupy", _compat_module_name() + ".cupy"} -def is_torch_namespace(xp) -> bool: +@lru_cache(100) +def is_torch_namespace(xp: Namespace) -> bool: """ Returns True if `xp` is a PyTorch namespace. @@ -328,10 +370,10 @@ def is_torch_namespace(xp) -> bool: is_pydata_sparse_namespace is_array_api_strict_namespace """ - return xp.__name__ in {'torch', _compat_module_name() + '.torch'} + return xp.__name__ in {"torch", _compat_module_name() + ".torch"} -def is_ndonnx_namespace(xp) -> bool: +def is_ndonnx_namespace(xp: Namespace) -> bool: """ Returns True if `xp` is an NDONNX namespace. @@ -347,10 +389,11 @@ def is_ndonnx_namespace(xp) -> bool: is_pydata_sparse_namespace is_array_api_strict_namespace """ - return xp.__name__ == 'ndonnx' + return xp.__name__ == "ndonnx" -def is_dask_namespace(xp) -> bool: +@lru_cache(100) +def is_dask_namespace(xp: Namespace) -> bool: """ Returns True if `xp` is a Dask namespace. @@ -368,10 +411,10 @@ def is_dask_namespace(xp) -> bool: is_pydata_sparse_namespace is_array_api_strict_namespace """ - return xp.__name__ in {'dask.array', _compat_module_name() + '.dask.array'} + return xp.__name__ in {"dask.array", _compat_module_name() + ".dask.array"} -def is_jax_namespace(xp) -> bool: +def is_jax_namespace(xp: Namespace) -> bool: """ Returns True if `xp` is a JAX namespace. @@ -390,10 +433,10 @@ def is_jax_namespace(xp) -> bool: is_pydata_sparse_namespace is_array_api_strict_namespace """ - return xp.__name__ in {'jax.numpy', 'jax.experimental.array_api'} + return xp.__name__ in {"jax.numpy", "jax.experimental.array_api"} -def is_pydata_sparse_namespace(xp) -> bool: +def is_pydata_sparse_namespace(xp: Namespace) -> bool: """ Returns True if `xp` is a pydata/sparse namespace. @@ -409,10 +452,10 @@ def is_pydata_sparse_namespace(xp) -> bool: is_jax_namespace is_array_api_strict_namespace """ - return xp.__name__ == 'sparse' + return xp.__name__ == "sparse" -def is_array_api_strict_namespace(xp) -> bool: +def is_array_api_strict_namespace(xp: Namespace) -> bool: """ Returns True if `xp` is an array-api-strict namespace. @@ -428,18 +471,25 @@ def is_array_api_strict_namespace(xp) -> bool: is_jax_namespace is_pydata_sparse_namespace """ - return xp.__name__ == 'array_api_strict' + return xp.__name__ == "array_api_strict" -def _check_api_version(api_version: str) -> None: - if api_version in ['2021.12', '2022.12', '2023.12']: - warnings.warn(f"The {api_version} version of the array API specification was requested but the returned namespace is actually version 2024.12") - elif api_version is not None and api_version not in ['2021.12', '2022.12', - '2023.12', '2024.12']: - raise ValueError("Only the 2024.12 version of the array API specification is currently supported") +def _check_api_version(api_version: str | None) -> None: + if api_version in _API_VERSIONS_OLD: + warnings.warn( + f"The {api_version} version of the array API specification was requested but the returned namespace is actually version 2024.12" + ) + elif api_version is not None and api_version not in _API_VERSIONS: + raise ValueError( + "Only the 2024.12 version of the array API specification is currently supported" + ) -def array_namespace(*xs, api_version=None, use_compat=None) -> Namespace: +def array_namespace( + *xs: Array | complex | None, + api_version: str | None = None, + use_compat: bool | None = None, +) -> Namespace: """ Get the array API compatible namespace for the arrays `xs`. @@ -508,11 +558,13 @@ def your_function(x, y): _use_compat = use_compat in [None, True] - namespaces = set() + namespaces: set[Namespace] = set() for x in xs: if is_numpy_array(x): - from .. import numpy as numpy_namespace import numpy as np + + from .. import numpy as numpy_namespace + if use_compat is True: _check_api_version(api_version) namespaces.add(numpy_namespace) @@ -526,25 +578,31 @@ def your_function(x, y): if _use_compat: _check_api_version(api_version) from .. import cupy as cupy_namespace + namespaces.add(cupy_namespace) else: - import cupy as cp + import cupy as cp # pyright: ignore[reportMissingTypeStubs] + namespaces.add(cp) elif is_torch_array(x): if _use_compat: _check_api_version(api_version) from .. import torch as torch_namespace + namespaces.add(torch_namespace) else: import torch + namespaces.add(torch) elif is_dask_array(x): if _use_compat: _check_api_version(api_version) from ..dask import array as dask_namespace + namespaces.add(dask_namespace) else: import dask.array as da + namespaces.add(da) elif is_jax_array(x): if use_compat is True: @@ -556,23 +614,27 @@ def your_function(x, y): # JAX v0.4.32 and newer implements the array API directly in jax.numpy. # For older JAX versions, it is available via jax.experimental.array_api. import jax.numpy + if hasattr(jax.numpy, "__array_api_version__"): jnp = jax.numpy else: - import jax.experimental.array_api as jnp + import jax.experimental.array_api as jnp # pyright: ignore[reportMissingImports] namespaces.add(jnp) elif is_pydata_sparse_array(x): if use_compat is True: _check_api_version(api_version) raise ValueError("`sparse` does not have an array-api-compat wrapper") else: - import sparse + import sparse # pyright: ignore[reportMissingTypeStubs] # `sparse` is already an array namespace. We do not have a wrapper # submodule for it. namespaces.add(sparse) - elif hasattr(x, '__array_namespace__'): + elif hasattr(x, "__array_namespace__"): if use_compat is True: - raise ValueError("The given array does not have an array-api-compat wrapper") + raise ValueError( + "The given array does not have an array-api-compat wrapper" + ) + x = cast("SupportsArrayNamespace[Any]", x) namespaces.add(x.__array_namespace__(api_version=api_version)) elif isinstance(x, (bool, int, float, complex, type(None))): continue @@ -586,34 +648,55 @@ def your_function(x, y): if len(namespaces) != 1: raise TypeError(f"Multiple namespaces for array inputs: {namespaces}") - xp, = namespaces + (xp,) = namespaces return xp + # backwards compatibility alias get_namespace = array_namespace -def _check_device(xp, device): - if xp == sys.modules.get('numpy'): - if device not in ["cpu", None]: + +def _check_device(bare_xp: Namespace, device: Device) -> None: # pyright: ignore[reportUnusedFunction] + """ + Validate dummy device on device-less array backends. + + Notes + ----- + This function is also invoked by CuPy, which does have multiple devices + if there are multiple GPUs available. + However, CuPy multi-device support is currently impossible + without using the global device or a context manager: + + https://github.com/data-apis/array-api-compat/pull/293 + """ + if bare_xp is sys.modules.get("numpy"): + if device not in ("cpu", None): raise ValueError(f"Unsupported device for NumPy: {device!r}") + elif bare_xp is sys.modules.get("dask.array"): + if device not in ("cpu", _DASK_DEVICE, None): + raise ValueError(f"Unsupported device for Dask: {device!r}") + + # Placeholder object to represent the dask device # when the array backend is not the CPU. # (since it is not easy to tell which device a dask array is on) class _dask_device: - def __repr__(self): + def __repr__(self) -> Literal["DASK_DEVICE"]: return "DASK_DEVICE" + _DASK_DEVICE = _dask_device() + # device() is not on numpy.ndarray or dask.array and to_device() is not on numpy.ndarray # or cupy.ndarray. They are not included in array objects of this library # because this library just reuses the respective ndarray classes without # wrapping or subclassing them. These helper functions can be used instead of # the wrapper functions for libraries that need to support both NumPy/CuPy and # other libraries that use devices. -def device(x: Array, /) -> Device: +def device(x: _ArrayApiObj, /) -> Device: """ Hardware device the array data resides on. @@ -649,7 +732,7 @@ def device(x: Array, /) -> Device: return "cpu" elif is_dask_array(x): # Peek at the metadata of the Dask array to determine type - if is_numpy_array(x._meta): + if is_numpy_array(x._meta): # pyright: ignore # Must be on CPU since backed by numpy return "cpu" return _DASK_DEVICE @@ -659,7 +742,7 @@ def device(x: Array, /) -> Device: # Return None in this case. Note that this workaround breaks # the standard and will result in new arrays being created on the # default device instead of the same device as the input array(s). - x_device = getattr(x, 'device', None) + x_device = getattr(x, "device", None) # Older JAX releases had .device() as a method, which has been replaced # with a property in accordance with the standard. if inspect.ismethod(x_device): @@ -668,66 +751,66 @@ def device(x: Array, /) -> Device: return x_device elif is_pydata_sparse_array(x): # `sparse` will gain `.device`, so check for this first. - x_device = getattr(x, 'device', None) + x_device = getattr(x, "device", None) if x_device is not None: return x_device # Everything but DOK has this attr. try: - inner = x.data + inner = x.data # pyright: ignore except AttributeError: return "cpu" # Return the device of the constituent array - return device(inner) - return x.device + return device(inner) # pyright: ignore + return x.device # pyright: ignore + # Prevent shadowing, used below _device = device + # Based on cupy.array_api.Array.to_device -def _cupy_to_device(x, device, /, stream=None): +def _cupy_to_device( + x: _CupyArray, + device: Device, + /, + stream: int | Any | None = None, +) -> _CupyArray: import cupy as cp - from cupy.cuda import Device as _Device - from cupy.cuda import stream as stream_module - from cupy_backends.cuda.api import runtime - if device == x.device: - return x - elif device == "cpu": + if device == "cpu": # allowing us to use `to_device(x, "cpu")` # is useful for portable test swapping between # host and device backends return x.get() - elif not isinstance(device, _Device): - raise ValueError(f"Unsupported device {device!r}") - else: - # see cupy/cupy#5985 for the reason how we handle device/stream here - prev_device = runtime.getDevice() - prev_stream: stream_module.Stream = None - if stream is not None: - prev_stream = stream_module.get_current_stream() - # stream can be an int as specified in __dlpack__, or a CuPy stream - if isinstance(stream, int): - stream = cp.cuda.ExternalStream(stream) - elif isinstance(stream, cp.cuda.Stream): - pass - else: - raise ValueError('the input stream is not recognized') - stream.use() - try: - runtime.setDevice(device.id) - arr = x.copy() - finally: - runtime.setDevice(prev_device) - if stream is not None: - prev_stream.use() - return arr - -def _torch_to_device(x, device, /, stream=None): + if not isinstance(device, cp.cuda.Device): + raise TypeError(f"Unsupported device type {device!r}") + + if stream is None: + with device: + return cp.asarray(x) + + # stream can be an int as specified in __dlpack__, or a CuPy stream + if isinstance(stream, int): + stream = cp.cuda.ExternalStream(stream) + elif not isinstance(stream, cp.cuda.Stream): + raise TypeError(f"Unsupported stream type {stream!r}") + + with device, stream: + return cp.asarray(x) + + +def _torch_to_device( + x: torch.Tensor, + device: torch.device | str | int, + /, + stream: None = None, +) -> torch.Tensor: if stream is not None: raise NotImplementedError return x.to(device) -def to_device(x: Array, device: Device, /, *, stream: Optional[Union[int, Any]] = None) -> Array: + +def to_device(x: Array, device: Device, /, *, stream: int | Any | None = None) -> Array: """ Copy the array from the device on which it currently resides to the specified ``device``. @@ -747,7 +830,7 @@ def to_device(x: Array, device: Device, /, *, stream: Optional[Union[int, Any]] a ``device`` object (see the `Device Support `__ section of the array API specification). - stream: Optional[Union[int, Any]] + stream: int | Any | None stream object to use during copy. In addition to the types supported in ``array.__dlpack__``, implementations may choose to support any library-specific stream object with the caveat that any code using @@ -779,25 +862,26 @@ def to_device(x: Array, device: Device, /, *, stream: Optional[Union[int, Any]] if is_numpy_array(x): if stream is not None: raise ValueError("The stream argument to to_device() is not supported") - if device == 'cpu': + if device == "cpu": return x raise ValueError(f"Unsupported device {device!r}") elif is_cupy_array(x): # cupy does not yet have to_device return _cupy_to_device(x, device, stream=stream) elif is_torch_array(x): - return _torch_to_device(x, device, stream=stream) + return _torch_to_device(x, device, stream=stream) # pyright: ignore[reportArgumentType] elif is_dask_array(x): if stream is not None: raise ValueError("The stream argument to to_device() is not supported") # TODO: What if our array is on the GPU already? - if device == 'cpu': + if device == "cpu": return x raise ValueError(f"Unsupported device {device!r}") elif is_jax_array(x): if not hasattr(x, "__array_namespace__"): # In JAX v0.4.31 and older, this import adds to_device method to x... - import jax.experimental.array_api # noqa: F401 + import jax.experimental.array_api # noqa: F401 # pyright: ignore + # ... but only on eager JAX. It won't work inside jax.jit. if not hasattr(x, "to_device"): return x @@ -806,10 +890,16 @@ def to_device(x: Array, device: Device, /, *, stream: Optional[Union[int, Any]] # Perform trivial check to return the same array if # device is same instead of err-ing. return x - return x.to_device(device, stream=stream) + return x.to_device(device, stream=stream) # pyright: ignore -def size(x: Array) -> int | None: +@overload +def size(x: HasShape[Collection[SupportsIndex]]) -> int: ... +@overload +def size(x: HasShape[Collection[None]]) -> None: ... +@overload +def size(x: HasShape[Collection[SupportsIndex | None]]) -> int | None: ... +def size(x: HasShape[Collection[SupportsIndex | None]]) -> int | None: """ Return the total number of elements of x. @@ -824,11 +914,24 @@ def size(x: Array) -> int | None: # Lazy API compliant arrays, such as ndonnx, can contain None in their shape if None in x.shape: return None - out = math.prod(x.shape) + out = math.prod(cast("Collection[SupportsIndex]", x.shape)) # dask.array.Array.shape can contain NaN return None if math.isnan(out) else out +@lru_cache(100) +def _is_writeable_cls(cls: type) -> bool | None: + if ( + _issubclass_fast(cls, "numpy", "generic") + or _issubclass_fast(cls, "jax", "Array") + or _issubclass_fast(cls, "sparse", "SparseArray") + ): + return False + if _is_array_api_cls(cls): + return True + return None + + def is_writeable_array(x: object) -> bool: """ Return False if ``x.__setitem__`` is expected to raise; True otherwise. @@ -839,11 +942,32 @@ def is_writeable_array(x: object) -> bool: As there is no standard way to check if an array is writeable without actually writing to it, this function blindly returns True for all unknown array types. """ - if is_numpy_array(x): - return x.flags.writeable - if is_jax_array(x) or is_pydata_sparse_array(x): + cls = cast(Hashable, type(x)) + if _issubclass_fast(cls, "numpy", "ndarray"): + return cast("npt.NDArray", x).flags.writeable + res = _is_writeable_cls(cls) + if res is not None: + return res + return hasattr(x, '__array_namespace__') + + +@lru_cache(100) +def _is_lazy_cls(cls: type) -> bool | None: + if ( + _issubclass_fast(cls, "numpy", "ndarray") + or _issubclass_fast(cls, "numpy", "generic") + or _issubclass_fast(cls, "cupy", "ndarray") + or _issubclass_fast(cls, "torch", "Tensor") + or _issubclass_fast(cls, "sparse", "SparseArray") + ): return False - return is_array_api_obj(x) + if ( + _issubclass_fast(cls, "jax", "Array") + or _issubclass_fast(cls, "dask.array", "Array") + or _issubclass_fast(cls, "ndonnx", "Array") + ): + return True + return None def is_lazy_array(x: object) -> bool: @@ -859,14 +983,6 @@ def is_lazy_array(x: object) -> bool: This function errs on the side of caution for array types that may or may not be lazy, e.g. JAX arrays, by always returning True for them. """ - if ( - is_numpy_array(x) - or is_cupy_array(x) - or is_torch_array(x) - or is_pydata_sparse_array(x) - ): - return False - # **JAX note:** while it is possible to determine if you're inside or outside # jax.jit by testing the subclass of a jax.Array object, as well as testing bool() # as we do below for unknown arrays, this is not recommended by JAX best practices. @@ -876,10 +992,14 @@ def is_lazy_array(x: object) -> bool: # compatibility, is highly detrimental to performance as the whole graph will end # up being computed multiple times. - if is_jax_array(x) or is_dask_array(x) or is_ndonnx_array(x): - return True + # Note: skipping reclassification of JAX zero gradient arrays, as one will + # exclusively get them once they leave a jax.grad JIT context. + cls = cast(Hashable, type(x)) + res = _is_lazy_cls(cls) + if res is not None: + return res - if not is_array_api_obj(x): + if not hasattr(x, "__array_namespace__"): return False # Unknown Array API compatible object. Note that this test may have dire consequences @@ -887,7 +1007,7 @@ def is_lazy_array(x: object) -> bool: # on __bool__ (dask is one such example, which however is special-cased above). # Select a single point of the array - s = size(x) + s = size(cast("HasShape[Collection[SupportsIndex | None]]", x)) if s is None: return True xp = array_namespace(x) @@ -899,7 +1019,7 @@ def is_lazy_array(x: object) -> bool: try: bool(x) return False - # The Array API standard dictates that __bool__ should raise TypeError if the + # The Array API standard dictactes that __bool__ should raise TypeError if the # output cannot be defined. # Here we allow for it to raise arbitrary exceptions, e.g. like Dask does. except Exception: @@ -932,4 +1052,7 @@ def is_lazy_array(x: object) -> bool: "to_device", ] -_all_ignore = ['sys', 'math', 'inspect', 'warnings'] +_all_ignore = ['lru_cache', 'sys', 'math', 'inspect', 'warnings'] + +def __dir__() -> list[str]: + return __all__ diff --git a/sklearn/externals/array_api_compat/common/_linalg.py b/sklearn/externals/array_api_compat/common/_linalg.py index bfa1f1b937fdd..7ad87a1be9105 100644 --- a/sklearn/externals/array_api_compat/common/_linalg.py +++ b/sklearn/externals/array_api_compat/common/_linalg.py @@ -1,85 +1,114 @@ from __future__ import annotations -from typing import TYPE_CHECKING, NamedTuple -if TYPE_CHECKING: - from typing import Literal, Optional, Tuple, Union - from ._typing import ndarray - import math +from typing import Literal, NamedTuple, cast import numpy as np + if np.__version__[0] == "2": from numpy.lib.array_utils import normalize_axis_tuple else: from numpy.core.numeric import normalize_axis_tuple -from ._aliases import matmul, matrix_transpose, tensordot, vecdot, isdtype from .._internal import get_xp +from ._aliases import isdtype, matmul, matrix_transpose, tensordot, vecdot +from ._typing import Array, DType, JustFloat, JustInt, Namespace + # These are in the main NumPy namespace but not in numpy.linalg -def cross(x1: ndarray, x2: ndarray, /, xp, *, axis: int = -1, **kwargs) -> ndarray: +def cross( + x1: Array, + x2: Array, + /, + xp: Namespace, + *, + axis: int = -1, + **kwargs: object, +) -> Array: return xp.cross(x1, x2, axis=axis, **kwargs) -def outer(x1: ndarray, x2: ndarray, /, xp, **kwargs) -> ndarray: +def outer(x1: Array, x2: Array, /, xp: Namespace, **kwargs: object) -> Array: return xp.outer(x1, x2, **kwargs) class EighResult(NamedTuple): - eigenvalues: ndarray - eigenvectors: ndarray + eigenvalues: Array + eigenvectors: Array class QRResult(NamedTuple): - Q: ndarray - R: ndarray + Q: Array + R: Array class SlogdetResult(NamedTuple): - sign: ndarray - logabsdet: ndarray + sign: Array + logabsdet: Array class SVDResult(NamedTuple): - U: ndarray - S: ndarray - Vh: ndarray + U: Array + S: Array + Vh: Array # These functions are the same as their NumPy counterparts except they return # a namedtuple. -def eigh(x: ndarray, /, xp, **kwargs) -> EighResult: +def eigh(x: Array, /, xp: Namespace, **kwargs: object) -> EighResult: return EighResult(*xp.linalg.eigh(x, **kwargs)) -def qr(x: ndarray, /, xp, *, mode: Literal['reduced', 'complete'] = 'reduced', - **kwargs) -> QRResult: +def qr( + x: Array, + /, + xp: Namespace, + *, + mode: Literal["reduced", "complete"] = "reduced", + **kwargs: object, +) -> QRResult: return QRResult(*xp.linalg.qr(x, mode=mode, **kwargs)) -def slogdet(x: ndarray, /, xp, **kwargs) -> SlogdetResult: +def slogdet(x: Array, /, xp: Namespace, **kwargs: object) -> SlogdetResult: return SlogdetResult(*xp.linalg.slogdet(x, **kwargs)) -def svd(x: ndarray, /, xp, *, full_matrices: bool = True, **kwargs) -> SVDResult: +def svd( + x: Array, + /, + xp: Namespace, + *, + full_matrices: bool = True, + **kwargs: object, +) -> SVDResult: return SVDResult(*xp.linalg.svd(x, full_matrices=full_matrices, **kwargs)) # These functions have additional keyword arguments # The upper keyword argument is new from NumPy -def cholesky(x: ndarray, /, xp, *, upper: bool = False, **kwargs) -> ndarray: +def cholesky( + x: Array, + /, + xp: Namespace, + *, + upper: bool = False, + **kwargs: object, +) -> Array: L = xp.linalg.cholesky(x, **kwargs) if upper: U = get_xp(xp)(matrix_transpose)(L) if get_xp(xp)(isdtype)(U.dtype, 'complex floating'): - U = xp.conj(U) + U = xp.conj(U) # pyright: ignore[reportConstantRedefinition] return U return L # The rtol keyword argument of matrix_rank() and pinv() is new from NumPy. # Note that it has a different semantic meaning from tol and rcond. -def matrix_rank(x: ndarray, - /, - xp, - *, - rtol: Optional[Union[float, ndarray]] = None, - **kwargs) -> ndarray: +def matrix_rank( + x: Array, + /, + xp: Namespace, + *, + rtol: float | Array | None = None, + **kwargs: object, +) -> Array: # this is different from xp.linalg.matrix_rank, which supports 1 # dimensional arrays. if x.ndim < 2: raise xp.linalg.LinAlgError("1-dimensional array given. Array must be at least two-dimensional") - S = get_xp(xp)(svdvals)(x, **kwargs) + S: Array = get_xp(xp)(svdvals)(x, **kwargs) if rtol is None: tol = S.max(axis=-1, keepdims=True) * max(x.shape[-2:]) * xp.finfo(S.dtype).eps else: @@ -88,7 +117,14 @@ def matrix_rank(x: ndarray, tol = S.max(axis=-1, keepdims=True)*xp.asarray(rtol)[..., xp.newaxis] return xp.count_nonzero(S > tol, axis=-1) -def pinv(x: ndarray, /, xp, *, rtol: Optional[Union[float, ndarray]] = None, **kwargs) -> ndarray: +def pinv( + x: Array, + /, + xp: Namespace, + *, + rtol: float | Array | None = None, + **kwargs: object, +) -> Array: # this is different from xp.linalg.pinv, which does not multiply the # default tolerance by max(M, N). if rtol is None: @@ -97,15 +133,30 @@ def pinv(x: ndarray, /, xp, *, rtol: Optional[Union[float, ndarray]] = None, **k # These functions are new in the array API spec -def matrix_norm(x: ndarray, /, xp, *, keepdims: bool = False, ord: Optional[Union[int, float, Literal['fro', 'nuc']]] = 'fro') -> ndarray: +def matrix_norm( + x: Array, + /, + xp: Namespace, + *, + keepdims: bool = False, + ord: Literal[1, 2, -1, -2] | JustFloat | Literal["fro", "nuc"] | None = "fro", +) -> Array: return xp.linalg.norm(x, axis=(-2, -1), keepdims=keepdims, ord=ord) # svdvals is not in NumPy (but it is in SciPy). It is equivalent to # xp.linalg.svd(compute_uv=False). -def svdvals(x: ndarray, /, xp) -> Union[ndarray, Tuple[ndarray, ...]]: +def svdvals(x: Array, /, xp: Namespace) -> Array | tuple[Array, ...]: return xp.linalg.svd(x, compute_uv=False) -def vector_norm(x: ndarray, /, xp, *, axis: Optional[Union[int, Tuple[int, ...]]] = None, keepdims: bool = False, ord: Optional[Union[int, float]] = 2) -> ndarray: +def vector_norm( + x: Array, + /, + xp: Namespace, + *, + axis: int | tuple[int, ...] | None = None, + keepdims: bool = False, + ord: JustInt | JustFloat = 2, +) -> Array: # xp.linalg.norm tries to do a matrix norm whenever axis is a 2-tuple or # when axis=None and the input is 2-D, so to force a vector norm, we make # it so the input is 1-D (for axis=None), or reshape so that norm is done @@ -117,7 +168,10 @@ def vector_norm(x: ndarray, /, xp, *, axis: Optional[Union[int, Tuple[int, ...]] elif isinstance(axis, tuple): # Note: The axis argument supports any number of axes, whereas # xp.linalg.norm() only supports a single axis for vector norm. - normalized_axis = normalize_axis_tuple(axis, x.ndim) + normalized_axis = cast( + "tuple[int, ...]", + normalize_axis_tuple(axis, x.ndim), # pyright: ignore[reportCallIssue] + ) rest = tuple(i for i in range(x.ndim) if i not in normalized_axis) newshape = axis + rest _x = xp.transpose(x, newshape).reshape( @@ -133,7 +187,13 @@ def vector_norm(x: ndarray, /, xp, *, axis: Optional[Union[int, Tuple[int, ...]] # We can't reuse xp.linalg.norm(keepdims) because of the reshape hacks # above to avoid matrix norm logic. shape = list(x.shape) - _axis = normalize_axis_tuple(range(x.ndim) if axis is None else axis, x.ndim) + _axis = cast( + "tuple[int, ...]", + normalize_axis_tuple( # pyright: ignore[reportCallIssue] + range(x.ndim) if axis is None else axis, + x.ndim, + ), + ) for i in _axis: shape[i] = 1 res = xp.reshape(res, tuple(shape)) @@ -143,14 +203,30 @@ def vector_norm(x: ndarray, /, xp, *, axis: Optional[Union[int, Tuple[int, ...]] # xp.diagonal and xp.trace operate on the first two axes whereas these # operates on the last two -def diagonal(x: ndarray, /, xp, *, offset: int = 0, **kwargs) -> ndarray: +def diagonal(x: Array, /, xp: Namespace, *, offset: int = 0, **kwargs: object) -> Array: return xp.diagonal(x, offset=offset, axis1=-2, axis2=-1, **kwargs) -def trace(x: ndarray, /, xp, *, offset: int = 0, dtype=None, **kwargs) -> ndarray: - return xp.asarray(xp.trace(x, offset=offset, dtype=dtype, axis1=-2, axis2=-1, **kwargs)) +def trace( + x: Array, + /, + xp: Namespace, + *, + offset: int = 0, + dtype: DType | None = None, + **kwargs: object, +) -> Array: + return xp.asarray( + xp.trace(x, offset=offset, dtype=dtype, axis1=-2, axis2=-1, **kwargs) + ) __all__ = ['cross', 'matmul', 'outer', 'tensordot', 'EighResult', 'QRResult', 'SlogdetResult', 'SVDResult', 'eigh', 'qr', 'slogdet', 'svd', 'cholesky', 'matrix_rank', 'pinv', 'matrix_norm', 'matrix_transpose', 'svdvals', 'vecdot', 'vector_norm', 'diagonal', 'trace'] + +_all_ignore = ['math', 'normalize_axis_tuple', 'get_xp', 'np', 'isdtype'] + + +def __dir__() -> list[str]: + return __all__ diff --git a/sklearn/externals/array_api_compat/common/_typing.py b/sklearn/externals/array_api_compat/common/_typing.py index d8acdef7060d9..cd26feeba4dff 100644 --- a/sklearn/externals/array_api_compat/common/_typing.py +++ b/sklearn/externals/array_api_compat/common/_typing.py @@ -1,26 +1,192 @@ from __future__ import annotations -__all__ = [ - "NestedSequence", - "SupportsBufferProtocol", -] - -from types import ModuleType +from collections.abc import Mapping +from types import ModuleType as Namespace from typing import ( - Any, - TypeVar, + TYPE_CHECKING, + Literal, Protocol, + TypeAlias, + TypedDict, + TypeVar, + final, ) +if TYPE_CHECKING: + from _typeshed import Incomplete + + SupportsBufferProtocol: TypeAlias = Incomplete + Array: TypeAlias = Incomplete + Device: TypeAlias = Incomplete + DType: TypeAlias = Incomplete +else: + SupportsBufferProtocol = object + Array = object + Device = object + DType = object + + _T_co = TypeVar("_T_co", covariant=True) + +# These "Just" types are equivalent to the `Just` type from the `optype` library, +# apart from them not being `@runtime_checkable`. +# - docs: https://github.com/jorenham/optype/blob/master/README.md#just +# - code: https://github.com/jorenham/optype/blob/master/optype/_core/_just.py +@final +class JustInt(Protocol): + @property + def __class__(self, /) -> type[int]: ... + @__class__.setter + def __class__(self, value: type[int], /) -> None: ... # pyright: ignore[reportIncompatibleMethodOverride] + + +@final +class JustFloat(Protocol): + @property + def __class__(self, /) -> type[float]: ... + @__class__.setter + def __class__(self, value: type[float], /) -> None: ... # pyright: ignore[reportIncompatibleMethodOverride] + + +@final +class JustComplex(Protocol): + @property + def __class__(self, /) -> type[complex]: ... + @__class__.setter + def __class__(self, value: type[complex], /) -> None: ... # pyright: ignore[reportIncompatibleMethodOverride] + + +# + + class NestedSequence(Protocol[_T_co]): def __getitem__(self, key: int, /) -> _T_co | NestedSequence[_T_co]: ... def __len__(self, /) -> int: ... -SupportsBufferProtocol = Any -Array = Any -Device = Any -DType = Any -Namespace = ModuleType +class SupportsArrayNamespace(Protocol[_T_co]): + def __array_namespace__(self, /, *, api_version: str | None) -> _T_co: ... + + +class HasShape(Protocol[_T_co]): + @property + def shape(self, /) -> _T_co: ... + + +# Return type of `__array_namespace_info__.default_dtypes` +Capabilities = TypedDict( + "Capabilities", + { + "boolean indexing": bool, + "data-dependent shapes": bool, + "max dimensions": int, + }, +) + +# Return type of `__array_namespace_info__.default_dtypes` +DefaultDTypes = TypedDict( + "DefaultDTypes", + { + "real floating": DType, + "complex floating": DType, + "integral": DType, + "indexing": DType, + }, +) + + +_DTypeKind: TypeAlias = Literal[ + "bool", + "signed integer", + "unsigned integer", + "integral", + "real floating", + "complex floating", + "numeric", +] +# Type of the `kind` parameter in `__array_namespace_info__.dtypes` +DTypeKind: TypeAlias = _DTypeKind | tuple[_DTypeKind, ...] + + +# `__array_namespace_info__.dtypes(kind="bool")` +class DTypesBool(TypedDict): + bool: DType + + +# `__array_namespace_info__.dtypes(kind="signed integer")` +class DTypesSigned(TypedDict): + int8: DType + int16: DType + int32: DType + int64: DType + + +# `__array_namespace_info__.dtypes(kind="unsigned integer")` +class DTypesUnsigned(TypedDict): + uint8: DType + uint16: DType + uint32: DType + uint64: DType + + +# `__array_namespace_info__.dtypes(kind="integral")` +class DTypesIntegral(DTypesSigned, DTypesUnsigned): + pass + + +# `__array_namespace_info__.dtypes(kind="real floating")` +class DTypesReal(TypedDict): + float32: DType + float64: DType + + +# `__array_namespace_info__.dtypes(kind="complex floating")` +class DTypesComplex(TypedDict): + complex64: DType + complex128: DType + + +# `__array_namespace_info__.dtypes(kind="numeric")` +class DTypesNumeric(DTypesIntegral, DTypesReal, DTypesComplex): + pass + + +# `__array_namespace_info__.dtypes(kind=None)` (default) +class DTypesAll(DTypesBool, DTypesNumeric): + pass + + +# `__array_namespace_info__.dtypes(kind=?)` (fallback) +DTypesAny: TypeAlias = Mapping[str, DType] + + +__all__ = [ + "Array", + "Capabilities", + "DType", + "DTypeKind", + "DTypesAny", + "DTypesAll", + "DTypesBool", + "DTypesNumeric", + "DTypesIntegral", + "DTypesSigned", + "DTypesUnsigned", + "DTypesReal", + "DTypesComplex", + "DefaultDTypes", + "Device", + "HasShape", + "Namespace", + "JustInt", + "JustFloat", + "JustComplex", + "NestedSequence", + "SupportsArrayNamespace", + "SupportsBufferProtocol", +] + + +def __dir__() -> list[str]: + return __all__ diff --git a/sklearn/externals/array_api_compat/cupy/__init__.py b/sklearn/externals/array_api_compat/cupy/__init__.py index 59e010582c6ed..9a30f95ddf12c 100644 --- a/sklearn/externals/array_api_compat/cupy/__init__.py +++ b/sklearn/externals/array_api_compat/cupy/__init__.py @@ -8,9 +8,6 @@ # See the comment in the numpy __init__.py __import__(__package__ + '.linalg') - __import__(__package__ + '.fft') -from ..common._helpers import * # noqa: F401,F403 - __array_api_version__ = '2024.12' diff --git a/sklearn/externals/array_api_compat/cupy/_aliases.py b/sklearn/externals/array_api_compat/cupy/_aliases.py index 30d9fe48cb451..90b48f059bafa 100644 --- a/sklearn/externals/array_api_compat/cupy/_aliases.py +++ b/sklearn/externals/array_api_compat/cupy/_aliases.py @@ -1,16 +1,14 @@ from __future__ import annotations +from typing import Optional + import cupy as cp from ..common import _aliases, _helpers +from ..common._typing import NestedSequence, SupportsBufferProtocol from .._internal import get_xp - from ._info import __array_namespace_info__ - -from typing import TYPE_CHECKING -if TYPE_CHECKING: - from typing import Optional, Union - from ._typing import ndarray, Device, Dtype, NestedSequence, SupportsBufferProtocol +from ._typing import Array, Device, DType bool = cp.bool_ @@ -63,26 +61,25 @@ matrix_transpose = get_xp(cp)(_aliases.matrix_transpose) tensordot = get_xp(cp)(_aliases.tensordot) sign = get_xp(cp)(_aliases.sign) +finfo = get_xp(cp)(_aliases.finfo) +iinfo = get_xp(cp)(_aliases.iinfo) -_copy_default = object() # asarray also adds the copy keyword, which is not present in numpy 1.0. def asarray( - obj: Union[ - ndarray, - bool, - int, - float, - NestedSequence[bool | int | float], - SupportsBufferProtocol, - ], + obj: ( + Array + | bool | int | float | complex + | NestedSequence[bool | int | float | complex] + | SupportsBufferProtocol + ), /, *, - dtype: Optional[Dtype] = None, + dtype: Optional[DType] = None, device: Optional[Device] = None, - copy: Optional[bool] = _copy_default, + copy: Optional[bool] = None, **kwargs, -) -> ndarray: +) -> Array: """ Array API compatibility wrapper for asarray(). @@ -90,35 +87,23 @@ def asarray( specification for more details. """ with cp.cuda.Device(device): - # cupy is like NumPy 1.26 (except without _CopyMode). See the comments - # in asarray in numpy/_aliases.py. - if copy is not _copy_default: - # A future version of CuPy will change the meaning of copy=False - # to mean no-copy. We don't know for certain what version it will - # be yet, so to avoid breaking that version, we use a different - # default value for copy so asarray(obj) with no copy kwarg will - # always do the copy-if-needed behavior. - - # This will still need to be updated to remove the - # NotImplementedError for copy=False, but at least this won't - # break the default or existing behavior. - if copy is None: - copy = False - elif copy is False: - raise NotImplementedError("asarray(copy=False) is not yet supported in cupy") - kwargs['copy'] = copy - - return cp.array(obj, dtype=dtype, **kwargs) + if copy is None: + return cp.asarray(obj, dtype=dtype, **kwargs) + else: + res = cp.array(obj, dtype=dtype, copy=copy, **kwargs) + if not copy and res is not obj: + raise ValueError("Unable to avoid copy while creating an array as requested") + return res def astype( - x: ndarray, - dtype: Dtype, + x: Array, + dtype: DType, /, *, copy: bool = True, device: Optional[Device] = None, -) -> ndarray: +) -> Array: if device is None: return x.astype(dtype=dtype, copy=copy) out = _helpers.to_device(x.astype(dtype=dtype, copy=False), device) @@ -127,10 +112,10 @@ def astype( # cupy.count_nonzero does not have keepdims def count_nonzero( - x: ndarray, + x: Array, axis=None, keepdims=False -) -> ndarray: +) -> Array: result = cp.count_nonzero(x, axis) if keepdims: if axis is None: @@ -139,6 +124,11 @@ def count_nonzero( return result +# take_along_axis: axis defaults to -1 but in cupy (and numpy) axis is a required arg +def take_along_axis(x: Array, indices: Array, /, *, axis: int = -1): + return cp.take_along_axis(x, indices, axis=axis) + + # These functions are completely new here. If the library already has them # (i.e., numpy 2.0), use the library version instead of our wrapper. if hasattr(cp, 'vecdot'): @@ -160,6 +150,7 @@ def count_nonzero( 'acos', 'acosh', 'asin', 'asinh', 'atan', 'atan2', 'atanh', 'bitwise_left_shift', 'bitwise_invert', 'bitwise_right_shift', - 'bool', 'concat', 'count_nonzero', 'pow', 'sign'] + 'bool', 'concat', 'count_nonzero', 'pow', 'sign', + 'take_along_axis'] _all_ignore = ['cp', 'get_xp'] diff --git a/sklearn/externals/array_api_compat/cupy/_info.py b/sklearn/externals/array_api_compat/cupy/_info.py index 790621e4f7c36..78e48a3358cf5 100644 --- a/sklearn/externals/array_api_compat/cupy/_info.py +++ b/sklearn/externals/array_api_compat/cupy/_info.py @@ -26,6 +26,7 @@ complex128, ) + class __array_namespace_info__: """ Get the array API inspection namespace for CuPy. @@ -49,7 +50,7 @@ class __array_namespace_info__: Examples -------- - >>> info = np.__array_namespace_info__() + >>> info = xp.__array_namespace_info__() >>> info.default_dtypes() {'real floating': cupy.float64, 'complex floating': cupy.complex128, @@ -94,13 +95,13 @@ def capabilities(self): >>> info = xp.__array_namespace_info__() >>> info.capabilities() {'boolean indexing': True, - 'data-dependent shapes': True} + 'data-dependent shapes': True, + 'max dimensions': 64} """ return { "boolean indexing": True, "data-dependent shapes": True, - # 'max rank' will be part of the 2024.12 standard "max dimensions": 64, } @@ -117,7 +118,7 @@ def default_device(self): Returns ------- - device : str + device : Device The default device used for new CuPy arrays. Examples @@ -126,6 +127,15 @@ def default_device(self): >>> info.default_device() Device(0) + Notes + ----- + This method returns the static default device when CuPy is initialized. + However, the *current* device used by creation functions (``empty`` etc.) + can be changed globally or with a context manager. + + See Also + -------- + https://github.com/data-apis/array-api/issues/835 """ return cuda.Device(0) @@ -312,7 +322,7 @@ def devices(self): Returns ------- - devices : list of str + devices : list[Device] The devices supported by CuPy. See Also diff --git a/sklearn/externals/array_api_compat/cupy/_typing.py b/sklearn/externals/array_api_compat/cupy/_typing.py index f3d9aab67e52f..d8e49ca773dc5 100644 --- a/sklearn/externals/array_api_compat/cupy/_typing.py +++ b/sklearn/externals/array_api_compat/cupy/_typing.py @@ -1,46 +1,31 @@ from __future__ import annotations -__all__ = [ - "ndarray", - "Device", - "Dtype", -] +__all__ = ["Array", "DType", "Device"] +_all_ignore = ["cp"] -import sys -from typing import ( - Union, - TYPE_CHECKING, -) - -from cupy import ( - ndarray, - dtype, - int8, - int16, - int32, - int64, - uint8, - uint16, - uint32, - uint64, - float32, - float64, -) +from typing import TYPE_CHECKING +import cupy as cp +from cupy import ndarray as Array from cupy.cuda.device import Device -if TYPE_CHECKING or sys.version_info >= (3, 9): - Dtype = dtype[Union[ - int8, - int16, - int32, - int64, - uint8, - uint16, - uint32, - uint64, - float32, - float64, - ]] +if TYPE_CHECKING: + # NumPy 1.x on Python 3.10 fails to parse np.dtype[] + DType = cp.dtype[ + cp.intp + | cp.int8 + | cp.int16 + | cp.int32 + | cp.int64 + | cp.uint8 + | cp.uint16 + | cp.uint32 + | cp.uint64 + | cp.float32 + | cp.float64 + | cp.complex64 + | cp.complex128 + | cp.bool_ + ] else: - Dtype = dtype + DType = cp.dtype diff --git a/sklearn/externals/array_api_compat/dask/array/__init__.py b/sklearn/externals/array_api_compat/dask/array/__init__.py index a6e69ad382e4b..1e47b9606b774 100644 --- a/sklearn/externals/array_api_compat/dask/array/__init__.py +++ b/sklearn/externals/array_api_compat/dask/array/__init__.py @@ -1,9 +1,12 @@ -from dask.array import * # noqa: F403 +from typing import Final + +from dask.array import * # noqa: F403 # These imports may overwrite names from the import * above. -from ._aliases import * # noqa: F403 +from ._aliases import * # noqa: F403 -__array_api_version__ = '2024.12' +__array_api_version__: Final = "2024.12" +# See the comment in the numpy __init__.py __import__(__package__ + '.linalg') __import__(__package__ + '.fft') diff --git a/sklearn/externals/array_api_compat/dask/array/_aliases.py b/sklearn/externals/array_api_compat/dask/array/_aliases.py index 80d66281912ca..d43881ab18f1c 100644 --- a/sklearn/externals/array_api_compat/dask/array/_aliases.py +++ b/sklearn/externals/array_api_compat/dask/array/_aliases.py @@ -1,49 +1,47 @@ -from __future__ import annotations - -from typing import Callable +# pyright: reportPrivateUsage=false +# pyright: reportUnknownArgumentType=false +# pyright: reportUnknownMemberType=false +# pyright: reportUnknownVariableType=false -from ...common import _aliases, array_namespace +from __future__ import annotations -from ..._internal import get_xp +from builtins import bool as py_bool +from collections.abc import Callable +from typing import TYPE_CHECKING, Any -from ._info import __array_namespace_info__ +if TYPE_CHECKING: + from typing_extensions import TypeIs +import dask.array as da import numpy as np +from numpy import bool_ as bool from numpy import ( - # Dtypes - iinfo, - finfo, - bool_ as bool, + can_cast, + complex64, + complex128, float32, float64, int8, int16, int32, int64, + result_type, uint8, uint16, uint32, uint64, - complex64, - complex128, - can_cast, - result_type, ) -from typing import TYPE_CHECKING - -if TYPE_CHECKING: - from typing import Optional, Union - - from ...common._typing import ( - Device, - Dtype, - Array, - NestedSequence, - SupportsBufferProtocol, - ) - -import dask.array as da +from ..._internal import get_xp +from ...common import _aliases, _helpers, array_namespace +from ...common._typing import ( + Array, + Device, + DType, + NestedSequence, + SupportsBufferProtocol, +) +from ._info import __array_namespace_info__ isdtype = get_xp(np)(_aliases.isdtype) unstack = get_xp(da)(_aliases.unstack) @@ -52,11 +50,11 @@ # da.astype doesn't respect copy=True def astype( x: Array, - dtype: Dtype, + dtype: DType, /, *, - copy: bool = True, - device: Optional[Device] = None, + copy: py_bool = True, + device: Device | None = None, ) -> Array: """ Array API compatibility wrapper for astype(). @@ -65,6 +63,7 @@ def astype( specification for more details. """ # TODO: respect device keyword? + _helpers._check_device(da, device) if not copy and dtype == x.dtype: return x @@ -79,14 +78,14 @@ def astype( # not pass stop/step as keyword arguments, which will cause # an error with dask def arange( - start: Union[int, float], + start: float, /, - stop: Optional[Union[int, float]] = None, - step: Union[int, float] = 1, + stop: float | None = None, + step: float = 1, *, - dtype: Optional[Dtype] = None, - device: Optional[Device] = None, - **kwargs, + dtype: DType | None = None, + device: Device | None = None, + **kwargs: object, ) -> Array: """ Array API compatibility wrapper for arange(). @@ -95,8 +94,9 @@ def arange( specification for more details. """ # TODO: respect device keyword? + _helpers._check_device(da, device) - args = [start] + args: list[Any] = [start] if stop is not None: args.append(stop) else: @@ -140,24 +140,19 @@ def arange( matmul = get_xp(np)(_aliases.matmul) tensordot = get_xp(np)(_aliases.tensordot) sign = get_xp(np)(_aliases.sign) +finfo = get_xp(np)(_aliases.finfo) +iinfo = get_xp(np)(_aliases.iinfo) # asarray also adds the copy keyword, which is not present in numpy 1.0. def asarray( - obj: Union[ - Array, - bool, - int, - float, - NestedSequence[bool | int | float], - SupportsBufferProtocol, - ], + obj: complex | NestedSequence[complex] | Array | SupportsBufferProtocol, /, *, - dtype: Optional[Dtype] = None, - device: Optional[Device] = None, - copy: Optional[Union[bool, np._CopyMode]] = None, - **kwargs, + dtype: DType | None = None, + device: Device | None = None, + copy: py_bool | None = None, + **kwargs: object, ) -> Array: """ Array API compatibility wrapper for asarray(). @@ -166,16 +161,17 @@ def asarray( specification for more details. """ # TODO: respect device keyword? + _helpers._check_device(da, device) if isinstance(obj, da.Array): if dtype is not None and dtype != obj.dtype: if copy is False: raise ValueError("Unable to avoid copy when changing dtype") obj = obj.astype(dtype) - return obj.copy() if copy else obj + return obj.copy() if copy else obj # pyright: ignore[reportAttributeAccessIssue] if copy is False: - raise NotImplementedError( + raise ValueError( "Unable to avoid copy when converting a non-dask object to dask" ) @@ -185,22 +181,21 @@ def asarray( return da.from_array(obj) -from dask.array import ( - # Element wise aliases - arccos as acos, - arccosh as acosh, - arcsin as asin, - arcsinh as asinh, - arctan as atan, - arctan2 as atan2, - arctanh as atanh, - left_shift as bitwise_left_shift, - right_shift as bitwise_right_shift, - invert as bitwise_invert, - power as pow, - # Other - concatenate as concat, -) +# Element wise aliases +from dask.array import arccos as acos +from dask.array import arccosh as acosh +from dask.array import arcsin as asin +from dask.array import arcsinh as asinh +from dask.array import arctan as atan +from dask.array import arctan2 as atan2 +from dask.array import arctanh as atanh + +# Other +from dask.array import concatenate as concat +from dask.array import invert as bitwise_invert +from dask.array import left_shift as bitwise_left_shift +from dask.array import power as pow +from dask.array import right_shift as bitwise_right_shift # dask.array.clip does not work unless all three arguments are provided. @@ -210,8 +205,8 @@ def asarray( def clip( x: Array, /, - min: Optional[Union[int, float, Array]] = None, - max: Optional[Union[int, float, Array]] = None, + min: float | Array | None = None, + max: float | Array | None = None, ) -> Array: """ Array API compatibility wrapper for clip(). @@ -220,8 +215,8 @@ def clip( specification for more details. """ - def _isscalar(a): - return isinstance(a, (int, float, type(None))) + def _isscalar(a: float | Array | None, /) -> TypeIs[float | None]: + return a is None or isinstance(a, (int, float)) min_shape = () if _isscalar(min) else min.shape max_shape = () if _isscalar(max) else max.shape @@ -274,7 +269,12 @@ def _ensure_single_chunk(x: Array, axis: int) -> tuple[Array, Callable[[Array], def sort( - x: Array, /, *, axis: int = -1, descending: bool = False, stable: bool = True + x: Array, + /, + *, + axis: int = -1, + descending: py_bool = False, + stable: py_bool = True, ) -> Array: """ Array API compatibility layer around the lack of sort() in Dask. @@ -304,7 +304,12 @@ def sort( def argsort( - x: Array, /, *, axis: int = -1, descending: bool = False, stable: bool = True + x: Array, + /, + *, + axis: int = -1, + descending: py_bool = False, + stable: py_bool = True, ) -> Array: """ Array API compatibility layer around the lack of argsort() in Dask. @@ -338,26 +343,34 @@ def argsort( # dask.array.count_nonzero does not have keepdims def count_nonzero( x: Array, - axis=None, - keepdims=False + axis: int | None = None, + keepdims: py_bool = False, ) -> Array: - result = da.count_nonzero(x, axis) - if keepdims: - if axis is None: - return da.reshape(result, [1]*x.ndim) - return da.expand_dims(result, axis) - return result - - - -__all__ = _aliases.__all__ + [ - '__array_namespace_info__', 'asarray', 'astype', 'acos', - 'acosh', 'asin', 'asinh', 'atan', 'atan2', - 'atanh', 'bitwise_left_shift', 'bitwise_invert', - 'bitwise_right_shift', 'concat', 'pow', 'iinfo', 'finfo', 'can_cast', - 'result_type', 'bool', 'float32', 'float64', 'int8', 'int16', 'int32', 'int64', - 'uint8', 'uint16', 'uint32', 'uint64', - 'complex64', 'complex128', 'iinfo', 'finfo', - 'can_cast', 'count_nonzero', 'result_type'] - -_all_ignore = ["Callable", "array_namespace", "get_xp", "da", "np"] + result = da.count_nonzero(x, axis) + if keepdims: + if axis is None: + return da.reshape(result, [1] * x.ndim) + return da.expand_dims(result, axis) + return result + + +__all__ = [ + "__array_namespace_info__", + "count_nonzero", + "bool", + "int8", "int16", "int32", "int64", + "uint8", "uint16", "uint32", "uint64", + "float32", "float64", + "complex64", "complex128", + "asarray", "astype", "can_cast", "result_type", + "pow", + "concat", + "acos", "acosh", "asin", "asinh", "atan", "atan2", "atanh", + "bitwise_left_shift", "bitwise_right_shift", "bitwise_invert", +] # fmt: skip +__all__ += _aliases.__all__ +_all_ignore = ["array_namespace", "get_xp", "da", "np"] + + +def __dir__() -> list[str]: + return __all__ diff --git a/sklearn/externals/array_api_compat/dask/array/_info.py b/sklearn/externals/array_api_compat/dask/array/_info.py index e15a69f4629ab..9e4d736f99657 100644 --- a/sklearn/externals/array_api_compat/dask/array/_info.py +++ b/sklearn/externals/array_api_compat/dask/array/_info.py @@ -7,25 +7,51 @@ more details. """ + +# pyright: reportPrivateUsage=false + +from __future__ import annotations + +from typing import Literal as L +from typing import TypeAlias, overload + +from numpy import bool_ as bool from numpy import ( + complex64, + complex128, dtype, - bool_ as bool, - intp, + float32, + float64, int8, int16, int32, int64, + intp, uint8, uint16, uint32, uint64, - float32, - float64, - complex64, - complex128, ) -from ...common._helpers import _DASK_DEVICE +from ...common._helpers import _DASK_DEVICE, _dask_device +from ...common._typing import ( + Capabilities, + DefaultDTypes, + DType, + DTypeKind, + DTypesAll, + DTypesAny, + DTypesBool, + DTypesComplex, + DTypesIntegral, + DTypesNumeric, + DTypesReal, + DTypesSigned, + DTypesUnsigned, +) + +_Device: TypeAlias = L["cpu"] | _dask_device + class __array_namespace_info__: """ @@ -50,7 +76,7 @@ class __array_namespace_info__: Examples -------- - >>> info = np.__array_namespace_info__() + >>> info = xp.__array_namespace_info__() >>> info.default_dtypes() {'real floating': dask.float64, 'complex floating': dask.complex128, @@ -59,20 +85,31 @@ class __array_namespace_info__: """ - __module__ = 'dask.array' + __module__ = "dask.array" - def capabilities(self): + def capabilities(self) -> Capabilities: """ Return a dictionary of array API library capabilities. The resulting dictionary has the following keys: - **"boolean indexing"**: boolean indicating whether an array library - supports boolean indexing. Always ``False`` for Dask. + supports boolean indexing. + + Dask support boolean indexing as long as both the index + and the indexed arrays have known shapes. + Note however that the output .shape and .size properties + will contain a non-compliant math.nan instead of None. - **"data-dependent shapes"**: boolean indicating whether an array - library supports data-dependent output shapes. Always ``False`` for - Dask. + library supports data-dependent output shapes. + + Dask implements unique_values et.al. + Note however that the output .shape and .size properties + will contain a non-compliant math.nan instead of None. + + - **"max dimensions"**: integer indicating the maximum number of + dimensions supported by the array library. See https://data-apis.org/array-api/latest/API_specification/generated/array_api.info.capabilities.html @@ -92,20 +129,20 @@ def capabilities(self): Examples -------- - >>> info = np.__array_namespace_info__() + >>> info = xp.__array_namespace_info__() >>> info.capabilities() {'boolean indexing': True, - 'data-dependent shapes': True} + 'data-dependent shapes': True, + 'max dimensions': 64} """ return { - "boolean indexing": False, - "data-dependent shapes": False, - # 'max rank' will be part of the 2024.12 standard + "boolean indexing": True, + "data-dependent shapes": True, "max dimensions": 64, } - def default_device(self): + def default_device(self) -> L["cpu"]: """ The default device used for new Dask arrays. @@ -120,19 +157,19 @@ def default_device(self): Returns ------- - device : str + device : Device The default device used for new Dask arrays. Examples -------- - >>> info = np.__array_namespace_info__() + >>> info = xp.__array_namespace_info__() >>> info.default_device() 'cpu' """ return "cpu" - def default_dtypes(self, *, device=None): + def default_dtypes(self, /, *, device: _Device | None = None) -> DefaultDTypes: """ The default data types used for new Dask arrays. @@ -163,7 +200,7 @@ def default_dtypes(self, *, device=None): Examples -------- - >>> info = np.__array_namespace_info__() + >>> info = xp.__array_namespace_info__() >>> info.default_dtypes() {'real floating': dask.float64, 'complex floating': dask.complex128, @@ -173,8 +210,8 @@ def default_dtypes(self, *, device=None): """ if device not in ["cpu", _DASK_DEVICE, None]: raise ValueError( - 'Device not understood. Only "cpu" or _DASK_DEVICE is allowed, but received:' - f' {device}' + f'Device not understood. Only "cpu" or _DASK_DEVICE is allowed, ' + f"but received: {device!r}" ) return { "real floating": dtype(float64), @@ -183,7 +220,41 @@ def default_dtypes(self, *, device=None): "indexing": dtype(intp), } - def dtypes(self, *, device=None, kind=None): + @overload + def dtypes( + self, /, *, device: _Device | None = None, kind: None = None + ) -> DTypesAll: ... + @overload + def dtypes( + self, /, *, device: _Device | None = None, kind: L["bool"] + ) -> DTypesBool: ... + @overload + def dtypes( + self, /, *, device: _Device | None = None, kind: L["signed integer"] + ) -> DTypesSigned: ... + @overload + def dtypes( + self, /, *, device: _Device | None = None, kind: L["unsigned integer"] + ) -> DTypesUnsigned: ... + @overload + def dtypes( + self, /, *, device: _Device | None = None, kind: L["integral"] + ) -> DTypesIntegral: ... + @overload + def dtypes( + self, /, *, device: _Device | None = None, kind: L["real floating"] + ) -> DTypesReal: ... + @overload + def dtypes( + self, /, *, device: _Device | None = None, kind: L["complex floating"] + ) -> DTypesComplex: ... + @overload + def dtypes( + self, /, *, device: _Device | None = None, kind: L["numeric"] + ) -> DTypesNumeric: ... + def dtypes( + self, /, *, device: _Device | None = None, kind: DTypeKind | None = None + ) -> DTypesAny: """ The array API data types supported by Dask. @@ -229,7 +300,7 @@ def dtypes(self, *, device=None, kind=None): Examples -------- - >>> info = np.__array_namespace_info__() + >>> info = xp.__array_namespace_info__() >>> info.dtypes(kind='signed integer') {'int8': dask.int8, 'int16': dask.int16, @@ -240,7 +311,7 @@ def dtypes(self, *, device=None, kind=None): if device not in ["cpu", _DASK_DEVICE, None]: raise ValueError( 'Device not understood. Only "cpu" or _DASK_DEVICE is allowed, but received:' - f' {device}' + f" {device}" ) if kind is None: return { @@ -310,14 +381,14 @@ def dtypes(self, *, device=None, kind=None): "complex64": dtype(complex64), "complex128": dtype(complex128), } - if isinstance(kind, tuple): - res = {} + if isinstance(kind, tuple): # type: ignore[reportUnnecessaryIsinstanceCall] + res: dict[str, DType] = {} for k in kind: res.update(self.dtypes(kind=k)) return res raise ValueError(f"unsupported kind: {kind!r}") - def devices(self): + def devices(self) -> list[_Device]: """ The devices supported by Dask. @@ -325,7 +396,7 @@ def devices(self): Returns ------- - devices : list of str + devices : list[Device] The devices supported by Dask. See Also @@ -337,7 +408,7 @@ def devices(self): Examples -------- - >>> info = np.__array_namespace_info__() + >>> info = xp.__array_namespace_info__() >>> info.devices() ['cpu', DASK_DEVICE] diff --git a/sklearn/externals/array_api_compat/dask/array/fft.py b/sklearn/externals/array_api_compat/dask/array/fft.py index aebd86f7b201d..3f40dffe7abd5 100644 --- a/sklearn/externals/array_api_compat/dask/array/fft.py +++ b/sklearn/externals/array_api_compat/dask/array/fft.py @@ -4,9 +4,10 @@ # from dask.array.fft import __all__ as linalg_all _n = {} exec('from dask.array.fft import *', _n) -del _n['__builtins__'] +for k in ("__builtins__", "Sequence", "annotations", "warnings"): + _n.pop(k, None) fft_all = list(_n) -del _n +del _n, k from ...common import _fft from ..._internal import get_xp @@ -16,9 +17,5 @@ fftfreq = get_xp(da)(_fft.fftfreq) rfftfreq = get_xp(da)(_fft.rfftfreq) -__all__ = [elem for elem in fft_all if elem != "annotations"] + ["fftfreq", "rfftfreq"] - -del get_xp -del da -del fft_all -del _fft +__all__ = fft_all + ["fftfreq", "rfftfreq"] +_all_ignore = ["da", "fft_all", "get_xp", "warnings"] diff --git a/sklearn/externals/array_api_compat/dask/array/linalg.py b/sklearn/externals/array_api_compat/dask/array/linalg.py index 49c26d8b819f8..0825386ed5dc3 100644 --- a/sklearn/externals/array_api_compat/dask/array/linalg.py +++ b/sklearn/externals/array_api_compat/dask/array/linalg.py @@ -1,33 +1,29 @@ from __future__ import annotations -from ...common import _linalg -from ..._internal import get_xp +from typing import Literal -# Exports -from dask.array.linalg import * # noqa: F403 -from dask.array import outer +import dask.array as da -# These functions are in both the main and linalg namespaces -from dask.array import matmul, tensordot -from ._aliases import matrix_transpose, vecdot +# The `matmul` and `tensordot` functions are in both the main and linalg namespaces +from dask.array import matmul, outer, tensordot -import dask.array as da +# Exports +from dask.array.linalg import * # noqa: F403 -from typing import TYPE_CHECKING -if TYPE_CHECKING: - from ...common._typing import Array - from typing import Literal +from ..._internal import get_xp +from ...common import _linalg +from ...common._typing import Array as _Array +from ._aliases import matrix_transpose, vecdot # dask.array.linalg doesn't have __all__. If it is added, replace this with # # from dask.array.linalg import __all__ as linalg_all _n = {} exec('from dask.array.linalg import *', _n) -del _n['__builtins__'] -if 'annotations' in _n: - del _n['annotations'] +for k in ('__builtins__', 'annotations', 'operator', 'warnings', 'Array'): + _n.pop(k, None) linalg_all = list(_n) -del _n +del _n, k EighResult = _linalg.EighResult QRResult = _linalg.QRResult @@ -37,8 +33,11 @@ # supports the mode keyword on QR # https://github.com/dask/dask/issues/10388 #qr = get_xp(da)(_linalg.qr) -def qr(x: Array, mode: Literal['reduced', 'complete'] = 'reduced', - **kwargs) -> QRResult: +def qr( + x: _Array, + mode: Literal["reduced", "complete"] = "reduced", + **kwargs: object, +) -> QRResult: if mode != "reduced": raise ValueError("dask arrays only support using mode='reduced'") return QRResult(*da.linalg.qr(x, **kwargs)) @@ -51,12 +50,12 @@ def qr(x: Array, mode: Literal['reduced', 'complete'] = 'reduced', # Wrap the svd functions to not pass full_matrices to dask # when full_matrices=False (as that is the default behavior for dask), # and dask doesn't have the full_matrices keyword -def svd(x: Array, full_matrices: bool = True, **kwargs) -> SVDResult: +def svd(x: _Array, full_matrices: bool = True, **kwargs) -> SVDResult: if full_matrices: raise ValueError("full_matrics=True is not supported by dask.") return da.linalg.svd(x, coerce_signs=False, **kwargs) -def svdvals(x: Array) -> Array: +def svdvals(x: _Array) -> _Array: # TODO: can't avoid computing U or V for dask _, s, _ = svd(x) return s @@ -70,4 +69,4 @@ def svdvals(x: Array) -> Array: "cholesky", "matrix_rank", "matrix_norm", "svdvals", "vector_norm", "diagonal"] -_all_ignore = ['get_xp', 'da', 'linalg_all'] +_all_ignore = ['get_xp', 'da', 'linalg_all', 'warnings'] diff --git a/sklearn/externals/array_api_compat/numpy/__init__.py b/sklearn/externals/array_api_compat/numpy/__init__.py index 02c55d28a01e8..3e138f53db006 100644 --- a/sklearn/externals/array_api_compat/numpy/__init__.py +++ b/sklearn/externals/array_api_compat/numpy/__init__.py @@ -1,10 +1,16 @@ -from numpy import * # noqa: F403 +# ruff: noqa: PLC0414 +from typing import Final + +from numpy import * # noqa: F403 # pyright: ignore[reportWildcardImportFromLibrary] # from numpy import * doesn't overwrite these builtin names -from numpy import abs, max, min, round # noqa: F401 +from numpy import abs as abs +from numpy import max as max +from numpy import min as min +from numpy import round as round # These imports may overwrite names from the import * above. -from ._aliases import * # noqa: F403 +from ._aliases import * # noqa: F403 # Don't know why, but we have to do an absolute import to import linalg. If we # instead do @@ -13,18 +19,10 @@ # # It doesn't overwrite np.linalg from above. The import is generated # dynamically so that the library can be vendored. -__import__(__package__ + '.linalg') - -__import__(__package__ + '.fft') - -from .linalg import matrix_transpose, vecdot # noqa: F401 +__import__(__package__ + ".linalg") -from ..common._helpers import * # noqa: F403 +__import__(__package__ + ".fft") -try: - # Used in asarray(). Not present in older versions. - from numpy import _CopyMode # noqa: F401 -except ImportError: - pass +from .linalg import matrix_transpose, vecdot # type: ignore[no-redef] # noqa: F401 -__array_api_version__ = '2024.12' +__array_api_version__: Final = "2024.12" diff --git a/sklearn/externals/array_api_compat/numpy/_aliases.py b/sklearn/externals/array_api_compat/numpy/_aliases.py index a47f712146e4a..a1aee5c0df796 100644 --- a/sklearn/externals/array_api_compat/numpy/_aliases.py +++ b/sklearn/externals/array_api_compat/numpy/_aliases.py @@ -1,17 +1,24 @@ +# pyright: reportPrivateUsage=false from __future__ import annotations -from ..common import _aliases +from builtins import bool as py_bool +from typing import TYPE_CHECKING, Any, Literal, TypeAlias, cast -from .._internal import get_xp +import numpy as np +from .._internal import get_xp +from ..common import _aliases, _helpers +from ..common._typing import NestedSequence, SupportsBufferProtocol from ._info import __array_namespace_info__ +from ._typing import Array, Device, DType -from typing import TYPE_CHECKING if TYPE_CHECKING: - from typing import Optional, Union - from ._typing import ndarray, Device, Dtype, NestedSequence, SupportsBufferProtocol + from typing_extensions import Buffer, TypeIs + +# The values of the `_CopyMode` enum can be either `False`, `True`, or `2`: +# https://github.com/numpy/numpy/blob/5a8a6a79d9c2fff8f07dcab5d41e14f8508d673f/numpy/_globals.pyi#L7-L10 +_Copy: TypeAlias = py_bool | Literal[2] | np._CopyMode -import numpy as np bool = np.bool_ # Basic renames @@ -63,104 +70,121 @@ matrix_transpose = get_xp(np)(_aliases.matrix_transpose) tensordot = get_xp(np)(_aliases.tensordot) sign = get_xp(np)(_aliases.sign) +finfo = get_xp(np)(_aliases.finfo) +iinfo = get_xp(np)(_aliases.iinfo) -def _supports_buffer_protocol(obj): + +def _supports_buffer_protocol(obj: object) -> TypeIs[Buffer]: # pyright: ignore[reportUnusedFunction] try: - memoryview(obj) + memoryview(obj) # pyright: ignore[reportArgumentType] except TypeError: return False return True + # asarray also adds the copy keyword, which is not present in numpy 1.0. # asarray() is different enough between numpy, cupy, and dask, the logic # complicated enough that it's easier to define it separately for each module # rather than trying to combine everything into one function in common/ def asarray( - obj: Union[ - ndarray, - bool, - int, - float, - NestedSequence[bool | int | float], - SupportsBufferProtocol, - ], + obj: Array | complex | NestedSequence[complex] | SupportsBufferProtocol, /, *, - dtype: Optional[Dtype] = None, - device: Optional[Device] = None, - copy: "Optional[Union[bool, np._CopyMode]]" = None, - **kwargs, -) -> ndarray: + dtype: DType | None = None, + device: Device | None = None, + copy: _Copy | None = None, + **kwargs: Any, +) -> Array: """ Array API compatibility wrapper for asarray(). See the corresponding documentation in the array library and/or the array API specification for more details. """ - if device not in ["cpu", None]: - raise ValueError(f"Unsupported device for NumPy: {device!r}") + _helpers._check_device(np, device) - if hasattr(np, '_CopyMode'): - if copy is None: - copy = np._CopyMode.IF_NEEDED - elif copy is False: - copy = np._CopyMode.NEVER - elif copy is True: - copy = np._CopyMode.ALWAYS - else: - # Not present in older NumPys. In this case, we cannot really support - # copy=False. - if copy is False: - raise NotImplementedError("asarray(copy=False) requires a newer version of NumPy.") + if copy is None: + copy = np._CopyMode.IF_NEEDED + elif copy is False: + copy = np._CopyMode.NEVER + elif copy is True: + copy = np._CopyMode.ALWAYS - return np.array(obj, copy=copy, dtype=dtype, **kwargs) + return np.array(obj, copy=copy, dtype=dtype, **kwargs) # pyright: ignore def astype( - x: ndarray, - dtype: Dtype, + x: Array, + dtype: DType, /, *, - copy: bool = True, - device: Optional[Device] = None, -) -> ndarray: + copy: py_bool = True, + device: Device | None = None, +) -> Array: + _helpers._check_device(np, device) return x.astype(dtype=dtype, copy=copy) # count_nonzero returns a python int for axis=None and keepdims=False # https://github.com/numpy/numpy/issues/17562 def count_nonzero( - x : ndarray, - axis=None, - keepdims=False -) -> ndarray: - result = np.count_nonzero(x, axis=axis, keepdims=keepdims) + x: Array, + axis: int | tuple[int, ...] | None = None, + keepdims: py_bool = False, +) -> Array: + # NOTE: this is currently incorrectly typed in numpy, but will be fixed in + # numpy 2.2.5 and 2.3.0: https://github.com/numpy/numpy/pull/28750 + result = cast("Any", np.count_nonzero(x, axis=axis, keepdims=keepdims)) # pyright: ignore[reportArgumentType, reportCallIssue] if axis is None and not keepdims: return np.asarray(result) return result +# take_along_axis: axis defaults to -1 but in numpy axis is a required arg +def take_along_axis(x: Array, indices: Array, /, *, axis: int = -1): + return np.take_along_axis(x, indices, axis=axis) + + # These functions are completely new here. If the library already has them # (i.e., numpy 2.0), use the library version instead of our wrapper. -if hasattr(np, 'vecdot'): +if hasattr(np, "vecdot"): vecdot = np.vecdot else: vecdot = get_xp(np)(_aliases.vecdot) -if hasattr(np, 'isdtype'): +if hasattr(np, "isdtype"): isdtype = np.isdtype else: isdtype = get_xp(np)(_aliases.isdtype) -if hasattr(np, 'unstack'): +if hasattr(np, "unstack"): unstack = np.unstack else: unstack = get_xp(np)(_aliases.unstack) -__all__ = _aliases.__all__ + ['__array_namespace_info__', 'asarray', 'astype', - 'acos', 'acosh', 'asin', 'asinh', 'atan', - 'atan2', 'atanh', 'bitwise_left_shift', - 'bitwise_invert', 'bitwise_right_shift', - 'bool', 'concat', 'count_nonzero', 'pow'] - -_all_ignore = ['np', 'get_xp'] +__all__ = [ + "__array_namespace_info__", + "asarray", + "astype", + "acos", + "acosh", + "asin", + "asinh", + "atan", + "atan2", + "atanh", + "bitwise_left_shift", + "bitwise_invert", + "bitwise_right_shift", + "bool", + "concat", + "count_nonzero", + "pow", + "take_along_axis" +] +__all__ += _aliases.__all__ +_all_ignore = ["np", "get_xp"] + + +def __dir__() -> list[str]: + return __all__ diff --git a/sklearn/externals/array_api_compat/numpy/_info.py b/sklearn/externals/array_api_compat/numpy/_info.py index e706d1188bf14..f307f62c5d5d5 100644 --- a/sklearn/externals/array_api_compat/numpy/_info.py +++ b/sklearn/externals/array_api_compat/numpy/_info.py @@ -7,24 +7,28 @@ more details. """ +from __future__ import annotations + +from numpy import bool_ as bool from numpy import ( + complex64, + complex128, dtype, - bool_ as bool, - intp, + float32, + float64, int8, int16, int32, int64, + intp, uint8, uint16, uint32, uint64, - float32, - float64, - complex64, - complex128, ) +from ._typing import Device, DType + class __array_namespace_info__: """ @@ -94,13 +98,13 @@ def capabilities(self): >>> info = np.__array_namespace_info__() >>> info.capabilities() {'boolean indexing': True, - 'data-dependent shapes': True} + 'data-dependent shapes': True, + 'max dimensions': 64} """ return { "boolean indexing": True, "data-dependent shapes": True, - # 'max rank' will be part of the 2024.12 standard "max dimensions": 64, } @@ -119,7 +123,7 @@ def default_device(self): Returns ------- - device : str + device : Device The default device used for new NumPy arrays. Examples @@ -131,7 +135,11 @@ def default_device(self): """ return "cpu" - def default_dtypes(self, *, device=None): + def default_dtypes( + self, + *, + device: Device | None = None, + ) -> dict[str, dtype[intp | float64 | complex128]]: """ The default data types used for new NumPy arrays. @@ -183,7 +191,12 @@ def default_dtypes(self, *, device=None): "indexing": dtype(intp), } - def dtypes(self, *, device=None, kind=None): + def dtypes( + self, + *, + device: Device | None = None, + kind: str | tuple[str, ...] | None = None, + ) -> dict[str, DType]: """ The array API data types supported by NumPy. @@ -260,7 +273,7 @@ def dtypes(self, *, device=None, kind=None): "complex128": dtype(complex128), } if kind == "bool": - return {"bool": bool} + return {"bool": dtype(bool)} if kind == "signed integer": return { "int8": dtype(int8), @@ -312,13 +325,13 @@ def dtypes(self, *, device=None, kind=None): "complex128": dtype(complex128), } if isinstance(kind, tuple): - res = {} + res: dict[str, DType] = {} for k in kind: res.update(self.dtypes(kind=k)) return res raise ValueError(f"unsupported kind: {kind!r}") - def devices(self): + def devices(self) -> list[Device]: """ The devices supported by NumPy. @@ -326,7 +339,7 @@ def devices(self): Returns ------- - devices : list of str + devices : list[Device] The devices supported by NumPy. See Also @@ -344,3 +357,10 @@ def devices(self): """ return ["cpu"] + + +__all__ = ["__array_namespace_info__"] + + +def __dir__() -> list[str]: + return __all__ diff --git a/sklearn/externals/array_api_compat/numpy/_typing.py b/sklearn/externals/array_api_compat/numpy/_typing.py index c5ebb5abb9875..e771c788bbcab 100644 --- a/sklearn/externals/array_api_compat/numpy/_typing.py +++ b/sklearn/externals/array_api_compat/numpy/_typing.py @@ -1,46 +1,30 @@ from __future__ import annotations -__all__ = [ - "ndarray", - "Device", - "Dtype", -] - -import sys -from typing import ( - Literal, - Union, - TYPE_CHECKING, -) - -from numpy import ( - ndarray, - dtype, - int8, - int16, - int32, - int64, - uint8, - uint16, - uint32, - uint64, - float32, - float64, -) - -Device = Literal["cpu"] -if TYPE_CHECKING or sys.version_info >= (3, 9): - Dtype = dtype[Union[ - int8, - int16, - int32, - int64, - uint8, - uint16, - uint32, - uint64, - float32, - float64, - ]] +from typing import TYPE_CHECKING, Any, Literal, TypeAlias + +import numpy as np + +Device: TypeAlias = Literal["cpu"] + +if TYPE_CHECKING: + + # NumPy 1.x on Python 3.10 fails to parse np.dtype[] + DType: TypeAlias = np.dtype[ + np.bool_ + | np.integer[Any] + | np.float32 + | np.float64 + | np.complex64 + | np.complex128 + ] + Array: TypeAlias = np.ndarray[Any, DType] else: - Dtype = dtype + DType: TypeAlias = np.dtype + Array: TypeAlias = np.ndarray + +__all__ = ["Array", "DType", "Device"] +_all_ignore = ["np"] + + +def __dir__() -> list[str]: + return __all__ diff --git a/sklearn/externals/array_api_compat/numpy/fft.py b/sklearn/externals/array_api_compat/numpy/fft.py index 286675946e0fb..06875f00b4312 100644 --- a/sklearn/externals/array_api_compat/numpy/fft.py +++ b/sklearn/externals/array_api_compat/numpy/fft.py @@ -1,10 +1,9 @@ -from numpy.fft import * # noqa: F403 +import numpy as np from numpy.fft import __all__ as fft_all +from numpy.fft import fft2, ifft2, irfft2, rfft2 -from ..common import _fft from .._internal import get_xp - -import numpy as np +from ..common import _fft fft = get_xp(np)(_fft.fft) ifft = get_xp(np)(_fft.ifft) @@ -21,7 +20,14 @@ fftshift = get_xp(np)(_fft.fftshift) ifftshift = get_xp(np)(_fft.ifftshift) -__all__ = fft_all + _fft.__all__ + +__all__ = ["rfft2", "irfft2", "fft2", "ifft2"] +__all__ += _fft.__all__ + + +def __dir__() -> list[str]: + return __all__ + del get_xp del np diff --git a/sklearn/externals/array_api_compat/numpy/linalg.py b/sklearn/externals/array_api_compat/numpy/linalg.py index 8f01593bd0ae6..2d3e731da3fc0 100644 --- a/sklearn/externals/array_api_compat/numpy/linalg.py +++ b/sklearn/externals/array_api_compat/numpy/linalg.py @@ -1,14 +1,35 @@ -from numpy.linalg import * # noqa: F403 -from numpy.linalg import __all__ as linalg_all -import numpy as _np +# pyright: reportAttributeAccessIssue=false +# pyright: reportUnknownArgumentType=false +# pyright: reportUnknownMemberType=false +# pyright: reportUnknownVariableType=false + +from __future__ import annotations + +import numpy as np + +# intersection of `np.linalg.__all__` on numpy 1.22 and 2.2, minus `_linalg.__all__` +from numpy.linalg import ( + LinAlgError, + cond, + det, + eig, + eigvals, + eigvalsh, + inv, + lstsq, + matrix_power, + multi_dot, + norm, + tensorinv, + tensorsolve, +) -from ..common import _linalg from .._internal import get_xp +from ..common import _linalg # These functions are in both the main and linalg namespaces -from ._aliases import matmul, matrix_transpose, tensordot, vecdot # noqa: F401 - -import numpy as np +from ._aliases import matmul, matrix_transpose, tensordot, vecdot # noqa: F401 +from ._typing import Array cross = get_xp(np)(_linalg.cross) outer = get_xp(np)(_linalg.outer) @@ -38,19 +59,28 @@ # To workaround this, the below is the code from np.linalg.solve except # only calling solve1 in the exactly 1D case. + # This code is here instead of in common because it is numpy specific. Also # note that CuPy's solve() does not currently support broadcasting (see # https://github.com/cupy/cupy/blob/main/cupy/cublas.py#L43). -def solve(x1: _np.ndarray, x2: _np.ndarray, /) -> _np.ndarray: +def solve(x1: Array, x2: Array, /) -> Array: try: from numpy.linalg._linalg import ( - _makearray, _assert_stacked_2d, _assert_stacked_square, - _commonType, isComplexType, _raise_linalgerror_singular + _assert_stacked_2d, + _assert_stacked_square, + _commonType, + _makearray, + _raise_linalgerror_singular, + isComplexType, ) except ImportError: from numpy.linalg.linalg import ( - _makearray, _assert_stacked_2d, _assert_stacked_square, - _commonType, isComplexType, _raise_linalgerror_singular + _assert_stacked_2d, + _assert_stacked_square, + _commonType, + _makearray, + _raise_linalgerror_singular, + isComplexType, ) from numpy.linalg import _umath_linalg @@ -61,6 +91,7 @@ def solve(x1: _np.ndarray, x2: _np.ndarray, /) -> _np.ndarray: t, result_t = _commonType(x1, x2) # This part is different from np.linalg.solve + gufunc: np.ufunc if x2.ndim == 1: gufunc = _umath_linalg.solve1 else: @@ -68,23 +99,45 @@ def solve(x1: _np.ndarray, x2: _np.ndarray, /) -> _np.ndarray: # This does nothing currently but is left in because it will be relevant # when complex dtype support is added to the spec in 2022. - signature = 'DD->D' if isComplexType(t) else 'dd->d' - with _np.errstate(call=_raise_linalgerror_singular, invalid='call', - over='ignore', divide='ignore', under='ignore'): - r = gufunc(x1, x2, signature=signature) + signature = "DD->D" if isComplexType(t) else "dd->d" + with np.errstate( + call=_raise_linalgerror_singular, + invalid="call", + over="ignore", + divide="ignore", + under="ignore", + ): + r: Array = gufunc(x1, x2, signature=signature) return wrap(r.astype(result_t, copy=False)) + # These functions are completely new here. If the library already has them # (i.e., numpy 2.0), use the library version instead of our wrapper. -if hasattr(np.linalg, 'vector_norm'): +if hasattr(np.linalg, "vector_norm"): vector_norm = np.linalg.vector_norm else: vector_norm = get_xp(np)(_linalg.vector_norm) -__all__ = linalg_all + _linalg.__all__ + ['solve'] -del get_xp -del np -del linalg_all -del _linalg +__all__ = [ + "LinAlgError", + "cond", + "det", + "eig", + "eigvals", + "eigvalsh", + "inv", + "lstsq", + "matrix_power", + "multi_dot", + "norm", + "tensorinv", + "tensorsolve", +] +__all__ += _linalg.__all__ +__all__ += ["solve", "vector_norm"] + + +def __dir__() -> list[str]: + return __all__ diff --git a/sklearn/externals/array_api_compat/py.typed b/sklearn/externals/array_api_compat/py.typed new file mode 100644 index 0000000000000..e69de29bb2d1d diff --git a/sklearn/externals/array_api_compat/torch/__init__.py b/sklearn/externals/array_api_compat/torch/__init__.py index a985986e649c3..69fd19ce83a56 100644 --- a/sklearn/externals/array_api_compat/torch/__init__.py +++ b/sklearn/externals/array_api_compat/torch/__init__.py @@ -9,16 +9,14 @@ or 'cpu' in n or 'backward' in n): continue - exec(n + ' = torch.' + n) + exec(f"{n} = torch.{n}") +del n # These imports may overwrite names from the import * above. from ._aliases import * # noqa: F403 # See the comment in the numpy __init__.py __import__(__package__ + '.linalg') - __import__(__package__ + '.fft') -from ..common._helpers import * # noqa: F403 - __array_api_version__ = '2024.12' diff --git a/sklearn/externals/array_api_compat/torch/_aliases.py b/sklearn/externals/array_api_compat/torch/_aliases.py index 4b727f1c22ba8..de5d1a5d40eb5 100644 --- a/sklearn/externals/array_api_compat/torch/_aliases.py +++ b/sklearn/externals/array_api_compat/torch/_aliases.py @@ -2,21 +2,15 @@ from functools import reduce as _reduce, wraps as _wraps from builtins import all as _builtin_all, any as _builtin_any - -from ..common import _aliases -from .._internal import get_xp - -from ._info import __array_namespace_info__ +from typing import Any, List, Optional, Sequence, Tuple, Union, Literal import torch -from typing import TYPE_CHECKING -if TYPE_CHECKING: - from typing import List, Optional, Sequence, Tuple, Union - from ..common._typing import Device - from torch import dtype as Dtype - - array = torch.Tensor +from .._internal import get_xp +from ..common import _aliases +from ..common._typing import NestedSequence, SupportsBufferProtocol +from ._info import __array_namespace_info__ +from ._typing import Array, Device, DType _int_dtypes = { torch.uint8, @@ -41,47 +35,23 @@ torch.complex128, } -_promotion_table = { - # bool - (torch.bool, torch.bool): torch.bool, +_promotion_table = { # ints - (torch.int8, torch.int8): torch.int8, (torch.int8, torch.int16): torch.int16, (torch.int8, torch.int32): torch.int32, (torch.int8, torch.int64): torch.int64, - (torch.int16, torch.int8): torch.int16, - (torch.int16, torch.int16): torch.int16, (torch.int16, torch.int32): torch.int32, (torch.int16, torch.int64): torch.int64, - (torch.int32, torch.int8): torch.int32, - (torch.int32, torch.int16): torch.int32, - (torch.int32, torch.int32): torch.int32, (torch.int32, torch.int64): torch.int64, - (torch.int64, torch.int8): torch.int64, - (torch.int64, torch.int16): torch.int64, - (torch.int64, torch.int32): torch.int64, - (torch.int64, torch.int64): torch.int64, - # uints - (torch.uint8, torch.uint8): torch.uint8, # ints and uints (mixed sign) - (torch.int8, torch.uint8): torch.int16, - (torch.int16, torch.uint8): torch.int16, - (torch.int32, torch.uint8): torch.int32, - (torch.int64, torch.uint8): torch.int64, (torch.uint8, torch.int8): torch.int16, (torch.uint8, torch.int16): torch.int16, (torch.uint8, torch.int32): torch.int32, (torch.uint8, torch.int64): torch.int64, # floats - (torch.float32, torch.float32): torch.float32, (torch.float32, torch.float64): torch.float64, - (torch.float64, torch.float32): torch.float64, - (torch.float64, torch.float64): torch.float64, # complexes - (torch.complex64, torch.complex64): torch.complex64, (torch.complex64, torch.complex128): torch.complex128, - (torch.complex128, torch.complex64): torch.complex128, - (torch.complex128, torch.complex128): torch.complex128, # Mixed float and complex (torch.float32, torch.complex64): torch.complex64, (torch.float32, torch.complex128): torch.complex128, @@ -89,6 +59,9 @@ (torch.float64, torch.complex128): torch.complex128, } +_promotion_table.update({(b, a): c for (a, b), c in _promotion_table.items()}) +_promotion_table.update({(a, a): a for a in _array_api_dtypes}) + def _two_arg(f): @_wraps(f) @@ -123,7 +96,9 @@ def _fix_promotion(x1, x2, only_scalar=True): _py_scalars = (bool, int, float, complex) -def result_type(*arrays_and_dtypes: Union[array, Dtype, bool, int, float, complex]) -> Dtype: +def result_type( + *arrays_and_dtypes: Array | DType | bool | int | float | complex +) -> DType: num = len(arrays_and_dtypes) if num == 0: @@ -154,13 +129,18 @@ def result_type(*arrays_and_dtypes: Union[array, Dtype, bool, int, float, comple return _reduce(_result_type, others + scalars) -def _result_type(x, y): +def _result_type( + x: Array | DType | bool | int | float | complex, + y: Array | DType | bool | int | float | complex, +) -> DType: if not (isinstance(x, _py_scalars) or isinstance(y, _py_scalars)): - xdt = x.dtype if not isinstance(x, torch.dtype) else x - ydt = y.dtype if not isinstance(y, torch.dtype) else y + xdt = x if isinstance(x, torch.dtype) else x.dtype + ydt = y if isinstance(y, torch.dtype) else y.dtype - if (xdt, ydt) in _promotion_table: + try: return _promotion_table[xdt, ydt] + except KeyError: + pass # This doesn't result_type(dtype, dtype) for non-array API dtypes # because torch.result_type only accepts tensors. This does however, allow @@ -170,7 +150,7 @@ def _result_type(x, y): return torch.result_type(x, y) -def can_cast(from_: Union[Dtype, array], to: Dtype, /) -> bool: +def can_cast(from_: Union[DType, Array], to: DType, /) -> bool: if not isinstance(from_, torch.dtype): from_ = from_.dtype return torch.can_cast(from_, to) @@ -212,17 +192,39 @@ def can_cast(from_: Union[Dtype, array], to: Dtype, /) -> bool: remainder = _two_arg(torch.remainder) subtract = _two_arg(torch.subtract) + +def asarray( + obj: ( + Array + | bool | int | float | complex + | NestedSequence[bool | int | float | complex] + | SupportsBufferProtocol + ), + /, + *, + dtype: DType | None = None, + device: Device | None = None, + copy: bool | None = None, + **kwargs: Any, +) -> Array: + # torch.asarray does not respect input->output device propagation + # https://github.com/pytorch/pytorch/issues/150199 + if device is None and isinstance(obj, torch.Tensor): + device = obj.device + return torch.asarray(obj, dtype=dtype, device=device, copy=copy, **kwargs) + + # These wrappers are mostly based on the fact that pytorch uses 'dim' instead # of 'axis'. # torch.min and torch.max return a tuple and don't support multiple axes https://github.com/pytorch/pytorch/issues/58745 -def max(x: array, /, *, axis: Optional[Union[int, Tuple[int, ...]]] = None, keepdims: bool = False) -> array: +def max(x: Array, /, *, axis: Optional[Union[int, Tuple[int, ...]]] = None, keepdims: bool = False) -> Array: # https://github.com/pytorch/pytorch/issues/29137 if axis == (): return torch.clone(x) return torch.amax(x, axis, keepdims=keepdims) -def min(x: array, /, *, axis: Optional[Union[int, Tuple[int, ...]]] = None, keepdims: bool = False) -> array: +def min(x: Array, /, *, axis: Optional[Union[int, Tuple[int, ...]]] = None, keepdims: bool = False) -> Array: # https://github.com/pytorch/pytorch/issues/29137 if axis == (): return torch.clone(x) @@ -232,10 +234,13 @@ def min(x: array, /, *, axis: Optional[Union[int, Tuple[int, ...]]] = None, keep unstack = get_xp(torch)(_aliases.unstack) cumulative_sum = get_xp(torch)(_aliases.cumulative_sum) cumulative_prod = get_xp(torch)(_aliases.cumulative_prod) +finfo = get_xp(torch)(_aliases.finfo) +iinfo = get_xp(torch)(_aliases.iinfo) + # torch.sort also returns a tuple # https://github.com/pytorch/pytorch/issues/70921 -def sort(x: array, /, *, axis: int = -1, descending: bool = False, stable: bool = True, **kwargs) -> array: +def sort(x: Array, /, *, axis: int = -1, descending: bool = False, stable: bool = True, **kwargs) -> Array: return torch.sort(x, dim=axis, descending=descending, stable=stable, **kwargs).values def _normalize_axes(axis, ndim): @@ -280,28 +285,35 @@ def _reduce_multiple_axes(f, x, axis, keepdims=False, **kwargs): out = torch.unsqueeze(out, a) return out -def prod(x: array, + +def _sum_prod_no_axis(x: Array, dtype: DType | None) -> Array: + """ + Implements `sum(..., axis=())` and `prod(..., axis=())`. + + Works around https://github.com/pytorch/pytorch/issues/29137 + """ + if dtype is not None: + return x.clone() if dtype == x.dtype else x.to(dtype) + + # We can't upcast uint8 according to the spec because there is no + # torch.uint64, so at least upcast to int64 which is what prod does + # when axis=None. + if x.dtype in (torch.uint8, torch.int8, torch.int16, torch.int32): + return x.to(torch.int64) + + return x.clone() + + +def prod(x: Array, /, *, axis: Optional[Union[int, Tuple[int, ...]]] = None, - dtype: Optional[Dtype] = None, + dtype: Optional[DType] = None, keepdims: bool = False, - **kwargs) -> array: - x = torch.asarray(x) - ndim = x.ndim + **kwargs) -> Array: - # https://github.com/pytorch/pytorch/issues/29137. Separate from the logic - # below because it still needs to upcast. if axis == (): - if dtype is None: - # We can't upcast uint8 according to the spec because there is no - # torch.uint64, so at least upcast to int64 which is what sum does - # when axis=None. - if x.dtype in [torch.int8, torch.int16, torch.int32, torch.uint8]: - return x.to(torch.int64) - return x.clone() - return x.to(dtype) - + return _sum_prod_no_axis(x, dtype) # torch.prod doesn't support multiple axes # (https://github.com/pytorch/pytorch/issues/56586). if isinstance(axis, tuple): @@ -310,51 +322,38 @@ def prod(x: array, # torch doesn't support keepdims with axis=None # (https://github.com/pytorch/pytorch/issues/71209) res = torch.prod(x, dtype=dtype, **kwargs) - res = _axis_none_keepdims(res, ndim, keepdims) + res = _axis_none_keepdims(res, x.ndim, keepdims) return res return torch.prod(x, axis, dtype=dtype, keepdims=keepdims, **kwargs) -def sum(x: array, +def sum(x: Array, /, *, axis: Optional[Union[int, Tuple[int, ...]]] = None, - dtype: Optional[Dtype] = None, + dtype: Optional[DType] = None, keepdims: bool = False, - **kwargs) -> array: - x = torch.asarray(x) - ndim = x.ndim + **kwargs) -> Array: - # https://github.com/pytorch/pytorch/issues/29137. - # Make sure it upcasts. if axis == (): - if dtype is None: - # We can't upcast uint8 according to the spec because there is no - # torch.uint64, so at least upcast to int64 which is what sum does - # when axis=None. - if x.dtype in [torch.int8, torch.int16, torch.int32, torch.uint8]: - return x.to(torch.int64) - return x.clone() - return x.to(dtype) - + return _sum_prod_no_axis(x, dtype) if axis is None: # torch doesn't support keepdims with axis=None # (https://github.com/pytorch/pytorch/issues/71209) res = torch.sum(x, dtype=dtype, **kwargs) - res = _axis_none_keepdims(res, ndim, keepdims) + res = _axis_none_keepdims(res, x.ndim, keepdims) return res return torch.sum(x, axis, dtype=dtype, keepdims=keepdims, **kwargs) -def any(x: array, +def any(x: Array, /, *, axis: Optional[Union[int, Tuple[int, ...]]] = None, keepdims: bool = False, - **kwargs) -> array: - x = torch.asarray(x) - ndim = x.ndim + **kwargs) -> Array: + if axis == (): return x.to(torch.bool) # torch.any doesn't support multiple axes @@ -366,20 +365,19 @@ def any(x: array, # torch doesn't support keepdims with axis=None # (https://github.com/pytorch/pytorch/issues/71209) res = torch.any(x, **kwargs) - res = _axis_none_keepdims(res, ndim, keepdims) + res = _axis_none_keepdims(res, x.ndim, keepdims) return res.to(torch.bool) # torch.any doesn't return bool for uint8 return torch.any(x, axis, keepdims=keepdims).to(torch.bool) -def all(x: array, +def all(x: Array, /, *, axis: Optional[Union[int, Tuple[int, ...]]] = None, keepdims: bool = False, - **kwargs) -> array: - x = torch.asarray(x) - ndim = x.ndim + **kwargs) -> Array: + if axis == (): return x.to(torch.bool) # torch.all doesn't support multiple axes @@ -391,18 +389,18 @@ def all(x: array, # torch doesn't support keepdims with axis=None # (https://github.com/pytorch/pytorch/issues/71209) res = torch.all(x, **kwargs) - res = _axis_none_keepdims(res, ndim, keepdims) + res = _axis_none_keepdims(res, x.ndim, keepdims) return res.to(torch.bool) # torch.all doesn't return bool for uint8 return torch.all(x, axis, keepdims=keepdims).to(torch.bool) -def mean(x: array, +def mean(x: Array, /, *, axis: Optional[Union[int, Tuple[int, ...]]] = None, keepdims: bool = False, - **kwargs) -> array: + **kwargs) -> Array: # https://github.com/pytorch/pytorch/issues/29137 if axis == (): return torch.clone(x) @@ -414,13 +412,13 @@ def mean(x: array, return res return torch.mean(x, axis, keepdims=keepdims, **kwargs) -def std(x: array, +def std(x: Array, /, *, axis: Optional[Union[int, Tuple[int, ...]]] = None, correction: Union[int, float] = 0.0, keepdims: bool = False, - **kwargs) -> array: + **kwargs) -> Array: # Note, float correction is not supported # https://github.com/pytorch/pytorch/issues/61492. We don't try to # implement it here for now. @@ -445,13 +443,13 @@ def std(x: array, return res return torch.std(x, axis, correction=_correction, keepdims=keepdims, **kwargs) -def var(x: array, +def var(x: Array, /, *, axis: Optional[Union[int, Tuple[int, ...]]] = None, correction: Union[int, float] = 0.0, keepdims: bool = False, - **kwargs) -> array: + **kwargs) -> Array: # Note, float correction is not supported # https://github.com/pytorch/pytorch/issues/61492. We don't try to # implement it here for now. @@ -474,11 +472,11 @@ def var(x: array, # torch.concat doesn't support dim=None # https://github.com/pytorch/pytorch/issues/70925 -def concat(arrays: Union[Tuple[array, ...], List[array]], +def concat(arrays: Union[Tuple[Array, ...], List[Array]], /, *, axis: Optional[int] = 0, - **kwargs) -> array: + **kwargs) -> Array: if axis is None: arrays = tuple(ar.flatten() for ar in arrays) axis = 0 @@ -487,7 +485,7 @@ def concat(arrays: Union[Tuple[array, ...], List[array]], # torch.squeeze only accepts int dim and doesn't require it # https://github.com/pytorch/pytorch/issues/70924. Support for tuple dim was # added at https://github.com/pytorch/pytorch/pull/89017. -def squeeze(x: array, /, axis: Union[int, Tuple[int, ...]]) -> array: +def squeeze(x: Array, /, axis: Union[int, Tuple[int, ...]]) -> Array: if isinstance(axis, int): axis = (axis,) for a in axis: @@ -501,27 +499,27 @@ def squeeze(x: array, /, axis: Union[int, Tuple[int, ...]]) -> array: return x # torch.broadcast_to uses size instead of shape -def broadcast_to(x: array, /, shape: Tuple[int, ...], **kwargs) -> array: +def broadcast_to(x: Array, /, shape: Tuple[int, ...], **kwargs) -> Array: return torch.broadcast_to(x, shape, **kwargs) # torch.permute uses dims instead of axes -def permute_dims(x: array, /, axes: Tuple[int, ...]) -> array: +def permute_dims(x: Array, /, axes: Tuple[int, ...]) -> Array: return torch.permute(x, axes) # The axis parameter doesn't work for flip() and roll() # https://github.com/pytorch/pytorch/issues/71210. Also torch.flip() doesn't # accept axis=None -def flip(x: array, /, *, axis: Optional[Union[int, Tuple[int, ...]]] = None, **kwargs) -> array: +def flip(x: Array, /, *, axis: Optional[Union[int, Tuple[int, ...]]] = None, **kwargs) -> Array: if axis is None: axis = tuple(range(x.ndim)) # torch.flip doesn't accept dim as an int but the method does # https://github.com/pytorch/pytorch/issues/18095 return x.flip(axis, **kwargs) -def roll(x: array, /, shift: Union[int, Tuple[int, ...]], *, axis: Optional[Union[int, Tuple[int, ...]]] = None, **kwargs) -> array: +def roll(x: Array, /, shift: Union[int, Tuple[int, ...]], *, axis: Optional[Union[int, Tuple[int, ...]]] = None, **kwargs) -> Array: return torch.roll(x, shift, axis, **kwargs) -def nonzero(x: array, /, **kwargs) -> Tuple[array, ...]: +def nonzero(x: Array, /, **kwargs) -> Tuple[Array, ...]: if x.ndim == 0: raise ValueError("nonzero() does not support zero-dimensional arrays") return torch.nonzero(x, as_tuple=True, **kwargs) @@ -529,45 +527,60 @@ def nonzero(x: array, /, **kwargs) -> Tuple[array, ...]: # torch uses `dim` instead of `axis` def diff( - x: array, + x: Array, /, *, axis: int = -1, n: int = 1, - prepend: Optional[array] = None, - append: Optional[array] = None, -) -> array: + prepend: Optional[Array] = None, + append: Optional[Array] = None, +) -> Array: return torch.diff(x, dim=axis, n=n, prepend=prepend, append=append) # torch uses `dim` instead of `axis`, does not have keepdims def count_nonzero( - x: array, + x: Array, /, *, axis: Optional[Union[int, Tuple[int, ...]]] = None, keepdims: bool = False, -) -> array: +) -> Array: result = torch.count_nonzero(x, dim=axis) if keepdims: - if axis is not None: + if isinstance(axis, int): return result.unsqueeze(axis) + elif isinstance(axis, tuple): + n_axis = [x.ndim + ax if ax < 0 else ax for ax in axis] + sh = [1 if i in n_axis else x.shape[i] for i in range(x.ndim)] + return torch.reshape(result, sh) return _axis_none_keepdims(result, x.ndim, keepdims) else: return result +# "repeat" is torch.repeat_interleave; also the dim argument +def repeat(x: Array, repeats: int | Array, /, *, axis: int | None = None) -> Array: + return torch.repeat_interleave(x, repeats, axis) -def where(condition: array, x1: array, x2: array, /) -> array: + +def where( + condition: Array, + x1: Array | bool | int | float | complex, + x2: Array | bool | int | float | complex, + /, +) -> Array: x1, x2 = _fix_promotion(x1, x2) return torch.where(condition, x1, x2) + # torch.reshape doesn't have the copy keyword -def reshape(x: array, +def reshape(x: Array, /, shape: Tuple[int, ...], + *, copy: Optional[bool] = None, - **kwargs) -> array: + **kwargs) -> Array: if copy is not None: raise NotImplementedError("torch.reshape doesn't yet support the copy keyword") return torch.reshape(x, shape, **kwargs) @@ -581,9 +594,9 @@ def arange(start: Union[int, float], stop: Optional[Union[int, float]] = None, step: Union[int, float] = 1, *, - dtype: Optional[Dtype] = None, + dtype: Optional[DType] = None, device: Optional[Device] = None, - **kwargs) -> array: + **kwargs) -> Array: if stop is None: start, stop = 0, start if step > 0 and stop <= start or step < 0 and stop >= start: @@ -602,9 +615,9 @@ def eye(n_rows: int, /, *, k: int = 0, - dtype: Optional[Dtype] = None, + dtype: Optional[DType] = None, device: Optional[Device] = None, - **kwargs) -> array: + **kwargs) -> Array: if n_cols is None: n_cols = n_rows z = torch.zeros(n_rows, n_cols, dtype=dtype, device=device, **kwargs) @@ -618,10 +631,10 @@ def linspace(start: Union[int, float], /, num: int, *, - dtype: Optional[Dtype] = None, + dtype: Optional[DType] = None, device: Optional[Device] = None, endpoint: bool = True, - **kwargs) -> array: + **kwargs) -> Array: if not endpoint: return torch.linspace(start, stop, num+1, dtype=dtype, device=device, **kwargs)[:-1] return torch.linspace(start, stop, num, dtype=dtype, device=device, **kwargs) @@ -629,11 +642,11 @@ def linspace(start: Union[int, float], # torch.full does not accept an int size # https://github.com/pytorch/pytorch/issues/70906 def full(shape: Union[int, Tuple[int, ...]], - fill_value: Union[bool, int, float, complex], + fill_value: bool | int | float | complex, *, - dtype: Optional[Dtype] = None, + dtype: Optional[DType] = None, device: Optional[Device] = None, - **kwargs) -> array: + **kwargs) -> Array: if isinstance(shape, int): shape = (shape,) @@ -642,52 +655,52 @@ def full(shape: Union[int, Tuple[int, ...]], # ones, zeros, and empty do not accept shape as a keyword argument def ones(shape: Union[int, Tuple[int, ...]], *, - dtype: Optional[Dtype] = None, + dtype: Optional[DType] = None, device: Optional[Device] = None, - **kwargs) -> array: + **kwargs) -> Array: return torch.ones(shape, dtype=dtype, device=device, **kwargs) def zeros(shape: Union[int, Tuple[int, ...]], *, - dtype: Optional[Dtype] = None, + dtype: Optional[DType] = None, device: Optional[Device] = None, - **kwargs) -> array: + **kwargs) -> Array: return torch.zeros(shape, dtype=dtype, device=device, **kwargs) def empty(shape: Union[int, Tuple[int, ...]], *, - dtype: Optional[Dtype] = None, + dtype: Optional[DType] = None, device: Optional[Device] = None, - **kwargs) -> array: + **kwargs) -> Array: return torch.empty(shape, dtype=dtype, device=device, **kwargs) # tril and triu do not call the keyword argument k -def tril(x: array, /, *, k: int = 0) -> array: +def tril(x: Array, /, *, k: int = 0) -> Array: return torch.tril(x, k) -def triu(x: array, /, *, k: int = 0) -> array: +def triu(x: Array, /, *, k: int = 0) -> Array: return torch.triu(x, k) # Functions that aren't in torch https://github.com/pytorch/pytorch/issues/58742 -def expand_dims(x: array, /, *, axis: int = 0) -> array: +def expand_dims(x: Array, /, *, axis: int = 0) -> Array: return torch.unsqueeze(x, axis) def astype( - x: array, - dtype: Dtype, + x: Array, + dtype: DType, /, *, copy: bool = True, device: Optional[Device] = None, -) -> array: +) -> Array: if device is not None: return x.to(device, dtype=dtype, copy=copy) return x.to(dtype=dtype, copy=copy) -def broadcast_arrays(*arrays: array) -> List[array]: +def broadcast_arrays(*arrays: Array) -> List[Array]: shape = torch.broadcast_shapes(*[a.shape for a in arrays]) return [torch.broadcast_to(a, shape) for a in arrays] @@ -697,7 +710,7 @@ def broadcast_arrays(*arrays: array) -> List[array]: UniqueInverseResult) # https://github.com/pytorch/pytorch/issues/70920 -def unique_all(x: array) -> UniqueAllResult: +def unique_all(x: Array) -> UniqueAllResult: # torch.unique doesn't support returning indices. # https://github.com/pytorch/pytorch/issues/36748. The workaround # suggested in that issue doesn't actually function correctly (it relies @@ -710,7 +723,7 @@ def unique_all(x: array) -> UniqueAllResult: # counts[torch.isnan(values)] = 1 # return UniqueAllResult(values, indices, inverse_indices, counts) -def unique_counts(x: array) -> UniqueCountsResult: +def unique_counts(x: Array) -> UniqueCountsResult: values, counts = torch.unique(x, return_counts=True) # torch.unique incorrectly gives a 0 count for nan values. @@ -718,14 +731,14 @@ def unique_counts(x: array) -> UniqueCountsResult: counts[torch.isnan(values)] = 1 return UniqueCountsResult(values, counts) -def unique_inverse(x: array) -> UniqueInverseResult: +def unique_inverse(x: Array) -> UniqueInverseResult: values, inverse = torch.unique(x, return_inverse=True) return UniqueInverseResult(values, inverse) -def unique_values(x: array) -> array: +def unique_values(x: Array) -> Array: return torch.unique(x) -def matmul(x1: array, x2: array, /, **kwargs) -> array: +def matmul(x1: Array, x2: Array, /, **kwargs) -> Array: # torch.matmul doesn't type promote (but differently from _fix_promotion) x1, x2 = _fix_promotion(x1, x2, only_scalar=False) return torch.matmul(x1, x2, **kwargs) @@ -733,12 +746,19 @@ def matmul(x1: array, x2: array, /, **kwargs) -> array: matrix_transpose = get_xp(torch)(_aliases.matrix_transpose) _vecdot = get_xp(torch)(_aliases.vecdot) -def vecdot(x1: array, x2: array, /, *, axis: int = -1) -> array: +def vecdot(x1: Array, x2: Array, /, *, axis: int = -1) -> Array: x1, x2 = _fix_promotion(x1, x2, only_scalar=False) return _vecdot(x1, x2, axis=axis) # torch.tensordot uses dims instead of axes -def tensordot(x1: array, x2: array, /, *, axes: Union[int, Tuple[Sequence[int], Sequence[int]]] = 2, **kwargs) -> array: +def tensordot( + x1: Array, + x2: Array, + /, + *, + axes: Union[int, Tuple[Sequence[int], Sequence[int]]] = 2, + **kwargs, +) -> Array: # Note: torch.tensordot fails with integer dtypes when there is only 1 # element in the axis (https://github.com/pytorch/pytorch/issues/84530). x1, x2 = _fix_promotion(x1, x2, only_scalar=False) @@ -746,7 +766,7 @@ def tensordot(x1: array, x2: array, /, *, axes: Union[int, Tuple[Sequence[int], def isdtype( - dtype: Dtype, kind: Union[Dtype, str, Tuple[Union[Dtype, str], ...]], + dtype: DType, kind: Union[DType, str, Tuple[Union[DType, str], ...]], *, _tuple=True, # Disallow nested tuples ) -> bool: """ @@ -781,7 +801,7 @@ def isdtype( else: return dtype == kind -def take(x: array, indices: array, /, *, axis: Optional[int] = None, **kwargs) -> array: +def take(x: Array, indices: Array, /, *, axis: Optional[int] = None, **kwargs) -> Array: if axis is None: if x.ndim != 1: raise ValueError("axis must be specified when ndim > 1") @@ -789,11 +809,11 @@ def take(x: array, indices: array, /, *, axis: Optional[int] = None, **kwargs) - return torch.index_select(x, axis, indices, **kwargs) -def take_along_axis(x: array, indices: array, /, *, axis: int = -1) -> array: +def take_along_axis(x: Array, indices: Array, /, *, axis: int = -1) -> Array: return torch.take_along_dim(x, indices, dim=axis) -def sign(x: array, /) -> array: +def sign(x: Array, /) -> Array: # torch sign() does not support complex numbers and does not propagate # nans. See https://github.com/data-apis/array-api-compat/issues/136 if x.dtype.is_complex: @@ -808,7 +828,13 @@ def sign(x: array, /) -> array: return out -__all__ = ['__array_namespace_info__', 'result_type', 'can_cast', +def meshgrid(*arrays: Array, indexing: Literal['xy', 'ij'] = 'xy') -> List[Array]: + # enforce the default of 'xy' + # TODO: is the return type a list or a tuple + return list(torch.meshgrid(*arrays, indexing='xy')) + + +__all__ = ['__array_namespace_info__', 'asarray', 'result_type', 'can_cast', 'permute_dims', 'bitwise_invert', 'newaxis', 'conj', 'add', 'atan2', 'bitwise_and', 'bitwise_left_shift', 'bitwise_or', 'bitwise_right_shift', 'bitwise_xor', 'copysign', 'count_nonzero', @@ -824,6 +850,6 @@ def sign(x: array, /) -> array: 'UniqueAllResult', 'UniqueCountsResult', 'UniqueInverseResult', 'unique_all', 'unique_counts', 'unique_inverse', 'unique_values', 'matmul', 'matrix_transpose', 'vecdot', 'tensordot', 'isdtype', - 'take', 'take_along_axis', 'sign'] + 'take', 'take_along_axis', 'sign', 'finfo', 'iinfo', 'repeat', 'meshgrid'] _all_ignore = ['torch', 'get_xp'] diff --git a/sklearn/externals/array_api_compat/torch/_info.py b/sklearn/externals/array_api_compat/torch/_info.py index 34fbcb21aa53f..818e5d3702e38 100644 --- a/sklearn/externals/array_api_compat/torch/_info.py +++ b/sklearn/externals/array_api_compat/torch/_info.py @@ -34,7 +34,7 @@ class __array_namespace_info__: Examples -------- - >>> info = np.__array_namespace_info__() + >>> info = xp.__array_namespace_info__() >>> info.default_dtypes() {'real floating': numpy.float64, 'complex floating': numpy.complex128, @@ -76,16 +76,16 @@ def capabilities(self): Examples -------- - >>> info = np.__array_namespace_info__() + >>> info = xp.__array_namespace_info__() >>> info.capabilities() {'boolean indexing': True, - 'data-dependent shapes': True} + 'data-dependent shapes': True, + 'max dimensions': 64} """ return { "boolean indexing": True, "data-dependent shapes": True, - # 'max rank' will be part of the 2024.12 standard "max dimensions": 64, } @@ -102,15 +102,24 @@ def default_device(self): Returns ------- - device : str + device : Device The default device used for new PyTorch arrays. Examples -------- - >>> info = np.__array_namespace_info__() + >>> info = xp.__array_namespace_info__() >>> info.default_device() - 'cpu' + device(type='cpu') + Notes + ----- + This method returns the static default device when PyTorch is initialized. + However, the *current* device used by creation functions (``empty`` etc.) + can be changed at runtime. + + See Also + -------- + https://github.com/data-apis/array-api/issues/835 """ return torch.device("cpu") @@ -120,9 +129,9 @@ def default_dtypes(self, *, device=None): Parameters ---------- - device : str, optional - The device to get the default data types for. For PyTorch, only - ``'cpu'`` is allowed. + device : Device, optional + The device to get the default data types for. + Unused for PyTorch, as all devices use the same default dtypes. Returns ------- @@ -139,7 +148,7 @@ def default_dtypes(self, *, device=None): Examples -------- - >>> info = np.__array_namespace_info__() + >>> info = xp.__array_namespace_info__() >>> info.default_dtypes() {'real floating': torch.float32, 'complex floating': torch.complex64, @@ -250,8 +259,9 @@ def dtypes(self, *, device=None, kind=None): Parameters ---------- - device : str, optional + device : Device, optional The device to get the data types for. + Unused for PyTorch, as all devices use the same dtypes. kind : str or tuple of str, optional The kind of data types to return. If ``None``, all data types are returned. If a string, only data types of that kind are returned. @@ -287,7 +297,7 @@ def dtypes(self, *, device=None, kind=None): Examples -------- - >>> info = np.__array_namespace_info__() + >>> info = xp.__array_namespace_info__() >>> info.dtypes(kind='signed integer') {'int8': numpy.int8, 'int16': numpy.int16, @@ -310,7 +320,7 @@ def devices(self): Returns ------- - devices : list of str + devices : list[Device] The devices supported by PyTorch. See Also @@ -322,7 +332,7 @@ def devices(self): Examples -------- - >>> info = np.__array_namespace_info__() + >>> info = xp.__array_namespace_info__() >>> info.devices() [device(type='cpu'), device(type='mps', index=0), device(type='meta')] @@ -333,6 +343,7 @@ def devices(self): # device: try: torch.device('notadevice') + raise AssertionError("unreachable") # pragma: nocover except RuntimeError as e: # The error message is something like: # "Expected one of cpu, cuda, ipu, xpu, mkldnn, opengl, opencl, ideep, hip, ve, fpga, ort, xla, lazy, vulkan, mps, meta, hpu, mtia, privateuseone device type at start of device string: notadevice" diff --git a/sklearn/externals/array_api_compat/torch/_typing.py b/sklearn/externals/array_api_compat/torch/_typing.py new file mode 100644 index 0000000000000..5267087156371 --- /dev/null +++ b/sklearn/externals/array_api_compat/torch/_typing.py @@ -0,0 +1,3 @@ +__all__ = ["Array", "Device", "DType"] + +from torch import device as Device, dtype as DType, Tensor as Array diff --git a/sklearn/externals/array_api_compat/torch/fft.py b/sklearn/externals/array_api_compat/torch/fft.py index 3c9117ee57d35..50e6a0d0a3968 100644 --- a/sklearn/externals/array_api_compat/torch/fft.py +++ b/sklearn/externals/array_api_compat/torch/fft.py @@ -1,76 +1,75 @@ from __future__ import annotations -from typing import TYPE_CHECKING -if TYPE_CHECKING: - import torch - array = torch.Tensor - from typing import Union, Sequence, Literal +from typing import Union, Sequence, Literal -from torch.fft import * # noqa: F403 +import torch import torch.fft +from torch.fft import * # noqa: F403 + +from ._typing import Array # Several torch fft functions do not map axes to dim def fftn( - x: array, + x: Array, /, *, s: Sequence[int] = None, axes: Sequence[int] = None, norm: Literal["backward", "ortho", "forward"] = "backward", **kwargs, -) -> array: +) -> Array: return torch.fft.fftn(x, s=s, dim=axes, norm=norm, **kwargs) def ifftn( - x: array, + x: Array, /, *, s: Sequence[int] = None, axes: Sequence[int] = None, norm: Literal["backward", "ortho", "forward"] = "backward", **kwargs, -) -> array: +) -> Array: return torch.fft.ifftn(x, s=s, dim=axes, norm=norm, **kwargs) def rfftn( - x: array, + x: Array, /, *, s: Sequence[int] = None, axes: Sequence[int] = None, norm: Literal["backward", "ortho", "forward"] = "backward", **kwargs, -) -> array: +) -> Array: return torch.fft.rfftn(x, s=s, dim=axes, norm=norm, **kwargs) def irfftn( - x: array, + x: Array, /, *, s: Sequence[int] = None, axes: Sequence[int] = None, norm: Literal["backward", "ortho", "forward"] = "backward", **kwargs, -) -> array: +) -> Array: return torch.fft.irfftn(x, s=s, dim=axes, norm=norm, **kwargs) def fftshift( - x: array, + x: Array, /, *, axes: Union[int, Sequence[int]] = None, **kwargs, -) -> array: +) -> Array: return torch.fft.fftshift(x, dim=axes, **kwargs) def ifftshift( - x: array, + x: Array, /, *, axes: Union[int, Sequence[int]] = None, **kwargs, -) -> array: +) -> Array: return torch.fft.ifftshift(x, dim=axes, **kwargs) diff --git a/sklearn/externals/array_api_compat/torch/linalg.py b/sklearn/externals/array_api_compat/torch/linalg.py index e26198b9b562e..70d7240500ce4 100644 --- a/sklearn/externals/array_api_compat/torch/linalg.py +++ b/sklearn/externals/array_api_compat/torch/linalg.py @@ -1,14 +1,7 @@ from __future__ import annotations -from typing import TYPE_CHECKING -if TYPE_CHECKING: - import torch - array = torch.Tensor - from torch import dtype as Dtype - from typing import Optional, Union, Tuple, Literal - inf = float('inf') - -from ._aliases import _fix_promotion, sum +import torch +from typing import Optional, Union, Tuple from torch.linalg import * # noqa: F403 @@ -19,15 +12,18 @@ # outer is implemented in torch but aren't in the linalg namespace from torch import outer +from ._aliases import _fix_promotion, sum # These functions are in both the main and linalg namespaces from ._aliases import matmul, matrix_transpose, tensordot +from ._typing import Array, DType +from ..common._typing import JustInt, JustFloat # Note: torch.linalg.cross does not default to axis=-1 (it defaults to the # first axis with size 3), see https://github.com/pytorch/pytorch/issues/58743 # torch.cross also does not support broadcasting when it would add new # dimensions https://github.com/pytorch/pytorch/issues/39656 -def cross(x1: array, x2: array, /, *, axis: int = -1) -> array: +def cross(x1: Array, x2: Array, /, *, axis: int = -1) -> Array: x1, x2 = _fix_promotion(x1, x2, only_scalar=False) if not (-min(x1.ndim, x2.ndim) <= axis < max(x1.ndim, x2.ndim)): raise ValueError(f"axis {axis} out of bounds for cross product of arrays with shapes {x1.shape} and {x2.shape}") @@ -36,7 +32,7 @@ def cross(x1: array, x2: array, /, *, axis: int = -1) -> array: x1, x2 = torch.broadcast_tensors(x1, x2) return torch_linalg.cross(x1, x2, dim=axis) -def vecdot(x1: array, x2: array, /, *, axis: int = -1, **kwargs) -> array: +def vecdot(x1: Array, x2: Array, /, *, axis: int = -1, **kwargs) -> Array: from ._aliases import isdtype x1, x2 = _fix_promotion(x1, x2, only_scalar=False) @@ -58,7 +54,7 @@ def vecdot(x1: array, x2: array, /, *, axis: int = -1, **kwargs) -> array: return res[..., 0, 0] return torch.linalg.vecdot(x1, x2, dim=axis, **kwargs) -def solve(x1: array, x2: array, /, **kwargs) -> array: +def solve(x1: Array, x2: Array, /, **kwargs) -> Array: x1, x2 = _fix_promotion(x1, x2, only_scalar=False) # Torch tries to emulate NumPy 1 solve behavior by using batched 1-D solve # whenever @@ -79,19 +75,20 @@ def solve(x1: array, x2: array, /, **kwargs) -> array: return torch.linalg.solve(x1, x2, **kwargs) # torch.trace doesn't support the offset argument and doesn't support stacking -def trace(x: array, /, *, offset: int = 0, dtype: Optional[Dtype] = None) -> array: +def trace(x: Array, /, *, offset: int = 0, dtype: Optional[DType] = None) -> Array: # Use our wrapped sum to make sure it does upcasting correctly return sum(torch.diagonal(x, offset=offset, dim1=-2, dim2=-1), axis=-1, dtype=dtype) def vector_norm( - x: array, + x: Array, /, *, axis: Optional[Union[int, Tuple[int, ...]]] = None, keepdims: bool = False, - ord: Union[int, float, Literal[inf, -inf]] = 2, + # JustFloat stands for inf | -inf, which are not valid for Literal + ord: JustInt | JustFloat = 2, **kwargs, -) -> array: +) -> Array: # torch.vector_norm incorrectly treats axis=() the same as axis=None if axis == (): out = kwargs.get('out') @@ -119,3 +116,6 @@ def vector_norm( _all_ignore = ['torch_linalg', 'sum'] del linalg_all + +def __dir__() -> list[str]: + return __all__ From 18cdea75c4ac03cd4cd619fbfb293b59ba8fb9bf Mon Sep 17 00:00:00 2001 From: Adrin Jalali Date: Tue, 20 May 2025 13:44:36 +0200 Subject: [PATCH 168/182] DOC improve plot_grid_search_refit_callable.py and add links (#30990) Co-authored-by: Christian Lorentzen Co-authored-by: Olivier Grisel --- doc/whats_new/v0.20.rst | 2 +- doc/whats_new/v1.5.rst | 2 +- .../plot_grid_search_refit_callable.py | 307 ++++++++++++++++-- sklearn/model_selection/_search.py | 10 + .../_search_successive_halving.py | 36 +- 5 files changed, 322 insertions(+), 35 deletions(-) diff --git a/doc/whats_new/v0.20.rst b/doc/whats_new/v0.20.rst index 1bd4a6cd2af9a..a7d43d2d45d85 100644 --- a/doc/whats_new/v0.20.rst +++ b/doc/whats_new/v0.20.rst @@ -445,7 +445,7 @@ Miscellaneous - |API| Removed all mentions of ``sklearn.externals.joblib``, and deprecated joblib methods exposed in ``sklearn.utils``, except for - :func:`utils.parallel_backend` and :func:`utils.register_parallel_backend`, + `utils.parallel_backend` and `utils.register_parallel_backend`, which allow users to configure parallel computation in scikit-learn. Other functionalities are part of `joblib `_. package and should be used directly, by installing it. diff --git a/doc/whats_new/v1.5.rst b/doc/whats_new/v1.5.rst index 1ce5aa4839426..411a1b6b5dd95 100644 --- a/doc/whats_new/v1.5.rst +++ b/doc/whats_new/v1.5.rst @@ -656,7 +656,7 @@ Changelog - |API| :func:`utils.tosequence` is deprecated and will be removed in version 1.7. :pr:`28763` by :user:`Jérémie du Boisberranger `. -- |API| :class:`utils.parallel_backend` and :func:`utils.register_parallel_backend` are +- |API| `utils.parallel_backend` and `utils.register_parallel_backend` are deprecated and will be removed in version 1.7. Use `joblib.parallel_backend` and `joblib.register_parallel_backend` instead. :pr:`28847` by :user:`Jérémie du Boisberranger `. diff --git a/examples/model_selection/plot_grid_search_refit_callable.py b/examples/model_selection/plot_grid_search_refit_callable.py index 2b13ee5ad584c..945daf32b41ff 100644 --- a/examples/model_selection/plot_grid_search_refit_callable.py +++ b/examples/model_selection/plot_grid_search_refit_callable.py @@ -3,19 +3,20 @@ Balance model complexity and cross-validated score ================================================== -This example balances model complexity and cross-validated score by -finding a decent accuracy within 1 standard deviation of the best accuracy -score while minimising the number of PCA components [1]. +This example demonstrates how to balance model complexity and cross-validated score by +finding a decent accuracy within 1 standard deviation of the best accuracy score while +minimising the number of :class:`~sklearn.decomposition.PCA` components [1]. It uses +:class:`~sklearn.model_selection.GridSearchCV` with a custom refit callable to select +the optimal model. The figure shows the trade-off between cross-validated score and the number -of PCA components. The balanced case is when n_components=10 and accuracy=0.88, +of PCA components. The balanced case is when `n_components=10` and `accuracy=0.88`, which falls into the range within 1 standard deviation of the best accuracy score. [1] Hastie, T., Tibshirani, R.,, Friedman, J. (2001). Model Assessment and Selection. The Elements of Statistical Learning (pp. 219-260). New York, NY, USA: Springer New York Inc.. - """ # Authors: The scikit-learn developers @@ -23,12 +24,33 @@ import matplotlib.pyplot as plt import numpy as np +import polars as pl from sklearn.datasets import load_digits from sklearn.decomposition import PCA -from sklearn.model_selection import GridSearchCV +from sklearn.linear_model import LogisticRegression +from sklearn.model_selection import GridSearchCV, ShuffleSplit from sklearn.pipeline import Pipeline -from sklearn.svm import LinearSVC + +# %% +# Introduction +# ------------ +# +# When tuning hyperparameters, we often want to balance model complexity and +# performance. The "one-standard-error" rule is a common approach: select the simplest +# model whose performance is within one standard error of the best model's performance. +# This helps to avoid overfitting by preferring simpler models when their performance is +# statistically comparable to more complex ones. + +# %% +# Helper functions +# ---------------- +# +# We define two helper functions: +# 1. `lower_bound`: Calculates the threshold for acceptable performance +# (best score - 1 std) +# 2. `best_low_complexity`: Selects the model with the fewest PCA components that +# exceeds this threshold def lower_bound(cv_results): @@ -79,49 +101,280 @@ def best_low_complexity(cv_results): return best_idx +# %% +# Set up the pipeline and parameter grid +# -------------------------------------- +# +# We create a pipeline with two steps: +# 1. Dimensionality reduction using PCA +# 2. Classification using LogisticRegression +# +# We'll search over different numbers of PCA components to find the optimal complexity. + pipe = Pipeline( [ ("reduce_dim", PCA(random_state=42)), - ("classify", LinearSVC(random_state=42, C=0.01)), + ("classify", LogisticRegression(random_state=42, C=0.01, max_iter=1000)), ] ) -param_grid = {"reduce_dim__n_components": [6, 8, 10, 12, 14]} +param_grid = {"reduce_dim__n_components": [6, 8, 10, 15, 20, 25, 35, 45, 55]} + +# %% +# Perform the search with GridSearchCV +# ------------------------------------ +# +# We use `GridSearchCV` with our custom `best_low_complexity` function as the refit +# parameter. This function will select the model with the fewest PCA components that +# still performs within one standard deviation of the best model. grid = GridSearchCV( pipe, - cv=10, - n_jobs=1, + # Use a non-stratified CV strategy to make sure that the inter-fold + # standard deviation of the test scores is informative. + cv=ShuffleSplit(n_splits=30, random_state=0), + n_jobs=1, # increase this on your machine to use more physical cores param_grid=param_grid, scoring="accuracy", refit=best_low_complexity, + return_train_score=True, ) + +# %% +# Load the digits dataset and fit the model +# ----------------------------------------- + X, y = load_digits(return_X_y=True) grid.fit(X, y) +# %% +# Visualize the results +# --------------------- +# +# We'll create a bar chart showing the test scores for different numbers of PCA +# components, along with horizontal lines indicating the best score and the +# one-standard-deviation threshold. + n_components = grid.cv_results_["param_reduce_dim__n_components"] test_scores = grid.cv_results_["mean_test_score"] -plt.figure() -plt.bar(n_components, test_scores, width=1.3, color="b") +# Create a polars DataFrame for better data manipulation and visualization +results_df = pl.DataFrame( + { + "n_components": n_components, + "mean_test_score": test_scores, + "std_test_score": grid.cv_results_["std_test_score"], + "mean_train_score": grid.cv_results_["mean_train_score"], + "std_train_score": grid.cv_results_["std_train_score"], + "mean_fit_time": grid.cv_results_["mean_fit_time"], + "rank_test_score": grid.cv_results_["rank_test_score"], + } +) -lower = lower_bound(grid.cv_results_) -plt.axhline(np.max(test_scores), linestyle="--", color="y", label="Best score") -plt.axhline(lower, linestyle="--", color=".5", label="Best score - 1 std") +# Sort by number of components +results_df = results_df.sort("n_components") -plt.title("Balance model complexity and cross-validated score") -plt.xlabel("Number of PCA components used") -plt.ylabel("Digit classification accuracy") -plt.xticks(n_components.tolist()) -plt.ylim((0, 1.0)) -plt.legend(loc="upper left") +# Calculate the lower bound threshold +lower = lower_bound(grid.cv_results_) +# Get the best model information best_index_ = grid.best_index_ +best_components = n_components[best_index_] +best_score = grid.cv_results_["mean_test_score"][best_index_] + +# Add a column to mark the selected model +results_df = results_df.with_columns( + pl.when(pl.col("n_components") == best_components) + .then(pl.lit("Selected")) + .otherwise(pl.lit("Regular")) + .alias("model_type") +) + +# Get the number of CV splits from the results +n_splits = sum( + 1 + for key in grid.cv_results_.keys() + if key.startswith("split") and key.endswith("test_score") +) + +# Extract individual scores for each split +test_scores = np.array( + [ + [grid.cv_results_[f"split{i}_test_score"][j] for i in range(n_splits)] + for j in range(len(n_components)) + ] +) +train_scores = np.array( + [ + [grid.cv_results_[f"split{i}_train_score"][j] for i in range(n_splits)] + for j in range(len(n_components)) + ] +) + +# Calculate mean and std of test scores +mean_test_scores = np.mean(test_scores, axis=1) +std_test_scores = np.std(test_scores, axis=1) + +# Find best score and threshold +best_mean_score = np.max(mean_test_scores) +threshold = best_mean_score - std_test_scores[np.argmax(mean_test_scores)] + +# Create a single figure for visualization +fig, ax = plt.subplots(figsize=(12, 8)) -print("The best_index_ is %d" % best_index_) -print("The n_components selected is %d" % n_components[best_index_]) -print( - "The corresponding accuracy score is %.2f" - % grid.cv_results_["mean_test_score"][best_index_] +# Plot individual points +for i, comp in enumerate(n_components): + # Plot individual test points + plt.scatter( + [comp] * n_splits, + test_scores[i], + alpha=0.2, + color="blue", + s=20, + label="Individual test scores" if i == 0 else "", + ) + # Plot individual train points + plt.scatter( + [comp] * n_splits, + train_scores[i], + alpha=0.2, + color="green", + s=20, + label="Individual train scores" if i == 0 else "", + ) + +# Plot mean lines with error bands +plt.plot( + n_components, + np.mean(test_scores, axis=1), + "-", + color="blue", + linewidth=2, + label="Mean test score", +) +plt.fill_between( + n_components, + np.mean(test_scores, axis=1) - np.std(test_scores, axis=1), + np.mean(test_scores, axis=1) + np.std(test_scores, axis=1), + alpha=0.15, + color="blue", +) + +plt.plot( + n_components, + np.mean(train_scores, axis=1), + "-", + color="green", + linewidth=2, + label="Mean train score", +) +plt.fill_between( + n_components, + np.mean(train_scores, axis=1) - np.std(train_scores, axis=1), + np.mean(train_scores, axis=1) + np.std(train_scores, axis=1), + alpha=0.15, + color="green", ) + +# Add threshold lines +plt.axhline( + best_mean_score, + color="#9b59b6", # Purple + linestyle="--", + label="Best score", + linewidth=2, +) +plt.axhline( + threshold, + color="#e67e22", # Orange + linestyle="--", + label="Best score - 1 std", + linewidth=2, +) + +# Highlight selected model +plt.axvline( + best_components, + color="#9b59b6", # Purple + alpha=0.2, + linewidth=8, + label="Selected model", +) + +# Set titles and labels +plt.xlabel("Number of PCA components", fontsize=12) +plt.ylabel("Score", fontsize=12) +plt.title("Model Selection: Balancing Complexity and Performance", fontsize=14) +plt.grid(True, linestyle="--", alpha=0.7) +plt.legend( + bbox_to_anchor=(1.02, 1), + loc="upper left", + borderaxespad=0, +) + +# Set axis properties +plt.xticks(n_components) +plt.ylim((0.85, 1.0)) + +# # Adjust layout +plt.tight_layout() + +# %% +# Print the results +# ----------------- +# +# We print information about the selected model, including its complexity and +# performance. We also show a summary table of all models using polars. + +print("Best model selected by the one-standard-error rule:") +print(f"Number of PCA components: {best_components}") +print(f"Accuracy score: {best_score:.4f}") +print(f"Best possible accuracy: {np.max(test_scores):.4f}") +print(f"Accuracy threshold (best - 1 std): {lower:.4f}") + +# Create a summary table with polars +summary_df = results_df.select( + pl.col("n_components"), + pl.col("mean_test_score").round(4).alias("test_score"), + pl.col("std_test_score").round(4).alias("test_std"), + pl.col("mean_train_score").round(4).alias("train_score"), + pl.col("std_train_score").round(4).alias("train_std"), + pl.col("mean_fit_time").round(3).alias("fit_time"), + pl.col("rank_test_score").alias("rank"), +) + +# Add a column to mark the selected model +summary_df = summary_df.with_columns( + pl.when(pl.col("n_components") == best_components) + .then(pl.lit("*")) + .otherwise(pl.lit("")) + .alias("selected") +) + +print("\nModel comparison table:") +print(summary_df) + +# %% +# Conclusion +# ---------- +# +# The one-standard-error rule helps us select a simpler model (fewer PCA components) +# while maintaining performance statistically comparable to the best model. +# This approach can help prevent overfitting and improve model interpretability +# and efficiency. +# +# In this example, we've seen how to implement this rule using a custom refit +# callable with :class:`~sklearn.model_selection.GridSearchCV`. +# +# Key takeaways: +# 1. The one-standard-error rule provides a good rule of thumb to select simpler models +# 2. Custom refit callables in :class:`~sklearn.model_selection.GridSearchCV` allow for +# flexible model selection strategies +# 3. Visualizing both train and test scores helps identify potential overfitting +# +# This approach can be applied to other model selection scenarios where balancing +# complexity and performance is important, or in cases where a use-case specific +# selection of the "best" model is desired. + +# Display the figure plt.show() diff --git a/sklearn/model_selection/_search.py b/sklearn/model_selection/_search.py index aeeffc1b83148..1556472037c5f 100644 --- a/sklearn/model_selection/_search.py +++ b/sklearn/model_selection/_search.py @@ -1328,6 +1328,11 @@ class GridSearchCV(BaseSearchCV): to see how to design a custom selection strategy using a callable via `refit`. + See :ref:`this example + ` + for an example of how to use ``refit=callable`` to balance model + complexity and cross-validated score. + .. versionchanged:: 0.20 Support for callable added. @@ -1704,6 +1709,11 @@ class RandomizedSearchCV(BaseSearchCV): See ``scoring`` parameter to know more about multiple metric evaluation. + See :ref:`this example + ` + for an example of how to use ``refit=callable`` to balance model + complexity and cross-validated score. + .. versionchanged:: 0.20 Support for callable added. diff --git a/sklearn/model_selection/_search_successive_halving.py b/sklearn/model_selection/_search_successive_halving.py index da608e2bdc6f2..bcd9a83e6dc43 100644 --- a/sklearn/model_selection/_search_successive_halving.py +++ b/sklearn/model_selection/_search_successive_halving.py @@ -487,14 +487,26 @@ class HalvingGridSearchCV(BaseSuccessiveHalving): - `None`: the `estimator`'s :ref:`default evaluation criterion ` is used. - refit : bool, default=True - If True, refit an estimator using the best found parameters on the - whole dataset. + refit : bool or callable, default=True + Refit an estimator using the best found parameters on the whole + dataset. + + Where there are considerations other than maximum score in + choosing a best estimator, ``refit`` can be set to a function which + returns the selected ``best_index_`` given ``cv_results_``. In that + case, the ``best_estimator_`` and ``best_params_`` will be set + according to the returned ``best_index_`` while the ``best_score_`` + attribute will not be available. The refitted estimator is made available at the ``best_estimator_`` attribute and permits using ``predict`` directly on this ``HalvingGridSearchCV`` instance. + See :ref:`this example + ` + for an example of how to use ``refit=callable`` to balance model + complexity and cross-validated score. + error_score : 'raise' or numeric Value to assign to the score if an error occurs in estimator fitting. If set to 'raise', the error is raised. If a numeric value is given, @@ -832,14 +844,26 @@ class HalvingRandomSearchCV(BaseSuccessiveHalving): - `None`: the `estimator`'s :ref:`default evaluation criterion ` is used. - refit : bool, default=True - If True, refit an estimator using the best found parameters on the - whole dataset. + refit : bool or callable, default=True + Refit an estimator using the best found parameters on the whole + dataset. + + Where there are considerations other than maximum score in + choosing a best estimator, ``refit`` can be set to a function which + returns the selected ``best_index_`` given ``cv_results_``. In that + case, the ``best_estimator_`` and ``best_params_`` will be set + according to the returned ``best_index_`` while the ``best_score_`` + attribute will not be available. The refitted estimator is made available at the ``best_estimator_`` attribute and permits using ``predict`` directly on this ``HalvingRandomSearchCV`` instance. + See :ref:`this example + ` + for an example of how to use ``refit=callable`` to balance model + complexity and cross-validated score. + error_score : 'raise' or numeric Value to assign to the score if an error occurs in estimator fitting. If set to 'raise', the error is raised. If a numeric value is given, From 59085e5a33bcd92a8b985bf7fd9a2973855e0d8e Mon Sep 17 00:00:00 2001 From: scikit-learn-bot Date: Tue, 20 May 2025 13:52:36 +0200 Subject: [PATCH 169/182] :lock: :robot: CI Update lock files for main CI build(s) :lock: :robot: (#31386) Co-authored-by: Lock file bot --- build_tools/azure/debian_32bit_lock.txt | 2 +- ...latest_conda_forge_mkl_linux-64_conda.lock | 57 ++++++++++--------- ...pylatest_conda_forge_mkl_osx-64_conda.lock | 16 +++--- ...st_pip_openblas_pandas_linux-64_conda.lock | 4 +- .../pymin_conda_forge_mkl_win-64_conda.lock | 22 +++---- ...nblas_min_dependencies_linux-64_conda.lock | 24 ++++---- ...e_openblas_ubuntu_2204_linux-64_conda.lock | 10 ++-- build_tools/azure/ubuntu_atlas_lock.txt | 2 +- build_tools/circle/doc_linux-64_conda.lock | 48 ++++++++-------- .../doc_min_dependencies_linux-64_conda.lock | 28 +++++---- ...n_conda_forge_arm_linux-aarch64_conda.lock | 26 ++++----- 11 files changed, 118 insertions(+), 121 deletions(-) diff --git a/build_tools/azure/debian_32bit_lock.txt b/build_tools/azure/debian_32bit_lock.txt index 983c730d920fd..c0a25641cc589 100644 --- a/build_tools/azure/debian_32bit_lock.txt +++ b/build_tools/azure/debian_32bit_lock.txt @@ -23,7 +23,7 @@ packaging==25.0 # meson-python # pyproject-metadata # pytest -pluggy==1.5.0 +pluggy==1.6.0 # via pytest pyproject-metadata==0.9.1 # via meson-python diff --git a/build_tools/azure/pylatest_conda_forge_mkl_linux-64_conda.lock b/build_tools/azure/pylatest_conda_forge_mkl_linux-64_conda.lock index 67a9fef5b21a8..ee1762223730b 100644 --- a/build_tools/azure/pylatest_conda_forge_mkl_linux-64_conda.lock +++ b/build_tools/azure/pylatest_conda_forge_mkl_linux-64_conda.lock @@ -15,17 +15,17 @@ https://conda.anaconda.org/conda-forge/noarch/ca-certificates-2025.4.26-hbd8a1cb https://conda.anaconda.org/conda-forge/noarch/fonts-conda-forge-1-0.tar.bz2#f766549260d6815b0c52253f1fb1bb29 https://conda.anaconda.org/conda-forge/linux-64/ld_impl_linux-64-2.43-h712a8e2_4.conda#01f8d123c96816249efd255a31ad7712 https://conda.anaconda.org/conda-forge/linux-64/libglvnd-1.7.0-ha4b6fd6_2.conda#434ca7e50e40f4918ab701e3facd59a0 -https://conda.anaconda.org/conda-forge/linux-64/llvm-openmp-20.1.4-h024ca30_0.conda#4fc395cda27912a7d904b86b5dbf3a4d +https://conda.anaconda.org/conda-forge/linux-64/llvm-openmp-20.1.5-h024ca30_0.conda#86f58be65a51d62ccc06cacfd83ff987 https://conda.anaconda.org/conda-forge/linux-64/_openmp_mutex-4.5-3_kmp_llvm.conda#ee5c2118262e30b972bc0b4db8ef0ba5 https://conda.anaconda.org/conda-forge/noarch/fonts-conda-ecosystem-1-0.tar.bz2#fee5683a3f04bd15cbd8318b096a27ab https://conda.anaconda.org/conda-forge/linux-64/libegl-1.7.0-ha4b6fd6_2.conda#c151d5eb730e9b7480e6d48c0fc44048 https://conda.anaconda.org/conda-forge/linux-64/libopengl-1.7.0-ha4b6fd6_2.conda#7df50d44d4a14d6c31a2c54f2cd92157 https://conda.anaconda.org/conda-forge/linux-64/libgcc-15.1.0-h767d61c_2.conda#ea8ac52380885ed41c1baa8f1d6d2b93 https://conda.anaconda.org/conda-forge/linux-64/alsa-lib-1.2.14-hb9d3cd8_0.conda#76df83c2a9035c54df5d04ff81bcc02d -https://conda.anaconda.org/conda-forge/linux-64/aws-c-common-0.12.2-hb9d3cd8_0.conda#bd52f376d1d34d7823a7bf0773be86e8 +https://conda.anaconda.org/conda-forge/linux-64/aws-c-common-0.12.3-hb9d3cd8_0.conda#8448031a22c697fac3ed98d69e8a9160 https://conda.anaconda.org/conda-forge/linux-64/c-ares-1.34.5-hb9d3cd8_0.conda#f7f0d6cc2dc986d42ac2689ec88192be https://conda.anaconda.org/conda-forge/linux-64/libbrotlicommon-1.1.0-hb9d3cd8_2.conda#41b599ed2b02abcfdd84302bff174b23 -https://conda.anaconda.org/conda-forge/linux-64/libdeflate-1.23-h86f0d12_0.conda#27fe770decaf469a53f3e3a6d593067f +https://conda.anaconda.org/conda-forge/linux-64/libdeflate-1.24-h86f0d12_0.conda#64f0c503da58ec25ebd359e4d990afa8 https://conda.anaconda.org/conda-forge/linux-64/libexpat-2.7.0-h5888daf_0.conda#db0bfbe7dd197b68ad5f30333bae6ce0 https://conda.anaconda.org/conda-forge/linux-64/libffi-3.4.6-h2dba641_1.conda#ede4673863426c0883c0063d853bbd85 https://conda.anaconda.org/conda-forge/linux-64/libgcc-ng-15.1.0-h69a702a_2.conda#ddca86c7040dd0e73b2b69bd7833d225 @@ -45,10 +45,10 @@ https://conda.anaconda.org/conda-forge/linux-64/pthread-stubs-0.4-hb9d3cd8_1002. https://conda.anaconda.org/conda-forge/linux-64/xorg-libice-1.1.2-hb9d3cd8_0.conda#fb901ff28063514abb6046c9ec2c4a45 https://conda.anaconda.org/conda-forge/linux-64/xorg-libxau-1.0.12-hb9d3cd8_0.conda#f6ebe2cb3f82ba6c057dde5d9debe4f7 https://conda.anaconda.org/conda-forge/linux-64/xorg-libxdmcp-1.1.5-hb9d3cd8_0.conda#8035c64cb77ed555e3f150b7b3972480 -https://conda.anaconda.org/conda-forge/linux-64/aws-c-cal-0.9.0-hada3f3f_0.conda#05a965f6def53dbcb5217945eb0b3689 -https://conda.anaconda.org/conda-forge/linux-64/aws-c-compression-0.3.1-hc2d532b_4.conda#4cc4dcd582b2f087d62c70b2d6daa59f -https://conda.anaconda.org/conda-forge/linux-64/aws-c-sdkutils-0.2.3-hc2d532b_4.conda#15a1f6fb713b4cd3fee74588b996a846 -https://conda.anaconda.org/conda-forge/linux-64/aws-checksums-0.2.7-hc2d532b_0.conda#398521f53e58db246658e7cff56d669f +https://conda.anaconda.org/conda-forge/linux-64/aws-c-cal-0.9.0-h5e3027f_1.conda#220588a5c6c9341a39d9e399848e5554 +https://conda.anaconda.org/conda-forge/linux-64/aws-c-compression-0.3.1-hafb2847_5.conda#e96cc668c0f9478f5771b37d57f90386 +https://conda.anaconda.org/conda-forge/linux-64/aws-c-sdkutils-0.2.3-hafb2847_5.conda#51ffa5a303e8256dcb176f14d78887b4 +https://conda.anaconda.org/conda-forge/linux-64/aws-checksums-0.2.7-hafb2847_1.conda#6d28d50637fac4f081a0903b4b33d56d https://conda.anaconda.org/conda-forge/linux-64/bzip2-1.0.8-h4bc722e_7.conda#62ee74e96c5ebb0af99386de58cf9553 https://conda.anaconda.org/conda-forge/linux-64/double-conversion-3.3.1-h5888daf_0.conda#bfd56492d8346d669010eccafe0ba058 https://conda.anaconda.org/conda-forge/linux-64/expat-2.7.0-h5888daf_0.conda#d6845ae4dea52a2f90178bf1829a21f8 @@ -81,7 +81,7 @@ https://conda.anaconda.org/conda-forge/linux-64/tk-8.6.13-noxft_h4845f30_101.con https://conda.anaconda.org/conda-forge/linux-64/wayland-1.23.1-h3e06ad9_1.conda#a37843723437ba75f42c9270ffe800b1 https://conda.anaconda.org/conda-forge/linux-64/zlib-1.3.1-hb9d3cd8_2.conda#c9f075ab2f33b3bbee9e62d4ad0a6cd8 https://conda.anaconda.org/conda-forge/linux-64/zstd-1.5.7-hb8e6e7a_2.conda#6432cb5d4ac0046c3ac0a8a0f95842f9 -https://conda.anaconda.org/conda-forge/linux-64/aws-c-io-0.19.0-h756d8c7_1.conda#35ffc73105ad0bdb8e5c2555f4a3c5d6 +https://conda.anaconda.org/conda-forge/linux-64/aws-c-io-0.19.0-h7962f60_2.conda#7a4be9867bab106d87febec673094a9e https://conda.anaconda.org/conda-forge/linux-64/brotli-bin-1.1.0-hb9d3cd8_2.conda#c63b5e52939e795ba8d26e35d767a843 https://conda.anaconda.org/conda-forge/linux-64/glog-0.7.1-hbabe93e_0.conda#ff862eebdfeb2fd048ae9dc92510baca https://conda.anaconda.org/conda-forge/linux-64/gmp-6.3.0-hac33072_2.conda#c94a5994ef49749880a8139cf9afcbe1 @@ -96,8 +96,8 @@ https://conda.anaconda.org/conda-forge/linux-64/libnghttp2-1.64.0-h161d5f1_0.con https://conda.anaconda.org/conda-forge/linux-64/libprotobuf-5.29.3-h501fc15_1.conda#edb86556cf4a0c133e7932a1597ff236 https://conda.anaconda.org/conda-forge/linux-64/libre2-11-2024.07.02-hba17884_3.conda#545e93a513c10603327c76c15485e946 https://conda.anaconda.org/conda-forge/linux-64/libthrift-0.21.0-h0e7cc3e_0.conda#dcb95c0a98ba9ff737f7ae482aef7833 -https://conda.anaconda.org/conda-forge/linux-64/libtiff-4.7.0-hd9ff511_4.conda#6c1028898cf3a2032d9af46689e1b81a -https://conda.anaconda.org/conda-forge/linux-64/pcre2-10.44-hc749103_2.conda#31614c73d7b103ef76faa4d83d261d34 +https://conda.anaconda.org/conda-forge/linux-64/libtiff-4.7.0-hf01ce69_5.conda#e79a094918988bb1807462cd42c83962 +https://conda.anaconda.org/conda-forge/linux-64/pcre2-10.45-hc749103_0.conda#b90bece58b4c2bf25969b70f3be42d25 https://conda.anaconda.org/conda-forge/linux-64/python-3.13.3-hf636f53_101_cp313.conda#10622e12d649154af0bd76bcf33a7c5c https://conda.anaconda.org/conda-forge/linux-64/qhull-2020.2-h434a139_5.conda#353823361b1d27eb3960efb076dfcaf6 https://conda.anaconda.org/conda-forge/linux-64/xcb-util-0.4.1-hb711507_2.conda#8637c3e5821654d0edf97e2b0404b443 @@ -106,14 +106,14 @@ https://conda.anaconda.org/conda-forge/linux-64/xcb-util-renderutil-0.3.10-hb711 https://conda.anaconda.org/conda-forge/linux-64/xcb-util-wm-0.4.2-hb711507_0.conda#608e0ef8256b81d04456e8d211eee3e8 https://conda.anaconda.org/conda-forge/linux-64/xorg-libsm-1.2.6-he73a12e_0.conda#1c74ff8c35dcadf952a16f752ca5aa49 https://conda.anaconda.org/conda-forge/linux-64/xorg-libx11-1.8.12-h4f16b4b_0.conda#db038ce880f100acc74dba10302b5630 -https://conda.anaconda.org/conda-forge/linux-64/aws-c-event-stream-0.5.4-h9312af0_8.conda#32789e527d9a9ca6fd71f463df708188 -https://conda.anaconda.org/conda-forge/linux-64/aws-c-http-0.10.1-hc373b34_0.conda#ce674c8395070748d89f0f907a6caa59 +https://conda.anaconda.org/conda-forge/linux-64/aws-c-event-stream-0.5.4-h2dcaabb_9.conda#2f2ffcdfeabac698297fce1259e51a2a +https://conda.anaconda.org/conda-forge/linux-64/aws-c-http-0.10.1-hb50fa74_1.conda#2bb746bfe603e4949d99404b25c639ea https://conda.anaconda.org/conda-forge/linux-64/brotli-1.1.0-hb9d3cd8_2.conda#98514fe74548d768907ce7a13f680e8f https://conda.anaconda.org/conda-forge/noarch/colorama-0.4.6-pyhd8ed1ab_1.conda#962b9857ee8e7018c22f2776ffa0b2d7 https://conda.anaconda.org/conda-forge/noarch/cpython-3.13.3-py313hd8ed1ab_101.conda#904a822cbd380adafb9070debf8579a8 https://conda.anaconda.org/conda-forge/noarch/cycler-0.12.1-pyhd8ed1ab_1.conda#44600c4667a319d67dbe0681fc0bc833 https://conda.anaconda.org/conda-forge/linux-64/cyrus-sasl-2.1.27-h54b06d7_7.conda#dce22f70b4e5a407ce88f2be046f4ceb -https://conda.anaconda.org/conda-forge/linux-64/cython-3.1.0-py313h5dec8f5_0.conda#43ede3c67f0001ebc9dbf9a5e5e2b218 +https://conda.anaconda.org/conda-forge/linux-64/cython-3.1.0-py313h5dec8f5_1.conda#43ad5286d089949501cf07064693d070 https://conda.anaconda.org/conda-forge/noarch/execnet-2.1.1-pyhd8ed1ab_1.conda#a71efeae2c160f6789900ba2631a2c90 https://conda.anaconda.org/conda-forge/noarch/filelock-3.18.0-pyhd8ed1ab_0.conda#4547b39256e296bb758166893e909a7c https://conda.anaconda.org/conda-forge/noarch/fsspec-2025.3.2-pyhd8ed1ab_0.conda#9c40692c3d24c7aaf335f673ac09d308 @@ -123,7 +123,7 @@ https://conda.anaconda.org/conda-forge/linux-64/lcms2-2.17-h717163a_0.conda#000e https://conda.anaconda.org/conda-forge/linux-64/libcups-2.3.3-h4637d8d_4.conda#d4529f4dff3057982a7617c7ac58fde3 https://conda.anaconda.org/conda-forge/linux-64/libcurl-8.13.0-h332b0f4_0.conda#cbdc92ac0d93fe3c796e36ad65c7905c https://conda.anaconda.org/conda-forge/linux-64/libfreetype-2.13.3-ha770c72_1.conda#51f5be229d83ecd401fb369ab96ae669 -https://conda.anaconda.org/conda-forge/linux-64/libglib-2.84.1-h2ff4ddf_0.conda#0305434da649d4fb48a425e588b79ea6 +https://conda.anaconda.org/conda-forge/linux-64/libglib-2.84.1-h3618099_1.conda#714c97d4ff495ab69d1fdfcadbcae985 https://conda.anaconda.org/conda-forge/linux-64/libglx-1.7.0-ha4b6fd6_2.conda#c8013e438185f33b13814c5c488acd5c https://conda.anaconda.org/conda-forge/linux-64/libhiredis-1.0.2-h2cc385e_0.tar.bz2#b34907d3a81a3cd8095ee83d174c074a https://conda.anaconda.org/conda-forge/linux-64/libxml2-2.13.8-h4bc477f_0.conda#14dbe05b929e329dbaa6f2d0aa19466d @@ -137,7 +137,7 @@ https://conda.anaconda.org/conda-forge/linux-64/openjpeg-2.5.3-h5fbd93e_0.conda# https://conda.anaconda.org/conda-forge/linux-64/orc-2.1.2-h17f744e_0.conda#ef7f9897a244b2023a066c22a1089ce4 https://conda.anaconda.org/conda-forge/noarch/packaging-25.0-pyh29332c3_1.conda#58335b26c38bf4a20f399384c33cbcf9 https://conda.anaconda.org/conda-forge/noarch/pip-25.1.1-pyh145f28c_0.conda#01384ff1639c6330a0924791413b8714 -https://conda.anaconda.org/conda-forge/noarch/pluggy-1.5.0-pyhd8ed1ab_1.conda#e9dcbce5f45f9ee500e728ae58b605b6 +https://conda.anaconda.org/conda-forge/noarch/pluggy-1.6.0-pyhd8ed1ab_0.conda#7da7ccd349dbf6487a7778579d2bb971 https://conda.anaconda.org/conda-forge/noarch/pybind11-global-2.13.6-pyh415d2e4_2.conda#120541563e520d12d8e39abd7de9092c https://conda.anaconda.org/conda-forge/noarch/pyparsing-3.2.3-pyhd8ed1ab_1.conda#513d3c262ee49b54a8fec85c5bc99764 https://conda.anaconda.org/conda-forge/noarch/python-tzdata-2025.2-pyhd8ed1ab_0.conda#88476ae6ebd24f39261e0854ac244f33 @@ -148,15 +148,15 @@ https://conda.anaconda.org/conda-forge/noarch/six-1.17.0-pyhd8ed1ab_0.conda#a451 https://conda.anaconda.org/conda-forge/noarch/threadpoolctl-3.6.0-pyhecae5ae_0.conda#9d64911b31d57ca443e9f1e36b04385f https://conda.anaconda.org/conda-forge/noarch/toml-0.10.2-pyhd8ed1ab_1.conda#b0dd904de08b7db706167240bf37b164 https://conda.anaconda.org/conda-forge/noarch/tomli-2.2.1-pyhd8ed1ab_1.conda#ac944244f1fed2eb49bae07193ae8215 -https://conda.anaconda.org/conda-forge/linux-64/tornado-6.4.2-py313h536fd9c_0.conda#5f5cbdd527d2e74e270d8b6255ba714f +https://conda.anaconda.org/conda-forge/linux-64/tornado-6.5-py313h536fd9c_0.conda#922c4f97a250416414fc393acf5fe53c https://conda.anaconda.org/conda-forge/noarch/typing_extensions-4.13.2-pyh29332c3_0.conda#83fc6ae00127671e301c9f44254c31b8 https://conda.anaconda.org/conda-forge/linux-64/xcb-util-image-0.4.0-hb711507_2.conda#a0901183f08b6c7107aab109733a3c91 https://conda.anaconda.org/conda-forge/linux-64/xkeyboard-config-2.44-hb9d3cd8_0.conda#7c91bfc90672888259675ad2ad28af9c https://conda.anaconda.org/conda-forge/linux-64/xorg-libxext-1.3.6-hb9d3cd8_0.conda#febbab7d15033c913d53c7a2c102309d https://conda.anaconda.org/conda-forge/linux-64/xorg-libxfixes-6.0.1-hb9d3cd8_0.conda#4bdb303603e9821baf5fe5fdff1dc8f8 https://conda.anaconda.org/conda-forge/linux-64/xorg-libxrender-0.9.12-hb9d3cd8_0.conda#96d57aba173e878a2089d5638016dc5e -https://conda.anaconda.org/conda-forge/linux-64/aws-c-auth-0.9.0-h66f1c83_6.conda#08e6c1487ed4a40ee2771c760020bdf4 -https://conda.anaconda.org/conda-forge/linux-64/aws-c-mqtt-0.13.0-h034c9a0_2.conda#c5fe6225b205100049d90afbfc000dd1 +https://conda.anaconda.org/conda-forge/linux-64/aws-c-auth-0.9.0-h59ae206_7.conda#ca157ee18f02c33646d975995631b39e +https://conda.anaconda.org/conda-forge/linux-64/aws-c-mqtt-0.13.0-h35de22e_3.conda#df3ea458761b3fdf9e6eb7d8a38c121a https://conda.anaconda.org/conda-forge/linux-64/azure-core-cpp-1.14.0-h5cfcd09_0.conda#0a8838771cc2e985cd295e01ae83baf1 https://conda.anaconda.org/conda-forge/linux-64/ccache-4.11.3-h80c52d3_0.conda#eb517c6a2b960c3ccb6f1db1005f063a https://conda.anaconda.org/conda-forge/linux-64/coverage-7.8.0-py313h8060acc_0.conda#375064d30e709bf7c1d4580e70aaea61 @@ -169,7 +169,7 @@ https://conda.anaconda.org/conda-forge/noarch/joblib-1.5.0-pyhd8ed1ab_0.conda#3d https://conda.anaconda.org/conda-forge/linux-64/libgl-1.7.0-ha4b6fd6_2.conda#928b8be80851f5d8ffb016f9c81dae7a https://conda.anaconda.org/conda-forge/linux-64/libgrpc-1.71.0-h8e591d7_1.conda#c3cfd72cbb14113abee7bbd86f44ad69 https://conda.anaconda.org/conda-forge/linux-64/libhwloc-2.11.2-default_h0d58e46_1001.conda#804ca9e91bcaea0824a341d55b1684f2 -https://conda.anaconda.org/conda-forge/linux-64/libllvm20-20.1.4-he9d0ab4_0.conda#96c33bbd084ef2b2463503fb7f1482ae +https://conda.anaconda.org/conda-forge/linux-64/libllvm20-20.1.5-he9d0ab4_0.conda#8d2f5a2f019bd76ccba5eb771852d411 https://conda.anaconda.org/conda-forge/linux-64/libxkbcommon-1.9.2-h65c71a3_0.conda#d045b1d878031eb497cab44e6392b1df https://conda.anaconda.org/conda-forge/linux-64/libxslt-1.1.39-h76b75d6_0.conda#e71f31f8cfb0a91439f2086fc8aa0461 https://conda.anaconda.org/conda-forge/linux-64/mpc-1.3.1-h24ddda3_1.conda#aa14b9a5196a6d8dd364164b7ce56acf @@ -189,13 +189,13 @@ https://conda.anaconda.org/conda-forge/linux-64/xorg-libxi-1.8.2-hb9d3cd8_0.cond https://conda.anaconda.org/conda-forge/linux-64/xorg-libxrandr-1.5.4-hb9d3cd8_0.conda#2de7f99d6581a4a7adbff607b5c278ca https://conda.anaconda.org/conda-forge/linux-64/xorg-libxxf86vm-1.1.6-hb9d3cd8_0.conda#5efa5fa6243a622445fdfd72aee15efa https://conda.anaconda.org/conda-forge/noarch/_python_abi3_support-1.0-hd8ed1ab_2.conda#aaa2a381ccc56eac91d63b6c1240312f -https://conda.anaconda.org/conda-forge/linux-64/aws-c-s3-0.7.17-h73c4702_1.conda#7283d4d0d39d97dcb5ef06412375478f +https://conda.anaconda.org/conda-forge/linux-64/aws-c-s3-0.7.17-h50d7d24_2.conda#701bf42db0ec5de1e56b66ae0638d20b https://conda.anaconda.org/conda-forge/linux-64/azure-identity-cpp-1.10.0-h113e628_0.conda#73f73f60854f325a55f1d31459f2ab73 https://conda.anaconda.org/conda-forge/linux-64/azure-storage-common-cpp-12.8.0-h736e048_1.conda#13de36be8de3ae3f05ba127631599213 https://conda.anaconda.org/conda-forge/linux-64/fontconfig-2.15.0-h7e30c49_1.conda#8f5b0b297b59e1ac160ad4beec99dbee https://conda.anaconda.org/conda-forge/linux-64/gmpy2-2.2.1-py313h11186cd_0.conda#54d020e0eaacf1e99bfb2410b9aa2e5e -https://conda.anaconda.org/conda-forge/linux-64/libclang-cpp20.1-20.1.4-default_h1df26ce_0.conda#96f8d5b2e94c9ba4fef19f1adf068a15 -https://conda.anaconda.org/conda-forge/linux-64/libclang13-20.1.4-default_he06ed0a_0.conda#2d933632c8004be47deb2be61bf013be +https://conda.anaconda.org/conda-forge/linux-64/libclang-cpp20.1-20.1.5-default_h1df26ce_0.conda#79a1be1cd92a7f2b62e6c0a7c2da8bf8 +https://conda.anaconda.org/conda-forge/linux-64/libclang13-20.1.5-default_he06ed0a_0.conda#9a912cce23df3fea9d2adb75e505b153 https://conda.anaconda.org/conda-forge/linux-64/libgoogle-cloud-2.36.0-hc4361e1_1.conda#ae36e6296a8dd8e8a9a8375965bf6398 https://conda.anaconda.org/conda-forge/linux-64/libopentelemetry-cpp-1.20.0-hd1b1c89_0.conda#e1185384cc23e3bbf85486987835df94 https://conda.anaconda.org/conda-forge/linux-64/libpq-17.5-h27ae623_0.conda#6458be24f09e1b034902ab44fe9de908 @@ -204,7 +204,7 @@ https://conda.anaconda.org/conda-forge/linux-64/optree-0.15.0-py313h33d0bda_0.co https://conda.anaconda.org/conda-forge/noarch/pytest-8.3.5-pyhd8ed1ab_0.conda#c3c9316209dec74a705a36797970c6be https://conda.anaconda.org/conda-forge/linux-64/tbb-2021.13.0-hceb3a55_1.conda#ba7726b8df7b9d34ea80e82b097a4893 https://conda.anaconda.org/conda-forge/linux-64/xorg-libxtst-1.2.5-hb9d3cd8_3.conda#7bbe9a0cc0df0ac5f5a8ad6d6a11af2f -https://conda.anaconda.org/conda-forge/linux-64/aws-crt-cpp-0.32.5-h5e5e39d_2.conda#70ae8529a42baa6fdac9e037b6ccc0c3 +https://conda.anaconda.org/conda-forge/linux-64/aws-crt-cpp-0.32.5-h2811929_3.conda#c38733af13b256b8893a6af0d2a1d346 https://conda.anaconda.org/conda-forge/linux-64/azure-storage-blobs-cpp-12.13.0-h3cf044e_1.conda#7eb66060455c7a47d9dcdbfa9f46579b https://conda.anaconda.org/conda-forge/linux-64/cairo-1.18.4-h3394656_0.conda#09262e66b19567aff4f592fb53b28760 https://conda.anaconda.org/conda-forge/linux-64/libgoogle-cloud-storage-2.36.0-h0121fbd_1.conda#a0f7588c1f0a26d550e7bae4fb49427a @@ -212,20 +212,20 @@ https://conda.anaconda.org/conda-forge/linux-64/mkl-2024.2.2-ha957f24_16.conda#1 https://conda.anaconda.org/conda-forge/noarch/pytest-cov-6.1.1-pyhd8ed1ab_0.conda#1e35d8f975bc0e984a19819aa91c440a https://conda.anaconda.org/conda-forge/noarch/pytest-xdist-3.6.1-pyhd8ed1ab_1.conda#59aad4fb37cabc0bacc73cf344612ddd https://conda.anaconda.org/conda-forge/noarch/sympy-1.14.0-pyh2585a3b_105.conda#8c09fac3785696e1c477156192d64b91 -https://conda.anaconda.org/conda-forge/linux-64/aws-sdk-cpp-1.11.510-h7cc6b5f_7.conda#35c4d2ece6b4b098501e595f04250bee +https://conda.anaconda.org/conda-forge/linux-64/aws-sdk-cpp-1.11.510-hffe9a0f_8.conda#4cd13ac60fb622ab49dfe949f2cd3051 https://conda.anaconda.org/conda-forge/linux-64/azure-storage-files-datalake-cpp-12.12.0-ha633028_1.conda#7c1980f89dd41b097549782121a73490 -https://conda.anaconda.org/conda-forge/linux-64/harfbuzz-11.1.0-h3beb420_0.conda#95e3bb97f9cdc251c0c68640e9c10ed3 +https://conda.anaconda.org/conda-forge/linux-64/harfbuzz-11.2.1-h3beb420_0.conda#0e6e192d4b3d95708ad192d957cf3163 https://conda.anaconda.org/conda-forge/linux-64/libblas-3.9.0-31_hfdb39a5_mkl.conda#bdf4a57254e8248222cb631db4393ff1 https://conda.anaconda.org/conda-forge/linux-64/mkl-devel-2024.2.2-ha770c72_16.conda#140891ea14285fc634353b31e9e40a95 https://conda.anaconda.org/conda-forge/linux-64/libarrow-20.0.0-hebdba27_3_cpu.conda#5be86a1b5f496f82c7dfeb0dbe19ef03 https://conda.anaconda.org/conda-forge/linux-64/libcblas-3.9.0-31_h372d94f_mkl.conda#2a06a6c16b45bd3d10002927ca204b67 https://conda.anaconda.org/conda-forge/linux-64/liblapack-3.9.0-31_hc41d3b0_mkl.conda#10d012ddd7cc1c7ff9093d4974a34e53 -https://conda.anaconda.org/conda-forge/linux-64/qt6-main-6.9.0-h8d00660_2.conda#ac0eb548e24a2cb3c2c8ba060aef7db2 +https://conda.anaconda.org/conda-forge/linux-64/qt6-main-6.9.0-h0384650_3.conda#8aa69e15597a205fd6f81781fe62c232 https://conda.anaconda.org/conda-forge/linux-64/libarrow-acero-20.0.0-hcb10f89_3_cpu.conda#679cd6bb558cd6565d98ad66af6ff6ed https://conda.anaconda.org/conda-forge/linux-64/liblapacke-3.9.0-31_hbc6e62b_mkl.conda#562026e418363dc346ad5a9e18cce73c https://conda.anaconda.org/conda-forge/linux-64/libparquet-20.0.0-h081d1f1_3_cpu.conda#f15cc1214c08019be884e3defd93e000 https://conda.anaconda.org/conda-forge/linux-64/libtorch-2.7.0-cpu_mkl_hf6ddc5a_100.conda#6bdda0b10852c6d03b030bab7ec251f0 -https://conda.anaconda.org/conda-forge/linux-64/numpy-2.2.5-py313h17eae1a_0.conda#6ceeff9ed72e54e4a2f9a1c88f47bdde +https://conda.anaconda.org/conda-forge/linux-64/numpy-2.2.6-py313h17eae1a_0.conda#7a2d2f9adecd86ed5c29c2115354f615 https://conda.anaconda.org/conda-forge/linux-64/pyarrow-core-20.0.0-py313he5f92c8_0_cpu.conda#2afdef63d9fbc2cd0e52f8e8f3472404 https://conda.anaconda.org/conda-forge/linux-64/pyside6-6.9.0-py313h5f61773_0.conda#f51f25ec8fcbf777f8b186bb5deeed40 https://conda.anaconda.org/conda-forge/noarch/array-api-strict-2.3.1-pyhd8ed1ab_0.conda#11107d0aeb8c590a34fee0894909816b @@ -233,13 +233,14 @@ https://conda.anaconda.org/conda-forge/linux-64/blas-devel-3.9.0-31_hcf00494_mkl https://conda.anaconda.org/conda-forge/linux-64/contourpy-1.3.2-py313h33d0bda_0.conda#5dc81fffe102f63045225007a33d6199 https://conda.anaconda.org/conda-forge/linux-64/libarrow-dataset-20.0.0-hcb10f89_3_cpu.conda#0e84685fdecbd83666dd73292cc7d05a https://conda.anaconda.org/conda-forge/linux-64/pandas-2.2.3-py313ha87cce1_3.conda#6248b529e537b1d4cb5ab3ef7f537795 -https://conda.anaconda.org/conda-forge/linux-64/polars-1.29.0-py39h441220d_0.conda#6be2bbd70bf401a6f59952ba1355d8b8 +https://conda.anaconda.org/conda-forge/linux-64/polars-default-1.29.0-py39hfac2b71_1.conda#3c9014d11acfd00121c3d275aea778ad https://conda.anaconda.org/conda-forge/linux-64/pytorch-2.7.0-cpu_mkl_py313_hea9ba1b_100.conda#3c2ce6a304aa827f1e3cc21f7df9190d https://conda.anaconda.org/conda-forge/linux-64/scipy-1.15.2-py313h86fcf2b_0.conda#ca68acd9febc86448eeed68d0c6c8643 https://conda.anaconda.org/conda-forge/noarch/scipy-doctest-1.7.1-pyh29332c3_0.conda#d3b3b7b88385648eff6ae39694692f27 https://conda.anaconda.org/conda-forge/linux-64/blas-2.131-mkl.conda#9bb865b7e01104255ca54e61a58ded15 https://conda.anaconda.org/conda-forge/linux-64/libarrow-substrait-20.0.0-h1bed206_3_cpu.conda#c4d2a874f1ca439fb3c2a17060d6b911 https://conda.anaconda.org/conda-forge/linux-64/matplotlib-base-3.10.3-py313h129903b_0.conda#4f8816d006b1c155ec416bcf7ff6cee2 +https://conda.anaconda.org/conda-forge/linux-64/polars-1.29.0-default_h9d2e075_1.conda#7482bbd35de40c380fd2aa07c4babf90 https://conda.anaconda.org/conda-forge/linux-64/pyamg-5.2.1-py313hf0ab243_1.conda#4c769bf3858f424cb2ecf952175ec600 https://conda.anaconda.org/conda-forge/linux-64/pytorch-cpu-2.7.0-cpu_mkl_hc60beec_100.conda#20b3051f55ad823a27818dfa46a41c8f https://conda.anaconda.org/conda-forge/linux-64/matplotlib-3.10.3-py313h78bf25f_0.conda#cc9324e614a297fdf23439d887d3513d diff --git a/build_tools/azure/pylatest_conda_forge_mkl_osx-64_conda.lock b/build_tools/azure/pylatest_conda_forge_mkl_osx-64_conda.lock index 979272dedc9d3..ab2cd2c095474 100644 --- a/build_tools/azure/pylatest_conda_forge_mkl_osx-64_conda.lock +++ b/build_tools/azure/pylatest_conda_forge_mkl_osx-64_conda.lock @@ -11,8 +11,8 @@ https://conda.anaconda.org/conda-forge/osx-64/bzip2-1.0.8-hfdf4475_7.conda#7ed43 https://conda.anaconda.org/conda-forge/noarch/ca-certificates-2025.4.26-hbd8a1cb_0.conda#95db94f75ba080a22eb623590993167b https://conda.anaconda.org/conda-forge/osx-64/icu-75.1-h120a0e1_0.conda#d68d48a3060eb5abdc1cdc8e2a3a5966 https://conda.anaconda.org/conda-forge/osx-64/libbrotlicommon-1.1.0-h00291cd_2.conda#58f2c4bdd56c46cc7451596e4ae68e0b -https://conda.anaconda.org/conda-forge/osx-64/libcxx-20.1.4-hf95d169_1.conda#2d8e0efc0788d49051e7e02ad6571340 -https://conda.anaconda.org/conda-forge/osx-64/libdeflate-1.23-hcc1b750_0.conda#5d3507f22dda24f7d9a79325ad313e44 +https://conda.anaconda.org/conda-forge/osx-64/libcxx-20.1.5-hf95d169_0.conda#9dde68cee0a231b19e189954ac29027b +https://conda.anaconda.org/conda-forge/osx-64/libdeflate-1.24-hcc1b750_0.conda#f0a46c359722a3e84deb05cd4072d153 https://conda.anaconda.org/conda-forge/osx-64/libexpat-2.7.0-h240833e_0.conda#026d0a1056ba2a3dbbea6d4b08188676 https://conda.anaconda.org/conda-forge/osx-64/libffi-3.4.6-h281671d_1.conda#4ca9ea59839a9ca8df84170fab4ceb41 https://conda.anaconda.org/conda-forge/osx-64/libiconv-1.18-h4b5e92a_1.conda#6283140d7b2b55b6b095af939b71b13f @@ -21,7 +21,7 @@ https://conda.anaconda.org/conda-forge/osx-64/liblzma-5.8.1-hd471939_1.conda#f87 https://conda.anaconda.org/conda-forge/osx-64/libmpdec-4.0.0-hfdf4475_0.conda#ed625b2e59dff82859c23dd24774156b https://conda.anaconda.org/conda-forge/osx-64/libwebp-base-1.5.0-h6cf52b4_0.conda#5e0cefc99a231ac46ba21e27ae44689f https://conda.anaconda.org/conda-forge/osx-64/libzlib-1.3.1-hd23fc13_2.conda#003a54a4e32b02f7355b50a837e699da -https://conda.anaconda.org/conda-forge/osx-64/llvm-openmp-20.1.4-ha54dae1_0.conda#985619d7704847d30346abb6feeb8351 +https://conda.anaconda.org/conda-forge/osx-64/llvm-openmp-20.1.5-ha54dae1_0.conda#7b6a67507141ea93541943f0c011a872 https://conda.anaconda.org/conda-forge/osx-64/ncurses-6.5-h0622a9a_3.conda#ced34dd9929f491ca6dab6a2927aff25 https://conda.anaconda.org/conda-forge/osx-64/pthread-stubs-0.4-h00291cd_1002.conda#8bcf980d2c6b17094961198284b8e862 https://conda.anaconda.org/conda-forge/osx-64/xorg-libxau-1.0.12-h6e16a3a_0.conda#4cf40e60b444d56512a64f39d12c20bd @@ -51,7 +51,7 @@ https://conda.anaconda.org/conda-forge/osx-64/libblas-3.9.0-20_osx64_mkl.conda#1 https://conda.anaconda.org/conda-forge/osx-64/libfreetype6-2.13.3-h40dfd5c_1.conda#c76e6f421a0e95c282142f820835e186 https://conda.anaconda.org/conda-forge/osx-64/libgfortran-14.2.0-hef36b68_105.conda#6b27baf030f5d6603713c7e72d3f6b9a https://conda.anaconda.org/conda-forge/osx-64/libllvm18-18.1.8-default_h3571c67_5.conda#01dd8559b569ad39b64fef0a61ded1e9 -https://conda.anaconda.org/conda-forge/osx-64/libtiff-4.7.0-hb77a491_4.conda#b36d793dd65b28e3aeaa3a77abe71678 +https://conda.anaconda.org/conda-forge/osx-64/libtiff-4.7.0-h1167cee_5.conda#fc84af14a09e779f1d37ab1d16d5c4e2 https://conda.anaconda.org/conda-forge/osx-64/mkl-devel-2023.2.0-h694c41f_50500.conda#1b4d0235ef253a1e19459351badf4f9f https://conda.anaconda.org/conda-forge/osx-64/mpfr-4.2.1-haed47dc_3.conda#d511e58aaaabfc23136880d9956fa7a6 https://conda.anaconda.org/conda-forge/osx-64/python-3.13.3-h534c281_101_cp313.conda#ebcc7c42561d8d8b01477020b63218c0 @@ -59,7 +59,7 @@ https://conda.anaconda.org/conda-forge/osx-64/sigtool-0.1.3-h88f4db0_0.tar.bz2#f https://conda.anaconda.org/conda-forge/osx-64/brotli-1.1.0-h00291cd_2.conda#2db0c38a7f2321c5bdaf32b181e832c7 https://conda.anaconda.org/conda-forge/noarch/colorama-0.4.6-pyhd8ed1ab_1.conda#962b9857ee8e7018c22f2776ffa0b2d7 https://conda.anaconda.org/conda-forge/noarch/cycler-0.12.1-pyhd8ed1ab_1.conda#44600c4667a319d67dbe0681fc0bc833 -https://conda.anaconda.org/conda-forge/osx-64/cython-3.1.0-py313h9efc8c2_0.conda#350136d94f7df428dd6803ee062debc0 +https://conda.anaconda.org/conda-forge/osx-64/cython-3.1.0-py313h9efc8c2_1.conda#e3d979543ed0fa3668cf2692214a4168 https://conda.anaconda.org/conda-forge/noarch/execnet-2.1.1-pyhd8ed1ab_1.conda#a71efeae2c160f6789900ba2631a2c90 https://conda.anaconda.org/conda-forge/noarch/iniconfig-2.0.0-pyhd8ed1ab_1.conda#6837f3eff7dcea42ecd714ce1ac2b108 https://conda.anaconda.org/conda-forge/osx-64/kiwisolver-1.4.7-py313h0c4e38b_0.conda#c37fceab459e104e77bb5456e219fc37 @@ -77,7 +77,7 @@ https://conda.anaconda.org/conda-forge/noarch/munkres-1.1.4-pyh9f0ad1d_0.tar.bz2 https://conda.anaconda.org/conda-forge/osx-64/openjpeg-2.5.3-h7fd6d84_0.conda#025c711177fc3309228ca1a32374458d https://conda.anaconda.org/conda-forge/noarch/packaging-25.0-pyh29332c3_1.conda#58335b26c38bf4a20f399384c33cbcf9 https://conda.anaconda.org/conda-forge/noarch/pip-25.1.1-pyh145f28c_0.conda#01384ff1639c6330a0924791413b8714 -https://conda.anaconda.org/conda-forge/noarch/pluggy-1.5.0-pyhd8ed1ab_1.conda#e9dcbce5f45f9ee500e728ae58b605b6 +https://conda.anaconda.org/conda-forge/noarch/pluggy-1.6.0-pyhd8ed1ab_0.conda#7da7ccd349dbf6487a7778579d2bb971 https://conda.anaconda.org/conda-forge/noarch/pyparsing-3.2.3-pyhd8ed1ab_1.conda#513d3c262ee49b54a8fec85c5bc99764 https://conda.anaconda.org/conda-forge/noarch/python-tzdata-2025.2-pyhd8ed1ab_0.conda#88476ae6ebd24f39261e0854ac244f33 https://conda.anaconda.org/conda-forge/noarch/pytz-2025.2-pyhd8ed1ab_0.conda#bc8e3267d44011051f2eb14d22fb0960 @@ -86,7 +86,7 @@ https://conda.anaconda.org/conda-forge/noarch/six-1.17.0-pyhd8ed1ab_0.conda#a451 https://conda.anaconda.org/conda-forge/noarch/threadpoolctl-3.6.0-pyhecae5ae_0.conda#9d64911b31d57ca443e9f1e36b04385f https://conda.anaconda.org/conda-forge/noarch/toml-0.10.2-pyhd8ed1ab_1.conda#b0dd904de08b7db706167240bf37b164 https://conda.anaconda.org/conda-forge/noarch/tomli-2.2.1-pyhd8ed1ab_1.conda#ac944244f1fed2eb49bae07193ae8215 -https://conda.anaconda.org/conda-forge/osx-64/tornado-6.4.2-py313h63b0ddb_0.conda#74a3a14f82dc65fa19f4fd4e2eb8da93 +https://conda.anaconda.org/conda-forge/osx-64/tornado-6.5-py313h63b0ddb_0.conda#a4ba44bbb7b44a217025cddf648ae8b9 https://conda.anaconda.org/conda-forge/noarch/typing_extensions-4.13.2-pyh29332c3_0.conda#83fc6ae00127671e301c9f44254c31b8 https://conda.anaconda.org/conda-forge/osx-64/ccache-4.11.3-h33566b8_0.conda#b65cad834bd6c1f660c101cca09430bf https://conda.anaconda.org/conda-forge/osx-64/clang-18-18.1.8-default_h3571c67_9.conda#e29d8d2866f15f3b167938cc0e775b2f @@ -99,7 +99,7 @@ https://conda.anaconda.org/conda-forge/noarch/joblib-1.5.0-pyhd8ed1ab_0.conda#3d https://conda.anaconda.org/conda-forge/osx-64/ld64-951.9-h4e51db5_6.conda#45bf526d53b1bc95bc0b932a91a41576 https://conda.anaconda.org/conda-forge/osx-64/liblapacke-3.9.0-20_osx64_mkl.conda#124ae8e384268a8da66f1d64114a1eda https://conda.anaconda.org/conda-forge/osx-64/llvm-tools-18.1.8-default_h3571c67_5.conda#cc07ff74d2547da1f1452c42b67bafd6 -https://conda.anaconda.org/conda-forge/osx-64/numpy-2.2.5-py313hc518a0f_0.conda#eba644ccc203cfde2fa1f450f528c70d +https://conda.anaconda.org/conda-forge/osx-64/numpy-2.2.6-py313hc518a0f_0.conda#7b80c7ace05b1b9d7ec6f55130776988 https://conda.anaconda.org/conda-forge/osx-64/pillow-11.2.1-py313h0c4f865_0.conda#b4647eda8779d0e5d25cc8c9b124b303 https://conda.anaconda.org/conda-forge/noarch/pyproject-metadata-0.9.1-pyhd8ed1ab_0.conda#22ae7c6ea81e0c8661ef32168dda929b https://conda.anaconda.org/conda-forge/noarch/python-dateutil-2.9.0.post0-pyhff2d567_1.conda#5ba79d7c71f03c678c8ead841f347d6e diff --git a/build_tools/azure/pylatest_pip_openblas_pandas_linux-64_conda.lock b/build_tools/azure/pylatest_pip_openblas_pandas_linux-64_conda.lock index d897f193fbb6f..9e455156b43d5 100644 --- a/build_tools/azure/pylatest_pip_openblas_pandas_linux-64_conda.lock +++ b/build_tools/azure/pylatest_pip_openblas_pandas_linux-64_conda.lock @@ -47,10 +47,10 @@ https://repo.anaconda.com/pkgs/main/noarch/pip-25.1-pyhc872135_2.conda#2778327d2 # pip meson @ https://files.pythonhosted.org/packages/df/d7/f1c8acf0e597d4d07532f519780ee6e11ba285a9b092f18706b4c9118331/meson-1.8.0-py3-none-any.whl#sha256=472b7b25da286447333d32872b82d1c6f1a34024fb8ee017d7308056c25fec1f # pip networkx @ https://files.pythonhosted.org/packages/b9/54/dd730b32ea14ea797530a4479b2ed46a6fb250f682a9cfb997e968bf0261/networkx-3.4.2-py3-none-any.whl#sha256=df5d4365b724cf81b8c6a7312509d0c22386097011ad1abe274afd5e9d3bbc5f # pip ninja @ https://files.pythonhosted.org/packages/eb/7a/455d2877fe6cf99886849c7f9755d897df32eaf3a0fba47b56e615f880f7/ninja-1.11.1.4-py3-none-manylinux_2_12_x86_64.manylinux2010_x86_64.whl#sha256=096487995473320de7f65d622c3f1d16c3ad174797602218ca8c967f51ec38a0 -# pip numpy @ https://files.pythonhosted.org/packages/aa/fc/ebfd32c3e124e6a1043e19c0ab0769818aa69050ce5589b63d05ff185526/numpy-2.2.5-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl#sha256=2ba321813a00e508d5421104464510cc962a6f791aa2fca1c97b1e65027da80d +# pip numpy @ https://files.pythonhosted.org/packages/19/49/4df9123aafa7b539317bf6d342cb6d227e49f7a35b99c287a6109b13dd93/numpy-2.2.6-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl#sha256=1bc23a79bfabc5d056d106f9befb8d50c31ced2fbc70eedb8155aec74a45798f # pip packaging @ https://files.pythonhosted.org/packages/20/12/38679034af332785aac8774540895e234f4d07f7545804097de4b666afd8/packaging-25.0-py3-none-any.whl#sha256=29572ef2b1f17581046b3a2227d5c611fb25ec70ca1ba8554b24b0e69331a484 # pip pillow @ https://files.pythonhosted.org/packages/13/eb/2552ecebc0b887f539111c2cd241f538b8ff5891b8903dfe672e997529be/pillow-11.2.1-cp313-cp313-manylinux_2_28_x86_64.whl#sha256=ad275964d52e2243430472fc5d2c2334b4fc3ff9c16cb0a19254e25efa03a155 -# pip pluggy @ https://files.pythonhosted.org/packages/88/5f/e351af9a41f866ac3f1fac4ca0613908d9a41741cfcf2228f4ad853b697d/pluggy-1.5.0-py3-none-any.whl#sha256=44e1ad92c8ca002de6377e165f3e0f1be63266ab4d554740532335b9d75ea669 +# pip pluggy @ https://files.pythonhosted.org/packages/54/20/4d324d65cc6d9205fabedc306948156824eb9f0ee1633355a8f7ec5c66bf/pluggy-1.6.0-py3-none-any.whl#sha256=e920276dd6813095e9377c0bc5566d94c932c33b27a3e3945d8389c374dd4746 # pip pygments @ https://files.pythonhosted.org/packages/8a/0b/9fcc47d19c48b59121088dd6da2488a49d5f72dacf8262e2790a1d2c7d15/pygments-2.19.1-py3-none-any.whl#sha256=9ea1544ad55cecf4b8242fab6dd35a93bbce657034b0611ee383099054ab6d8c # pip pyparsing @ https://files.pythonhosted.org/packages/05/e7/df2285f3d08fee213f2d041540fa4fc9ca6c2d44cf36d3a035bf2a8d2bcc/pyparsing-3.2.3-py3-none-any.whl#sha256=a749938e02d6fd0b59b356ca504a24982314bb090c383e3cf201c95ef7e2bfcf # pip pytz @ https://files.pythonhosted.org/packages/81/c4/34e93fe5f5429d7570ec1fa436f1986fb1f00c3e0f43a589fe2bbcd22c3f/pytz-2025.2-py2.py3-none-any.whl#sha256=5ddf76296dd8c44c26eb8f4b6f35488f3ccbf6fbbd7adee0b7262d43f0ec2f00 diff --git a/build_tools/azure/pymin_conda_forge_mkl_win-64_conda.lock b/build_tools/azure/pymin_conda_forge_mkl_win-64_conda.lock index 3c55d28fac4ce..30d26d841954f 100644 --- a/build_tools/azure/pymin_conda_forge_mkl_win-64_conda.lock +++ b/build_tools/azure/pymin_conda_forge_mkl_win-64_conda.lock @@ -25,7 +25,7 @@ https://conda.anaconda.org/conda-forge/win-64/graphite2-1.3.13-h63175ca_1003.con https://conda.anaconda.org/conda-forge/win-64/icu-75.1-he0c23c2_0.conda#8579b6bb8d18be7c0b27fb08adeeeb40 https://conda.anaconda.org/conda-forge/win-64/lerc-4.0.0-h6470a55_1.conda#c1b81da6d29a14b542da14a36c9fbf3f https://conda.anaconda.org/conda-forge/win-64/libbrotlicommon-1.1.0-h2466b09_2.conda#f7dc9a8f21d74eab46456df301da2972 -https://conda.anaconda.org/conda-forge/win-64/libdeflate-1.23-h76ddb4d_0.conda#34f03138e46543944d4d7f8538048842 +https://conda.anaconda.org/conda-forge/win-64/libdeflate-1.24-h76ddb4d_0.conda#08d988e266c6ae77e03d164b83786dc4 https://conda.anaconda.org/conda-forge/win-64/libexpat-2.7.0-he0c23c2_0.conda#b6f5352fdb525662f4169a0431d2dd7a https://conda.anaconda.org/conda-forge/win-64/libffi-3.4.6-h537db12_1.conda#85d8fa5e55ed8f93f874b3b23ed54ec6 https://conda.anaconda.org/conda-forge/win-64/libiconv-1.18-h135ad9c_1.conda#21fc5dba2cbcd8e5e26ff976a312122c @@ -46,26 +46,26 @@ https://conda.anaconda.org/conda-forge/win-64/libgcc-15.1.0-h1383e82_2.conda#9be https://conda.anaconda.org/conda-forge/win-64/libintl-0.22.5-h5728263_3.conda#2cf0cf76cc15d360dfa2f17fd6cf9772 https://conda.anaconda.org/conda-forge/win-64/libpng-1.6.47-h7a4582a_0.conda#ad620e92b82d2948bc019e029c574ebb https://conda.anaconda.org/conda-forge/win-64/libxml2-2.13.8-h442d1da_0.conda#833c2dbc1a5020007b520b044c713ed3 -https://conda.anaconda.org/conda-forge/win-64/pcre2-10.44-h99c9b8b_2.conda#a912b2c4ff0f03101c751aa79a331831 +https://conda.anaconda.org/conda-forge/win-64/pcre2-10.45-h99c9b8b_0.conda#f4c483274001678e129f5cbaf3a8d765 https://conda.anaconda.org/conda-forge/win-64/python-3.10.17-h8c5b53a_0_cpython.conda#0c59918f056ab2e9c7bb45970d32b2ea https://conda.anaconda.org/conda-forge/win-64/zstd-1.5.7-hbeecb71_2.conda#21f56217d6125fb30c3c3f10c786d751 https://conda.anaconda.org/conda-forge/win-64/brotli-bin-1.1.0-h2466b09_2.conda#d22534a9be5771fc58eb7564947f669d https://conda.anaconda.org/conda-forge/noarch/colorama-0.4.6-pyhd8ed1ab_1.conda#962b9857ee8e7018c22f2776ffa0b2d7 https://conda.anaconda.org/conda-forge/noarch/cycler-0.12.1-pyhd8ed1ab_1.conda#44600c4667a319d67dbe0681fc0bc833 -https://conda.anaconda.org/conda-forge/win-64/cython-3.1.0-py310h6bd2d47_0.conda#2e715850183850c69cf2b1fa3933a0e6 +https://conda.anaconda.org/conda-forge/win-64/cython-3.1.0-py310h6bd2d47_1.conda#41d337072c52ae6b13bf362645cabd55 https://conda.anaconda.org/conda-forge/noarch/execnet-2.1.1-pyhd8ed1ab_1.conda#a71efeae2c160f6789900ba2631a2c90 https://conda.anaconda.org/conda-forge/noarch/iniconfig-2.0.0-pyhd8ed1ab_1.conda#6837f3eff7dcea42ecd714ce1ac2b108 https://conda.anaconda.org/conda-forge/win-64/kiwisolver-1.4.7-py310hc19bc0b_0.conda#50d96539497fc7493cbe469fbb6b8b6e -https://conda.anaconda.org/conda-forge/win-64/libclang13-20.1.4-default_h6e92b77_0.conda#80c3ee2ffb5f35f2b6c4b10d636b04fb +https://conda.anaconda.org/conda-forge/win-64/libclang13-20.1.5-default_h6e92b77_0.conda#2013532e0911dcc50ab4a2fd09d1d9a5 https://conda.anaconda.org/conda-forge/win-64/libfreetype6-2.13.3-h0b5ce68_1.conda#a84b7d1a13060a9372bea961a8131dbc -https://conda.anaconda.org/conda-forge/win-64/libglib-2.84.1-h7025463_0.conda#6cbaea9075a4f007eb7d0a90bb9a2a09 +https://conda.anaconda.org/conda-forge/win-64/libglib-2.84.1-hbc94333_1.conda#e08d4b6e9a742d78e505b2d7038912bd https://conda.anaconda.org/conda-forge/win-64/libhwloc-2.11.2-default_ha69328c_1001.conda#b87a0ac5ab6495d8225db5dc72dd21cd -https://conda.anaconda.org/conda-forge/win-64/libtiff-4.7.0-h797046b_4.conda#7d938ca70c64c5516767b4eae0a56172 +https://conda.anaconda.org/conda-forge/win-64/libtiff-4.7.0-h05922d8_5.conda#75370aba951b47ec3b5bfe689f1bcf7f https://conda.anaconda.org/conda-forge/win-64/libxslt-1.1.39-h3df6e99_0.conda#279ee338c9b34871d578cb3c7aa68f70 https://conda.anaconda.org/conda-forge/noarch/meson-1.8.0-pyh29332c3_0.conda#8e25221b702272394b86b0f4d7217f77 https://conda.anaconda.org/conda-forge/noarch/munkres-1.1.4-pyh9f0ad1d_0.tar.bz2#2ba8498c1018c1e9c61eb99b973dfe19 https://conda.anaconda.org/conda-forge/noarch/packaging-25.0-pyh29332c3_1.conda#58335b26c38bf4a20f399384c33cbcf9 -https://conda.anaconda.org/conda-forge/noarch/pluggy-1.5.0-pyhd8ed1ab_1.conda#e9dcbce5f45f9ee500e728ae58b605b6 +https://conda.anaconda.org/conda-forge/noarch/pluggy-1.6.0-pyhd8ed1ab_0.conda#7da7ccd349dbf6487a7778579d2bb971 https://conda.anaconda.org/conda-forge/win-64/pthread-stubs-0.4-h0e40799_1002.conda#3c8f2573569bb816483e5cf57efbbe29 https://conda.anaconda.org/conda-forge/noarch/pyparsing-3.2.3-pyhd8ed1ab_1.conda#513d3c262ee49b54a8fec85c5bc99764 https://conda.anaconda.org/conda-forge/noarch/setuptools-80.1.0-pyhff2d567_0.conda#f6f72d0837c79eaec77661be43e8a691 @@ -73,7 +73,7 @@ https://conda.anaconda.org/conda-forge/noarch/six-1.17.0-pyhd8ed1ab_0.conda#a451 https://conda.anaconda.org/conda-forge/noarch/threadpoolctl-3.6.0-pyhecae5ae_0.conda#9d64911b31d57ca443e9f1e36b04385f https://conda.anaconda.org/conda-forge/noarch/toml-0.10.2-pyhd8ed1ab_1.conda#b0dd904de08b7db706167240bf37b164 https://conda.anaconda.org/conda-forge/noarch/tomli-2.2.1-pyhd8ed1ab_1.conda#ac944244f1fed2eb49bae07193ae8215 -https://conda.anaconda.org/conda-forge/win-64/tornado-6.4.2-py310ha8f682b_0.conda#e6819d3a0cae0f1b1838875f858421d1 +https://conda.anaconda.org/conda-forge/win-64/tornado-6.5-py310ha8f682b_0.conda#84903de6733418c3b81e17fc942cd756 https://conda.anaconda.org/conda-forge/noarch/typing_extensions-4.13.2-pyh29332c3_0.conda#83fc6ae00127671e301c9f44254c31b8 https://conda.anaconda.org/conda-forge/win-64/unicodedata2-16.0.0-py310ha8f682b_0.conda#b28aead44c6e19a1fbba7752aa242b34 https://conda.anaconda.org/conda-forge/noarch/wheel-0.45.1-pyhd8ed1ab_1.conda#75cb7132eb58d97896e173ef12ac9986 @@ -105,12 +105,12 @@ https://conda.anaconda.org/conda-forge/noarch/pytest-xdist-3.6.1-pyhd8ed1ab_1.co https://conda.anaconda.org/conda-forge/win-64/cairo-1.18.4-h5782bbf_0.conda#20e32ced54300292aff690a69c5e7b97 https://conda.anaconda.org/conda-forge/win-64/libcblas-3.9.0-31_h5e41251_mkl.conda#43c100b94ad2607382b0cf0f3a6b0bf3 https://conda.anaconda.org/conda-forge/win-64/liblapack-3.9.0-31_h1aa476e_mkl.conda#40b47ee720a185289760960fc6185750 -https://conda.anaconda.org/conda-forge/win-64/harfbuzz-11.1.0-h8796e6f_0.conda#dcc4a63f231cc52197c558f5e07e0a69 +https://conda.anaconda.org/conda-forge/win-64/harfbuzz-11.2.1-h8796e6f_0.conda#bccea58fbf7910ce868b084f27ffe8bd https://conda.anaconda.org/conda-forge/win-64/liblapacke-3.9.0-31_h845c4fa_mkl.conda#003a2041cb07a7cf698f48dd26301273 -https://conda.anaconda.org/conda-forge/win-64/numpy-2.2.5-py310h4987827_0.conda#19e9c5868faa8046020ce870a9a9d0fc +https://conda.anaconda.org/conda-forge/win-64/numpy-2.2.6-py310h4987827_0.conda#d2596785ac2cf5bab04e2ee9e5d04041 https://conda.anaconda.org/conda-forge/win-64/blas-devel-3.9.0-31_hfb1a452_mkl.conda#0deeb3d9d6f0e56393c55ef382899010 https://conda.anaconda.org/conda-forge/win-64/contourpy-1.3.2-py310hc19bc0b_0.conda#039416813b5290e7d100a05bb4326110 -https://conda.anaconda.org/conda-forge/win-64/qt6-main-6.9.0-h1ab902a_2.conda#99a8af7791ea42b4994cea09dd858ca8 +https://conda.anaconda.org/conda-forge/win-64/qt6-main-6.9.0-h02ddd7d_3.conda#8aeebdf27e439648236c3eb856ce7777 https://conda.anaconda.org/conda-forge/win-64/scipy-1.15.2-py310h15c175c_0.conda#81798168111d1021e3d815217c444418 https://conda.anaconda.org/conda-forge/win-64/blas-2.131-mkl.conda#1842bfaa4e349875c47bde1d9871bda6 https://conda.anaconda.org/conda-forge/win-64/matplotlib-base-3.10.3-py310h37e0a56_0.conda#de9ddae6f97b78860c256de480ea1a84 diff --git a/build_tools/azure/pymin_conda_forge_openblas_min_dependencies_linux-64_conda.lock b/build_tools/azure/pymin_conda_forge_openblas_min_dependencies_linux-64_conda.lock index 248133099b701..ba3443b69a90d 100644 --- a/build_tools/azure/pymin_conda_forge_openblas_min_dependencies_linux-64_conda.lock +++ b/build_tools/azure/pymin_conda_forge_openblas_min_dependencies_linux-64_conda.lock @@ -12,7 +12,7 @@ https://conda.anaconda.org/conda-forge/noarch/ca-certificates-2025.4.26-hbd8a1cb https://conda.anaconda.org/conda-forge/noarch/fonts-conda-forge-1-0.tar.bz2#f766549260d6815b0c52253f1fb1bb29 https://conda.anaconda.org/conda-forge/linux-64/ld_impl_linux-64-2.43-h712a8e2_4.conda#01f8d123c96816249efd255a31ad7712 https://conda.anaconda.org/conda-forge/linux-64/libglvnd-1.7.0-ha4b6fd6_2.conda#434ca7e50e40f4918ab701e3facd59a0 -https://conda.anaconda.org/conda-forge/linux-64/llvm-openmp-20.1.4-h024ca30_0.conda#4fc395cda27912a7d904b86b5dbf3a4d +https://conda.anaconda.org/conda-forge/linux-64/llvm-openmp-20.1.5-h024ca30_0.conda#86f58be65a51d62ccc06cacfd83ff987 https://conda.anaconda.org/conda-forge/linux-64/_openmp_mutex-4.5-3_kmp_llvm.conda#ee5c2118262e30b972bc0b4db8ef0ba5 https://conda.anaconda.org/conda-forge/noarch/fonts-conda-ecosystem-1-0.tar.bz2#fee5683a3f04bd15cbd8318b096a27ab https://conda.anaconda.org/conda-forge/linux-64/libegl-1.7.0-ha4b6fd6_2.conda#c151d5eb730e9b7480e6d48c0fc44048 @@ -21,7 +21,7 @@ https://conda.anaconda.org/conda-forge/linux-64/libgcc-15.1.0-h767d61c_2.conda#e https://conda.anaconda.org/conda-forge/linux-64/alsa-lib-1.2.14-hb9d3cd8_0.conda#76df83c2a9035c54df5d04ff81bcc02d https://conda.anaconda.org/conda-forge/linux-64/gettext-tools-0.24.1-h5888daf_0.conda#d54305672f0361c2f3886750e7165b5f https://conda.anaconda.org/conda-forge/linux-64/libbrotlicommon-1.1.0-hb9d3cd8_2.conda#41b599ed2b02abcfdd84302bff174b23 -https://conda.anaconda.org/conda-forge/linux-64/libdeflate-1.23-h86f0d12_0.conda#27fe770decaf469a53f3e3a6d593067f +https://conda.anaconda.org/conda-forge/linux-64/libdeflate-1.24-h86f0d12_0.conda#64f0c503da58ec25ebd359e4d990afa8 https://conda.anaconda.org/conda-forge/linux-64/libexpat-2.7.0-h5888daf_0.conda#db0bfbe7dd197b68ad5f30333bae6ce0 https://conda.anaconda.org/conda-forge/linux-64/libffi-3.4.6-h2dba641_1.conda#ede4673863426c0883c0063d853bbd85 https://conda.anaconda.org/conda-forge/linux-64/libgcc-ng-15.1.0-h69a702a_2.conda#ddca86c7040dd0e73b2b69bd7833d225 @@ -67,7 +67,6 @@ https://conda.anaconda.org/conda-forge/linux-64/libxcb-1.17.0-h8a09558_0.conda#9 https://conda.anaconda.org/conda-forge/linux-64/libxcrypt-4.4.36-hd590300_1.conda#5aa797f8787fe7a17d1b0821485b5adc https://conda.anaconda.org/conda-forge/linux-64/lz4-c-1.10.0-h5888daf_1.conda#9de5350a85c4a20c685259b889aa6393 https://conda.anaconda.org/conda-forge/linux-64/mpg123-1.32.9-hc50e24c_0.conda#c7f302fd11eeb0987a6a5e1f3aed6a21 -https://conda.anaconda.org/conda-forge/linux-64/mysql-common-9.0.1-h266115a_6.conda#94116b69829e90b72d566e64421e1bff https://conda.anaconda.org/conda-forge/linux-64/ninja-1.12.1-hff21bea_1.conda#2322531904f27501ee19847b87ba7c64 https://conda.anaconda.org/conda-forge/linux-64/nspr-4.36-h5888daf_0.conda#de9cd5bca9e4918527b9b72b6e2e1409 https://conda.anaconda.org/conda-forge/linux-64/pixman-0.46.0-h29eaf8c_0.conda#d2f1c87d4416d1e7344cf92b1aaee1c4 @@ -82,11 +81,10 @@ https://conda.anaconda.org/conda-forge/linux-64/libasprintf-devel-0.24.1-h8e693c https://conda.anaconda.org/conda-forge/linux-64/libcap-2.75-h39aace5_0.conda#c44c16d6976d2aebbd65894d7741e67e https://conda.anaconda.org/conda-forge/linux-64/libdrm-2.4.124-hb9d3cd8_0.conda#8bc89311041d7fcb510238cf0848ccae https://conda.anaconda.org/conda-forge/linux-64/libfreetype6-2.13.3-h48d6fc4_1.conda#3c255be50a506c50765a93a6644f32fe -https://conda.anaconda.org/conda-forge/linux-64/libgcrypt-lib-1.11.0-hb9d3cd8_2.conda#e55712ff40a054134d51b89afca57dbc +https://conda.anaconda.org/conda-forge/linux-64/libgcrypt-lib-1.11.1-hb9d3cd8_0.conda#8504a291085c9fb809b66cabd5834307 https://conda.anaconda.org/conda-forge/linux-64/libgfortran-ng-15.1.0-h69a702a_2.conda#a483a87b71e974bb75d1b9413d4436dd -https://conda.anaconda.org/conda-forge/linux-64/libtiff-4.7.0-hd9ff511_4.conda#6c1028898cf3a2032d9af46689e1b81a +https://conda.anaconda.org/conda-forge/linux-64/libtiff-4.7.0-hf01ce69_5.conda#e79a094918988bb1807462cd42c83962 https://conda.anaconda.org/conda-forge/linux-64/libvorbis-1.3.7-h9c3ff4c_0.tar.bz2#309dec04b70a3cc0f1e84a4013683bc0 -https://conda.anaconda.org/conda-forge/linux-64/mysql-libs-9.0.1-he0572af_6.conda#9802ae6d20982f42c0f5d69008988763 https://conda.anaconda.org/conda-forge/linux-64/nss-3.111-h159eef7_0.conda#311e8370c9db254611ec87250f6370a0 https://conda.anaconda.org/conda-forge/linux-64/pcre2-10.45-hc749103_0.conda#b90bece58b4c2bf25969b70f3be42d25 https://conda.anaconda.org/conda-forge/linux-64/python-3.10.17-hd6af730_0_cpython.conda#7bb89638dae9ce1b8e051d0b721e83c2 @@ -119,7 +117,7 @@ https://conda.anaconda.org/conda-forge/noarch/meson-1.8.0-pyh29332c3_0.conda#8e2 https://conda.anaconda.org/conda-forge/noarch/munkres-1.1.4-pyh9f0ad1d_0.tar.bz2#2ba8498c1018c1e9c61eb99b973dfe19 https://conda.anaconda.org/conda-forge/linux-64/openjpeg-2.5.3-h5fbd93e_0.conda#9e5816bc95d285c115a3ebc2f8563564 https://conda.anaconda.org/conda-forge/noarch/packaging-25.0-pyh29332c3_1.conda#58335b26c38bf4a20f399384c33cbcf9 -https://conda.anaconda.org/conda-forge/noarch/pluggy-1.5.0-pyhd8ed1ab_1.conda#e9dcbce5f45f9ee500e728ae58b605b6 +https://conda.anaconda.org/conda-forge/noarch/pluggy-1.6.0-pyhd8ed1ab_0.conda#7da7ccd349dbf6487a7778579d2bb971 https://conda.anaconda.org/conda-forge/noarch/ply-3.11-pyhd8ed1ab_3.conda#fd5062942bfa1b0bd5e0d2a4397b099e https://conda.anaconda.org/conda-forge/noarch/pyparsing-3.2.3-pyhd8ed1ab_1.conda#513d3c262ee49b54a8fec85c5bc99764 https://conda.anaconda.org/conda-forge/noarch/pytz-2025.2-pyhd8ed1ab_0.conda#bc8e3267d44011051f2eb14d22fb0960 @@ -128,7 +126,7 @@ https://conda.anaconda.org/conda-forge/noarch/six-1.17.0-pyhd8ed1ab_0.conda#a451 https://conda.anaconda.org/conda-forge/noarch/threadpoolctl-3.1.0-pyh8a188c0_0.tar.bz2#a2995ee828f65687ac5b1e71a2ab1e0c https://conda.anaconda.org/conda-forge/noarch/toml-0.10.2-pyhd8ed1ab_1.conda#b0dd904de08b7db706167240bf37b164 https://conda.anaconda.org/conda-forge/noarch/tomli-2.2.1-pyhd8ed1ab_1.conda#ac944244f1fed2eb49bae07193ae8215 -https://conda.anaconda.org/conda-forge/linux-64/tornado-6.4.2-py310ha75aee5_0.conda#166d59aab40b9c607b4cc21c03924e9d +https://conda.anaconda.org/conda-forge/linux-64/tornado-6.5-py310ha75aee5_0.conda#866b3582e300257f7e8dc67ec279a85b https://conda.anaconda.org/conda-forge/noarch/typing_extensions-4.13.2-pyh29332c3_0.conda#83fc6ae00127671e301c9f44254c31b8 https://conda.anaconda.org/conda-forge/linux-64/unicodedata2-16.0.0-py310ha75aee5_0.conda#1d7a4b9202cdd10d56ecdd7f6c347190 https://conda.anaconda.org/conda-forge/noarch/wheel-0.45.1-pyhd8ed1ab_1.conda#75cb7132eb58d97896e173ef12ac9986 @@ -148,7 +146,7 @@ https://conda.anaconda.org/conda-forge/noarch/joblib-1.2.0-pyhd8ed1ab_0.tar.bz2# https://conda.anaconda.org/conda-forge/linux-64/libblas-3.9.0-20_linux64_openblas.conda#2b7bb4f7562c8cf334fc2e20c2d28abc https://conda.anaconda.org/conda-forge/linux-64/libflac-1.4.3-h59595ed_0.conda#ee48bf17cc83a00f59ca1494d5646869 https://conda.anaconda.org/conda-forge/linux-64/libgl-1.7.0-ha4b6fd6_2.conda#928b8be80851f5d8ffb016f9c81dae7a -https://conda.anaconda.org/conda-forge/linux-64/libllvm20-20.1.4-he9d0ab4_0.conda#96c33bbd084ef2b2463503fb7f1482ae +https://conda.anaconda.org/conda-forge/linux-64/libllvm20-20.1.5-he9d0ab4_0.conda#8d2f5a2f019bd76ccba5eb771852d411 https://conda.anaconda.org/conda-forge/linux-64/libxkbcommon-1.9.2-h65c71a3_0.conda#d045b1d878031eb497cab44e6392b1df https://conda.anaconda.org/conda-forge/linux-64/openblas-0.3.25-pthreads_h7a3da1a_0.conda#87661673941b5e702275fdf0fc095ad0 https://conda.anaconda.org/conda-forge/linux-64/openldap-2.6.9-he970967_0.conda#ca2de8bbdc871bce41dbf59e51324165 @@ -163,8 +161,8 @@ https://conda.anaconda.org/conda-forge/linux-64/xorg-libxxf86vm-1.1.6-hb9d3cd8_0 https://conda.anaconda.org/conda-forge/linux-64/fontconfig-2.15.0-h7e30c49_1.conda#8f5b0b297b59e1ac160ad4beec99dbee https://conda.anaconda.org/conda-forge/linux-64/glib-2.84.1-h6287aef_1.conda#35012688d30e1b52bff2ba5d1f342a50 https://conda.anaconda.org/conda-forge/linux-64/libcblas-3.9.0-20_linux64_openblas.conda#36d486d72ab64ffea932329a1d3729a3 -https://conda.anaconda.org/conda-forge/linux-64/libclang-cpp20.1-20.1.4-default_h1df26ce_0.conda#96f8d5b2e94c9ba4fef19f1adf068a15 -https://conda.anaconda.org/conda-forge/linux-64/libclang13-20.1.4-default_he06ed0a_0.conda#2d933632c8004be47deb2be61bf013be +https://conda.anaconda.org/conda-forge/linux-64/libclang-cpp20.1-20.1.5-default_h1df26ce_0.conda#79a1be1cd92a7f2b62e6c0a7c2da8bf8 +https://conda.anaconda.org/conda-forge/linux-64/libclang13-20.1.5-default_he06ed0a_0.conda#9a912cce23df3fea9d2adb75e505b153 https://conda.anaconda.org/conda-forge/linux-64/liblapack-3.9.0-20_linux64_openblas.conda#6fabc51f5e647d09cc010c40061557e0 https://conda.anaconda.org/conda-forge/linux-64/libpq-17.5-h27ae623_0.conda#6458be24f09e1b034902ab44fe9de908 https://conda.anaconda.org/conda-forge/linux-64/libsndfile-1.2.2-hc60ed4a_1.conda#ef1910918dd895516a769ed36b5b3a4e @@ -180,13 +178,13 @@ https://conda.anaconda.org/conda-forge/noarch/pytest-cov-6.1.1-pyhd8ed1ab_0.cond https://conda.anaconda.org/conda-forge/noarch/pytest-xdist-3.6.1-pyhd8ed1ab_1.conda#59aad4fb37cabc0bacc73cf344612ddd https://conda.anaconda.org/conda-forge/linux-64/blas-devel-3.9.0-20_linux64_openblas.conda#9932a1d4e9ecf2d35fb19475446e361e https://conda.anaconda.org/conda-forge/linux-64/gst-plugins-base-1.24.11-h651a532_0.conda#d8d8894f8ced2c9be76dc9ad1ae531ce -https://conda.anaconda.org/conda-forge/linux-64/harfbuzz-11.1.0-h3beb420_0.conda#95e3bb97f9cdc251c0c68640e9c10ed3 +https://conda.anaconda.org/conda-forge/linux-64/harfbuzz-11.2.1-h3beb420_0.conda#0e6e192d4b3d95708ad192d957cf3163 https://conda.anaconda.org/conda-forge/linux-64/matplotlib-base-3.5.0-py310h23f4a51_0.tar.bz2#9911225650b298776c8e8c083b5cacf1 https://conda.anaconda.org/conda-forge/linux-64/pandas-1.4.0-py310hb5077e9_0.tar.bz2#43e920bc9856daa7d8d18fcbfb244c4e https://conda.anaconda.org/conda-forge/linux-64/polars-0.20.30-py310h031f9ce_0.conda#0743f5db9f978b6df92d412935ff8371 https://conda.anaconda.org/conda-forge/linux-64/scipy-1.8.0-py310hea5193d_1.tar.bz2#664d80ddeb51241629b3ada5ea926e4d https://conda.anaconda.org/conda-forge/linux-64/blas-2.120-openblas.conda#c8f6916a81a340650078171b1d852574 https://conda.anaconda.org/conda-forge/linux-64/pyamg-4.2.1-py310h7c3ba0c_0.tar.bz2#89f5a48e1f23b5cf3163a6094903d181 -https://conda.anaconda.org/conda-forge/linux-64/qt-main-5.15.15-h993ce98_3.conda#aa49f5308f39277477d47cd6687eb8f3 +https://conda.anaconda.org/conda-forge/linux-64/qt-main-5.15.15-hea1682b_4.conda#c054d7f22cc719e12c72d454b2328d6c https://conda.anaconda.org/conda-forge/linux-64/pyqt-5.15.11-py310hf392a12_0.conda#65924d3e57be25342c76530d23d75f0f https://conda.anaconda.org/conda-forge/linux-64/matplotlib-3.5.0-py310hff52083_0.tar.bz2#1b2f3b135d5d9c594b5e0e6150c03b7b diff --git a/build_tools/azure/pymin_conda_forge_openblas_ubuntu_2204_linux-64_conda.lock b/build_tools/azure/pymin_conda_forge_openblas_ubuntu_2204_linux-64_conda.lock index 036882c691173..3bfe3d34934ea 100644 --- a/build_tools/azure/pymin_conda_forge_openblas_ubuntu_2204_linux-64_conda.lock +++ b/build_tools/azure/pymin_conda_forge_openblas_ubuntu_2204_linux-64_conda.lock @@ -10,7 +10,7 @@ https://conda.anaconda.org/conda-forge/linux-64/ld_impl_linux-64-2.43-h712a8e2_4 https://conda.anaconda.org/conda-forge/linux-64/libgomp-15.1.0-h767d61c_2.conda#fbe7d535ff9d3a168c148e07358cd5b1 https://conda.anaconda.org/conda-forge/linux-64/_openmp_mutex-4.5-2_gnu.tar.bz2#73aaf86a425cc6e73fcf236a5a46396d https://conda.anaconda.org/conda-forge/linux-64/libgcc-15.1.0-h767d61c_2.conda#ea8ac52380885ed41c1baa8f1d6d2b93 -https://conda.anaconda.org/conda-forge/linux-64/libdeflate-1.23-h86f0d12_0.conda#27fe770decaf469a53f3e3a6d593067f +https://conda.anaconda.org/conda-forge/linux-64/libdeflate-1.24-h86f0d12_0.conda#64f0c503da58ec25ebd359e4d990afa8 https://conda.anaconda.org/conda-forge/linux-64/libexpat-2.7.0-h5888daf_0.conda#db0bfbe7dd197b68ad5f30333bae6ce0 https://conda.anaconda.org/conda-forge/linux-64/libffi-3.4.6-h2dba641_1.conda#ede4673863426c0883c0063d853bbd85 https://conda.anaconda.org/conda-forge/linux-64/libgcc-ng-15.1.0-h69a702a_2.conda#ddca86c7040dd0e73b2b69bd7833d225 @@ -42,14 +42,14 @@ https://conda.anaconda.org/conda-forge/linux-64/zstd-1.5.7-hb8e6e7a_2.conda#6432 https://conda.anaconda.org/conda-forge/linux-64/libfreetype6-2.13.3-h48d6fc4_1.conda#3c255be50a506c50765a93a6644f32fe https://conda.anaconda.org/conda-forge/linux-64/libgfortran-ng-15.1.0-h69a702a_2.conda#a483a87b71e974bb75d1b9413d4436dd https://conda.anaconda.org/conda-forge/linux-64/libopenblas-0.3.29-pthreads_h94d23a6_0.conda#0a4d0252248ef9a0f88f2ba8b8a08e12 -https://conda.anaconda.org/conda-forge/linux-64/libtiff-4.7.0-hd9ff511_4.conda#6c1028898cf3a2032d9af46689e1b81a +https://conda.anaconda.org/conda-forge/linux-64/libtiff-4.7.0-hf01ce69_5.conda#e79a094918988bb1807462cd42c83962 https://conda.anaconda.org/conda-forge/linux-64/python-3.10.17-hd6af730_0_cpython.conda#7bb89638dae9ce1b8e051d0b721e83c2 https://conda.anaconda.org/conda-forge/noarch/alabaster-1.0.0-pyhd8ed1ab_1.conda#1fd9696649f65fd6611fcdb4ffec738a https://conda.anaconda.org/conda-forge/linux-64/brotli-python-1.1.0-py310hf71b8c6_2.conda#bf502c169c71e3c6ac0d6175addfacc2 https://conda.anaconda.org/conda-forge/noarch/certifi-2025.4.26-pyhd8ed1ab_0.conda#c33eeaaa33f45031be34cda513df39b6 https://conda.anaconda.org/conda-forge/noarch/charset-normalizer-3.4.2-pyhd8ed1ab_0.conda#40fe4284b8b5835a9073a645139f35af https://conda.anaconda.org/conda-forge/noarch/colorama-0.4.6-pyhd8ed1ab_1.conda#962b9857ee8e7018c22f2776ffa0b2d7 -https://conda.anaconda.org/conda-forge/linux-64/cython-3.1.0-py310had8cdd9_0.conda#cb0972064e60dcfb49b3b4de71dafd4f +https://conda.anaconda.org/conda-forge/linux-64/cython-3.1.0-py310had8cdd9_1.conda#ad1ca59171c759e1b834eb6f199917ea https://conda.anaconda.org/conda-forge/noarch/docutils-0.21.2-pyhd8ed1ab_1.conda#24c1ca34138ee57de72a943237cde4cc https://conda.anaconda.org/conda-forge/noarch/execnet-2.1.1-pyhd8ed1ab_1.conda#a71efeae2c160f6789900ba2631a2c90 https://conda.anaconda.org/conda-forge/noarch/hpack-4.1.0-pyhd8ed1ab_0.conda#0a802cb9888dd14eeefc611f05c40b6e @@ -66,7 +66,7 @@ https://conda.anaconda.org/conda-forge/noarch/meson-1.8.0-pyh29332c3_0.conda#8e2 https://conda.anaconda.org/conda-forge/linux-64/openblas-0.3.29-pthreads_h6ec200e_0.conda#7e4d48870b3258bea920d51b7f495a81 https://conda.anaconda.org/conda-forge/linux-64/openjpeg-2.5.3-h5fbd93e_0.conda#9e5816bc95d285c115a3ebc2f8563564 https://conda.anaconda.org/conda-forge/noarch/packaging-25.0-pyh29332c3_1.conda#58335b26c38bf4a20f399384c33cbcf9 -https://conda.anaconda.org/conda-forge/noarch/pluggy-1.5.0-pyhd8ed1ab_1.conda#e9dcbce5f45f9ee500e728ae58b605b6 +https://conda.anaconda.org/conda-forge/noarch/pluggy-1.6.0-pyhd8ed1ab_0.conda#7da7ccd349dbf6487a7778579d2bb971 https://conda.anaconda.org/conda-forge/noarch/pycparser-2.22-pyh29332c3_1.conda#12c566707c80111f9799308d9e265aef https://conda.anaconda.org/conda-forge/noarch/pygments-2.19.1-pyhd8ed1ab_0.conda#232fb4577b6687b2d503ef8e254270c9 https://conda.anaconda.org/conda-forge/noarch/pysocks-1.7.1-pyha55dd90_7.conda#461219d1a5bd61342293efa2c0c90eac @@ -96,7 +96,7 @@ https://conda.anaconda.org/conda-forge/noarch/pyproject-metadata-0.9.1-pyhd8ed1a https://conda.anaconda.org/conda-forge/noarch/python-dateutil-2.9.0.post0-pyhff2d567_1.conda#5ba79d7c71f03c678c8ead841f347d6e https://conda.anaconda.org/conda-forge/linux-64/liblapacke-3.9.0-31_he2f377e_openblas.conda#7e5fff7d0db69be3a266f7e79a3bb0e2 https://conda.anaconda.org/conda-forge/noarch/meson-python-0.18.0-pyh70fd9c4_0.conda#576c04b9d9f8e45285fb4d9452c26133 -https://conda.anaconda.org/conda-forge/linux-64/numpy-2.2.5-py310hefbff90_0.conda#5526bc875ec897f0d335e38da832b6ee +https://conda.anaconda.org/conda-forge/linux-64/numpy-2.2.6-py310hefbff90_0.conda#b0cea2c364bf65cd19e023040eeab05d https://conda.anaconda.org/conda-forge/noarch/pytest-8.3.5-pyhd8ed1ab_0.conda#c3c9316209dec74a705a36797970c6be https://conda.anaconda.org/conda-forge/linux-64/zstandard-0.23.0-py310ha75aee5_2.conda#f9254b5b0193982416b91edcb4b2676f https://conda.anaconda.org/conda-forge/linux-64/blas-devel-3.9.0-31_h1ea3ea9_openblas.conda#ba652ee0576396d4765e567f043c57f9 diff --git a/build_tools/azure/ubuntu_atlas_lock.txt b/build_tools/azure/ubuntu_atlas_lock.txt index 78b769cef4b6e..3111362d3d8d8 100644 --- a/build_tools/azure/ubuntu_atlas_lock.txt +++ b/build_tools/azure/ubuntu_atlas_lock.txt @@ -25,7 +25,7 @@ packaging==25.0 # meson-python # pyproject-metadata # pytest -pluggy==1.5.0 +pluggy==1.6.0 # via pytest pyproject-metadata==0.9.1 # via meson-python diff --git a/build_tools/circle/doc_linux-64_conda.lock b/build_tools/circle/doc_linux-64_conda.lock index f0c867fe5a1b2..aa523781187bc 100644 --- a/build_tools/circle/doc_linux-64_conda.lock +++ b/build_tools/circle/doc_linux-64_conda.lock @@ -28,7 +28,7 @@ https://conda.anaconda.org/conda-forge/linux-64/binutils_linux-64-2.43-h4852527_ https://conda.anaconda.org/conda-forge/linux-64/libgcc-15.1.0-h767d61c_2.conda#ea8ac52380885ed41c1baa8f1d6d2b93 https://conda.anaconda.org/conda-forge/linux-64/alsa-lib-1.2.14-hb9d3cd8_0.conda#76df83c2a9035c54df5d04ff81bcc02d https://conda.anaconda.org/conda-forge/linux-64/libbrotlicommon-1.1.0-hb9d3cd8_2.conda#41b599ed2b02abcfdd84302bff174b23 -https://conda.anaconda.org/conda-forge/linux-64/libdeflate-1.23-h86f0d12_0.conda#27fe770decaf469a53f3e3a6d593067f +https://conda.anaconda.org/conda-forge/linux-64/libdeflate-1.24-h86f0d12_0.conda#64f0c503da58ec25ebd359e4d990afa8 https://conda.anaconda.org/conda-forge/linux-64/libexpat-2.7.0-h5888daf_0.conda#db0bfbe7dd197b68ad5f30333bae6ce0 https://conda.anaconda.org/conda-forge/linux-64/libffi-3.4.6-h2dba641_1.conda#ede4673863426c0883c0063d853bbd85 https://conda.anaconda.org/conda-forge/linux-64/libgcc-ng-15.1.0-h69a702a_2.conda#ddca86c7040dd0e73b2b69bd7833d225 @@ -83,7 +83,7 @@ https://conda.anaconda.org/conda-forge/linux-64/zstd-1.5.7-hb8e6e7a_2.conda#6432 https://conda.anaconda.org/conda-forge/linux-64/aom-3.9.1-hac33072_0.conda#346722a0be40f6edc53f12640d301338 https://conda.anaconda.org/conda-forge/linux-64/blosc-1.21.6-he440d0b_1.conda#2c2fae981fd2afd00812c92ac47d023d https://conda.anaconda.org/conda-forge/linux-64/brotli-bin-1.1.0-hb9d3cd8_2.conda#c63b5e52939e795ba8d26e35d767a843 -https://conda.anaconda.org/conda-forge/linux-64/c-blosc2-2.15.2-h3122c55_1.conda#2bc8d76acd818d7e79229f5157d5c156 +https://conda.anaconda.org/conda-forge/linux-64/c-blosc2-2.17.1-h3122c55_0.conda#009d16d3c9ed3e70d58ed46dab1571d1 https://conda.anaconda.org/conda-forge/linux-64/charls-2.4.2-h59595ed_0.conda#4336bd67920dd504cd8c6761d6a99645 https://conda.anaconda.org/conda-forge/linux-64/gcc_impl_linux-64-13.3.0-h1e990d8_2.conda#f46cf0acdcb6019397d37df1e407ab91 https://conda.anaconda.org/conda-forge/linux-64/graphite2-1.3.13-h59595ed_1003.conda#f87c7b7c2cb45f323ffbce941c78ab7c @@ -94,9 +94,9 @@ https://conda.anaconda.org/conda-forge/linux-64/libdrm-2.4.124-hb9d3cd8_0.conda# https://conda.anaconda.org/conda-forge/linux-64/libfreetype6-2.13.3-h48d6fc4_1.conda#3c255be50a506c50765a93a6644f32fe https://conda.anaconda.org/conda-forge/linux-64/libjxl-0.11.1-h7b0646d_1.conda#959fc2b6c0df7883e070b3fe525219a5 https://conda.anaconda.org/conda-forge/linux-64/libopenblas-0.3.29-pthreads_h94d23a6_0.conda#0a4d0252248ef9a0f88f2ba8b8a08e12 -https://conda.anaconda.org/conda-forge/linux-64/libtiff-4.7.0-hd9ff511_4.conda#6c1028898cf3a2032d9af46689e1b81a +https://conda.anaconda.org/conda-forge/linux-64/libtiff-4.7.0-hf01ce69_5.conda#e79a094918988bb1807462cd42c83962 https://conda.anaconda.org/conda-forge/linux-64/libzopfli-1.0.3-h9c3ff4c_0.tar.bz2#c66fe2d123249af7651ebde8984c51c2 -https://conda.anaconda.org/conda-forge/linux-64/pcre2-10.44-hc749103_2.conda#31614c73d7b103ef76faa4d83d261d34 +https://conda.anaconda.org/conda-forge/linux-64/pcre2-10.45-hc749103_0.conda#b90bece58b4c2bf25969b70f3be42d25 https://conda.anaconda.org/conda-forge/linux-64/python-3.10.17-hd6af730_0_cpython.conda#7bb89638dae9ce1b8e051d0b721e83c2 https://conda.anaconda.org/conda-forge/linux-64/qhull-2020.2-h434a139_5.conda#353823361b1d27eb3960efb076dfcaf6 https://conda.anaconda.org/conda-forge/linux-64/xcb-util-0.4.1-hb711507_2.conda#8637c3e5821654d0edf97e2b0404b443 @@ -115,7 +115,7 @@ https://conda.anaconda.org/conda-forge/noarch/colorama-0.4.6-pyhd8ed1ab_1.conda# https://conda.anaconda.org/conda-forge/noarch/cpython-3.10.17-py310hd8ed1ab_0.conda#e2b81369f0473107784f8b7da8e6a8e9 https://conda.anaconda.org/conda-forge/noarch/cycler-0.12.1-pyhd8ed1ab_1.conda#44600c4667a319d67dbe0681fc0bc833 https://conda.anaconda.org/conda-forge/linux-64/cyrus-sasl-2.1.27-h54b06d7_7.conda#dce22f70b4e5a407ce88f2be046f4ceb -https://conda.anaconda.org/conda-forge/linux-64/cython-3.1.0-py310had8cdd9_0.conda#cb0972064e60dcfb49b3b4de71dafd4f +https://conda.anaconda.org/conda-forge/linux-64/cython-3.1.0-py310had8cdd9_1.conda#ad1ca59171c759e1b834eb6f199917ea https://conda.anaconda.org/conda-forge/noarch/docutils-0.21.2-pyhd8ed1ab_1.conda#24c1ca34138ee57de72a943237cde4cc https://conda.anaconda.org/conda-forge/noarch/execnet-2.1.1-pyhd8ed1ab_1.conda#a71efeae2c160f6789900ba2631a2c90 https://conda.anaconda.org/conda-forge/linux-64/gcc-13.3.0-h9576a4e_2.conda#d92e51bf4b6bdbfe45e5884fb0755afe @@ -133,19 +133,19 @@ https://conda.anaconda.org/conda-forge/linux-64/libavif16-1.3.0-h766b0b6_0.conda https://conda.anaconda.org/conda-forge/linux-64/libblas-3.9.0-31_h59b9bed_openblas.conda#728dbebd0f7a20337218beacffd37916 https://conda.anaconda.org/conda-forge/linux-64/libcups-2.3.3-h4637d8d_4.conda#d4529f4dff3057982a7617c7ac58fde3 https://conda.anaconda.org/conda-forge/linux-64/libfreetype-2.13.3-ha770c72_1.conda#51f5be229d83ecd401fb369ab96ae669 -https://conda.anaconda.org/conda-forge/linux-64/libglib-2.84.1-h2ff4ddf_0.conda#0305434da649d4fb48a425e588b79ea6 +https://conda.anaconda.org/conda-forge/linux-64/libglib-2.84.1-h3618099_1.conda#714c97d4ff495ab69d1fdfcadbcae985 https://conda.anaconda.org/conda-forge/linux-64/libglx-1.7.0-ha4b6fd6_2.conda#c8013e438185f33b13814c5c488acd5c https://conda.anaconda.org/conda-forge/linux-64/libxml2-2.13.8-h4bc477f_0.conda#14dbe05b929e329dbaa6f2d0aa19466d https://conda.anaconda.org/conda-forge/linux-64/markupsafe-3.0.2-py310h89163eb_1.conda#8ce3f0332fd6de0d737e2911d329523f https://conda.anaconda.org/conda-forge/noarch/meson-1.8.0-pyh29332c3_0.conda#8e25221b702272394b86b0f4d7217f77 https://conda.anaconda.org/conda-forge/noarch/munkres-1.1.4-pyh9f0ad1d_0.tar.bz2#2ba8498c1018c1e9c61eb99b973dfe19 -https://conda.anaconda.org/conda-forge/noarch/narwhals-1.38.2-pyhe01879c_0.conda#cd7799e415324fcc94dcf2405095c7da +https://conda.anaconda.org/conda-forge/noarch/narwhals-1.39.1-pyhe01879c_0.conda#3b89027583693a6dc7f30cf8184472b8 https://conda.anaconda.org/conda-forge/noarch/networkx-3.4.2-pyh267e887_2.conda#fd40bf7f7f4bc4b647dc8512053d9873 https://conda.anaconda.org/conda-forge/linux-64/openblas-0.3.29-pthreads_h6ec200e_0.conda#7e4d48870b3258bea920d51b7f495a81 https://conda.anaconda.org/conda-forge/linux-64/openjpeg-2.5.3-h5fbd93e_0.conda#9e5816bc95d285c115a3ebc2f8563564 https://conda.anaconda.org/conda-forge/noarch/packaging-25.0-pyh29332c3_1.conda#58335b26c38bf4a20f399384c33cbcf9 https://conda.anaconda.org/conda-forge/noarch/platformdirs-4.3.8-pyhe01879c_0.conda#424844562f5d337077b445ec6b1398a7 -https://conda.anaconda.org/conda-forge/noarch/pluggy-1.5.0-pyhd8ed1ab_1.conda#e9dcbce5f45f9ee500e728ae58b605b6 +https://conda.anaconda.org/conda-forge/noarch/pluggy-1.6.0-pyhd8ed1ab_0.conda#7da7ccd349dbf6487a7778579d2bb971 https://conda.anaconda.org/conda-forge/linux-64/psutil-7.0.0-py310ha75aee5_0.conda#da7d592394ff9084a23f62a1186451a2 https://conda.anaconda.org/conda-forge/noarch/pycparser-2.22-pyh29332c3_1.conda#12c566707c80111f9799308d9e265aef https://conda.anaconda.org/conda-forge/noarch/pygments-2.19.1-pyhd8ed1ab_0.conda#232fb4577b6687b2d503ef8e254270c9 @@ -161,7 +161,7 @@ https://conda.anaconda.org/conda-forge/noarch/sphinxcontrib-jsmath-1.0.1-pyhd8ed https://conda.anaconda.org/conda-forge/noarch/tabulate-0.9.0-pyhd8ed1ab_2.conda#959484a66b4b76befcddc4fa97c95567 https://conda.anaconda.org/conda-forge/noarch/threadpoolctl-3.6.0-pyhecae5ae_0.conda#9d64911b31d57ca443e9f1e36b04385f https://conda.anaconda.org/conda-forge/noarch/tomli-2.2.1-pyhd8ed1ab_1.conda#ac944244f1fed2eb49bae07193ae8215 -https://conda.anaconda.org/conda-forge/linux-64/tornado-6.4.2-py310ha75aee5_0.conda#166d59aab40b9c607b4cc21c03924e9d +https://conda.anaconda.org/conda-forge/linux-64/tornado-6.5-py310ha75aee5_0.conda#866b3582e300257f7e8dc67ec279a85b https://conda.anaconda.org/conda-forge/noarch/typing_extensions-4.13.2-pyh29332c3_0.conda#83fc6ae00127671e301c9f44254c31b8 https://conda.anaconda.org/conda-forge/linux-64/unicodedata2-16.0.0-py310ha75aee5_0.conda#1d7a4b9202cdd10d56ecdd7f6c347190 https://conda.anaconda.org/conda-forge/noarch/wheel-0.45.1-pyhd8ed1ab_1.conda#75cb7132eb58d97896e173ef12ac9986 @@ -192,14 +192,14 @@ https://conda.anaconda.org/conda-forge/noarch/joblib-1.5.0-pyhd8ed1ab_0.conda#3d https://conda.anaconda.org/conda-forge/linux-64/libcblas-3.9.0-31_he106b2a_openblas.conda#abb32c727da370c481a1c206f5159ce9 https://conda.anaconda.org/conda-forge/linux-64/libgl-1.7.0-ha4b6fd6_2.conda#928b8be80851f5d8ffb016f9c81dae7a https://conda.anaconda.org/conda-forge/linux-64/liblapack-3.9.0-31_h7ac8fdf_openblas.conda#452b98eafe050ecff932f0ec832dd03f -https://conda.anaconda.org/conda-forge/linux-64/libllvm20-20.1.4-he9d0ab4_0.conda#96c33bbd084ef2b2463503fb7f1482ae +https://conda.anaconda.org/conda-forge/linux-64/libllvm20-20.1.5-he9d0ab4_0.conda#8d2f5a2f019bd76ccba5eb771852d411 https://conda.anaconda.org/conda-forge/linux-64/libxkbcommon-1.9.2-h65c71a3_0.conda#d045b1d878031eb497cab44e6392b1df https://conda.anaconda.org/conda-forge/linux-64/libxslt-1.1.39-h76b75d6_0.conda#e71f31f8cfb0a91439f2086fc8aa0461 https://conda.anaconda.org/conda-forge/noarch/memory_profiler-0.61.0-pyhd8ed1ab_1.conda#71abbefb6f3b95e1668cd5e0af3affb9 https://conda.anaconda.org/conda-forge/linux-64/openldap-2.6.9-he970967_0.conda#ca2de8bbdc871bce41dbf59e51324165 https://conda.anaconda.org/conda-forge/linux-64/pillow-11.2.1-py310h7e6dc6c_0.conda#5645a243d90adb50909b9edc209d84fe https://conda.anaconda.org/conda-forge/noarch/pip-25.1.1-pyh8b19718_0.conda#32d0781ace05105cc99af55d36cbec7c -https://conda.anaconda.org/conda-forge/noarch/plotly-6.0.1-pyhd8ed1ab_0.conda#37ce02c899ff42ac5c554257b1a5906e +https://conda.anaconda.org/conda-forge/noarch/plotly-6.1.0-pyhd8ed1ab_0.conda#a5325bc8aa883fb56c551ec87ba2509d https://conda.anaconda.org/conda-forge/noarch/pyproject-metadata-0.9.1-pyhd8ed1ab_0.conda#22ae7c6ea81e0c8661ef32168dda929b https://conda.anaconda.org/conda-forge/noarch/python-dateutil-2.9.0.post0-pyhff2d567_1.conda#5ba79d7c71f03c678c8ead841f347d6e https://conda.anaconda.org/conda-forge/noarch/python-gil-3.10.17-hd8ed1ab_0.conda#c856adbd93a57004e21cd26564f4f724 @@ -218,12 +218,12 @@ https://conda.anaconda.org/conda-forge/linux-64/fontconfig-2.15.0-h7e30c49_1.con https://conda.anaconda.org/conda-forge/linux-64/fortran-compiler-1.9.0-h36df796_0.conda#cc0cf942201f9d3b0e9654ea02e12486 https://conda.anaconda.org/conda-forge/noarch/importlib-resources-6.5.2-pyhd8ed1ab_0.conda#e376ea42e9ae40f3278b0f79c9bf9826 https://conda.anaconda.org/conda-forge/noarch/lazy-loader-0.4-pyhd8ed1ab_2.conda#d10d9393680734a8febc4b362a4c94f2 -https://conda.anaconda.org/conda-forge/linux-64/libclang-cpp20.1-20.1.4-default_h1df26ce_0.conda#96f8d5b2e94c9ba4fef19f1adf068a15 -https://conda.anaconda.org/conda-forge/linux-64/libclang13-20.1.4-default_he06ed0a_0.conda#2d933632c8004be47deb2be61bf013be +https://conda.anaconda.org/conda-forge/linux-64/libclang-cpp20.1-20.1.5-default_h1df26ce_0.conda#79a1be1cd92a7f2b62e6c0a7c2da8bf8 +https://conda.anaconda.org/conda-forge/linux-64/libclang13-20.1.5-default_he06ed0a_0.conda#9a912cce23df3fea9d2adb75e505b153 https://conda.anaconda.org/conda-forge/linux-64/liblapacke-3.9.0-31_he2f377e_openblas.conda#7e5fff7d0db69be3a266f7e79a3bb0e2 https://conda.anaconda.org/conda-forge/linux-64/libpq-17.5-h27ae623_0.conda#6458be24f09e1b034902ab44fe9de908 https://conda.anaconda.org/conda-forge/noarch/meson-python-0.18.0-pyh70fd9c4_0.conda#576c04b9d9f8e45285fb4d9452c26133 -https://conda.anaconda.org/conda-forge/linux-64/numpy-2.2.5-py310hefbff90_0.conda#5526bc875ec897f0d335e38da832b6ee +https://conda.anaconda.org/conda-forge/linux-64/numpy-2.2.6-py310hefbff90_0.conda#b0cea2c364bf65cd19e023040eeab05d https://conda.anaconda.org/conda-forge/noarch/pytest-8.3.5-pyhd8ed1ab_0.conda#c3c9316209dec74a705a36797970c6be https://conda.anaconda.org/conda-forge/linux-64/xorg-libxtst-1.2.5-hb9d3cd8_3.conda#7bbe9a0cc0df0ac5f5a8ad6d6a11af2f https://conda.anaconda.org/conda-forge/linux-64/zstandard-0.23.0-py310ha75aee5_2.conda#f9254b5b0193982416b91edcb4b2676f @@ -231,27 +231,27 @@ https://conda.anaconda.org/conda-forge/linux-64/blas-devel-3.9.0-31_h1ea3ea9_ope https://conda.anaconda.org/conda-forge/linux-64/cairo-1.18.4-h3394656_0.conda#09262e66b19567aff4f592fb53b28760 https://conda.anaconda.org/conda-forge/linux-64/compilers-1.9.0-ha770c72_0.conda#5859096e397aba423340d0bbbb11ec64 https://conda.anaconda.org/conda-forge/linux-64/contourpy-1.3.2-py310h3788b33_0.conda#b6420d29123c7c823de168f49ccdfe6a -https://conda.anaconda.org/conda-forge/linux-64/imagecodecs-2024.12.30-py310h78a9a29_0.conda#e0c50079904122427bcf52e1afcd1cdb +https://conda.anaconda.org/conda-forge/linux-64/imagecodecs-2024.12.30-py310h481ba9f_1.conda#1a0a3b184dec933b4922a2721b3150a0 https://conda.anaconda.org/conda-forge/noarch/imageio-2.37.0-pyhfb79c49_0.conda#b5577bc2212219566578fd5af9993af6 -https://conda.anaconda.org/conda-forge/noarch/lazy_loader-0.4-pyhd8ed1ab_2.conda#bb0230917e2473c77d615104dbe8a49d https://conda.anaconda.org/conda-forge/linux-64/pandas-2.2.3-py310h5eaa309_3.conda#07697a584fab513ce895c4511f7a2403 https://conda.anaconda.org/conda-forge/noarch/patsy-1.0.1-pyhd8ed1ab_1.conda#ee23fabfd0a8c6b8d6f3729b47b2859d -https://conda.anaconda.org/conda-forge/linux-64/polars-1.29.0-py39h441220d_0.conda#6be2bbd70bf401a6f59952ba1355d8b8 +https://conda.anaconda.org/conda-forge/linux-64/polars-default-1.29.0-py39hfac2b71_1.conda#3c9014d11acfd00121c3d275aea778ad https://conda.anaconda.org/conda-forge/noarch/pytest-xdist-3.6.1-pyhd8ed1ab_1.conda#59aad4fb37cabc0bacc73cf344612ddd https://conda.anaconda.org/conda-forge/linux-64/pywavelets-1.8.0-py310hf462985_0.conda#4c441eff2be2e65bd67765c5642051c5 https://conda.anaconda.org/conda-forge/linux-64/scipy-1.15.2-py310h1d65ade_0.conda#8c29cd33b64b2eb78597fa28b5595c8d https://conda.anaconda.org/conda-forge/noarch/towncrier-24.8.0-pyhd8ed1ab_1.conda#820b6a1ddf590fba253f8204f7200d82 https://conda.anaconda.org/conda-forge/noarch/urllib3-2.4.0-pyhd8ed1ab_0.conda#c1e349028e0052c4eea844e94f773065 https://conda.anaconda.org/conda-forge/linux-64/blas-2.131-openblas.conda#38b2ec894c69bb4be0e66d2ef7fc60bf -https://conda.anaconda.org/conda-forge/linux-64/harfbuzz-11.1.0-h3beb420_0.conda#95e3bb97f9cdc251c0c68640e9c10ed3 +https://conda.anaconda.org/conda-forge/linux-64/harfbuzz-11.2.1-h3beb420_0.conda#0e6e192d4b3d95708ad192d957cf3163 https://conda.anaconda.org/conda-forge/linux-64/matplotlib-base-3.10.3-py310h68603db_0.conda#50084ca38bf28440e2762966bac143fc +https://conda.anaconda.org/conda-forge/linux-64/polars-1.29.0-default_h9d2e075_1.conda#7482bbd35de40c380fd2aa07c4babf90 https://conda.anaconda.org/conda-forge/linux-64/pyamg-5.2.1-py310ha2bacc8_1.conda#817d32861729e14f474249f1036291c4 https://conda.anaconda.org/conda-forge/noarch/requests-2.32.3-pyhd8ed1ab_1.conda#a9b9368f3701a417eac9edbcae7cb737 https://conda.anaconda.org/conda-forge/linux-64/statsmodels-0.14.4-py310hf462985_0.conda#636d3c500d8a851e377360e88ec95372 https://conda.anaconda.org/conda-forge/noarch/tifffile-2025.5.10-pyhd8ed1ab_0.conda#1fdb801f28bf4987294c49aaa314bf5e https://conda.anaconda.org/conda-forge/noarch/pooch-1.8.2-pyhd8ed1ab_1.conda#b3e783e8e8ed7577cf0b6dee37d1fbac -https://conda.anaconda.org/conda-forge/linux-64/qt6-main-6.9.0-h8d00660_2.conda#ac0eb548e24a2cb3c2c8ba060aef7db2 -https://conda.anaconda.org/conda-forge/linux-64/scikit-image-0.25.2-py310h5eaa309_0.conda#4cc3a231679ecb3c0ba20ebf3c27d12e +https://conda.anaconda.org/conda-forge/linux-64/qt6-main-6.9.0-h0384650_3.conda#8aa69e15597a205fd6f81781fe62c232 +https://conda.anaconda.org/conda-forge/linux-64/scikit-image-0.25.2-py310h5eaa309_1.conda#ed21ab72d049ecdb60f829f04b4dca1c https://conda.anaconda.org/conda-forge/noarch/seaborn-base-0.13.2-pyhd8ed1ab_3.conda#fd96da444e81f9e6fcaac38590f3dd42 https://conda.anaconda.org/conda-forge/linux-64/pyside6-6.9.0-py310hfd10a26_0.conda#1610ccfe262ee519716bb69bd4395572 https://conda.anaconda.org/conda-forge/noarch/seaborn-0.13.2-hd8ed1ab_3.conda#62afb877ca2c2b4b6f9ecb37320085b6 @@ -283,16 +283,16 @@ https://conda.anaconda.org/conda-forge/noarch/sphinxext-opengraph-0.9.1-pyhd8ed1 # pip overrides @ https://files.pythonhosted.org/packages/2c/ab/fc8290c6a4c722e5514d80f62b2dc4c4df1a68a41d1364e625c35990fcf3/overrides-7.7.0-py3-none-any.whl#sha256=c7ed9d062f78b8e4c1a7b70bd8796b35ead4d9f510227ef9c5dc7626c60d7e49 # pip pandocfilters @ https://files.pythonhosted.org/packages/ef/af/4fbc8cab944db5d21b7e2a5b8e9211a03a79852b1157e2c102fcc61ac440/pandocfilters-1.5.1-py2.py3-none-any.whl#sha256=93be382804a9cdb0a7267585f157e5d1731bbe5545a85b268d6f5fe6232de2bc # pip pkginfo @ https://files.pythonhosted.org/packages/fa/3d/f4f2ba829efb54b6cd2d91349c7463316a9cc55a43fc980447416c88540f/pkginfo-1.12.1.2-py3-none-any.whl#sha256=c783ac885519cab2c34927ccfa6bf64b5a704d7c69afaea583dd9b7afe969343 -# pip prometheus-client @ https://files.pythonhosted.org/packages/ff/c2/ab7d37426c179ceb9aeb109a85cda8948bb269b7561a0be870cc656eefe4/prometheus_client-0.21.1-py3-none-any.whl#sha256=594b45c410d6f4f8888940fe80b5cc2521b305a1fafe1c58609ef715a001f301 +# pip prometheus-client @ https://files.pythonhosted.org/packages/50/c7/cee159ba3d7192e84a4c166ec1752f44a5fa859ac0eeda2d73a1da65ab47/prometheus_client-0.22.0-py3-none-any.whl#sha256=c8951bbe64e62b96cd8e8f5d917279d1b9b91ab766793f33d4dce6c228558713 # pip ptyprocess @ https://files.pythonhosted.org/packages/22/a6/858897256d0deac81a172289110f31629fc4cee19b6f01283303e18c8db3/ptyprocess-0.7.0-py2.py3-none-any.whl#sha256=4b41f3967fce3af57cc7e94b888626c18bf37a083e3651ca8feeb66d492fef35 # pip python-json-logger @ https://files.pythonhosted.org/packages/08/20/0f2523b9e50a8052bc6a8b732dfc8568abbdc42010aef03a2d750bdab3b2/python_json_logger-3.3.0-py3-none-any.whl#sha256=dd980fae8cffb24c13caf6e158d3d61c0d6d22342f932cb6e9deedab3d35eec7 # pip pyyaml @ https://files.pythonhosted.org/packages/6b/4e/1523cb902fd98355e2e9ea5e5eb237cbc5f3ad5f3075fa65087aa0ecb669/PyYAML-6.0.2-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl#sha256=ec031d5d2feb36d1d1a24380e4db6d43695f3748343d99434e6f5f9156aaa2ed # pip rfc3986-validator @ https://files.pythonhosted.org/packages/9e/51/17023c0f8f1869d8806b979a2bffa3f861f26a3f1a66b094288323fba52f/rfc3986_validator-0.1.1-py2.py3-none-any.whl#sha256=2f235c432ef459970b4306369336b9d5dbdda31b510ca1e327636e01f528bfa9 -# pip rpds-py @ https://files.pythonhosted.org/packages/a7/a7/6d04d438f53d8bb2356bb000bea9cf5c96a9315e405b577117e344cc7404/rpds_py-0.24.0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl#sha256=1b221c2457d92a1fb3c97bee9095c874144d196f47c038462ae6e4a14436f7bc +# pip rpds-py @ https://files.pythonhosted.org/packages/bf/03/d8a23a4610dc1ce7853bdb5c099de8050dae93cc8e7550ad6854073fbcb7/rpds_py-0.25.0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl#sha256=c46bd76986e05689376d28fdc2b97d899576ce3e3aaa5a5f80f67a8300b26eb3 # pip send2trash @ https://files.pythonhosted.org/packages/40/b0/4562db6223154aa4e22f939003cb92514c79f3d4dccca3444253fd17f902/Send2Trash-1.8.3-py3-none-any.whl#sha256=0c31227e0bd08961c7665474a3d1ef7193929fedda4233843689baa056be46c9 # pip sniffio @ https://files.pythonhosted.org/packages/e9/44/75a9c9421471a6c4805dbf2356f7c181a29c1879239abab1ea2cc8f38b40/sniffio-1.3.1-py3-none-any.whl#sha256=2f6da418d1f1e0fddd844478f41680e794e6051915791a034ff65e5f100525a2 # pip traitlets @ https://files.pythonhosted.org/packages/00/c0/8f5d070730d7836adc9c9b6408dec68c6ced86b304a9b26a14df072a6e8c/traitlets-5.14.3-py3-none-any.whl#sha256=b74e89e397b1ed28cc831db7aea759ba6640cb3de13090ca145426688ff1ac4f -# pip types-python-dateutil @ https://files.pythonhosted.org/packages/0f/b3/ca41df24db5eb99b00d97f89d7674a90cb6b3134c52fb8121b6d8d30f15c/types_python_dateutil-2.9.0.20241206-py3-none-any.whl#sha256=e248a4bc70a486d3e3ec84d0dc30eec3a5f979d6e7ee4123ae043eedbb987f53 +# pip types-python-dateutil @ https://files.pythonhosted.org/packages/c5/3f/b0e8db149896005adc938a1e7f371d6d7e9eca4053a29b108978ed15e0c2/types_python_dateutil-2.9.0.20250516-py3-none-any.whl#sha256=2b2b3f57f9c6a61fba26a9c0ffb9ea5681c9b83e69cd897c6b5f668d9c0cab93 # pip uri-template @ https://files.pythonhosted.org/packages/e7/00/3fca040d7cf8a32776d3d81a00c8ee7457e00f80c649f1e4a863c8321ae9/uri_template-1.3.0-py3-none-any.whl#sha256=a44a133ea12d44a0c0f06d7d42a52d71282e77e2f937d8abd5655b8d56fc1363 # pip webcolors @ https://files.pythonhosted.org/packages/60/e8/c0e05e4684d13459f93d312077a9a2efbe04d59c393bc2b8802248c908d4/webcolors-24.11.1-py3-none-any.whl#sha256=515291393b4cdf0eb19c155749a096f779f7d909f7cceea072791cb9095b92e9 # pip webencodings @ https://files.pythonhosted.org/packages/f4/24/2a3e3df732393fed8b3ebf2ec078f05546de641fe1b667ee316ec1dcf3b7/webencodings-0.5.1-py2.py3-none-any.whl#sha256=a0af1213f3c2226497a97e2b3aa01a7e4bee4f403f95be16fc9acd2947514a78 @@ -325,6 +325,6 @@ https://conda.anaconda.org/conda-forge/noarch/sphinxext-opengraph-0.9.1-pyhd8ed1 # pip jupytext @ https://files.pythonhosted.org/packages/12/b7/e7e3d34c8095c19228874b1babedfb5d901374e40d51ae66f2a90203be53/jupytext-1.17.1-py3-none-any.whl#sha256=99145b1e1fa96520c21ba157de7d354ffa4904724dcebdcd70b8413688a312de # pip nbclient @ https://files.pythonhosted.org/packages/34/6d/e7fa07f03a4a7b221d94b4d586edb754a9b0dc3c9e2c93353e9fa4e0d117/nbclient-0.10.2-py3-none-any.whl#sha256=4ffee11e788b4a27fabeb7955547e4318a5298f34342a4bfd01f2e1faaeadc3d # pip nbconvert @ https://files.pythonhosted.org/packages/cc/9a/cd673b2f773a12c992f41309ef81b99da1690426bd2f96957a7ade0d3ed7/nbconvert-7.16.6-py3-none-any.whl#sha256=1375a7b67e0c2883678c48e506dc320febb57685e5ee67faa51b18a90f3a712b -# pip jupyter-server @ https://files.pythonhosted.org/packages/e2/a2/89eeaf0bb954a123a909859fa507fa86f96eb61b62dc30667b60dbd5fdaf/jupyter_server-2.15.0-py3-none-any.whl#sha256=872d989becf83517012ee669f09604aa4a28097c0bd90b2f424310156c2cdae3 +# pip jupyter-server @ https://files.pythonhosted.org/packages/46/1f/5ebbced977171d09a7b0c08a285ff9a20aafb9c51bde07e52349ff1ddd71/jupyter_server-2.16.0-py3-none-any.whl#sha256=3d8db5be3bc64403b1c65b400a1d7f4647a5ce743f3b20dbdefe8ddb7b55af9e # pip jupyterlab-server @ https://files.pythonhosted.org/packages/54/09/2032e7d15c544a0e3cd831c51d77a8ca57f7555b2e1b2922142eddb02a84/jupyterlab_server-2.27.3-py3-none-any.whl#sha256=e697488f66c3db49df675158a77b3b017520d772c6e1548c7d9bcc5df7944ee4 # pip jupyterlite-sphinx @ https://files.pythonhosted.org/packages/b8/68/d35f70a5ae17b30da996c48138c2d655232c2ee839c881ef44587d75d0d3/jupyterlite_sphinx-0.20.1-py3-none-any.whl#sha256=6f477879e9793813b5ed554f08d87b2d949b68595ec5b7570332aa2d0fe0a8c1 diff --git a/build_tools/circle/doc_min_dependencies_linux-64_conda.lock b/build_tools/circle/doc_min_dependencies_linux-64_conda.lock index 6c49a8e68e591..719494825a991 100644 --- a/build_tools/circle/doc_min_dependencies_linux-64_conda.lock +++ b/build_tools/circle/doc_min_dependencies_linux-64_conda.lock @@ -29,7 +29,7 @@ https://conda.anaconda.org/conda-forge/linux-64/libgcc-15.1.0-h767d61c_2.conda#e https://conda.anaconda.org/conda-forge/linux-64/alsa-lib-1.2.14-hb9d3cd8_0.conda#76df83c2a9035c54df5d04ff81bcc02d https://conda.anaconda.org/conda-forge/linux-64/gettext-tools-0.24.1-h5888daf_0.conda#d54305672f0361c2f3886750e7165b5f https://conda.anaconda.org/conda-forge/linux-64/libbrotlicommon-1.1.0-hb9d3cd8_2.conda#41b599ed2b02abcfdd84302bff174b23 -https://conda.anaconda.org/conda-forge/linux-64/libdeflate-1.23-h86f0d12_0.conda#27fe770decaf469a53f3e3a6d593067f +https://conda.anaconda.org/conda-forge/linux-64/libdeflate-1.24-h86f0d12_0.conda#64f0c503da58ec25ebd359e4d990afa8 https://conda.anaconda.org/conda-forge/linux-64/libexpat-2.7.0-h5888daf_0.conda#db0bfbe7dd197b68ad5f30333bae6ce0 https://conda.anaconda.org/conda-forge/linux-64/libffi-3.4.6-h2dba641_1.conda#ede4673863426c0883c0063d853bbd85 https://conda.anaconda.org/conda-forge/linux-64/libgcc-ng-15.1.0-h69a702a_2.conda#ddca86c7040dd0e73b2b69bd7833d225 @@ -82,7 +82,6 @@ https://conda.anaconda.org/conda-forge/linux-64/libxcb-1.17.0-h8a09558_0.conda#9 https://conda.anaconda.org/conda-forge/linux-64/libxcrypt-4.4.36-hd590300_1.conda#5aa797f8787fe7a17d1b0821485b5adc https://conda.anaconda.org/conda-forge/linux-64/lz4-c-1.10.0-h5888daf_1.conda#9de5350a85c4a20c685259b889aa6393 https://conda.anaconda.org/conda-forge/linux-64/mpg123-1.32.9-hc50e24c_0.conda#c7f302fd11eeb0987a6a5e1f3aed6a21 -https://conda.anaconda.org/conda-forge/linux-64/mysql-common-9.0.1-h266115a_6.conda#94116b69829e90b72d566e64421e1bff https://conda.anaconda.org/conda-forge/linux-64/ninja-1.12.1-hff21bea_1.conda#2322531904f27501ee19847b87ba7c64 https://conda.anaconda.org/conda-forge/linux-64/nspr-4.36-h5888daf_0.conda#de9cd5bca9e4918527b9b72b6e2e1409 https://conda.anaconda.org/conda-forge/linux-64/pixman-0.46.0-h29eaf8c_0.conda#d2f1c87d4416d1e7344cf92b1aaee1c4 @@ -97,7 +96,7 @@ https://conda.anaconda.org/conda-forge/linux-64/zstd-1.5.7-hb8e6e7a_2.conda#6432 https://conda.anaconda.org/conda-forge/linux-64/aom-3.9.1-hac33072_0.conda#346722a0be40f6edc53f12640d301338 https://conda.anaconda.org/conda-forge/linux-64/blosc-1.21.6-he440d0b_1.conda#2c2fae981fd2afd00812c92ac47d023d https://conda.anaconda.org/conda-forge/linux-64/brotli-bin-1.1.0-hb9d3cd8_2.conda#c63b5e52939e795ba8d26e35d767a843 -https://conda.anaconda.org/conda-forge/linux-64/c-blosc2-2.15.2-h3122c55_1.conda#2bc8d76acd818d7e79229f5157d5c156 +https://conda.anaconda.org/conda-forge/linux-64/c-blosc2-2.17.1-h3122c55_0.conda#009d16d3c9ed3e70d58ed46dab1571d1 https://conda.anaconda.org/conda-forge/linux-64/charls-2.4.2-h59595ed_0.conda#4336bd67920dd504cd8c6761d6a99645 https://conda.anaconda.org/conda-forge/linux-64/gcc_impl_linux-64-13.3.0-h1e990d8_2.conda#f46cf0acdcb6019397d37df1e407ab91 https://conda.anaconda.org/conda-forge/linux-64/graphite2-1.3.13-h59595ed_1003.conda#f87c7b7c2cb45f323ffbce941c78ab7c @@ -109,13 +108,12 @@ https://conda.anaconda.org/conda-forge/linux-64/libblas-3.9.0-31_h66dfbfd_blis.c https://conda.anaconda.org/conda-forge/linux-64/libcap-2.75-h39aace5_0.conda#c44c16d6976d2aebbd65894d7741e67e https://conda.anaconda.org/conda-forge/linux-64/libdrm-2.4.124-hb9d3cd8_0.conda#8bc89311041d7fcb510238cf0848ccae https://conda.anaconda.org/conda-forge/linux-64/libfreetype6-2.13.3-h48d6fc4_1.conda#3c255be50a506c50765a93a6644f32fe -https://conda.anaconda.org/conda-forge/linux-64/libgcrypt-lib-1.11.0-hb9d3cd8_2.conda#e55712ff40a054134d51b89afca57dbc +https://conda.anaconda.org/conda-forge/linux-64/libgcrypt-lib-1.11.1-hb9d3cd8_0.conda#8504a291085c9fb809b66cabd5834307 https://conda.anaconda.org/conda-forge/linux-64/libgfortran-ng-15.1.0-h69a702a_2.conda#a483a87b71e974bb75d1b9413d4436dd https://conda.anaconda.org/conda-forge/linux-64/libjxl-0.11.1-h7b0646d_1.conda#959fc2b6c0df7883e070b3fe525219a5 -https://conda.anaconda.org/conda-forge/linux-64/libtiff-4.7.0-hd9ff511_4.conda#6c1028898cf3a2032d9af46689e1b81a +https://conda.anaconda.org/conda-forge/linux-64/libtiff-4.7.0-hf01ce69_5.conda#e79a094918988bb1807462cd42c83962 https://conda.anaconda.org/conda-forge/linux-64/libvorbis-1.3.7-h9c3ff4c_0.tar.bz2#309dec04b70a3cc0f1e84a4013683bc0 https://conda.anaconda.org/conda-forge/linux-64/libzopfli-1.0.3-h9c3ff4c_0.tar.bz2#c66fe2d123249af7651ebde8984c51c2 -https://conda.anaconda.org/conda-forge/linux-64/mysql-libs-9.0.1-he0572af_6.conda#9802ae6d20982f42c0f5d69008988763 https://conda.anaconda.org/conda-forge/linux-64/nss-3.111-h159eef7_0.conda#311e8370c9db254611ec87250f6370a0 https://conda.anaconda.org/conda-forge/linux-64/pcre2-10.45-hc749103_0.conda#b90bece58b4c2bf25969b70f3be42d25 https://conda.anaconda.org/conda-forge/linux-64/python-3.10.17-hd6af730_0_cpython.conda#7bb89638dae9ce1b8e051d0b721e83c2 @@ -168,7 +166,7 @@ https://conda.anaconda.org/conda-forge/noarch/munkres-1.1.4-pyh9f0ad1d_0.tar.bz2 https://conda.anaconda.org/conda-forge/noarch/networkx-3.2-pyhd8ed1ab_0.conda#cec8cc498664cc00a070676aa89e69a7 https://conda.anaconda.org/conda-forge/linux-64/openjpeg-2.5.3-h5fbd93e_0.conda#9e5816bc95d285c115a3ebc2f8563564 https://conda.anaconda.org/conda-forge/noarch/packaging-25.0-pyh29332c3_1.conda#58335b26c38bf4a20f399384c33cbcf9 -https://conda.anaconda.org/conda-forge/noarch/pluggy-1.5.0-pyhd8ed1ab_1.conda#e9dcbce5f45f9ee500e728ae58b605b6 +https://conda.anaconda.org/conda-forge/noarch/pluggy-1.6.0-pyhd8ed1ab_0.conda#7da7ccd349dbf6487a7778579d2bb971 https://conda.anaconda.org/conda-forge/noarch/ply-3.11-pyhd8ed1ab_3.conda#fd5062942bfa1b0bd5e0d2a4397b099e https://conda.anaconda.org/conda-forge/linux-64/psutil-7.0.0-py310ha75aee5_0.conda#da7d592394ff9084a23f62a1186451a2 https://conda.anaconda.org/conda-forge/noarch/pycparser-2.22-pyh29332c3_1.conda#12c566707c80111f9799308d9e265aef @@ -187,7 +185,7 @@ https://conda.anaconda.org/conda-forge/noarch/threadpoolctl-3.6.0-pyhecae5ae_0.c https://conda.anaconda.org/conda-forge/noarch/toml-0.10.2-pyhd8ed1ab_1.conda#b0dd904de08b7db706167240bf37b164 https://conda.anaconda.org/conda-forge/noarch/tomli-2.2.1-pyhd8ed1ab_1.conda#ac944244f1fed2eb49bae07193ae8215 https://conda.anaconda.org/conda-forge/noarch/toolz-1.0.0-pyhd8ed1ab_1.conda#40d0ed782a8aaa16ef248e68c06c168d -https://conda.anaconda.org/conda-forge/linux-64/tornado-6.4.2-py310ha75aee5_0.conda#166d59aab40b9c607b4cc21c03924e9d +https://conda.anaconda.org/conda-forge/linux-64/tornado-6.5-py310ha75aee5_0.conda#866b3582e300257f7e8dc67ec279a85b https://conda.anaconda.org/conda-forge/noarch/typing_extensions-4.13.2-pyh29332c3_0.conda#83fc6ae00127671e301c9f44254c31b8 https://conda.anaconda.org/conda-forge/linux-64/unicodedata2-16.0.0-py310ha75aee5_0.conda#1d7a4b9202cdd10d56ecdd7f6c347190 https://conda.anaconda.org/conda-forge/noarch/wheel-0.45.1-pyhd8ed1ab_1.conda#75cb7132eb58d97896e173ef12ac9986 @@ -220,7 +218,7 @@ https://conda.anaconda.org/conda-forge/noarch/joblib-1.5.0-pyhd8ed1ab_0.conda#3d https://conda.anaconda.org/conda-forge/linux-64/libflac-1.4.3-h59595ed_0.conda#ee48bf17cc83a00f59ca1494d5646869 https://conda.anaconda.org/conda-forge/linux-64/libgl-1.7.0-ha4b6fd6_2.conda#928b8be80851f5d8ffb016f9c81dae7a https://conda.anaconda.org/conda-forge/linux-64/liblapacke-3.9.0-12_hce4cc19_netlib.conda#bdcf65db13abdddba7af29592f93600b -https://conda.anaconda.org/conda-forge/linux-64/libllvm20-20.1.4-he9d0ab4_0.conda#96c33bbd084ef2b2463503fb7f1482ae +https://conda.anaconda.org/conda-forge/linux-64/libllvm20-20.1.5-he9d0ab4_0.conda#8d2f5a2f019bd76ccba5eb771852d411 https://conda.anaconda.org/conda-forge/linux-64/libxkbcommon-1.9.2-h65c71a3_0.conda#d045b1d878031eb497cab44e6392b1df https://conda.anaconda.org/conda-forge/noarch/memory_profiler-0.61.0-pyhd8ed1ab_1.conda#71abbefb6f3b95e1668cd5e0af3affb9 https://conda.anaconda.org/conda-forge/linux-64/numpy-1.22.0-py310h454958d_1.tar.bz2#607c66f0cce2986515a8fe9e136b2b57 @@ -239,15 +237,15 @@ https://conda.anaconda.org/conda-forge/linux-64/xorg-libxxf86vm-1.1.6-hb9d3cd8_0 https://conda.anaconda.org/conda-forge/noarch/beautifulsoup4-4.13.4-pyha770c72_0.conda#9f07c4fc992adb2d6c30da7fab3959a7 https://conda.anaconda.org/conda-forge/linux-64/blas-devel-3.9.0-31_hdec4247_blis.conda#1675e95a742c910204645f7b6d7e56dc https://conda.anaconda.org/conda-forge/linux-64/cxx-compiler-1.9.0-h1a2810e_0.conda#1ce8b218d359d9ed0ab481f2a3f3c512 -https://conda.anaconda.org/conda-forge/noarch/dask-core-2025.4.1-pyhd8ed1ab_0.conda#0735ecef025a6c2d6eb61aae4785fc3f +https://conda.anaconda.org/conda-forge/noarch/dask-core-2025.5.0-pyhd8ed1ab_0.conda#69bab6d290b49ccb24104515508ee4d0 https://conda.anaconda.org/conda-forge/linux-64/fontconfig-2.15.0-h7e30c49_1.conda#8f5b0b297b59e1ac160ad4beec99dbee https://conda.anaconda.org/conda-forge/linux-64/fortran-compiler-1.9.0-h36df796_0.conda#cc0cf942201f9d3b0e9654ea02e12486 https://conda.anaconda.org/conda-forge/linux-64/glib-2.84.1-h6287aef_1.conda#35012688d30e1b52bff2ba5d1f342a50 -https://conda.anaconda.org/conda-forge/linux-64/imagecodecs-2024.12.30-py310h78a9a29_0.conda#e0c50079904122427bcf52e1afcd1cdb +https://conda.anaconda.org/conda-forge/linux-64/imagecodecs-2024.12.30-py310h481ba9f_1.conda#1a0a3b184dec933b4922a2721b3150a0 https://conda.anaconda.org/conda-forge/noarch/imageio-2.37.0-pyhfb79c49_0.conda#b5577bc2212219566578fd5af9993af6 https://conda.anaconda.org/conda-forge/noarch/importlib-resources-6.5.2-pyhd8ed1ab_0.conda#e376ea42e9ae40f3278b0f79c9bf9826 -https://conda.anaconda.org/conda-forge/linux-64/libclang-cpp20.1-20.1.4-default_h1df26ce_0.conda#96f8d5b2e94c9ba4fef19f1adf068a15 -https://conda.anaconda.org/conda-forge/linux-64/libclang13-20.1.4-default_he06ed0a_0.conda#2d933632c8004be47deb2be61bf013be +https://conda.anaconda.org/conda-forge/linux-64/libclang-cpp20.1-20.1.5-default_h1df26ce_0.conda#79a1be1cd92a7f2b62e6c0a7c2da8bf8 +https://conda.anaconda.org/conda-forge/linux-64/libclang13-20.1.5-default_he06ed0a_0.conda#9a912cce23df3fea9d2adb75e505b153 https://conda.anaconda.org/conda-forge/linux-64/libpq-17.5-h27ae623_0.conda#6458be24f09e1b034902ab44fe9de908 https://conda.anaconda.org/conda-forge/linux-64/libsndfile-1.2.2-hc60ed4a_1.conda#ef1910918dd895516a769ed36b5b3a4e https://conda.anaconda.org/conda-forge/linux-64/matplotlib-base-3.5.0-py310h23f4a51_0.tar.bz2#9911225650b298776c8e8c083b5cacf1 @@ -273,12 +271,12 @@ https://conda.anaconda.org/conda-forge/noarch/tifffile-2025.5.10-pyhd8ed1ab_0.co https://conda.anaconda.org/conda-forge/noarch/towncrier-24.8.0-pyhd8ed1ab_1.conda#820b6a1ddf590fba253f8204f7200d82 https://conda.anaconda.org/conda-forge/noarch/urllib3-2.4.0-pyhd8ed1ab_0.conda#c1e349028e0052c4eea844e94f773065 https://conda.anaconda.org/conda-forge/linux-64/gst-plugins-base-1.24.11-h651a532_0.conda#d8d8894f8ced2c9be76dc9ad1ae531ce -https://conda.anaconda.org/conda-forge/linux-64/harfbuzz-11.1.0-h3beb420_0.conda#95e3bb97f9cdc251c0c68640e9c10ed3 +https://conda.anaconda.org/conda-forge/linux-64/harfbuzz-11.2.1-h3beb420_0.conda#0e6e192d4b3d95708ad192d957cf3163 https://conda.anaconda.org/conda-forge/noarch/requests-2.32.3-pyhd8ed1ab_1.conda#a9b9368f3701a417eac9edbcae7cb737 https://conda.anaconda.org/conda-forge/linux-64/scikit-image-0.19.0-py310hb5077e9_0.tar.bz2#aa24b3a4aa979641ac3144405209cd89 https://conda.anaconda.org/conda-forge/noarch/seaborn-0.13.2-hd8ed1ab_3.conda#62afb877ca2c2b4b6f9ecb37320085b6 https://conda.anaconda.org/conda-forge/noarch/pooch-1.6.0-pyhd8ed1ab_0.tar.bz2#6429e1d1091c51f626b5dcfdd38bf429 -https://conda.anaconda.org/conda-forge/linux-64/qt-main-5.15.15-h993ce98_3.conda#aa49f5308f39277477d47cd6687eb8f3 +https://conda.anaconda.org/conda-forge/linux-64/qt-main-5.15.15-hea1682b_4.conda#c054d7f22cc719e12c72d454b2328d6c https://conda.anaconda.org/conda-forge/linux-64/pyqt-5.15.11-py310hf392a12_0.conda#65924d3e57be25342c76530d23d75f0f https://conda.anaconda.org/conda-forge/linux-64/matplotlib-3.5.0-py310hff52083_0.tar.bz2#1b2f3b135d5d9c594b5e0e6150c03b7b https://conda.anaconda.org/conda-forge/noarch/numpydoc-1.2-pyhd8ed1ab_0.tar.bz2#025ad7ca2c7f65007ab6b6f5d93a56eb diff --git a/build_tools/github/pymin_conda_forge_arm_linux-aarch64_conda.lock b/build_tools/github/pymin_conda_forge_arm_linux-aarch64_conda.lock index 9ade6530eab80..8484e580d3d0f 100644 --- a/build_tools/github/pymin_conda_forge_arm_linux-aarch64_conda.lock +++ b/build_tools/github/pymin_conda_forge_arm_linux-aarch64_conda.lock @@ -20,7 +20,7 @@ https://conda.anaconda.org/conda-forge/noarch/fonts-conda-ecosystem-1-0.tar.bz2# https://conda.anaconda.org/conda-forge/linux-aarch64/libgcc-15.1.0-he277a41_2.conda#224e999bbcad260d7bd4c0c27fdb99a4 https://conda.anaconda.org/conda-forge/linux-aarch64/alsa-lib-1.2.14-h86ecc28_0.conda#a696b24c1b473ecc4774bcb5a6ac6337 https://conda.anaconda.org/conda-forge/linux-aarch64/libbrotlicommon-1.1.0-h86ecc28_2.conda#3ee026955c688f551a9999840cff4c67 -https://conda.anaconda.org/conda-forge/linux-aarch64/libdeflate-1.23-he377734_0.conda#308ad7cbe9fd92add59ef3d547a42c17 +https://conda.anaconda.org/conda-forge/linux-aarch64/libdeflate-1.24-he377734_0.conda#f0b3d6494663b3385bf87fc206d7451a https://conda.anaconda.org/conda-forge/linux-aarch64/libexpat-2.7.0-h5ad3122_0.conda#d41a057e7968705dae8dcb7c8ba2c8dd https://conda.anaconda.org/conda-forge/linux-aarch64/libffi-3.4.6-he21f813_1.conda#15a131f30cae36e9a655ca81fee9a285 https://conda.anaconda.org/conda-forge/linux-aarch64/libgcc-ng-15.1.0-he9431aa_2.conda#d12a4b26073751bbc3db18de83ccba5f @@ -69,8 +69,8 @@ https://conda.anaconda.org/conda-forge/linux-aarch64/libdrm-2.4.124-h86ecc28_0.c https://conda.anaconda.org/conda-forge/linux-aarch64/libfreetype6-2.13.3-he93130f_1.conda#51eae9012d75b8f7e4b0adfe61a83330 https://conda.anaconda.org/conda-forge/linux-aarch64/libgfortran-ng-15.1.0-he9431aa_2.conda#55c5691e8b65612aaa0ef109cf645724 https://conda.anaconda.org/conda-forge/linux-aarch64/libopenblas-0.3.29-pthreads_h9d3fd7e_0.conda#a99e2bfcb1ad6362544c71281eb617e9 -https://conda.anaconda.org/conda-forge/linux-aarch64/libtiff-4.7.0-h88f7998_4.conda#6edd78ac9bee9a972f25cb6e8c6e21ad -https://conda.anaconda.org/conda-forge/linux-aarch64/pcre2-10.44-hf4ec17f_2.conda#ab9d0f9a3c9ce23e4fd2af4edc6fa245 +https://conda.anaconda.org/conda-forge/linux-aarch64/libtiff-4.7.0-h7c15681_5.conda#264a9aac20276b1784dac8c5f8d3704a +https://conda.anaconda.org/conda-forge/linux-aarch64/pcre2-10.45-hf4ec17f_0.conda#ad22a9a9497f7aedce73e0da53cd215f https://conda.anaconda.org/conda-forge/linux-aarch64/python-3.10.17-h256493d_0_cpython.conda#c496213b6ede3c5a30ce1bf02bebf382 https://conda.anaconda.org/conda-forge/linux-aarch64/qhull-2020.2-h70be974_5.conda#bb138086d938e2b64f5f364945793ebf https://conda.anaconda.org/conda-forge/linux-aarch64/xcb-util-0.4.1-h5c728e9_2.conda#b4cf8ba6cff9cdf1249bcfe1314222b0 @@ -83,7 +83,7 @@ https://conda.anaconda.org/conda-forge/linux-aarch64/brotli-1.1.0-h86ecc28_2.con https://conda.anaconda.org/conda-forge/noarch/colorama-0.4.6-pyhd8ed1ab_1.conda#962b9857ee8e7018c22f2776ffa0b2d7 https://conda.anaconda.org/conda-forge/noarch/cycler-0.12.1-pyhd8ed1ab_1.conda#44600c4667a319d67dbe0681fc0bc833 https://conda.anaconda.org/conda-forge/linux-aarch64/cyrus-sasl-2.1.27-hf6b2984_7.conda#7a85d417c8acd7a5215c082c5b9219e5 -https://conda.anaconda.org/conda-forge/linux-aarch64/cython-3.1.0-py310hc86cfe9_0.conda#5d1b56d9fa3f159dfa7429358abc3574 +https://conda.anaconda.org/conda-forge/linux-aarch64/cython-3.1.0-py310hc86cfe9_1.conda#3642551f371fe1a23b5ef5925294a11b https://conda.anaconda.org/conda-forge/noarch/execnet-2.1.1-pyhd8ed1ab_1.conda#a71efeae2c160f6789900ba2631a2c90 https://conda.anaconda.org/conda-forge/noarch/iniconfig-2.0.0-pyhd8ed1ab_1.conda#6837f3eff7dcea42ecd714ce1ac2b108 https://conda.anaconda.org/conda-forge/linux-aarch64/kiwisolver-1.4.7-py310h5d7f10c_0.conda#b86d594bf17c9ad7a291593368ae8ba7 @@ -91,7 +91,7 @@ https://conda.anaconda.org/conda-forge/linux-aarch64/lcms2-2.17-hc88f144_0.conda https://conda.anaconda.org/conda-forge/linux-aarch64/libblas-3.9.0-31_h1a9f1db_openblas.conda#48bd5bf15ccf3e409840be9caafc0ad5 https://conda.anaconda.org/conda-forge/linux-aarch64/libcups-2.3.3-h405e4a8_4.conda#d42c670b0c96c1795fd859d5e0275a55 https://conda.anaconda.org/conda-forge/linux-aarch64/libfreetype-2.13.3-h8af1aa0_1.conda#2d4a1c3dcabb80b4a56d5c34bdacea08 -https://conda.anaconda.org/conda-forge/linux-aarch64/libglib-2.84.1-hc486b8e_0.conda#07cb059040220481ab9eda17cb86f644 +https://conda.anaconda.org/conda-forge/linux-aarch64/libglib-2.84.1-hc022ef1_1.conda#5bee669fdb0324a387626d59a193bce7 https://conda.anaconda.org/conda-forge/linux-aarch64/libglx-1.7.0-hd24410f_2.conda#1d4269e233636148696a67e2d30dad2a https://conda.anaconda.org/conda-forge/linux-aarch64/libhiredis-1.0.2-h05efe27_0.tar.bz2#a87f068744fd20334cd41489eb163bee https://conda.anaconda.org/conda-forge/linux-aarch64/libxml2-2.13.8-he060846_0.conda#c73dfe6886cc8d39a09c357a36f91fb2 @@ -100,13 +100,13 @@ https://conda.anaconda.org/conda-forge/noarch/munkres-1.1.4-pyh9f0ad1d_0.tar.bz2 https://conda.anaconda.org/conda-forge/linux-aarch64/openblas-0.3.29-pthreads_h3a8cbd8_0.conda#4ec5b6144709ced5e7933977675f61c6 https://conda.anaconda.org/conda-forge/linux-aarch64/openjpeg-2.5.3-h3f56577_0.conda#04231368e4af50d11184b50e14250993 https://conda.anaconda.org/conda-forge/noarch/packaging-25.0-pyh29332c3_1.conda#58335b26c38bf4a20f399384c33cbcf9 -https://conda.anaconda.org/conda-forge/noarch/pluggy-1.5.0-pyhd8ed1ab_1.conda#e9dcbce5f45f9ee500e728ae58b605b6 +https://conda.anaconda.org/conda-forge/noarch/pluggy-1.6.0-pyhd8ed1ab_0.conda#7da7ccd349dbf6487a7778579d2bb971 https://conda.anaconda.org/conda-forge/noarch/pyparsing-3.2.3-pyhd8ed1ab_1.conda#513d3c262ee49b54a8fec85c5bc99764 https://conda.anaconda.org/conda-forge/noarch/setuptools-80.1.0-pyhff2d567_0.conda#f6f72d0837c79eaec77661be43e8a691 https://conda.anaconda.org/conda-forge/noarch/six-1.17.0-pyhd8ed1ab_0.conda#a451d576819089b0d672f18768be0f65 https://conda.anaconda.org/conda-forge/noarch/threadpoolctl-3.6.0-pyhecae5ae_0.conda#9d64911b31d57ca443e9f1e36b04385f https://conda.anaconda.org/conda-forge/noarch/tomli-2.2.1-pyhd8ed1ab_1.conda#ac944244f1fed2eb49bae07193ae8215 -https://conda.anaconda.org/conda-forge/linux-aarch64/tornado-6.4.2-py310h78583b1_0.conda#68a2bd5dcbb6feac96dee39f4b49fe0f +https://conda.anaconda.org/conda-forge/linux-aarch64/tornado-6.5-py310h78583b1_0.conda#b50bfa58708978dcce6ccc8c468ff302 https://conda.anaconda.org/conda-forge/noarch/typing_extensions-4.13.2-pyh29332c3_0.conda#83fc6ae00127671e301c9f44254c31b8 https://conda.anaconda.org/conda-forge/linux-aarch64/unicodedata2-16.0.0-py310ha766c32_0.conda#2936ce19a675e162962f396c7b40b905 https://conda.anaconda.org/conda-forge/noarch/wheel-0.45.1-pyhd8ed1ab_1.conda#75cb7132eb58d97896e173ef12ac9986 @@ -124,7 +124,7 @@ https://conda.anaconda.org/conda-forge/noarch/joblib-1.5.0-pyhd8ed1ab_0.conda#3d https://conda.anaconda.org/conda-forge/linux-aarch64/libcblas-3.9.0-31_hab92f65_openblas.conda#6b81dbae56a519f1ec2f25e0ee2f4334 https://conda.anaconda.org/conda-forge/linux-aarch64/libgl-1.7.0-hd24410f_2.conda#0d00176464ebb25af83d40736a2cd3bb https://conda.anaconda.org/conda-forge/linux-aarch64/liblapack-3.9.0-31_h411afd4_openblas.conda#41dbff5eb805a75c120a7b7a1c744dc2 -https://conda.anaconda.org/conda-forge/linux-aarch64/libllvm20-20.1.4-h07bd352_0.conda#a83f31777ec098202198145883d86ffb +https://conda.anaconda.org/conda-forge/linux-aarch64/libllvm20-20.1.5-h07bd352_0.conda#d898466dd826e8acf6d0ee075028f6bd https://conda.anaconda.org/conda-forge/linux-aarch64/libxkbcommon-1.9.2-hbab7b08_0.conda#7b47a2ccfb81b4be6be320b365e1cf33 https://conda.anaconda.org/conda-forge/linux-aarch64/libxslt-1.1.39-h1cc9640_0.conda#13e1d3f9188e85c6d59a98651aced002 https://conda.anaconda.org/conda-forge/linux-aarch64/openldap-2.6.9-h30c48ee_0.conda#c07822a5de65ce9797b9afa257faa917 @@ -140,12 +140,12 @@ https://conda.anaconda.org/conda-forge/linux-aarch64/xorg-libxi-1.8.2-h57736b2_0 https://conda.anaconda.org/conda-forge/linux-aarch64/xorg-libxrandr-1.5.4-h86ecc28_0.conda#dd3e74283a082381aa3860312e3c721e https://conda.anaconda.org/conda-forge/linux-aarch64/xorg-libxxf86vm-1.1.6-h86ecc28_0.conda#d745faa2d7c15092652e40a22bb261ed https://conda.anaconda.org/conda-forge/linux-aarch64/fontconfig-2.15.0-h8dda3cd_1.conda#112b71b6af28b47c624bcbeefeea685b -https://conda.anaconda.org/conda-forge/linux-aarch64/libclang-cpp20.1-20.1.4-default_h7d4303a_0.conda#d71665eccdb65183c72e149424ec3928 -https://conda.anaconda.org/conda-forge/linux-aarch64/libclang13-20.1.4-default_h9e36cb9_0.conda#6d587caa650694fa5f6d04fda1bcfee2 +https://conda.anaconda.org/conda-forge/linux-aarch64/libclang-cpp20.1-20.1.5-default_h7d4303a_0.conda#832fb047ca0a4e4c83cb0f3004000f7b +https://conda.anaconda.org/conda-forge/linux-aarch64/libclang13-20.1.5-default_h9e36cb9_0.conda#6072f3b5b573cfd6ad4562813dc0d4e7 https://conda.anaconda.org/conda-forge/linux-aarch64/liblapacke-3.9.0-31_hc659ca5_openblas.conda#256bb281d78e5b8927ff13a1cde9f6f5 https://conda.anaconda.org/conda-forge/linux-aarch64/libpq-17.5-hf590da8_0.conda#b5a01e5aa04651ccf5865c2d029affa3 https://conda.anaconda.org/conda-forge/noarch/meson-python-0.18.0-pyh70fd9c4_0.conda#576c04b9d9f8e45285fb4d9452c26133 -https://conda.anaconda.org/conda-forge/linux-aarch64/numpy-2.2.5-py310h6e5608f_0.conda#5c521c566cbcf058769c613dee3a18d6 +https://conda.anaconda.org/conda-forge/linux-aarch64/numpy-2.2.6-py310h6e5608f_0.conda#9e9f1f279eb02c41bda162a42861adc0 https://conda.anaconda.org/conda-forge/noarch/pytest-8.3.5-pyhd8ed1ab_0.conda#c3c9316209dec74a705a36797970c6be https://conda.anaconda.org/conda-forge/linux-aarch64/xorg-libxtst-1.2.5-h57736b2_3.conda#c05698071b5c8e0da82a282085845860 https://conda.anaconda.org/conda-forge/linux-aarch64/blas-devel-3.9.0-31_h9678261_openblas.conda#a2cc143d7e25e52a915cb320e5b0d592 @@ -154,8 +154,8 @@ https://conda.anaconda.org/conda-forge/linux-aarch64/contourpy-1.3.2-py310hf54e6 https://conda.anaconda.org/conda-forge/noarch/pytest-xdist-3.6.1-pyhd8ed1ab_1.conda#59aad4fb37cabc0bacc73cf344612ddd https://conda.anaconda.org/conda-forge/linux-aarch64/scipy-1.15.2-py310hf37559f_0.conda#5c9b72f10d2118d943a5eaaf2f396891 https://conda.anaconda.org/conda-forge/linux-aarch64/blas-2.131-openblas.conda#51c5f346e1ebee750f76066490059df9 -https://conda.anaconda.org/conda-forge/linux-aarch64/harfbuzz-11.1.0-h405b6a2_0.conda#6fd48c127b76a95ed3858c47fa9db7b0 +https://conda.anaconda.org/conda-forge/linux-aarch64/harfbuzz-11.2.1-h405b6a2_0.conda#b55680fc90e9747dc858e7ceb0abc2b2 https://conda.anaconda.org/conda-forge/linux-aarch64/matplotlib-base-3.10.3-py310h2cc5e2d_0.conda#e29f4329f4f76cf14f74ed86dcc59bac -https://conda.anaconda.org/conda-forge/linux-aarch64/qt6-main-6.9.0-hf89e03d_2.conda#20d9298303224f9460a0c413327cca1d +https://conda.anaconda.org/conda-forge/linux-aarch64/qt6-main-6.9.0-h13135bf_3.conda#f3d24ce6f388642e76f4917b5069c2e9 https://conda.anaconda.org/conda-forge/linux-aarch64/pyside6-6.9.0-py310hee8ad4f_0.conda#68f556281ac23f1780381f00de99d66d https://conda.anaconda.org/conda-forge/linux-aarch64/matplotlib-3.10.3-py310hbbe02a8_0.conda#08982f6ac753e962d59160b08839221b From 936eb04d294a7d3dc2e55532543463e1ef056383 Mon Sep 17 00:00:00 2001 From: Stefan <96178532+stefan6419846@users.noreply.github.com> Date: Tue, 20 May 2025 14:45:15 +0200 Subject: [PATCH 170/182] MNT Remove leftover Boston data file (#31394) --- sklearn/datasets/data/boston_house_prices.csv | 508 ------------------ 1 file changed, 508 deletions(-) delete mode 100644 sklearn/datasets/data/boston_house_prices.csv diff --git a/sklearn/datasets/data/boston_house_prices.csv b/sklearn/datasets/data/boston_house_prices.csv deleted file mode 100644 index 61193a5d646cc..0000000000000 --- a/sklearn/datasets/data/boston_house_prices.csv +++ /dev/null @@ -1,508 +0,0 @@ -506,13,,,,,,,,,,,, -"CRIM","ZN","INDUS","CHAS","NOX","RM","AGE","DIS","RAD","TAX","PTRATIO","B","LSTAT","MEDV" -0.00632,18,2.31,0,0.538,6.575,65.2,4.09,1,296,15.3,396.9,4.98,24 -0.02731,0,7.07,0,0.469,6.421,78.9,4.9671,2,242,17.8,396.9,9.14,21.6 -0.02729,0,7.07,0,0.469,7.185,61.1,4.9671,2,242,17.8,392.83,4.03,34.7 -0.03237,0,2.18,0,0.458,6.998,45.8,6.0622,3,222,18.7,394.63,2.94,33.4 -0.06905,0,2.18,0,0.458,7.147,54.2,6.0622,3,222,18.7,396.9,5.33,36.2 -0.02985,0,2.18,0,0.458,6.43,58.7,6.0622,3,222,18.7,394.12,5.21,28.7 -0.08829,12.5,7.87,0,0.524,6.012,66.6,5.5605,5,311,15.2,395.6,12.43,22.9 -0.14455,12.5,7.87,0,0.524,6.172,96.1,5.9505,5,311,15.2,396.9,19.15,27.1 -0.21124,12.5,7.87,0,0.524,5.631,100,6.0821,5,311,15.2,386.63,29.93,16.5 -0.17004,12.5,7.87,0,0.524,6.004,85.9,6.5921,5,311,15.2,386.71,17.1,18.9 -0.22489,12.5,7.87,0,0.524,6.377,94.3,6.3467,5,311,15.2,392.52,20.45,15 -0.11747,12.5,7.87,0,0.524,6.009,82.9,6.2267,5,311,15.2,396.9,13.27,18.9 -0.09378,12.5,7.87,0,0.524,5.889,39,5.4509,5,311,15.2,390.5,15.71,21.7 -0.62976,0,8.14,0,0.538,5.949,61.8,4.7075,4,307,21,396.9,8.26,20.4 -0.63796,0,8.14,0,0.538,6.096,84.5,4.4619,4,307,21,380.02,10.26,18.2 -0.62739,0,8.14,0,0.538,5.834,56.5,4.4986,4,307,21,395.62,8.47,19.9 -1.05393,0,8.14,0,0.538,5.935,29.3,4.4986,4,307,21,386.85,6.58,23.1 -0.7842,0,8.14,0,0.538,5.99,81.7,4.2579,4,307,21,386.75,14.67,17.5 -0.80271,0,8.14,0,0.538,5.456,36.6,3.7965,4,307,21,288.99,11.69,20.2 -0.7258,0,8.14,0,0.538,5.727,69.5,3.7965,4,307,21,390.95,11.28,18.2 -1.25179,0,8.14,0,0.538,5.57,98.1,3.7979,4,307,21,376.57,21.02,13.6 -0.85204,0,8.14,0,0.538,5.965,89.2,4.0123,4,307,21,392.53,13.83,19.6 -1.23247,0,8.14,0,0.538,6.142,91.7,3.9769,4,307,21,396.9,18.72,15.2 -0.98843,0,8.14,0,0.538,5.813,100,4.0952,4,307,21,394.54,19.88,14.5 -0.75026,0,8.14,0,0.538,5.924,94.1,4.3996,4,307,21,394.33,16.3,15.6 -0.84054,0,8.14,0,0.538,5.599,85.7,4.4546,4,307,21,303.42,16.51,13.9 -0.67191,0,8.14,0,0.538,5.813,90.3,4.682,4,307,21,376.88,14.81,16.6 -0.95577,0,8.14,0,0.538,6.047,88.8,4.4534,4,307,21,306.38,17.28,14.8 -0.77299,0,8.14,0,0.538,6.495,94.4,4.4547,4,307,21,387.94,12.8,18.4 -1.00245,0,8.14,0,0.538,6.674,87.3,4.239,4,307,21,380.23,11.98,21 -1.13081,0,8.14,0,0.538,5.713,94.1,4.233,4,307,21,360.17,22.6,12.7 -1.35472,0,8.14,0,0.538,6.072,100,4.175,4,307,21,376.73,13.04,14.5 -1.38799,0,8.14,0,0.538,5.95,82,3.99,4,307,21,232.6,27.71,13.2 -1.15172,0,8.14,0,0.538,5.701,95,3.7872,4,307,21,358.77,18.35,13.1 -1.61282,0,8.14,0,0.538,6.096,96.9,3.7598,4,307,21,248.31,20.34,13.5 -0.06417,0,5.96,0,0.499,5.933,68.2,3.3603,5,279,19.2,396.9,9.68,18.9 -0.09744,0,5.96,0,0.499,5.841,61.4,3.3779,5,279,19.2,377.56,11.41,20 -0.08014,0,5.96,0,0.499,5.85,41.5,3.9342,5,279,19.2,396.9,8.77,21 -0.17505,0,5.96,0,0.499,5.966,30.2,3.8473,5,279,19.2,393.43,10.13,24.7 -0.02763,75,2.95,0,0.428,6.595,21.8,5.4011,3,252,18.3,395.63,4.32,30.8 -0.03359,75,2.95,0,0.428,7.024,15.8,5.4011,3,252,18.3,395.62,1.98,34.9 -0.12744,0,6.91,0,0.448,6.77,2.9,5.7209,3,233,17.9,385.41,4.84,26.6 -0.1415,0,6.91,0,0.448,6.169,6.6,5.7209,3,233,17.9,383.37,5.81,25.3 -0.15936,0,6.91,0,0.448,6.211,6.5,5.7209,3,233,17.9,394.46,7.44,24.7 -0.12269,0,6.91,0,0.448,6.069,40,5.7209,3,233,17.9,389.39,9.55,21.2 -0.17142,0,6.91,0,0.448,5.682,33.8,5.1004,3,233,17.9,396.9,10.21,19.3 -0.18836,0,6.91,0,0.448,5.786,33.3,5.1004,3,233,17.9,396.9,14.15,20 -0.22927,0,6.91,0,0.448,6.03,85.5,5.6894,3,233,17.9,392.74,18.8,16.6 -0.25387,0,6.91,0,0.448,5.399,95.3,5.87,3,233,17.9,396.9,30.81,14.4 -0.21977,0,6.91,0,0.448,5.602,62,6.0877,3,233,17.9,396.9,16.2,19.4 -0.08873,21,5.64,0,0.439,5.963,45.7,6.8147,4,243,16.8,395.56,13.45,19.7 -0.04337,21,5.64,0,0.439,6.115,63,6.8147,4,243,16.8,393.97,9.43,20.5 -0.0536,21,5.64,0,0.439,6.511,21.1,6.8147,4,243,16.8,396.9,5.28,25 -0.04981,21,5.64,0,0.439,5.998,21.4,6.8147,4,243,16.8,396.9,8.43,23.4 -0.0136,75,4,0,0.41,5.888,47.6,7.3197,3,469,21.1,396.9,14.8,18.9 -0.01311,90,1.22,0,0.403,7.249,21.9,8.6966,5,226,17.9,395.93,4.81,35.4 -0.02055,85,0.74,0,0.41,6.383,35.7,9.1876,2,313,17.3,396.9,5.77,24.7 -0.01432,100,1.32,0,0.411,6.816,40.5,8.3248,5,256,15.1,392.9,3.95,31.6 -0.15445,25,5.13,0,0.453,6.145,29.2,7.8148,8,284,19.7,390.68,6.86,23.3 -0.10328,25,5.13,0,0.453,5.927,47.2,6.932,8,284,19.7,396.9,9.22,19.6 -0.14932,25,5.13,0,0.453,5.741,66.2,7.2254,8,284,19.7,395.11,13.15,18.7 -0.17171,25,5.13,0,0.453,5.966,93.4,6.8185,8,284,19.7,378.08,14.44,16 -0.11027,25,5.13,0,0.453,6.456,67.8,7.2255,8,284,19.7,396.9,6.73,22.2 -0.1265,25,5.13,0,0.453,6.762,43.4,7.9809,8,284,19.7,395.58,9.5,25 -0.01951,17.5,1.38,0,0.4161,7.104,59.5,9.2229,3,216,18.6,393.24,8.05,33 -0.03584,80,3.37,0,0.398,6.29,17.8,6.6115,4,337,16.1,396.9,4.67,23.5 -0.04379,80,3.37,0,0.398,5.787,31.1,6.6115,4,337,16.1,396.9,10.24,19.4 -0.05789,12.5,6.07,0,0.409,5.878,21.4,6.498,4,345,18.9,396.21,8.1,22 -0.13554,12.5,6.07,0,0.409,5.594,36.8,6.498,4,345,18.9,396.9,13.09,17.4 -0.12816,12.5,6.07,0,0.409,5.885,33,6.498,4,345,18.9,396.9,8.79,20.9 -0.08826,0,10.81,0,0.413,6.417,6.6,5.2873,4,305,19.2,383.73,6.72,24.2 -0.15876,0,10.81,0,0.413,5.961,17.5,5.2873,4,305,19.2,376.94,9.88,21.7 -0.09164,0,10.81,0,0.413,6.065,7.8,5.2873,4,305,19.2,390.91,5.52,22.8 -0.19539,0,10.81,0,0.413,6.245,6.2,5.2873,4,305,19.2,377.17,7.54,23.4 -0.07896,0,12.83,0,0.437,6.273,6,4.2515,5,398,18.7,394.92,6.78,24.1 -0.09512,0,12.83,0,0.437,6.286,45,4.5026,5,398,18.7,383.23,8.94,21.4 -0.10153,0,12.83,0,0.437,6.279,74.5,4.0522,5,398,18.7,373.66,11.97,20 -0.08707,0,12.83,0,0.437,6.14,45.8,4.0905,5,398,18.7,386.96,10.27,20.8 -0.05646,0,12.83,0,0.437,6.232,53.7,5.0141,5,398,18.7,386.4,12.34,21.2 -0.08387,0,12.83,0,0.437,5.874,36.6,4.5026,5,398,18.7,396.06,9.1,20.3 -0.04113,25,4.86,0,0.426,6.727,33.5,5.4007,4,281,19,396.9,5.29,28 -0.04462,25,4.86,0,0.426,6.619,70.4,5.4007,4,281,19,395.63,7.22,23.9 -0.03659,25,4.86,0,0.426,6.302,32.2,5.4007,4,281,19,396.9,6.72,24.8 -0.03551,25,4.86,0,0.426,6.167,46.7,5.4007,4,281,19,390.64,7.51,22.9 -0.05059,0,4.49,0,0.449,6.389,48,4.7794,3,247,18.5,396.9,9.62,23.9 -0.05735,0,4.49,0,0.449,6.63,56.1,4.4377,3,247,18.5,392.3,6.53,26.6 -0.05188,0,4.49,0,0.449,6.015,45.1,4.4272,3,247,18.5,395.99,12.86,22.5 -0.07151,0,4.49,0,0.449,6.121,56.8,3.7476,3,247,18.5,395.15,8.44,22.2 -0.0566,0,3.41,0,0.489,7.007,86.3,3.4217,2,270,17.8,396.9,5.5,23.6 -0.05302,0,3.41,0,0.489,7.079,63.1,3.4145,2,270,17.8,396.06,5.7,28.7 -0.04684,0,3.41,0,0.489,6.417,66.1,3.0923,2,270,17.8,392.18,8.81,22.6 -0.03932,0,3.41,0,0.489,6.405,73.9,3.0921,2,270,17.8,393.55,8.2,22 -0.04203,28,15.04,0,0.464,6.442,53.6,3.6659,4,270,18.2,395.01,8.16,22.9 -0.02875,28,15.04,0,0.464,6.211,28.9,3.6659,4,270,18.2,396.33,6.21,25 -0.04294,28,15.04,0,0.464,6.249,77.3,3.615,4,270,18.2,396.9,10.59,20.6 -0.12204,0,2.89,0,0.445,6.625,57.8,3.4952,2,276,18,357.98,6.65,28.4 -0.11504,0,2.89,0,0.445,6.163,69.6,3.4952,2,276,18,391.83,11.34,21.4 -0.12083,0,2.89,0,0.445,8.069,76,3.4952,2,276,18,396.9,4.21,38.7 -0.08187,0,2.89,0,0.445,7.82,36.9,3.4952,2,276,18,393.53,3.57,43.8 -0.0686,0,2.89,0,0.445,7.416,62.5,3.4952,2,276,18,396.9,6.19,33.2 -0.14866,0,8.56,0,0.52,6.727,79.9,2.7778,5,384,20.9,394.76,9.42,27.5 -0.11432,0,8.56,0,0.52,6.781,71.3,2.8561,5,384,20.9,395.58,7.67,26.5 -0.22876,0,8.56,0,0.52,6.405,85.4,2.7147,5,384,20.9,70.8,10.63,18.6 -0.21161,0,8.56,0,0.52,6.137,87.4,2.7147,5,384,20.9,394.47,13.44,19.3 -0.1396,0,8.56,0,0.52,6.167,90,2.421,5,384,20.9,392.69,12.33,20.1 -0.13262,0,8.56,0,0.52,5.851,96.7,2.1069,5,384,20.9,394.05,16.47,19.5 -0.1712,0,8.56,0,0.52,5.836,91.9,2.211,5,384,20.9,395.67,18.66,19.5 -0.13117,0,8.56,0,0.52,6.127,85.2,2.1224,5,384,20.9,387.69,14.09,20.4 -0.12802,0,8.56,0,0.52,6.474,97.1,2.4329,5,384,20.9,395.24,12.27,19.8 -0.26363,0,8.56,0,0.52,6.229,91.2,2.5451,5,384,20.9,391.23,15.55,19.4 -0.10793,0,8.56,0,0.52,6.195,54.4,2.7778,5,384,20.9,393.49,13,21.7 -0.10084,0,10.01,0,0.547,6.715,81.6,2.6775,6,432,17.8,395.59,10.16,22.8 -0.12329,0,10.01,0,0.547,5.913,92.9,2.3534,6,432,17.8,394.95,16.21,18.8 -0.22212,0,10.01,0,0.547,6.092,95.4,2.548,6,432,17.8,396.9,17.09,18.7 -0.14231,0,10.01,0,0.547,6.254,84.2,2.2565,6,432,17.8,388.74,10.45,18.5 -0.17134,0,10.01,0,0.547,5.928,88.2,2.4631,6,432,17.8,344.91,15.76,18.3 -0.13158,0,10.01,0,0.547,6.176,72.5,2.7301,6,432,17.8,393.3,12.04,21.2 -0.15098,0,10.01,0,0.547,6.021,82.6,2.7474,6,432,17.8,394.51,10.3,19.2 -0.13058,0,10.01,0,0.547,5.872,73.1,2.4775,6,432,17.8,338.63,15.37,20.4 -0.14476,0,10.01,0,0.547,5.731,65.2,2.7592,6,432,17.8,391.5,13.61,19.3 -0.06899,0,25.65,0,0.581,5.87,69.7,2.2577,2,188,19.1,389.15,14.37,22 -0.07165,0,25.65,0,0.581,6.004,84.1,2.1974,2,188,19.1,377.67,14.27,20.3 -0.09299,0,25.65,0,0.581,5.961,92.9,2.0869,2,188,19.1,378.09,17.93,20.5 -0.15038,0,25.65,0,0.581,5.856,97,1.9444,2,188,19.1,370.31,25.41,17.3 -0.09849,0,25.65,0,0.581,5.879,95.8,2.0063,2,188,19.1,379.38,17.58,18.8 -0.16902,0,25.65,0,0.581,5.986,88.4,1.9929,2,188,19.1,385.02,14.81,21.4 -0.38735,0,25.65,0,0.581,5.613,95.6,1.7572,2,188,19.1,359.29,27.26,15.7 -0.25915,0,21.89,0,0.624,5.693,96,1.7883,4,437,21.2,392.11,17.19,16.2 -0.32543,0,21.89,0,0.624,6.431,98.8,1.8125,4,437,21.2,396.9,15.39,18 -0.88125,0,21.89,0,0.624,5.637,94.7,1.9799,4,437,21.2,396.9,18.34,14.3 -0.34006,0,21.89,0,0.624,6.458,98.9,2.1185,4,437,21.2,395.04,12.6,19.2 -1.19294,0,21.89,0,0.624,6.326,97.7,2.271,4,437,21.2,396.9,12.26,19.6 -0.59005,0,21.89,0,0.624,6.372,97.9,2.3274,4,437,21.2,385.76,11.12,23 -0.32982,0,21.89,0,0.624,5.822,95.4,2.4699,4,437,21.2,388.69,15.03,18.4 -0.97617,0,21.89,0,0.624,5.757,98.4,2.346,4,437,21.2,262.76,17.31,15.6 -0.55778,0,21.89,0,0.624,6.335,98.2,2.1107,4,437,21.2,394.67,16.96,18.1 -0.32264,0,21.89,0,0.624,5.942,93.5,1.9669,4,437,21.2,378.25,16.9,17.4 -0.35233,0,21.89,0,0.624,6.454,98.4,1.8498,4,437,21.2,394.08,14.59,17.1 -0.2498,0,21.89,0,0.624,5.857,98.2,1.6686,4,437,21.2,392.04,21.32,13.3 -0.54452,0,21.89,0,0.624,6.151,97.9,1.6687,4,437,21.2,396.9,18.46,17.8 -0.2909,0,21.89,0,0.624,6.174,93.6,1.6119,4,437,21.2,388.08,24.16,14 -1.62864,0,21.89,0,0.624,5.019,100,1.4394,4,437,21.2,396.9,34.41,14.4 -3.32105,0,19.58,1,0.871,5.403,100,1.3216,5,403,14.7,396.9,26.82,13.4 -4.0974,0,19.58,0,0.871,5.468,100,1.4118,5,403,14.7,396.9,26.42,15.6 -2.77974,0,19.58,0,0.871,4.903,97.8,1.3459,5,403,14.7,396.9,29.29,11.8 -2.37934,0,19.58,0,0.871,6.13,100,1.4191,5,403,14.7,172.91,27.8,13.8 -2.15505,0,19.58,0,0.871,5.628,100,1.5166,5,403,14.7,169.27,16.65,15.6 -2.36862,0,19.58,0,0.871,4.926,95.7,1.4608,5,403,14.7,391.71,29.53,14.6 -2.33099,0,19.58,0,0.871,5.186,93.8,1.5296,5,403,14.7,356.99,28.32,17.8 -2.73397,0,19.58,0,0.871,5.597,94.9,1.5257,5,403,14.7,351.85,21.45,15.4 -1.6566,0,19.58,0,0.871,6.122,97.3,1.618,5,403,14.7,372.8,14.1,21.5 -1.49632,0,19.58,0,0.871,5.404,100,1.5916,5,403,14.7,341.6,13.28,19.6 -1.12658,0,19.58,1,0.871,5.012,88,1.6102,5,403,14.7,343.28,12.12,15.3 -2.14918,0,19.58,0,0.871,5.709,98.5,1.6232,5,403,14.7,261.95,15.79,19.4 -1.41385,0,19.58,1,0.871,6.129,96,1.7494,5,403,14.7,321.02,15.12,17 -3.53501,0,19.58,1,0.871,6.152,82.6,1.7455,5,403,14.7,88.01,15.02,15.6 -2.44668,0,19.58,0,0.871,5.272,94,1.7364,5,403,14.7,88.63,16.14,13.1 -1.22358,0,19.58,0,0.605,6.943,97.4,1.8773,5,403,14.7,363.43,4.59,41.3 -1.34284,0,19.58,0,0.605,6.066,100,1.7573,5,403,14.7,353.89,6.43,24.3 -1.42502,0,19.58,0,0.871,6.51,100,1.7659,5,403,14.7,364.31,7.39,23.3 -1.27346,0,19.58,1,0.605,6.25,92.6,1.7984,5,403,14.7,338.92,5.5,27 -1.46336,0,19.58,0,0.605,7.489,90.8,1.9709,5,403,14.7,374.43,1.73,50 -1.83377,0,19.58,1,0.605,7.802,98.2,2.0407,5,403,14.7,389.61,1.92,50 -1.51902,0,19.58,1,0.605,8.375,93.9,2.162,5,403,14.7,388.45,3.32,50 -2.24236,0,19.58,0,0.605,5.854,91.8,2.422,5,403,14.7,395.11,11.64,22.7 -2.924,0,19.58,0,0.605,6.101,93,2.2834,5,403,14.7,240.16,9.81,25 -2.01019,0,19.58,0,0.605,7.929,96.2,2.0459,5,403,14.7,369.3,3.7,50 -1.80028,0,19.58,0,0.605,5.877,79.2,2.4259,5,403,14.7,227.61,12.14,23.8 -2.3004,0,19.58,0,0.605,6.319,96.1,2.1,5,403,14.7,297.09,11.1,23.8 -2.44953,0,19.58,0,0.605,6.402,95.2,2.2625,5,403,14.7,330.04,11.32,22.3 -1.20742,0,19.58,0,0.605,5.875,94.6,2.4259,5,403,14.7,292.29,14.43,17.4 -2.3139,0,19.58,0,0.605,5.88,97.3,2.3887,5,403,14.7,348.13,12.03,19.1 -0.13914,0,4.05,0,0.51,5.572,88.5,2.5961,5,296,16.6,396.9,14.69,23.1 -0.09178,0,4.05,0,0.51,6.416,84.1,2.6463,5,296,16.6,395.5,9.04,23.6 -0.08447,0,4.05,0,0.51,5.859,68.7,2.7019,5,296,16.6,393.23,9.64,22.6 -0.06664,0,4.05,0,0.51,6.546,33.1,3.1323,5,296,16.6,390.96,5.33,29.4 -0.07022,0,4.05,0,0.51,6.02,47.2,3.5549,5,296,16.6,393.23,10.11,23.2 -0.05425,0,4.05,0,0.51,6.315,73.4,3.3175,5,296,16.6,395.6,6.29,24.6 -0.06642,0,4.05,0,0.51,6.86,74.4,2.9153,5,296,16.6,391.27,6.92,29.9 -0.0578,0,2.46,0,0.488,6.98,58.4,2.829,3,193,17.8,396.9,5.04,37.2 -0.06588,0,2.46,0,0.488,7.765,83.3,2.741,3,193,17.8,395.56,7.56,39.8 -0.06888,0,2.46,0,0.488,6.144,62.2,2.5979,3,193,17.8,396.9,9.45,36.2 -0.09103,0,2.46,0,0.488,7.155,92.2,2.7006,3,193,17.8,394.12,4.82,37.9 -0.10008,0,2.46,0,0.488,6.563,95.6,2.847,3,193,17.8,396.9,5.68,32.5 -0.08308,0,2.46,0,0.488,5.604,89.8,2.9879,3,193,17.8,391,13.98,26.4 -0.06047,0,2.46,0,0.488,6.153,68.8,3.2797,3,193,17.8,387.11,13.15,29.6 -0.05602,0,2.46,0,0.488,7.831,53.6,3.1992,3,193,17.8,392.63,4.45,50 -0.07875,45,3.44,0,0.437,6.782,41.1,3.7886,5,398,15.2,393.87,6.68,32 -0.12579,45,3.44,0,0.437,6.556,29.1,4.5667,5,398,15.2,382.84,4.56,29.8 -0.0837,45,3.44,0,0.437,7.185,38.9,4.5667,5,398,15.2,396.9,5.39,34.9 -0.09068,45,3.44,0,0.437,6.951,21.5,6.4798,5,398,15.2,377.68,5.1,37 -0.06911,45,3.44,0,0.437,6.739,30.8,6.4798,5,398,15.2,389.71,4.69,30.5 -0.08664,45,3.44,0,0.437,7.178,26.3,6.4798,5,398,15.2,390.49,2.87,36.4 -0.02187,60,2.93,0,0.401,6.8,9.9,6.2196,1,265,15.6,393.37,5.03,31.1 -0.01439,60,2.93,0,0.401,6.604,18.8,6.2196,1,265,15.6,376.7,4.38,29.1 -0.01381,80,0.46,0,0.422,7.875,32,5.6484,4,255,14.4,394.23,2.97,50 -0.04011,80,1.52,0,0.404,7.287,34.1,7.309,2,329,12.6,396.9,4.08,33.3 -0.04666,80,1.52,0,0.404,7.107,36.6,7.309,2,329,12.6,354.31,8.61,30.3 -0.03768,80,1.52,0,0.404,7.274,38.3,7.309,2,329,12.6,392.2,6.62,34.6 -0.0315,95,1.47,0,0.403,6.975,15.3,7.6534,3,402,17,396.9,4.56,34.9 -0.01778,95,1.47,0,0.403,7.135,13.9,7.6534,3,402,17,384.3,4.45,32.9 -0.03445,82.5,2.03,0,0.415,6.162,38.4,6.27,2,348,14.7,393.77,7.43,24.1 -0.02177,82.5,2.03,0,0.415,7.61,15.7,6.27,2,348,14.7,395.38,3.11,42.3 -0.0351,95,2.68,0,0.4161,7.853,33.2,5.118,4,224,14.7,392.78,3.81,48.5 -0.02009,95,2.68,0,0.4161,8.034,31.9,5.118,4,224,14.7,390.55,2.88,50 -0.13642,0,10.59,0,0.489,5.891,22.3,3.9454,4,277,18.6,396.9,10.87,22.6 -0.22969,0,10.59,0,0.489,6.326,52.5,4.3549,4,277,18.6,394.87,10.97,24.4 -0.25199,0,10.59,0,0.489,5.783,72.7,4.3549,4,277,18.6,389.43,18.06,22.5 -0.13587,0,10.59,1,0.489,6.064,59.1,4.2392,4,277,18.6,381.32,14.66,24.4 -0.43571,0,10.59,1,0.489,5.344,100,3.875,4,277,18.6,396.9,23.09,20 -0.17446,0,10.59,1,0.489,5.96,92.1,3.8771,4,277,18.6,393.25,17.27,21.7 -0.37578,0,10.59,1,0.489,5.404,88.6,3.665,4,277,18.6,395.24,23.98,19.3 -0.21719,0,10.59,1,0.489,5.807,53.8,3.6526,4,277,18.6,390.94,16.03,22.4 -0.14052,0,10.59,0,0.489,6.375,32.3,3.9454,4,277,18.6,385.81,9.38,28.1 -0.28955,0,10.59,0,0.489,5.412,9.8,3.5875,4,277,18.6,348.93,29.55,23.7 -0.19802,0,10.59,0,0.489,6.182,42.4,3.9454,4,277,18.6,393.63,9.47,25 -0.0456,0,13.89,1,0.55,5.888,56,3.1121,5,276,16.4,392.8,13.51,23.3 -0.07013,0,13.89,0,0.55,6.642,85.1,3.4211,5,276,16.4,392.78,9.69,28.7 -0.11069,0,13.89,1,0.55,5.951,93.8,2.8893,5,276,16.4,396.9,17.92,21.5 -0.11425,0,13.89,1,0.55,6.373,92.4,3.3633,5,276,16.4,393.74,10.5,23 -0.35809,0,6.2,1,0.507,6.951,88.5,2.8617,8,307,17.4,391.7,9.71,26.7 -0.40771,0,6.2,1,0.507,6.164,91.3,3.048,8,307,17.4,395.24,21.46,21.7 -0.62356,0,6.2,1,0.507,6.879,77.7,3.2721,8,307,17.4,390.39,9.93,27.5 -0.6147,0,6.2,0,0.507,6.618,80.8,3.2721,8,307,17.4,396.9,7.6,30.1 -0.31533,0,6.2,0,0.504,8.266,78.3,2.8944,8,307,17.4,385.05,4.14,44.8 -0.52693,0,6.2,0,0.504,8.725,83,2.8944,8,307,17.4,382,4.63,50 -0.38214,0,6.2,0,0.504,8.04,86.5,3.2157,8,307,17.4,387.38,3.13,37.6 -0.41238,0,6.2,0,0.504,7.163,79.9,3.2157,8,307,17.4,372.08,6.36,31.6 -0.29819,0,6.2,0,0.504,7.686,17,3.3751,8,307,17.4,377.51,3.92,46.7 -0.44178,0,6.2,0,0.504,6.552,21.4,3.3751,8,307,17.4,380.34,3.76,31.5 -0.537,0,6.2,0,0.504,5.981,68.1,3.6715,8,307,17.4,378.35,11.65,24.3 -0.46296,0,6.2,0,0.504,7.412,76.9,3.6715,8,307,17.4,376.14,5.25,31.7 -0.57529,0,6.2,0,0.507,8.337,73.3,3.8384,8,307,17.4,385.91,2.47,41.7 -0.33147,0,6.2,0,0.507,8.247,70.4,3.6519,8,307,17.4,378.95,3.95,48.3 -0.44791,0,6.2,1,0.507,6.726,66.5,3.6519,8,307,17.4,360.2,8.05,29 -0.33045,0,6.2,0,0.507,6.086,61.5,3.6519,8,307,17.4,376.75,10.88,24 -0.52058,0,6.2,1,0.507,6.631,76.5,4.148,8,307,17.4,388.45,9.54,25.1 -0.51183,0,6.2,0,0.507,7.358,71.6,4.148,8,307,17.4,390.07,4.73,31.5 -0.08244,30,4.93,0,0.428,6.481,18.5,6.1899,6,300,16.6,379.41,6.36,23.7 -0.09252,30,4.93,0,0.428,6.606,42.2,6.1899,6,300,16.6,383.78,7.37,23.3 -0.11329,30,4.93,0,0.428,6.897,54.3,6.3361,6,300,16.6,391.25,11.38,22 -0.10612,30,4.93,0,0.428,6.095,65.1,6.3361,6,300,16.6,394.62,12.4,20.1 -0.1029,30,4.93,0,0.428,6.358,52.9,7.0355,6,300,16.6,372.75,11.22,22.2 -0.12757,30,4.93,0,0.428,6.393,7.8,7.0355,6,300,16.6,374.71,5.19,23.7 -0.20608,22,5.86,0,0.431,5.593,76.5,7.9549,7,330,19.1,372.49,12.5,17.6 -0.19133,22,5.86,0,0.431,5.605,70.2,7.9549,7,330,19.1,389.13,18.46,18.5 -0.33983,22,5.86,0,0.431,6.108,34.9,8.0555,7,330,19.1,390.18,9.16,24.3 -0.19657,22,5.86,0,0.431,6.226,79.2,8.0555,7,330,19.1,376.14,10.15,20.5 -0.16439,22,5.86,0,0.431,6.433,49.1,7.8265,7,330,19.1,374.71,9.52,24.5 -0.19073,22,5.86,0,0.431,6.718,17.5,7.8265,7,330,19.1,393.74,6.56,26.2 -0.1403,22,5.86,0,0.431,6.487,13,7.3967,7,330,19.1,396.28,5.9,24.4 -0.21409,22,5.86,0,0.431,6.438,8.9,7.3967,7,330,19.1,377.07,3.59,24.8 -0.08221,22,5.86,0,0.431,6.957,6.8,8.9067,7,330,19.1,386.09,3.53,29.6 -0.36894,22,5.86,0,0.431,8.259,8.4,8.9067,7,330,19.1,396.9,3.54,42.8 -0.04819,80,3.64,0,0.392,6.108,32,9.2203,1,315,16.4,392.89,6.57,21.9 -0.03548,80,3.64,0,0.392,5.876,19.1,9.2203,1,315,16.4,395.18,9.25,20.9 -0.01538,90,3.75,0,0.394,7.454,34.2,6.3361,3,244,15.9,386.34,3.11,44 -0.61154,20,3.97,0,0.647,8.704,86.9,1.801,5,264,13,389.7,5.12,50 -0.66351,20,3.97,0,0.647,7.333,100,1.8946,5,264,13,383.29,7.79,36 -0.65665,20,3.97,0,0.647,6.842,100,2.0107,5,264,13,391.93,6.9,30.1 -0.54011,20,3.97,0,0.647,7.203,81.8,2.1121,5,264,13,392.8,9.59,33.8 -0.53412,20,3.97,0,0.647,7.52,89.4,2.1398,5,264,13,388.37,7.26,43.1 -0.52014,20,3.97,0,0.647,8.398,91.5,2.2885,5,264,13,386.86,5.91,48.8 -0.82526,20,3.97,0,0.647,7.327,94.5,2.0788,5,264,13,393.42,11.25,31 -0.55007,20,3.97,0,0.647,7.206,91.6,1.9301,5,264,13,387.89,8.1,36.5 -0.76162,20,3.97,0,0.647,5.56,62.8,1.9865,5,264,13,392.4,10.45,22.8 -0.7857,20,3.97,0,0.647,7.014,84.6,2.1329,5,264,13,384.07,14.79,30.7 -0.57834,20,3.97,0,0.575,8.297,67,2.4216,5,264,13,384.54,7.44,50 -0.5405,20,3.97,0,0.575,7.47,52.6,2.872,5,264,13,390.3,3.16,43.5 -0.09065,20,6.96,1,0.464,5.92,61.5,3.9175,3,223,18.6,391.34,13.65,20.7 -0.29916,20,6.96,0,0.464,5.856,42.1,4.429,3,223,18.6,388.65,13,21.1 -0.16211,20,6.96,0,0.464,6.24,16.3,4.429,3,223,18.6,396.9,6.59,25.2 -0.1146,20,6.96,0,0.464,6.538,58.7,3.9175,3,223,18.6,394.96,7.73,24.4 -0.22188,20,6.96,1,0.464,7.691,51.8,4.3665,3,223,18.6,390.77,6.58,35.2 -0.05644,40,6.41,1,0.447,6.758,32.9,4.0776,4,254,17.6,396.9,3.53,32.4 -0.09604,40,6.41,0,0.447,6.854,42.8,4.2673,4,254,17.6,396.9,2.98,32 -0.10469,40,6.41,1,0.447,7.267,49,4.7872,4,254,17.6,389.25,6.05,33.2 -0.06127,40,6.41,1,0.447,6.826,27.6,4.8628,4,254,17.6,393.45,4.16,33.1 -0.07978,40,6.41,0,0.447,6.482,32.1,4.1403,4,254,17.6,396.9,7.19,29.1 -0.21038,20,3.33,0,0.4429,6.812,32.2,4.1007,5,216,14.9,396.9,4.85,35.1 -0.03578,20,3.33,0,0.4429,7.82,64.5,4.6947,5,216,14.9,387.31,3.76,45.4 -0.03705,20,3.33,0,0.4429,6.968,37.2,5.2447,5,216,14.9,392.23,4.59,35.4 -0.06129,20,3.33,1,0.4429,7.645,49.7,5.2119,5,216,14.9,377.07,3.01,46 -0.01501,90,1.21,1,0.401,7.923,24.8,5.885,1,198,13.6,395.52,3.16,50 -0.00906,90,2.97,0,0.4,7.088,20.8,7.3073,1,285,15.3,394.72,7.85,32.2 -0.01096,55,2.25,0,0.389,6.453,31.9,7.3073,1,300,15.3,394.72,8.23,22 -0.01965,80,1.76,0,0.385,6.23,31.5,9.0892,1,241,18.2,341.6,12.93,20.1 -0.03871,52.5,5.32,0,0.405,6.209,31.3,7.3172,6,293,16.6,396.9,7.14,23.2 -0.0459,52.5,5.32,0,0.405,6.315,45.6,7.3172,6,293,16.6,396.9,7.6,22.3 -0.04297,52.5,5.32,0,0.405,6.565,22.9,7.3172,6,293,16.6,371.72,9.51,24.8 -0.03502,80,4.95,0,0.411,6.861,27.9,5.1167,4,245,19.2,396.9,3.33,28.5 -0.07886,80,4.95,0,0.411,7.148,27.7,5.1167,4,245,19.2,396.9,3.56,37.3 -0.03615,80,4.95,0,0.411,6.63,23.4,5.1167,4,245,19.2,396.9,4.7,27.9 -0.08265,0,13.92,0,0.437,6.127,18.4,5.5027,4,289,16,396.9,8.58,23.9 -0.08199,0,13.92,0,0.437,6.009,42.3,5.5027,4,289,16,396.9,10.4,21.7 -0.12932,0,13.92,0,0.437,6.678,31.1,5.9604,4,289,16,396.9,6.27,28.6 -0.05372,0,13.92,0,0.437,6.549,51,5.9604,4,289,16,392.85,7.39,27.1 -0.14103,0,13.92,0,0.437,5.79,58,6.32,4,289,16,396.9,15.84,20.3 -0.06466,70,2.24,0,0.4,6.345,20.1,7.8278,5,358,14.8,368.24,4.97,22.5 -0.05561,70,2.24,0,0.4,7.041,10,7.8278,5,358,14.8,371.58,4.74,29 -0.04417,70,2.24,0,0.4,6.871,47.4,7.8278,5,358,14.8,390.86,6.07,24.8 -0.03537,34,6.09,0,0.433,6.59,40.4,5.4917,7,329,16.1,395.75,9.5,22 -0.09266,34,6.09,0,0.433,6.495,18.4,5.4917,7,329,16.1,383.61,8.67,26.4 -0.1,34,6.09,0,0.433,6.982,17.7,5.4917,7,329,16.1,390.43,4.86,33.1 -0.05515,33,2.18,0,0.472,7.236,41.1,4.022,7,222,18.4,393.68,6.93,36.1 -0.05479,33,2.18,0,0.472,6.616,58.1,3.37,7,222,18.4,393.36,8.93,28.4 -0.07503,33,2.18,0,0.472,7.42,71.9,3.0992,7,222,18.4,396.9,6.47,33.4 -0.04932,33,2.18,0,0.472,6.849,70.3,3.1827,7,222,18.4,396.9,7.53,28.2 -0.49298,0,9.9,0,0.544,6.635,82.5,3.3175,4,304,18.4,396.9,4.54,22.8 -0.3494,0,9.9,0,0.544,5.972,76.7,3.1025,4,304,18.4,396.24,9.97,20.3 -2.63548,0,9.9,0,0.544,4.973,37.8,2.5194,4,304,18.4,350.45,12.64,16.1 -0.79041,0,9.9,0,0.544,6.122,52.8,2.6403,4,304,18.4,396.9,5.98,22.1 -0.26169,0,9.9,0,0.544,6.023,90.4,2.834,4,304,18.4,396.3,11.72,19.4 -0.26938,0,9.9,0,0.544,6.266,82.8,3.2628,4,304,18.4,393.39,7.9,21.6 -0.3692,0,9.9,0,0.544,6.567,87.3,3.6023,4,304,18.4,395.69,9.28,23.8 -0.25356,0,9.9,0,0.544,5.705,77.7,3.945,4,304,18.4,396.42,11.5,16.2 -0.31827,0,9.9,0,0.544,5.914,83.2,3.9986,4,304,18.4,390.7,18.33,17.8 -0.24522,0,9.9,0,0.544,5.782,71.7,4.0317,4,304,18.4,396.9,15.94,19.8 -0.40202,0,9.9,0,0.544,6.382,67.2,3.5325,4,304,18.4,395.21,10.36,23.1 -0.47547,0,9.9,0,0.544,6.113,58.8,4.0019,4,304,18.4,396.23,12.73,21 -0.1676,0,7.38,0,0.493,6.426,52.3,4.5404,5,287,19.6,396.9,7.2,23.8 -0.18159,0,7.38,0,0.493,6.376,54.3,4.5404,5,287,19.6,396.9,6.87,23.1 -0.35114,0,7.38,0,0.493,6.041,49.9,4.7211,5,287,19.6,396.9,7.7,20.4 -0.28392,0,7.38,0,0.493,5.708,74.3,4.7211,5,287,19.6,391.13,11.74,18.5 -0.34109,0,7.38,0,0.493,6.415,40.1,4.7211,5,287,19.6,396.9,6.12,25 -0.19186,0,7.38,0,0.493,6.431,14.7,5.4159,5,287,19.6,393.68,5.08,24.6 -0.30347,0,7.38,0,0.493,6.312,28.9,5.4159,5,287,19.6,396.9,6.15,23 -0.24103,0,7.38,0,0.493,6.083,43.7,5.4159,5,287,19.6,396.9,12.79,22.2 -0.06617,0,3.24,0,0.46,5.868,25.8,5.2146,4,430,16.9,382.44,9.97,19.3 -0.06724,0,3.24,0,0.46,6.333,17.2,5.2146,4,430,16.9,375.21,7.34,22.6 -0.04544,0,3.24,0,0.46,6.144,32.2,5.8736,4,430,16.9,368.57,9.09,19.8 -0.05023,35,6.06,0,0.4379,5.706,28.4,6.6407,1,304,16.9,394.02,12.43,17.1 -0.03466,35,6.06,0,0.4379,6.031,23.3,6.6407,1,304,16.9,362.25,7.83,19.4 -0.05083,0,5.19,0,0.515,6.316,38.1,6.4584,5,224,20.2,389.71,5.68,22.2 -0.03738,0,5.19,0,0.515,6.31,38.5,6.4584,5,224,20.2,389.4,6.75,20.7 -0.03961,0,5.19,0,0.515,6.037,34.5,5.9853,5,224,20.2,396.9,8.01,21.1 -0.03427,0,5.19,0,0.515,5.869,46.3,5.2311,5,224,20.2,396.9,9.8,19.5 -0.03041,0,5.19,0,0.515,5.895,59.6,5.615,5,224,20.2,394.81,10.56,18.5 -0.03306,0,5.19,0,0.515,6.059,37.3,4.8122,5,224,20.2,396.14,8.51,20.6 -0.05497,0,5.19,0,0.515,5.985,45.4,4.8122,5,224,20.2,396.9,9.74,19 -0.06151,0,5.19,0,0.515,5.968,58.5,4.8122,5,224,20.2,396.9,9.29,18.7 -0.01301,35,1.52,0,0.442,7.241,49.3,7.0379,1,284,15.5,394.74,5.49,32.7 -0.02498,0,1.89,0,0.518,6.54,59.7,6.2669,1,422,15.9,389.96,8.65,16.5 -0.02543,55,3.78,0,0.484,6.696,56.4,5.7321,5,370,17.6,396.9,7.18,23.9 -0.03049,55,3.78,0,0.484,6.874,28.1,6.4654,5,370,17.6,387.97,4.61,31.2 -0.03113,0,4.39,0,0.442,6.014,48.5,8.0136,3,352,18.8,385.64,10.53,17.5 -0.06162,0,4.39,0,0.442,5.898,52.3,8.0136,3,352,18.8,364.61,12.67,17.2 -0.0187,85,4.15,0,0.429,6.516,27.7,8.5353,4,351,17.9,392.43,6.36,23.1 -0.01501,80,2.01,0,0.435,6.635,29.7,8.344,4,280,17,390.94,5.99,24.5 -0.02899,40,1.25,0,0.429,6.939,34.5,8.7921,1,335,19.7,389.85,5.89,26.6 -0.06211,40,1.25,0,0.429,6.49,44.4,8.7921,1,335,19.7,396.9,5.98,22.9 -0.0795,60,1.69,0,0.411,6.579,35.9,10.7103,4,411,18.3,370.78,5.49,24.1 -0.07244,60,1.69,0,0.411,5.884,18.5,10.7103,4,411,18.3,392.33,7.79,18.6 -0.01709,90,2.02,0,0.41,6.728,36.1,12.1265,5,187,17,384.46,4.5,30.1 -0.04301,80,1.91,0,0.413,5.663,21.9,10.5857,4,334,22,382.8,8.05,18.2 -0.10659,80,1.91,0,0.413,5.936,19.5,10.5857,4,334,22,376.04,5.57,20.6 -8.98296,0,18.1,1,0.77,6.212,97.4,2.1222,24,666,20.2,377.73,17.6,17.8 -3.8497,0,18.1,1,0.77,6.395,91,2.5052,24,666,20.2,391.34,13.27,21.7 -5.20177,0,18.1,1,0.77,6.127,83.4,2.7227,24,666,20.2,395.43,11.48,22.7 -4.26131,0,18.1,0,0.77,6.112,81.3,2.5091,24,666,20.2,390.74,12.67,22.6 -4.54192,0,18.1,0,0.77,6.398,88,2.5182,24,666,20.2,374.56,7.79,25 -3.83684,0,18.1,0,0.77,6.251,91.1,2.2955,24,666,20.2,350.65,14.19,19.9 -3.67822,0,18.1,0,0.77,5.362,96.2,2.1036,24,666,20.2,380.79,10.19,20.8 -4.22239,0,18.1,1,0.77,5.803,89,1.9047,24,666,20.2,353.04,14.64,16.8 -3.47428,0,18.1,1,0.718,8.78,82.9,1.9047,24,666,20.2,354.55,5.29,21.9 -4.55587,0,18.1,0,0.718,3.561,87.9,1.6132,24,666,20.2,354.7,7.12,27.5 -3.69695,0,18.1,0,0.718,4.963,91.4,1.7523,24,666,20.2,316.03,14,21.9 -13.5222,0,18.1,0,0.631,3.863,100,1.5106,24,666,20.2,131.42,13.33,23.1 -4.89822,0,18.1,0,0.631,4.97,100,1.3325,24,666,20.2,375.52,3.26,50 -5.66998,0,18.1,1,0.631,6.683,96.8,1.3567,24,666,20.2,375.33,3.73,50 -6.53876,0,18.1,1,0.631,7.016,97.5,1.2024,24,666,20.2,392.05,2.96,50 -9.2323,0,18.1,0,0.631,6.216,100,1.1691,24,666,20.2,366.15,9.53,50 -8.26725,0,18.1,1,0.668,5.875,89.6,1.1296,24,666,20.2,347.88,8.88,50 -11.1081,0,18.1,0,0.668,4.906,100,1.1742,24,666,20.2,396.9,34.77,13.8 -18.4982,0,18.1,0,0.668,4.138,100,1.137,24,666,20.2,396.9,37.97,13.8 -19.6091,0,18.1,0,0.671,7.313,97.9,1.3163,24,666,20.2,396.9,13.44,15 -15.288,0,18.1,0,0.671,6.649,93.3,1.3449,24,666,20.2,363.02,23.24,13.9 -9.82349,0,18.1,0,0.671,6.794,98.8,1.358,24,666,20.2,396.9,21.24,13.3 -23.6482,0,18.1,0,0.671,6.38,96.2,1.3861,24,666,20.2,396.9,23.69,13.1 -17.8667,0,18.1,0,0.671,6.223,100,1.3861,24,666,20.2,393.74,21.78,10.2 -88.9762,0,18.1,0,0.671,6.968,91.9,1.4165,24,666,20.2,396.9,17.21,10.4 -15.8744,0,18.1,0,0.671,6.545,99.1,1.5192,24,666,20.2,396.9,21.08,10.9 -9.18702,0,18.1,0,0.7,5.536,100,1.5804,24,666,20.2,396.9,23.6,11.3 -7.99248,0,18.1,0,0.7,5.52,100,1.5331,24,666,20.2,396.9,24.56,12.3 -20.0849,0,18.1,0,0.7,4.368,91.2,1.4395,24,666,20.2,285.83,30.63,8.8 -16.8118,0,18.1,0,0.7,5.277,98.1,1.4261,24,666,20.2,396.9,30.81,7.2 -24.3938,0,18.1,0,0.7,4.652,100,1.4672,24,666,20.2,396.9,28.28,10.5 -22.5971,0,18.1,0,0.7,5,89.5,1.5184,24,666,20.2,396.9,31.99,7.4 -14.3337,0,18.1,0,0.7,4.88,100,1.5895,24,666,20.2,372.92,30.62,10.2 -8.15174,0,18.1,0,0.7,5.39,98.9,1.7281,24,666,20.2,396.9,20.85,11.5 -6.96215,0,18.1,0,0.7,5.713,97,1.9265,24,666,20.2,394.43,17.11,15.1 -5.29305,0,18.1,0,0.7,6.051,82.5,2.1678,24,666,20.2,378.38,18.76,23.2 -11.5779,0,18.1,0,0.7,5.036,97,1.77,24,666,20.2,396.9,25.68,9.7 -8.64476,0,18.1,0,0.693,6.193,92.6,1.7912,24,666,20.2,396.9,15.17,13.8 -13.3598,0,18.1,0,0.693,5.887,94.7,1.7821,24,666,20.2,396.9,16.35,12.7 -8.71675,0,18.1,0,0.693,6.471,98.8,1.7257,24,666,20.2,391.98,17.12,13.1 -5.87205,0,18.1,0,0.693,6.405,96,1.6768,24,666,20.2,396.9,19.37,12.5 -7.67202,0,18.1,0,0.693,5.747,98.9,1.6334,24,666,20.2,393.1,19.92,8.5 -38.3518,0,18.1,0,0.693,5.453,100,1.4896,24,666,20.2,396.9,30.59,5 -9.91655,0,18.1,0,0.693,5.852,77.8,1.5004,24,666,20.2,338.16,29.97,6.3 -25.0461,0,18.1,0,0.693,5.987,100,1.5888,24,666,20.2,396.9,26.77,5.6 -14.2362,0,18.1,0,0.693,6.343,100,1.5741,24,666,20.2,396.9,20.32,7.2 -9.59571,0,18.1,0,0.693,6.404,100,1.639,24,666,20.2,376.11,20.31,12.1 -24.8017,0,18.1,0,0.693,5.349,96,1.7028,24,666,20.2,396.9,19.77,8.3 -41.5292,0,18.1,0,0.693,5.531,85.4,1.6074,24,666,20.2,329.46,27.38,8.5 -67.9208,0,18.1,0,0.693,5.683,100,1.4254,24,666,20.2,384.97,22.98,5 -20.7162,0,18.1,0,0.659,4.138,100,1.1781,24,666,20.2,370.22,23.34,11.9 -11.9511,0,18.1,0,0.659,5.608,100,1.2852,24,666,20.2,332.09,12.13,27.9 -7.40389,0,18.1,0,0.597,5.617,97.9,1.4547,24,666,20.2,314.64,26.4,17.2 -14.4383,0,18.1,0,0.597,6.852,100,1.4655,24,666,20.2,179.36,19.78,27.5 -51.1358,0,18.1,0,0.597,5.757,100,1.413,24,666,20.2,2.6,10.11,15 -14.0507,0,18.1,0,0.597,6.657,100,1.5275,24,666,20.2,35.05,21.22,17.2 -18.811,0,18.1,0,0.597,4.628,100,1.5539,24,666,20.2,28.79,34.37,17.9 -28.6558,0,18.1,0,0.597,5.155,100,1.5894,24,666,20.2,210.97,20.08,16.3 -45.7461,0,18.1,0,0.693,4.519,100,1.6582,24,666,20.2,88.27,36.98,7 -18.0846,0,18.1,0,0.679,6.434,100,1.8347,24,666,20.2,27.25,29.05,7.2 -10.8342,0,18.1,0,0.679,6.782,90.8,1.8195,24,666,20.2,21.57,25.79,7.5 -25.9406,0,18.1,0,0.679,5.304,89.1,1.6475,24,666,20.2,127.36,26.64,10.4 -73.5341,0,18.1,0,0.679,5.957,100,1.8026,24,666,20.2,16.45,20.62,8.8 -11.8123,0,18.1,0,0.718,6.824,76.5,1.794,24,666,20.2,48.45,22.74,8.4 -11.0874,0,18.1,0,0.718,6.411,100,1.8589,24,666,20.2,318.75,15.02,16.7 -7.02259,0,18.1,0,0.718,6.006,95.3,1.8746,24,666,20.2,319.98,15.7,14.2 -12.0482,0,18.1,0,0.614,5.648,87.6,1.9512,24,666,20.2,291.55,14.1,20.8 -7.05042,0,18.1,0,0.614,6.103,85.1,2.0218,24,666,20.2,2.52,23.29,13.4 -8.79212,0,18.1,0,0.584,5.565,70.6,2.0635,24,666,20.2,3.65,17.16,11.7 -15.8603,0,18.1,0,0.679,5.896,95.4,1.9096,24,666,20.2,7.68,24.39,8.3 -12.2472,0,18.1,0,0.584,5.837,59.7,1.9976,24,666,20.2,24.65,15.69,10.2 -37.6619,0,18.1,0,0.679,6.202,78.7,1.8629,24,666,20.2,18.82,14.52,10.9 -7.36711,0,18.1,0,0.679,6.193,78.1,1.9356,24,666,20.2,96.73,21.52,11 -9.33889,0,18.1,0,0.679,6.38,95.6,1.9682,24,666,20.2,60.72,24.08,9.5 -8.49213,0,18.1,0,0.584,6.348,86.1,2.0527,24,666,20.2,83.45,17.64,14.5 -10.0623,0,18.1,0,0.584,6.833,94.3,2.0882,24,666,20.2,81.33,19.69,14.1 -6.44405,0,18.1,0,0.584,6.425,74.8,2.2004,24,666,20.2,97.95,12.03,16.1 -5.58107,0,18.1,0,0.713,6.436,87.9,2.3158,24,666,20.2,100.19,16.22,14.3 -13.9134,0,18.1,0,0.713,6.208,95,2.2222,24,666,20.2,100.63,15.17,11.7 -11.1604,0,18.1,0,0.74,6.629,94.6,2.1247,24,666,20.2,109.85,23.27,13.4 -14.4208,0,18.1,0,0.74,6.461,93.3,2.0026,24,666,20.2,27.49,18.05,9.6 -15.1772,0,18.1,0,0.74,6.152,100,1.9142,24,666,20.2,9.32,26.45,8.7 -13.6781,0,18.1,0,0.74,5.935,87.9,1.8206,24,666,20.2,68.95,34.02,8.4 -9.39063,0,18.1,0,0.74,5.627,93.9,1.8172,24,666,20.2,396.9,22.88,12.8 -22.0511,0,18.1,0,0.74,5.818,92.4,1.8662,24,666,20.2,391.45,22.11,10.5 -9.72418,0,18.1,0,0.74,6.406,97.2,2.0651,24,666,20.2,385.96,19.52,17.1 -5.66637,0,18.1,0,0.74,6.219,100,2.0048,24,666,20.2,395.69,16.59,18.4 -9.96654,0,18.1,0,0.74,6.485,100,1.9784,24,666,20.2,386.73,18.85,15.4 -12.8023,0,18.1,0,0.74,5.854,96.6,1.8956,24,666,20.2,240.52,23.79,10.8 -10.6718,0,18.1,0,0.74,6.459,94.8,1.9879,24,666,20.2,43.06,23.98,11.8 -6.28807,0,18.1,0,0.74,6.341,96.4,2.072,24,666,20.2,318.01,17.79,14.9 -9.92485,0,18.1,0,0.74,6.251,96.6,2.198,24,666,20.2,388.52,16.44,12.6 -9.32909,0,18.1,0,0.713,6.185,98.7,2.2616,24,666,20.2,396.9,18.13,14.1 -7.52601,0,18.1,0,0.713,6.417,98.3,2.185,24,666,20.2,304.21,19.31,13 -6.71772,0,18.1,0,0.713,6.749,92.6,2.3236,24,666,20.2,0.32,17.44,13.4 -5.44114,0,18.1,0,0.713,6.655,98.2,2.3552,24,666,20.2,355.29,17.73,15.2 -5.09017,0,18.1,0,0.713,6.297,91.8,2.3682,24,666,20.2,385.09,17.27,16.1 -8.24809,0,18.1,0,0.713,7.393,99.3,2.4527,24,666,20.2,375.87,16.74,17.8 -9.51363,0,18.1,0,0.713,6.728,94.1,2.4961,24,666,20.2,6.68,18.71,14.9 -4.75237,0,18.1,0,0.713,6.525,86.5,2.4358,24,666,20.2,50.92,18.13,14.1 -4.66883,0,18.1,0,0.713,5.976,87.9,2.5806,24,666,20.2,10.48,19.01,12.7 -8.20058,0,18.1,0,0.713,5.936,80.3,2.7792,24,666,20.2,3.5,16.94,13.5 -7.75223,0,18.1,0,0.713,6.301,83.7,2.7831,24,666,20.2,272.21,16.23,14.9 -6.80117,0,18.1,0,0.713,6.081,84.4,2.7175,24,666,20.2,396.9,14.7,20 -4.81213,0,18.1,0,0.713,6.701,90,2.5975,24,666,20.2,255.23,16.42,16.4 -3.69311,0,18.1,0,0.713,6.376,88.4,2.5671,24,666,20.2,391.43,14.65,17.7 -6.65492,0,18.1,0,0.713,6.317,83,2.7344,24,666,20.2,396.9,13.99,19.5 -5.82115,0,18.1,0,0.713,6.513,89.9,2.8016,24,666,20.2,393.82,10.29,20.2 -7.83932,0,18.1,0,0.655,6.209,65.4,2.9634,24,666,20.2,396.9,13.22,21.4 -3.1636,0,18.1,0,0.655,5.759,48.2,3.0665,24,666,20.2,334.4,14.13,19.9 -3.77498,0,18.1,0,0.655,5.952,84.7,2.8715,24,666,20.2,22.01,17.15,19 -4.42228,0,18.1,0,0.584,6.003,94.5,2.5403,24,666,20.2,331.29,21.32,19.1 -15.5757,0,18.1,0,0.58,5.926,71,2.9084,24,666,20.2,368.74,18.13,19.1 -13.0751,0,18.1,0,0.58,5.713,56.7,2.8237,24,666,20.2,396.9,14.76,20.1 -4.34879,0,18.1,0,0.58,6.167,84,3.0334,24,666,20.2,396.9,16.29,19.9 -4.03841,0,18.1,0,0.532,6.229,90.7,3.0993,24,666,20.2,395.33,12.87,19.6 -3.56868,0,18.1,0,0.58,6.437,75,2.8965,24,666,20.2,393.37,14.36,23.2 -4.64689,0,18.1,0,0.614,6.98,67.6,2.5329,24,666,20.2,374.68,11.66,29.8 -8.05579,0,18.1,0,0.584,5.427,95.4,2.4298,24,666,20.2,352.58,18.14,13.8 -6.39312,0,18.1,0,0.584,6.162,97.4,2.206,24,666,20.2,302.76,24.1,13.3 -4.87141,0,18.1,0,0.614,6.484,93.6,2.3053,24,666,20.2,396.21,18.68,16.7 -15.0234,0,18.1,0,0.614,5.304,97.3,2.1007,24,666,20.2,349.48,24.91,12 -10.233,0,18.1,0,0.614,6.185,96.7,2.1705,24,666,20.2,379.7,18.03,14.6 -14.3337,0,18.1,0,0.614,6.229,88,1.9512,24,666,20.2,383.32,13.11,21.4 -5.82401,0,18.1,0,0.532,6.242,64.7,3.4242,24,666,20.2,396.9,10.74,23 -5.70818,0,18.1,0,0.532,6.75,74.9,3.3317,24,666,20.2,393.07,7.74,23.7 -5.73116,0,18.1,0,0.532,7.061,77,3.4106,24,666,20.2,395.28,7.01,25 -2.81838,0,18.1,0,0.532,5.762,40.3,4.0983,24,666,20.2,392.92,10.42,21.8 -2.37857,0,18.1,0,0.583,5.871,41.9,3.724,24,666,20.2,370.73,13.34,20.6 -3.67367,0,18.1,0,0.583,6.312,51.9,3.9917,24,666,20.2,388.62,10.58,21.2 -5.69175,0,18.1,0,0.583,6.114,79.8,3.5459,24,666,20.2,392.68,14.98,19.1 -4.83567,0,18.1,0,0.583,5.905,53.2,3.1523,24,666,20.2,388.22,11.45,20.6 -0.15086,0,27.74,0,0.609,5.454,92.7,1.8209,4,711,20.1,395.09,18.06,15.2 -0.18337,0,27.74,0,0.609,5.414,98.3,1.7554,4,711,20.1,344.05,23.97,7 -0.20746,0,27.74,0,0.609,5.093,98,1.8226,4,711,20.1,318.43,29.68,8.1 -0.10574,0,27.74,0,0.609,5.983,98.8,1.8681,4,711,20.1,390.11,18.07,13.6 -0.11132,0,27.74,0,0.609,5.983,83.5,2.1099,4,711,20.1,396.9,13.35,20.1 -0.17331,0,9.69,0,0.585,5.707,54,2.3817,6,391,19.2,396.9,12.01,21.8 -0.27957,0,9.69,0,0.585,5.926,42.6,2.3817,6,391,19.2,396.9,13.59,24.5 -0.17899,0,9.69,0,0.585,5.67,28.8,2.7986,6,391,19.2,393.29,17.6,23.1 -0.2896,0,9.69,0,0.585,5.39,72.9,2.7986,6,391,19.2,396.9,21.14,19.7 -0.26838,0,9.69,0,0.585,5.794,70.6,2.8927,6,391,19.2,396.9,14.1,18.3 -0.23912,0,9.69,0,0.585,6.019,65.3,2.4091,6,391,19.2,396.9,12.92,21.2 -0.17783,0,9.69,0,0.585,5.569,73.5,2.3999,6,391,19.2,395.77,15.1,17.5 -0.22438,0,9.69,0,0.585,6.027,79.7,2.4982,6,391,19.2,396.9,14.33,16.8 -0.06263,0,11.93,0,0.573,6.593,69.1,2.4786,1,273,21,391.99,9.67,22.4 -0.04527,0,11.93,0,0.573,6.12,76.7,2.2875,1,273,21,396.9,9.08,20.6 -0.06076,0,11.93,0,0.573,6.976,91,2.1675,1,273,21,396.9,5.64,23.9 -0.10959,0,11.93,0,0.573,6.794,89.3,2.3889,1,273,21,393.45,6.48,22 -0.04741,0,11.93,0,0.573,6.03,80.8,2.505,1,273,21,396.9,7.88,11.9 From b1ba38b3645ba57d24703ff7a73a976c4069f072 Mon Sep 17 00:00:00 2001 From: Gordon Grey <165761041+greygosu@users.noreply.github.com> Date: Tue, 20 May 2025 21:38:36 +0800 Subject: [PATCH 171/182] DOC Add link to plot_swissroll example (#31378) --- doc/modules/manifold.rst | 3 +++ 1 file changed, 3 insertions(+) diff --git a/doc/modules/manifold.rst b/doc/modules/manifold.rst index fec6e96153323..aec992a8f9dc1 100644 --- a/doc/modules/manifold.rst +++ b/doc/modules/manifold.rst @@ -115,6 +115,9 @@ from the data itself, without the use of predetermined classifications. * See :ref:`sphx_glr_auto_examples_manifold_plot_manifold_sphere.py` for an example of manifold learning techniques applied to a spherical data-set. +* See :ref:`sphx_glr_auto_examples_manifold_plot_swissroll.py` for an example of using + manifold learning techniques on a Swiss Roll dataset. + The manifold learning implementations available in scikit-learn are summarized below From 19a6e61b6f8a7bb8a6d9dd5e8a5d40a741de28c3 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Lo=C3=AFc=20Est=C3=A8ve?= Date: Tue, 20 May 2025 16:19:07 +0200 Subject: [PATCH 172/182] DOC Fix plotly rendering inside JupyterLite (#31400) --- doc/conf.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/doc/conf.py b/doc/conf.py index 1113d4b2c100a..71c9ec5bb60c3 100644 --- a/doc/conf.py +++ b/doc/conf.py @@ -668,7 +668,7 @@ def notebook_modification_function(notebook_content, notebook_filename): if "seaborn" in notebook_content_str: code_lines.append("%pip install seaborn") if "plotly.express" in notebook_content_str: - code_lines.append("%pip install plotly") + code_lines.append("%pip install plotly nbformat") if "skimage" in notebook_content_str: code_lines.append("%pip install scikit-image") if "polars" in notebook_content_str: From d077f82f8ee749dc5c46ccdb81009f86a2ca3d83 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Dea=20Mar=C3=ADa=20L=C3=A9on?= Date: Wed, 21 May 2025 10:33:20 +0200 Subject: [PATCH 173/182] ENH: Display parameters in HTML representation (#30763) Co-authored-by: Guillaume Lemaitre --- .../sklearn.base/30763.enhancement.rst | 4 + sklearn/base.py | 97 ++++++--- sklearn/compose/_column_transformer.py | 2 +- sklearn/ensemble/_stacking.py | 2 +- sklearn/ensemble/_voting.py | 2 +- sklearn/model_selection/_search.py | 2 +- sklearn/model_selection/tests/test_search.py | 8 +- sklearn/pipeline.py | 2 +- .../preprocessing/_function_transformer.py | 2 +- sklearn/tests/test_base.py | 8 + sklearn/utils/__init__.py | 3 +- sklearn/utils/_repr_html/__init__.py | 2 + sklearn/utils/_repr_html/base.py | 152 +++++++++++++++ .../estimator.css} | 10 +- sklearn/utils/_repr_html/estimator.js | 42 ++++ .../estimator.py} | 184 +++++++----------- sklearn/utils/_repr_html/params.css | 63 ++++++ sklearn/utils/_repr_html/params.py | 83 ++++++++ sklearn/utils/_repr_html/tests/__init__.py | 0 .../tests/test_estimator.py} | 34 ++-- sklearn/utils/_repr_html/tests/test_params.py | 74 +++++++ 21 files changed, 595 insertions(+), 181 deletions(-) create mode 100644 doc/whats_new/upcoming_changes/sklearn.base/30763.enhancement.rst create mode 100644 sklearn/utils/_repr_html/__init__.py create mode 100644 sklearn/utils/_repr_html/base.py rename sklearn/utils/{_estimator_html_repr.css => _repr_html/estimator.css} (99%) create mode 100644 sklearn/utils/_repr_html/estimator.js rename sklearn/utils/{_estimator_html_repr.py => _repr_html/estimator.py} (76%) create mode 100644 sklearn/utils/_repr_html/params.css create mode 100644 sklearn/utils/_repr_html/params.py create mode 100644 sklearn/utils/_repr_html/tests/__init__.py rename sklearn/utils/{tests/test_estimator_html_repr.py => _repr_html/tests/test_estimator.py} (95%) create mode 100644 sklearn/utils/_repr_html/tests/test_params.py diff --git a/doc/whats_new/upcoming_changes/sklearn.base/30763.enhancement.rst b/doc/whats_new/upcoming_changes/sklearn.base/30763.enhancement.rst new file mode 100644 index 0000000000000..6a105da88ed0e --- /dev/null +++ b/doc/whats_new/upcoming_changes/sklearn.base/30763.enhancement.rst @@ -0,0 +1,4 @@ +- :class:`base.BaseEstimator` now has a parameter table added to the + estimators HTML representation that can be visualized with jupyter. + By :user:`Guillaume Lemaitre ` and + :user:`Dea María Léon ` diff --git a/sklearn/base.py b/sklearn/base.py index 94aa51828aae5..309b482357e12 100644 --- a/sklearn/base.py +++ b/sklearn/base.py @@ -16,9 +16,12 @@ from . import __version__ from ._config import config_context, get_config from .exceptions import InconsistentVersionWarning -from .utils._estimator_html_repr import _HTMLDocumentationLinkMixin, estimator_html_repr from .utils._metadata_requests import _MetadataRequester, _routing_enabled +from .utils._missing import is_scalar_nan from .utils._param_validation import validate_parameter_constraints +from .utils._repr_html.base import ReprHTMLMixin, _HTMLDocumentationLinkMixin +from .utils._repr_html.estimator import estimator_html_repr +from .utils._repr_html.params import ParamsDict from .utils._set_output import _SetOutputMixin from .utils._tags import ( ClassifierTags, @@ -150,7 +153,7 @@ def _clone_parametrized(estimator, *, safe=True): return new_object -class BaseEstimator(_HTMLDocumentationLinkMixin, _MetadataRequester): +class BaseEstimator(ReprHTMLMixin, _HTMLDocumentationLinkMixin, _MetadataRequester): """Base class for all estimators in scikit-learn. Inheriting from this class provides default implementations of: @@ -194,6 +197,8 @@ class BaseEstimator(_HTMLDocumentationLinkMixin, _MetadataRequester): array([3, 3, 3]) """ + _html_repr = estimator_html_repr + @classmethod def _get_param_names(cls): """Get parameter names for the estimator""" @@ -249,6 +254,64 @@ def get_params(self, deep=True): out[key] = value return out + def _get_params_html(self, deep=True): + """ + Get parameters for this estimator with a specific HTML representation. + + Parameters + ---------- + deep : bool, default=True + If True, will return the parameters for this estimator and + contained subobjects that are estimators. + + Returns + ------- + params : ParamsDict + Parameter names mapped to their values. We return a `ParamsDict` + dictionary, which renders a specific HTML representation in table + form. + """ + out = self.get_params(deep=deep) + + init_func = getattr(self.__init__, "deprecated_original", self.__init__) + init_default_params = inspect.signature(init_func).parameters + init_default_params = { + name: param.default for name, param in init_default_params.items() + } + + def is_non_default(param_name, param_value): + """Finds the parameters that have been set by the user.""" + if param_name not in init_default_params: + # happens if k is part of a **kwargs + return True + if init_default_params[param_name] == inspect._empty: + # k has no default value + return True + # avoid calling repr on nested estimators + if isinstance(param_value, BaseEstimator) and type(param_value) is not type( + init_default_params[param_name] + ): + return True + + if param_value != init_default_params[param_name] and not ( + is_scalar_nan(init_default_params[param_name]) + and is_scalar_nan(param_value) + ): + return True + return False + + # reorder the parameters from `self.get_params` using the `__init__` + # signature + remaining_params = [name for name in out if name not in init_default_params] + ordered_out = {name: out[name] for name in init_default_params if name in out} + ordered_out.update({name: out[name] for name in remaining_params}) + + non_default_ls = tuple( + [name for name, value in ordered_out.items() if is_non_default(name, value)] + ) + + return ParamsDict(ordered_out, non_default=non_default_ls) + def set_params(self, **params): """Set the parameters of this estimator. @@ -409,36 +472,6 @@ class attribute, which is a dictionary `param_name: list of constraints`. See caller_name=self.__class__.__name__, ) - @property - def _repr_html_(self): - """HTML representation of estimator. - - This is redundant with the logic of `_repr_mimebundle_`. The latter - should be favored in the long term, `_repr_html_` is only - implemented for consumers who do not interpret `_repr_mimbundle_`. - """ - if get_config()["display"] != "diagram": - raise AttributeError( - "_repr_html_ is only defined when the " - "'display' configuration option is set to " - "'diagram'" - ) - return self._repr_html_inner - - def _repr_html_inner(self): - """This function is returned by the @property `_repr_html_` to make - `hasattr(estimator, "_repr_html_") return `True` or `False` depending - on `get_config()["display"]`. - """ - return estimator_html_repr(self) - - def _repr_mimebundle_(self, **kwargs): - """Mime bundle used by jupyter kernels to display estimator""" - output = {"text/plain": repr(self)} - if get_config()["display"] == "diagram": - output["text/html"] = estimator_html_repr(self) - return output - class ClassifierMixin: """Mixin class for all classifiers in scikit-learn. diff --git a/sklearn/compose/_column_transformer.py b/sklearn/compose/_column_transformer.py index 8e3938c49be32..2b9c32659e66e 100644 --- a/sklearn/compose/_column_transformer.py +++ b/sklearn/compose/_column_transformer.py @@ -20,10 +20,10 @@ from ..pipeline import _fit_transform_one, _name_estimators, _transform_one from ..preprocessing import FunctionTransformer from ..utils import Bunch -from ..utils._estimator_html_repr import _VisualBlock from ..utils._indexing import _determine_key_type, _get_column_indices, _safe_indexing from ..utils._metadata_requests import METHODS from ..utils._param_validation import HasMethods, Hidden, Interval, StrOptions +from ..utils._repr_html.estimator import _VisualBlock from ..utils._set_output import ( _get_container_adapter, _get_output_config, diff --git a/sklearn/ensemble/_stacking.py b/sklearn/ensemble/_stacking.py index d7491be2f666f..2894d8f174c13 100644 --- a/sklearn/ensemble/_stacking.py +++ b/sklearn/ensemble/_stacking.py @@ -24,8 +24,8 @@ from ..model_selection import check_cv, cross_val_predict from ..preprocessing import LabelEncoder from ..utils import Bunch -from ..utils._estimator_html_repr import _VisualBlock from ..utils._param_validation import HasMethods, StrOptions +from ..utils._repr_html.estimator import _VisualBlock from ..utils.metadata_routing import ( MetadataRouter, MethodMapping, diff --git a/sklearn/ensemble/_voting.py b/sklearn/ensemble/_voting.py index e7e670dd869b6..369d3f0f5553e 100644 --- a/sklearn/ensemble/_voting.py +++ b/sklearn/ensemble/_voting.py @@ -24,8 +24,8 @@ from ..exceptions import NotFittedError from ..preprocessing import LabelEncoder from ..utils import Bunch -from ..utils._estimator_html_repr import _VisualBlock from ..utils._param_validation import StrOptions +from ..utils._repr_html.estimator import _VisualBlock from ..utils.metadata_routing import ( MetadataRouter, MethodMapping, diff --git a/sklearn/model_selection/_search.py b/sklearn/model_selection/_search.py index 1556472037c5f..b6b537a68d401 100644 --- a/sklearn/model_selection/_search.py +++ b/sklearn/model_selection/_search.py @@ -31,8 +31,8 @@ get_scorer_names, ) from ..utils import Bunch, check_random_state -from ..utils._estimator_html_repr import _VisualBlock from ..utils._param_validation import HasMethods, Interval, StrOptions +from ..utils._repr_html.estimator import _VisualBlock from ..utils._tags import get_tags from ..utils.metadata_routing import ( MetadataRouter, diff --git a/sklearn/model_selection/tests/test_search.py b/sklearn/model_selection/tests/test_search.py index 393429b29ff92..7888dd2d1766b 100644 --- a/sklearn/model_selection/tests/test_search.py +++ b/sklearn/model_selection/tests/test_search.py @@ -2662,21 +2662,21 @@ def test_search_html_repr(): search_cv = GridSearchCV(pipeline, param_grid=param_grid, refit=False) with config_context(display="diagram"): repr_html = search_cv._repr_html_() - assert "
DummyClassifier()
" in repr_html + assert "
DummyClassifier
" in repr_html # Fitted with `refit=False` shows the original pipeline search_cv.fit(X, y) with config_context(display="diagram"): repr_html = search_cv._repr_html_() - assert "
DummyClassifier()
" in repr_html + assert "
DummyClassifier
" in repr_html # Fitted with `refit=True` shows the best estimator search_cv = GridSearchCV(pipeline, param_grid=param_grid, refit=True) search_cv.fit(X, y) with config_context(display="diagram"): repr_html = search_cv._repr_html_() - assert "
DummyClassifier()
" not in repr_html - assert "
LogisticRegression()
" in repr_html + assert "
DummyClassifier
" not in repr_html + assert "
LogisticRegression
" in repr_html # Metadata Routing Tests diff --git a/sklearn/pipeline.py b/sklearn/pipeline.py index f3fbf1e3b3299..b291d970b1c79 100644 --- a/sklearn/pipeline.py +++ b/sklearn/pipeline.py @@ -16,9 +16,9 @@ from .exceptions import NotFittedError from .preprocessing import FunctionTransformer from .utils import Bunch -from .utils._estimator_html_repr import _VisualBlock from .utils._metadata_requests import METHODS from .utils._param_validation import HasMethods, Hidden +from .utils._repr_html.estimator import _VisualBlock from .utils._set_output import ( _get_container_adapter, _safe_set_output, diff --git a/sklearn/preprocessing/_function_transformer.py b/sklearn/preprocessing/_function_transformer.py index 3503fead2ba59..b53e36a733d85 100644 --- a/sklearn/preprocessing/_function_transformer.py +++ b/sklearn/preprocessing/_function_transformer.py @@ -7,8 +7,8 @@ import numpy as np from ..base import BaseEstimator, TransformerMixin, _fit_context -from ..utils._estimator_html_repr import _VisualBlock from ..utils._param_validation import StrOptions +from ..utils._repr_html.estimator import _VisualBlock from ..utils._set_output import ( _get_adapter_from_container, _get_output_config, diff --git a/sklearn/tests/test_base.py b/sklearn/tests/test_base.py index b65baa78802bc..e57d36351f0d4 100644 --- a/sklearn/tests/test_base.py +++ b/sklearn/tests/test_base.py @@ -992,3 +992,11 @@ def predict(self, X, prop=None): with warnings.catch_warnings(record=True) as record: CustomOutlierDetector().set_predict_request(prop=True).fit_predict([[1]], [1]) assert len(record) == 0 + + +def test_get_params_html(): + """Check the behaviour of the `_get_params_html` method.""" + est = MyEstimator(empty="test") + + assert est._get_params_html() == {"l1": 0, "empty": "test"} + assert est._get_params_html().non_default == ("empty",) diff --git a/sklearn/utils/__init__.py b/sklearn/utils/__init__.py index 941126c6b083f..8fd8a315a0be2 100644 --- a/sklearn/utils/__init__.py +++ b/sklearn/utils/__init__.py @@ -7,7 +7,6 @@ from . import metadata_routing from ._bunch import Bunch from ._chunking import gen_batches, gen_even_slices -from ._estimator_html_repr import estimator_html_repr # Make _safe_indexing importable from here for backward compat as this particular # helper is considered semi-private and typically very useful for third-party @@ -20,6 +19,8 @@ shuffle, ) from ._mask import safe_mask +from ._repr_html.base import _HTMLDocumentationLinkMixin # noqa: F401 +from ._repr_html.estimator import estimator_html_repr from ._tags import ( ClassifierTags, InputTags, diff --git a/sklearn/utils/_repr_html/__init__.py b/sklearn/utils/_repr_html/__init__.py new file mode 100644 index 0000000000000..67dd18fb94b59 --- /dev/null +++ b/sklearn/utils/_repr_html/__init__.py @@ -0,0 +1,2 @@ +# Authors: The scikit-learn developers +# SPDX-License-Identifier: BSD-3-Clause diff --git a/sklearn/utils/_repr_html/base.py b/sklearn/utils/_repr_html/base.py new file mode 100644 index 0000000000000..28020a2a74698 --- /dev/null +++ b/sklearn/utils/_repr_html/base.py @@ -0,0 +1,152 @@ +# Authors: The scikit-learn developers +# SPDX-License-Identifier: BSD-3-Clause + +import itertools + +from ... import __version__ +from ..._config import get_config +from ..fixes import parse_version + + +class _HTMLDocumentationLinkMixin: + """Mixin class allowing to generate a link to the API documentation. + + This mixin relies on three attributes: + - `_doc_link_module`: it corresponds to the root module (e.g. `sklearn`). Using this + mixin, the default value is `sklearn`. + - `_doc_link_template`: it corresponds to the template used to generate the + link to the API documentation. Using this mixin, the default value is + `"https://scikit-learn.org/{version_url}/modules/generated/ + {estimator_module}.{estimator_name}.html"`. + - `_doc_link_url_param_generator`: it corresponds to a function that generates the + parameters to be used in the template when the estimator module and name are not + sufficient. + + The method :meth:`_get_doc_link` generates the link to the API documentation for a + given estimator. + + This useful provides all the necessary states for + :func:`sklearn.utils.estimator_html_repr` to generate a link to the API + documentation for the estimator HTML diagram. + + Examples + -------- + If the default values for `_doc_link_module`, `_doc_link_template` are not suitable, + then you can override them and provide a method to generate the URL parameters: + >>> from sklearn.base import BaseEstimator + >>> doc_link_template = "https://address.local/{single_param}.html" + >>> def url_param_generator(estimator): + ... return {"single_param": estimator.__class__.__name__} + >>> class MyEstimator(BaseEstimator): + ... # use "builtins" since it is the associated module when declaring + ... # the class in a docstring + ... _doc_link_module = "builtins" + ... _doc_link_template = doc_link_template + ... _doc_link_url_param_generator = url_param_generator + >>> estimator = MyEstimator() + >>> estimator._get_doc_link() + 'https://address.local/MyEstimator.html' + + If instead of overriding the attributes inside the class definition, you want to + override a class instance, you can use `types.MethodType` to bind the method to the + instance: + >>> import types + >>> estimator = BaseEstimator() + >>> estimator._doc_link_template = doc_link_template + >>> estimator._doc_link_url_param_generator = types.MethodType( + ... url_param_generator, estimator) + >>> estimator._get_doc_link() + 'https://address.local/BaseEstimator.html' + """ + + _doc_link_module = "sklearn" + _doc_link_url_param_generator = None + + @property + def _doc_link_template(self): + sklearn_version = parse_version(__version__) + if sklearn_version.dev is None: + version_url = f"{sklearn_version.major}.{sklearn_version.minor}" + else: + version_url = "dev" + return getattr( + self, + "__doc_link_template", + ( + f"https://scikit-learn.org/{version_url}/modules/generated/" + "{estimator_module}.{estimator_name}.html" + ), + ) + + @_doc_link_template.setter + def _doc_link_template(self, value): + setattr(self, "__doc_link_template", value) + + def _get_doc_link(self): + """Generates a link to the API documentation for a given estimator. + + This method generates the link to the estimator's documentation page + by using the template defined by the attribute `_doc_link_template`. + + Returns + ------- + url : str + The URL to the API documentation for this estimator. If the estimator does + not belong to module `_doc_link_module`, the empty string (i.e. `""`) is + returned. + """ + if self.__class__.__module__.split(".")[0] != self._doc_link_module: + return "" + + if self._doc_link_url_param_generator is None: + estimator_name = self.__class__.__name__ + # Construct the estimator's module name, up to the first private submodule. + # This works because in scikit-learn all public estimators are exposed at + # that level, even if they actually live in a private sub-module. + estimator_module = ".".join( + itertools.takewhile( + lambda part: not part.startswith("_"), + self.__class__.__module__.split("."), + ) + ) + return self._doc_link_template.format( + estimator_module=estimator_module, estimator_name=estimator_name + ) + return self._doc_link_template.format(**self._doc_link_url_param_generator()) + + +class ReprHTMLMixin: + """Mixin to handle consistently the HTML representation. + + When inheriting from this class, you need to define an attribute `_html_repr` + which is a callable that returns the HTML representation to be shown. + """ + + @property + def _repr_html_(self): + """HTML representation of estimator. + This is redundant with the logic of `_repr_mimebundle_`. The latter + should be favored in the long term, `_repr_html_` is only + implemented for consumers who do not interpret `_repr_mimbundle_`. + """ + if get_config()["display"] != "diagram": + raise AttributeError( + "_repr_html_ is only defined when the " + "'display' configuration option is set to " + "'diagram'" + ) + return self._repr_html_inner + + def _repr_html_inner(self): + """This function is returned by the @property `_repr_html_` to make + `hasattr(estimator, "_repr_html_") return `True` or `False` depending + on `get_config()["display"]`. + """ + return self._html_repr() + + def _repr_mimebundle_(self, **kwargs): + """Mime bundle used by jupyter kernels to display estimator""" + output = {"text/plain": repr(self)} + if get_config()["display"] == "diagram": + output["text/html"] = self._html_repr() + return output diff --git a/sklearn/utils/_estimator_html_repr.css b/sklearn/utils/_repr_html/estimator.css similarity index 99% rename from sklearn/utils/_estimator_html_repr.css rename to sklearn/utils/_repr_html/estimator.css index 0a8c277845cb1..ece8781c6bd76 100644 --- a/sklearn/utils/_estimator_html_repr.css +++ b/sklearn/utils/_repr_html/estimator.css @@ -178,9 +178,7 @@ clickable and can be expanded/collapsed. /* Toggleable content - dropdown */ #$id div.sk-toggleable__content { - max-height: 0; - max-width: 0; - overflow: hidden; + display: none; text-align: left; /* unfitted */ background-color: var(--sklearn-color-unfitted-level-0); @@ -206,9 +204,9 @@ clickable and can be expanded/collapsed. #$id input.sk-toggleable__control:checked~div.sk-toggleable__content { /* Expand drop-down */ - max-height: 200px; - max-width: 100%; - overflow: auto; + display: block; + width: 100%; + overflow: visible; } #$id input.sk-toggleable__control:checked~label.sk-toggleable__label-arrow:before { diff --git a/sklearn/utils/_repr_html/estimator.js b/sklearn/utils/_repr_html/estimator.js new file mode 100644 index 0000000000000..5de0a021c63bb --- /dev/null +++ b/sklearn/utils/_repr_html/estimator.js @@ -0,0 +1,42 @@ +function copyToClipboard(text, element) { + // Get the parameter prefix from the closest toggleable content + const toggleableContent = element.closest('.sk-toggleable__content'); + const paramPrefix = toggleableContent ? toggleableContent.dataset.paramPrefix : ''; + const fullParamName = paramPrefix ? `${paramPrefix}${text}` : text; + + const originalStyle = element.style; + const computedStyle = window.getComputedStyle(element); + const originalWidth = computedStyle.width; + const originalHTML = element.innerHTML.replace('Copied!', ''); + + navigator.clipboard.writeText(fullParamName) + .then(() => { + element.style.width = originalWidth; + element.style.color = 'green'; + element.innerHTML = "Copied!"; + + setTimeout(() => { + element.innerHTML = originalHTML; + element.style = originalStyle; + }, 2000); + }) + .catch(err => { + console.error('Failed to copy:', err); + element.style.color = 'red'; + element.innerHTML = "Failed!"; + setTimeout(() => { + element.innerHTML = originalHTML; + element.style = originalStyle; + }, 2000); + }); + return false; +} + +document.querySelectorAll('.fa-regular.fa-copy').forEach(function(element) { + const toggleableContent = element.closest('.sk-toggleable__content'); + const paramPrefix = toggleableContent ? toggleableContent.dataset.paramPrefix : ''; + const paramName = element.parentElement.nextElementSibling.textContent.trim(); + const fullParamName = paramPrefix ? `${paramPrefix}${paramName}` : paramName; + + element.setAttribute('title', fullParamName); +}); diff --git a/sklearn/utils/_estimator_html_repr.py b/sklearn/utils/_repr_html/estimator.py similarity index 76% rename from sklearn/utils/_estimator_html_repr.py rename to sklearn/utils/_repr_html/estimator.py index 90a700a26ce9c..7d101dde58d74 100644 --- a/sklearn/utils/_estimator_html_repr.py +++ b/sklearn/utils/_repr_html/estimator.py @@ -2,15 +2,13 @@ # SPDX-License-Identifier: BSD-3-Clause import html -import itertools from contextlib import closing from inspect import isclass from io import StringIO from pathlib import Path from string import Template -from .. import __version__, config_context -from .fixes import parse_version +from ... import config_context class _IDCounter: @@ -26,7 +24,13 @@ def get_id(self): def _get_css_style(): - return Path(__file__).with_suffix(".css").read_text(encoding="utf-8") + estimator_css_file = Path(__file__).parent / "estimator.css" + params_css_file = Path(__file__).parent / "params.css" + + estimator_css = estimator_css_file.read_text(encoding="utf-8") + params_css = params_css_file.read_text(encoding="utf-8") + + return f"{estimator_css}\n{params_css}" _CONTAINER_ID_COUNTER = _IDCounter("sk-container-id") @@ -103,6 +107,7 @@ def _sk_visual_block_(self): def _write_label_html( out, + params, name, name_details, name_caption=None, @@ -113,6 +118,7 @@ def _write_label_html( doc_link="", is_fitted_css_class="", is_fitted_icon="", + param_prefix="", ): """Write labeled html with or without a dropdown with named details. @@ -120,6 +126,10 @@ def _write_label_html( ---------- out : file-like object The file to write the HTML representation to. + params: str + If estimator has `get_params` method, this is the HTML representation + of the estimator's parameters and their values. When the estimator + does not have `get_params`, it is an empty string. name : str The label for the estimator. It corresponds either to the estimator class name for a simple estimator or in the case of a `Pipeline` and `ColumnTransformer`, @@ -151,13 +161,14 @@ def _write_label_html( is_fitted_icon : str, default="" The HTML representation to show the fitted information in the diagram. An empty string means that no information is shown. + param_prefix : str, default="" + The prefix to prepend to parameter names for nested estimators. """ out.write( f'
' ) name = html.escape(name) - if name_details is not None: name_details = html.escape(str(name_details)) checked_str = "checked" if checked else "" @@ -194,9 +205,15 @@ def _write_label_html( fmt_str = ( f'{label_html}
{name_details}'
-            "
" + f'class="sk-toggleable__content {is_fitted_css_class}" ' + f'data-param-prefix="{html.escape(param_prefix)}">' ) + + if params: + fmt_str = "".join([fmt_str, f"{params}
"]) + elif name_details and ("Pipeline" not in name): + fmt_str = "".join([fmt_str, f"
{name_details}
"]) + out.write(fmt_str) else: out.write(f"") @@ -254,6 +271,7 @@ def _write_estimator_html( is_fitted_css_class, is_fitted_icon="", first_call=False, + param_prefix="", ): """Write estimator to html in serial, parallel, or by itself (single). @@ -284,6 +302,9 @@ def _write_estimator_html( empty string. first_call : bool, default=False Whether this is the first time this function is called. + param_prefix : str, default="" + The prefix to prepend to parameter names for nested estimators. + For example, in a pipeline this might be "pipeline__stepname__". """ if first_call: est_block = _get_visual_block(estimator) @@ -302,13 +323,22 @@ def _write_estimator_html( out.write(f'
') if estimator_label: + if hasattr(estimator, "get_params") and hasattr( + estimator, "_get_params_html" + ): + params = estimator._get_params_html(deep=False)._repr_html_inner() + else: + params = "" + _write_label_html( out, + params, estimator_label, estimator_label_details, doc_link=doc_link, is_fitted_css_class=is_fitted_css_class, is_fitted_icon=is_fitted_icon, + param_prefix=param_prefix, ) kind = est_block.kind @@ -316,6 +346,17 @@ def _write_estimator_html( est_infos = zip(est_block.estimators, est_block.names, est_block.name_details) for est, name, name_details in est_infos: + # Build the parameter prefix for nested estimators + + if param_prefix and hasattr(name, "split"): + # If we already have a prefix, append the new component + new_prefix = f"{param_prefix}{name.split(':')[0]}__" + elif hasattr(name, "split"): + # If this is the first level, start the prefix + new_prefix = f"{name.split(':')[0]}__" if name else "" + else: + new_prefix = param_prefix + if kind == "serial": _write_estimator_html( out, @@ -323,6 +364,7 @@ def _write_estimator_html( name, name_details, is_fitted_css_class=is_fitted_css_class, + param_prefix=new_prefix, ) else: # parallel out.write('
') @@ -334,13 +376,20 @@ def _write_estimator_html( name, name_details, is_fitted_css_class=is_fitted_css_class, + param_prefix=new_prefix, ) out.write("
") # sk-parallel-item out.write("
") elif est_block.kind == "single": + if hasattr(estimator, "_get_params_html"): + params = estimator._get_params_html()._repr_html_inner() + else: + params = "" + _write_label_html( out, + params, est_block.names, est_block.name_details, est_block.name_caption, @@ -351,6 +400,7 @@ def _write_estimator_html( doc_link=doc_link, is_fitted_css_class=is_fitted_css_class, is_fitted_icon=is_fitted_icon, + param_prefix=param_prefix, ) @@ -371,10 +421,10 @@ def estimator_html_repr(estimator): Examples -------- - >>> from sklearn.utils._estimator_html_repr import estimator_html_repr + >>> from sklearn.utils._repr_html.estimator import estimator_html_repr >>> from sklearn.linear_model import LogisticRegression >>> estimator_html_repr(LogisticRegression()) - '" + f"" f'
' '
' f"
{html.escape(estimator_str)}
{fallback_msg}" @@ -426,7 +477,6 @@ def estimator_html_repr(estimator): ) out.write(html_template) - _write_estimator_html( out, estimator, @@ -436,114 +486,12 @@ def estimator_html_repr(estimator): is_fitted_css_class=is_fitted_css_class, is_fitted_icon=is_fitted_icon, ) - out.write("
") - - html_output = out.getvalue() - return html_output - + with open(str(Path(__file__).parent / "estimator.js"), "r") as f: + script = f.read() -class _HTMLDocumentationLinkMixin: - """Mixin class allowing to generate a link to the API documentation. + html_end = f"" - This mixin relies on three attributes: - - `_doc_link_module`: it corresponds to the root module (e.g. `sklearn`). Using this - mixin, the default value is `sklearn`. - - `_doc_link_template`: it corresponds to the template used to generate the - link to the API documentation. Using this mixin, the default value is - `"https://scikit-learn.org/{version_url}/modules/generated/ - {estimator_module}.{estimator_name}.html"`. - - `_doc_link_url_param_generator`: it corresponds to a function that generates the - parameters to be used in the template when the estimator module and name are not - sufficient. + out.write(html_end) - The method :meth:`_get_doc_link` generates the link to the API documentation for a - given estimator. - - This useful provides all the necessary states for - :func:`sklearn.utils.estimator_html_repr` to generate a link to the API - documentation for the estimator HTML diagram. - - Examples - -------- - If the default values for `_doc_link_module`, `_doc_link_template` are not suitable, - then you can override them and provide a method to generate the URL parameters: - >>> from sklearn.base import BaseEstimator - >>> doc_link_template = "https://address.local/{single_param}.html" - >>> def url_param_generator(estimator): - ... return {"single_param": estimator.__class__.__name__} - >>> class MyEstimator(BaseEstimator): - ... # use "builtins" since it is the associated module when declaring - ... # the class in a docstring - ... _doc_link_module = "builtins" - ... _doc_link_template = doc_link_template - ... _doc_link_url_param_generator = url_param_generator - >>> estimator = MyEstimator() - >>> estimator._get_doc_link() - 'https://address.local/MyEstimator.html' - - If instead of overriding the attributes inside the class definition, you want to - override a class instance, you can use `types.MethodType` to bind the method to the - instance: - >>> import types - >>> estimator = BaseEstimator() - >>> estimator._doc_link_template = doc_link_template - >>> estimator._doc_link_url_param_generator = types.MethodType( - ... url_param_generator, estimator) - >>> estimator._get_doc_link() - 'https://address.local/BaseEstimator.html' - """ - - _doc_link_module = "sklearn" - _doc_link_url_param_generator = None - - @property - def _doc_link_template(self): - sklearn_version = parse_version(__version__) - if sklearn_version.dev is None: - version_url = f"{sklearn_version.major}.{sklearn_version.minor}" - else: - version_url = "dev" - return getattr( - self, - "__doc_link_template", - ( - f"https://scikit-learn.org/{version_url}/modules/generated/" - "{estimator_module}.{estimator_name}.html" - ), - ) - - @_doc_link_template.setter - def _doc_link_template(self, value): - setattr(self, "__doc_link_template", value) - - def _get_doc_link(self): - """Generates a link to the API documentation for a given estimator. - - This method generates the link to the estimator's documentation page - by using the template defined by the attribute `_doc_link_template`. - - Returns - ------- - url : str - The URL to the API documentation for this estimator. If the estimator does - not belong to module `_doc_link_module`, the empty string (i.e. `""`) is - returned. - """ - if self.__class__.__module__.split(".")[0] != self._doc_link_module: - return "" - - if self._doc_link_url_param_generator is None: - estimator_name = self.__class__.__name__ - # Construct the estimator's module name, up to the first private submodule. - # This works because in scikit-learn all public estimators are exposed at - # that level, even if they actually live in a private sub-module. - estimator_module = ".".join( - itertools.takewhile( - lambda part: not part.startswith("_"), - self.__class__.__module__.split("."), - ) - ) - return self._doc_link_template.format( - estimator_module=estimator_module, estimator_name=estimator_name - ) - return self._doc_link_template.format(**self._doc_link_url_param_generator()) + html_output = out.getvalue() + return html_output diff --git a/sklearn/utils/_repr_html/params.css b/sklearn/utils/_repr_html/params.css new file mode 100644 index 0000000000000..df815f966ffcf --- /dev/null +++ b/sklearn/utils/_repr_html/params.css @@ -0,0 +1,63 @@ +.estimator-table summary { + padding: .5rem; + font-family: monospace; + cursor: pointer; +} + +.estimator-table details[open] { + padding-left: 0.1rem; + padding-right: 0.1rem; + padding-bottom: 0.3rem; +} + +.estimator-table .parameters-table { + margin-left: auto !important; + margin-right: auto !important; +} + +.estimator-table .parameters-table tr:nth-child(odd) { + background-color: #fff; +} + +.estimator-table .parameters-table tr:nth-child(even) { + background-color: #f6f6f6; +} + +.estimator-table .parameters-table tr:hover { + background-color: #e0e0e0; +} + +.estimator-table table td { + border: 1px solid rgba(106, 105, 104, 0.232); +} + +.user-set td { + color:rgb(255, 94, 0); + text-align: left; +} + +.user-set td.value pre { + color:rgb(255, 94, 0) !important; + background-color: transparent !important; +} + +.default td { + color: black; + text-align: left; +} + +.user-set td i, +.default td i { + color: black; +} + +.copy-paste-icon { + background-image: url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCA0NDggNTEyIj48IS0tIUZvbnQgQXdlc29tZSBGcmVlIDYuNy4yIGJ5IEBmb250YXdlc29tZSAtIGh0dHBzOi8vZm9udGF3ZXNvbWUuY29tIExpY2Vuc2UgLSBodHRwczovL2ZvbnRhd2Vzb21lLmNvbS9saWNlbnNlL2ZyZWUgQ29weXJpZ2h0IDIwMjUgRm9udGljb25zLCBJbmMuLS0+PHBhdGggZD0iTTIwOCAwTDMzMi4xIDBjMTIuNyAwIDI0LjkgNS4xIDMzLjkgMTQuMWw2Ny45IDY3LjljOSA5IDE0LjEgMjEuMiAxNC4xIDMzLjlMNDQ4IDMzNmMwIDI2LjUtMjEuNSA0OC00OCA0OGwtMTkyIDBjLTI2LjUgMC00OC0yMS41LTQ4LTQ4bDAtMjg4YzAtMjYuNSAyMS41LTQ4IDQ4LTQ4ek00OCAxMjhsODAgMCAwIDY0LTY0IDAgMCAyNTYgMTkyIDAgMC0zMiA2NCAwIDAgNDhjMCAyNi41LTIxLjUgNDgtNDggNDhMNDggNTEyYy0yNi41IDAtNDgtMjEuNS00OC00OEwwIDE3NmMwLTI2LjUgMjEuNS00OCA0OC00OHoiLz48L3N2Zz4=); + background-repeat: no-repeat; + background-size: 14px 14px; + background-position: 0; + display: inline-block; + width: 14px; + height: 14px; + cursor: pointer; +} diff --git a/sklearn/utils/_repr_html/params.py b/sklearn/utils/_repr_html/params.py new file mode 100644 index 0000000000000..d85bf1280a8fc --- /dev/null +++ b/sklearn/utils/_repr_html/params.py @@ -0,0 +1,83 @@ +# Authors: The scikit-learn developers +# SPDX-License-Identifier: BSD-3-Clause + +import html +import reprlib +from collections import UserDict + +from sklearn.utils._repr_html.base import ReprHTMLMixin + + +def _read_params(name, value, non_default_params): + """Categorizes parameters as 'default' or 'user-set' and formats their values. + Escapes or truncates parameter values for display safety and readability. + """ + r = reprlib.Repr() + r.maxlist = 2 # Show only first 2 items of lists + r.maxtuple = 1 # Show only first item of tuples + r.maxstring = 50 # Limit string length + cleaned_value = html.escape(r.repr(value)) + + param_type = "user-set" if name in non_default_params else "default" + + return {"param_type": param_type, "param_name": name, "param_value": cleaned_value} + + +def _params_html_repr(params): + """Generate HTML representation of estimator parameters. + + Creates an HTML table with parameter names and values, wrapped in a + collapsible details element. Parameters are styled differently based + on whether they are default or user-set values. + """ + HTML_TEMPLATE = """ +
+
+ Parameters + + + {rows} + +
+
+
+ """ + ROW_TEMPLATE = """ + + + {param_name}  + {param_value} + + """ + + rows = [ + ROW_TEMPLATE.format(**_read_params(name, value, params.non_default)) + for name, value in params.items() + ] + + return HTML_TEMPLATE.format(rows="\n".join(rows)) + + +class ParamsDict(ReprHTMLMixin, UserDict): + """Dictionary-like class to store and provide an HTML representation. + + It builds an HTML structure to be used with Jupyter notebooks or similar + environments. It allows storing metadata to track non-default parameters. + + Parameters + ---------- + params : dict, default=None + The original dictionary of parameters and their values. + + non_default : tuple + The list of non-default parameters. + """ + + _html_repr = _params_html_repr + + def __init__(self, params=None, non_default=tuple()): + super().__init__(params or {}) + self.non_default = non_default diff --git a/sklearn/utils/_repr_html/tests/__init__.py b/sklearn/utils/_repr_html/tests/__init__.py new file mode 100644 index 0000000000000..e69de29bb2d1d diff --git a/sklearn/utils/tests/test_estimator_html_repr.py b/sklearn/utils/_repr_html/tests/test_estimator.py similarity index 95% rename from sklearn/utils/tests/test_estimator_html_repr.py rename to sklearn/utils/_repr_html/tests/test_estimator.py index c1c35d29c4472..cc975d854ed8f 100644 --- a/sklearn/utils/tests/test_estimator_html_repr.py +++ b/sklearn/utils/_repr_html/tests/test_estimator.py @@ -29,10 +29,10 @@ from sklearn.preprocessing import FunctionTransformer, OneHotEncoder, StandardScaler from sklearn.svm import LinearSVC, LinearSVR from sklearn.tree import DecisionTreeClassifier -from sklearn.utils._estimator_html_repr import ( +from sklearn.utils._repr_html.base import _HTMLDocumentationLinkMixin +from sklearn.utils._repr_html.estimator import ( _get_css_style, _get_visual_block, - _HTMLDocumentationLinkMixin, _write_label_html, estimator_html_repr, ) @@ -47,10 +47,11 @@ def dummy_function(x, y): def test_write_label_html(checked): # Test checking logic and labeling name = "LogisticRegression" + params = "" tool_tip = "hello-world" with closing(StringIO()) as out: - _write_label_html(out, name, tool_tip, checked=checked) + _write_label_html(out, params, name, tool_tip, checked=checked) html_label = out.getvalue() p = ( @@ -60,9 +61,9 @@ def test_write_label_html(checked): ) re_compiled = re.compile(p) assert re_compiled.search(html_label) - assert html_label.startswith('
') assert "
hello-world
" in html_label + if checked: assert "checked>" in html_label @@ -199,9 +200,7 @@ def test_estimator_html_repr_pipeline(): # top level estimators show estimator with changes assert html.escape(str(pipe)) in html_output for _, est in pipe.steps: - assert ( - '
' + html.escape(str(est))
-        ) in html_output
+        assert html.escape(str(est))[:44] in html_output
 
     # low level estimators do not show changes
     with config_context(print_changed_only=True):
@@ -217,18 +216,19 @@ def test_estimator_html_repr_pipeline():
             assert f"" in html_output
 
         pca = feat_u.transformer_list[0][1]
-        assert f"
{html.escape(str(pca))}
" in html_output + + assert html.escape(str(pca)) in html_output tsvd = feat_u.transformer_list[1][1] first = tsvd["first"] select = tsvd["select"] - assert f"
{html.escape(str(first))}
" in html_output - assert f"
{html.escape(str(select))}
" in html_output + assert html.escape(str(first)) in html_output + assert html.escape(str(select)) in html_output # voting classifier for name, est in clf.estimators: - assert f"" in html_output - assert f"
{html.escape(str(est))}
" in html_output + assert html.escape(name) in html_output + assert html.escape(str(est)) in html_output # verify that prefers-color-scheme is implemented assert "prefers-color-scheme" in html_output @@ -248,7 +248,7 @@ def test_stacking_classifier(final_estimator): # If final_estimator's default changes from LogisticRegression # this should be updated if final_estimator is None: - assert "LogisticRegression(" in html_output + assert "LogisticRegression" in html_output else: assert final_estimator.__class__.__name__ in html_output @@ -431,7 +431,7 @@ def test_html_documentation_link_mixin_sklearn(mock_version): """ # mock the `__version__` where the mixin is located - with patch("sklearn.utils._estimator_html_repr.__version__", mock_version): + with patch("sklearn.utils._repr_html.base.__version__", mock_version): mixin = _HTMLDocumentationLinkMixin() assert mixin._doc_link_module == "sklearn" @@ -608,3 +608,9 @@ def test_function_transformer_show_caption(func, expected_name): ) re_compiled = re.compile(p) assert re_compiled.search(html_output) + + +def test_estimator_html_repr_table(): + """Check that we add the table of parameters in the HTML representation.""" + est = LogisticRegression(C=10.0, fit_intercept=False) + assert "parameters-table" in estimator_html_repr(est) diff --git a/sklearn/utils/_repr_html/tests/test_params.py b/sklearn/utils/_repr_html/tests/test_params.py new file mode 100644 index 0000000000000..dd1c7dfb9aff7 --- /dev/null +++ b/sklearn/utils/_repr_html/tests/test_params.py @@ -0,0 +1,74 @@ +import pytest + +from sklearn import config_context +from sklearn.utils._repr_html.params import ParamsDict, _params_html_repr, _read_params + + +def test_params_dict_content(): + """Check the behavior of the ParamsDict class.""" + params = ParamsDict({"a": 1, "b": 2}) + assert params["a"] == 1 + assert params["b"] == 2 + assert params.non_default == () + + params = ParamsDict({"a": 1, "b": 2}, non_default=("a",)) + assert params["a"] == 1 + assert params["b"] == 2 + assert params.non_default == ("a",) + + +def test_params_dict_repr_html_(): + params = ParamsDict({"a": 1, "b": 2}, non_default=("a",)) + out = params._repr_html_() + assert "Parameters" in out + + with config_context(display="text"): + msg = "_repr_html_ is only defined when" + with pytest.raises(AttributeError, match=msg): + params._repr_html_() + + +def test_params_dict_repr_mimebundle(): + params = ParamsDict({"a": 1, "b": 2}, non_default=("a",)) + out = params._repr_mimebundle_() + + assert "text/plain" in out + assert "text/html" in out + assert "Parameters" in out["text/html"] + assert out["text/plain"] == "{'a': 1, 'b': 2}" + + with config_context(display="text"): + out = params._repr_mimebundle_() + assert "text/plain" in out + assert "text/html" not in out + + +def test_read_params(): + """Check the behavior of the `_read_params` function.""" + out = _read_params("a", 1, tuple()) + assert out["param_type"] == "default" + assert out["param_name"] == "a" + assert out["param_value"] == "1" + + # check non-default parameters + out = _read_params("a", 1, ("a",)) + assert out["param_type"] == "user-set" + assert out["param_name"] == "a" + assert out["param_value"] == "1" + + # check that we escape html tags + tag_injection = "" + out = _read_params("a", tag_injection, tuple()) + assert ( + out["param_value"] + == ""<script>alert('xss')</script>"" + ) + assert out["param_name"] == "a" + assert out["param_type"] == "default" + + +def test_params_html_repr(): + """Check returned HTML template""" + params = ParamsDict({"a": 1, "b": 2}) + assert "parameters-table" in _params_html_repr(params) + assert "estimator-table" in _params_html_repr(params) From 0c28c8219bbdea9585237f37b5b9ad5033642c85 Mon Sep 17 00:00:00 2001 From: omahs <73983677+omahs@users.noreply.github.com> Date: Wed, 21 May 2025 16:29:56 +0200 Subject: [PATCH 174/182] DOC Fix various typos in documentation and comments (#31404) --- doc/modules/ensemble.rst | 4 ++-- examples/bicluster/plot_spectral_biclustering.py | 2 +- examples/cluster/plot_agglomerative_clustering_metrics.py | 2 +- examples/svm/plot_svm_kernels.py | 2 +- sklearn/_loss/_loss.pyx.tp | 2 +- sklearn/preprocessing/_function_transformer.py | 2 +- sklearn/utils/fixes.py | 2 +- sklearn/utils/tests/test_array_api.py | 2 +- 8 files changed, 9 insertions(+), 9 deletions(-) diff --git a/doc/modules/ensemble.rst b/doc/modules/ensemble.rst index f0f14c60e4867..6b0fc93e437ff 100644 --- a/doc/modules/ensemble.rst +++ b/doc/modules/ensemble.rst @@ -308,7 +308,7 @@ values. all of the :math:`2^{K - 1} - 1` partitions, where :math:`K` is the number of categories. This can quickly become prohibitive when :math:`K` is large. Fortunately, since gradient boosting trees are always regression trees (even - for classification problems), there exist a faster strategy that can yield + for classification problems), there exists a faster strategy that can yield equivalent splits. First, the categories of a feature are sorted according to the variance of the target, for each category `k`. Once the categories are sorted, one can consider *continuous partitions*, i.e. treat the categories @@ -1587,7 +1587,7 @@ Note that it is also possible to get the output of the stacked In practice, a stacking predictor predicts as good as the best predictor of the base layer and even sometimes outperforms it by combining the different -strengths of the these predictors. However, training a stacking predictor is +strengths of these predictors. However, training a stacking predictor is computationally expensive. .. note:: diff --git a/examples/bicluster/plot_spectral_biclustering.py b/examples/bicluster/plot_spectral_biclustering.py index 469c3c71e17c6..86245325ae493 100644 --- a/examples/bicluster/plot_spectral_biclustering.py +++ b/examples/bicluster/plot_spectral_biclustering.py @@ -26,7 +26,7 @@ # -------------------- # We generate the sample data using the # :func:`~sklearn.datasets.make_checkerboard` function. Each pixel within -# `shape=(300, 300)` represents with it's color a value from a uniform +# `shape=(300, 300)` represents with its color a value from a uniform # distribution. The noise is added from a normal distribution, where the value # chosen for `noise` is the standard deviation. # diff --git a/examples/cluster/plot_agglomerative_clustering_metrics.py b/examples/cluster/plot_agglomerative_clustering_metrics.py index c565a5859d093..dbf929d9576e1 100644 --- a/examples/cluster/plot_agglomerative_clustering_metrics.py +++ b/examples/cluster/plot_agglomerative_clustering_metrics.py @@ -18,7 +18,7 @@ We add observation noise to these waveforms. We generate very sparse noise: only 6% of the time points contain noise. As a result, the -l1 norm of this noise (ie "cityblock" distance) is much smaller than it's +l1 norm of this noise (ie "cityblock" distance) is much smaller than its l2 norm ("euclidean" distance). This can be seen on the inter-class distance matrices: the values on the diagonal, that characterize the spread of the class, are much bigger for the Euclidean distance than for diff --git a/examples/svm/plot_svm_kernels.py b/examples/svm/plot_svm_kernels.py index df29d198abcbc..d01f049dbe0b4 100644 --- a/examples/svm/plot_svm_kernels.py +++ b/examples/svm/plot_svm_kernels.py @@ -255,7 +255,7 @@ def plot_training_data_with_decision_boundary( # that may not generalize well to unseen data. From this example it becomes # obvious, that the sigmoid kernel has very specific use cases, when dealing # with data that exhibits a sigmoidal shape. In this example, careful fine -# tuning might find more generalizable decision boundaries. Because of it's +# tuning might find more generalizable decision boundaries. Because of its # specificity, the sigmoid kernel is less commonly used in practice compared to # other kernels. # diff --git a/sklearn/_loss/_loss.pyx.tp b/sklearn/_loss/_loss.pyx.tp index 6054d4c9472ca..44d5acd530a7f 100644 --- a/sklearn/_loss/_loss.pyx.tp +++ b/sklearn/_loss/_loss.pyx.tp @@ -121,7 +121,7 @@ doc_HalfTweedieLoss = ( - y_true * exp((1-p) * raw_prediction) / (1-p) Notes: - - Poisson with p=1 and and Gamma with p=2 have different terms dropped such + - Poisson with p=1 and Gamma with p=2 have different terms dropped such that cHalfTweedieLoss is not continuous in p=power at p=1 and p=2. - While the Tweedie distribution only exists for p<=0 or p>=1, the range 0 Date: Wed, 21 May 2025 17:33:21 +0200 Subject: [PATCH 175/182] TST use global_random_seed in sklearn/decomposition/tests/test_incremental_pca.py (#31250) --- .../tests/test_incremental_pca.py | 32 +++++++++---------- 1 file changed, 16 insertions(+), 16 deletions(-) diff --git a/sklearn/decomposition/tests/test_incremental_pca.py b/sklearn/decomposition/tests/test_incremental_pca.py index 6bca13d0ad627..c4ea1c222901c 100644 --- a/sklearn/decomposition/tests/test_incremental_pca.py +++ b/sklearn/decomposition/tests/test_incremental_pca.py @@ -87,9 +87,9 @@ def test_incremental_pca_sparse(sparse_container): ipca.partial_fit(X_sparse) -def test_incremental_pca_check_projection(): +def test_incremental_pca_check_projection(global_random_seed): # Test that the projection of data is correct. - rng = np.random.RandomState(1999) + rng = np.random.RandomState(global_random_seed) n, p = 100, 3 X = rng.randn(n, p) * 0.1 X[:10] += np.array([3, 4, 5]) @@ -108,9 +108,9 @@ def test_incremental_pca_check_projection(): assert_almost_equal(np.abs(Yt[0][0]), 1.0, 1) -def test_incremental_pca_inverse(): +def test_incremental_pca_inverse(global_random_seed): # Test that the projection of data can be inverted. - rng = np.random.RandomState(1999) + rng = np.random.RandomState(global_random_seed) n, p = 50, 3 X = rng.randn(n, p) # spherical data X[:, 1] *= 0.00001 # make middle component relatively small @@ -217,9 +217,9 @@ def test_incremental_pca_num_features_change(): ipca.partial_fit(X2) -def test_incremental_pca_batch_signs(): +def test_incremental_pca_batch_signs(global_random_seed): # Test that components_ sign is stable over batch sizes. - rng = np.random.RandomState(1999) + rng = np.random.RandomState(global_random_seed) n_samples = 100 n_features = 3 X = rng.randn(n_samples, n_features) @@ -254,9 +254,9 @@ def test_incremental_pca_partial_fit_small_batch(): assert_allclose(pca.components_, pipca.components_, atol=1e-3) -def test_incremental_pca_batch_values(): +def test_incremental_pca_batch_values(global_random_seed): # Test that components_ values are stable over batch sizes. - rng = np.random.RandomState(1999) + rng = np.random.RandomState(global_random_seed) n_samples = 100 n_features = 3 X = rng.randn(n_samples, n_features) @@ -286,9 +286,9 @@ def test_incremental_pca_batch_rank(): assert_allclose_dense_sparse(components_i, components_j) -def test_incremental_pca_partial_fit(): +def test_incremental_pca_partial_fit(global_random_seed): # Test that fit and partial_fit get equivalent results. - rng = np.random.RandomState(1999) + rng = np.random.RandomState(global_random_seed) n, p = 50, 3 X = rng.randn(n, p) # spherical data X[:, 1] *= 0.00001 # make middle component relatively small @@ -316,9 +316,9 @@ def test_incremental_pca_against_pca_iris(): assert_almost_equal(np.abs(Y_pca), np.abs(Y_ipca), 1) -def test_incremental_pca_against_pca_random_data(): +def test_incremental_pca_against_pca_random_data(global_random_seed): # Test that IncrementalPCA and PCA are approximate (to a sign flip). - rng = np.random.RandomState(1999) + rng = np.random.RandomState(global_random_seed) n_samples = 100 n_features = 3 X = rng.randn(n_samples, n_features) + 5 * rng.rand(1, n_features) @@ -348,10 +348,10 @@ def test_explained_variances(): assert_almost_equal(pca.noise_variance_, ipca.noise_variance_, decimal=prec) -def test_singular_values(): +def test_singular_values(global_random_seed): # Check that the IncrementalPCA output has the correct singular values - rng = np.random.RandomState(0) + rng = np.random.RandomState(global_random_seed) n_samples = 1000 n_features = 100 @@ -360,7 +360,7 @@ def test_singular_values(): ) pca = PCA(n_components=10, svd_solver="full", random_state=rng).fit(X) - ipca = IncrementalPCA(n_components=10, batch_size=100).fit(X) + ipca = IncrementalPCA(n_components=10, batch_size=150).fit(X) assert_array_almost_equal(pca.singular_values_, ipca.singular_values_, 2) # Compare to the Frobenius norm @@ -382,7 +382,7 @@ def test_singular_values(): ) # Set the singular values and see what we get back - rng = np.random.RandomState(0) + rng = np.random.RandomState(global_random_seed) n_samples = 100 n_features = 110 From c66d595bb3f7fae0cd153691dc657f96b5720106 Mon Sep 17 00:00:00 2001 From: Christian Lorentzen Date: Thu, 22 May 2025 10:15:47 +0200 Subject: [PATCH 176/182] MNT cleaner Cython coordinate descent in _cd_fast.pyx (#31372) --- sklearn/linear_model/_cd_fast.pyx | 144 ++++++++++++++++-------------- 1 file changed, 76 insertions(+), 68 deletions(-) diff --git a/sklearn/linear_model/_cd_fast.pyx b/sklearn/linear_model/_cd_fast.pyx index c4c530d907e26..6f17622bc4789 100644 --- a/sklearn/linear_model/_cd_fast.pyx +++ b/sklearn/linear_model/_cd_fast.pyx @@ -83,6 +83,21 @@ cdef floating diff_abs_max(int n, const floating* a, floating* b) noexcept nogil return m +message_conv = ( + "Objective did not converge. You might want to increase " + "the number of iterations, check the scale of the " + "features or consider increasing regularisation." +) + + +message_ridge = ( + "Linear regression models with a zero l1 penalization " + "strength are more efficiently fitted using one of the " + "solvers implemented in " + "sklearn.linear_model.Ridge/RidgeCV instead." +) + + def enet_coordinate_descent( floating[::1] w, floating alpha, @@ -141,7 +156,7 @@ def enet_coordinate_descent( cdef floating R_norm2 cdef floating w_norm2 cdef floating l1_norm - cdef floating const + cdef floating const_ cdef floating A_norm2 cdef unsigned int ii cdef unsigned int n_iter = 0 @@ -227,19 +242,18 @@ def enet_coordinate_descent( w_norm2 = _dot(n_features, &w[0], 1, &w[0], 1) if (dual_norm_XtA > alpha): - const = alpha / dual_norm_XtA - A_norm2 = R_norm2 * (const ** 2) + const_ = alpha / dual_norm_XtA + A_norm2 = R_norm2 * (const_ ** 2) gap = 0.5 * (R_norm2 + A_norm2) else: - const = 1.0 + const_ = 1.0 gap = R_norm2 l1_norm = _asum(n_features, &w[0], 1) - # np.dot(R.T, y) gap += (alpha * l1_norm - - const * _dot(n_samples, &R[0], 1, &y[0], 1) - + 0.5 * beta * (1 + const ** 2) * (w_norm2)) + - const_ * _dot(n_samples, &R[0], 1, &y[0], 1) # np.dot(R.T, y) + + 0.5 * beta * (1 + const_ ** 2) * (w_norm2)) if gap < tol: # return if we reached desired tolerance @@ -249,18 +263,11 @@ def enet_coordinate_descent( # for/else, runs if for doesn't end with a `break` with gil: message = ( - "Objective did not converge. You might want to increase " - "the number of iterations, check the scale of the " - "features or consider increasing regularisation. " - f"Duality gap: {gap:.3e}, tolerance: {tol:.3e}" + message_conv + + f" Duality gap: {gap:.3e}, tolerance: {tol:.3e}" ) if alpha < np.finfo(np.float64).eps: - message += ( - " Linear regression models with null weight for the " - "l1 regularization term are more efficiently fitted " - "using one of the solvers implemented in " - "sklearn.linear_model.Ridge/RidgeCV instead." - ) + message += "\n" + message_ridge warnings.warn(message, ConvergenceWarning) return np.asarray(w), gap, tol, n_iter + 1 @@ -313,53 +320,50 @@ def sparse_enet_coordinate_descent( # that every calculation results as if we had rescaled y and X (and therefore also # X_mean) by sqrt(sample_weight) without actually calculating the square root. # We work with: - # yw = sample_weight + # yw = sample_weight * y # R = sample_weight * residual # norm_cols_X = np.sum(sample_weight * (X - X_mean)**2, axis=0) + if floating is float: + dtype = np.float32 + else: + dtype = np.float64 + # get the data information into easy vars cdef unsigned int n_samples = y.shape[0] cdef unsigned int n_features = w.shape[0] # compute norms of the columns of X - cdef unsigned int ii - cdef floating[:] norm_cols_X - - cdef unsigned int startptr = X_indptr[0] - cdef unsigned int endptr + cdef floating[:] norm_cols_X = np.zeros(n_features, dtype=dtype) # initial value of the residuals # R = y - Zw, weighted version R = sample_weight * (y - Zw) cdef floating[::1] R - cdef floating[::1] XtA + cdef floating[::1] XtA = np.empty(n_features, dtype=dtype) cdef const floating[::1] yw - if floating is float: - dtype = np.float32 - else: - dtype = np.float64 - - norm_cols_X = np.zeros(n_features, dtype=dtype) - XtA = np.zeros(n_features, dtype=dtype) - cdef floating tmp cdef floating w_ii cdef floating d_w_max cdef floating w_max cdef floating d_w_ii + cdef floating gap = tol + 1.0 + cdef floating d_w_tol = tol + cdef floating dual_norm_XtA cdef floating X_mean_ii cdef floating R_sum = 0.0 cdef floating R_norm2 cdef floating w_norm2 - cdef floating A_norm2 cdef floating l1_norm + cdef floating const_ + cdef floating A_norm2 cdef floating normalize_sum - cdef floating gap = tol + 1.0 - cdef floating d_w_tol = tol - cdef floating dual_norm_XtA + cdef unsigned int ii cdef unsigned int jj cdef unsigned int n_iter = 0 cdef unsigned int f_iter + cdef unsigned int startptr = X_indptr[0] + cdef unsigned int endptr cdef uint32_t rand_r_state_seed = rng.randint(0, RAND_R_MAX) cdef uint32_t* rand_r_state = &rand_r_state_seed cdef bint center = False @@ -380,6 +384,7 @@ def sparse_enet_coordinate_descent( center = True break + # R = y - np.dot(X, w) for ii in range(n_features): X_mean_ii = X_mean[ii] endptr = X_indptr[ii + 1] @@ -396,6 +401,7 @@ def sparse_enet_coordinate_descent( for jj in range(n_samples): R[jj] += X_mean_ii * w_ii else: + # R = sw * (y - np.dot(X, w)) for jj in range(startptr, endptr): tmp = sample_weight[X_indices[jj]] # second term will be subtracted by loop over range(n_samples) @@ -526,21 +532,18 @@ def sparse_enet_coordinate_descent( # w_norm2 = np.dot(w, w) w_norm2 = _dot(n_features, &w[0], 1, &w[0], 1) if (dual_norm_XtA > alpha): - const = alpha / dual_norm_XtA - A_norm2 = R_norm2 * const**2 + const_ = alpha / dual_norm_XtA + A_norm2 = R_norm2 * const_**2 gap = 0.5 * (R_norm2 + A_norm2) else: - const = 1.0 + const_ = 1.0 gap = R_norm2 l1_norm = _asum(n_features, &w[0], 1) - gap += (alpha * l1_norm - const * _dot( - n_samples, - &R[0], 1, - &y[0], 1 - ) - + 0.5 * beta * (1 + const ** 2) * w_norm2) + gap += (alpha * l1_norm + - const_ * _dot(n_samples, &R[0], 1, &y[0], 1) # np.dot(R.T, y) + + 0.5 * beta * (1 + const_ ** 2) * w_norm2) if gap < tol: # return if we reached desired tolerance @@ -549,10 +552,13 @@ def sparse_enet_coordinate_descent( else: # for/else, runs if for doesn't end with a `break` with gil: - warnings.warn("Objective did not converge. You might want to " - "increase the number of iterations. Duality " - "gap: {}, tolerance: {}".format(gap, tol), - ConvergenceWarning) + message = ( + message_conv + + f" Duality gap: {gap:.3e}, tolerance: {tol:.3e}" + ) + if alpha < np.finfo(np.float64).eps: + message += "\n" + message_ridge + warnings.warn(message, ConvergenceWarning) return np.asarray(w), gap, tol, n_iter + 1 @@ -702,19 +708,19 @@ def enet_coordinate_descent_gram( w_norm2 = _dot(n_features, &w[0], 1, &w[0], 1) if (dual_norm_XtA > alpha): - const = alpha / dual_norm_XtA - A_norm2 = R_norm2 * (const ** 2) + const_ = alpha / dual_norm_XtA + A_norm2 = R_norm2 * (const_ ** 2) gap = 0.5 * (R_norm2 + A_norm2) else: - const = 1.0 + const_ = 1.0 gap = R_norm2 # The call to asum is equivalent to the L1 norm of w gap += ( alpha * _asum(n_features, &w[0], 1) - - const * y_norm2 - + const * q_dot_w - + 0.5 * beta * (1 + const ** 2) * w_norm2 + - const_ * y_norm2 + + const_ * q_dot_w + + 0.5 * beta * (1 + const_ ** 2) * w_norm2 ) if gap < tol: @@ -724,10 +730,11 @@ def enet_coordinate_descent_gram( else: # for/else, runs if for doesn't end with a `break` with gil: - warnings.warn("Objective did not converge. You might want to " - "increase the number of iterations. Duality " - "gap: {}, tolerance: {}".format(gap, tol), - ConvergenceWarning) + message = ( + message_conv + + f" Duality gap: {gap:.3e}, tolerance: {tol:.3e}" + ) + warnings.warn(message, ConvergenceWarning) return np.asarray(w), gap, tol, n_iter + 1 @@ -921,11 +928,11 @@ def enet_coordinate_descent_multi_task( R_norm = _nrm2(n_samples * n_tasks, &R[0, 0], 1) w_norm = _nrm2(n_features * n_tasks, &W[0, 0], 1) if (dual_norm_XtA > l1_reg): - const = l1_reg / dual_norm_XtA - A_norm = R_norm * const + const_ = l1_reg / dual_norm_XtA + A_norm = R_norm * const_ gap = 0.5 * (R_norm ** 2 + A_norm ** 2) else: - const = 1.0 + const_ = 1.0 gap = R_norm ** 2 # ry_sum = np.sum(R * y) @@ -938,8 +945,8 @@ def enet_coordinate_descent_multi_task( gap += ( l1_reg * l21_norm - - const * ry_sum - + 0.5 * l2_reg * (1 + const ** 2) * (w_norm ** 2) + - const_ * ry_sum + + 0.5 * l2_reg * (1 + const_ ** 2) * (w_norm ** 2) ) if gap <= tol: @@ -948,9 +955,10 @@ def enet_coordinate_descent_multi_task( else: # for/else, runs if for doesn't end with a `break` with gil: - warnings.warn("Objective did not converge. You might want to " - "increase the number of iterations. Duality " - "gap: {}, tolerance: {}".format(gap, tol), - ConvergenceWarning) + message = ( + message_conv + + f" Duality gap: {gap:.3e}, tolerance: {tol:.3e}" + ) + warnings.warn(message, ConvergenceWarning) return np.asarray(W), gap, tol, n_iter + 1 From cebf45f63fb5b034a4b6bb90468a3a34af865fc4 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Lo=C3=AFc=20Est=C3=A8ve?= Date: Thu, 22 May 2025 10:51:43 +0200 Subject: [PATCH 177/182] CI Avoid joblib 1.5.0 in Pyodide (#31402) --- .github/workflows/emscripten.yml | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/.github/workflows/emscripten.yml b/.github/workflows/emscripten.yml index 47e54f6125638..6ed68496de8b2 100644 --- a/.github/workflows/emscripten.yml +++ b/.github/workflows/emscripten.yml @@ -72,7 +72,9 @@ jobs: CIBW_PLATFORM: pyodide SKLEARN_SKIP_OPENMP_TEST: "true" SKLEARN_SKIP_NETWORK_TESTS: 1 - CIBW_TEST_REQUIRES: "pytest pandas" + # Temporary work-around to avoid joblib 1.5.0 until there is a joblib + # release with https://github.com/joblib/joblib/pull/1721 + CIBW_TEST_REQUIRES: "pytest pandas joblib!=1.5.0" # -s pytest argument is needed to avoid an issue in pytest output capturing with Pyodide CIBW_TEST_COMMAND: "python -m pytest -svra --pyargs sklearn --durations 20 --showlocals" From 67c72f94cf0b04700dfa67712bf75bb4fc00b805 Mon Sep 17 00:00:00 2001 From: Radovenchyk Date: Thu, 22 May 2025 13:54:59 +0300 Subject: [PATCH 178/182] DOC Fix wheel builder badge on README (#31409) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Co-authored-by: Loïc Estève --- README.rst | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.rst b/README.rst index 4f4741a090dee..e48c192fac043 100644 --- a/README.rst +++ b/README.rst @@ -11,7 +11,7 @@ .. |Codecov| image:: https://codecov.io/gh/scikit-learn/scikit-learn/branch/main/graph/badge.svg?token=Pk8G9gg3y9 :target: https://codecov.io/gh/scikit-learn/scikit-learn -.. |Nightly wheels| image:: https://github.com/scikit-learn/scikit-learn/workflows/Wheel%20builder/badge.svg?event=schedule +.. |Nightly wheels| image:: https://github.com/scikit-learn/scikit-learn/actions/workflows/wheels.yml/badge.svg?event=schedule :target: https://github.com/scikit-learn/scikit-learn/actions?query=workflow%3A%22Wheel+builder%22+event%3Aschedule .. |Ruff| image:: https://img.shields.io/badge/code%20style-ruff-000000.svg From a2ceff37177121368c3c773de816835228ad7875 Mon Sep 17 00:00:00 2001 From: Lucy Liu Date: Fri, 23 May 2025 18:57:23 +1000 Subject: [PATCH 179/182] DOC Minor updates to `OPTICS` docstring (#31363) --- sklearn/cluster/_optics.py | 29 +++++++++++++++-------------- 1 file changed, 15 insertions(+), 14 deletions(-) diff --git a/sklearn/cluster/_optics.py b/sklearn/cluster/_optics.py index 0cd32023de46c..4a1a80c9065c2 100644 --- a/sklearn/cluster/_optics.py +++ b/sklearn/cluster/_optics.py @@ -34,19 +34,21 @@ class OPTICS(ClusterMixin, BaseEstimator): """Estimate clustering structure from vector array. OPTICS (Ordering Points To Identify the Clustering Structure), closely - related to DBSCAN, finds core sample of high density and expands clusters - from them [1]_. Unlike DBSCAN, keeps cluster hierarchy for a variable + related to DBSCAN, finds core samples of high density and expands clusters + from them [1]_. Unlike DBSCAN, it keeps cluster hierarchy for a variable neighborhood radius. Better suited for usage on large datasets than the - current sklearn implementation of DBSCAN. + current scikit-learn implementation of DBSCAN. - Clusters are then extracted using a DBSCAN-like method - (cluster_method = 'dbscan') or an automatic + Clusters are then extracted from the cluster-order using a + DBSCAN-like method (cluster_method = 'dbscan') or an automatic technique proposed in [1]_ (cluster_method = 'xi'). This implementation deviates from the original OPTICS by first performing - k-nearest-neighborhood searches on all points to identify core sizes, then - computing only the distances to unprocessed points when constructing the - cluster order. Note that we do not employ a heap to manage the expansion + k-nearest-neighborhood searches on all points to identify core sizes of + all points (instead of computing neighbors while looping through points). + Reachability distances to only unprocessed points are then computed, to + construct the cluster order, similar to the original OPTICS. + Note that we do not employ a heap to manage the expansion candidates, so the time complexity will be O(n^2). Read more in the :ref:`User Guide `. @@ -68,9 +70,9 @@ class OPTICS(ClusterMixin, BaseEstimator): metric : str or callable, default='minkowski' Metric to use for distance computation. Any metric from scikit-learn - or scipy.spatial.distance can be used. + or :mod:`scipy.spatial.distance` can be used. - If metric is a callable function, it is called on each + If `metric` is a callable function, it is called on each pair of instances (rows) and the resulting value recorded. The callable should take two arrays as input and return one value indicating the distance between them. This works for Scipy's metrics, but is less @@ -90,8 +92,7 @@ class OPTICS(ClusterMixin, BaseEstimator): 'yule'] Sparse matrices are only supported by scikit-learn metrics. - See the documentation for scipy.spatial.distance for details on these - metrics. + See :mod:`scipy.spatial.distance` for details on these metrics. .. note:: `'kulsinski'` is deprecated from SciPy 1.9 and will be removed in SciPy 1.11. @@ -105,9 +106,9 @@ class OPTICS(ClusterMixin, BaseEstimator): metric_params : dict, default=None Additional keyword arguments for the metric function. - cluster_method : str, default='xi' + cluster_method : {'xi', 'dbscan'}, default='xi' The extraction method used to extract clusters using the calculated - reachability and ordering. Possible values are "xi" and "dbscan". + reachability and ordering. eps : float, default=None The maximum distance between two samples for one to be considered as From c219a6b3c1a70c92e302b2485a62323aa04b8bb7 Mon Sep 17 00:00:00 2001 From: Christian Lorentzen Date: Fri, 23 May 2025 20:01:41 +0200 Subject: [PATCH 180/182] DOC fixes for LogisticRegression newton-cholesky and multiclass (#31410) Co-authored-by: Olivier Grisel --- doc/modules/linear_model.rst | 22 ++++++++++++---------- sklearn/linear_model/_logistic.py | 20 +++++++++++--------- 2 files changed, 23 insertions(+), 19 deletions(-) diff --git a/doc/modules/linear_model.rst b/doc/modules/linear_model.rst index 007afdc592c29..b575e4597b6fa 100644 --- a/doc/modules/linear_model.rst +++ b/doc/modules/linear_model.rst @@ -1022,7 +1022,7 @@ The following table summarizes the penalties and multinomial multiclass supporte +------------------------------+-------------+-----------------+-----------------+-----------------------+-----------+------------+ | **Penalties** | **'lbfgs'** | **'liblinear'** | **'newton-cg'** | **'newton-cholesky'** | **'sag'** | **'saga'** | +------------------------------+-------------+-----------------+-----------------+-----------------------+-----------+------------+ -| L2 penalty | yes | no | yes | no | yes | yes | +| L2 penalty | yes | yes | yes | yes | yes | yes | +------------------------------+-------------+-----------------+-----------------+-----------------------+-----------+------------+ | L1 penalty | no | yes | no | no | no | yes | +------------------------------+-------------+-----------------+-----------------+-----------------------+-----------+------------+ @@ -1032,7 +1032,7 @@ The following table summarizes the penalties and multinomial multiclass supporte +------------------------------+-------------+-----------------+-----------------+-----------------------+-----------+------------+ | **Multiclass support** | | +------------------------------+-------------+-----------------+-----------------+-----------------------+-----------+------------+ -| multinomial multiclass | yes | no | yes | no | yes | yes | +| multinomial multiclass | yes | no | yes | yes | yes | yes | +------------------------------+-------------+-----------------+-----------------+-----------------------+-----------+------------+ | **Behaviors** | | +------------------------------+-------------+-----------------+-----------------+-----------------------+-----------+------------+ @@ -1043,8 +1043,11 @@ The following table summarizes the penalties and multinomial multiclass supporte | Robust to unscaled datasets | yes | yes | yes | yes | no | no | +------------------------------+-------------+-----------------+-----------------+-----------------------+-----------+------------+ -The "lbfgs" solver is used by default for its robustness. For large datasets -the "saga" solver is usually faster. +The "lbfgs" solver is used by default for its robustness. For +`n_samples >> n_features`, "newton-cholesky" is a good choice and can reach high +precision (tiny `tol` values). For large datasets +the "saga" solver is usually faster (than "lbfgs"), in particular for low precision +(high `tol`). For large dataset, you may also consider using :class:`SGDClassifier` with `loss="log_loss"`, which might be even faster but requires more tuning. @@ -1101,13 +1104,12 @@ zero, is likely to be an underfit, bad model and you are advised to set scaled datasets and on datasets with one-hot encoded categorical features with rare categories. - * The "newton-cholesky" solver is an exact Newton solver that calculates the hessian + * The "newton-cholesky" solver is an exact Newton solver that calculates the Hessian matrix and solves the resulting linear system. It is a very good choice for - `n_samples` >> `n_features`, but has a few shortcomings: Only :math:`\ell_2` - regularization is supported. Furthermore, because the hessian matrix is explicitly - computed, the memory usage has a quadratic dependency on `n_features` as well as on - `n_classes`. As a consequence, only the one-vs-rest scheme is implemented for the - multiclass case. + `n_samples` >> `n_features` and can reach high precision (tiny values of `tol`), + but has a few shortcomings: Only :math:`\ell_2` regularization is supported. + Furthermore, because the Hessian matrix is explicitly computed, the memory usage + has a quadratic dependency on `n_features` as well as on `n_classes`. For a comparison of some of these solvers, see [9]_. diff --git a/sklearn/linear_model/_logistic.py b/sklearn/linear_model/_logistic.py index 89a17b7fffe0d..f0c97268c612d 100644 --- a/sklearn/linear_model/_logistic.py +++ b/sklearn/linear_model/_logistic.py @@ -337,7 +337,7 @@ def _logistic_regression_path( else: if solver in ["sag", "saga", "lbfgs", "newton-cg", "newton-cholesky"]: - # SAG, lbfgs, newton-cg and newton-cg multinomial solvers need + # SAG, lbfgs, newton-cg and newton-cholesky multinomial solvers need # LabelEncoder, not LabelBinarizer, i.e. y as a 1d-array of integers. # LabelEncoder also saves memory compared to LabelBinarizer, especially # when n_classes is large. @@ -837,9 +837,9 @@ class LogisticRegression(LinearClassifierMixin, SparseCoefMixin, BaseEstimator): the L2 penalty. The Elastic-Net regularization is only supported by the 'saga' solver. - For :term:`multiclass` problems, only 'newton-cg', 'sag', 'saga' and 'lbfgs' - handle multinomial loss. 'liblinear' and 'newton-cholesky' only handle binary - classification but can be extended to handle multiclass by using + For :term:`multiclass` problems, all solvers but 'liblinear' optimize the + (penalized) multinomial loss. 'liblinear' only handle binary classification but can + be extended to handle multiclass by using :class:`~sklearn.multiclass.OneVsRestClassifier`. Read more in the :ref:`User Guide `. @@ -957,13 +957,14 @@ class LogisticRegression(LinearClassifierMixin, SparseCoefMixin, BaseEstimator): summarizing solver/penalty supports. .. versionadded:: 0.17 - Stochastic Average Gradient descent solver. + Stochastic Average Gradient (SAG) descent solver. Multinomial support in + version 0.18. .. versionadded:: 0.19 SAGA solver. .. versionchanged:: 0.22 - The default solver changed from 'liblinear' to 'lbfgs' in 0.22. + The default solver changed from 'liblinear' to 'lbfgs' in 0.22. .. versionadded:: 1.2 - newton-cholesky solver. + newton-cholesky solver. Multinomial support in version 1.6. max_iter : int, default=100 Maximum number of iterations taken for the solvers to converge. @@ -1597,11 +1598,12 @@ class LogisticRegressionCV(LogisticRegression, LinearClassifierMixin, BaseEstima a scaler from :mod:`sklearn.preprocessing`. .. versionadded:: 0.17 - Stochastic Average Gradient descent solver. + Stochastic Average Gradient (SAG) descent solver. Multinomial support in + version 0.18. .. versionadded:: 0.19 SAGA solver. .. versionadded:: 1.2 - newton-cholesky solver. + newton-cholesky solver. Multinomial support in version 1.6. tol : float, default=1e-4 Tolerance for stopping criteria. From 9e7da70e7af691a0f6f4fc4fbdfbe0b5e59b205f Mon Sep 17 00:00:00 2001 From: "Christine P. Chai" Date: Sat, 24 May 2025 08:42:25 -0700 Subject: [PATCH 181/182] DOC Revise a math equation to incorporate text (#31421) --- doc/modules/model_evaluation.rst | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/doc/modules/model_evaluation.rst b/doc/modules/model_evaluation.rst index cf168295a6024..c304966fccdb2 100644 --- a/doc/modules/model_evaluation.rst +++ b/doc/modules/model_evaluation.rst @@ -1880,7 +1880,7 @@ In multilabel classification, the :func:`zero_one_loss` scores a subset as one if its labels strictly match the predictions, and as a zero if there are any errors. By default, the function returns the percentage of imperfectly predicted subsets. To get the count of such subsets instead, set -``normalize`` to ``False`` +``normalize`` to ``False``. If :math:`\hat{y}_i` is the predicted value of the :math:`i`-th sample and :math:`y_i` is the corresponding true value, @@ -1891,8 +1891,8 @@ then the 0-1 loss :math:`L_{0-1}` is defined as: L_{0-1}(y, \hat{y}) = \frac{1}{n_\text{samples}} \sum_{i=0}^{n_\text{samples}-1} 1(\hat{y}_i \not= y_i) where :math:`1(x)` is the `indicator function -`_. The zero one -loss can also be computed as :math:`zero-one loss = 1 - accuracy`. +`_. The zero-one +loss can also be computed as :math:`\text{zero-one loss} = 1 - \text{accuracy}`. >>> from sklearn.metrics import zero_one_loss From 27baebc95a15ca33e90c78f58c870553d29bf21c Mon Sep 17 00:00:00 2001 From: Adrien Linares <76013394+adlina1@users.noreply.github.com> Date: Mon, 26 May 2025 04:09:57 +0200 Subject: [PATCH 182/182] DOC Update documentation: Communication section improvements (#31420) --- README.rst | 44 +++++++++++++++++++++++++++++--------------- 1 file changed, 29 insertions(+), 15 deletions(-) diff --git a/README.rst b/README.rst index e48c192fac043..5885bce67baa7 100644 --- a/README.rst +++ b/README.rst @@ -176,22 +176,36 @@ Documentation Communication ~~~~~~~~~~~~~ -- Mailing list: https://mail.python.org/mailman/listinfo/scikit-learn -- Logos & Branding: https://github.com/scikit-learn/scikit-learn/tree/main/doc/logos -- Blog: https://blog.scikit-learn.org -- Calendar: https://blog.scikit-learn.org/calendar/ -- Stack Overflow: https://stackoverflow.com/questions/tagged/scikit-learn -- GitHub Discussions: https://github.com/scikit-learn/scikit-learn/discussions -- Website: https://scikit-learn.org -- LinkedIn: https://www.linkedin.com/company/scikit-learn -- Bluesky: https://bsky.app/profile/scikit-learn.org -- Mastodon: https://mastodon.social/@sklearn@fosstodon.org -- YouTube: https://www.youtube.com/channel/UCJosFjYm0ZYVUARxuOZqnnw/playlists -- Facebook: https://www.facebook.com/scikitlearnofficial/ -- Instagram: https://www.instagram.com/scikitlearnofficial/ -- TikTok: https://www.tiktok.com/@scikit.learn -- Discord: https://discord.gg/h9qyrK8Jc8 +Main Channels +^^^^^^^^^^^^^ +- **Website**: https://scikit-learn.org +- **Blog**: https://blog.scikit-learn.org +- **Mailing list**: https://mail.python.org/mailman/listinfo/scikit-learn + +Developer & Support +^^^^^^^^^^^^^^^^^^^^^^ + +- **GitHub Discussions**: https://github.com/scikit-learn/scikit-learn/discussions +- **Stack Overflow**: https://stackoverflow.com/questions/tagged/scikit-learn +- **Discord**: https://discord.gg/h9qyrK8Jc8 + +Social Media Platforms +^^^^^^^^^^^^^^^^^^^^^^ + +- **LinkedIn**: https://www.linkedin.com/company/scikit-learn +- **YouTube**: https://www.youtube.com/channel/UCJosFjYm0ZYVUARxuOZqnnw/playlists +- **Facebook**: https://www.facebook.com/scikitlearnofficial/ +- **Instagram**: https://www.instagram.com/scikitlearnofficial/ +- **TikTok**: https://www.tiktok.com/@scikit.learn +- **Bluesky**: https://bsky.app/profile/scikit-learn.org +- **Mastodon**: https://mastodon.social/@sklearn@fosstodon.org + +Resources +^^^^^^^^^ + +- **Calendar**: https://blog.scikit-learn.org/calendar/ +- **Logos & Branding**: https://github.com/scikit-learn/scikit-learn/tree/main/doc/logos Citation ~~~~~~~~