diff --git a/.gitattributes b/.gitattributes index ec1fefda1..430680277 100644 --- a/.gitattributes +++ b/.gitattributes @@ -1 +1,3 @@ pymc/_version.py export-subst +# SCM syntax highlighting & preventing 3-way merges +pixi.lock merge=binary linguist-language=YAML linguist-generated=true diff --git a/.gitignore b/.gitignore index 811f38316..ec768bc56 100644 --- a/.gitignore +++ b/.gitignore @@ -55,3 +55,6 @@ pixi.lock .jupyter/ .claude/ +# pixi environments +.pixi/* +!.pixi/config.toml diff --git a/pyproject.toml b/pyproject.toml index 365b818e1..edc4eabcc 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -1,7 +1,75 @@ [build-system] -requires = ["setuptools", "versioneer[toml]==0.29"] +requires = ["setuptools>=77", "versioneer[toml]==0.29"] build-backend = "setuptools.build_meta" +[project] +name = "pymc" +dynamic = ["version"] +requires-python = ">=3.11,<3.14" +authors = [{ name = "PyMC Developers", email = "pymc.devs@gmail.com" }] +description = "Probabilistic Programming in Python: Bayesian Modeling and Probabilistic Machine Learning with PyTensor" +readme = "README.rst" +license = "Apache-2.0" +license-files = ["LICENSE"] +classifiers = [ + "Development Status :: 5 - Production/Stable", + "Programming Language :: Python", + "Programming Language :: Python :: 3", + "Programming Language :: Python :: 3.11", + "Programming Language :: Python :: 3.12", + "Programming Language :: Python :: 3.13", + "Intended Audience :: Science/Research", + "Topic :: Scientific/Engineering", + "Topic :: Scientific/Engineering :: Mathematics", + "Operating System :: OS Independent", +] +keywords = [ + "statistics", + "modelling", + "inference", + "probabilistic-programming", + "bayesian-inference", + "science", +] +dependencies = [ + "arviz>=0.13.0", + "cachetools>=4.2.1", + "cloudpickle", + "numpy>=1.25.0", + "pandas>=0.24.0", + "pytensor>=2.35.0,<2.36", + "rich>=13.7.1", + "scipy>=1.4.1", + "threadpoolctl>=3.1.0,<4.0.0", + "typing-extensions>=3.7.4", +] + +[project.urls] +repository = "http://github.com/pymc-devs/pymc" + +[project.optional-dependencies] +tests = [ + # "blas", + "jax", + "polyagamma", + # "python-graphviz", + "graphviz", + "networkx", + "zarr>=2.5.0,<3", + # Extra dependencies for testing + "ipython>=7.16", + "pre-commit>=2.8.0", + "pytest-cov>=2.5", + "pytest>=3.0", + "mypy==1.15.0", + "types-cachetools", + "numdifftools>=0.9.40", + # "mcbackend>=0.4.0", +] + +[tool.setuptools.packages.find] +include = ["pymc*"] + [tool.pytest.ini_options] testpaths = ["tests"] minversion = "6.0" @@ -101,3 +169,16 @@ exclude_lines = [ [tool.coverage.run] omit = ["*examples*"] + +[tool.pixi.workspace] +channels = ["conda-forge"] +platforms = ["linux-64"] + +[tool.pixi.pypi-dependencies] +pymc = { path = ".", editable = true } + +[tool.pixi.environments] +default = { solve-group = "default" } +tests = { features = ["tests"], solve-group = "default" } + +[tool.pixi.tasks] diff --git a/requirements-dev.txt b/requirements-dev.txt deleted file mode 100644 index 22bcdaf9e..000000000 --- a/requirements-dev.txt +++ /dev/null @@ -1,34 +0,0 @@ -# This file is auto-generated by scripts/generate_pip_deps_from_conda.py, do not modify. -# See that file for comments about the need/usage of each dependency. - -arviz>=0.13.0 -cachetools>=4.2.1 -cloudpickle -ipython>=7.16 -jupyter-sphinx -mcbackend>=0.4.0 -mypy==1.15.0 -myst-nb<=1.0.0 -numdifftools>=0.9.40 -numpy>=1.25.0 -numpydoc -pandas>=0.24.0 -polyagamma -pre-commit>=2.8.0 -pymc-sphinx-theme>=0.16.0 -pytensor>=2.35.0,<2.36 -pytest-cov>=2.5 -pytest>=3.0 -rich>=13.7.1 -scipy>=1.4.1 -sphinx-copybutton -sphinx-design -sphinx-notfound-page -sphinx-remove-toctrees -sphinx>=1.5 -sphinxext-rediraffe -threadpoolctl>=3.1.0 -types-cachetools -typing-extensions>=3.7.4 -watermark -zarr>=2.5.0,<3 diff --git a/requirements.txt b/requirements.txt deleted file mode 100644 index 8401b78a1..000000000 --- a/requirements.txt +++ /dev/null @@ -1,10 +0,0 @@ -arviz>=0.13.0 -cachetools>=4.2.1 -cloudpickle -numpy>=1.25.0 -pandas>=0.24.0 -pytensor>=2.35.0,<2.36 -rich>=13.7.1 -scipy>=1.4.1 -threadpoolctl>=3.1.0,<4.0.0 -typing-extensions>=3.7.4 diff --git a/setup.py b/setup.py deleted file mode 100755 index 80eaedb92..000000000 --- a/setup.py +++ /dev/null @@ -1,76 +0,0 @@ -# Copyright 2024 - present The PyMC Developers -# -# Licensed under the Apache License, Version 2.0 (the "License"); -# you may not use this file except in compliance with the License. -# You may obtain a copy of the License at -# -# http://www.apache.org/licenses/LICENSE-2.0 -# -# Unless required by applicable law or agreed to in writing, software -# distributed under the License is distributed on an "AS IS" BASIS, -# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -# See the License for the specific language governing permissions and -# limitations under the License. - - -from codecs import open -from os.path import dirname, join, realpath - -import versioneer - -from setuptools import find_packages, setup - -DESCRIPTION = "Probabilistic Programming in Python: Bayesian Modeling and Probabilistic Machine Learning with PyTensor" -AUTHOR = "PyMC Developers" -AUTHOR_EMAIL = "pymc.devs@gmail.com" -URL = "http://github.com/pymc-devs/pymc" -LICENSE = "Apache License, Version 2.0" - -classifiers = [ - "Development Status :: 5 - Production/Stable", - "Programming Language :: Python", - "Programming Language :: Python :: 3", - "Programming Language :: Python :: 3.11", - "Programming Language :: Python :: 3.12", - "Programming Language :: Python :: 3.13", - "License :: OSI Approved :: Apache Software License", - "Intended Audience :: Science/Research", - "Topic :: Scientific/Engineering", - "Topic :: Scientific/Engineering :: Mathematics", - "Operating System :: OS Independent", -] - -PROJECT_ROOT = dirname(realpath(__file__)) - -# Get the long description from the README file -with open(join(PROJECT_ROOT, "README.rst"), encoding="utf-8") as buff: - LONG_DESCRIPTION = buff.read() - -REQUIREMENTS_FILE = join(PROJECT_ROOT, "requirements.txt") - -with open(REQUIREMENTS_FILE) as f: - install_reqs = f.read().splitlines() - -test_reqs = ["pytest", "pytest-cov"] - -if __name__ == "__main__": - setup( - name="pymc", - version=versioneer.get_version(), - cmdclass=versioneer.get_cmdclass(), - maintainer=AUTHOR, - maintainer_email=AUTHOR_EMAIL, - description=DESCRIPTION, - license=LICENSE, - url=URL, - long_description=LONG_DESCRIPTION, - long_description_content_type="text/x-rst", - packages=find_packages(exclude=["tests*"]), - # because of an upload-size limit by PyPI, we're temporarily removing docs from the tarball. - # Also see MANIFEST.in - # package_data={'docs': ['*']}, - classifiers=classifiers, - python_requires=">=3.11", - install_requires=install_reqs, - tests_require=test_reqs, - )