Enzo Reis de Oliveira commited on
Commit
4d799f2
·
1 Parent(s): f63af71
Files changed (2) hide show
  1. app.py +49 -35
  2. requirements.txt +5 -6
app.py CHANGED
@@ -1,54 +1,68 @@
1
- import os, sys
2
-
3
- BASE_DIR = os.path.dirname(__file__)
4
- INFERENCE_DIR = os.path.join(BASE_DIR, "smi-ted", "inference")
5
- sys.path.append(INFERENCE_DIR)
6
-
7
  import gradio as gr
8
  from smi_ted_light.load import load_smi_ted
9
 
 
 
 
 
10
 
11
- # 2) Caminho onde estão pesos e vocabulário
12
  MODEL_DIR = os.path.join("smi-ted", "inference", "smi_ted_light")
13
-
14
- # 3) Carrega o modelo SMI‑TED (Light)
15
- # Se você renomeou o .pt ou o vocab, ajuste aqui.
16
  model = load_smi_ted(
17
  folder=MODEL_DIR,
18
  ckpt_filename="smi-ted-Light_40.pt",
19
  vocab_filename="bert_vocab_curated.txt",
20
  )
21
 
22
- # 4) Função utilizada pela interface
23
- def gerar_embedding(smiles: str):
24
- """
25
- Recebe uma string SMILES e devolve o embedding (lista de 768 floats).
26
- Em caso de erro, devolve um dicionário com a mensagem.
27
- """
28
  smiles = smiles.strip()
29
  if not smiles:
30
- return {"erro": "digite uma sequência SMILES primeiro"}
 
31
 
32
  try:
33
- # model.encode devolve tensor shape (1, 768) quando return_torch=True
34
- vetor_torch = model.encode(smiles, return_torch=True)[0]
35
- return vetor_torch.tolist() # JSON‑serializável
 
 
 
 
 
 
36
  except Exception as e:
37
- return {"erro": str(e)}
38
-
39
-
40
- # 5) Define a interface Gradio
41
- demo = gr.Interface(
42
- fn=gerar_embedding,
43
- inputs=gr.Textbox(label="SMILES", placeholder="Ex.: CCO"),
44
- outputs=gr.JSON(label="Embedding (lista de floats)"),
45
- title="SMI‑TED Embedding Generator",
46
- description=(
47
- "Cole uma sequência SMILES e receba o embedding gerado pelo modelo "
48
- "SMI‑TED Light treinado pela IBM Research."
49
- ),
50
- )
 
 
 
 
 
 
 
 
 
 
 
 
 
51
 
52
- # 6) Roda localmente ou no Hugging Face Space
53
  if __name__ == "__main__":
54
  demo.launch()
 
1
+ import os
2
+ import sys
3
+ import tempfile
4
+ import pandas as pd
 
 
5
  import gradio as gr
6
  from smi_ted_light.load import load_smi_ted
7
 
8
+ # 1) Ajuste de paths para encontrar o inference
9
+ BASE_DIR = os.path.dirname(__file__)
10
+ INFERENCE_DIR = os.path.join(BASE_DIR, "smi-ted", "inference")
11
+ sys.path.append(INFERENCE_DIR)
12
 
13
+ # 2) Carregando o modelo
14
  MODEL_DIR = os.path.join("smi-ted", "inference", "smi_ted_light")
 
 
 
15
  model = load_smi_ted(
16
  folder=MODEL_DIR,
17
  ckpt_filename="smi-ted-Light_40.pt",
18
  vocab_filename="bert_vocab_curated.txt",
19
  )
20
 
21
+ # 3) Função única que gera embedding E CSV
22
+ def gerar_embedding_e_csv(smiles: str):
 
 
 
 
23
  smiles = smiles.strip()
24
  if not smiles:
25
+ # Se não digitou nada, retorna erro e esconde o botão de download
26
+ return {"erro": "digite uma sequência SMILES primeiro"}, gr.update(visible=False)
27
 
28
  try:
29
+ # Gera o embedding
30
+ vetor = model.encode(smiles, return_torch=True)[0].tolist()
31
+ # Cria DataFrame e escreve CSV num arquivo temporário
32
+ df = pd.DataFrame([vetor])
33
+ tmp = tempfile.NamedTemporaryFile(suffix=".csv", delete=False)
34
+ df.to_csv(tmp.name, index=False)
35
+ tmp.close()
36
+ # Retorna: 1) JSON, 2) update para o File (path + visível)
37
+ return vetor, gr.update(value=tmp.name, visible=True)
38
  except Exception as e:
39
+ # Em caso de erro interno, mostra mensagem e esconde o botão
40
+ return {"erro": str(e)}, gr.update(visible=False)
41
+
42
+ # 4) Montando a interface Blocks
43
+ with gr.Blocks() as demo:
44
+ gr.Markdown(
45
+ """
46
+ ## SMI-TED Embedding Generator
47
+ Cole uma sequência SMILES e receba:
48
+ 1. O vetor embedding (768 floats) em JSON
49
+ 2. Um botão para baixar esse vetor em CSV
50
+ """
51
+ )
52
+
53
+ with gr.Row():
54
+ inp_smiles = gr.Textbox(label="SMILES", placeholder="Ex.: CCO")
55
+ btn = gr.Button("Gerar Embedding")
56
+ with gr.Row():
57
+ out_json = gr.JSON(label="Embedding (lista de floats)")
58
+ out_file = gr.File(label="Download do CSV", visible=False)
59
+
60
+ # 5) Ligando o botão à função única (dois outputs)
61
+ btn.click(
62
+ fn=gerar_embedding_e_csv,
63
+ inputs=inp_smiles,
64
+ outputs=[out_json, out_file]
65
+ )
66
 
 
67
  if __name__ == "__main__":
68
  demo.launch()
requirements.txt CHANGED
@@ -1,10 +1,9 @@
1
- torch>=2.1.0
2
  transformers>=4.40.0
3
- regex
4
- numpy==1.26.4
5
- pandas==1.4.0
6
  tqdm>=4.66.4
7
  rdkit>=2024.3.5
8
- gradio==4.32.0
9
- gradio_client==0.17.0
10
  huggingface-hub
 
1
+ torch>=2.1.0
2
  transformers>=4.40.0
3
+ regex
4
+ numpy==1.26.4
5
+ pandas==1.4.0
6
  tqdm>=4.66.4
7
  rdkit>=2024.3.5
8
+ gradio>=4.32.0
 
9
  huggingface-hub