Add evaluated crossdocked-scaffold checkpoint and metrics; simplify GEOM scaffold name
Browse files- README.md +52 -8
- crossdocked/scaffold/README.md +60 -0
- crossdocked/scaffold/atom_tokens.txt +12 -0
- crossdocked/scaffold/charge_tokens.txt +3 -0
- crossdocked/scaffold/config.yaml +474 -0
- crossdocked/scaffold/distributions.pt +3 -0
- crossdocked/scaffold/edge_tokens.txt +4 -0
- crossdocked/scaffold/epoch_100.ckpt +3 -0
- crossdocked/scaffold/manifest.json +38 -0
- crossdocked/scaffold/metadata.json +89 -0
- crossdocked/scaffold/summary.csv +11 -0
- geom/scaffold_murcko_substituent_lora_r16/README.md +3 -1
- geom/scaffold_murcko_substituent_lora_r16/manifest.json +4 -4
- geom/scaffold_murcko_substituent_lora_r16/metadata.json +1 -1
README.md
CHANGED
|
@@ -8,6 +8,8 @@ tags:
|
|
| 8 |
- qm9
|
| 9 |
- geom-drugs
|
| 10 |
- chembl3d
|
|
|
|
|
|
|
| 11 |
- 3d
|
| 12 |
- arxiv:2606.07239
|
| 13 |
---
|
|
@@ -15,8 +17,8 @@ tags:
|
|
| 15 |
# Morph: 3D molecular generation and scaffold decoration
|
| 16 |
|
| 17 |
Checkpoints for **unconditional 3D molecular generation** on **QM9**,
|
| 18 |
-
**GEOM-Drugs** and **ChEMBL3D**, plus **GEOM-Drugs scaffold decoration**
|
| 19 |
-
|
| 20 |
vocabularies and training distributions needed for their inference workflows.
|
| 21 |
Unconditional generation requires no training dataset; scaffold decoration uses
|
| 22 |
a supplied scaffold and the dedicated [scaffold bundle](#scaffold-decoration).
|
|
@@ -45,14 +47,14 @@ New catalog entries are discovered without updating the Python package.
|
|
| 45 |
## Scaffold decoration
|
| 46 |
|
| 47 |
**GEOM-Drugs scaffold decoration is also available:** the
|
| 48 |
-
[`geom-scaffold-murcko
|
| 49 |
contains the checkpoint after **25 fine-tuning epochs**, initialized from the
|
| 50 |
GEOM explicit-H epoch-100 EMA weights. It uses **rank-16 LoRA**, trainable output
|
| 51 |
heads and substituent-constrained insertion supervision.
|
| 52 |
|
| 53 |
| Model | Hydrogen representation | Completed fine-tuning epochs | Checkpoint |
|
| 54 |
| --- | --- | ---: | --- |
|
| 55 |
-
| `geom-scaffold-murcko
|
| 56 |
|
| 57 |
The model generates decorations conditioned on a Murcko scaffold. Scaffold atom
|
| 58 |
identities, internal bonds and charges are preserved; scaffold positions can move.
|
|
@@ -64,11 +66,29 @@ The bundle includes the original checkpoint, training configuration and source,
|
|
| 64 |
portable configuration, vocabularies, distributions, evaluation runtime and fixed
|
| 65 |
validation/test scaffold panels. See its [usage and reproduction instructions](https://huggingface.co/maltefranke/morph/blob/main/geom/scaffold_murcko_substituent_lora_r16/README.md).
|
| 66 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 67 |
## Evaluation results
|
| 68 |
|
| 69 |
Values are **mean ± sample standard deviation** across seeds **42, 43 and 44**
|
| 70 |
-
(`ddof=1`). Rates are percentages; diversity
|
| 71 |
-
|
|
|
|
| 72 |
|
| 73 |
<details>
|
| 74 |
<summary><strong>Unconditional generation — all 10 checkpoints</strong></summary>
|
|
@@ -104,7 +124,7 @@ The generated coordinates are not relaxed.
|
|
| 104 |
|
| 105 |
| Model | Completed epochs | Novelty (%) | PoseBusters validity (%) | Diversity (0–1) | Uniqueness (%) | Connected-sanitization validity (%) |
|
| 106 |
| --- | ---: | ---: | ---: | ---: | ---: | ---: |
|
| 107 |
-
|
|
| 108 |
|
| 109 |
**PoseBusters protocol:** the native scaffold evaluation checks chemistry and distance
|
| 110 |
geometry, excluding the full offline energy and flatness checks. The value above is
|
|
@@ -119,7 +139,31 @@ for the saved evaluation runtime and test panel.
|
|
| 119 |
|
| 120 |
</details>
|
| 121 |
|
| 122 |
-
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 123 |
|
| 124 |
- **Novelty:** fraction of generated, SMILES-convertible molecules absent from the
|
| 125 |
corresponding training reference, retaining duplicates in the denominator.
|
|
|
|
| 8 |
- qm9
|
| 9 |
- geom-drugs
|
| 10 |
- chembl3d
|
| 11 |
+
- crossdocked
|
| 12 |
+
- structure-based-drug-design
|
| 13 |
- 3d
|
| 14 |
- arxiv:2606.07239
|
| 15 |
---
|
|
|
|
| 17 |
# Morph: 3D molecular generation and scaffold decoration
|
| 18 |
|
| 19 |
Checkpoints for **unconditional 3D molecular generation** on **QM9**,
|
| 20 |
+
**GEOM-Drugs** and **ChEMBL3D**, plus **GEOM-Drugs scaffold decoration**
|
| 21 |
+
and **CrossDocked scaffold decoration in protein pockets**. The releases include the configurations,
|
| 22 |
vocabularies and training distributions needed for their inference workflows.
|
| 23 |
Unconditional generation requires no training dataset; scaffold decoration uses
|
| 24 |
a supplied scaffold and the dedicated [scaffold bundle](#scaffold-decoration).
|
|
|
|
| 47 |
## Scaffold decoration
|
| 48 |
|
| 49 |
**GEOM-Drugs scaffold decoration is also available:** the
|
| 50 |
+
[`geom-scaffold-murcko` bundle](https://huggingface.co/maltefranke/morph/tree/main/geom/scaffold_murcko_substituent_lora_r16)
|
| 51 |
contains the checkpoint after **25 fine-tuning epochs**, initialized from the
|
| 52 |
GEOM explicit-H epoch-100 EMA weights. It uses **rank-16 LoRA**, trainable output
|
| 53 |
heads and substituent-constrained insertion supervision.
|
| 54 |
|
| 55 |
| Model | Hydrogen representation | Completed fine-tuning epochs | Checkpoint |
|
| 56 |
| --- | --- | ---: | --- |
|
| 57 |
+
| `geom-scaffold-murcko` | Explicit H atoms | 25 | [epoch_025.ckpt](https://huggingface.co/maltefranke/morph/resolve/main/geom/scaffold_murcko_substituent_lora_r16/epoch_025.ckpt) |
|
| 58 |
|
| 59 |
The model generates decorations conditioned on a Murcko scaffold. Scaffold atom
|
| 60 |
identities, internal bonds and charges are preserved; scaffold positions can move.
|
|
|
|
| 66 |
portable configuration, vocabularies, distributions, evaluation runtime and fixed
|
| 67 |
validation/test scaffold panels. See its [usage and reproduction instructions](https://huggingface.co/maltefranke/morph/blob/main/geom/scaffold_murcko_substituent_lora_r16/README.md).
|
| 68 |
|
| 69 |
+
|
| 70 |
+
### Scaffold decoration in a protein pocket
|
| 71 |
+
|
| 72 |
+
[`crossdocked-scaffold`](https://huggingface.co/maltefranke/morph/tree/main/crossdocked/scaffold)
|
| 73 |
+
is the evaluated CrossDocked checkpoint after **100 fine-tuning epochs**. It uses
|
| 74 |
+
implicit ligand hydrogens, rank-8 LoRA and 10% in-vacuum ChEMBL3D replay.
|
| 75 |
+
|
| 76 |
+
| Model | Hydrogen representation | Completed fine-tuning epochs | Checkpoint |
|
| 77 |
+
| --- | --- | ---: | --- |
|
| 78 |
+
| `crossdocked-scaffold` | Heavy atoms; implicit H | 100 | [epoch_100.ckpt](https://huggingface.co/maltefranke/morph/resolve/main/crossdocked/scaffold/epoch_100.ckpt) |
|
| 79 |
+
|
| 80 |
+
The bundle contains the evaluated checkpoint, portable configuration,
|
| 81 |
+
vocabulary/statistics assets and complete metrics table.
|
| 82 |
+
Use the [pocket evaluation workflow](https://huggingface.co/maltefranke/morph/blob/main/crossdocked/scaffold/README.md)
|
| 83 |
+
with a scaffold and protein pocket. Like the GEOM scaffold model, it is separate
|
| 84 |
+
from the unconditional CLI/catalog.
|
| 85 |
+
|
| 86 |
## Evaluation results
|
| 87 |
|
| 88 |
Values are **mean ± sample standard deviation** across seeds **42, 43 and 44**
|
| 89 |
+
(`ddof=1`). Rates are percentages; diversity and similarity are on a 0–1 scale.
|
| 90 |
+
Vina scores are in kcal/mol.
|
| 91 |
+
All evaluations use EMA weights and 100 integration steps.
|
| 92 |
|
| 93 |
<details>
|
| 94 |
<summary><strong>Unconditional generation — all 10 checkpoints</strong></summary>
|
|
|
|
| 124 |
|
| 125 |
| Model | Completed epochs | Novelty (%) | PoseBusters validity (%) | Diversity (0–1) | Uniqueness (%) | Connected-sanitization validity (%) |
|
| 126 |
| --- | ---: | ---: | ---: | ---: | ---: | ---: |
|
| 127 |
+
| `geom-scaffold-murcko` | 25 (fine-tuning) | 97.52 ± 0.10 | 94.10 ± 0.19 | 0.9076 ± 0.0004 | 63.54 ± 0.59 | 97.99 ± 0.20 |
|
| 128 |
|
| 129 |
**PoseBusters protocol:** the native scaffold evaluation checks chemistry and distance
|
| 130 |
geometry, excluding the full offline energy and flatness checks. The value above is
|
|
|
|
| 139 |
|
| 140 |
</details>
|
| 141 |
|
| 142 |
+
<details>
|
| 143 |
+
<summary><strong>Scaffold decoration in a pocket — CrossDocked, 100 fine-tuning epochs</strong></summary>
|
| 144 |
+
|
| 145 |
+
`crossdocked-scaffold`, evaluated on the published DiffDec single- and multi-decoration
|
| 146 |
+
test panels, with **100 attempts per condition per seed** (43,500 total).
|
| 147 |
+
|
| 148 |
+
| Panel | Conditions | Attempts per seed | Validity (%) | Uniqueness (%) | Similarity (0–1) | Recovery (%) | Vina score (kcal/mol) | High affinity (%) |
|
| 149 |
+
| --- | ---: | ---: | ---: | ---: | ---: | ---: | ---: | ---: |
|
| 150 |
+
| Single | 43 | 4300 | 88.72 ± 0.71 | 53.32 ± 1.02 | 0.8157 ± 0.0042 | 39.00 ± 1.15 | -8.041 ± 0.007 | 44.18 ± 3.67 |
|
| 151 |
+
| Multi | 102 | 10200 | 89.80 ± 0.16 | 66.43 ± 0.38 | 0.7671 ± 0.0032 | 37.83 ± 5.33 | -8.088 ± 0.010 | 40.33 ± 3.14 |
|
| 152 |
+
|
| 153 |
+
Mean ± sample standard deviation across seeds 42/43/44. The six columns use
|
| 154 |
+
DiffDec's grouping and formulas; validity and uniqueness have different definitions
|
| 155 |
+
from the unconditional and GEOM scaffold tables. Docking re-embeds and UFF-minimizes
|
| 156 |
+
prediction SMILES, so it does not score the original generated coordinates.
|
| 157 |
+
Invalid predictions are replaced with the scaffold for docking. Reproduction
|
| 158 |
+
differences include reconstructed reference grouping strings, predicted bond
|
| 159 |
+
topology, newer RDKit and deterministic embedding seeds.
|
| 160 |
+
|
| 161 |
+
See the [full CSV, including individual seeds and docking failures](https://huggingface.co/maltefranke/morph/blob/main/crossdocked/scaffold/summary.csv)
|
| 162 |
+
and [protocol and reproduction notes](https://huggingface.co/maltefranke/morph/blob/main/crossdocked/scaffold/README.md).
|
| 163 |
+
|
| 164 |
+
</details>
|
| 165 |
+
|
| 166 |
+
Metric definitions for the unconditional and GEOM scaffold tables:
|
| 167 |
|
| 168 |
- **Novelty:** fraction of generated, SMILES-convertible molecules absent from the
|
| 169 |
corresponding training reference, retaining duplicates in the denominator.
|
crossdocked/scaffold/README.md
ADDED
|
@@ -0,0 +1,60 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
# crossdocked-scaffold
|
| 2 |
+
|
| 3 |
+
Morph scaffold decoration conditioned on a protein pocket, evaluated after
|
| 4 |
+
**100 completed fine-tuning epochs (40,000 steps)**. The model uses implicit ligand
|
| 5 |
+
hydrogens, rank-8 LoRA and trainable output heads, with 90% CrossDocked pocket
|
| 6 |
+
examples and 10% in-vacuum ChEMBL3D replay. Scaffold atom identities, internal
|
| 7 |
+
bonds and charges are preserved; scaffold positions can move.
|
| 8 |
+
|
| 9 |
+
## Evaluation
|
| 10 |
+
|
| 11 |
+
**Mean ± sample standard deviation (ddof=1), seeds 42, 43 and 44**, EMA weights,
|
| 12 |
+
100 integration steps, float32 sampling. Each published DiffDec condition receives
|
| 13 |
+
100 generation attempts: **43,500 attempts in total**.
|
| 14 |
+
|
| 15 |
+
| Panel | Conditions | Attempts per seed | Validity (%) | Uniqueness (%) | Similarity (0–1) | Recovery (%) | Vina score (kcal/mol) | High affinity (%) |
|
| 16 |
+
| --- | ---: | ---: | ---: | ---: | ---: | ---: | ---: | ---: |
|
| 17 |
+
| Single | 43 | 4300 | 88.72 ± 0.71 | 53.32 ± 1.02 | 0.8157 ± 0.0042 | 39.00 ± 1.15 | -8.041 ± 0.007 | 44.18 ± 3.67 |
|
| 18 |
+
| Multi | 102 | 10200 | 89.80 ± 0.16 | 66.43 ± 0.38 | 0.7671 ± 0.0032 | 37.83 ± 5.33 | -8.088 ± 0.010 | 40.33 ± 3.14 |
|
| 19 |
+
|
| 20 |
+
The [complete metrics CSV](summary.csv) includes all six individual seed/panel
|
| 21 |
+
results, means, standard deviations, chemistry validity diagnostics, reference
|
| 22 |
+
docking affinities and docking failure counts. High affinity is shown as a
|
| 23 |
+
percentage here and stored as a fraction in the CSV.
|
| 24 |
+
|
| 25 |
+
Validity, uniqueness, similarity and recovery use DiffDec's grouping and formulas.
|
| 26 |
+
These validity and uniqueness definitions differ from the unconditional and GEOM
|
| 27 |
+
scaffold chemistry metrics. Duplicate published conditions remain in the panels.
|
| 28 |
+
|
| 29 |
+
Docking uses QuickVina 2, a 30 Å box, exhaustiveness 16 and docking seed 1.
|
| 30 |
+
Predicted SMILES are re-embedded and UFF-minimized before docking; these scores
|
| 31 |
+
do not assess the original generated coordinates. Invalid predictions are replaced
|
| 32 |
+
with the scaffold, following the released DiffDec convention. Across the three
|
| 33 |
+
seeds, prediction docking failures total 55 for the single panel and 334 for the
|
| 34 |
+
multi panel; all 435 reference docking tasks succeeded, with no timeouts.
|
| 35 |
+
|
| 36 |
+
Reproduction differences from upstream DiffDec include reconstructed reference
|
| 37 |
+
grouping strings because the original CSVs are unavailable, Morph's predicted
|
| 38 |
+
bond topology, RDKit 2025.9.6 and deterministic per-attempt embedding seeds.
|
| 39 |
+
|
| 40 |
+
## Model files
|
| 41 |
+
|
| 42 |
+
- `epoch_100.ckpt`: the exact evaluated Lightning checkpoint, including current
|
| 43 |
+
weights, EMA weights and optimizer state. Its SHA-256 is recorded in `metadata.json`.
|
| 44 |
+
- `config.yaml`: the saved architecture and sampling configuration with portable
|
| 45 |
+
data/asset paths and base-checkpoint loading disabled.
|
| 46 |
+
- Ordered atom/edge/charge vocabularies and `distributions.pt`: matching model assets.
|
| 47 |
+
- `metadata.json`: model identity, evaluation settings and vocabulary metadata.
|
| 48 |
+
- `summary.csv`: the full metrics table; `manifest.json`: file sizes and SHA-256 hashes.
|
| 49 |
+
|
| 50 |
+
```bash
|
| 51 |
+
hf download maltefranke/morph --include 'crossdocked/scaffold/*' --local-dir morph-models
|
| 52 |
+
export MORPH_BUNDLE_DIR="$PWD/morph-models/crossdocked/scaffold"
|
| 53 |
+
```
|
| 54 |
+
|
| 55 |
+
Use Morph's scaffold-pocket evaluation workflow with this checkpoint and
|
| 56 |
+
`config.yaml`, passing the bundle folder as `--assets-root`. Sampling requires
|
| 57 |
+
a scaffold and protein pocket; the unconditional `morph generate` interface and
|
| 58 |
+
catalog do not load this conditional model. The matching processed data are in
|
| 59 |
+
[morph-data](https://huggingface.co/datasets/maltefranke/morph-data/tree/main/crossdocked),
|
| 60 |
+
and the published test tensors are in [DiffDec's Zenodo release](https://zenodo.org/records/10527451).
|
crossdocked/scaffold/atom_tokens.txt
ADDED
|
@@ -0,0 +1,12 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
B
|
| 2 |
+
Br
|
| 3 |
+
C
|
| 4 |
+
Cl
|
| 5 |
+
F
|
| 6 |
+
I
|
| 7 |
+
N
|
| 8 |
+
O
|
| 9 |
+
P
|
| 10 |
+
S
|
| 11 |
+
Se
|
| 12 |
+
Si
|
crossdocked/scaffold/charge_tokens.txt
ADDED
|
@@ -0,0 +1,3 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
-1
|
| 2 |
+
0
|
| 3 |
+
1
|
crossdocked/scaffold/config.yaml
ADDED
|
@@ -0,0 +1,474 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
representation: molecule
|
| 2 |
+
seed: 42
|
| 3 |
+
heads:
|
| 4 |
+
heads:
|
| 5 |
+
_target_: morph.model.layers.heads.MultiHeadModule
|
| 6 |
+
output_init_std: ${model.head_initialization.output_std}
|
| 7 |
+
independent_adapters: ${oc.select:model.head_independent_adapters,false}
|
| 8 |
+
heads_configs:
|
| 9 |
+
graph_aggregation: mean
|
| 10 |
+
node_heads:
|
| 11 |
+
atom_type_head:
|
| 12 |
+
input_dim: ${model.head_node_dim}
|
| 13 |
+
output_dim: ${len:${data.vocab.atom_tokens}}
|
| 14 |
+
adapter_dim: ${model.head_node_adapter_dim}
|
| 15 |
+
group: state
|
| 16 |
+
charge_head:
|
| 17 |
+
input_dim: ${model.head_node_dim}
|
| 18 |
+
output_dim: ${len:${data.vocab.charge_tokens}}
|
| 19 |
+
adapter_dim: ${model.head_node_adapter_dim}
|
| 20 |
+
group: state
|
| 21 |
+
ins_rate_head:
|
| 22 |
+
input_dim: ${model.head_node_dim}
|
| 23 |
+
output_dim: 1
|
| 24 |
+
adapter_dim: ${model.head_node_adapter_dim}
|
| 25 |
+
group: edit
|
| 26 |
+
initial_rate: ${model.head_initialization.ins_rate}
|
| 27 |
+
do_del_head:
|
| 28 |
+
input_dim: ${model.head_node_dim}
|
| 29 |
+
output_dim: 1
|
| 30 |
+
adapter_dim: ${model.head_node_adapter_dim}
|
| 31 |
+
group: edit
|
| 32 |
+
initial_probability: ${model.head_initialization.do_del_probability}
|
| 33 |
+
do_sub_a_head:
|
| 34 |
+
input_dim: ${model.head_node_dim}
|
| 35 |
+
output_dim: 1
|
| 36 |
+
adapter_dim: ${model.head_node_adapter_dim}
|
| 37 |
+
group: edit
|
| 38 |
+
initial_probability: ${model.head_initialization.do_sub_a_probability}
|
| 39 |
+
edge_heads:
|
| 40 |
+
edge_type_head:
|
| 41 |
+
input_dim: ${model.head_edge_dim}
|
| 42 |
+
output_dim: ${len:${data.vocab.edge_tokens}}
|
| 43 |
+
adapter_dim: ${model.head_edge_adapter_dim}
|
| 44 |
+
group: state
|
| 45 |
+
do_sub_e_head:
|
| 46 |
+
input_dim: ${model.head_edge_dim}
|
| 47 |
+
output_dim: 1
|
| 48 |
+
adapter_dim: ${model.head_edge_adapter_dim}
|
| 49 |
+
group: state
|
| 50 |
+
initial_probability: ${model.head_initialization.do_sub_e_probability}
|
| 51 |
+
ins_edge_head:
|
| 52 |
+
_target_: morph.model.layers.heads.InsertionEdgeHead
|
| 53 |
+
_recursive_: false
|
| 54 |
+
hidden_dim: ${model.head_node_dim}
|
| 55 |
+
readout_dim: ${model.head_insertion_edge_dim}
|
| 56 |
+
output_init_std: ${model.head_initialization.output_std}
|
| 57 |
+
n_edge_types: ${len:${data.vocab.edge_tokens}}
|
| 58 |
+
n_atom_types: ${len:${data.vocab.atom_tokens}}
|
| 59 |
+
n_charge_types: ${len:${data.vocab.charge_tokens}}
|
| 60 |
+
rbf_embedding_args:
|
| 61 |
+
_target_: morph.model.layers.embedding.RBFEmbedding
|
| 62 |
+
num_rbf: 128
|
| 63 |
+
rbf_dmax: 3.5
|
| 64 |
+
out_dim: 64
|
| 65 |
+
dropout: 0.0
|
| 66 |
+
trainable: false
|
| 67 |
+
insertion_head:
|
| 68 |
+
mode: unimodal
|
| 69 |
+
dimension: 3
|
| 70 |
+
num_components: 1
|
| 71 |
+
model:
|
| 72 |
+
_target_: morph.model.layers.heads.UnimodalInsertionHead
|
| 73 |
+
hidden_dim: ${model.head_node_dim}
|
| 74 |
+
readout_dim: ${model.head_insertion_adapter_dim}
|
| 75 |
+
output_init_std: ${model.head_initialization.output_std}
|
| 76 |
+
independent_adapters: ${oc.select:model.head_independent_adapters,false}
|
| 77 |
+
N_a: ${len:${data.vocab.atom_tokens}}
|
| 78 |
+
N_c: ${len:${data.vocab.charge_tokens}}
|
| 79 |
+
model:
|
| 80 |
+
module:
|
| 81 |
+
optimizer_config:
|
| 82 |
+
implementation: torch
|
| 83 |
+
optimizer:
|
| 84 |
+
execution: ${oc.env:MORPH_MUON_EXECUTION,native}
|
| 85 |
+
lr: 0.001
|
| 86 |
+
momentum: 0.95
|
| 87 |
+
weight_decay: 0.0
|
| 88 |
+
nesterov: true
|
| 89 |
+
ns_steps: 5
|
| 90 |
+
eps: 1.0e-07
|
| 91 |
+
adjust_lr_fn: original
|
| 92 |
+
aux_optimizer:
|
| 93 |
+
lr: 0.0001
|
| 94 |
+
betas:
|
| 95 |
+
- 0.9
|
| 96 |
+
- 0.95
|
| 97 |
+
eps: 1.0e-10
|
| 98 |
+
weight_decay: 0.0
|
| 99 |
+
gradient_clip_val: 1.0
|
| 100 |
+
gradient_clip_algorithm: norm
|
| 101 |
+
scheduler:
|
| 102 |
+
_target_: morph.utils.lr_schedulers.MultiGroupCosineWarmupLR
|
| 103 |
+
warmup_steps: 1000
|
| 104 |
+
total_steps: 40000
|
| 105 |
+
min_lr_fraction: 0.05
|
| 106 |
+
last_epoch: -1
|
| 107 |
+
interval: step
|
| 108 |
+
monitor: null
|
| 109 |
+
loss_weights:
|
| 110 |
+
do_sub_a: 0.2
|
| 111 |
+
sub_a_class: 0.03
|
| 112 |
+
do_sub_e: 0.25
|
| 113 |
+
sub_e_class: 0.5
|
| 114 |
+
do_del: 0.4
|
| 115 |
+
ins_rate: 0.15
|
| 116 |
+
ins_state: 0.01
|
| 117 |
+
ins_e: 0.4
|
| 118 |
+
x: 2.0
|
| 119 |
+
c: 0.5
|
| 120 |
+
ins_e_ii: 0.03
|
| 121 |
+
_target_: morph.model.finetune.scaffold.LightningModuleRatesScaffoldFinetune
|
| 122 |
+
insertion_head_mode: ${insertion_head.mode}
|
| 123 |
+
ins_noise_scale: ${data.ins_noise_scale}
|
| 124 |
+
ema_decay: 0.999
|
| 125 |
+
ema_warmup_steps: 5000
|
| 126 |
+
use_ema_for_eval: true
|
| 127 |
+
time_dist: ${if:${eq:${model.sample_time_strategy}, log}, ${model.beta_sched},
|
| 128 |
+
${model.linear_sched}}
|
| 129 |
+
integrator: ${model.integrator}
|
| 130 |
+
vocab: ${data.vocab}
|
| 131 |
+
use_learnable_loss_weights: false
|
| 132 |
+
use_time_weights: false
|
| 133 |
+
model:
|
| 134 |
+
_target_: morph.model.finetune.pocket.ScaffoldPocketConditionalDiTBackboneWithHeads
|
| 135 |
+
_recursive_: false
|
| 136 |
+
atom_type_embedding_args: ${embeddings.atom_type_embedding}
|
| 137 |
+
edge_type_embedding_args: ${embeddings.edge_type_embedding}
|
| 138 |
+
time_embedding_args: ${embeddings.time_embedding}
|
| 139 |
+
node_count_embedding_args: ${embeddings.node_count_embedding}
|
| 140 |
+
incident_bond_embedding: false
|
| 141 |
+
backbone_model_args: ${model.backbone}
|
| 142 |
+
heads_args: ${heads.heads}
|
| 143 |
+
insertion_head_args: ${insertion_head.model}
|
| 144 |
+
ins_edge_head_args: ${heads.ins_edge_head}
|
| 145 |
+
encoder_args: ${model.pocket_encoder}
|
| 146 |
+
use_distance_bias: true
|
| 147 |
+
pretrained_ckpt: null
|
| 148 |
+
pretrained_prefer_ema: true
|
| 149 |
+
freeze_pretrained_backbone: true
|
| 150 |
+
freeze_output_heads: false
|
| 151 |
+
exclude_scaffold_from_sub_loss: true
|
| 152 |
+
exclude_scaffold_from_x_loss: false
|
| 153 |
+
freeze_keep_positions: false
|
| 154 |
+
freeze_keep_charges: true
|
| 155 |
+
rotate: true
|
| 156 |
+
n_augmentations: 1
|
| 157 |
+
integrator: ${integrator.integrator}
|
| 158 |
+
beta_sched:
|
| 159 |
+
_target_: torch.distributions.Beta
|
| 160 |
+
concentration1: 2.0
|
| 161 |
+
concentration0: 1.0
|
| 162 |
+
linear_sched:
|
| 163 |
+
_target_: torch.distributions.Uniform
|
| 164 |
+
low: 0.0
|
| 165 |
+
high: 1.0
|
| 166 |
+
sample_time_strategy: linear
|
| 167 |
+
head_node_dim: ${model.backbone.out_node_nf}
|
| 168 |
+
head_edge_dim: ${model.backbone.out_edge_nf}
|
| 169 |
+
head_node_adapter_dim: 256
|
| 170 |
+
head_edge_adapter_dim: 256
|
| 171 |
+
head_insertion_adapter_dim: 256
|
| 172 |
+
head_insertion_edge_dim: 256
|
| 173 |
+
head_independent_adapters: true
|
| 174 |
+
head_initialization:
|
| 175 |
+
output_std: 0.001
|
| 176 |
+
coordinate_output_std: 0.0
|
| 177 |
+
do_del_probability: 0.5
|
| 178 |
+
do_sub_a_probability: 0.5
|
| 179 |
+
do_sub_e_probability: 0.5
|
| 180 |
+
ins_rate: 0.6931471805599453
|
| 181 |
+
token_weighting:
|
| 182 |
+
type_loss_token_weights: uniform
|
| 183 |
+
weight_alpha: 0.4
|
| 184 |
+
lora:
|
| 185 |
+
enabled: true
|
| 186 |
+
rank: 8
|
| 187 |
+
alpha: 8.0
|
| 188 |
+
dropout: 0.0
|
| 189 |
+
targets:
|
| 190 |
+
- qkv
|
| 191 |
+
- proj
|
| 192 |
+
- mlp.gate_value
|
| 193 |
+
- mlp.out_proj
|
| 194 |
+
freeze_base: true
|
| 195 |
+
backbone:
|
| 196 |
+
_target_: morph.model.backbones.conditional_dit.ConditionalDiTBackbone
|
| 197 |
+
_recursive_: false
|
| 198 |
+
d_input: ${embeddings.atom_type_embedding.out_dim}
|
| 199 |
+
d_cond: ${oc.eval:"${embeddings.time_embedding.out_dim} + ${embeddings.node_count_embedding.out_dim}"}
|
| 200 |
+
d_model: 512
|
| 201 |
+
out_node_nf: 256
|
| 202 |
+
out_edge_nf: 256
|
| 203 |
+
num_layers: 8
|
| 204 |
+
nhead: 16
|
| 205 |
+
mlp_ratio: 4.0
|
| 206 |
+
ffn_hidden_dim: null
|
| 207 |
+
ffn_multiple_of: 64
|
| 208 |
+
qk_norm: true
|
| 209 |
+
coordinate_output_init_std: ${model.head_initialization.coordinate_output_std}
|
| 210 |
+
center_coordinate_output: true
|
| 211 |
+
in_edge_nf: ${embeddings.edge_type_embedding.out_dim}
|
| 212 |
+
edge_pair_dim: 256
|
| 213 |
+
pair_bias_hidden_dim: 32
|
| 214 |
+
num_atom_types: ${len:${data.vocab.atom_tokens}}
|
| 215 |
+
lora: ${model.lora}
|
| 216 |
+
rbf_embedding_args:
|
| 217 |
+
_target_: morph.model.layers.embedding.RBFEmbedding
|
| 218 |
+
num_rbf: 128
|
| 219 |
+
rbf_dmax: 3.5
|
| 220 |
+
out_dim: 64
|
| 221 |
+
dropout: 0.0
|
| 222 |
+
trainable: false
|
| 223 |
+
ctx_dim: 128
|
| 224 |
+
use_cross_attn: true
|
| 225 |
+
use_node_cond: true
|
| 226 |
+
use_edge_cond: true
|
| 227 |
+
pocket_encoder:
|
| 228 |
+
_target_: morph.model.finetune.pocket.PocketContextEncoder
|
| 229 |
+
num_atom_types: ${len:${data.pocket_vocab.atom_tokens}}
|
| 230 |
+
num_charges: ${len:${data.pocket_vocab.charge_tokens}}
|
| 231 |
+
ctx_dim: ${model.backbone.ctx_dim}
|
| 232 |
+
num_attn_layers: 2
|
| 233 |
+
nhead: 8
|
| 234 |
+
dropout: 0.0
|
| 235 |
+
schedule:
|
| 236 |
+
_target_: morph.flow_matching.schedules.SmoothstepSchedule
|
| 237 |
+
shift: 0.8
|
| 238 |
+
trainer:
|
| 239 |
+
trainer:
|
| 240 |
+
deterministic: warn
|
| 241 |
+
devices: 2
|
| 242 |
+
accelerator: gpu
|
| 243 |
+
strategy: ddp_find_unused_parameters_false
|
| 244 |
+
precision: bf16-mixed
|
| 245 |
+
max_epochs: 100
|
| 246 |
+
accumulate_grad_batches: 4
|
| 247 |
+
num_sanity_val_steps: 0
|
| 248 |
+
gradient_clip_val: null
|
| 249 |
+
gradient_clip_algorithm: norm
|
| 250 |
+
check_val_every_n_epoch: 5
|
| 251 |
+
num_val_samples: null
|
| 252 |
+
limit_val_batches: null
|
| 253 |
+
limit_predict_batches: 4
|
| 254 |
+
use_distributed_sampler: false
|
| 255 |
+
enable_progress_bar: false
|
| 256 |
+
max_time:
|
| 257 |
+
seconds: 84526
|
| 258 |
+
do_train: true
|
| 259 |
+
do_validate: false
|
| 260 |
+
do_predict: false
|
| 261 |
+
checkpoint_path: null
|
| 262 |
+
final_checkpoint_path: final.ckpt
|
| 263 |
+
callbacks:
|
| 264 |
+
monitor_metric: ${if:${oc.eval:"'${representation}' in ('geometric_graph', 'molecule')"},val/validity,val/batch/pair_dist_l1}
|
| 265 |
+
monitor_metric_mode: ${if:${oc.eval:"'${representation}' in ('geometric_graph',
|
| 266 |
+
'molecule')"},max,min}
|
| 267 |
+
model_checkpoints:
|
| 268 |
+
save_top_k: 1
|
| 269 |
+
save_last: false
|
| 270 |
+
verbose: false
|
| 271 |
+
every_n_epochs: 5
|
| 272 |
+
every_n_epochs_checkpoint:
|
| 273 |
+
every_n_epochs: 5
|
| 274 |
+
save_top_k: -1
|
| 275 |
+
save_last: link
|
| 276 |
+
verbose: false
|
| 277 |
+
save_on_train_epoch_end: true
|
| 278 |
+
metric_audit:
|
| 279 |
+
_target_: run_audit.ValidationAudit
|
| 280 |
+
expected_samples: 4096
|
| 281 |
+
expected_scaffolds: 512
|
| 282 |
+
logging:
|
| 283 |
+
enabled: false
|
| 284 |
+
project: morph-crossdocked-scaffold-finetune
|
| 285 |
+
name: ${oc.env:MORPH_RUN_ID,base}
|
| 286 |
+
save_dir: .
|
| 287 |
+
offline: false
|
| 288 |
+
tags:
|
| 289 |
+
- pocket-scaffold-decoration
|
| 290 |
+
- chembl3d-no-h
|
| 291 |
+
- libinvent
|
| 292 |
+
- lora
|
| 293 |
+
- trainable-heads
|
| 294 |
+
- movable-scaffold
|
| 295 |
+
- jitter-0.1A
|
| 296 |
+
- replay-10pct
|
| 297 |
+
- scaffold-metrics
|
| 298 |
+
integrator:
|
| 299 |
+
integrator:
|
| 300 |
+
_target_: morph.flow_matching.integration.RateIntegrator
|
| 301 |
+
vocab: ${data.vocab}
|
| 302 |
+
distributions: None
|
| 303 |
+
insertion_head_mode: ${insertion_head.mode}
|
| 304 |
+
insertion_dimension: ${insertion_head.dimension}
|
| 305 |
+
insertion_num_components: ${insertion_head.num_components}
|
| 306 |
+
time_strategy: log
|
| 307 |
+
time_beta_alpha: 2.0
|
| 308 |
+
time_beta_beta: 1.0
|
| 309 |
+
num_integration_steps: 100
|
| 310 |
+
ins_noise_scale: ${data.ins_noise_scale}
|
| 311 |
+
renoise_insertions: true
|
| 312 |
+
exact_schedule_integration: true
|
| 313 |
+
del_schedule: ${data.interpolator.del_schedule}
|
| 314 |
+
ins_schedule: ${data.interpolator.ins_schedule}
|
| 315 |
+
sub_schedule: ${data.interpolator.sub_schedule}
|
| 316 |
+
sub_e_schedule: ${data.interpolator.sub_e_schedule}
|
| 317 |
+
data:
|
| 318 |
+
root_path: ${oc.env:MORPH_DATA_ROOT,./data}
|
| 319 |
+
preprocess_workers: 10
|
| 320 |
+
preprocess_chunk_size: 128
|
| 321 |
+
statistics_workers: ${data.preprocess_workers}
|
| 322 |
+
hydrogen_mode: implicit
|
| 323 |
+
cache_name: ${data.dataset_name}${if:${eq:${data.hydrogen_mode},implicit},_implicit_h,''}
|
| 324 |
+
source_dir: ${oc.env:MORPH_CROSSDOCKED_RAW,null}
|
| 325 |
+
max_atoms: null
|
| 326 |
+
allowed_atom_symbols: null
|
| 327 |
+
n_atoms_strategy: uniform
|
| 328 |
+
uniform_n_atoms_padding: 5
|
| 329 |
+
optimal_transport: equivariant
|
| 330 |
+
ins_noise_scale: 0.65
|
| 331 |
+
move_noise_scale: 0.5
|
| 332 |
+
allow_charged: true
|
| 333 |
+
preprocessing:
|
| 334 |
+
_target_: morph.dataset.core.preprocessing.Preprocessing
|
| 335 |
+
_recursive_: false
|
| 336 |
+
root: ${data.pretrained_assets_root}
|
| 337 |
+
num_workers: ${data.statistics_workers}
|
| 338 |
+
train_dataset: null
|
| 339 |
+
atom_tokens_path: ${data.preprocessing.root}/atom_tokens.txt
|
| 340 |
+
edge_tokens_path: ${data.preprocessing.root}/edge_tokens.txt
|
| 341 |
+
charge_tokens_path: ${data.preprocessing.root}/charge_tokens.txt
|
| 342 |
+
distributions_path: ${data.preprocessing.root}/distributions.pt
|
| 343 |
+
vocab: null
|
| 344 |
+
interpolator:
|
| 345 |
+
_target_: morph.flow_matching.interpolation.Interpolator
|
| 346 |
+
distributions: null
|
| 347 |
+
optimal_transport: ${data.optimal_transport}
|
| 348 |
+
ins_noise_scale: ${data.ins_noise_scale}
|
| 349 |
+
move_noise_scale: ${data.move_noise_scale}
|
| 350 |
+
atom_type_noise_prob: 0.0
|
| 351 |
+
pre_align_iters: 2
|
| 352 |
+
c_move: 1.0
|
| 353 |
+
c_sub: 0.0
|
| 354 |
+
c_ins: 6.125
|
| 355 |
+
c_del: 6.125
|
| 356 |
+
del_schedule: ${schedule}
|
| 357 |
+
ins_schedule: ${schedule}
|
| 358 |
+
sub_schedule:
|
| 359 |
+
_target_: morph.flow_matching.schedules.SmoothstepSchedule
|
| 360 |
+
shift: 1.5
|
| 361 |
+
sub_e_schedule:
|
| 362 |
+
_target_: morph.flow_matching.schedules.SmoothstepSchedule
|
| 363 |
+
shift: 1.5
|
| 364 |
+
jitter_scale: ${data.jitter_scale}
|
| 365 |
+
datamodule:
|
| 366 |
+
_target_: morph.dataset.conditional.pocket.scaffold_pocket.ScaffoldPocketDataModule
|
| 367 |
+
vocab: ${data.vocab}
|
| 368 |
+
distributions: null
|
| 369 |
+
representation: ${representation}
|
| 370 |
+
datasets:
|
| 371 |
+
train:
|
| 372 |
+
_target_: ${data.dataset_target}
|
| 373 |
+
root: ${data.root}
|
| 374 |
+
preprocess_workers: ${data.preprocess_workers}
|
| 375 |
+
preprocess_chunk_size: ${data.preprocess_chunk_size}
|
| 376 |
+
hydrogen_mode: ${data.hydrogen_mode}
|
| 377 |
+
source_dir: ${data.source_dir}
|
| 378 |
+
max_atoms: ${data.max_atoms}
|
| 379 |
+
allowed_atom_symbols: null
|
| 380 |
+
vocab: ${data.vocab}
|
| 381 |
+
distributions: null
|
| 382 |
+
max_pocket_atoms: ${data.max_pocket_atoms}
|
| 383 |
+
val_fraction: ${data.val_fraction}
|
| 384 |
+
val:
|
| 385 |
+
- _target_: ${data.dataset_target}
|
| 386 |
+
root: ${data.root}
|
| 387 |
+
source_dir: ${data.source_dir}
|
| 388 |
+
hydrogen_mode: ${data.hydrogen_mode}
|
| 389 |
+
max_pocket_atoms: ${data.max_pocket_atoms}
|
| 390 |
+
val_fraction: ${data.val_fraction}
|
| 391 |
+
preprocess_workers: ${data.preprocess_workers}
|
| 392 |
+
test:
|
| 393 |
+
- _target_: ${data.dataset_target}
|
| 394 |
+
root: ${data.root}
|
| 395 |
+
source_dir: ${data.source_dir}
|
| 396 |
+
hydrogen_mode: ${data.hydrogen_mode}
|
| 397 |
+
max_pocket_atoms: ${data.max_pocket_atoms}
|
| 398 |
+
val_fraction: ${data.val_fraction}
|
| 399 |
+
preprocess_workers: ${data.preprocess_workers}
|
| 400 |
+
interpolator: ${data.interpolator}
|
| 401 |
+
rotate: true
|
| 402 |
+
n_augmentations: ${model.n_augmentations}
|
| 403 |
+
num_workers:
|
| 404 |
+
train: 6
|
| 405 |
+
val: 2
|
| 406 |
+
test: 2
|
| 407 |
+
batch_size:
|
| 408 |
+
train: 32
|
| 409 |
+
val: 8
|
| 410 |
+
test: 8
|
| 411 |
+
n_atoms_strategy: ${data.n_atoms_strategy}
|
| 412 |
+
uniform_n_atoms_padding: ${data.uniform_n_atoms_padding}
|
| 413 |
+
time_dist: ${model.module.time_dist}
|
| 414 |
+
pocket_vocab: ${data.pocket_vocab}
|
| 415 |
+
finetune_fraction: ${data.finetune_fraction}
|
| 416 |
+
train_epoch_size: ${data.train_epoch_size}
|
| 417 |
+
mix_seed: ${seed}
|
| 418 |
+
pretrain_dataset:
|
| 419 |
+
_target_: morph.dataset.unconditional.chembl3d.FlowMatchingChEMBL3DDataset
|
| 420 |
+
root: ${data.pretrain_root}
|
| 421 |
+
source_dir: ${data.pretrain_source_dir}
|
| 422 |
+
hydrogen_mode: ${data.hydrogen_mode}
|
| 423 |
+
max_atoms: ${data.pretrain_max_atoms}
|
| 424 |
+
allowed_atom_symbols: ${data.pretrain_allowed_atom_symbols}
|
| 425 |
+
preprocess_workers: ${data.preprocess_workers}
|
| 426 |
+
preprocess_chunk_size: ${data.preprocess_chunk_size}
|
| 427 |
+
scaffold_groups_dir: ${data.scaffold_groups_dir}
|
| 428 |
+
scaffold_kind: ${data.scaffold_kind}
|
| 429 |
+
enumerate_slicings: ${data.enumerate_slicings}
|
| 430 |
+
eval_panel: ${data.eval_panel}
|
| 431 |
+
train_prefetch_factor: 1
|
| 432 |
+
dataset_name: crossdocked
|
| 433 |
+
dataset_target: morph.dataset.conditional.pocket.CrossDockedPocketDataset
|
| 434 |
+
root: ${oc.env:MORPH_CROSSDOCKED_ROOT,./data/crossdocked}
|
| 435 |
+
pretrained_assets_root: ${oc.env:MORPH_BUNDLE_DIR,.}
|
| 436 |
+
pretrain_root: ${data.root_path}/chembl3d_max100_implicit_h
|
| 437 |
+
pretrain_source_dir: ${oc.env:CHEMBL3D_SOURCE_DIR,null}
|
| 438 |
+
pretrain_max_atoms: 100
|
| 439 |
+
pretrain_allowed_atom_symbols: null
|
| 440 |
+
finetune_fraction: 0.9
|
| 441 |
+
train_epoch_size: 102400
|
| 442 |
+
pocket_vocab: null
|
| 443 |
+
max_pocket_atoms: 512
|
| 444 |
+
val_fraction: 0.02
|
| 445 |
+
scaffold_kind: libinvent
|
| 446 |
+
scaffold_groups_dir: ${data.root}/scaffold_groups
|
| 447 |
+
enumerate_slicings: true
|
| 448 |
+
eval_panel:
|
| 449 |
+
n_scaffolds: 512
|
| 450 |
+
samples_per_scaffold: 8
|
| 451 |
+
seed: 42
|
| 452 |
+
jitter_scale: 0.1
|
| 453 |
+
embeddings:
|
| 454 |
+
atom_type_embedding:
|
| 455 |
+
_target_: morph.model.layers.embedding.Embedding
|
| 456 |
+
num_embeddings: ${len:${data.vocab.atom_tokens}}
|
| 457 |
+
embedding_dim: 64
|
| 458 |
+
out_dim: 128
|
| 459 |
+
edge_type_embedding:
|
| 460 |
+
_target_: morph.model.layers.embedding.Embedding
|
| 461 |
+
num_embeddings: ${len:${data.vocab.edge_tokens}}
|
| 462 |
+
embedding_dim: 64
|
| 463 |
+
out_dim: 128
|
| 464 |
+
time_embedding:
|
| 465 |
+
_target_: morph.model.layers.embedding.TimeEmbedding
|
| 466 |
+
embedding_dim: 128
|
| 467 |
+
out_dim: 128
|
| 468 |
+
node_count_embedding:
|
| 469 |
+
_target_: morph.model.layers.embedding.ExtrapolatableCountEmbedding
|
| 470 |
+
embedding_dim: 64
|
| 471 |
+
out_dim: 128
|
| 472 |
+
min_period: 128.0
|
| 473 |
+
max_period: 1024.0
|
| 474 |
+
max_count: 96.0
|
crossdocked/scaffold/distributions.pt
ADDED
|
@@ -0,0 +1,3 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
version https://git-lfs.github.com/spec/v1
|
| 2 |
+
oid sha256:ba4101ee7f3284dd2087b15573f1730aaa70ee808d874ced396fcd64d55a66d5
|
| 3 |
+
size 89925
|
crossdocked/scaffold/edge_tokens.txt
ADDED
|
@@ -0,0 +1,4 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
<NO_BOND>
|
| 2 |
+
1
|
| 3 |
+
2
|
| 4 |
+
3
|
crossdocked/scaffold/epoch_100.ckpt
ADDED
|
@@ -0,0 +1,3 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
version https://git-lfs.github.com/spec/v1
|
| 2 |
+
oid sha256:4d17db9a77e75e12c452f0512301e5894b2d1a0bd9725186e35bf183a238b2b6
|
| 3 |
+
size 625018500
|
crossdocked/scaffold/manifest.json
ADDED
|
@@ -0,0 +1,38 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
{
|
| 2 |
+
"README.md": {
|
| 3 |
+
"bytes": 3605,
|
| 4 |
+
"sha256": "3fbf8f22544665aa9f224094f65458dd71e50fc93500985a9a48f30f6d1df00b"
|
| 5 |
+
},
|
| 6 |
+
"atom_tokens.txt": {
|
| 7 |
+
"bytes": 28,
|
| 8 |
+
"sha256": "c7b8859e8b0fd79dfe48603073fcf10ded2d93da0e8de7a63fcc56515ab4d28f"
|
| 9 |
+
},
|
| 10 |
+
"charge_tokens.txt": {
|
| 11 |
+
"bytes": 7,
|
| 12 |
+
"sha256": "e8f533e310170a31a7e5e5fe125447fbe0253de205966ae295713c98c6ac531c"
|
| 13 |
+
},
|
| 14 |
+
"config.yaml": {
|
| 15 |
+
"bytes": 15569,
|
| 16 |
+
"sha256": "6cea95be3c2569771719e7313200e5c3c0e793a5c6cdb1db01898872b59263c7"
|
| 17 |
+
},
|
| 18 |
+
"distributions.pt": {
|
| 19 |
+
"bytes": 89925,
|
| 20 |
+
"sha256": "ba4101ee7f3284dd2087b15573f1730aaa70ee808d874ced396fcd64d55a66d5"
|
| 21 |
+
},
|
| 22 |
+
"edge_tokens.txt": {
|
| 23 |
+
"bytes": 16,
|
| 24 |
+
"sha256": "42b635ef938d2ec5a601044e4b01f3f84ed121f1bfaac984d86f180a8ccba3fd"
|
| 25 |
+
},
|
| 26 |
+
"epoch_100.ckpt": {
|
| 27 |
+
"bytes": 625018500,
|
| 28 |
+
"sha256": "4d17db9a77e75e12c452f0512301e5894b2d1a0bd9725186e35bf183a238b2b6"
|
| 29 |
+
},
|
| 30 |
+
"metadata.json": {
|
| 31 |
+
"bytes": 2175,
|
| 32 |
+
"sha256": "51b30352101276d7751d9d146e022c8e493d96695b7055cd11eb7c8f26f77ca5"
|
| 33 |
+
},
|
| 34 |
+
"summary.csv": {
|
| 35 |
+
"bytes": 3920,
|
| 36 |
+
"sha256": "7a1a9ce90367da79d59717dd158996992f7f0a2bc917449a1c3acb3582b3740b"
|
| 37 |
+
}
|
| 38 |
+
}
|
crossdocked/scaffold/metadata.json
ADDED
|
@@ -0,0 +1,89 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
{
|
| 2 |
+
"model": "crossdocked-scaffold",
|
| 3 |
+
"task": "scaffold_decoration_in_pocket",
|
| 4 |
+
"dataset": "CrossDocked",
|
| 5 |
+
"variant": "implicit_h",
|
| 6 |
+
"hydrogens": "implicit",
|
| 7 |
+
"completed_epochs": 100,
|
| 8 |
+
"global_step": 40000,
|
| 9 |
+
"checkpoint": "epoch_100.ckpt",
|
| 10 |
+
"checkpoint_sha256": "4d17db9a77e75e12c452f0512301e5894b2d1a0bd9725186e35bf183a238b2b6",
|
| 11 |
+
"checkpoint_bytes": 625018500,
|
| 12 |
+
"lora_rank": 8,
|
| 13 |
+
"lora_alpha": 8.0,
|
| 14 |
+
"base_model": "chembl3d-implicit-h",
|
| 15 |
+
"base_completed_epochs": 365,
|
| 16 |
+
"finetune_fraction": 0.9,
|
| 17 |
+
"in_vacuum_replay_fraction": 0.1,
|
| 18 |
+
"training_scaffold_kind": "libinvent",
|
| 19 |
+
"freeze_keep_positions": false,
|
| 20 |
+
"freeze_keep_charges": true,
|
| 21 |
+
"default_eval_weights": "ema",
|
| 22 |
+
"integration_steps": 100,
|
| 23 |
+
"original_checkpoint_including_optimizer": true,
|
| 24 |
+
"evaluation": {
|
| 25 |
+
"split": "test",
|
| 26 |
+
"protocol": "diffdec",
|
| 27 |
+
"panels": {
|
| 28 |
+
"single": 43,
|
| 29 |
+
"multi": 102
|
| 30 |
+
},
|
| 31 |
+
"seeds": [
|
| 32 |
+
42,
|
| 33 |
+
43,
|
| 34 |
+
44
|
| 35 |
+
],
|
| 36 |
+
"samples_per_condition": 100,
|
| 37 |
+
"total_generation_attempts": 43500,
|
| 38 |
+
"precision": "float32 without autocast",
|
| 39 |
+
"standard_deviation": "sample (ddof=1)",
|
| 40 |
+
"summary": "summary.csv",
|
| 41 |
+
"compatibility_notes": [
|
| 42 |
+
"Published DiffDec conditions and metric formulas; original reference CSVs unavailable, so reference scaffold/protein strings are reconstructed.",
|
| 43 |
+
"Morph predicted bond topology is retained, rather than inferred from XYZ with Open Babel.",
|
| 44 |
+
"RDKit 2025.9.6 and deterministic per-attempt embedding seeds; upstream used older RDKit and unspecified embedding seeds.",
|
| 45 |
+
"Docking reconstructs and UFF-minimizes SMILES; the stored generated coordinates are unchanged."
|
| 46 |
+
]
|
| 47 |
+
},
|
| 48 |
+
"atom_tokens": [
|
| 49 |
+
"B",
|
| 50 |
+
"Br",
|
| 51 |
+
"C",
|
| 52 |
+
"Cl",
|
| 53 |
+
"F",
|
| 54 |
+
"I",
|
| 55 |
+
"N",
|
| 56 |
+
"O",
|
| 57 |
+
"P",
|
| 58 |
+
"S",
|
| 59 |
+
"Se",
|
| 60 |
+
"Si"
|
| 61 |
+
],
|
| 62 |
+
"edge_tokens": [
|
| 63 |
+
"<NO_BOND>",
|
| 64 |
+
"1",
|
| 65 |
+
"2",
|
| 66 |
+
"3"
|
| 67 |
+
],
|
| 68 |
+
"charge_tokens": [
|
| 69 |
+
"-1",
|
| 70 |
+
"0",
|
| 71 |
+
"1"
|
| 72 |
+
],
|
| 73 |
+
"pocket_vocab": {
|
| 74 |
+
"atom_tokens": [
|
| 75 |
+
"C",
|
| 76 |
+
"N",
|
| 77 |
+
"O",
|
| 78 |
+
"S"
|
| 79 |
+
],
|
| 80 |
+
"edge_tokens": [
|
| 81 |
+
"<NO_BOND>"
|
| 82 |
+
],
|
| 83 |
+
"charge_tokens": [
|
| 84 |
+
"0"
|
| 85 |
+
]
|
| 86 |
+
},
|
| 87 |
+
"checkpoint_stored_epoch": 100,
|
| 88 |
+
"not_unconditional_catalog_entry": true
|
| 89 |
+
}
|
crossdocked/scaffold/summary.csv
ADDED
|
@@ -0,0 +1,11 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
model,epoch,panel,row_type,seed,weights,integration_steps,n_conditions,n_attempts,validity,uniqueness,similarity,recovery,chemistry_validity_exported_component_percent,chemistry_validity_exported_component_diffdec_weighted_percent,diffdec_validity_pooled_percent,diffdec_rejected_identical_scaffold_percent,diffdec_rejected_missing_scaffold_percent,diffdec_valid_chemistry_invalid_count,vina_score,reference_vina_score,high_affinity,docking_attempts,docking_successes,docking_failures,docking_timeouts,reference_docking_attempts,reference_docking_successes,invalid_predictions_replaced,high_affinity_denominator,docking_scored_groups
|
| 2 |
+
crossdocked-scaffold,100,single,seed,42,ema,100,43,4300,88.29333333333334,52.160000000000004,0.8201344609798162,38.333333333333336,92.55813953488372,90.17333333333333,91.34883720930233,1.96,9.746666666666668,10,-8.033422353523228,-8.272,0.3995,4300,4282,18,0,43,43,372,4300,25
|
| 3 |
+
crossdocked-scaffold,100,single,seed,43,ema,100,43,4300,89.53999999999999,54.076666666666675,0.8151260011360819,40.333333333333336,93.55813953488372,91.71333333333334,92.11627906976744,2.12,8.34,5,-8.04678868797334,-8.199333333333334,0.46490000000000004,4300,4286,14,0,43,43,339,4300,25
|
| 4 |
+
crossdocked-scaffold,100,single,seed,44,ema,100,43,4300,88.31333333333333,53.72,0.8118672428330638,38.333333333333336,92.30232558139535,90.52333333333334,90.86046511627906,2.2800000000000002,9.406666666666668,8,-8.042993739683991,-8.128,0.4611333333333333,4300,4277,23,0,43,43,393,4300,25
|
| 5 |
+
crossdocked-scaffold,100,multi,seed,42,ema,100,102,10200,89.94150782013686,66.77343597262953,0.7637482772393612,32.28005865102639,92.86274509803921,91.88801319648093,91.86274509803921,1.8451612903225807,8.213330889540567,76,-8.097944471948894,-8.16168970814132,0.43488863287250384,10200,10078,122,0,102,102,830,10200,31
|
| 6 |
+
crossdocked-scaffold,100,multi,seed,43,ema,100,102,10200,89.63411534701858,66.49635874877809,0.7674004125271859,38.301564027370475,92.3529411764706,91.17148093841642,91.75490196078432,1.5580645161290323,8.807820136852396,87,-8.078235112509262,-8.61673579109063,0.3721236559139785,10200,10089,111,0,102,102,841,10200,31
|
| 7 |
+
crossdocked-scaffold,100,multi,seed,44,ema,100,102,10200,89.83097507331378,66.02837243401758,0.7701394214114178,42.898338220918866,92.40196078431373,91.74369501466275,91.44117647058823,1.6419354838709674,8.52708944281525,63,-8.0883624708498,-8.491228878648235,0.4027611367127496,10200,10099,101,0,102,102,873,10200,31
|
| 8 |
+
crossdocked-scaffold,100,single,mean,,ema,100,43,4300,88.71555555555555,53.31888888888889,0.8157092349829873,39.0,92.8062015503876,90.80333333333334,91.44186046511628,2.12,9.164444444444445,7.666666666666667,-8.04106826039352,-8.199777777777777,0.44184444444444443,4300,4281.666666666667,18.333333333333332,0,43,43,368,4300,25
|
| 9 |
+
crossdocked-scaffold,100,single,std,,ema,100,43,4300,0.7140598584722949,1.0193480123933985,0.004164354122985984,1.1547005383792515,0.663640146537193,0.8072793816269578,0.633053841340294,0.16000000000000014,0.7339492363109881,2.516611478423583,0.00688805684003741,0.07200102879923423,0.03671969397919766,0.0,4.509249752822894,4.509249752822894,0.0,0.0,0.0,27.2213151776324,0.0,0.0
|
| 10 |
+
crossdocked-scaffold,100,multi,mean,,ema,100,102,10200,89.80219941348975,66.43272238514173,0.7670960370593216,37.826653633105245,92.53921568627452,91.60106304985337,91.68627450980392,1.6817204301075268,8.516080156402737,75.33333333333333,-8.088180685102651,-8.423218125960062,0.40325780849974396,10200,10088.666666666666,111.33333333333333,0,102,102,848,10200,31
|
| 11 |
+
crossdocked-scaffold,100,multi,std,,ema,100,102,10200,0.15570344274027922,0.3765861245782725,0.0032064254671021605,5.325046494448182,0.28125467230942774,0.37896243514468936,0.21900301866361663,0.14762544123005955,0.29739749424437123,12.013880860626733,0.009855937140807926,0.23502304411011748,0.031385436038058344,0.0,10.503967504392486,10.503967504392486,0.0,0.0,0.0,22.338307903688676,0.0,0.0
|
geom/scaffold_murcko_substituent_lora_r16/README.md
CHANGED
|
@@ -1,4 +1,6 @@
|
|
| 1 |
-
#
|
|
|
|
|
|
|
| 2 |
|
| 3 |
This is the original checkpoint from the latest GEOM Murcko scaffold fine-tuning run,
|
| 4 |
with rank-16 LoRA, trainable output heads, and substituent-constrained insertion
|
|
|
|
| 1 |
+
# geom-scaffold-murcko
|
| 2 |
+
|
| 3 |
+
GEOM Murcko scaffold decoration after 25 completed fine-tuning epochs.
|
| 4 |
|
| 5 |
This is the original checkpoint from the latest GEOM Murcko scaffold fine-tuning run,
|
| 6 |
with rank-16 LoRA, trainable output heads, and substituent-constrained insertion
|
geom/scaffold_murcko_substituent_lora_r16/manifest.json
CHANGED
|
@@ -1,7 +1,7 @@
|
|
| 1 |
{
|
| 2 |
"README.md": {
|
| 3 |
-
"bytes":
|
| 4 |
-
"sha256": "
|
| 5 |
},
|
| 6 |
"atom_tokens.txt": {
|
| 7 |
"bytes": 22,
|
|
@@ -36,8 +36,8 @@
|
|
| 36 |
"sha256": "ad57177b2289610ec10983c9f20480adca7e393166ffec78e9641d3546bc433c"
|
| 37 |
},
|
| 38 |
"metadata.json": {
|
| 39 |
-
"bytes":
|
| 40 |
-
"sha256": "
|
| 41 |
},
|
| 42 |
"panels/test_murcko_512_seed42.json": {
|
| 43 |
"bytes": 226522,
|
|
|
|
| 1 |
{
|
| 2 |
"README.md": {
|
| 3 |
+
"bytes": 2787,
|
| 4 |
+
"sha256": "887e268373f5e6e26bfbcbe0b429e4c6131c86ba18189d2a02007072fdb2ddd8"
|
| 5 |
},
|
| 6 |
"atom_tokens.txt": {
|
| 7 |
"bytes": 22,
|
|
|
|
| 36 |
"sha256": "ad57177b2289610ec10983c9f20480adca7e393166ffec78e9641d3546bc433c"
|
| 37 |
},
|
| 38 |
"metadata.json": {
|
| 39 |
+
"bytes": 1490,
|
| 40 |
+
"sha256": "8809046631ae6184775a7722ae64971fa9fa9406a3d0ec1b9733be690dca262a"
|
| 41 |
},
|
| 42 |
"panels/test_murcko_512_seed42.json": {
|
| 43 |
"bytes": 226522,
|
geom/scaffold_murcko_substituent_lora_r16/metadata.json
CHANGED
|
@@ -9,7 +9,7 @@
|
|
| 9 |
"checkpoint_bytes": 638268597,
|
| 10 |
"original_checkpoint": "/cluster/project/krause/frankem/morph-chem/logs/training/geom-scaffold-substituent-lora-r16-20261012T095326Z/run/every_n_epochs/epoch=24-step=199100.ckpt",
|
| 11 |
"training_job_id": 16886672,
|
| 12 |
-
"model": "geom-scaffold-murcko
|
| 13 |
"lora_rank": 16,
|
| 14 |
"lora_alpha": 16,
|
| 15 |
"base_model": "geom-explicit-h",
|
|
|
|
| 9 |
"checkpoint_bytes": 638268597,
|
| 10 |
"original_checkpoint": "/cluster/project/krause/frankem/morph-chem/logs/training/geom-scaffold-substituent-lora-r16-20261012T095326Z/run/every_n_epochs/epoch=24-step=199100.ckpt",
|
| 11 |
"training_job_id": 16886672,
|
| 12 |
+
"model": "geom-scaffold-murcko",
|
| 13 |
"lora_rank": 16,
|
| 14 |
"lora_alpha": 16,
|
| 15 |
"base_model": "geom-explicit-h",
|