[project]
name = "scikit-learn"
version = "1.5.1"
description = "A set of python modules for machine learning and data mining"
readme = "README.rst"
maintainers = [
    {name = "scikit-learn developers", email="scikit-learn@python.org"},
]
dependencies = [
  "numpy>=1.19.5",
  "scipy>=1.6.0",
  "joblib>=1.2.0",
  "threadpoolctl>=3.1.0",
]
requires-python = ">=3.9"
license = {text = "new BSD"}
classifiers=[
  "Intended Audience :: Science/Research",
  "Intended Audience :: Developers",
  "License :: OSI Approved :: BSD License",
  "Programming Language :: C",
  "Programming Language :: Python",
  "Topic :: Software Development",
  "Topic :: Scientific/Engineering",
  "Development Status :: 5 - Production/Stable",
  "Operating System :: Microsoft :: Windows",
  "Operating System :: POSIX",
  "Operating System :: Unix",
  "Operating System :: MacOS",
  "Programming Language :: Python :: 3",
  "Programming Language :: Python :: 3.9",
  "Programming Language :: Python :: 3.10",
  "Programming Language :: Python :: 3.11",
  "Programming Language :: Python :: 3.12",
  "Programming Language :: Python :: Implementation :: CPython",
  "Programming Language :: Python :: Implementation :: PyPy",
]

[project.urls]
homepage = "https://scikit-learn.org"
source = "https://github.com/scikit-learn/scikit-learn"
download = "https://pypi.org/project/scikit-learn/#files"
tracker = "https://github.com/scikit-learn/scikit-learn/issues"
"release notes" = "https://scikit-learn.org/stable/whats_new"

[project.optional-dependencies]
build = ["numpy>=1.19.5", "scipy>=1.6.0", "cython>=3.0.10", "meson-python>=0.16.0"]
install = ["numpy>=1.19.5", "scipy>=1.6.0", "joblib>=1.2.0", "threadpoolctl>=3.1.0"]
benchmark = ["matplotlib>=3.3.4", "pandas>=1.1.5", "memory_profiler>=0.57.0"]
docs = [
    "matplotlib>=3.3.4",
    "scikit-image>=0.17.2",
    "pandas>=1.1.5",
    "seaborn>=0.9.0",
    "memory_profiler>=0.57.0",
    "sphinx>=7.3.7",
    "sphinx-copybutton>=0.5.2",
    "sphinx-gallery>=0.16.0",
    "numpydoc>=1.2.0",
    "Pillow>=7.1.2",
    "pooch>=1.6.0",
    "sphinx-prompt>=1.4.0",
    "sphinxext-opengraph>=0.9.1",
    "plotly>=5.14.0",
    "polars>=0.20.23",
    "sphinx-design>=0.5.0",
    "sphinxcontrib-sass>=0.3.4",
    "pydata-sphinx-theme>=0.15.3",
    "sphinx-remove-toctrees>=1.0.0.post1",
]
examples = [
    "matplotlib>=3.3.4",
    "scikit-image>=0.17.2",
    "pandas>=1.1.5",
    "seaborn>=0.9.0",
    "pooch>=1.6.0",
    "plotly>=5.14.0",
]
tests = [
    "matplotlib>=3.3.4",
    "scikit-image>=0.17.2",
    "pandas>=1.1.5",
    "pytest>=7.1.2",
    "pytest-cov>=2.9.0",
    "ruff>=0.2.1",
    "black>=24.3.0",
    "mypy>=1.9",
    "pyamg>=4.0.0",
    "polars>=0.20.23",
    "pyarrow>=12.0.0",
    "numpydoc>=1.2.0",
    "pooch>=1.6.0",
]
maintenance = ["conda-lock==2.5.6"]

[build-system]
build-backend = "mesonpy"
# Minimum requirements for the build system to execute.
requires = [
    "meson-python>=0.16.0",
    "Cython>=3.0.10",
    "numpy>=2.0.0rc2",
    "scipy>=1.6.0",
]

[tool.black]
line-length = 88
target-version = ['py39', '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
target-version = "py38"
exclude=[
    ".git",
    "__pycache__",
    "dist",
    "sklearn/externals",
    "doc/_build",
    "doc/auto_examples",
    "build",
    "asv_benchmarks/env",
    "asv_benchmarks/html",
    "asv_benchmarks/results",
    "asv_benchmarks/benchmarks/cache",
]

[tool.ruff.lint]
# all rules can be found here: https://beta.ruff.rs/docs/rules/
select = ["E", "F", "W", "I"]
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'
    "E741",
]

[tool.ruff.lint.per-file-ignores]
# It's fine not to put the import at the top of the file in the examples
# folder.
"examples/*"=["E402"]
"doc/conf.py"=["E402"]


[tool.cython-lint]
# Ignore the same error codes as ruff
# + E501 (line too long) because keeping it < 88 in cython
# often makes code less readable.
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
    'E731',
    # do not use variables named 'l', 'O', or 'I'
    'E741',
    # line break before binary operator
    'W503',
    # line break after binary operator
    'W504',
]
# Exclude files are generated from tempita templates
exclude= '''
(
    asv_benchmarks/
  | sklearn/_loss/_loss.pyx
  | sklearn/linear_model/_sag_fast.pyx
  | sklearn/linear_model/_sgd_fast.pyx
  | sklearn/utils/_seq_dataset.pyx
  | sklearn/utils/_seq_dataset.pxd
  | sklearn/utils/_weight_vector.pyx
  | sklearn/utils/_weight_vector.pxd
  | sklearn/metrics/_dist_metrics.pyx
  | sklearn/metrics/_dist_metrics.pxd
  | sklearn/metrics/_pairwise_distances_reduction/_argkmin.pxd
  | sklearn/metrics/_pairwise_distances_reduction/_argkmin.pyx
  | sklearn/metrics/_pairwise_distances_reduction/_argkmin_classmode.pyx
  | sklearn/metrics/_pairwise_distances_reduction/_base.pxd
  | sklearn/metrics/_pairwise_distances_reduction/_base.pyx
  | sklearn/metrics/_pairwise_distances_reduction/_datasets_pair.pxd
  | sklearn/metrics/_pairwise_distances_reduction/_datasets_pair.pyx
  | sklearn/metrics/_pairwise_distances_reduction/_middle_term_computer.pxd
  | sklearn/metrics/_pairwise_distances_reduction/_middle_term_computer.pyx
  | sklearn/metrics/_pairwise_distances_reduction/_radius_neighbors.pxd
  | sklearn/metrics/_pairwise_distances_reduction/_radius_neighbors.pyx
)
'''

[tool.check-sdist]
# These settings should match .gitattributes
sdist-only = []
git-only = [".*", "asv_benchmarks", "azure-pipelines.yml", "benchmarks", "build_tools", "maint_tools"]
default-ignore = false
