| [project] | |
| name = "sstvae" | |
| version = "0.1.0" | |
| description = "Hybrid-digital SSTV: image transmission over HF via radio-autoencoder latents on OFDM" | |
| requires-python = ">=3.10" | |
| dependencies = [ | |
| "numpy>=1.24", | |
| "scipy>=1.10", | |
| "pillow>=10.0", | |
| ] | |
| [project.optional-dependencies] | |
| # Encode/decode/simulate from the command line. torch is needed because | |
| # the encoder and decoder *are* the image codec -- only sstvae_simulate.py | |
| # runs on the base deps alone. | |
| cli = [ | |
| "torch>=2.0", | |
| "huggingface_hub>=0.20", | |
| ] | |
| # Live receive off a soundcard: everything in `cli`, plus PortAudio | |
| # bindings and the waterfall/preview window. | |
| listen = [ | |
| "torch>=2.0", | |
| "huggingface_hub>=0.20", | |
| "sounddevice>=0.4.6", | |
| "matplotlib>=3.7", | |
| ] | |
| train = [ | |
| "torch>=2.13.0", | |
| "lpips>=0.1.4", | |
| "datasets>=2.18", | |
| "trackio", | |
| ] | |
| dev = [ | |
| "pytest>=8.0", | |
| ] | |
| # ROCm torch wheels (RX 9070 XT / gfx1201), local dev only — explicit so | |
| # cloud/CUDA machines resolve torch from PyPI instead. Local install: | |
| # uv pip install --reinstall --index-url https://download.pytorch.org/whl/rocm7.2 torch torchvision | |
| # NOTE: `uv sync`/`uv add` will replace the ROCm build with plain PyPI | |
| # torch (uv.lock pins it); re-run the install command above afterwards. | |
| [[tool.uv.index]] | |
| name = "pytorch-rocm" | |
| url = "https://download.pytorch.org/whl/rocm7.2" | |
| explicit = true | |
| [[tool.uv.index]] | |
| name = "rocm-nightlies" | |
| url = "https://rocm.nightlies.amd.com/v2/gfx120X-all/" | |
| explicit = true | |
| [build-system] | |
| requires = ["setuptools>=68"] | |
| build-backend = "setuptools.build_meta" | |
| [tool.setuptools.packages.find] | |
| include = ["sstvae*"] | |
| [tool.pytest.ini_options] | |
| testpaths = ["tests"] | |
| # The listener state-machine tests synthesize whole transmissions and run | |
| # the real decode loop over them, so they take minutes rather than the | |
| # ~2 s the rest of the suite does. Excluded by default to keep `pytest` | |
| # the fast check it is documented as; run them with `pytest -m slow`. | |
| markers = ["slow: multi-minute end-to-end tests (run with -m slow)"] | |
| addopts = "-m 'not slow'" | |