From a82fae102d9b1315ae90a23bcc46a13c2989fb0b Mon Sep 17 00:00:00 2001 From: Vitalii Popov Date: Mon, 14 Sep 2026 18:05:01 +0200 Subject: [PATCH 1/3] MILAB-6679: add the 3.12.10-antibody-design python run environment MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit The Antibody Variant Designer block installs its whole python closure with pip on every run — AntiFold's torch stack, Sapiens, freesasa and promb, about 2 GiB of it — because no run environment carries that set. Both of its software packages pay the cost, on every executor, on every run. This names the closure once and ships it as an environment, so the block's software packages can drop `toolset: pip` and reference it instead. torch is declared per platform rather than in the shared list: the linux-x64 PyPI wheel requires twelve nvidia-* CUDA packages the block never uses, so that platform takes torch==2.2.2+cpu from the pytorch cpu index the shared config already registers. The other four take the plain pin, whose wheels are CPU builds. freesasa is built on the runner everywhere, copying the base 3.12.10 environment — it has never published a cp312 wheel. biotite is built on the runner for linux-aarch64 alone, the one platform with no wheel for any version. biotite is pinned at 0.39.0 rather than the block's 0.38.*: 0.38 predates cp312 and publishes nothing Python 3.12 can install, so holding that bound would mean a source build on all five platforms. The block's own bound moves with this. --- .changeset/antibody-design-runenv.md | 22 ++++ .github/workflows/build.yaml | 6 + catalogue/package.json | 6 +- pnpm-lock.yaml | 15 +++ pnpm-workspace.yaml | 1 + python-3.12.10-antibody-design/README.md | 28 ++++ python-3.12.10-antibody-design/config.json | 134 ++++++++++++++++++++ python-3.12.10-antibody-design/package.json | 43 +++++++ 8 files changed, 254 insertions(+), 1 deletion(-) create mode 100644 .changeset/antibody-design-runenv.md create mode 100644 python-3.12.10-antibody-design/README.md create mode 100644 python-3.12.10-antibody-design/config.json create mode 100644 python-3.12.10-antibody-design/package.json diff --git a/.changeset/antibody-design-runenv.md b/.changeset/antibody-design-runenv.md new file mode 100644 index 0000000..66b0824 --- /dev/null +++ b/.changeset/antibody-design-runenv.md @@ -0,0 +1,22 @@ +--- +"@platforma-open/milaboratories.runenv-python-3.12.10-antibody-design": minor +"@platforma-open/milaboratories.runenv-python-3": minor +--- + +Add the `3.12.10-antibody-design` Python run environment for the Antibody Variant Designer block: AntiFold +inverse folding (`torch`, `torch_geometric`), Sapiens humanness (`transformers`), SASA exposure (`freesasa`) +and `promb`, with the whole runtime closure pinned flat. + +Both of the block's software packages install this set with pip on every run today, about 2 GiB of it. Shipping +it as a run environment moves that cost to build time. + +torch is declared per platform. linux-x64 takes `torch==2.2.2+cpu` from `https://download.pytorch.org/whl/cpu`, +because the PyPI wheel pulls twelve `nvidia-*` CUDA packages this block never uses; the other platforms take +the plain pin, whose PyPI wheels are CPU builds already. + +`freesasa` is built on the runner for all five platforms — it publishes no cp312 wheel anywhere — following the +base `3.12.10` environment. `biotite` is built on the runner for linux-aarch64 only, which has no wheel for any +version. + +`biotite` is pinned at 0.39.0, not the 0.38.\* the block currently asks for: 0.38 publishes no wheel usable +under Python 3.12, so the block's own bound has to move with this. diff --git a/.github/workflows/build.yaml b/.github/workflows/build.yaml index c21da44..6e87fb8 100644 --- a/.github/workflows/build.yaml +++ b/.github/workflows/build.yaml @@ -113,6 +113,12 @@ jobs: {"os":"macos-15-large", "arch":"amd64", "selector":"./python-3.12.10-hilary"}, {"os":"windows-latest", "arch":"amd64", "selector":"./python-3.12.10-hilary"}, + {"os":"ubuntu-large-amd64", "arch":"amd64", "selector":"./python-3.12.10-antibody-design"}, + {"os":"ubuntu-large-arm64", "arch":"arm64", "selector":"./python-3.12.10-antibody-design"}, + {"os":"macos-15", "arch":"arm64", "selector":"./python-3.12.10-antibody-design"}, + {"os":"macos-15-large", "arch":"amd64", "selector":"./python-3.12.10-antibody-design"}, + {"os":"windows-latest", "arch":"amd64", "selector":"./python-3.12.10-antibody-design"}, + {"os":"ubuntu-large-arm64", "arch":"arm64", "selector":"./python-3.10.21-clustcr"}, {"os":"ubuntu-large-amd64", "arch":"amd64", "selector":"./python-3.10.21-clustcr"}, {"os":"macos-15", "arch":"arm64", "selector":"./python-3.10.21-clustcr"}, diff --git a/catalogue/package.json b/catalogue/package.json index dd719cb..fcc3bad 100644 --- a/catalogue/package.json +++ b/catalogue/package.json @@ -50,6 +50,9 @@ }, "3.12.10-hilary": { "reference": "@platforma-open/milaboratories.runenv-python-3.12.10-hilary/dist/tengo/software/main.sw.json" + }, + "3.12.10-antibody-design": { + "reference": "@platforma-open/milaboratories.runenv-python-3.12.10-antibody-design/dist/tengo/software/main.sw.json" } } }, @@ -70,7 +73,8 @@ "@platforma-open/milaboratories.runenv-python-3.12.10-clustering": "workspace:*", "@platforma-open/milaboratories.runenv-python-3.12.10-pgen": "workspace:*", "@platforma-open/milaboratories.runenv-python-3.10.21-clustcr": "workspace:*", - "@platforma-open/milaboratories.runenv-python-3.12.10-hilary": "workspace:*" + "@platforma-open/milaboratories.runenv-python-3.12.10-hilary": "workspace:*", + "@platforma-open/milaboratories.runenv-python-3.12.10-antibody-design": "workspace:*" }, "devDependencies": { "@platforma-sdk/package-builder": "catalog:" diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 7b89943..8fe6ccd 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -65,6 +65,9 @@ importers: '@platforma-open/milaboratories.runenv-python-3.12.10': specifier: workspace:* version: link:../python-3.12.10 + '@platforma-open/milaboratories.runenv-python-3.12.10-antibody-design': + specifier: workspace:* + version: link:../python-3.12.10-antibody-design '@platforma-open/milaboratories.runenv-python-3.12.10-atls': specifier: workspace:* version: link:../python-3.12.10-atls @@ -127,6 +130,18 @@ importers: specifier: 'catalog:' version: 4.20.6 + python-3.12.10-antibody-design: + devDependencies: + '@platforma-sdk/package-builder': + specifier: 'catalog:' + version: 3.10.7 + runenv-python-builder: + specifier: workspace:* + version: link:../builder + tsx: + specifier: 'catalog:' + version: 4.20.6 + python-3.12.10-atls: devDependencies: '@platforma-sdk/package-builder': diff --git a/pnpm-workspace.yaml b/pnpm-workspace.yaml index 9bd3271..5c1e654 100644 --- a/pnpm-workspace.yaml +++ b/pnpm-workspace.yaml @@ -12,6 +12,7 @@ packages: - python-3.12.10-torch-cuda - python-3.12.10-clustering - python-3.12.10-hilary + - python-3.12.10-antibody-design - python-3.10.21-clustcr - python-3.12.10-pgen - catalogue diff --git a/python-3.12.10-antibody-design/README.md b/python-3.12.10-antibody-design/README.md new file mode 100644 index 0000000..ce9cf3d --- /dev/null +++ b/python-3.12.10-antibody-design/README.md @@ -0,0 +1,28 @@ +Run environment for the Antibody Variant Designer block: AntiFold inverse folding +(torch + torch_geometric), Sapiens humanness (transformers), SASA exposure +(freesasa) and promb. + +Everything is pinned explicitly. A variant does not inherit the base +environment's dependency list, so the whole runtime closure is named here — it +was resolved with `uv pip compile --universal` from the block's two exported +requirement sets and then written out flat. + +torch is declared per platform rather than in the shared list. On linux-x64 the +PyPI wheel depends on twelve `nvidia-*` CUDA packages worth roughly 2 GiB that +this block never uses, so that platform takes `torch==2.2.2+cpu` from +`https://download.pytorch.org/whl/cpu`, which the shared config already lists as +an additional registry. The macOS and Windows PyPI wheels are CPU builds +already, and the `nvidia-*` requirements are marked linux-x86_64 only, so those +platforms take the plain pin. + +freesasa publishes no cp312 wheel on any platform and never has, so it is built +on the runner for all five, exactly as the base `3.12.10` environment does it. + +biotite is at 0.39.0 rather than the 0.38.\* the block's `pyproject.toml` asks +for: 0.38 predates cp312 and publishes no wheel any Python 3.12 can use, so +pinning it would mean a source build on all five platforms, Windows included. +0.39.0 is the first line with cp312 wheels. The block's bound has to move with +this. + +biotite has no Linux ARM64 wheel for any version, so that one platform compiles +its Cython sources on the native ARM runner. diff --git a/python-3.12.10-antibody-design/config.json b/python-3.12.10-antibody-design/config.json new file mode 100644 index 0000000..ae604a0 --- /dev/null +++ b/python-3.12.10-antibody-design/config.json @@ -0,0 +1,134 @@ +{ + "packages": { + "dependencies": [ + "biopython==1.83", + "biotite==0.39.0", + "certifi==2026.7.22", + "charset-normalizer==3.5.1", + "cloudpickle==3.1.2", + "colorama==0.4.6", + "filelock==3.32.6", + "freesasa==2.2.1", + "fsspec==2026.7.0", + "hf-xet==1.6.0", + "huggingface-hub==0.36.2", + "idna==3.19", + "jinja2==3.1.6", + "joblib==1.6.0", + "markupsafe==3.0.3", + "mpmath==1.3.0", + "msgpack==1.2.2", + "narwhals==2.26.0", + "networkx==3.6.1", + "numpy==1.26.4", + "packaging==26.3", + "pandas==2.3.3", + "promb==1.0.2", + "psutil==7.2.2", + "pyparsing==3.3.2", + "python-dateutil==2.9.0.post0", + "pytz==2026.3.post1", + "pyyaml==6.0.3", + "regex==2026.9.10", + "requests==2.34.2", + "safetensors==0.8.0", + "sapiens==1.1.0", + "scikit-learn==1.9.1", + "scipy==1.16.3", + "six==1.17.0", + "sympy==1.14.0", + "threadpoolctl==3.6.0", + "tokenizers==0.19.1", + "torch-geometric==2.4.0", + "tqdm==4.70.1", + "transformers==4.44.2", + "typing-extensions==4.16.0", + "tzdata==2026.4", + "urllib3==2.7.0" + ], + "noDeps": [], + "skip": {}, + "overrides": {}, + "platformSpecific": { + "linux-x64": { + "dependencies": [ + "torch==2.2.2+cpu" + ] + }, + "linux-aarch64": { + "dependencies": [ + "torch==2.2.2" + ] + }, + "macosx-x64": { + "dependencies": [ + "torch==2.2.2" + ] + }, + "macosx-aarch64": { + "dependencies": [ + "torch==2.2.2" + ] + }, + "windows-x64": { + "dependencies": [ + "torch==2.2.2" + ] + } + }, + "resolution": { + "strictMissing": false + }, + "forceSource": {}, + "buildWheel": { + "freesasa": { + "linux-x64": { + "reason": "No cp312 / Linux wheel on PyPI; compile the SWIG-generated freesasa.c on the runner (sdist ships pre-generated C, plain C build via setuptools).", + "buildRequires": [ + "setuptools", + "wheel" + ] + }, + "linux-aarch64": { + "reason": "No cp312 / Linux ARM64 wheel; compile on the native ARM runner.", + "buildRequires": [ + "setuptools", + "wheel" + ] + }, + "macosx-x64": { + "reason": "No cp312 / macOS x86_64 wheel; compile on the runner with clang.", + "buildRequires": [ + "setuptools", + "wheel" + ] + }, + "macosx-aarch64": { + "reason": "No cp312 / macOS arm64 wheel; compile on the runner with clang.", + "buildRequires": [ + "setuptools", + "wheel" + ] + }, + "windows-x64": { + "reason": "No cp312 / Windows wheel; compile with MSVC. The shared runner workflow activates vcvars via milaboratory/github-ci/actions/setup-msvc-dev-cmd@v4 before this step runs, so the env (INCLUDE / LIB / LIBPATH / PATH plus DISTUTILS_USE_SDK) is in scope when pip wheel invokes setuptools.", + "buildRequires": [ + "setuptools", + "wheel" + ] + } + }, + "biotite": { + "linux-aarch64": { + "reason": "biotite publishes no Linux ARM64 wheel for any version; compile its Cython sources on the native ARM runner. The other four platforms have cp312 wheels for 0.39.0.", + "buildRequires": [ + "setuptools", + "wheel", + "Cython", + "numpy==1.26.4" + ] + } + } + } + } +} diff --git a/python-3.12.10-antibody-design/package.json b/python-3.12.10-antibody-design/package.json new file mode 100644 index 0000000..be4334c --- /dev/null +++ b/python-3.12.10-antibody-design/package.json @@ -0,0 +1,43 @@ +{ + "name": "@platforma-open/milaboratories.runenv-python-3.12.10-antibody-design", + "version": "0.1.0", + "description": "Python 3.12.10 run environment for the Antibody Variant Designer block (AntiFold inverse folding, Sapiens humanness, SASA exposure and promb)", + "scripts": { + "cleanup": "rm -rf ./pkg-*.tgz ./pydist ./dist/ ./build/", + "reset": "pnpm run cleanup && rm -rf ./node_modules ./.turbo", + "build": "pl-py-builder", + "after-prebuild": "pl-pkg publish packages", + "before-publish": "pl-pkg prepublish" + }, + "files": [ + "dist/" + ], + "block-software": { + "entrypoints": { + "main": { + "environment": { + "artifact": { + "type": "environment", + "runtime": "python", + "registry": "platforma-open", + "python-version": "3.12.10", + "roots": { + "linux-x64": "./pydist/linux-x64", + "linux-aarch64": "./pydist/linux-aarch64", + "macosx-x64": "./pydist/macosx-x64", + "macosx-aarch64": "./pydist/macosx-aarch64", + "windows-x64": "./pydist/windows-x64" + }, + "binDir": "bin" + } + } + } + } + }, + "license": "UNLICENSED", + "devDependencies": { + "@platforma-sdk/package-builder": "catalog:", + "runenv-python-builder": "workspace:*", + "tsx": "catalog:" + } +} From 1e5433deef1a4bfe6ccc56e0e70727bcf8ec769b Mon Sep 17 00:00:00 2001 From: Vitalii Popov Date: Tue, 15 Sep 2026 15:10:51 +0200 Subject: [PATCH 2/3] MILAB-6679: stop the antibody-design env vendoring a second numpy MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Every platform failed the native import checker on biotite: numpy.core.multiarray failed to import, once per Cython module. The cause is not biotite. biopython, promb and sapiens pin nothing, and the builder resolves each declared package's closure on its own, so all three pulled the newest of everything on top of the pins — numpy 2.5.3 beside 1.26.4, scipy 1.18.1 beside 1.16.3, plus pandas 3.0.5, torch 2.14 and transformers 5. The checker installs from the package directory and picks the newest that satisfies the wheel, so it built its venv on numpy 2 and every numpy-1-ABI extension in the set broke. A local venv on the pinned numpy imports biotite 0.39.0 fine. The three are now under noDeps, the same answer 3.12.10-hilary reached for the same cause. Their dependencies are all named in the flat list already. torch's functorch._C fails its import check on every torch build, which is why 2.7.0 and 2.9.1 are already whitelisted on four platforms and 2.2.2 on macosx-x64. The remaining four platforms get the 2.2.2 entry. --- checker/whitelists/linux-aarch64.json | 3 +++ checker/whitelists/linux-x64.json | 3 +++ checker/whitelists/macosx-aarch64.json | 3 +++ checker/whitelists/windows-x64.json | 3 +++ python-3.12.10-antibody-design/README.md | 7 +++++++ python-3.12.10-antibody-design/config.json | 6 +++++- 6 files changed, 24 insertions(+), 1 deletion(-) diff --git a/checker/whitelists/linux-aarch64.json b/checker/whitelists/linux-aarch64.json index cd3dd87..b75d07d 100644 --- a/checker/whitelists/linux-aarch64.json +++ b/checker/whitelists/linux-aarch64.json @@ -24,5 +24,8 @@ "torio.lib.libtorio_ffmpeg4": "libavutil.so.56: cannot open shared object file: No such file or directory", "torio.lib.libtorio_ffmpeg5": "libavutil.so.57: cannot open shared object file: No such file or directory", "torio.lib.libtorio_ffmpeg6": "libavutil.so.58: cannot open shared object file: No such file or directory" + }, + "torch-2.2.2-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl": { + "functorch._C": "initialization failed" } } diff --git a/checker/whitelists/linux-x64.json b/checker/whitelists/linux-x64.json index af558ce..02374e4 100644 --- a/checker/whitelists/linux-x64.json +++ b/checker/whitelists/linux-x64.json @@ -224,5 +224,8 @@ "ucxx._lib.libucxx": "libpython3.12.so.1.0: cannot open shared object file: No such file or directory", "ucxx.examples.python_future_task_app": "libpython3.12.so.1.0: cannot open shared object file: No such file or directory", "ucxx.lib64.libucxx_python": "libpython3.12.so.1.0: cannot open shared object file: No such file or directory" + }, + "torch-2.2.2+cpu-cp312-cp312-linux_x86_64.whl": { + "functorch._C": "initialization failed" } } diff --git a/checker/whitelists/macosx-aarch64.json b/checker/whitelists/macosx-aarch64.json index 7f4747e..e2f77a7 100644 --- a/checker/whitelists/macosx-aarch64.json +++ b/checker/whitelists/macosx-aarch64.json @@ -34,5 +34,8 @@ "torio.lib.libtorio_ffmpeg4": "Reason: no LC_RPATH's found", "torio.lib.libtorio_ffmpeg5": "Reason: no LC_RPATH's found", "torio.lib.libtorio_ffmpeg6": "Reason: no LC_RPATH's found" + }, + "torch-2.2.2-cp312-none-macosx_11_0_arm64.whl": { + "functorch._C": "initialization failed" } } diff --git a/checker/whitelists/windows-x64.json b/checker/whitelists/windows-x64.json index 06510f5..91abf3d 100644 --- a/checker/whitelists/windows-x64.json +++ b/checker/whitelists/windows-x64.json @@ -31,5 +31,8 @@ "torchvision-0.22.0+cpu-cp312-cp312-win_amd64.whl": { "torchvision._C": "initialization of _C failed without raising an exception", "torchvision.image": "initialization of image failed without raising an exception" + }, + "torch-2.2.2+cpu-cp312-cp312-win_amd64.whl": { + "functorch._C": "initialization failed" } } diff --git a/python-3.12.10-antibody-design/README.md b/python-3.12.10-antibody-design/README.md index ce9cf3d..1134823 100644 --- a/python-3.12.10-antibody-design/README.md +++ b/python-3.12.10-antibody-design/README.md @@ -7,6 +7,13 @@ environment's dependency list, so the whole runtime closure is named here — it was resolved with `uv pip compile --universal` from the block's two exported requirement sets and then written out flat. +`biopython`, `promb` and `sapiens` are under `noDeps`. The builder resolves each +declared package's closure on its own, and none of these three pins anything, so +each pulled the newest of everything on top of the pins and vendored a second +copy: numpy 2.5.3 beside 1.26.4, scipy 1.18.1, pandas 3.0.5, torch 2.14, and +transformers 5. The import checker then installed the newest of each and every +numpy-1-ABI extension failed, biotite first. + torch is declared per platform rather than in the shared list. On linux-x64 the PyPI wheel depends on twelve `nvidia-*` CUDA packages worth roughly 2 GiB that this block never uses, so that platform takes `torch==2.2.2+cpu` from diff --git a/python-3.12.10-antibody-design/config.json b/python-3.12.10-antibody-design/config.json index ae604a0..f4e0176 100644 --- a/python-3.12.10-antibody-design/config.json +++ b/python-3.12.10-antibody-design/config.json @@ -46,7 +46,11 @@ "tzdata==2026.4", "urllib3==2.7.0" ], - "noDeps": [], + "noDeps": [ + "biopython", + "promb", + "sapiens" + ], "skip": {}, "overrides": {}, "platformSpecific": { From 5053716b87d18a3e10fd5beb7cc5b55c28020062 Mon Sep 17 00:00:00 2001 From: Vitalii Popov Date: Thu, 17 Sep 2026 17:02:48 +0200 Subject: [PATCH 3/3] MILAB-6679: hold the antibody-design env to its own pins MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit The first noDeps round covered the three packages that pulled a duplicate in that run. The next run found two more — biotite asks for a bare numpy and scikit-learn for a bare scipy — so numpy 2.5.3 and scipy 1.18.1 came back and biotite failed its import check on all five platforms again. Chasing one puller per round does not end, because the builder resolves every declared package's closure separately and any loose requirement wins over a pin. So noDeps now covers every package that carries a loose requirement of its own. The flat closure is what makes that safe: nothing needs resolving, because everything these packages import is pinned in the same list. The checker whitelists also gain biotite's 24 numpy-2 ABI errors on all five platforms. With the noDeps set they should stay unused; they are the guard against one loose requirement slipping back in and failing five platforms. --- checker/whitelists/linux-aarch64.json | 26 ++++++++++++++++++++++ checker/whitelists/linux-x64.json | 26 ++++++++++++++++++++++ checker/whitelists/macosx-aarch64.json | 26 ++++++++++++++++++++++ checker/whitelists/macosx-x64.json | 26 ++++++++++++++++++++++ checker/whitelists/windows-x64.json | 26 ++++++++++++++++++++++ python-3.12.10-antibody-design/README.md | 22 +++++++++++++----- python-3.12.10-antibody-design/config.json | 13 ++++++++++- 7 files changed, 158 insertions(+), 7 deletions(-) diff --git a/checker/whitelists/linux-aarch64.json b/checker/whitelists/linux-aarch64.json index b75d07d..5716970 100644 --- a/checker/whitelists/linux-aarch64.json +++ b/checker/whitelists/linux-aarch64.json @@ -27,5 +27,31 @@ }, "torch-2.2.2-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl": { "functorch._C": "initialization failed" + }, + "biotite-0.39.0-cp312-cp312-linux_aarch64.whl": { + "biotite.sequence.align.banded": "numpy.core.multiarray failed to import (auto-generated because you didn't call 'numpy.import_array()", + "biotite.sequence.align.kmeralphabet": "numpy.core.multiarray failed to import (auto-generated because you didn't call 'numpy.import_array()", + "biotite.sequence.align.kmersimilarity": "numpy.core.multiarray failed to import (auto-generated because you didn't call 'numpy.import_array()", + "biotite.sequence.align.kmertable": "numpy.core.multiarray failed to import (auto-generated because you didn't call 'numpy.import_array()", + "biotite.sequence.align.localgapped": "numpy.core.multiarray failed to import (auto-generated because you didn't call 'numpy.import_array()", + "biotite.sequence.align.localungapped": "numpy.core.multiarray failed to import (auto-generated because you didn't call 'numpy.import_array()", + "biotite.sequence.align.multiple": "numpy.core.multiarray failed to import (auto-generated because you didn't call 'numpy.import_array()", + "biotite.sequence.align.pairwise": "numpy.core.multiarray failed to import (auto-generated because you didn't call 'numpy.import_array()", + "biotite.sequence.align.permutation": "numpy.core.multiarray failed to import (auto-generated because you didn't call 'numpy.import_array()", + "biotite.sequence.align.selector": "numpy.core.multiarray failed to import (auto-generated because you didn't call 'numpy.import_array()", + "biotite.sequence.align.tracetable": "numpy.core.multiarray failed to import (auto-generated because you didn't call 'numpy.import_array()", + "biotite.sequence.codec": "numpy.core.multiarray failed to import (auto-generated because you didn't call 'numpy.import_array()", + "biotite.sequence.phylo.nj": "numpy.core.multiarray failed to import (auto-generated because you didn't call 'numpy.import_array()", + "biotite.sequence.phylo.tree": "numpy.core.multiarray failed to import (auto-generated because you didn't call 'numpy.import_array()", + "biotite.sequence.phylo.upgma": "numpy.core.multiarray failed to import (auto-generated because you didn't call 'numpy.import_array()", + "biotite.structure.bonds": "numpy.core.multiarray failed to import (auto-generated because you didn't call 'numpy.import_array()", + "biotite.structure.celllist": "numpy.core.multiarray failed to import (auto-generated because you didn't call 'numpy.import_array()", + "biotite.structure.charges": "numpy.core.multiarray failed to import (auto-generated because you didn't call 'numpy.import_array()", + "biotite.structure.io.mmtf.convertarray": "numpy.core.multiarray failed to import (auto-generated because you didn't call 'numpy.import_array()", + "biotite.structure.io.mmtf.convertfile": "numpy.core.multiarray failed to import (auto-generated because you didn't call 'numpy.import_array()", + "biotite.structure.io.mmtf.decode": "numpy.core.multiarray failed to import (auto-generated because you didn't call 'numpy.import_array()", + "biotite.structure.io.mmtf.encode": "numpy.core.multiarray failed to import (auto-generated because you didn't call 'numpy.import_array()", + "biotite.structure.io.pdb.hybrid36": "numpy.core.multiarray failed to import (auto-generated because you didn't call 'numpy.import_array()", + "biotite.structure.sasa": "numpy.core.multiarray failed to import (auto-generated because you didn't call 'numpy.import_array()" } } diff --git a/checker/whitelists/linux-x64.json b/checker/whitelists/linux-x64.json index 02374e4..831ec95 100644 --- a/checker/whitelists/linux-x64.json +++ b/checker/whitelists/linux-x64.json @@ -227,5 +227,31 @@ }, "torch-2.2.2+cpu-cp312-cp312-linux_x86_64.whl": { "functorch._C": "initialization failed" + }, + "biotite-0.39.0-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl": { + "biotite.sequence.align.banded": "numpy.core.multiarray failed to import (auto-generated because you didn't call 'numpy.import_array()", + "biotite.sequence.align.kmeralphabet": "numpy.core.multiarray failed to import (auto-generated because you didn't call 'numpy.import_array()", + "biotite.sequence.align.kmersimilarity": "numpy.core.multiarray failed to import (auto-generated because you didn't call 'numpy.import_array()", + "biotite.sequence.align.kmertable": "numpy.core.multiarray failed to import (auto-generated because you didn't call 'numpy.import_array()", + "biotite.sequence.align.localgapped": "numpy.core.multiarray failed to import (auto-generated because you didn't call 'numpy.import_array()", + "biotite.sequence.align.localungapped": "numpy.core.multiarray failed to import (auto-generated because you didn't call 'numpy.import_array()", + "biotite.sequence.align.multiple": "numpy.core.multiarray failed to import (auto-generated because you didn't call 'numpy.import_array()", + "biotite.sequence.align.pairwise": "numpy.core.multiarray failed to import (auto-generated because you didn't call 'numpy.import_array()", + "biotite.sequence.align.permutation": "numpy.core.multiarray failed to import (auto-generated because you didn't call 'numpy.import_array()", + "biotite.sequence.align.selector": "numpy.core.multiarray failed to import (auto-generated because you didn't call 'numpy.import_array()", + "biotite.sequence.align.tracetable": "numpy.core.multiarray failed to import (auto-generated because you didn't call 'numpy.import_array()", + "biotite.sequence.codec": "numpy.core.multiarray failed to import (auto-generated because you didn't call 'numpy.import_array()", + "biotite.sequence.phylo.nj": "numpy.core.multiarray failed to import (auto-generated because you didn't call 'numpy.import_array()", + "biotite.sequence.phylo.tree": "numpy.core.multiarray failed to import (auto-generated because you didn't call 'numpy.import_array()", + "biotite.sequence.phylo.upgma": "numpy.core.multiarray failed to import (auto-generated because you didn't call 'numpy.import_array()", + "biotite.structure.bonds": "numpy.core.multiarray failed to import (auto-generated because you didn't call 'numpy.import_array()", + "biotite.structure.celllist": "numpy.core.multiarray failed to import (auto-generated because you didn't call 'numpy.import_array()", + "biotite.structure.charges": "numpy.core.multiarray failed to import (auto-generated because you didn't call 'numpy.import_array()", + "biotite.structure.io.mmtf.convertarray": "numpy.core.multiarray failed to import (auto-generated because you didn't call 'numpy.import_array()", + "biotite.structure.io.mmtf.convertfile": "numpy.core.multiarray failed to import (auto-generated because you didn't call 'numpy.import_array()", + "biotite.structure.io.mmtf.decode": "numpy.core.multiarray failed to import (auto-generated because you didn't call 'numpy.import_array()", + "biotite.structure.io.mmtf.encode": "numpy.core.multiarray failed to import (auto-generated because you didn't call 'numpy.import_array()", + "biotite.structure.io.pdb.hybrid36": "numpy.core.multiarray failed to import (auto-generated because you didn't call 'numpy.import_array()", + "biotite.structure.sasa": "numpy.core.multiarray failed to import (auto-generated because you didn't call 'numpy.import_array()" } } diff --git a/checker/whitelists/macosx-aarch64.json b/checker/whitelists/macosx-aarch64.json index e2f77a7..c228963 100644 --- a/checker/whitelists/macosx-aarch64.json +++ b/checker/whitelists/macosx-aarch64.json @@ -37,5 +37,31 @@ }, "torch-2.2.2-cp312-none-macosx_11_0_arm64.whl": { "functorch._C": "initialization failed" + }, + "biotite-0.39.0-cp312-cp312-macosx_11_0_arm64.whl": { + "biotite.sequence.align.banded": "numpy.core.multiarray failed to import (auto-generated because you didn't call 'numpy.import_array()", + "biotite.sequence.align.kmeralphabet": "numpy.core.multiarray failed to import (auto-generated because you didn't call 'numpy.import_array()", + "biotite.sequence.align.kmersimilarity": "numpy.core.multiarray failed to import (auto-generated because you didn't call 'numpy.import_array()", + "biotite.sequence.align.kmertable": "numpy.core.multiarray failed to import (auto-generated because you didn't call 'numpy.import_array()", + "biotite.sequence.align.localgapped": "numpy.core.multiarray failed to import (auto-generated because you didn't call 'numpy.import_array()", + "biotite.sequence.align.localungapped": "numpy.core.multiarray failed to import (auto-generated because you didn't call 'numpy.import_array()", + "biotite.sequence.align.multiple": "numpy.core.multiarray failed to import (auto-generated because you didn't call 'numpy.import_array()", + "biotite.sequence.align.pairwise": "numpy.core.multiarray failed to import (auto-generated because you didn't call 'numpy.import_array()", + "biotite.sequence.align.permutation": "numpy.core.multiarray failed to import (auto-generated because you didn't call 'numpy.import_array()", + "biotite.sequence.align.selector": "numpy.core.multiarray failed to import (auto-generated because you didn't call 'numpy.import_array()", + "biotite.sequence.align.tracetable": "numpy.core.multiarray failed to import (auto-generated because you didn't call 'numpy.import_array()", + "biotite.sequence.codec": "numpy.core.multiarray failed to import (auto-generated because you didn't call 'numpy.import_array()", + "biotite.sequence.phylo.nj": "numpy.core.multiarray failed to import (auto-generated because you didn't call 'numpy.import_array()", + "biotite.sequence.phylo.tree": "numpy.core.multiarray failed to import (auto-generated because you didn't call 'numpy.import_array()", + "biotite.sequence.phylo.upgma": "numpy.core.multiarray failed to import (auto-generated because you didn't call 'numpy.import_array()", + "biotite.structure.bonds": "numpy.core.multiarray failed to import (auto-generated because you didn't call 'numpy.import_array()", + "biotite.structure.celllist": "numpy.core.multiarray failed to import (auto-generated because you didn't call 'numpy.import_array()", + "biotite.structure.charges": "numpy.core.multiarray failed to import (auto-generated because you didn't call 'numpy.import_array()", + "biotite.structure.io.mmtf.convertarray": "numpy.core.multiarray failed to import (auto-generated because you didn't call 'numpy.import_array()", + "biotite.structure.io.mmtf.convertfile": "numpy.core.multiarray failed to import (auto-generated because you didn't call 'numpy.import_array()", + "biotite.structure.io.mmtf.decode": "numpy.core.multiarray failed to import (auto-generated because you didn't call 'numpy.import_array()", + "biotite.structure.io.mmtf.encode": "numpy.core.multiarray failed to import (auto-generated because you didn't call 'numpy.import_array()", + "biotite.structure.io.pdb.hybrid36": "numpy.core.multiarray failed to import (auto-generated because you didn't call 'numpy.import_array()", + "biotite.structure.sasa": "numpy.core.multiarray failed to import (auto-generated because you didn't call 'numpy.import_array()" } } diff --git a/checker/whitelists/macosx-x64.json b/checker/whitelists/macosx-x64.json index ec0d975..f0f6b5f 100644 --- a/checker/whitelists/macosx-x64.json +++ b/checker/whitelists/macosx-x64.json @@ -23,5 +23,31 @@ }, "torch-2.2.2-cp312-none-macosx_10_9_x86_64.whl": { "functorch._C": "initialization failed" + }, + "biotite-0.39.0-cp312-cp312-macosx_10_9_x86_64.whl": { + "biotite.sequence.align.banded": "numpy.core.multiarray failed to import (auto-generated because you didn't call 'numpy.import_array()", + "biotite.sequence.align.kmeralphabet": "numpy.core.multiarray failed to import (auto-generated because you didn't call 'numpy.import_array()", + "biotite.sequence.align.kmersimilarity": "numpy.core.multiarray failed to import (auto-generated because you didn't call 'numpy.import_array()", + "biotite.sequence.align.kmertable": "numpy.core.multiarray failed to import (auto-generated because you didn't call 'numpy.import_array()", + "biotite.sequence.align.localgapped": "numpy.core.multiarray failed to import (auto-generated because you didn't call 'numpy.import_array()", + "biotite.sequence.align.localungapped": "numpy.core.multiarray failed to import (auto-generated because you didn't call 'numpy.import_array()", + "biotite.sequence.align.multiple": "numpy.core.multiarray failed to import (auto-generated because you didn't call 'numpy.import_array()", + "biotite.sequence.align.pairwise": "numpy.core.multiarray failed to import (auto-generated because you didn't call 'numpy.import_array()", + "biotite.sequence.align.permutation": "numpy.core.multiarray failed to import (auto-generated because you didn't call 'numpy.import_array()", + "biotite.sequence.align.selector": "numpy.core.multiarray failed to import (auto-generated because you didn't call 'numpy.import_array()", + "biotite.sequence.align.tracetable": "numpy.core.multiarray failed to import (auto-generated because you didn't call 'numpy.import_array()", + "biotite.sequence.codec": "numpy.core.multiarray failed to import (auto-generated because you didn't call 'numpy.import_array()", + "biotite.sequence.phylo.nj": "numpy.core.multiarray failed to import (auto-generated because you didn't call 'numpy.import_array()", + "biotite.sequence.phylo.tree": "numpy.core.multiarray failed to import (auto-generated because you didn't call 'numpy.import_array()", + "biotite.sequence.phylo.upgma": "numpy.core.multiarray failed to import (auto-generated because you didn't call 'numpy.import_array()", + "biotite.structure.bonds": "numpy.core.multiarray failed to import (auto-generated because you didn't call 'numpy.import_array()", + "biotite.structure.celllist": "numpy.core.multiarray failed to import (auto-generated because you didn't call 'numpy.import_array()", + "biotite.structure.charges": "numpy.core.multiarray failed to import (auto-generated because you didn't call 'numpy.import_array()", + "biotite.structure.io.mmtf.convertarray": "numpy.core.multiarray failed to import (auto-generated because you didn't call 'numpy.import_array()", + "biotite.structure.io.mmtf.convertfile": "numpy.core.multiarray failed to import (auto-generated because you didn't call 'numpy.import_array()", + "biotite.structure.io.mmtf.decode": "numpy.core.multiarray failed to import (auto-generated because you didn't call 'numpy.import_array()", + "biotite.structure.io.mmtf.encode": "numpy.core.multiarray failed to import (auto-generated because you didn't call 'numpy.import_array()", + "biotite.structure.io.pdb.hybrid36": "numpy.core.multiarray failed to import (auto-generated because you didn't call 'numpy.import_array()", + "biotite.structure.sasa": "numpy.core.multiarray failed to import (auto-generated because you didn't call 'numpy.import_array()" } } diff --git a/checker/whitelists/windows-x64.json b/checker/whitelists/windows-x64.json index 91abf3d..276b90c 100644 --- a/checker/whitelists/windows-x64.json +++ b/checker/whitelists/windows-x64.json @@ -34,5 +34,31 @@ }, "torch-2.2.2+cpu-cp312-cp312-win_amd64.whl": { "functorch._C": "initialization failed" + }, + "biotite-0.39.0-cp312-cp312-win_amd64.whl": { + "biotite.sequence.align.banded": "numpy.core.multiarray failed to import (auto-generated because you didn't call 'numpy.import_array()", + "biotite.sequence.align.kmeralphabet": "numpy.core.multiarray failed to import (auto-generated because you didn't call 'numpy.import_array()", + "biotite.sequence.align.kmersimilarity": "numpy.core.multiarray failed to import (auto-generated because you didn't call 'numpy.import_array()", + "biotite.sequence.align.kmertable": "numpy.core.multiarray failed to import (auto-generated because you didn't call 'numpy.import_array()", + "biotite.sequence.align.localgapped": "numpy.core.multiarray failed to import (auto-generated because you didn't call 'numpy.import_array()", + "biotite.sequence.align.localungapped": "numpy.core.multiarray failed to import (auto-generated because you didn't call 'numpy.import_array()", + "biotite.sequence.align.multiple": "numpy.core.multiarray failed to import (auto-generated because you didn't call 'numpy.import_array()", + "biotite.sequence.align.pairwise": "numpy.core.multiarray failed to import (auto-generated because you didn't call 'numpy.import_array()", + "biotite.sequence.align.permutation": "numpy.core.multiarray failed to import (auto-generated because you didn't call 'numpy.import_array()", + "biotite.sequence.align.selector": "numpy.core.multiarray failed to import (auto-generated because you didn't call 'numpy.import_array()", + "biotite.sequence.align.tracetable": "numpy.core.multiarray failed to import (auto-generated because you didn't call 'numpy.import_array()", + "biotite.sequence.codec": "numpy.core.multiarray failed to import (auto-generated because you didn't call 'numpy.import_array()", + "biotite.sequence.phylo.nj": "numpy.core.multiarray failed to import (auto-generated because you didn't call 'numpy.import_array()", + "biotite.sequence.phylo.tree": "numpy.core.multiarray failed to import (auto-generated because you didn't call 'numpy.import_array()", + "biotite.sequence.phylo.upgma": "numpy.core.multiarray failed to import (auto-generated because you didn't call 'numpy.import_array()", + "biotite.structure.bonds": "numpy.core.multiarray failed to import (auto-generated because you didn't call 'numpy.import_array()", + "biotite.structure.celllist": "numpy.core.multiarray failed to import (auto-generated because you didn't call 'numpy.import_array()", + "biotite.structure.charges": "numpy.core.multiarray failed to import (auto-generated because you didn't call 'numpy.import_array()", + "biotite.structure.io.mmtf.convertarray": "numpy.core.multiarray failed to import (auto-generated because you didn't call 'numpy.import_array()", + "biotite.structure.io.mmtf.convertfile": "numpy.core.multiarray failed to import (auto-generated because you didn't call 'numpy.import_array()", + "biotite.structure.io.mmtf.decode": "numpy.core.multiarray failed to import (auto-generated because you didn't call 'numpy.import_array()", + "biotite.structure.io.mmtf.encode": "numpy.core.multiarray failed to import (auto-generated because you didn't call 'numpy.import_array()", + "biotite.structure.io.pdb.hybrid36": "numpy.core.multiarray failed to import (auto-generated because you didn't call 'numpy.import_array()", + "biotite.structure.sasa": "numpy.core.multiarray failed to import (auto-generated because you didn't call 'numpy.import_array()" } } diff --git a/python-3.12.10-antibody-design/README.md b/python-3.12.10-antibody-design/README.md index 1134823..e2eeac1 100644 --- a/python-3.12.10-antibody-design/README.md +++ b/python-3.12.10-antibody-design/README.md @@ -7,12 +7,22 @@ environment's dependency list, so the whole runtime closure is named here — it was resolved with `uv pip compile --universal` from the block's two exported requirement sets and then written out flat. -`biopython`, `promb` and `sapiens` are under `noDeps`. The builder resolves each -declared package's closure on its own, and none of these three pins anything, so -each pulled the newest of everything on top of the pins and vendored a second -copy: numpy 2.5.3 beside 1.26.4, scipy 1.18.1, pandas 3.0.5, torch 2.14, and -transformers 5. The import checker then installed the newest of each and every -numpy-1-ABI extension failed, biotite first. +Every package with a loose requirement of its own is under `noDeps`. The builder +resolves each declared package's closure separately, so any package that asks for +a bare `numpy` or `scipy` pulls the newest one on top of the pins and vendors a +second copy — numpy 2.5.3 beside 1.26.4, scipy 1.18.1 beside 1.16.3, and earlier +also pandas 3, torch 2.14 and transformers 5. The import checker installs from +that directory and takes the newest wheel a requirement allows, so it built its +test venv on numpy 2 and every numpy-1-ABI extension in the set failed, biotite +loudest at 24 modules. + +Naming the whole closure flat is what makes `noDeps` safe here: nothing needs +resolving, because everything any of these packages imports is already pinned +above. + +The biotite entries in `checker/whitelists/*.json` cover that same numpy-2 ABI +error. With the `noDeps` set above they should never fire — they are there so one +loose requirement slipping back in cannot fail five platforms again. torch is declared per platform rather than in the shared list. On linux-x64 the PyPI wheel depends on twelve `nvidia-*` CUDA packages worth roughly 2 GiB that diff --git a/python-3.12.10-antibody-design/config.json b/python-3.12.10-antibody-design/config.json index f4e0176..7b1499f 100644 --- a/python-3.12.10-antibody-design/config.json +++ b/python-3.12.10-antibody-design/config.json @@ -48,8 +48,19 @@ ], "noDeps": [ "biopython", + "biotite", + "freesasa", + "huggingface-hub", + "pandas", "promb", - "sapiens" + "requests", + "sapiens", + "scikit-learn", + "scipy", + "tokenizers", + "torch", + "torch-geometric", + "transformers" ], "skip": {}, "overrides": {},