Metadata-Version: 2.4
Name: avitai-artifex
Version: 0.1.0
Summary: ARTIFEX: Architectures + Generative + JAX - A modular generative modeling library
Project-URL: repository, https://github.com/avitai/artifex
Author-email: Mahdi Shafiei <mahdi@avitai.bio>
License: MIT License
        
        Copyright (c) 2025 Mahdi Shafiei
        
        Permission is hereby granted, free of charge, to any person obtaining a copy
        of this software and associated documentation files (the "Software"), to deal
        in the Software without restriction, including without limitation the rights
        to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
        copies of the Software, and to permit persons to whom the Software is
        furnished to do so, subject to the following conditions:
        
        The above copyright notice and this permission notice shall be included in all
        copies or substantial portions of the Software.
        
        THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
        IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
        FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
        AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
        LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
        OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
        SOFTWARE.
License-File: LICENSE
Keywords: deep-learning,flax,generative-models,jax
Classifier: Development Status :: 3 - Alpha
Classifier: Intended Audience :: Developers
Classifier: Intended Audience :: Science/Research
Classifier: License :: OSI Approved :: MIT License
Classifier: Natural Language :: English
Classifier: Operating System :: MacOS
Classifier: Operating System :: MacOS :: MacOS X
Classifier: Operating System :: POSIX :: Linux
Classifier: Programming Language :: Python :: 3 :: Only
Classifier: Programming Language :: Python :: 3.11
Classifier: Programming Language :: Python :: 3.12
Classifier: Topic :: Scientific/Engineering :: Artificial Intelligence
Classifier: Topic :: Scientific/Engineering :: Information Analysis
Classifier: Topic :: Scientific/Engineering :: Mathematics
Requires-Python: >=3.11
Requires-Dist: blackjax>=1.2.5
Requires-Dist: calibrax>=0.1.0
Requires-Dist: dacite>=1.8.0
Requires-Dist: datarax>=0.1.2
Requires-Dist: datasets>=2.14.0
Requires-Dist: distrax>=0.1.7
Requires-Dist: flax>=0.12.0
Requires-Dist: grain>=0.1.0
Requires-Dist: graphviz>=0.20
Requires-Dist: huggingface-hub>=0.25.0
Requires-Dist: jax-triton>=0.2.0; sys_platform == 'linux'
Requires-Dist: jax>=0.4.0
Requires-Dist: jaxtyping>=0.2.20
Requires-Dist: matplotlib>=3.8
Requires-Dist: mlflow>=2
Requires-Dist: mock>=5.2
Requires-Dist: nglview>=3
Requires-Dist: numpy<2.4.0,>=1.24
Requires-Dist: optax>=0.2.0
Requires-Dist: orbax-checkpoint>=0.11.0
Requires-Dist: pandas>=2.2.2
Requires-Dist: pre-commit>=4.2
Requires-Dist: psutil>=5.9.5
Requires-Dist: py3dmol>=1
Requires-Dist: pyasn1>=0.6.3
Requires-Dist: pydantic>=2
Requires-Dist: pytest-benchmark>=5.1
Requires-Dist: pytest-cov>=6.1.1
Requires-Dist: pytest-xdist>=3.7
Requires-Dist: pytest>=8.3.5
Requires-Dist: python-dotenv>=1.1
Requires-Dist: requests>=2.33.0
Requires-Dist: scikit-learn>=1.6.1
Requires-Dist: scipy>=1.12.1
Requires-Dist: tqdm>=4.67
Requires-Dist: trimesh>=3.30.1
Requires-Dist: triton>=3.1; sys_platform == 'linux'
Requires-Dist: typer>=0.7
Requires-Dist: types-psutil>=5.10.10
Requires-Dist: typing-extensions>=4.5
Requires-Dist: wandb>=0.15
Provides-Extra: all
Requires-Dist: bandit[toml]>=1.8.6; extra == 'all'
Requires-Dist: beartype>=0.14.1; extra == 'all'
Requires-Dist: build>=1.0.3; extra == 'all'
Requires-Dist: coverage>=7; extra == 'all'
Requires-Dist: deadcode>=2.4; extra == 'all'
Requires-Dist: deptry>=0.23; extra == 'all'
Requires-Dist: flake8-functions-names>=0.4; extra == 'all'
Requires-Dist: flake8>=7.0; extra == 'all'
Requires-Dist: griffe>=1.7.3; extra == 'all'
Requires-Dist: hippogriffe>=0.2; extra == 'all'
Requires-Dist: import-linter>=2.0; extra == 'all'
Requires-Dist: interrogate>=1.5; extra == 'all'
Requires-Dist: ipykernel>=6.29.5; extra == 'all'
Requires-Dist: jax[cuda12]==0.9.1; (sys_platform == 'linux') and extra == 'all'
Requires-Dist: jaxlib==0.9.1; (sys_platform == 'linux') and extra == 'all'
Requires-Dist: jupyter>=1.1.1; extra == 'all'
Requires-Dist: jupytext>=1.16.6; extra == 'all'
Requires-Dist: mkdocs-include-exclude-files>=0.1; extra == 'all'
Requires-Dist: mkdocs-ipynb>=0.1; extra == 'all'
Requires-Dist: mkdocs-jupyter>=0.24; extra == 'all'
Requires-Dist: mkdocs-material>=9.6.7; extra == 'all'
Requires-Dist: mkdocs>=1.6.1; extra == 'all'
Requires-Dist: mkdocstrings-python>=1.1.2; extra == 'all'
Requires-Dist: mkdocstrings>=0.28.3; extra == 'all'
Requires-Dist: nbconvert>=7.16.4; extra == 'all'
Requires-Dist: nvidia-cublas-cu12==12.8.4.1; (sys_platform == 'linux') and extra == 'all'
Requires-Dist: nvidia-cuda-cupti-cu12==12.8.90; (sys_platform == 'linux') and extra == 'all'
Requires-Dist: nvidia-cuda-nvcc-cu12==12.9.86; (sys_platform == 'linux') and extra == 'all'
Requires-Dist: nvidia-cuda-nvrtc-cu12==12.8.93; (sys_platform == 'linux') and extra == 'all'
Requires-Dist: nvidia-cuda-runtime-cu12==12.8.90; (sys_platform == 'linux') and extra == 'all'
Requires-Dist: nvidia-cudnn-cu12==9.10.2.21; (sys_platform == 'linux') and extra == 'all'
Requires-Dist: nvidia-cufft-cu12==11.3.3.83; (sys_platform == 'linux') and extra == 'all'
Requires-Dist: nvidia-cusolver-cu12==11.7.3.90; (sys_platform == 'linux') and extra == 'all'
Requires-Dist: nvidia-cusparse-cu12==12.5.8.93; (sys_platform == 'linux') and extra == 'all'
Requires-Dist: nvidia-nccl-cu12==2.27.5; (sys_platform == 'linux') and extra == 'all'
Requires-Dist: nvidia-nvjitlink-cu12==12.8.93; (sys_platform == 'linux') and extra == 'all'
Requires-Dist: nvidia-nvshmem-cu12==3.4.5; (sys_platform == 'linux') and extra == 'all'
Requires-Dist: pydeps>=1.12.17; extra == 'all'
Requires-Dist: pylint>=3.3; extra == 'all'
Requires-Dist: pymdown-extensions>=10.14.3; extra == 'all'
Requires-Dist: pyright>=1.1.336; extra == 'all'
Requires-Dist: pytest-asyncio>=0.23; extra == 'all'
Requires-Dist: pytest-benchmark>=4; extra == 'all'
Requires-Dist: pytest-cov>=6.1.1; extra == 'all'
Requires-Dist: pytest-env>=1.0.1; extra == 'all'
Requires-Dist: pytest-json-report>=1.5.0; extra == 'all'
Requires-Dist: pytest-randomly>=3.15; extra == 'all'
Requires-Dist: pytest-timeout>=2.1; extra == 'all'
Requires-Dist: pytest-xdist>=3.6; extra == 'all'
Requires-Dist: pytest>=8.3.5; extra == 'all'
Requires-Dist: python-dotenv>=1; extra == 'all'
Requires-Dist: radon>=6.0; extra == 'all'
Requires-Dist: ruff>=0.1.5; extra == 'all'
Requires-Dist: tensorboard>=2.16; extra == 'all'
Requires-Dist: twine>=4.0.2; extra == 'all'
Requires-Dist: vulture>=2.14; extra == 'all'
Requires-Dist: wemake-python-styleguide>=1.0; extra == 'all'
Provides-Extra: all-cpu
Requires-Dist: bandit[toml]>=1.8.6; extra == 'all-cpu'
Requires-Dist: beartype>=0.14.1; extra == 'all-cpu'
Requires-Dist: build>=1.0.3; extra == 'all-cpu'
Requires-Dist: coverage>=7; extra == 'all-cpu'
Requires-Dist: deadcode>=2.4; extra == 'all-cpu'
Requires-Dist: deptry>=0.23; extra == 'all-cpu'
Requires-Dist: flake8-functions-names>=0.4; extra == 'all-cpu'
Requires-Dist: flake8>=7.0; extra == 'all-cpu'
Requires-Dist: griffe>=1.7.3; extra == 'all-cpu'
Requires-Dist: hippogriffe>=0.2; extra == 'all-cpu'
Requires-Dist: import-linter>=2.0; extra == 'all-cpu'
Requires-Dist: interrogate>=1.5; extra == 'all-cpu'
Requires-Dist: ipykernel>=6.29.5; extra == 'all-cpu'
Requires-Dist: jupyter>=1.1.1; extra == 'all-cpu'
Requires-Dist: jupytext>=1.16.6; extra == 'all-cpu'
Requires-Dist: mkdocs-include-exclude-files>=0.1; extra == 'all-cpu'
Requires-Dist: mkdocs-ipynb>=0.1; extra == 'all-cpu'
Requires-Dist: mkdocs-jupyter>=0.24; extra == 'all-cpu'
Requires-Dist: mkdocs-material>=9.6.7; extra == 'all-cpu'
Requires-Dist: mkdocs>=1.6.1; extra == 'all-cpu'
Requires-Dist: mkdocstrings-python>=1.1.2; extra == 'all-cpu'
Requires-Dist: mkdocstrings>=0.28.3; extra == 'all-cpu'
Requires-Dist: nbconvert>=7.16.4; extra == 'all-cpu'
Requires-Dist: pydeps>=1.12.17; extra == 'all-cpu'
Requires-Dist: pylint>=3.3; extra == 'all-cpu'
Requires-Dist: pymdown-extensions>=10.14.3; extra == 'all-cpu'
Requires-Dist: pyright>=1.1.336; extra == 'all-cpu'
Requires-Dist: pytest-asyncio>=0.23; extra == 'all-cpu'
Requires-Dist: pytest-benchmark>=4; extra == 'all-cpu'
Requires-Dist: pytest-cov>=6.1.1; extra == 'all-cpu'
Requires-Dist: pytest-env>=1.0.1; extra == 'all-cpu'
Requires-Dist: pytest-json-report>=1.5.0; extra == 'all-cpu'
Requires-Dist: pytest-randomly>=3.15; extra == 'all-cpu'
Requires-Dist: pytest-timeout>=2.1; extra == 'all-cpu'
Requires-Dist: pytest-xdist>=3.6; extra == 'all-cpu'
Requires-Dist: pytest>=8.3.5; extra == 'all-cpu'
Requires-Dist: python-dotenv>=1; extra == 'all-cpu'
Requires-Dist: radon>=6.0; extra == 'all-cpu'
Requires-Dist: ruff>=0.1.5; extra == 'all-cpu'
Requires-Dist: tensorboard>=2.16; extra == 'all-cpu'
Requires-Dist: twine>=4.0.2; extra == 'all-cpu'
Requires-Dist: vulture>=2.14; extra == 'all-cpu'
Requires-Dist: wemake-python-styleguide>=1.0; extra == 'all-cpu'
Provides-Extra: all-macos
Requires-Dist: bandit[toml]>=1.8.6; extra == 'all-macos'
Requires-Dist: beartype>=0.14.1; extra == 'all-macos'
Requires-Dist: build>=1.0.3; extra == 'all-macos'
Requires-Dist: coverage>=7; extra == 'all-macos'
Requires-Dist: deadcode>=2.4; extra == 'all-macos'
Requires-Dist: deptry>=0.23; extra == 'all-macos'
Requires-Dist: flake8-functions-names>=0.4; extra == 'all-macos'
Requires-Dist: flake8>=7.0; extra == 'all-macos'
Requires-Dist: griffe>=1.7.3; extra == 'all-macos'
Requires-Dist: hippogriffe>=0.2; extra == 'all-macos'
Requires-Dist: import-linter>=2.0; extra == 'all-macos'
Requires-Dist: interrogate>=1.5; extra == 'all-macos'
Requires-Dist: ipykernel>=6.29.5; extra == 'all-macos'
Requires-Dist: jax-metal>=0.1.0; (sys_platform == 'darwin' and platform_machine == 'arm64') and extra == 'all-macos'
Requires-Dist: jupyter>=1.1.1; extra == 'all-macos'
Requires-Dist: jupytext>=1.16.6; extra == 'all-macos'
Requires-Dist: mkdocs-include-exclude-files>=0.1; extra == 'all-macos'
Requires-Dist: mkdocs-ipynb>=0.1; extra == 'all-macos'
Requires-Dist: mkdocs-jupyter>=0.24; extra == 'all-macos'
Requires-Dist: mkdocs-material>=9.6.7; extra == 'all-macos'
Requires-Dist: mkdocs>=1.6.1; extra == 'all-macos'
Requires-Dist: mkdocstrings-python>=1.1.2; extra == 'all-macos'
Requires-Dist: mkdocstrings>=0.28.3; extra == 'all-macos'
Requires-Dist: nbconvert>=7.16.4; extra == 'all-macos'
Requires-Dist: pydeps>=1.12.17; extra == 'all-macos'
Requires-Dist: pylint>=3.3; extra == 'all-macos'
Requires-Dist: pymdown-extensions>=10.14.3; extra == 'all-macos'
Requires-Dist: pyright>=1.1.336; extra == 'all-macos'
Requires-Dist: pytest-asyncio>=0.23; extra == 'all-macos'
Requires-Dist: pytest-benchmark>=4; extra == 'all-macos'
Requires-Dist: pytest-cov>=6.1.1; extra == 'all-macos'
Requires-Dist: pytest-env>=1.0.1; extra == 'all-macos'
Requires-Dist: pytest-json-report>=1.5.0; extra == 'all-macos'
Requires-Dist: pytest-randomly>=3.15; extra == 'all-macos'
Requires-Dist: pytest-timeout>=2.1; extra == 'all-macos'
Requires-Dist: pytest-xdist>=3.6; extra == 'all-macos'
Requires-Dist: pytest>=8.3.5; extra == 'all-macos'
Requires-Dist: python-dotenv>=1; extra == 'all-macos'
Requires-Dist: radon>=6.0; extra == 'all-macos'
Requires-Dist: ruff>=0.1.5; extra == 'all-macos'
Requires-Dist: tensorboard>=2.16; extra == 'all-macos'
Requires-Dist: twine>=4.0.2; extra == 'all-macos'
Requires-Dist: vulture>=2.14; extra == 'all-macos'
Requires-Dist: wemake-python-styleguide>=1.0; extra == 'all-macos'
Provides-Extra: cuda-dev
Requires-Dist: bandit[toml]>=1.8.6; extra == 'cuda-dev'
Requires-Dist: beartype>=0.14.1; extra == 'cuda-dev'
Requires-Dist: build>=1.0.3; extra == 'cuda-dev'
Requires-Dist: coverage>=7; extra == 'cuda-dev'
Requires-Dist: deadcode>=2.4; extra == 'cuda-dev'
Requires-Dist: deptry>=0.23; extra == 'cuda-dev'
Requires-Dist: flake8-functions-names>=0.4; extra == 'cuda-dev'
Requires-Dist: flake8>=7.0; extra == 'cuda-dev'
Requires-Dist: import-linter>=2.0; extra == 'cuda-dev'
Requires-Dist: interrogate>=1.5; extra == 'cuda-dev'
Requires-Dist: ipykernel>=6.29.5; extra == 'cuda-dev'
Requires-Dist: jax[cuda12]==0.9.1; (sys_platform == 'linux') and extra == 'cuda-dev'
Requires-Dist: jaxlib==0.9.1; (sys_platform == 'linux') and extra == 'cuda-dev'
Requires-Dist: jupyter>=1.1.1; extra == 'cuda-dev'
Requires-Dist: jupytext>=1.16.6; extra == 'cuda-dev'
Requires-Dist: nbconvert>=7.16.4; extra == 'cuda-dev'
Requires-Dist: nvidia-cublas-cu12==12.8.4.1; (sys_platform == 'linux') and extra == 'cuda-dev'
Requires-Dist: nvidia-cuda-cupti-cu12==12.8.90; (sys_platform == 'linux') and extra == 'cuda-dev'
Requires-Dist: nvidia-cuda-nvcc-cu12==12.9.86; (sys_platform == 'linux') and extra == 'cuda-dev'
Requires-Dist: nvidia-cuda-nvrtc-cu12==12.8.93; (sys_platform == 'linux') and extra == 'cuda-dev'
Requires-Dist: nvidia-cuda-runtime-cu12==12.8.90; (sys_platform == 'linux') and extra == 'cuda-dev'
Requires-Dist: nvidia-cudnn-cu12==9.10.2.21; (sys_platform == 'linux') and extra == 'cuda-dev'
Requires-Dist: nvidia-cufft-cu12==11.3.3.83; (sys_platform == 'linux') and extra == 'cuda-dev'
Requires-Dist: nvidia-cusolver-cu12==11.7.3.90; (sys_platform == 'linux') and extra == 'cuda-dev'
Requires-Dist: nvidia-cusparse-cu12==12.5.8.93; (sys_platform == 'linux') and extra == 'cuda-dev'
Requires-Dist: nvidia-nccl-cu12==2.27.5; (sys_platform == 'linux') and extra == 'cuda-dev'
Requires-Dist: nvidia-nvjitlink-cu12==12.8.93; (sys_platform == 'linux') and extra == 'cuda-dev'
Requires-Dist: nvidia-nvshmem-cu12==3.4.5; (sys_platform == 'linux') and extra == 'cuda-dev'
Requires-Dist: pydeps>=1.12.17; extra == 'cuda-dev'
Requires-Dist: pylint>=3.3; extra == 'cuda-dev'
Requires-Dist: pyright>=1.1.336; extra == 'cuda-dev'
Requires-Dist: pytest-asyncio>=0.23; extra == 'cuda-dev'
Requires-Dist: pytest-benchmark>=4; extra == 'cuda-dev'
Requires-Dist: pytest-cov>=6.1.1; extra == 'cuda-dev'
Requires-Dist: pytest-env>=1.0.1; extra == 'cuda-dev'
Requires-Dist: pytest-json-report>=1.5.0; extra == 'cuda-dev'
Requires-Dist: pytest-randomly>=3.15; extra == 'cuda-dev'
Requires-Dist: pytest-timeout>=2.1; extra == 'cuda-dev'
Requires-Dist: pytest-xdist>=3.6; extra == 'cuda-dev'
Requires-Dist: pytest>=8.3.5; extra == 'cuda-dev'
Requires-Dist: python-dotenv>=1; extra == 'cuda-dev'
Requires-Dist: radon>=6.0; extra == 'cuda-dev'
Requires-Dist: ruff>=0.1.5; extra == 'cuda-dev'
Requires-Dist: tensorboard>=2.16; extra == 'cuda-dev'
Requires-Dist: twine>=4.0.2; extra == 'cuda-dev'
Requires-Dist: vulture>=2.14; extra == 'cuda-dev'
Requires-Dist: wemake-python-styleguide>=1.0; extra == 'cuda-dev'
Provides-Extra: cuda12
Requires-Dist: jax[cuda12]==0.9.1; (sys_platform == 'linux') and extra == 'cuda12'
Requires-Dist: jaxlib==0.9.1; (sys_platform == 'linux') and extra == 'cuda12'
Requires-Dist: nvidia-cublas-cu12==12.8.4.1; (sys_platform == 'linux') and extra == 'cuda12'
Requires-Dist: nvidia-cuda-cupti-cu12==12.8.90; (sys_platform == 'linux') and extra == 'cuda12'
Requires-Dist: nvidia-cuda-nvcc-cu12==12.9.86; (sys_platform == 'linux') and extra == 'cuda12'
Requires-Dist: nvidia-cuda-nvrtc-cu12==12.8.93; (sys_platform == 'linux') and extra == 'cuda12'
Requires-Dist: nvidia-cuda-runtime-cu12==12.8.90; (sys_platform == 'linux') and extra == 'cuda12'
Requires-Dist: nvidia-cudnn-cu12==9.10.2.21; (sys_platform == 'linux') and extra == 'cuda12'
Requires-Dist: nvidia-cufft-cu12==11.3.3.83; (sys_platform == 'linux') and extra == 'cuda12'
Requires-Dist: nvidia-cusolver-cu12==11.7.3.90; (sys_platform == 'linux') and extra == 'cuda12'
Requires-Dist: nvidia-cusparse-cu12==12.5.8.93; (sys_platform == 'linux') and extra == 'cuda12'
Requires-Dist: nvidia-nccl-cu12==2.27.5; (sys_platform == 'linux') and extra == 'cuda12'
Requires-Dist: nvidia-nvjitlink-cu12==12.8.93; (sys_platform == 'linux') and extra == 'cuda12'
Requires-Dist: nvidia-nvshmem-cu12==3.4.5; (sys_platform == 'linux') and extra == 'cuda12'
Provides-Extra: dev
Requires-Dist: bandit[toml]>=1.8.6; extra == 'dev'
Requires-Dist: build>=1.0.3; extra == 'dev'
Requires-Dist: coverage>=7; extra == 'dev'
Requires-Dist: deadcode>=2.4; extra == 'dev'
Requires-Dist: deptry>=0.23; extra == 'dev'
Requires-Dist: flake8-functions-names>=0.4; extra == 'dev'
Requires-Dist: flake8>=7.0; extra == 'dev'
Requires-Dist: import-linter>=2.0; extra == 'dev'
Requires-Dist: interrogate>=1.5; extra == 'dev'
Requires-Dist: ipykernel>=6.29.5; extra == 'dev'
Requires-Dist: jupyter>=1.1.1; extra == 'dev'
Requires-Dist: jupytext>=1.16.6; extra == 'dev'
Requires-Dist: nbconvert>=7.16.4; extra == 'dev'
Requires-Dist: pydeps>=1.12.17; extra == 'dev'
Requires-Dist: pylint>=3.3; extra == 'dev'
Requires-Dist: pyright>=1.1.336; extra == 'dev'
Requires-Dist: pytest-asyncio>=0.23; extra == 'dev'
Requires-Dist: pytest-benchmark>=4; extra == 'dev'
Requires-Dist: pytest-cov>=6.1.1; extra == 'dev'
Requires-Dist: pytest-env>=1.0.1; extra == 'dev'
Requires-Dist: pytest-json-report>=1.5.0; extra == 'dev'
Requires-Dist: pytest-randomly>=3.15; extra == 'dev'
Requires-Dist: pytest-timeout>=2.1; extra == 'dev'
Requires-Dist: pytest-xdist>=3.6; extra == 'dev'
Requires-Dist: pytest>=8.3.5; extra == 'dev'
Requires-Dist: python-dotenv>=1; extra == 'dev'
Requires-Dist: radon>=6.0; extra == 'dev'
Requires-Dist: ruff>=0.1.5; extra == 'dev'
Requires-Dist: tensorboard>=2.16; extra == 'dev'
Requires-Dist: twine>=4.0.2; extra == 'dev'
Requires-Dist: vulture>=2.14; extra == 'dev'
Requires-Dist: wemake-python-styleguide>=1.0; extra == 'dev'
Provides-Extra: docs
Requires-Dist: griffe>=1.7.3; extra == 'docs'
Requires-Dist: hippogriffe>=0.2; extra == 'docs'
Requires-Dist: mkdocs-include-exclude-files>=0.1; extra == 'docs'
Requires-Dist: mkdocs-ipynb>=0.1; extra == 'docs'
Requires-Dist: mkdocs-jupyter>=0.24; extra == 'docs'
Requires-Dist: mkdocs-material>=9.6.7; extra == 'docs'
Requires-Dist: mkdocs>=1.6.1; extra == 'docs'
Requires-Dist: mkdocstrings-python>=1.1.2; extra == 'docs'
Requires-Dist: mkdocstrings>=0.28.3; extra == 'docs'
Requires-Dist: pymdown-extensions>=10.14.3; extra == 'docs'
Provides-Extra: logging
Requires-Dist: tensorboard>=2.16; extra == 'logging'
Provides-Extra: metal
Requires-Dist: jax-metal>=0.1.0; (sys_platform == 'darwin' and platform_machine == 'arm64') and extra == 'metal'
Provides-Extra: test
Requires-Dist: beartype>=0.14.1; extra == 'test'
Requires-Dist: coverage>=7; extra == 'test'
Requires-Dist: pytest-asyncio>=0.23; extra == 'test'
Requires-Dist: pytest-benchmark>=4; extra == 'test'
Requires-Dist: pytest-cov>=6.1.1; extra == 'test'
Requires-Dist: pytest-env>=1.0.1; extra == 'test'
Requires-Dist: pytest-json-report>=1.5.0; extra == 'test'
Requires-Dist: pytest-timeout>=2.1; extra == 'test'
Requires-Dist: pytest-xdist>=3.6; extra == 'test'
Requires-Dist: pytest>=8.3.5; extra == 'test'
Description-Content-Type: text/markdown

