Metadata-Version: 2.4
Name: opifex
Version: 0.1.0
Summary: Opifex Computational Framework - JAX-native platform for scientific machine learning
Author-email: Opifex Team <opifex@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
Classifier: Development Status :: 3 - Alpha
Classifier: Intended Audience :: Science/Research
Classifier: License :: OSI Approved :: MIT License
Classifier: Programming Language :: Python :: 3
Classifier: Topic :: Scientific/Engineering :: Artificial Intelligence
Requires-Python: >=3.11
Requires-Dist: avitai-artifex>=0.1.0
Requires-Dist: beartype>=0.15.0
Requires-Dist: blackjax>=1.2.5
Requires-Dist: calibrax>=0.1.1
Requires-Dist: datarax>=0.1.3
Requires-Dist: diffrax>=0.4.0
Requires-Dist: distrax<0.2.0,>=0.1.0
Requires-Dist: flax>=0.12.0
Requires-Dist: jax>=0.8.0
Requires-Dist: jaxtyping>=0.2.20
Requires-Dist: lineax>=0.0.8
Requires-Dist: matplotlib>=3.7.0
Requires-Dist: numpy>=1.24.0
Requires-Dist: optax>=0.2.6
Requires-Dist: optimistix>=0.0.10
Requires-Dist: orbax-checkpoint>=0.11.13
Requires-Dist: plotly>=5.15.0
Requires-Dist: pydantic>=2.0.0
Requires-Dist: pyyaml>=6.0.2
Requires-Dist: scipy>=1.10.0
Requires-Dist: tensorly>=0.9.0
Requires-Dist: tf-keras>=2.19.0
Requires-Dist: tfp-nightly==0.26.0.dev20251024
Requires-Dist: tqdm>=4.67.1
Requires-Dist: typer>=0.9.0
Requires-Dist: typing-extensions>=4.5.0
Provides-Extra: all
Requires-Dist: alembic>=1.13.0; extra == 'all'
Requires-Dist: asyncpg>=0.29.0; extra == 'all'
Requires-Dist: bandit>=1.7.5; extra == 'all'
Requires-Dist: beartype>=0.14.1; extra == 'all'
Requires-Dist: build>=1.0.3; extra == 'all'
Requires-Dist: coverage>=7.9.2; extra == 'all'
Requires-Dist: fastapi>=0.115.13; extra == 'all'
Requires-Dist: grain>=0.2.3; extra == 'all'
Requires-Dist: griffe>=1.7.3; extra == 'all'
Requires-Dist: h5py>=3.8.0; extra == 'all'
Requires-Dist: hippogriffe>=0.2; extra == 'all'
Requires-Dist: ipykernel>=6.29.5; extra == 'all'
Requires-Dist: jax[cuda12-local]==0.8.0; extra == 'all'
Requires-Dist: jaxlib==0.8.0; extra == 'all'
Requires-Dist: jupytext>=1.16.0; extra == 'all'
Requires-Dist: meshio>=5.3.0; 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: nvidia-cublas-cu12>=12.6; extra == 'all'
Requires-Dist: nvidia-cuda-cupti-cu12>=12.6; extra == 'all'
Requires-Dist: nvidia-cuda-nvcc-cu12>=12.6; extra == 'all'
Requires-Dist: nvidia-cuda-nvrtc-cu12>=12.6; extra == 'all'
Requires-Dist: nvidia-cuda-runtime-cu12>=12.6; extra == 'all'
Requires-Dist: nvidia-cudnn-cu12>=9.1; extra == 'all'
Requires-Dist: nvidia-cufft-cu12>=11.4; extra == 'all'
Requires-Dist: nvidia-curand-cu12>=10.3; extra == 'all'
Requires-Dist: nvidia-cusolver-cu12>=11.7; extra == 'all'
Requires-Dist: nvidia-cusparse-cu12>=12.3; extra == 'all'
Requires-Dist: nvidia-nccl-cu12>=2.20; extra == 'all'
Requires-Dist: nvidia-nvjitlink-cu12>=12.6; extra == 'all'
Requires-Dist: nvidia-nvtx-cu12>=12.6; extra == 'all'
Requires-Dist: pgcli>=4.0.0; extra == 'all'
Requires-Dist: pip-audit>=2.6.0; extra == 'all'
Requires-Dist: pre-commit>=4.2.0; extra == 'all'
Requires-Dist: prometheus-client>=0.22.1; extra == 'all'
Requires-Dist: psycopg2-binary>=2.9.0; extra == 'all'
Requires-Dist: pydeps>=1.12.17; extra == 'all'
Requires-Dist: pymdown-extensions>=10.14.3; extra == 'all'
Requires-Dist: pyright>=1.1.336; extra == 'all'
Requires-Dist: pytest-asyncio>=1.0.0; extra == 'all'
Requires-Dist: pytest-benchmark>=5.1.0; extra == 'all'
Requires-Dist: pytest-cov>=6.2.1; extra == 'all'
Requires-Dist: pytest-env>=1.1.5; 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.4.0; extra == 'all'
Requires-Dist: pytest-xdist>=3.8.0; extra == 'all'
Requires-Dist: pytest>=8.4.1; extra == 'all'
Requires-Dist: python-dotenv>=1; extra == 'all'
Requires-Dist: radon>=6.0; extra == 'all'
Requires-Dist: redis>=6.2.0; extra == 'all'
Requires-Dist: rich>=14.0.0; extra == 'all'
Requires-Dist: ruff>=0.1.5; extra == 'all'
Requires-Dist: sqlalchemy>=2.0.0; extra == 'all'
Requires-Dist: sqlalchemy[asyncio]>=2.0.0; extra == 'all'
Requires-Dist: tensorboard-plugin-profile>=2.20.6; extra == 'all'
Requires-Dist: tensorflow>=2.20.0; extra == 'all'
Requires-Dist: twine>=4.0.2; extra == 'all'
Requires-Dist: uvicorn[standard]>=0.34.3; extra == 'all'
Provides-Extra: all-cpu
Requires-Dist: bandit>=1.7.5; 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.9.2; extra == 'all-cpu'
Requires-Dist: griffe>=1.7.3; extra == 'all-cpu'
Requires-Dist: hippogriffe>=0.2; extra == 'all-cpu'
Requires-Dist: ipykernel>=6.29.5; extra == 'all-cpu'
Requires-Dist: jupytext>=1.16.0; extra == 'all-cpu'
Requires-Dist: meshio>=5.3.0; 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: pip-audit>=2.6.0; extra == 'all-cpu'
Requires-Dist: pre-commit>=4.2.0; extra == 'all-cpu'
Requires-Dist: pydeps>=1.12.17; 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>=1.0.0; extra == 'all-cpu'
Requires-Dist: pytest-benchmark>=5.1.0; extra == 'all-cpu'
Requires-Dist: pytest-cov>=6.2.1; extra == 'all-cpu'
Requires-Dist: pytest-env>=1.1.5; 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.4.0; extra == 'all-cpu'
Requires-Dist: pytest-xdist>=3.8.0; extra == 'all-cpu'
Requires-Dist: pytest>=8.4.1; extra == 'all-cpu'
Requires-Dist: python-dotenv>=1; extra == 'all-cpu'
Requires-Dist: radon>=6.0; extra == 'all-cpu'
Requires-Dist: rich>=14.0.0; extra == 'all-cpu'
Requires-Dist: ruff>=0.1.5; extra == 'all-cpu'
Requires-Dist: tensorboard-plugin-profile>=2.20.6; extra == 'all-cpu'
Requires-Dist: tensorflow>=2.20.0; extra == 'all-cpu'
Requires-Dist: twine>=4.0.2; extra == 'all-cpu'
Provides-Extra: all-macos
Requires-Dist: bandit>=1.7.5; 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.9.2; extra == 'all-macos'
Requires-Dist: griffe>=1.7.3; extra == 'all-macos'
Requires-Dist: hippogriffe>=0.2; extra == 'all-macos'
Requires-Dist: ipykernel>=6.29.5; extra == 'all-macos'
Requires-Dist: jax-metal>=0.1.0; extra == 'all-macos'
Requires-Dist: jupytext>=1.16.0; extra == 'all-macos'
Requires-Dist: meshio>=5.3.0; 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: pip-audit>=2.6.0; extra == 'all-macos'
Requires-Dist: pre-commit>=4.2.0; extra == 'all-macos'
Requires-Dist: pydeps>=1.12.17; 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>=1.0.0; extra == 'all-macos'
Requires-Dist: pytest-benchmark>=5.1.0; extra == 'all-macos'
Requires-Dist: pytest-cov>=6.2.1; extra == 'all-macos'
Requires-Dist: pytest-env>=1.1.5; 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.4.0; extra == 'all-macos'
Requires-Dist: pytest-xdist>=3.8.0; extra == 'all-macos'
Requires-Dist: pytest>=8.4.1; extra == 'all-macos'
Requires-Dist: python-dotenv>=1; extra == 'all-macos'
Requires-Dist: radon>=6.0; extra == 'all-macos'
Requires-Dist: rich>=14.0.0; extra == 'all-macos'
Requires-Dist: ruff>=0.1.5; extra == 'all-macos'
Requires-Dist: twine>=4.0.2; extra == 'all-macos'
Provides-Extra: cuda-dev
Requires-Dist: bandit>=1.7.5; extra == 'cuda-dev'
Requires-Dist: build>=1.0.3; extra == 'cuda-dev'
Requires-Dist: coverage>=7.9.2; extra == 'cuda-dev'
Requires-Dist: ipykernel>=6.29.5; extra == 'cuda-dev'
Requires-Dist: jax[cuda12-local]==0.8.0; extra == 'cuda-dev'
Requires-Dist: jaxlib==0.8.0; extra == 'cuda-dev'
Requires-Dist: jupytext>=1.16.0; extra == 'cuda-dev'
Requires-Dist: meshio>=5.3.0; extra == 'cuda-dev'
Requires-Dist: nvidia-cublas-cu12>=12.6; extra == 'cuda-dev'
Requires-Dist: nvidia-cuda-cupti-cu12>=12.6; extra == 'cuda-dev'
Requires-Dist: nvidia-cuda-nvcc-cu12>=12.6; extra == 'cuda-dev'
Requires-Dist: nvidia-cuda-nvrtc-cu12>=12.6; extra == 'cuda-dev'
Requires-Dist: nvidia-cuda-runtime-cu12>=12.6; extra == 'cuda-dev'
Requires-Dist: nvidia-cudnn-cu12>=9.1; extra == 'cuda-dev'
Requires-Dist: nvidia-cufft-cu12>=11.4; extra == 'cuda-dev'
Requires-Dist: nvidia-curand-cu12>=10.3; extra == 'cuda-dev'
Requires-Dist: nvidia-cusolver-cu12>=11.7; extra == 'cuda-dev'
Requires-Dist: nvidia-cusparse-cu12>=12.3; extra == 'cuda-dev'
Requires-Dist: nvidia-nccl-cu12>=2.20; extra == 'cuda-dev'
Requires-Dist: nvidia-nvjitlink-cu12>=12.6; extra == 'cuda-dev'
Requires-Dist: nvidia-nvtx-cu12>=12.6; extra == 'cuda-dev'
Requires-Dist: pip-audit>=2.6.0; extra == 'cuda-dev'
Requires-Dist: pre-commit>=4.2.0; extra == 'cuda-dev'
Requires-Dist: pydeps>=1.12.17; extra == 'cuda-dev'
Requires-Dist: pyright>=1.1.336; extra == 'cuda-dev'
Requires-Dist: pytest-asyncio>=1.0.0; extra == 'cuda-dev'
Requires-Dist: pytest-benchmark>=5.1.0; extra == 'cuda-dev'
Requires-Dist: pytest-cov>=6.2.1; extra == 'cuda-dev'
Requires-Dist: pytest-env>=1.1.5; 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.4.0; extra == 'cuda-dev'
Requires-Dist: pytest-xdist>=3.8.0; extra == 'cuda-dev'
Requires-Dist: pytest>=8.4.1; extra == 'cuda-dev'
Requires-Dist: python-dotenv>=1; extra == 'cuda-dev'
Requires-Dist: radon>=6.0; extra == 'cuda-dev'
Requires-Dist: rich>=14.0.0; extra == 'cuda-dev'
Requires-Dist: ruff>=0.1.5; extra == 'cuda-dev'
Requires-Dist: twine>=4.0.2; extra == 'cuda-dev'
Provides-Extra: dev
Requires-Dist: bandit>=1.7.5; extra == 'dev'
Requires-Dist: build>=1.0.3; extra == 'dev'
Requires-Dist: coverage>=7.9.2; extra == 'dev'
Requires-Dist: ipykernel>=6.29.5; extra == 'dev'
Requires-Dist: jupytext>=1.16.0; extra == 'dev'
Requires-Dist: meshio>=5.3.0; extra == 'dev'
Requires-Dist: pip-audit>=2.6.0; extra == 'dev'
Requires-Dist: pre-commit>=4.2.0; extra == 'dev'
Requires-Dist: pydeps>=1.12.17; extra == 'dev'
Requires-Dist: pyright>=1.1.336; extra == 'dev'
Requires-Dist: pytest-asyncio>=1.0.0; extra == 'dev'
Requires-Dist: pytest-benchmark>=5.1.0; extra == 'dev'
Requires-Dist: pytest-cov>=6.2.1; extra == 'dev'
Requires-Dist: pytest-env>=1.1.5; 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.4.0; extra == 'dev'
Requires-Dist: pytest-xdist>=3.8.0; extra == 'dev'
Requires-Dist: pytest>=8.4.1; extra == 'dev'
Requires-Dist: python-dotenv>=1; extra == 'dev'
Requires-Dist: radon>=6.0; extra == 'dev'
Requires-Dist: rich>=14.0.0; extra == 'dev'
Requires-Dist: ruff>=0.1.5; extra == 'dev'
Requires-Dist: twine>=4.0.2; 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: gpu
Requires-Dist: jax[cuda12-local]==0.8.0; extra == 'gpu'
Requires-Dist: jaxlib==0.8.0; extra == 'gpu'
Requires-Dist: nvidia-cublas-cu12>=12.6; extra == 'gpu'
Requires-Dist: nvidia-cuda-cupti-cu12>=12.6; extra == 'gpu'
Requires-Dist: nvidia-cuda-nvcc-cu12>=12.6; extra == 'gpu'
Requires-Dist: nvidia-cuda-nvrtc-cu12>=12.6; extra == 'gpu'
Requires-Dist: nvidia-cuda-runtime-cu12>=12.6; extra == 'gpu'
Requires-Dist: nvidia-cudnn-cu12>=9.1; extra == 'gpu'
Requires-Dist: nvidia-cufft-cu12>=11.4; extra == 'gpu'
Requires-Dist: nvidia-curand-cu12>=10.3; extra == 'gpu'
Requires-Dist: nvidia-cusolver-cu12>=11.7; extra == 'gpu'
Requires-Dist: nvidia-cusparse-cu12>=12.3; extra == 'gpu'
Requires-Dist: nvidia-nccl-cu12>=2.20; extra == 'gpu'
Requires-Dist: nvidia-nvjitlink-cu12>=12.6; extra == 'gpu'
Requires-Dist: nvidia-nvtx-cu12>=12.6; extra == 'gpu'
Provides-Extra: metal
Requires-Dist: jax-metal>=0.1.0; extra == 'metal'
Provides-Extra: neural-dft
Requires-Dist: ase>=3.22.0; extra == 'neural-dft'
Requires-Dist: h5py>=3.8.0; extra == 'neural-dft'
Requires-Dist: netcdf4>=1.6.0; extra == 'neural-dft'
Requires-Dist: pyscf>=2.3.0; extra == 'neural-dft'
Provides-Extra: opifex-dev
Requires-Dist: ase>=3.22.0; extra == 'opifex-dev'
Requires-Dist: bandit>=1.7.5; extra == 'opifex-dev'
Requires-Dist: basis-set-exchange>=0.9.0; extra == 'opifex-dev'
Requires-Dist: build>=1.0.3; extra == 'opifex-dev'
Requires-Dist: coverage>=7.9.2; extra == 'opifex-dev'
Requires-Dist: h5py>=3.8.0; extra == 'opifex-dev'
Requires-Dist: ipykernel>=6.29.5; extra == 'opifex-dev'
Requires-Dist: jax[cuda12-local]==0.8.0; extra == 'opifex-dev'
Requires-Dist: jaxlib==0.8.0; extra == 'opifex-dev'
Requires-Dist: jupytext>=1.16.0; extra == 'opifex-dev'
Requires-Dist: meshio>=5.3.0; extra == 'opifex-dev'
Requires-Dist: netcdf4>=1.6.0; extra == 'opifex-dev'
Requires-Dist: nvidia-cublas-cu12>=12.6; extra == 'opifex-dev'
Requires-Dist: nvidia-cuda-cupti-cu12>=12.6; extra == 'opifex-dev'
Requires-Dist: nvidia-cuda-nvcc-cu12>=12.6; extra == 'opifex-dev'
Requires-Dist: nvidia-cuda-nvrtc-cu12>=12.6; extra == 'opifex-dev'
Requires-Dist: nvidia-cuda-runtime-cu12>=12.6; extra == 'opifex-dev'
Requires-Dist: nvidia-cudnn-cu12>=9.1; extra == 'opifex-dev'
Requires-Dist: nvidia-cufft-cu12>=11.4; extra == 'opifex-dev'
Requires-Dist: nvidia-curand-cu12>=10.3; extra == 'opifex-dev'
Requires-Dist: nvidia-cusolver-cu12>=11.7; extra == 'opifex-dev'
Requires-Dist: nvidia-cusparse-cu12>=12.3; extra == 'opifex-dev'
Requires-Dist: nvidia-nccl-cu12>=2.20; extra == 'opifex-dev'
Requires-Dist: nvidia-nvjitlink-cu12>=12.6; extra == 'opifex-dev'
Requires-Dist: nvidia-nvtx-cu12>=12.6; extra == 'opifex-dev'
Requires-Dist: pip-audit>=2.6.0; extra == 'opifex-dev'
Requires-Dist: pre-commit>=4.2.0; extra == 'opifex-dev'
Requires-Dist: pydeps>=1.12.17; extra == 'opifex-dev'
Requires-Dist: pyright>=1.1.336; extra == 'opifex-dev'
Requires-Dist: pyscf>=2.3.0; extra == 'opifex-dev'
Requires-Dist: pytest-asyncio>=1.0.0; extra == 'opifex-dev'
Requires-Dist: pytest-benchmark>=5.1.0; extra == 'opifex-dev'
Requires-Dist: pytest-cov>=6.2.1; extra == 'opifex-dev'
Requires-Dist: pytest-env>=1.1.5; extra == 'opifex-dev'
Requires-Dist: pytest-json-report>=1.5.0; extra == 'opifex-dev'
Requires-Dist: pytest-randomly>=3.15; extra == 'opifex-dev'
Requires-Dist: pytest-timeout>=2.4.0; extra == 'opifex-dev'
Requires-Dist: pytest-xdist>=3.8.0; extra == 'opifex-dev'
Requires-Dist: pytest>=8.4.1; extra == 'opifex-dev'
Requires-Dist: python-dotenv>=1; extra == 'opifex-dev'
Requires-Dist: qcelemental>=0.25.0; extra == 'opifex-dev'
Requires-Dist: qcengine>=0.26.0; extra == 'opifex-dev'
Requires-Dist: radon>=6.0; extra == 'opifex-dev'
Requires-Dist: rich>=14.0.0; extra == 'opifex-dev'
Requires-Dist: ruff>=0.1.5; extra == 'opifex-dev'
Requires-Dist: twine>=4.0.2; extra == 'opifex-dev'
Provides-Extra: pdebench
Requires-Dist: h5py>=3.8.0; extra == 'pdebench'
Requires-Dist: hydra-core>=1.3.0; extra == 'pdebench'
Requires-Dist: pandas>=2.0.0; extra == 'pdebench'
Requires-Dist: torch>=2.0.0; extra == 'pdebench'
Provides-Extra: platform
Requires-Dist: alembic>=1.13.0; extra == 'platform'
Requires-Dist: asyncpg>=0.29.0; extra == 'platform'
Requires-Dist: fastapi>=0.115.13; extra == 'platform'
Requires-Dist: pgcli>=4.0.0; extra == 'platform'
Requires-Dist: prometheus-client>=0.22.1; extra == 'platform'
Requires-Dist: psycopg2-binary>=2.9.0; extra == 'platform'
Requires-Dist: redis>=6.2.0; extra == 'platform'
Requires-Dist: sqlalchemy>=2.0.0; extra == 'platform'
Requires-Dist: sqlalchemy[asyncio]>=2.0.0; extra == 'platform'
Requires-Dist: uvicorn[standard]>=0.34.3; extra == 'platform'
Provides-Extra: profiling
Requires-Dist: tensorboard-plugin-profile>=2.20.6; extra == 'profiling'
Requires-Dist: tensorflow>=2.20.0; extra == 'profiling'
Provides-Extra: quantum-chemistry
Requires-Dist: basis-set-exchange>=0.9.0; extra == 'quantum-chemistry'
Requires-Dist: qcelemental>=0.25.0; extra == 'quantum-chemistry'
Requires-Dist: qcengine>=0.26.0; extra == 'quantum-chemistry'
Provides-Extra: scientific-data
Requires-Dist: grain>=0.2.3; extra == 'scientific-data'
Requires-Dist: h5py>=3.8.0; extra == 'scientific-data'
Requires-Dist: meshio>=5.3.0; extra == 'scientific-data'
Provides-Extra: test
Requires-Dist: beartype>=0.14.1; extra == 'test'
Requires-Dist: coverage>=7.9.2; extra == 'test'
Requires-Dist: pytest-asyncio>=1.0.0; extra == 'test'
Requires-Dist: pytest-benchmark>=5.1.0; extra == 'test'
Requires-Dist: pytest-cov>=6.2.1; extra == 'test'
Requires-Dist: pytest-env>=1.1.5; extra == 'test'
Requires-Dist: pytest-json-report>=1.5.0; extra == 'test'
Requires-Dist: pytest-randomly>=3.15; extra == 'test'
Requires-Dist: pytest-timeout>=2.4.0; extra == 'test'
Requires-Dist: pytest-xdist>=3.8.0; extra == 'test'
Requires-Dist: pytest>=8.4.1; extra == 'test'
Description-Content-Type: text/markdown

