{"metadata":{"kernelspec":{"language":"python","display_name":"Python 3","name":"python3"},"language_info":{"name":"python","version":"3.10.12","mimetype":"text/x-python","codemirror_mode":{"name":"ipython","version":3},"pygments_lexer":"ipython3","nbconvert_exporter":"python","file_extension":".py"},"kaggle":{"accelerator":"gpu","dataSources":[{"sourceId":87793,"databundleVersionId":11228175,"isSourceIdPinned":false,"sourceType":"competition"},{"sourceId":7395079,"sourceType":"datasetVersion","datasetId":4299455},{"sourceId":7639698,"sourceType":"datasetVersion","datasetId":4299272},{"sourceId":224703571,"sourceType":"kernelVersion"}],"dockerImageVersionId":30919,"isInternetEnabled":false,"language":"python","sourceType":"notebook","isGpuEnabled":true}},"nbformat_minor":4,"nbformat":4,"cells":[{"cell_type":"code","source":"import pandas as pd\nimport torch\nimport matplotlib.pyplot as plt\nimport numpy as np\nimport torch\nimport random\nimport pickle","metadata":{"_uuid":"8f2839f25d086af736a60e9eeb907d3b93b6e0e5","_cell_guid":"b1076dfc-b9ad-4769-8c92-a6c4dae69d19","trusted":true,"execution":{"iopub.status.busy":"2025-03-04T14:24:14.700921Z","iopub.execute_input":"2025-03-04T14:24:14.701277Z","iopub.status.idle":"2025-03-04T14:24:18.473250Z","shell.execute_reply.started":"2025-03-04T14:24:14.701246Z","shell.execute_reply":"2025-03-04T14:24:18.472379Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"config = {\n    \"seed\": 0,\n    \"cutoff_date\": \"2020-01-01\",\n    \"test_cutoff_date\": \"2022-05-01\",\n    \"max_len\": 384,\n    \"batch_size\": 1,\n    \"learning_rate\": 1e-5,\n    \"weight_decay\": 0.0, #altered from 0.0\n    \"mixed_precision\": \"bf16\",\n    \"model_config_path\": \"../working/configs/pairwise.yaml\",  # Adjust path as needed\n    \"epochs\": 10,\n    \"cos_epoch\": 5,\n    \"loss_power_scale\": 1.0,\n    \"max_cycles\": 1,\n    \"grad_clip\": 0.1,\n    \"gradient_accumulation_steps\": 1,\n    \"d_clamp\": 30,\n    \"max_len_filter\": 9999999,\n    \"structural_violation_epoch\": 50,\n    \"balance_weight\": False,\n}","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2025-03-04T08:13:37.846235Z","iopub.execute_input":"2025-03-04T08:13:37.846471Z","iopub.status.idle":"2025-03-04T08:13:37.863665Z","shell.execute_reply.started":"2025-03-04T08:13:37.846452Z","shell.execute_reply":"2025-03-04T08:13:37.862868Z"}},"outputs":[],"execution_count":null},{"cell_type":"markdown","source":"# Test Cofig","metadata":{}},{"cell_type":"code","source":"config = {\n    \"seed\": 42,  # More common for reproducibility\n    \"cutoff_date\": \"2020-01-01\",\n    \"test_cutoff_date\": \"2022-05-01\",\n    \"max_len\": 512,  # Increase max sequence length for better long-range dependencies\n    \"batch_size\": 2,  # Increase batch size to stabilize training (adjust based on GPU memory)\n    \"learning_rate\": 1.5e-5,  # Slightly higher to improve convergence speed\n    \"weight_decay\": 1e-3,  # Introduce small weight decay to prevent overfitting\n    \"mixed_precision\": \"bf16\",  # Keeps efficiency without losing precision\n    \"model_config_path\": \"../working/configs/pairwise.yaml\",  \n    \"epochs\": 15,  # Increase epochs to allow better convergence\n    \"cos_epoch\": 7,  # Align cosine annealing to longer training\n    \"loss_power_scale\": 1.0,\n    \"max_cycles\": 2,  # Increase cycles to allow multiple learning phases\n    \"grad_clip\": 1.0,  # Increase gradient clipping for more stability\n    \"gradient_accumulation_steps\": 2,  # Helps manage memory while maintaining batch effect\n    \"d_clamp\": 30,\n    \"max_len_filter\": 9999999,\n    \"structural_violation_epoch\": 40,  # Reduce slightly for faster feedback\n    \"balance_weight\": True,  # Balance loss weighting if dataset is imbalanced\n}","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2025-03-04T14:40:30.422661Z","iopub.execute_input":"2025-03-04T14:40:30.422947Z","iopub.status.idle":"2025-03-04T14:40:30.427343Z","shell.execute_reply.started":"2025-03-04T14:40:30.422926Z","shell.execute_reply":"2025-03-04T14:40:30.426443Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"test_data=pd.read_csv(\"/kaggle/input/stanford-rna-3d-folding/test_sequences.csv\")","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2025-03-04T14:40:30.428593Z","iopub.execute_input":"2025-03-04T14:40:30.428891Z","iopub.status.idle":"2025-03-04T14:40:30.453090Z","shell.execute_reply.started":"2025-03-04T14:40:30.428862Z","shell.execute_reply":"2025-03-04T14:40:30.452507Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"from torch.utils.data import Dataset, DataLoader\n\nclass RNADataset(Dataset):\n    def __init__(self,data):\n        self.data=data\n        self.tokens={nt:i for i,nt in enumerate('ACGU')}\n\n    def __len__(self):\n        return len(self.data)\n    \n    def __getitem__(self, idx):\n        sequence=[self.tokens[nt] for nt in (self.data.loc[idx,'sequence'])]\n        sequence=np.array(sequence)\n        sequence=torch.tensor(sequence)\n\n\n\n\n        return {'sequence':sequence}","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2025-03-04T14:40:30.454793Z","iopub.execute_input":"2025-03-04T14:40:30.454983Z","iopub.status.idle":"2025-03-04T14:40:30.460167Z","shell.execute_reply.started":"2025-03-04T14:40:30.454967Z","shell.execute_reply":"2025-03-04T14:40:30.459187Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"test_dataset=RNADataset(test_data)\ntest_dataset[0]","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2025-03-04T14:40:30.461232Z","iopub.execute_input":"2025-03-04T14:40:30.461477Z","iopub.status.idle":"2025-03-04T14:40:30.475853Z","shell.execute_reply.started":"2025-03-04T14:40:30.461452Z","shell.execute_reply":"2025-03-04T14:40:30.475219Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"import sys\n\nsys.path.append(\"/kaggle/input/ribonanzanet2d-final\")\n\n\nfrom Network import *\nimport yaml\n\n\n\nclass Config:\n    def __init__(self, **entries):\n        self.__dict__.update(entries)\n        self.entries=entries\n\n    def print(self):\n        print(self.entries)\n\ndef load_config_from_yaml(file_path):\n    with open(file_path, 'r') as file:\n        config = yaml.safe_load(file)\n    return Config(**config)\n\nclass finetuned_RibonanzaNet(RibonanzaNet):\n    def __init__(self, config, pretrained=False):\n        config.dropout=0.25\n        super(finetuned_RibonanzaNet, self).__init__(config)\n        if pretrained:\n            self.load_state_dict(torch.load(\"/kaggle/input/ribonanzanet-weights/RibonanzaNet.pt\",map_location='cpu'))\n        # self.ct_predictor=nn.Sequential(nn.Linear(64,256),\n        #                                 nn.ReLU(),\n        #                                 nn.Linear(256,64),\n        #                                 nn.ReLU(),\n        #                                 nn.Linear(64,1)) \n        self.dropout=nn.Dropout(0.2)\n        self.xyz_predictor=nn.Linear(256,3)\n\n    def forward(self,src):\n        \n        #with torch.no_grad():\n        sequence_features, pairwise_features=self.get_embeddings(src, torch.ones_like(src).long().to(src.device))\n\n        xyz=self.xyz_predictor(sequence_features)\n\n        return xyz","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2025-03-04T14:40:30.476694Z","iopub.execute_input":"2025-03-04T14:40:30.476971Z","iopub.status.idle":"2025-03-04T14:40:30.487509Z","shell.execute_reply.started":"2025-03-04T14:40:30.476951Z","shell.execute_reply":"2025-03-04T14:40:30.486777Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"model=finetuned_RibonanzaNet(load_config_from_yaml(\"/kaggle/input/ribonanzanet2d-final/configs/pairwise.yaml\"),pretrained=False).cuda()\n\nmodel.load_state_dict(torch.load(\"/kaggle/input/ribonanzanet-3d-finetune/RibonanzaNet-3D.pt\"))","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2025-03-04T14:40:30.488377Z","iopub.execute_input":"2025-03-04T14:40:30.488631Z","iopub.status.idle":"2025-03-04T14:40:30.778966Z","shell.execute_reply.started":"2025-03-04T14:40:30.488613Z","shell.execute_reply":"2025-03-04T14:40:30.777843Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"test_dataset[0]['sequence'].shape","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2025-03-04T14:40:30.779916Z","iopub.execute_input":"2025-03-04T14:40:30.780238Z","iopub.status.idle":"2025-03-04T14:40:30.785338Z","shell.execute_reply.started":"2025-03-04T14:40:30.780215Z","shell.execute_reply":"2025-03-04T14:40:30.784651Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"model.eval()\npreds=[]\nfor i in range(len(test_dataset)):\n    src=test_dataset[i]['sequence'].long()\n    src=src.unsqueeze(0).cuda()\n\n    model.train()\n\n    tmp=[]\n    for i in range(4):\n        with torch.no_grad():\n            xyz=model(src).squeeze()\n        tmp.append(xyz.cpu().numpy())\n\n    model.eval()\n    with torch.no_grad():\n        xyz=model(src).squeeze()\n    tmp.append(xyz.cpu().numpy())\n\n    tmp=np.stack(tmp,0)\n    #exit()\n    preds.append(tmp)","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2025-03-04T14:40:30.786081Z","iopub.execute_input":"2025-03-04T14:40:30.786411Z","iopub.status.idle":"2025-03-04T14:40:42.581414Z","shell.execute_reply.started":"2025-03-04T14:40:30.786379Z","shell.execute_reply":"2025-03-04T14:40:42.580757Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"tmp.shape","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2025-03-04T14:40:42.583393Z","iopub.execute_input":"2025-03-04T14:40:42.583632Z","iopub.status.idle":"2025-03-04T14:40:42.588461Z","shell.execute_reply.started":"2025-03-04T14:40:42.583613Z","shell.execute_reply":"2025-03-04T14:40:42.587679Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"preds[0]","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2025-03-04T14:40:42.589632Z","iopub.execute_input":"2025-03-04T14:40:42.589942Z","iopub.status.idle":"2025-03-04T14:40:42.604423Z","shell.execute_reply.started":"2025-03-04T14:40:42.589895Z","shell.execute_reply":"2025-03-04T14:40:42.603726Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"preds[7][0].shape","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2025-03-04T14:40:42.605104Z","iopub.execute_input":"2025-03-04T14:40:42.605342Z","iopub.status.idle":"2025-03-04T14:40:42.615924Z","shell.execute_reply.started":"2025-03-04T14:40:42.605323Z","shell.execute_reply":"2025-03-04T14:40:42.615297Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"import plotly.graph_objects as go\nimport numpy as np\n\n# Example: Generate an Nx3 matrix\n\nxyz = preds[7][0]  # Replace this with your actual Nx3 data\nN = len(xyz)\n\n# Extract columns\nx, y, z = xyz[:, 0], xyz[:, 1], xyz[:, 2]\n\n# Create the 3D scatter plot\nfig = go.Figure(data=[go.Scatter3d(\n    x=x, y=y, z=z,\n    mode='markers',\n    marker=dict(\n        size=5,\n        color=z,  # Coloring based on z-value\n        colorscale='Viridis',  # Choose a colorscale\n        opacity=0.8\n    )\n)])\n\n# Customize layout\nfig.update_layout(\n    scene=dict(\n        xaxis_title=\"X\",\n        yaxis_title=\"Y\",\n        zaxis_title=\"Z\"\n    ),\n    title=\"3D Scatter Plot\"\n)\n\n# Show figure\nfig.show(renderer='iframe')","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2025-03-04T14:40:42.616789Z","iopub.execute_input":"2025-03-04T14:40:42.617059Z","iopub.status.idle":"2025-03-04T14:40:42.667359Z","shell.execute_reply.started":"2025-03-04T14:40:42.617033Z","shell.execute_reply":"2025-03-04T14:40:42.666712Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"ID=[]\nresname=[]\nresid=[]\nx=[]\ny=[]\nz=[]\n\ndata=[]\n\nfor i in range(len(test_data)):\n    #print(test_data.loc[i])\n\n    \n    for j in range(len(test_data.loc[i,'sequence'])):\n        # ID.append(test_data.loc[i,'sequence_id']+f\"_{j+1}\")\n        # resname.append(test_data.loc[i,'sequence'][j])\n        # resid.append(j+1) # 1 indexed\n        row=[test_data.loc[i,'target_id']+f\"_{j+1}\",\n             test_data.loc[i,'sequence'][j],\n             j+1]\n\n        for k in range(5):\n            for kk in range(3):\n                row.append(preds[i][k][j][kk])\n        data.append(row)\n\ncolumns=['ID','resname','resid']\nfor i in range(1,6):\n    columns+=[f\"x_{i}\"]\n    columns+=[f\"y_{i}\"]\n    columns+=[f\"z_{i}\"]\n\n\nsubmission=pd.DataFrame(data,columns=columns)\n\n\nsubmission\nsubmission.to_csv('submission.csv',index=False)","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2025-03-04T14:40:42.668042Z","iopub.execute_input":"2025-03-04T14:40:42.668349Z","iopub.status.idle":"2025-03-04T14:40:42.777586Z","shell.execute_reply.started":"2025-03-04T14:40:42.668327Z","shell.execute_reply":"2025-03-04T14:40:42.776706Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"submission","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2025-03-04T14:40:42.778467Z","iopub.execute_input":"2025-03-04T14:40:42.778741Z","iopub.status.idle":"2025-03-04T14:40:42.797278Z","shell.execute_reply.started":"2025-03-04T14:40:42.778715Z","shell.execute_reply":"2025-03-04T14:40:42.796477Z"}},"outputs":[],"execution_count":null},{"cell_type":"markdown","source":"# Test Program","metadata":{}},{"cell_type":"code","source":"import pandas as pd\nimport torch\nimport numpy as np\nimport random\nimport yaml\n\n# Set seed for reproducibility\ntorch.manual_seed(0)\nrandom.seed(0)\nnp.random.seed(0)\n\nconfig = {\n    \"seed\": 0,\n    \"cutoff_date\": \"2020-01-01\",\n    \"test_cutoff_date\": \"2022-05-01\",\n    \"max_len\": 384,\n    \"batch_size\": 1,\n    \"learning_rate\": 1e-5,\n    \"weight_decay\": 1e-5,  # Small value to prevent overfitting\n    \"mixed_precision\": \"bf16\",\n    \"model_config_path\": \"../working/configs/pairwise.yaml\",\n    \"epochs\": 10,\n    \"cos_epoch\": 5,\n    \"loss_power_scale\": 1.0,\n    \"max_cycles\": 1,\n    \"grad_clip\": 0.1,\n    \"gradient_accumulation_steps\": 1,\n    \"d_clamp\": 30,\n    \"max_len_filter\": 9999999,\n    \"structural_violation_epoch\": 50,\n    \"balance_weight\": False,\n}\n\n# Load test dataset\ntest_data = pd.read_csv(\"/kaggle/input/stanford-rna-3d-folding/test_sequences.csv\")\n\n# RNA Dataset Class\nclass RNADataset(torch.utils.data.Dataset):\n    def __init__(self, data):\n        self.data = data\n        self.tokens = {nt: i for i, nt in enumerate('ACGU')}\n\n    def __len__(self):\n        return len(self.data)\n    \n    def __getitem__(self, idx):\n        sequence = [self.tokens[nt] for nt in self.data.loc[idx, 'sequence']]\n        sequence = torch.tensor(sequence, dtype=torch.long)\n        return {'sequence': sequence}\n\n# Load Dataset\ntest_dataset = RNADataset(test_data)\n\n# Import model dependencies\nimport sys\nsys.path.append(\"/kaggle/input/ribonanzanet2d-final\")\n\nfrom Network import RibonanzaNet\n\n# Config Loader\nclass Config:\n    def __init__(self, **entries):\n        self.__dict__.update(entries)\n        self.entries = entries\n\ndef load_config_from_yaml(file_path):\n    with open(file_path, 'r') as file:\n        config = yaml.safe_load(file)\n    return Config(**config)\n\n# Fine-tuned Model Class\nclass FinetunedRibonanzaNet(RibonanzaNet):\n    def __init__(self, config, pretrained=False):\n        config.dropout = 0.2  # Restore dropout\n        super(FinetunedRibonanzaNet, self).__init__(config)\n        \n        if pretrained:\n            self.load_state_dict(torch.load(\n                \"/kaggle/input/ribonanzanet-weights/RibonanzaNet.pt\",\n                map_location='cpu',\n                weights_only=True  # SAFE loading\n            ))\n        \n        self.dropout = torch.nn.Dropout(0.2)  # Keep some dropout for stability\n        self.xyz_predictor = torch.nn.Linear(256, 3)  \n\n    def forward(self, src):\n        sequence_features, _ = self.get_embeddings(\n            src, torch.ones_like(src).long().to(src.device)\n        )\n        xyz = self.xyz_predictor(sequence_features)\n        return xyz\n\n# Load Model\nmodel = FinetunedRibonanzaNet(\n    load_config_from_yaml(\"/kaggle/input/ribonanzanet2d-final/configs/pairwise.yaml\"),\n    pretrained=False\n).cuda()\n\n# Load Weights Securely\nmodel.load_state_dict(torch.load(\n    \"/kaggle/input/ribonanzanet-3d-finetune/RibonanzaNet-3D.pt\",\n    map_location='cuda',\n    weights_only=True  # SAFE loading\n))\n\n# Ensure model is in evaluation mode\nmodel.eval()\n\n# Inference\npreds = []\nwith torch.no_grad():  # Disable gradient tracking for inference\n    for i in range(len(test_dataset)):\n        src = test_dataset[i]['sequence'].unsqueeze(0).cuda()\n        xyz = model(src).squeeze().cpu().numpy()\n        preds.append(xyz)\n\n# Convert predictions to submission format\ndata = []\nfor i in range(len(test_data)):\n    for j, res in enumerate(test_data.loc[i, 'sequence']):\n        row = [test_data.loc[i, 'target_id'] + f\"_{j+1}\", res, j+1]\n        row.extend(preds[i][j])\n        data.append(row)\n\n# Create DataFrame\ncolumns = ['ID', 'resname', 'resid', 'x', 'y', 'z']\nsubmission = pd.DataFrame(data, columns=columns)\n\n# Save to CSV\nsubmission.to_csv('submission.csv', index=False)\n","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2025-03-04T15:04:45.087769Z","iopub.execute_input":"2025-03-04T15:04:45.088047Z","iopub.status.idle":"2025-03-04T15:04:47.845534Z","shell.execute_reply.started":"2025-03-04T15:04:45.088026Z","shell.execute_reply":"2025-03-04T15:04:47.844835Z"}},"outputs":[],"execution_count":null}]}