|
import gradio as gr |
|
from gradio_molecule2d import molecule2d |
|
from synformer.chem.mol import Molecule |
|
from synformer.sampler.analog.parallel import run_sampling_one_cpu |
|
from huggingface_hub import hf_hub_download |
|
|
|
REPO_ID = "whgao/synformer" |
|
CKPT_FILENAME = "sf_ed_default.ckpt" |
|
MAT_FILENAME = "matrix.pkl" |
|
FPI_FILENAME = "fpindex.pkl" |
|
ckpt_path = hf_hub_download(REPO_ID, CKPT_FILENAME) |
|
mat_path = hf_hub_download(REPO_ID, MAT_FILENAME) |
|
fpi_path = hf_hub_download(REPO_ID, FPI_FILENAME) |
|
|
|
last_result = {} |
|
|
|
|
|
def clear_inputs(): |
|
|
|
return None, 4, 8, 0 |
|
|
|
def sample(smi, search_width, exhaustiveness): |
|
result_df = run_sampling_one_cpu( |
|
input=Molecule(smi), |
|
model_path=ckpt_path, |
|
mat_path=mat_path, |
|
fpi_path=fpi_path, |
|
search_width=search_width, |
|
exhaustiveness=exhaustiveness, |
|
time_limit=180, |
|
max_results=100, |
|
max_evolve_steps=24, |
|
sort_by_scores=True, |
|
) |
|
result_df = result_df[:30] |
|
last_result["results_df"] = result_df |
|
smiles = result_df.iloc[0]["smiles"] |
|
similarity = result_df.iloc[0]["score"] |
|
synthesis = result_df.iloc[0]["synthesis"] |
|
return smiles, similarity, synthesis, gr.update(maximum=len(result_df)-1) |
|
|
|
|
|
def select_from_output(index): |
|
df_results = last_result["results_df"] |
|
return df_results.iloc[index]["smiles"], df_results.iloc[index]["score"], df_results.iloc[index]["synthesis"] |
|
|
|
examples = [ |
|
"COc1ccc(-c2ccnc(Nc3ccccc3)n2)cc1", |
|
"Nc1cccc(S(=O)(=O)N2CCCN(S(=O)(=O)c3ccc4c(c3)OCCO4)CC2)c1", |
|
"CN1C[C@H](Nc2cnn(C)c(=O)c2)C[C@H](c2ccccc2)C1", |
|
"CC[C@@H]1OC[C@@]23Cc4cc(F)c(N)cc4-c4ccc5c(c42)C(=CC(F)(F)O5)[C@@H]1C3=O", |
|
"O=C(OCC(=O)N1[C@H](C(=O)O)C[C@@H]2CCCC[C@@H]21)[C@H](Cc1cbccc1)NC(I)c1bcccc1", |
|
] |
|
|
|
|
|
with gr.Blocks() as demo: |
|
gr.Markdown(f""" |
|
# Demo of [SynFormer](https://github.com/wenhao-gao/synformer/tree/main) |
|
This page demonstrates the SynFormer-ED model, which takes a molecule as input—regardless of its synthetic accessibility—and outputs |
|
identical or approximate molecules along with their associated synthetic paths. |
|
This demo runs on CPUs and typically takes about one minute per run on local machine, but can be accelerated by reducing the |
|
search width and exhaustiveness. The model may take longer if the server is busy. |
|
Since the sampling is stochastic, you may run the demo multiple times to explore different results, with a maximum of |
|
30 molecules displayed at once. |
|
To learn more about SynFormer’s architecture and applications, check out [our paper](https://github.com/wenhao-gao/synformer/tree/main). |
|
|
|
Authors: [Wenhao Gao](mailto:[email protected]), Shitong Luo, Connor W. Coley |
|
""") |
|
with gr.Row(): |
|
with gr.Column(scale=0.5): |
|
input_molecule = molecule2d(label="SMILES Input") |
|
slider_1 = gr.Slider(minimum=1, maximum=16, step=1, label="Search Width", value=4) |
|
slider_2 = gr.Slider(minimum=1, maximum=32, step=1, label="Exhaustiveness", value=8) |
|
|
|
with gr.Row(): |
|
with gr.Column(scale=0.5): |
|
run_btn = gr.Button("Run on sample") |
|
with gr.Column(scale=0.5): |
|
clear_btn = gr.Button("Clear") |
|
|
|
with gr.Column(scale=0.5): |
|
index_slider = gr.Slider(minimum=0, maximum=10, step=1, label="Select Output Index", value=0, interactive=True) |
|
output_similarity = gr.Text(label="Tanimoto Similarity") |
|
output_molecule = molecule2d(label="Output") |
|
output_synpath = gr.Textbox(label="Synthetic Path") |
|
|
|
with gr.Row(): |
|
with gr.Column(scale=1): |
|
gr.Markdown("### Examples") |
|
gr.Examples( |
|
examples = examples, |
|
inputs = [input_molecule] |
|
) |
|
|
|
run_btn.click( |
|
fn=sample, |
|
inputs=[ |
|
input_molecule, |
|
slider_1, |
|
slider_2 |
|
], |
|
outputs=[ |
|
output_molecule, |
|
output_similarity, |
|
output_synpath, |
|
index_slider |
|
], |
|
api_name="Run" |
|
) |
|
|
|
index_slider.change( |
|
fn=select_from_output, |
|
inputs=[index_slider], |
|
outputs=[output_molecule, output_similarity, output_synpath], |
|
) |
|
|
|
clear_btn.click( |
|
fn=clear_inputs, |
|
inputs=[], |
|
outputs=[input_molecule, slider_1, slider_2, index_slider] |
|
) |
|
|
|
demo.launch() |
|
|