# Opifex

<div align="center">

## A unified scientific machine learning framework built on JAX/Flax NNX

*From Latin "opifex" — worker, skilled maker*

[Documentation](docs/) • [Getting Started](docs/getting-started/installation.md) • [Examples](examples/) • [Contributing](docs/development/contributing.md)

</div>

---

<!-- CI/CD Status Badges -->
[![CI](https://github.com/avitai/opifex/actions/workflows/ci.yml/badge.svg)](https://github.com/avitai/opifex/actions/workflows/ci.yml)
[![Documentation](https://github.com/avitai/opifex/actions/workflows/docs.yml/badge.svg)](https://github.com/avitai/opifex/actions/workflows/docs.yml)
[![Security](https://github.com/avitai/opifex/actions/workflows/security.yml/badge.svg)](https://github.com/avitai/opifex/actions/workflows/security.yml)
[![codecov](https://codecov.io/gh/avitai/opifex/branch/main/graph/badge.svg)](https://codecov.io/gh/avitai/opifex)

<!-- Package & Distribution Badges -->
[![PyPI version](https://img.shields.io/pypi/v/opifex?color=blue&logo=pypi&logoColor=white)](https://pypi.org/project/opifex/)
[![Python versions](https://img.shields.io/pypi/pyversions/opifex?logo=python&logoColor=white)](https://pypi.org/project/opifex/)
[![Downloads](https://img.shields.io/pypi/dm/opifex?color=blue&logo=pypi&logoColor=white)](https://pypi.org/project/opifex/)

<!-- Social & Code Quality Badges -->
[![GitHub stars](https://img.shields.io/github/stars/avitai/opifex?style=social)](https://github.com/avitai/opifex/stargazers)
[![GitHub forks](https://img.shields.io/github/forks/avitai/opifex?style=social)](https://github.com/avitai/opifex/network/members)
[![pre-commit](https://img.shields.io/badge/pre--commit-enabled-brightgreen?logo=pre-commit&logoColor=white)](https://github.com/pre-commit/pre-commit)
[![Ruff](https://img.shields.io/endpoint?url=https://raw.githubusercontent.com/astral-sh/ruff/main/assets/badge/v2.json)](https://github.com/astral-sh/ruff)

<!-- Project Info Badges -->
[![License: MIT](https://img.shields.io/badge/License-MIT-yellow.svg)](https://opensource.org/licenses/MIT)
[![Python 3.11+](https://img.shields.io/badge/python-3.11+-blue.svg)](https://www.python.org/downloads/)
[![JAX](https://img.shields.io/badge/JAX-native-orange.svg)](https://jax.readthedocs.io/)
[![FLAX NNX](https://img.shields.io/badge/FLAX-NNX-green.svg)](https://flax.readthedocs.io/)
[![uv](https://img.shields.io/endpoint?url=https://raw.githubusercontent.com/astral-sh/uv/main/assets/badge/v0.json)](https://github.com/astral-sh/uv)

---

> **⚠️ Early Development - API Unstable**
>
> Opifex is currently in early development and undergoing rapid iteration. Please be aware of the following implications:
>
> | Area | Status | Impact |
> |------|--------|--------|
> | **API** | 🔄 Unstable | Breaking changes are expected. Public interfaces may change without deprecation warnings. Pin to specific commits if stability is required. |
> | **Tests** | 🔄 In Flux | Test suite is being expanded. Some tests may fail or be skipped. Coverage metrics are improving but not yet full. |
> | **Documentation** | 🔄 Evolving | Docs may not reflect current implementation. Code examples might be outdated. Refer to source code and tests for accurate usage. |
>
> We recommend waiting for a stable release (v1.0) before using Opifex in production. For research and experimentation, proceed with the understanding that APIs will evolve.

---

A **JAX-native platform** for scientific machine learning, built for unified excellence, probabilistic-first design, and high performance.

## 🎯 Core Vision

- **🔬 Unified Excellence**: Single platform supporting all major Opifex paradigms with mathematical clarity
- **📊 Probabilistic-First**: Built-in uncertainty quantification treating all computation as Bayesian inference
- **⚡ High Performance**: Optimized for speed with JAX transformations and GPU acceleration
- **🏗️ Production-Oriented**: Designed with benchmarking and deployment tools for future production use
- **🤝 Community-Driven**: Open patterns for education, research collaboration, and industrial adoption

## ✨ Key Features

- **Neural Operators**: FNO, DeepONet, SFNO, U-FNO, UNO, TFNO, GNO, PINO, Local FNO, and more (26 architectures)
- **Physics-Informed Neural Networks**: Standard PINNs plus domain decomposition (FBPINN, XPINN, CPINN)
- **Equation Discovery**: SINDy, Ensemble SINDy, and Weak SINDy for recovering governing equations from data
- **Field Operations**: JAX-native differential operators, advection, and pressure projection on structured grids
- **Uncertainty Quantification**: Bayesian FNO, UQNO, conformal prediction, and ensemble methods
- **Advanced Training**: NTK analysis, GradNorm loss balancing, adaptive sampling (RAR-D)
- **Optimization**: Learn-to-optimize, meta-optimization (MAML/Reptile), and second-order methods
- **Unified SciML Solvers**: Standardized protocol for PINNs, Neural Operators, and Hybrid solvers
- **Quantum Chemistry**: Neural DFT and neural exchange-correlation functionals
- **51 Working Examples**: Full coverage from getting started to advanced research workflows

For detailed feature documentation, see [Features](docs/features.md).

## 🚀 Quick Start

### Prerequisites

- Python 3.11+
- CUDA-compatible GPU (optional but recommended)

### Installation

```bash
# Clone the repository
git clone https://github.com/avitai/opifex.git
cd opifex

# Set up development environment
./setup.sh

# Activate environment
source ./activate.sh

# Run tests to verify installation
uv run pytest tests/ -v
```

For detailed installation instructions, see [Installation Guide](docs/getting-started/installation.md).

## 📚 Basic Usage

### Fourier Neural Operator (FNO)

```python
import jax
from flax import nnx
from opifex.neural.operators.fno import FourierNeuralOperator

# Create FNO for learning PDE solution operators
rngs = nnx.Rngs(jax.random.PRNGKey(0))

fno = FourierNeuralOperator(
    in_channels=1,
    out_channels=1,
    hidden_channels=32,
    modes=12,
    num_layers=4,
    rngs=rngs,
)

# Input: (batch, channels, *spatial_dims)
x = jax.random.normal(jax.random.PRNGKey(1), (4, 1, 64, 64))
y = fno(x)
print(f"FNO: {x.shape} -> {y.shape}")  # (4, 1, 64, 64) -> (4, 1, 64, 64)
```

### Deep Operator Network (DeepONet)

```python
import jax
from flax import nnx
from opifex.neural.operators.deeponet import DeepONet

# Create DeepONet for function-to-function mapping
rngs = nnx.Rngs(jax.random.PRNGKey(0))

deeponet = DeepONet(
    branch_sizes=[100, 64, 64, 32],  # 100 sensor locations
    trunk_sizes=[2, 64, 64, 32],     # 2D output coordinates
    activation="gelu",
    rngs=rngs,
)

# Branch input: function values at sensors (batch, num_sensors)
# Trunk input: evaluation coordinates (batch, n_locations, coord_dim)
branch_input = jax.random.normal(jax.random.PRNGKey(1), (8, 100))
trunk_input = jax.random.uniform(jax.random.PRNGKey(2), (8, 50, 2))  # 50 eval points

output = deeponet(branch_input, trunk_input)
print(f"DeepONet output: {output.shape}")  # (8, 50)
```

### Equation Discovery (SINDy)

```python
import jax.numpy as jnp
from opifex.discovery.sindy import SINDy, SINDyConfig

# Generate Lorenz trajectory (σ=10, ρ=28, β=8/3) with RK4
def lorenz(state, sigma=10.0, rho=28.0, beta=8.0 / 3.0):
    x, y, z = state
    return jnp.array([sigma * (y - x), x * (rho - z) - y, x * y - beta * z])

dt, state = 0.001, jnp.array([1.0, 1.0, 1.0])
trajectory, derivatives = [state], [lorenz(state)]
for _ in range(10000):
    k1 = lorenz(state)
    k2 = lorenz(state + 0.5 * dt * k1)
    k3 = lorenz(state + 0.5 * dt * k2)
    k4 = lorenz(state + dt * k3)
    state = state + (dt / 6.0) * (k1 + 2 * k2 + 2 * k3 + k4)
    trajectory.append(state)
    derivatives.append(lorenz(state))

# Discover governing equations from data
model = SINDy(SINDyConfig(polynomial_degree=2, threshold=0.3))
model.fit(jnp.stack(trajectory), jnp.stack(derivatives))

for eq in model.equations(["x", "y", "z"]):
    print(eq)
# dx/dt = -9.999 x + 10.000 y            (true: -10 x + 10 y)
# dy/dt = 28.000 x + -1.000 y + -1.000 x z  (true: 28 x - y - x z)
# dz/dt = -2.667 z + 1.000 x y            (true: -8/3 z + x y)
```

For full examples and tutorials, see the [Examples](examples/) directory and [Documentation](docs/).

## 🔧 Development

```bash
# Run tests
uv run pytest tests/ -v

# Code quality checks
uv run pre-commit run --all-files
```

For detailed development guidelines, see [Development Guide](docs/development/).

## 📖 Documentation

- **[Getting Started](docs/getting-started/)**: Installation and basic usage
- **[Features](docs/features.md)**: Complete feature overview
- **[Architecture](docs/architecture.md)**: Framework design and structure
- **[API Reference](docs/api/)**: Complete API documentation
- **[Examples](examples/)**: Working examples and tutorials
- **[Development](docs/development/)**: Contributing and development setup

## 🤝 Contributing

We welcome contributions! Please see our [Contributing Guide](docs/development/contributing.md) for details.

## 📄 License

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

---

**Ready to get started?** Check out our [Quick Start Guide](docs/getting-started/quickstart.md) or explore the [Examples](examples/) directory!
