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/checker/whitelists/linux-aarch64.json b/checker/whitelists/linux-aarch64.json index cd3dd87..5716970 100644 --- a/checker/whitelists/linux-aarch64.json +++ b/checker/whitelists/linux-aarch64.json @@ -24,5 +24,34 @@ "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" + }, + "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 af558ce..831ec95 100644 --- a/checker/whitelists/linux-x64.json +++ b/checker/whitelists/linux-x64.json @@ -224,5 +224,34 @@ "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" + }, + "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 7f4747e..c228963 100644 --- a/checker/whitelists/macosx-aarch64.json +++ b/checker/whitelists/macosx-aarch64.json @@ -34,5 +34,34 @@ "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" + }, + "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 06510f5..276b90c 100644 --- a/checker/whitelists/windows-x64.json +++ b/checker/whitelists/windows-x64.json @@ -31,5 +31,34 @@ "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" + }, + "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/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..e2eeac1 --- /dev/null +++ b/python-3.12.10-antibody-design/README.md @@ -0,0 +1,45 @@ +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. + +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 +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..7b1499f --- /dev/null +++ b/python-3.12.10-antibody-design/config.json @@ -0,0 +1,149 @@ +{ + "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": [ + "biopython", + "biotite", + "freesasa", + "huggingface-hub", + "pandas", + "promb", + "requests", + "sapiens", + "scikit-learn", + "scipy", + "tokenizers", + "torch", + "torch-geometric", + "transformers" + ], + "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:" + } +}