alisemiz27/AI-DFT_Project
0
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}")