CoolFace
Apppublic

alisemiz27/AI-DFT_Project

sourceHugging Facemitupdated 5mo agoView on Hugging Face
0likes
app.py114 linesDownload Raw Back to root
1import streamlit as st2import time3import torch4from rdkit import Chem5from rdkit.Chem import AllChem6from torch_geometric.data import Data, Batch7from torch_geometric.nn import SchNet8import py3Dmol9from stmol import showmol10 11# --- Notebook'tan Gelen Fiziksel Sabitler ---12# Z-Score Normalizasyon Sabitleri (Faz 9)13MEAN = -76.090914STD = 10.323615 16# Atomik Referans Enerjileri (eV)17ATOM_REFS = {18    1: -13.613121,19    6: -1029.863122,20    7: -1485.302529,21    8: -2042.611235,22    9: -2713.48485523}24 25st.set_page_config(page_title="AI-DFT Molecular Energy", page_icon="⚛️", layout="wide")26 27st.title("⚡ AI-DFT: Kuantum Hassasiyetinde İç Enerji ($U_0$) Tahmini")28st.markdown("Fiziğe dayalı Çizge Sinir Ağları (Physics-Informed GNN) altyapısı sayesinde, geleneksel Yoğunluk Fonksiyoneli Teorisi (DFT) hassasiyetindeki moleküler iç enerji ($U_0$) hesaplamalarını kimyasal doğrulukla ve milisaniyeler içinde gerçekleştirin.")29st.divider()30 31@st.cache_resource 32def load_model():33    try:34        model = SchNet(35            hidden_channels=128, 36            num_filters=128, 37            num_interactions=6, 38            num_gaussians=50, 39            cutoff=10.0,40            readout='add'41        )42        state_dict = torch.load("best_model_eniyi.pth", map_location=torch.device('cpu'), weights_only=True)43        model.load_state_dict(state_dict)44        model.eval() 45        return model46    except Exception as e:47        st.error(f"Model yüklenemedi. Hata: {e}")48        return None49 50model = load_model()51 52st.sidebar.header("🧪 Test Molekülü")53smiles_input = st.sidebar.text_input("SMILES Formülü:", "CC(=O)OC1=CC=CC=C1C(=O)O")54 55if st.sidebar.button("Enerjiyi Hesapla"):56    if model is None:57        st.sidebar.error("Model yüklenmediği için işlem yapılamaz.")58    else:59        try:60            start_time = time.time()61            62            # Molekül Geometrisi Hazırlığı63            mol = Chem.MolFromSmiles(smiles_input)64            mol = Chem.AddHs(mol) 65            AllChem.EmbedMolecule(mol, randomSeed=42) 66            AllChem.MMFFOptimizeMolecule(mol) 67            68            conf = mol.GetConformer()69            positions = conf.GetPositions() 70            atomic_nums = [atom.GetAtomicNum() for atom in mol.GetAtoms()] 71            72            pos_tensor = torch.tensor(positions, dtype=torch.float32)73            z_tensor = torch.tensor(atomic_nums, dtype=torch.long)74            75            # Veri Hazırlığı76            data = Data(z=z_tensor, pos=pos_tensor)77            batch = Batch.from_data_list([data]) 78            batch_idx = torch.zeros(data.num_nodes, dtype=torch.long)79            80            with torch.no_grad(): 81                # 1. Gemi Ağırlığı (Mol Baseline) Hesaplama82                mol_baseline = sum(ATOM_REFS.get(int(z), 0.0) for z in data.z)83                84                # 2. Modelden Atomizasyon Çıkarımı85                out = model(batch.z, batch.pos, batch_idx)86                87                # 3. Z-Skorunu Geri Çevirme (Denormalize)88                pred_atomization = (out.view(-1).item() * STD) + MEAN89                90                # 4. Toplam Gerçek Kuantum Enerjisi91                predicted_energy = pred_atomization + mol_baseline92            93            end_time = time.time()94            inference_time = (end_time - start_time) * 1000 95            96            col1, col2 = st.columns([1, 2])97            98            with col1:99                st.subheader("📊 Sonuçlar")100                st.metric(label="İç Enerji (U0)", value=f"{predicted_energy:.4f} eV")101                st.metric(label="Süre", value=f"{inference_time:.2f} ms")102                st.success("Hesaplama AI-DFT ile başarıyla tamamlandı.")103                104            with col2:105                st.subheader("🧬 3B Konformasyon")106                mb = Chem.MolToMolBlock(mol)107                viewer = py3Dmol.view(width=500, height=400)108                viewer.addModel(mb, "mol")109                viewer.setStyle({'stick': {}, 'sphere': {'radius': 0.4}})110                viewer.zoomTo()111                showmol(viewer, height=400, width=500)112                113        except Exception as e:114            st.sidebar.error(f"Hata: Lütfen geçerli bir SMILES formülü girin. Detay: {e}")