# Artifex

<div align="center">

[![Python](https://img.shields.io/badge/Python-3.11%2B-blue)](https://www.python.org/)
[![JAX](https://img.shields.io/badge/JAX-0.4%2B-green)](https://github.com/google/jax)
[![Flax](https://img.shields.io/badge/Flax-NNX-orange)](https://github.com/google/flax)
[![License](https://img.shields.io/badge/License-MIT-yellow)](LICENSE)

## A research-focused modular generative modeling library built on JAX/Flax NNX

From Latin "artifex": craftsman, artist, maker.

[Documentation](https://docs.avitai.bio/artifex) • [Getting Started](docs/getting-started/installation.md) • [Examples](docs/examples/index.md) • [Contributing](CONTRIBUTING.md)

</div>

---

> **⚠️ Major Refactoring in Progress**
>
> Artifex is still in a heavy rebuild cycle. Stability is not guaranteed, and breaking changes are expected between commits.
>
> | Area | Status | Current expectation |
> |------|--------|---------------------|
> | **API surface** | Unstable | Public interfaces can change without deprecation while runtime boundaries are still being simplified. |
> | **Performance** | In progress | Optimization work is ongoing across training, inference, and benchmark paths. Do not assume current throughput or memory behavior is final. |
> | **Feature breadth** | Expanding | Core model families ship today, but additional capabilities, deeper integrations, and broader examples are still being added. |
> | **Docs and workflows** | Maintained but evolving | Checked-in installation, quickstart, examples, and contributor workflows are kept aligned with the live runtime, while broader documentation continues to be revised. |
>
> Artifex is suitable for active research and repository development. It is not in a state where long-term API stability or production guarantees should be assumed.

---

## Overview

Artifex is a modular library for generative modeling research, providing implementations of various state-of-the-art generative models with a focus on modularity, type safety, and scientific reproducibility. Built on JAX and Flax NNX, it emphasizes clean abstractions and extensible design for research experimentation.

### Why Artifex?

- **Research First**: Designed for experimentation with clean, modular architecture
- **Modern Stack**: Built on JAX/Flax NNX with full JIT compilation and automatic differentiation
- **Typed Surfaces**: Protocol-based design with Pyright-checked source interfaces
- **Multi-Modal**: Unified interface across images, text, audio, proteins, and more
- **Extensible**: Easy to add new models, losses, and domain-specific constraints
- **Actively Verified**: Blocking CI enforces repository contracts, packaging checks, and focused test suites

## Design Philosophy

### Research-Focused

Artifex prioritizes:

- **Modularity**: Easy to swap components and experiment
- **Clarity**: Clean, readable implementations over clever optimizations
- **Extensibility**: Simple to add new models and functionality
- **Reproducibility**: Deterministic with clear configuration management

### Technical Principles

- **Type Checking**: Pyright basic-mode reports track the supported source surface while repo-wide blocking enforcement is still being rebuilt
- **JAX Native**: Leverages JAX's functional programming paradigm
- **Flax NNX**: Modern object-oriented API for neural networks
- **Configuration Management**: Frozen dataclass configs with validation
- **Testing**: Blocking CI enforces repository contracts and a 70% repo-wide coverage floor while new changes target 80% coverage

See [Design Philosophy](docs/development/philosophy.md) for detailed discussion.

## Features

### Generative Models

- **VAE Family**: VAE, β-VAE, VQ-VAE, Conditional VAE
- **GAN Family**: DCGAN, WGAN, StyleGAN, CycleGAN, PatchGAN
- **Diffusion Models**: DDPM, DDIM, Score-based models, DiT, Latent Diffusion
- **Normalizing Flows**: RealNVP, Glow, MAF, IAF, Neural Spline Flows
- **Energy-Based Models**: Langevin dynamics, MCMC sampling with BlackJAX
- **Autoregressive Models**: PixelCNN, WaveNet, Transformer-based
- **Geometric Models**: Point clouds, meshes, protein structures, SE(3) molecular flows

### Modality Support

- **Image**: Multi-scale architectures, various loss functions, quality metrics
- **Text**: Tokenization, language modeling, text generation
- **Audio**: Spectral processing, waveform generation, WaveNet
- **Protein**: Structure generation with physical constraints
- **Tabular**: Mixed data types, privacy-preserving generation
- **Timeseries**: Sequential patterns, temporal dynamics
- **Multi-Modal**: Cross-modal generation and alignment

### Core Components

- **Unified Configuration**: Frozen dataclass configs with nested validation
- **Protocol-Based Design**: Clear interfaces for models, trainers, and data
- **Modular Losses**: Composable loss functions (reconstruction, adversarial, perceptual)
- **Flexible Sampling**: Multiple sampling strategies (ancestral, MCMC, ODE/SDE)
- **Extension System**: Domain-specific constraints and functionality
- **Evaluation Framework**: Standardized metrics and benchmarks with CalibraX-aligned composition

## Quick Start

### Installation

```bash
# Package users
pip install avitai-artifex

# Optional Linux NVIDIA GPU support
pip install "avitai-artifex[cuda12]"
```

The PyPI distribution is named `avitai-artifex`; the Python import package remains
`artifex`.

If you are contributing from a source checkout instead:

```bash
git clone https://github.com/avitai/artifex.git
cd artifex

# Run setup script (creates .venv, syncs extras, chooses a backend policy)
./setup.sh

# Activate the environment (must use 'source')
source ./activate.sh
```

The setup script automatically:

- Detects an appropriate backend policy
- Creates a virtual environment with uv
- Syncs the right extras for CPU, CUDA 12, or Metal development
- Writes a generated `.artifex.env` file and leaves `.env` for user-owned overrides
- Re-sourcing `activate.sh` refreshes the managed backend state before applying user overrides

For an explicit choice, use `./setup.sh --backend cpu`, `./setup.sh --backend cuda12`, or `./setup.sh --backend metal`.

If you need to rebuild from scratch, use `./setup.sh --recreate`. If you also want to clear repo-local test and coverage artifacts without touching user-owned `.env` files, use `./setup.sh --force-clean`.

For detailed package-user and source-checkout options, see the [Installation Guide](docs/getting-started/installation.md).

### Start with the checked-in VAE quickstart

The primary onboarding path is the live VAE quickstart under `docs/getting-started/quickstart.py` and `docs/getting-started/quickstart.ipynb`. It trains a VAE on MNIST with `TFDSEagerSource`, `VAETrainer`, and `train_epoch_staged`.

```python
from datarax.sources import TFDSEagerSource
from datarax.sources.tfds_source import TFDSEagerConfig
from artifex.generative_models.core.configuration import DecoderConfig, EncoderConfig, VAEConfig
from artifex.generative_models.models.vae import VAE
from artifex.generative_models.training import train_epoch_staged
from artifex.generative_models.training.trainers import VAETrainer, VAETrainingConfig
```

From a source checkout, run the maintained quickstart pair directly:

```bash
uv run python docs/getting-started/quickstart.py
uv run jupyter lab docs/getting-started/quickstart.ipynb
```

For the full walkthrough, see the [Quickstart Guide](docs/getting-started/quickstart.md).

## Documentation

### Start Here

- [Installation Guide](docs/getting-started/installation.md) - Environment setup, backend policy, and package installation
- [Quickstart Guide](docs/getting-started/quickstart.md) - VAE-first onboarding on MNIST
- [Core Concepts](docs/getting-started/core-concepts.md) - Architecture, configuration, and runtime model

### User and API Guides

- [Examples Catalog](docs/examples/index.md) - Executable and documented example inventory
- [Benchmarks](docs/benchmarks/index.md) - Evaluation suites and benchmark guidance
- [Model Guides](docs/user-guide/models/vae-guide.md) - User-facing guides across model families
- [Core API](docs/api/core/base.md) - Core runtime and protocol surfaces
- [Models API](docs/api/models/vae.md) - Model-family API reference
- [Training API](docs/api/training/trainer.md) - Training and optimization surfaces

### Contributor References

- [Contributing Guide](CONTRIBUTING.md) - Setup, workflow, and contribution expectations
- [Testing Guide](TESTING.md) - Supported pytest workflow and backend guidance
- [Example Documentation Design](docs/development/example-documentation-design.md) - Reader-facing example standards
- [Planned Modules](docs/roadmap/planned-modules.md) - Areas that remain intentionally unshipped or planned

## Architecture

Artifex keeps the public package surface relatively small at the top level and concentrates most runtime code under `artifex.generative_models`.

```text
artifex/
├── src/artifex/
│   ├── benchmarks/         # Benchmark foundations, adapters, datasets, and suites
│   ├── cli/                # Supported `artifex` command-line entrypoint
│   ├── configs/            # Checked-in config defaults and loader utilities
│   ├── data/               # Shared data helpers and retained dataset surfaces
│   ├── generative_models/
│   │   ├── core/           # Configuration, protocols, losses, layers, sampling, evaluation
│   │   ├── extensions/     # Audio, chemical, NLP, protein, and vision extensions
│   │   ├── factory/        # Canonical model creation surface
│   │   ├── inference/      # Inference and optimization helpers
│   │   ├── modalities/     # Image, text, audio, protein, tabular, timeseries, multimodal
│   │   ├── models/         # VAE, GAN, diffusion, flow, energy, autoregressive, geometric
│   │   ├── scaling/        # Distributed and scaling helpers
│   │   ├── training/       # Loops, callbacks, optimizers, schedulers, RL, trainers
│   │   ├── utils/          # Logging, JAX helpers, visualization, analysis utilities
│   │   └── zoo/            # Checked-in model zoo configs
│   ├── utils/              # Shared package utilities
│   └── visualization/      # Public visualization helpers
├── docs/                   # User, API, and contributor documentation
├── examples/               # Executable scripts and notebook pairs
└── tests/                  # Package, integration, unit, and repo-contract coverage
```

See [Architecture Overview](docs/core/architecture.md) for more detail.

## Development

### Verification workflow

```bash
# Standard test suite
uv run pytest

# Focused contract checks
uv run pytest tests/artifex/repo_contracts -q

# Docs validation
uv run python scripts/validate_docs.py --check-only --config-path mkdocs.yml --docs-path docs --src-path src
```

### Code quality

```bash
# Run the repository hooks
uv run pre-commit run --all-files

# Targeted quality tools
uv run ruff check src tests
uv run ruff format src tests
uv run pyright
```

See [Testing Guide](TESTING.md) and [Contributing Guide](CONTRIBUTING.md) for the maintained contributor workflow.

## Project Status

Artifex is in active alpha development.

- Checked-in installation, onboarding, example, and contributor guides are maintained against the live runtime.
- Blocking CI enforces repository contracts and build verification.
- Quality and security workflows remain reviewed but informational while broader release hardening continues.
- Package surfaces can still evolve between commits when a simpler or more truthful runtime design requires it.

Use the [Installation Guide](docs/getting-started/installation.md), [Quickstart Guide](docs/getting-started/quickstart.md), [Testing Guide](TESTING.md), and [Planned Modules](docs/roadmap/planned-modules.md) as the current source of truth for supported workflows.

## Contributing

Artifex accepts contributions through the standard repository workflow.

1. Clone the repository and run `./setup.sh`.
2. Activate the environment with `source ./activate.sh`.
3. Create a feature branch for the change.
4. Add or update tests and documentation with the code change.
5. Run `uv run pytest` and `uv run pre-commit run --all-files`.
6. Open a Pull Request.

See the [Contributing Guide](CONTRIBUTING.md) for the full contributor checklist and coding expectations.

## Citation

If you use Artifex in research, please cite:

```bibtex
@software{artifex_2025,
  title = {Artifex: Generative Modeling Research Library},
  author = {Shafiei, Mahdi and contributors},
  year = {2025},
  url = {https://github.com/avitai/artifex},
  version = {0.1.0}
}
```

## License

This project is licensed under the MIT License - see the [LICENSE](LICENSE) file for details.

## Acknowledgments

Artifex builds on several strong open-source projects:

- [JAX](https://github.com/google/jax) - Numerical computing and transformations
- [Flax](https://github.com/google/flax) - Neural network modules with NNX support
- [Optax](https://github.com/deepmind/optax) - Optimization utilities
- [Orbax](https://github.com/google/orbax) - Checkpointing
- [BlackJAX](https://github.com/blackjax-devs/blackjax) - MCMC and energy-based sampling
- [CalibraX](https://github.com/avitai/calibrax) - Evaluation and benchmark composition
- [DataRax](https://github.com/avitai/datarax) - Dataset and source adapters used in onboarding workflows

---

<div align="center">

**[Documentation](https://docs.avitai.bio/artifex)** • **[GitHub](https://github.com/avitai/artifex)** • **[Issues](https://github.com/avitai/artifex/issues)**

</div>
