diff --git a/.github/workflows/checks.yaml b/.github/workflows/checks.yaml index 6d4971e..a1d2302 100644 --- a/.github/workflows/checks.yaml +++ b/.github/workflows/checks.yaml @@ -15,7 +15,7 @@ jobs: - uses: actions/checkout@v4 - name: Install uv uses: astral-sh/setup-uv@v6 - - name: Setup Just - uses: extractions/setup-just@v3 + with: + enable-cache: true - name: Run pre-commit - run: just pre-commit + run: uvx pre-commit run --all-files --verbose diff --git a/.github/workflows/docs.yaml b/.github/workflows/docs.yaml index 1988923..53a4da8 100644 --- a/.github/workflows/docs.yaml +++ b/.github/workflows/docs.yaml @@ -20,17 +20,16 @@ jobs: - uses: actions/checkout@v4 - name: Setup uv uses: astral-sh/setup-uv@v6 - - name: Setup Python - run: uv python install + with: + python-version: '3.14' + enable-cache: true - name: Setup just uses: extractions/setup-just@v3 - name: Setup Khiops run: | sudo apt-get update -y && sudo apt-get install wget lsb-release -y - CODENAME=$(lsb_release -cs) - TEMP_DEB="$(mktemp)" - wget -O "$TEMP_DEB" "https://github.com/KhiopsML/khiops/releases/download/11.0.0-b.0/khiops-core-openmpi_11.0.0-b.0-1-${CODENAME}.amd64.deb" - sudo dpkg -i "$TEMP_DEB" || sudo apt-get -f -y install + wget -O "./khiops.deb" "https://github.com/KhiopsML/khiops/releases/download/11.0.0/khiops-core-openmpi_11.0.0-1-$(lsb_release -cs).amd64.deb" + sudo dpkg -i "./khiops.deb" || sudo apt-get -f -y install - name: Build docs run: | mkdir docs/_static diff --git a/.github/workflows/package.yaml b/.github/workflows/package.yaml new file mode 100644 index 0000000..f1ceb1d --- /dev/null +++ b/.github/workflows/package.yaml @@ -0,0 +1,71 @@ +name: Package +on: + workflow_dispatch: + inputs: + pypi-target: + type: choice + default: no-op + options: [no-op, testpypi, pypi] + description: PyPI Target + pull_request: + +# Cancel any ongoing run of this workflow on the same PR or ref +concurrency: + group: ${{ github.workflow }}-${{ github.event.pull_request.number || github.ref }} + cancel-in-progress: true + +jobs: + build: + runs-on: ubuntu-latest + steps: + - name: Checkout sources + uses: actions/checkout@v4 + - name: Setup uv + uses: astral-sh/setup-uv@v6 + with: + python-version: '3.14' + enable-cache: true + - name: Build Package + run: | + uv build --sdist + - name: Upload package artifact + uses: actions/upload-artifact@v6 + with: + name: pip-package + path: dist/ + publish-pypi: + if: inputs.pypi-target == 'pypi' && github.ref_type == 'tag' && github.repository_owner == 'KhiopsLab' + needs: [build] + runs-on: ubuntu-latest + environment: + name: pypi + url: https://pypi.org/p/khalib + permissions: + id-token: write + steps: + - name: Download package artifact + uses: actions/download-artifact@v6 + with: + name: pip-package + path: dist/ + - name: Publish to PyPI + uses: pypa/gh-action-pypi-publish@release/v1 + publish-testpypi: + if: inputs.pypi-target == 'testpypi' && github.ref_type == 'tag' && github.repository_owner == 'KhiopsLab' + needs: [build] + runs-on: ubuntu-latest + environment: + name: testpypi + url: https://test.pypi.org/p/khalib + permissions: + id-token: write + steps: + - name: Download package artifact + uses: actions/download-artifact@v6 + with: + name: pip-package + path: dist/ + - name: Publish to TestPyPI + uses: pypa/gh-action-pypi-publish@release/v1 + with: + repository-url: https://test.pypi.org/legacy/ diff --git a/.github/workflows/tests.yaml b/.github/workflows/tests.yaml index 8b0767d..eae7f76 100644 --- a/.github/workflows/tests.yaml +++ b/.github/workflows/tests.yaml @@ -4,6 +4,7 @@ on: pull_request: paths: - 'src/**' + - .github/workflows/tests.yaml # Cancel any ongoing run of this workflow on the same PR or ref concurrency: @@ -24,15 +25,17 @@ jobs: uses: astral-sh/setup-uv@v6 with: python-version: ${{ matrix.python-version }} - - name: Set up Python - run: uv python install + enable-cache: true + - name: Setup just + uses: extractions/setup-just@v3 - name: Install Miniforge uses: conda-incubator/setup-miniconda@v3 with: auto-update-conda: true miniforge-version: latest conda-remove-defaults: true - - name: Install khiops - run: conda install --quiet --yes --name test khiops-core=11.0.0b.0 + - name: Install Khiops + run: conda install --quiet --yes --name test khiops-core>=11.0.0 - name: Run tests - run: conda run --name test uv run pytest src/tests + # We run with `conda` so we find the khiops executables installed in the conda env + run: conda run --name test just test diff --git a/.pre-commit-config.yaml b/.pre-commit-config.yaml index 199c922..cca4b26 100644 --- a/.pre-commit-config.yaml +++ b/.pre-commit-config.yaml @@ -1,18 +1,18 @@ repos: - repo: https://github.com/astral-sh/ruff-pre-commit - rev: v0.12.4 + rev: v0.14.10 hooks: - id: ruff-check args: [ --fix ] - id: ruff-format - repo: https://github.com/mwouts/jupytext - rev: v1.17.3 + rev: v1.19.0.dev0 hooks: - id: jupytext args: [--update, --from, py:percent, --to, notebook] files: docs/quickstart.py - repo: https://github.com/rhysd/actionlint - rev: v1.7.8 + rev: v1.7.9 hooks: - id: actionlint name: actionlint diff --git a/CHANGELOG.md b/CHANGELOG.md index 467c46c..c178923 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,10 +1,17 @@ # Changelog +## [0.2] - 2025-12-26 + +### Changed +- Update Khiops dependency to version 11. + ## [0.1] - 2025-10-17 + ### Added - `KhalibClassifier` class - `calibration_error` function - `build_reliability_diagram` function -[Unreleased]: https://github.com/yourusername/yourproject/compare/0.1...HEAD -[1.0.0]: https://github.com/yourusername/yourproject/releases/tag/0.1 +[Unreleased]: https://github.com/yourusername/yourproject/compare/0.2...HEAD +[0.2]: https://github.com/yourusername/yourproject/compare/0.1...0.2 +[0.1]: https://github.com/yourusername/yourproject/releases/tag/0.1 diff --git a/README.md b/README.md index c059400..bfc7f2f 100644 --- a/README.md +++ b/README.md @@ -6,13 +6,16 @@ suite. ## Features - `KhalibClassifier`: A scikit-learn estimator to calibrate classifiers with a similar interface - fashion as [CalibratedClassifierCV][sk-calclf]. + as [CalibratedClassifierCV][sk-calclf]. - `calibration_error` : A function to estimate the Estimated Calibration Error (ECE). -- `build_reliability_diagram` : A function that builds a reliability diagram. +- `build_reliability_diagram` : A function to build a reliability diagram. These features are based on Khiops's non-parametric supervised histograms, so there is no need to specify the number and width of the bins, as they are automatically estimated from data. +[khiops-org]: https://khiops.org +[sk-calclf]: https://scikit-learn.org/stable/modules/generated/sklearn.calibration.CalibratedClassifierCV.html + See the [documentation][khalib-docs] for more information. @@ -20,14 +23,13 @@ See the [documentation][khalib-docs] for more information. ## Installation -*Note: We'll improve this installation procedure soon!* - -- Make sure you have installed [Khiops 11 Beta][khiops11-setup] -- Execute +- [Install Khiops][khiops-setup] +- Install the `khalib` python library: -```bash -pip install https://github.com/KhiopsLab/khalib/archive/refs/tags/0.1.zip +```sh +pip install khalib ``` +[khiops-setup]: https://khiops.org/setup/ @@ -37,8 +39,4 @@ pip install https://github.com/KhiopsLab/khalib/archive/refs/tags/0.1.zip See https://khiopslab.github.io/khalib/ -[khiops-org]: https://khiops.org -[khiops11-setup]: https://khiops.org/11.0.0-b.0/setup/ -[sk-calclf]: https://scikit-learn.org/stable/modules/generated/sklearn.calibration.CalibratedClassifierCV.html [khalib-docs]: https://khiopslab.github.io/khalib - diff --git a/docs/conf.py b/docs/conf.py index f44651a..7c3760c 100644 --- a/docs/conf.py +++ b/docs/conf.py @@ -1,7 +1,17 @@ +# This script must be executed in its directory +import importlib +import sys + +# Obtain the project's version +sys.path.append("../") +khalib_version = importlib.metadata.version("khalib") + +# Basic Information project = "khalib" author = "Felipe Olmos" -release = "0.1" +release = khalib_version +# Sphinx extensions extensions = [ "myst_nb", # activates myst_parser as well "numpydoc", @@ -11,13 +21,13 @@ "sphinx.ext.intersphinx", ] +# Basic Sphinx config +default_role = "obj" templates_path = ["_templates"] exclude_patterns = [] - html_theme = "furo" html_static_path = ["_static"] html_title = f"
{project} {release}
" -default_role = "obj" # Extensions configs diff --git a/docs/index.md b/docs/index.md index 4e6cd9c..7d9bb43 100644 --- a/docs/index.md +++ b/docs/index.md @@ -11,17 +11,14 @@ ## How does it work `khalib` proposes histogram-based calibration and its error estimation. Its differentiating factor -is that uses [Khiops][khiops-org] to construct the histogram in which {math}`P(Y = 1 | S)` is -estimated. These histograms have the following properties: +is that uses Khiops to construct the histogram in which {math}`P(Y = 1 | S)` is estimated. These +histograms have the following properties: - They balance class purity, model complexity and data fitness. - They are non-parametric: The optimal histogram is searched without constraint in number of bins or bin width. This implies that the user doesn't need to set a number of bins nor their widths. -[khiops-org]: https://khiops.org -[khiops11-setup]: https://khiops.org/11.0.0-b.0/setup/ -[sk-calclf]: https://scikit-learn.org/stable/modules/generated/sklearn.calibration.CalibratedClassifierCV.html -[khalib-docs]: https://khiopsml.github.io/khalib + See the [Quickstart](quickstart) and [API reference](api) to learn how to use the library. @@ -40,5 +37,6 @@ API Reference :hidden: Khiops +Github ``` diff --git a/docs/quickstart.ipynb b/docs/quickstart.ipynb index 8316f2d..9742b72 100644 --- a/docs/quickstart.ipynb +++ b/docs/quickstart.ipynb @@ -178,6 +178,22 @@ "print(\"Reduction :\", (ece_test - calib_ece_test) / ece_test)\n", "_ = khalib.build_reliability_diagram(calib_hist_y_test_scores, y_test)" ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "0370a02f", + "metadata": {}, + "outputs": [], + "source": [] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "edf18fbe", + "metadata": {}, + "outputs": [], + "source": [] } ], "metadata": { diff --git a/docs/quickstart.py b/docs/quickstart.py index f5e6c23..06c3fc7 100644 --- a/docs/quickstart.py +++ b/docs/quickstart.py @@ -112,3 +112,7 @@ print("CALIB HIST ECE:", calib_hist_ece_test) print("Reduction :", (ece_test - calib_ece_test) / ece_test) _ = khalib.build_reliability_diagram(calib_hist_y_test_scores, y_test) + +# %% + +# %% diff --git a/justfile b/justfile index f26187f..ebc0f91 100644 --- a/justfile +++ b/justfile @@ -1,6 +1,6 @@ alias pc := pre-commit pre-commit: - uv run pre-commit run --all-files + uvx pre-commit run --all-files alias d := docs docs: diff --git a/pyproject.toml b/pyproject.toml index d516eae..5144e57 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -4,22 +4,45 @@ build-backend = "setuptools.build_meta" [project] name = "khalib" -version = "0.1" +version = "0.2" description = "Classifier Calibration with Khiops" authors = [{ name = "Felipe Olmos", email = "luisfelipe.olmosmarchant@orange.com" }] requires-python = ">=3.11" dependencies = [ - "khiops>=11.0.0.0b0", + "khiops>=11.0.0.0", "numpy>=2.0.0", "scikit-learn>=1.5.0", "matplotlib>=3.9.0", ] +readme = "README.md" license = "BSD-3-Clause" license-files = ["LICENSE.md"] +classifiers=[ + "Intended Audience :: Science/Research", + "Intended Audience :: Developers", + "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.11", + "Programming Language :: Python :: 3.12", + "Programming Language :: Python :: 3.13", + "Programming Language :: Python :: 3.14", +] +[project.urls] +homepage = "https://khiopslab.github.io/khalib" +source = "https://github.com/KhiopsLab/khalib" +tracker = "https://github.com/KhiopsLab/khalib/issues" +changelog = "https://github.com/KhiopsLab/khalib/blob/main/CHANGELOG.md" -[tools.setuptools] -packages = ["khcalib"] +[tool.setuptools.packages.find] +where = ["src"] [tool.pytest.ini_options] markers = [ @@ -56,13 +79,11 @@ ignore = [ "PLW0120", # useless-else-on-loop "PLW0406", # import-self "PLW0603", # global-statement + "PD901", # Avoid 'df' name for dataframes ] # To fix by default isort fixes extend-safe-fixes = ["I"] -[tool.uv.sources] -khiops = { url = "https://github.com/KhiopsML/khiops-python/releases/download/11.0.0.0-b.0/khiops-11.0.0.0b0.tar.gz" } - [dependency-groups] dev = [ "furo>=2025.7.19", @@ -74,7 +95,6 @@ dev = [ "myst-nb>=1.3.0", "myst-parser>=4.0.1", "numpydoc>=1.9.0", - "pre-commit>=4.3.0", "pytest>=8.4.1", "sphinx>=8.2.3", "sphinx-copybutton>=0.5.2", diff --git a/uv.lock b/uv.lock index 10028df..f2d3110 100644 --- a/uv.lock +++ b/uv.lock @@ -252,15 +252,6 @@ wheels = [ { url = "https://files.pythonhosted.org/packages/ae/3a/dbeec9d1ee0844c679f6bb5d6ad4e9f198b1224f4e7a32825f47f6192b0c/cffi-2.0.0-cp314-cp314t-win_arm64.whl", hash = "sha256:0a1527a803f0a659de1af2e1fd700213caba79377e27e4693648c2923da066f9", size = 184195, upload-time = "2025-09-08T23:23:43.004Z" }, ] -[[package]] -name = "cfgv" -version = "3.4.0" -source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/11/74/539e56497d9bd1d484fd863dd69cbbfa653cd2aa27abfe35653494d85e94/cfgv-3.4.0.tar.gz", hash = "sha256:e52591d4c5f5dead8e0f673fb16db7949d2cfb3f7da4582893288f0ded8fe560", size = 7114, upload-time = "2023-08-12T20:38:17.776Z" } -wheels = [ - { url = "https://files.pythonhosted.org/packages/c5/55/51844dd50c4fc7a33b653bfaba4c2456f06955289ca770a5dbd5fd267374/cfgv-3.4.0-py2.py3-none-any.whl", hash = "sha256:b7265b1f29fd3316bfcd2b330d63d024f2bfd8bcb8b0272f8e19a504856c48f9", size = 7249, upload-time = "2023-08-12T20:38:16.269Z" }, -] - [[package]] name = "charset-normalizer" version = "3.4.4" @@ -498,15 +489,6 @@ wheels = [ { url = "https://files.pythonhosted.org/packages/07/6c/aa3f2f849e01cb6a001cd8554a88d4c77c5c1a31c95bdf1cf9301e6d9ef4/defusedxml-0.7.1-py2.py3-none-any.whl", hash = "sha256:a352e7e428770286cc899e2542b6cdaedb2b4953ff269a210103ec58f6198a61", size = 25604, upload-time = "2021-03-08T10:59:24.45Z" }, ] -[[package]] -name = "distlib" -version = "0.4.0" -source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/96/8e/709914eb2b5749865801041647dc7f4e6d00b549cfe88b65ca192995f07c/distlib-0.4.0.tar.gz", hash = "sha256:feec40075be03a04501a973d81f633735b4b69f98b05450592310c0f401a4e0d", size = 614605, upload-time = "2025-07-17T16:52:00.465Z" } -wheels = [ - { url = "https://files.pythonhosted.org/packages/33/6b/e0547afaf41bf2c42e52430072fa5658766e3d65bd4b03a563d1b6336f57/distlib-0.4.0-py2.py3-none-any.whl", hash = "sha256:9659f7d87e46584a30b5780e43ac7a2143098441670ff0a49d5f9034c54a6c16", size = 469047, upload-time = "2025-07-17T16:51:58.613Z" }, -] - [[package]] name = "docutils" version = "0.21.2" @@ -534,15 +516,6 @@ wheels = [ { url = "https://files.pythonhosted.org/packages/cb/a8/20d0723294217e47de6d9e2e40fd4a9d2f7c4b6ef974babd482a59743694/fastjsonschema-2.21.2-py3-none-any.whl", hash = "sha256:1c797122d0a86c5cace2e54bf4e819c36223b552017172f32c5c024a6b77e463", size = 24024, upload-time = "2025-08-14T18:49:34.776Z" }, ] -[[package]] -name = "filelock" -version = "3.20.0" -source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/58/46/0028a82567109b5ef6e4d2a1f04a583fb513e6cf9527fcdd09afd817deeb/filelock-3.20.0.tar.gz", hash = "sha256:711e943b4ec6be42e1d4e6690b48dc175c822967466bb31c0c293f34334c13f4", size = 18922, upload-time = "2025-10-08T18:03:50.056Z" } -wheels = [ - { url = "https://files.pythonhosted.org/packages/76/91/7216b27286936c16f5b4d0c530087e4a54eead683e6b0b73dd0c64844af6/filelock-3.20.0-py3-none-any.whl", hash = "sha256:339b4732ffda5cd79b13f4e2711a31b0365ce445d95d243bb996273d072546a2", size = 16054, upload-time = "2025-10-08T18:03:48.35Z" }, -] - [[package]] name = "fonttools" version = "4.60.1" @@ -631,6 +604,8 @@ wheels = [ { url = "https://files.pythonhosted.org/packages/1f/8e/abdd3f14d735b2929290a018ecf133c901be4874b858dd1c604b9319f064/greenlet-3.2.4-cp311-cp311-manylinux_2_24_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:2523e5246274f54fdadbce8494458a2ebdcdbc7b802318466ac5606d3cded1f8", size = 587684, upload-time = "2025-08-07T13:18:25.164Z" }, { url = "https://files.pythonhosted.org/packages/5d/65/deb2a69c3e5996439b0176f6651e0052542bb6c8f8ec2e3fba97c9768805/greenlet-3.2.4-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:1987de92fec508535687fb807a5cea1560f6196285a4cde35c100b8cd632cc52", size = 1116647, upload-time = "2025-08-07T13:42:38.655Z" }, { url = "https://files.pythonhosted.org/packages/3f/cc/b07000438a29ac5cfb2194bfc128151d52f333cee74dd7dfe3fb733fc16c/greenlet-3.2.4-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:55e9c5affaa6775e2c6b67659f3a71684de4c549b3dd9afca3bc773533d284fa", size = 1142073, upload-time = "2025-08-07T13:18:21.737Z" }, + { url = "https://files.pythonhosted.org/packages/67/24/28a5b2fa42d12b3d7e5614145f0bd89714c34c08be6aabe39c14dd52db34/greenlet-3.2.4-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:c9c6de1940a7d828635fbd254d69db79e54619f165ee7ce32fda763a9cb6a58c", size = 1548385, upload-time = "2025-11-04T12:42:11.067Z" }, + { url = "https://files.pythonhosted.org/packages/6a/05/03f2f0bdd0b0ff9a4f7b99333d57b53a7709c27723ec8123056b084e69cd/greenlet-3.2.4-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:03c5136e7be905045160b1b9fdca93dd6727b180feeafda6818e6496434ed8c5", size = 1613329, upload-time = "2025-11-04T12:42:12.928Z" }, { url = "https://files.pythonhosted.org/packages/d8/0f/30aef242fcab550b0b3520b8e3561156857c94288f0332a79928c31a52cf/greenlet-3.2.4-cp311-cp311-win_amd64.whl", hash = "sha256:9c40adce87eaa9ddb593ccb0fa6a07caf34015a29bf8d344811665b573138db9", size = 299100, upload-time = "2025-08-07T13:44:12.287Z" }, { url = "https://files.pythonhosted.org/packages/44/69/9b804adb5fd0671f367781560eb5eb586c4d495277c93bde4307b9e28068/greenlet-3.2.4-cp312-cp312-macosx_11_0_universal2.whl", hash = "sha256:3b67ca49f54cede0186854a008109d6ee71f66bd57bb36abd6d0a0267b540cdd", size = 274079, upload-time = "2025-08-07T13:15:45.033Z" }, { url = "https://files.pythonhosted.org/packages/46/e9/d2a80c99f19a153eff70bc451ab78615583b8dac0754cfb942223d2c1a0d/greenlet-3.2.4-cp312-cp312-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:ddf9164e7a5b08e9d22511526865780a576f19ddd00d62f8a665949327fde8bb", size = 640997, upload-time = "2025-08-07T13:42:56.234Z" }, @@ -640,6 +615,8 @@ wheels = [ { url = "https://files.pythonhosted.org/packages/19/0d/6660d55f7373b2ff8152401a83e02084956da23ae58cddbfb0b330978fe9/greenlet-3.2.4-cp312-cp312-manylinux_2_24_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:3b3812d8d0c9579967815af437d96623f45c0f2ae5f04e366de62a12d83a8fb0", size = 607586, upload-time = "2025-08-07T13:18:28.544Z" }, { url = "https://files.pythonhosted.org/packages/8e/1a/c953fdedd22d81ee4629afbb38d2f9d71e37d23caace44775a3a969147d4/greenlet-3.2.4-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:abbf57b5a870d30c4675928c37278493044d7c14378350b3aa5d484fa65575f0", size = 1123281, upload-time = "2025-08-07T13:42:39.858Z" }, { url = "https://files.pythonhosted.org/packages/3f/c7/12381b18e21aef2c6bd3a636da1088b888b97b7a0362fac2e4de92405f97/greenlet-3.2.4-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:20fb936b4652b6e307b8f347665e2c615540d4b42b3b4c8a321d8286da7e520f", size = 1151142, upload-time = "2025-08-07T13:18:22.981Z" }, + { url = "https://files.pythonhosted.org/packages/27/45/80935968b53cfd3f33cf99ea5f08227f2646e044568c9b1555b58ffd61c2/greenlet-3.2.4-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:ee7a6ec486883397d70eec05059353b8e83eca9168b9f3f9a361971e77e0bcd0", size = 1564846, upload-time = "2025-11-04T12:42:15.191Z" }, + { url = "https://files.pythonhosted.org/packages/69/02/b7c30e5e04752cb4db6202a3858b149c0710e5453b71a3b2aec5d78a1aab/greenlet-3.2.4-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:326d234cbf337c9c3def0676412eb7040a35a768efc92504b947b3e9cfc7543d", size = 1633814, upload-time = "2025-11-04T12:42:17.175Z" }, { url = "https://files.pythonhosted.org/packages/e9/08/b0814846b79399e585f974bbeebf5580fbe59e258ea7be64d9dfb253c84f/greenlet-3.2.4-cp312-cp312-win_amd64.whl", hash = "sha256:a7d4e128405eea3814a12cc2605e0e6aedb4035bf32697f72deca74de4105e02", size = 299899, upload-time = "2025-08-07T13:38:53.448Z" }, { url = "https://files.pythonhosted.org/packages/49/e8/58c7f85958bda41dafea50497cbd59738c5c43dbbea5ee83d651234398f4/greenlet-3.2.4-cp313-cp313-macosx_11_0_universal2.whl", hash = "sha256:1a921e542453fe531144e91e1feedf12e07351b1cf6c9e8a3325ea600a715a31", size = 272814, upload-time = "2025-08-07T13:15:50.011Z" }, { url = "https://files.pythonhosted.org/packages/62/dd/b9f59862e9e257a16e4e610480cfffd29e3fae018a68c2332090b53aac3d/greenlet-3.2.4-cp313-cp313-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:cd3c8e693bff0fff6ba55f140bf390fa92c994083f838fece0f63be121334945", size = 641073, upload-time = "2025-08-07T13:42:57.23Z" }, @@ -649,6 +626,8 @@ wheels = [ { url = "https://files.pythonhosted.org/packages/ee/43/3cecdc0349359e1a527cbf2e3e28e5f8f06d3343aaf82ca13437a9aa290f/greenlet-3.2.4-cp313-cp313-manylinux_2_24_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:23768528f2911bcd7e475210822ffb5254ed10d71f4028387e5a99b4c6699671", size = 610497, upload-time = "2025-08-07T13:18:31.636Z" }, { url = "https://files.pythonhosted.org/packages/b8/19/06b6cf5d604e2c382a6f31cafafd6f33d5dea706f4db7bdab184bad2b21d/greenlet-3.2.4-cp313-cp313-musllinux_1_1_aarch64.whl", hash = "sha256:00fadb3fedccc447f517ee0d3fd8fe49eae949e1cd0f6a611818f4f6fb7dc83b", size = 1121662, upload-time = "2025-08-07T13:42:41.117Z" }, { url = "https://files.pythonhosted.org/packages/a2/15/0d5e4e1a66fab130d98168fe984c509249c833c1a3c16806b90f253ce7b9/greenlet-3.2.4-cp313-cp313-musllinux_1_1_x86_64.whl", hash = "sha256:d25c5091190f2dc0eaa3f950252122edbbadbb682aa7b1ef2f8af0f8c0afefae", size = 1149210, upload-time = "2025-08-07T13:18:24.072Z" }, + { url = "https://files.pythonhosted.org/packages/1c/53/f9c440463b3057485b8594d7a638bed53ba531165ef0ca0e6c364b5cc807/greenlet-3.2.4-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:6e343822feb58ac4d0a1211bd9399de2b3a04963ddeec21530fc426cc121f19b", size = 1564759, upload-time = "2025-11-04T12:42:19.395Z" }, + { url = "https://files.pythonhosted.org/packages/47/e4/3bb4240abdd0a8d23f4f88adec746a3099f0d86bfedb623f063b2e3b4df0/greenlet-3.2.4-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:ca7f6f1f2649b89ce02f6f229d7c19f680a6238af656f61e0115b24857917929", size = 1634288, upload-time = "2025-11-04T12:42:21.174Z" }, { url = "https://files.pythonhosted.org/packages/0b/55/2321e43595e6801e105fcfdee02b34c0f996eb71e6ddffca6b10b7e1d771/greenlet-3.2.4-cp313-cp313-win_amd64.whl", hash = "sha256:554b03b6e73aaabec3745364d6239e9e012d64c68ccd0b8430c64ccc14939a8b", size = 299685, upload-time = "2025-08-07T13:24:38.824Z" }, { url = "https://files.pythonhosted.org/packages/22/5c/85273fd7cc388285632b0498dbbab97596e04b154933dfe0f3e68156c68c/greenlet-3.2.4-cp314-cp314-macosx_11_0_universal2.whl", hash = "sha256:49a30d5fda2507ae77be16479bdb62a660fa51b1eb4928b524975b3bde77b3c0", size = 273586, upload-time = "2025-08-07T13:16:08.004Z" }, { url = "https://files.pythonhosted.org/packages/d1/75/10aeeaa3da9332c2e761e4c50d4c3556c21113ee3f0afa2cf5769946f7a3/greenlet-3.2.4-cp314-cp314-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:299fd615cd8fc86267b47597123e3f43ad79c9d8a22bebdce535e53550763e2f", size = 686346, upload-time = "2025-08-07T13:42:59.944Z" }, @@ -656,6 +635,8 @@ wheels = [ { url = "https://files.pythonhosted.org/packages/dc/8b/29aae55436521f1d6f8ff4e12fb676f3400de7fcf27fccd1d4d17fd8fecd/greenlet-3.2.4-cp314-cp314-manylinux2014_s390x.manylinux_2_17_s390x.whl", hash = "sha256:b4a1870c51720687af7fa3e7cda6d08d801dae660f75a76f3845b642b4da6ee1", size = 694659, upload-time = "2025-08-07T13:53:17.759Z" }, { url = "https://files.pythonhosted.org/packages/92/2e/ea25914b1ebfde93b6fc4ff46d6864564fba59024e928bdc7de475affc25/greenlet-3.2.4-cp314-cp314-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:061dc4cf2c34852b052a8620d40f36324554bc192be474b9e9770e8c042fd735", size = 695355, upload-time = "2025-08-07T13:18:34.517Z" }, { url = "https://files.pythonhosted.org/packages/72/60/fc56c62046ec17f6b0d3060564562c64c862948c9d4bc8aa807cf5bd74f4/greenlet-3.2.4-cp314-cp314-manylinux_2_24_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:44358b9bf66c8576a9f57a590d5f5d6e72fa4228b763d0e43fee6d3b06d3a337", size = 657512, upload-time = "2025-08-07T13:18:33.969Z" }, + { url = "https://files.pythonhosted.org/packages/23/6e/74407aed965a4ab6ddd93a7ded3180b730d281c77b765788419484cdfeef/greenlet-3.2.4-cp314-cp314-musllinux_1_2_aarch64.whl", hash = "sha256:2917bdf657f5859fbf3386b12d68ede4cf1f04c90c3a6bc1f013dd68a22e2269", size = 1612508, upload-time = "2025-11-04T12:42:23.427Z" }, + { url = "https://files.pythonhosted.org/packages/0d/da/343cd760ab2f92bac1845ca07ee3faea9fe52bee65f7bcb19f16ad7de08b/greenlet-3.2.4-cp314-cp314-musllinux_1_2_x86_64.whl", hash = "sha256:015d48959d4add5d6c9f6c5210ee3803a830dce46356e3bc326d6776bde54681", size = 1680760, upload-time = "2025-11-04T12:42:25.341Z" }, { url = "https://files.pythonhosted.org/packages/e3/a5/6ddab2b4c112be95601c13428db1d8b6608a8b6039816f2ba09c346c08fc/greenlet-3.2.4-cp314-cp314-win_amd64.whl", hash = "sha256:e37ab26028f12dbb0ff65f29a8d3d44a765c61e729647bf2ddfbbed621726f01", size = 303425, upload-time = "2025-08-07T13:32:27.59Z" }, ] @@ -696,15 +677,6 @@ wheels = [ { url = "https://files.pythonhosted.org/packages/2a/39/e50c7c3a983047577ee07d2a9e53faf5a69493943ec3f6a384bdc792deb2/httpx-0.28.1-py3-none-any.whl", hash = "sha256:d909fcccc110f8c7faf814ca82a9a4d816bc5a6dbfea25d6591d6985b8ba59ad", size = 73517, upload-time = "2024-12-06T15:37:21.509Z" }, ] -[[package]] -name = "identify" -version = "2.6.15" -source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/ff/e7/685de97986c916a6d93b3876139e00eef26ad5bbbd61925d670ae8013449/identify-2.6.15.tar.gz", hash = "sha256:e4f4864b96c6557ef2a1e1c951771838f4edc9df3a72ec7118b338801b11c7bf", size = 99311, upload-time = "2025-10-02T17:43:40.631Z" } -wheels = [ - { url = "https://files.pythonhosted.org/packages/0f/1c/e5fd8f973d4f375adb21565739498e2e9a1e54c858a97b9a8ccfdc81da9b/identify-2.6.15-py2.py3-none-any.whl", hash = "sha256:1181ef7608e00704db228516541eb83a88a9f94433a8c80bb9b5bd54b1d81757", size = 99183, upload-time = "2025-10-02T17:43:39.137Z" }, -] - [[package]] name = "idna" version = "3.11" @@ -1108,7 +1080,7 @@ wheels = [ [[package]] name = "khalib" -version = "0.1b0" +version = "0.2" source = { editable = "." } dependencies = [ { name = "khiops" }, @@ -1128,7 +1100,6 @@ dev = [ { name = "myst-nb" }, { name = "myst-parser" }, { name = "numpydoc" }, - { name = "pre-commit" }, { name = "pytest" }, { name = "sphinx" }, { name = "sphinx-copybutton" }, @@ -1137,7 +1108,7 @@ dev = [ [package.metadata] requires-dist = [ - { name = "khiops", url = "https://github.com/KhiopsML/khiops-python/releases/download/11.0.0.0-b.0/khiops-11.0.0.0b0.tar.gz" }, + { name = "khiops", specifier = ">=11.0.0.0" }, { name = "matplotlib", specifier = ">=3.9.0" }, { name = "numpy", specifier = ">=2.0.0" }, { name = "scikit-learn", specifier = ">=1.5.0" }, @@ -1154,7 +1125,6 @@ dev = [ { name = "myst-nb", specifier = ">=1.3.0" }, { name = "myst-parser", specifier = ">=4.0.1" }, { name = "numpydoc", specifier = ">=1.9.0" }, - { name = "pre-commit", specifier = ">=4.3.0" }, { name = "pytest", specifier = ">=8.4.1" }, { name = "sphinx", specifier = ">=8.2.3" }, { name = "sphinx-copybutton", specifier = ">=0.5.2" }, @@ -1163,23 +1133,13 @@ dev = [ [[package]] name = "khiops" -version = "11.0.0.0b0" -source = { url = "https://github.com/KhiopsML/khiops-python/releases/download/11.0.0.0-b.0/khiops-11.0.0.0b0.tar.gz" } +version = "11.0.0.0" +source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "pandas" }, { name = "scikit-learn" }, ] -sdist = { hash = "sha256:db8380d4eeec4341f52459d4d2533b48c95e79e6faea020a19fcbdc8ff33fe92" } - -[package.metadata] -requires-dist = [ - { name = "boto3", marker = "extra == 's3'", specifier = ">=1.17.39,<=1.35.69" }, - { name = "google-cloud-storage", marker = "extra == 'gcs'", specifier = ">=1.37.0" }, - { name = "pandas", specifier = ">=0.25.3" }, - { name = "pyopenssl", marker = "extra == 's3'", specifier = ">=24.0.0,<25.0.0" }, - { name = "scikit-learn", specifier = ">=0.22.2" }, -] -provides-extras = ["s3", "gcs"] +sdist = { url = "https://files.pythonhosted.org/packages/1f/bd/5e1d1a6f1bc5ef3746a905346b3f5990120c01a1396beec04181e2a9b342/khiops-11.0.0.0.tar.gz", hash = "sha256:35b03439b515e528a87bf0d42c93f047a1bf7e3fe95f9fb1aa8d0e8f360337de", size = 179523, upload-time = "2025-12-19T14:18:41.255Z" } [[package]] name = "kiwisolver" @@ -1574,15 +1534,6 @@ wheels = [ { url = "https://files.pythonhosted.org/packages/a0/c4/c2971a3ba4c6103a3d10c4b0f24f461ddc027f0f09763220cf35ca1401b3/nest_asyncio-1.6.0-py3-none-any.whl", hash = "sha256:87af6efd6b5e897c81050477ef65c62e2b2f35d51703cae01aff2905b1852e1c", size = 5195, upload-time = "2024-01-21T14:25:17.223Z" }, ] -[[package]] -name = "nodeenv" -version = "1.9.1" -source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/43/16/fc88b08840de0e0a72a2f9d8c6bae36be573e475a6326ae854bcc549fc45/nodeenv-1.9.1.tar.gz", hash = "sha256:6ec12890a2dab7946721edbfbcd91f3319c6ccc9aec47be7c7e6b7011ee6645f", size = 47437, upload-time = "2024-06-04T18:44:11.171Z" } -wheels = [ - { url = "https://files.pythonhosted.org/packages/d2/1d/1b658dbd2b9fa9c4c9f32accbfc0205d532c8c6194dc0f2a4c0428e7128a/nodeenv-1.9.1-py2.py3-none-any.whl", hash = "sha256:ba11c9782d29c27c70ffbdda2d7415098754709be8a7056d79a737cd901155c9", size = 22314, upload-time = "2024-06-04T18:44:08.352Z" }, -] - [[package]] name = "notebook-shim" version = "0.2.4" @@ -1895,22 +1846,6 @@ wheels = [ { url = "https://files.pythonhosted.org/packages/54/20/4d324d65cc6d9205fabedc306948156824eb9f0ee1633355a8f7ec5c66bf/pluggy-1.6.0-py3-none-any.whl", hash = "sha256:e920276dd6813095e9377c0bc5566d94c932c33b27a3e3945d8389c374dd4746", size = 20538, upload-time = "2025-05-15T12:30:06.134Z" }, ] -[[package]] -name = "pre-commit" -version = "4.3.0" -source = { registry = "https://pypi.org/simple" } -dependencies = [ - { name = "cfgv" }, - { name = "identify" }, - { name = "nodeenv" }, - { name = "pyyaml" }, - { name = "virtualenv" }, -] -sdist = { url = "https://files.pythonhosted.org/packages/ff/29/7cf5bbc236333876e4b41f56e06857a87937ce4bf91e117a6991a2dbb02a/pre_commit-4.3.0.tar.gz", hash = "sha256:499fe450cc9d42e9d58e606262795ecb64dd05438943c62b66f6a8673da30b16", size = 193792, upload-time = "2025-08-09T18:56:14.651Z" } -wheels = [ - { url = "https://files.pythonhosted.org/packages/5b/a5/987a405322d78a73b66e39e4a90e4ef156fd7141bf71df987e50717c321b/pre_commit-4.3.0-py2.py3-none-any.whl", hash = "sha256:2b0747ad7e6e967169136edffee14c16e148a778a54e4f967921aa1ebf2308d8", size = 220965, upload-time = "2025-08-09T18:56:13.192Z" }, -] - [[package]] name = "prometheus-client" version = "0.23.1" @@ -2793,20 +2728,6 @@ wheels = [ { url = "https://files.pythonhosted.org/packages/a7/c2/fe1e52489ae3122415c51f387e221dd0773709bad6c6cdaa599e8a2c5185/urllib3-2.5.0-py3-none-any.whl", hash = "sha256:e6b01673c0fa6a13e374b50871808eb3bf7046c4b125b216f6bf1cc604cff0dc", size = 129795, upload-time = "2025-06-18T14:07:40.39Z" }, ] -[[package]] -name = "virtualenv" -version = "20.35.3" -source = { registry = "https://pypi.org/simple" } -dependencies = [ - { name = "distlib" }, - { name = "filelock" }, - { name = "platformdirs" }, -] -sdist = { url = "https://files.pythonhosted.org/packages/a4/d5/b0ccd381d55c8f45d46f77df6ae59fbc23d19e901e2d523395598e5f4c93/virtualenv-20.35.3.tar.gz", hash = "sha256:4f1a845d131133bdff10590489610c98c168ff99dc75d6c96853801f7f67af44", size = 6002907, upload-time = "2025-10-10T21:23:33.178Z" } -wheels = [ - { url = "https://files.pythonhosted.org/packages/27/73/d9a94da0e9d470a543c1b9d3ccbceb0f59455983088e727b8a1824ed90fb/virtualenv-20.35.3-py3-none-any.whl", hash = "sha256:63d106565078d8c8d0b206d48080f938a8b25361e19432d2c9db40d2899c810a", size = 5981061, upload-time = "2025-10-10T21:23:30.433Z" }, -] - [[package]] name = "wcwidth" version = "0.2.14"