{"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":"none","dataSources":[],"dockerImageVersionId":30918,"isInternetEnabled":true,"language":"python","sourceType":"notebook","isGpuEnabled":false}},"nbformat_minor":4,"nbformat":4,"cells":[{"cell_type":"code","source":"# # This Python 3 environment comes with many helpful analytics libraries installed\n# # It is defined by the kaggle/python Docker image: https://github.com/kaggle/docker-python\n# # For example, here's several helpful packages to load\n\n# import numpy as np # linear algebra\n# import pandas as pd # data processing, CSV file I/O (e.g. pd.read_csv)\n\n# # Input data files are available in the read-only \"../input/\" directory\n# # For example, running this (by clicking run or pressing Shift+Enter) will list all files under the input directory\n\n# import os\n# for dirname, _, filenames in os.walk('/kaggle/input'):\n#     for filename in filenames:\n#         print(os.path.join(dirname, filename))\n\n# # You can write up to 20GB to the current directory (/kaggle/working/) that gets preserved as output when you create a version using \"Save & Run All\" \n# # You can also write temporary files to /kaggle/temp/, but they won't be saved outside of the current session","metadata":{"_uuid":"8f2839f25d086af736a60e9eeb907d3b93b6e0e5","_cell_guid":"b1076dfc-b9ad-4769-8c92-a6c4dae69d19","trusted":true},"outputs":[],"execution_count":null},{"cell_type":"code","source":"# --- Imports ---\n# hello bhaiya aapki jay ho\nimport pandas as pd\nimport torch\nimport torch.nn as nn\nimport numpy as np\nimport math   \nfrom torch.utils.data import Dataset, DataLoader\n    \n# --- Config ---\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-4,\n    \"weight_decay\": 0.0,\n    \"mixed_precision\": \"bf16\",\n    \"model_config_path\": \"../working/configs/pairwise.yaml\",  # Adjust 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}\n\n# --- Load Test Data ---\ntest_data = pd.read_csv(\"/kaggle/input/stanford-rna-3d-folding/test_sequences.csv\")\n\n# --- Dataset Class ---\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        seq_str = self.data.loc[idx, 'sequence']\n        sequence = [self.tokens[nt] for nt in seq_str if nt in self.tokens]\n        sequence = torch.tensor(sequence, dtype=torch.long)\n        return {'sequence': sequence}\n\n# Create Dataset\ntest_dataset = RNADataset(test_data)\n\n# Add RibonanzaNet to path\nimport sys\nsys.path.append(\"/kaggle/input/ribonanzanet2/pytorch/alpha/1\")\nfrom Network import RibonanzaNet, SimpleStructureModule\n\n# --- Sinusoidal Positional Embedding ---\nclass SinusoidalPosEmb(nn.Module):\n    def __init__(self, dim):\n        super().__init__()\n        self.dim = dim\n#  hello abhishek\n    def forward(self, x):\n        device = x.device\n        half_dim = self.dim // 2\n        emb = math.log(10000) / (half_dim - 1)\n        emb = torch.exp(torch.arange(half_dim, device=device) * -emb)\n        emb = x[:, None] * emb[None, :]\n        return torch.cat((emb.sin(), emb.cos()), dim=-1)\n\n# --- Fine-tuned Model ---\nclass finetuned_RibonanzaNet(RibonanzaNet):\n    def __init__(self, config):\n        config.dropout = 0.1\n        config.use_grad_checkpoint = True\n        super().__init__(config)\n\n        decoder_dim = 768\n        self.structure_module = nn.ModuleList([\n            SimpleStructureModule(\n                d_model=decoder_dim, nhead=12,\n                dim_feedforward=decoder_dim*4,\n                pairwise_dimension=config.pairwise_dimension,\n                dropout=0.0\n            ) for _ in range(6)\n        ])\n\n        self.dropout = nn.Dropout(0.0)\n        self.adaptor = nn.Sequential(\n            nn.Linear(config.ninp, decoder_dim),\n            nn.LayerNorm(decoder_dim)\n        )\n        self.xyz_embedder = nn.Linear(3, decoder_dim)\n        self.xyz_norm = nn.LayerNorm(decoder_dim)\n        self.xyz_predictor = nn.Linear(decoder_dim, 3)\n\n        self.distogram_predictor = nn.Sequential(\n            nn.LayerNorm(config.pairwise_dimension),\n            nn.Linear(config.pairwise_dimension, 40)\n        )\n\n        self.time_embedder = SinusoidalPosEmb(decoder_dim)\n        self.time_mlp = nn.Sequential(\n            nn.Linear(decoder_dim, decoder_dim),\n            nn.ReLU(),\n            nn.Linear(decoder_dim, decoder_dim)\n        )\n        self.time_norm = nn.LayerNorm(decoder_dim)\n\n        self.distance2pairwise = nn.Linear(1, config.pairwise_dimension, bias=False)\n        self.pair_mlp = nn.Sequential(\n            nn.Linear(config.pairwise_dimension, config.pairwise_dimension),\n            nn.ReLU(),\n            nn.Linear(config.pairwise_dimension, config.pairwise_dimension)\n        )\n\n    def embed_pair_distance(self, inputs):\n        pairwise_features, xyz = inputs\n        distance_matrix = xyz[:, None, :, :] - xyz[:, :, None, :]\n        distance_matrix = (distance_matrix ** 2).sum(-1).clip(2, 37**2).sqrt()\n        distance_matrix = distance_matrix[:, :, :, None]\n        pairwise_features = pairwise_features + self.distance2pairwise(distance_matrix)\n        return pairwise_features\n\n    def forward(self, src, xyz, t):\n        # Embedding input\n        sequence_features, pairwise_features = self.get_embeddings(\n            src, torch.ones_like(src).long().to(src.device)\n        )\n        sequence_features = self.adaptor(sequence_features)\n\n        # Positional time embedding\n        time_emb = self.time_mlp(self.time_embedder(t))\n        sequence_features = sequence_features + self.time_norm(time_emb[:, None, :])\n\n        # Initial coordinate embedding\n        coord_feat = self.xyz_embedder(xyz)\n        coord_feat = self.xyz_norm(coord_feat)\n\n        # Structure module loop\n        for module in self.structure_module:\n            sequence_features, pairwise_features, coord_feat = module(\n                sequence_features, pairwise_features, coord_feat\n            )\n\n        pred_coords = self.xyz_predictor(coord_feat)\n        return pred_coords\n","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2025-04-05T18:16:59.480402Z","iopub.execute_input":"2025-04-05T18:16:59.480665Z","iopub.status.idle":"2025-04-05T18:17:04.308096Z","shell.execute_reply.started":"2025-04-05T18:16:59.480639Z","shell.execute_reply":"2025-04-05T18:17:04.306478Z"}},"outputs":[],"execution_count":null}]}