maltefranke commited on
Commit
320d7f0
·
verified ·
1 Parent(s): 53b24bb

Add evaluated crossdocked-scaffold checkpoint and metrics; simplify GEOM scaffold name

Browse files
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** with
19
- rank-16 LoRA after 25 fine-tuning epochs. The releases include the configurations,
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-substituent-lora-r16` bundle](https://huggingface.co/maltefranke/morph/tree/main/geom/scaffold_murcko_substituent_lora_r16)
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-substituent-lora-r16` | Explicit H atoms | 25 | [epoch_025.ckpt](https://huggingface.co/maltefranke/morph/resolve/main/geom/scaffold_murcko_substituent_lora_r16/epoch_025.ckpt) |
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 is on a 0–1 scale.
71
- Both evaluations use EMA weights and 100 integration steps.
 
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
- | GEOM-Drugs · scaffold decoration (LoRA r16) | 25 (fine-tuning) | 97.52 ± 0.10 | 94.10 ± 0.19 | 0.9076 ± 0.0004 | 63.54 ± 0.59 | 97.99 ± 0.20 |
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
- Metric definitions:
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
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
- # GEOM scaffold decoration: 25 completed fine-tuning epochs
 
 
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": 2752,
4
- "sha256": "3879125c6ede15b8b268f316c5c2163b1af0fb795582c3e4685acb029f52b74f"
5
  },
6
  "atom_tokens.txt": {
7
  "bytes": 22,
@@ -36,8 +36,8 @@
36
  "sha256": "ad57177b2289610ec10983c9f20480adca7e393166ffec78e9641d3546bc433c"
37
  },
38
  "metadata.json": {
39
- "bytes": 1511,
40
- "sha256": "f1200bd618873ce5ba3e1d0a3569cd852c6b1fbe6c7523863dfb567541228c1d"
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-substituent-lora-r16",
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",