import gradio as gr import warnings import os import subprocess from pathlib import Path import shutil import spaces from atomworks.io.utils.visualize import view from lightning.fabric import seed_everything from rfd3.engine import RFD3InferenceConfig, RFD3InferenceEngine from utils import download_weights from utils.pipelines import test_rfd3_from_notebook, unconditional_generation from gradio_molecule3d import Molecule3D download_weights() # Gradio UI with gr.Blocks(title="RFD3 Test") as demo: gr.Markdown("# RFdiffusion3 (RFD3) for Backbone generation") gr.Markdown("Models auto-downloaded on launch. Click to test.") test_btn = gr.Button("Run RFD3 Test") output = gr.Textbox(label="Test Result") test_btn.click(test_rfd3_from_notebook, outputs=output) gr.Markdown("Unconditional generation of backbones") with gr.Row(): num_designs_per_batch = gr.Number( value=2, label="Number of Designs per Batch", precision=0, minimum=1, maximum=8 ) num_batches = gr.Number( value=5, label="Number of Batches", precision=0, minimum=1, maximum=10 ) length = gr.Number( value=40, label="Length of Protein (number of residues)", precision=0, minimum=10, maximum=200 ) gen_directory = gr.State(None) gen_results = gr.State(None) gen_btn = gr.Button("Run Unconditional Generation") #gen_output = gr.Textbox(label="Generation Result") gen_btn.click(unconditional_generation, inputs=[num_batches, num_designs_per_batch, length], outputs=[gen_directory, gen_results]) # New visualize section #with gr.Row(): # viz_btn = gr.Button("Visualize", visible=True) # batch_dropdown = gr.Dropdown( # choices=[], # label="Select Batch", # visible=False # ) # design_dropdown = gr.Dropdown( # choices=[], # label="Select Design", # visible=False # ) # viewer = Molecule3D(visible=False) # #def toggle_visualize(result): # if result is None: # return gr.Dropdown(visible=False), gr.Dropdown(visible=False), Molecule3D(visible=False) # batches = sorted(list({d["batch"] for d in result})) # return ( # gr.update(choices=batches, visible=True), # Batch dropdown # gr.update(choices=[], visible=True), # Design empty initially # gr.update(visible=False) # ) # #def update_designs(batch, result): # if batch is None: # return gr.update(choices=[]) # designs = sorted(list({d["design"] for d in result if d["batch"] == batch})) # return gr.update(choices=designs) # #def load_viewer(batch, design, result): # if batch is None or design is None: # return gr.update(visible=False) # pdb_data = next(d["pdb"] for d in result if d["batch"] == int(batch) and d["design"] == int(design)) # return gr.update(value=pdb_data, visible=True, reps=[{"style": "cartoon"}]) # Customize style # ## Events #viz_btn.click(toggle_visualize, inputs=gen_directory, outputs=[batch_dropdown, design_dropdown, viewer]) #batch_dropdown.change(update_designs, inputs=[batch_dropdown, gen_directory], outputs=design_dropdown) #batch_dropdown.select(fn=update_designs, inputs=[batch_dropdown, gen_directory], outputs=design_dropdown) # For selection #gr.Dropdown.select(update_designs, batch_dropdown, design_dropdown).then( # Chain # lambda b, d, r: load_viewer(b, d, r), # inputs=[batch_dropdown, design_dropdown, gen_directory], # outputs=viewer #) if __name__ == "__main__": demo.launch()