kelu01 commited on
Commit
e8dc124
·
verified ·
1 Parent(s): 83b65d8

Update pipe.py

Browse files
Files changed (1) hide show
  1. pipe.py +33 -39
pipe.py CHANGED
@@ -84,57 +84,51 @@ class SmilesDiffusionPipe(Pipeline):
84
  Iteratively unmasks a single SMILES string using a trained diffusion model.
85
  High-confidence tokens are unmasked first, sampled multinomially.
86
  """
87
- steps = 30
88
  model.eval()
 
 
 
 
 
 
 
89
  with torch.no_grad():
90
- unmasked = torch.tensor(input_ids, dtype=torch.long, device=self.device).unsqueeze(0)
91
-
92
- mask_token = voc.vocab["[MASK]"]
93
- pad_token = voc.vocab.get("[PAD]", None)
94
-
95
- num_masked = (unmasked == mask_token).sum().item()
96
- if num_masked == 0:
97
- return self.decode(input_ids[1:-1])
98
-
99
- steps = min(steps, num_masked)
100
-
101
- for _ in range(steps):
102
- # Estimate diffusion time t
103
- if pad_token is not None:
104
- valid = unmasked != pad_token
105
- frac_masked = (unmasked == mask_token).sum() / valid.sum()
106
- else:
107
- frac_masked = (unmasked == mask_token).sum() / unmasked.size(1)
108
- t = frac_masked.unsqueeze(0).to(self.device)
109
-
110
- # Forward pass
111
- logits = model(unmasked, t=t)
112
- probs = F.softmax(logits, dim=-1)
113
 
114
- # Mask positions
115
- mask_positions = unmasked == mask_token
116
- mask_indices = mask_positions.nonzero(as_tuple=False)
117
- if mask_indices.numel() == 0:
118
- break
119
 
 
 
 
 
 
 
120
  masked_probs = probs[mask_positions]
121
 
122
- # Multinomial sample for each masked token
 
 
 
123
  sampled_ids = torch.multinomial(masked_probs, num_samples=1).squeeze(-1)
124
  masked_confidence = masked_probs.max(dim=-1).values
125
 
126
- # Select highest-confidence mask to fill
127
  best_idx = torch.argmax(masked_confidence)
 
128
  pos = mask_indices[best_idx]
129
 
 
130
  unmasked[0, pos[1]] = sampled_ids[best_idx]
131
 
132
- # Decode
133
- decoded = [
134
- t for t in unmasked[0].tolist()
135
- if t not in (pad_token, voc.vocab.get("<s>"), voc.vocab.get("</s>"))
136
- ]
137
- if len(decoded) > 2:
138
- decoded = decoded[1:-1]
139
 
140
- return self.decode(decoded).replace(" ", "")
 
84
  Iteratively unmasks a single SMILES string using a trained diffusion model.
85
  High-confidence tokens are unmasked first, sampled multinomially.
86
  """
 
87
  model.eval()
88
+ pad_token = voc.vocab["[PAD]"]
89
+ mask_token = voc.vocab["[MASK]"]
90
+
91
+ # encode input_ids (assuming input_ids is a SMILES string)
92
+ encoded = self.encode(self.tokenize_smiles(input_ids))
93
+ encoded_tensor = torch.tensor(encoded, dtype=torch.long).unsqueeze(0).to(self.device)
94
+
95
  with torch.no_grad():
96
+ unmasked = encoded_tensor.clone()
97
+ num_masks = (unmasked == mask_token).sum().item()
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
98
 
99
+ for _ in range(num_masks):
100
+ # compute diffusion time t
101
+ t_val = estimate_t_per_sequence(unmasked, mask_token, pad_token).to(self.device)
 
 
102
 
103
+ # forward pass
104
+ logits = model(unmasked, t=t_val)
105
+ probs = F.softmax(logits, dim=-1)
106
+
107
+ # masked positions
108
+ mask_positions = (unmasked == mask_token)
109
  masked_probs = probs[mask_positions]
110
 
111
+ if masked_probs.numel() == 0:
112
+ break
113
+
114
+ # multinomial sample per masked token
115
  sampled_ids = torch.multinomial(masked_probs, num_samples=1).squeeze(-1)
116
  masked_confidence = masked_probs.max(dim=-1).values
117
 
118
+ # pick the highest-confidence mask
119
  best_idx = torch.argmax(masked_confidence)
120
+ mask_indices = mask_positions.nonzero(as_tuple=False)
121
  pos = mask_indices[best_idx]
122
 
123
+ # unmask
124
  unmasked[0, pos[1]] = sampled_ids[best_idx]
125
 
126
+ # decode and remove padding / special tokens
127
+ decoded_tokens = [t for t in unmasked[0].tolist()
128
+ if t not in (pad_token, voc.vocab.get("<s>"), voc.vocab.get("</s>"))]
129
+ if len(decoded_tokens) > 2:
130
+ decoded_tokens = decoded_tokens[1:-1]
131
+
132
+ predicted_smi = self.decode(decoded_tokens).replace(" ", "")
133
 
134
+ return predicted_smi