{"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"}},"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%reset -f\nimport numpy as np # linear algebra\nimport dask.dataframe as dd\nimport torch\nfrom torch.utils.data import DataLoader\nimport torchvision.transforms as T\nimport pytorch_lightning as pl\nfrom torch.optim.lr_scheduler import CosineAnnealingLR, ReduceLROnPlateau\nfrom torch.optim import AdamW\nimport torch.nn as nn\nfrom torchmetrics.functional import dice\n\nimport numpy as np\nimport pandas as pd\n\nimport glob\nimport yaml\nimport xarray as xr\n\n","metadata":{"_uuid":"8f2839f25d086af736a60e9eeb907d3b93b6e0e5","_cell_guid":"b1076dfc-b9ad-4769-8c92-a6c4dae69d19","execution":{"iopub.status.busy":"2023-10-02T04:26:45.160791Z","iopub.execute_input":"2023-10-02T04:26:45.161212Z","iopub.status.idle":"2023-10-02T04:27:02.287284Z","shell.execute_reply.started":"2023-10-02T04:26:45.161176Z","shell.execute_reply":"2023-10-02T04:27:02.286386Z"},"trusted":true},"execution_count":1,"outputs":[{"name":"stderr","text":"/opt/conda/lib/python3.10/site-packages/scipy/__init__.py:146: UserWarning: A NumPy version >=1.16.5 and <1.23.0 is required for this version of SciPy (detected version 1.23.5\n  warnings.warn(f\"A NumPy version >={np_minversion} and <{np_maxversion}\"\n","output_type":"stream"}]},{"cell_type":"code","source":"\n# DMS_MaP \nclass RiboDataset(torch.utils.data.Dataset):\n    experiments = ['DMS_MaP','2A3_MaP','2A3_MaP_DMS_MaP']\n    seq_elements = ['A','C','G','U']\n    def __init__(self, data_path, exp_type ='2A3_MaP'):\n        assert exp_type in self.experiments, f'error experiment_type must be in {self.experiments}'\n        self.exp_type = exp_type\n        self.reactivity_keys=['sequence','experiment_type']\n        self.reactivity_keys.extend([f'reactivity_{str(i).zfill(4)}' for i in range(1,171)])\n#         print(self.reactivity_keys)\n        self.df = pd.read_csv(data_path,usecols=self.reactivity_keys)\n        self.df[self.reactivity_keys[2:]].fillna(-100)\n#         print(self.df.drop_duplicates(subset=self.reactivity_keys[2:]))\n    \n    \n    def __getitem__(self, index):\n        sample = self.df.iloc[index]\n        input_seq = sample['sequence']\n        \n        input_vector = self.process_seq(input_seq,sample['experiment_type']) \n        \n        reactivity_vector =np.array(sample[self.reactivity_keys[2:]],dtype=float)\n        nan_value=-1\n        reactivity_vector = np.nan_to_num(reactivity_vector, copy=True, nan=nan_value, posinf=nan_value, neginf=nan_value)\n        \n        \n        input_vector = torch.from_numpy(input_vector).to(torch.float32)\n        reactivity_vector = torch.from_numpy(reactivity_vector).to(torch.float32)\n        \n        \n        \n        \n        return input_vector, reactivity_vector\n\n    def process_seq(self,input_seq,exp_type):\n        exp_type = 1 if exp_type== self.experiments[0] else -1\n        sequence = np.zeros(171)\n        input_seq=input_seq[0:171]\n        for i, c in enumerate(input_seq):\n            for j in range(4):\n                 if c == self.seq_elements[j]:\n                    break\n            sequence[i]= j+1\n        sequence[-1] =exp_type\n        return sequence\n    def __len__(self):\n        return len(self.df)\n\n\n\n    def get_samples(self, num_samples):\n        samples = []\n        for i in range(num_samples):\n            samples.append(self.__getitem__(i))\n        return samples","metadata":{"execution":{"iopub.status.busy":"2023-10-02T04:27:02.288987Z","iopub.execute_input":"2023-10-02T04:27:02.289282Z","iopub.status.idle":"2023-10-02T04:27:02.299222Z","shell.execute_reply.started":"2023-10-02T04:27:02.28923Z","shell.execute_reply":"2023-10-02T04:27:02.298366Z"},"trusted":true},"execution_count":2,"outputs":[]},{"cell_type":"code","source":"\ndata_path='/kaggle/input/stanford-ribonanza-rna-folding/train_data.csv'\ntrain_ds = RiboDataset(data_path)\n\n\n","metadata":{"execution":{"iopub.status.busy":"2023-10-02T04:27:02.300738Z","iopub.execute_input":"2023-10-02T04:27:02.301382Z","iopub.status.idle":"2023-10-02T04:28:00.947571Z","shell.execute_reply.started":"2023-10-02T04:27:02.301352Z","shell.execute_reply":"2023-10-02T04:28:00.946578Z"},"trusted":true},"execution_count":3,"outputs":[]},{"cell_type":"code","source":"\nclass LightningModel(pl.LightningModule):\n    def __init__(self, config):\n        super().__init__()\n        self.config =config\n\n        self.model = nn.Sequential(\n                                nn.Linear(171, 512),\n                                nn.ReLU(),\n                                nn.Linear(512, 1024),\n                                nn.ReLU(),\n                                nn.Linear(1024, 512),\n                                nn.ReLU(),\n                                nn.Linear(512, 170))\n        self.loss_module = nn.MSELoss(reduction = 'mean')\n\n    def forward(self, x):\n        return self.model(x)\n\n    def training_step(self, batch, batch_idx):\n        features, true_labels = batch\n        logits = self(features)\n        loss = self.loss_module(logits, true_labels)\n        self.log(\"train_loss\", loss, on_step=True, on_epoch=True, prog_bar=True, batch_size=1024)\n        return loss  # this is passed to the optimizer for training\n\n    def validation_step(self, batch, batch_idx):\n        features, true_labels = batch\n        logits = self(features)\n        loss = loss = self.loss_module(logits, true_labels)\n        self.log(\"val_loss\", loss, prog_bar=True)\n\n    def configure_optimizers(self):\n        optimizer = AdamW(self.parameters(), **self.config[\"optimizer_params\"])\n\n        if self.config[\"scheduler\"][\"name\"] == \"CosineAnnealingLR\":\n            scheduler = CosineAnnealingLR(\n                optimizer,\n                **self.config[\"scheduler\"][\"params\"][\"CosineAnnealingLR\"],\n            )\n            lr_scheduler_dict = {\"scheduler\": scheduler, \"interval\": \"step\"}\n            return {\"optimizer\": optimizer, \"lr_scheduler\": lr_scheduler_dict}\n        return optimizer\n","metadata":{"execution":{"iopub.status.busy":"2023-10-02T04:28:00.949995Z","iopub.execute_input":"2023-10-02T04:28:00.950687Z","iopub.status.idle":"2023-10-02T04:28:00.959965Z","shell.execute_reply.started":"2023-10-02T04:28:00.950651Z","shell.execute_reply":"2023-10-02T04:28:00.959056Z"},"trusted":true},"execution_count":4,"outputs":[]},{"cell_type":"code","source":"train_dl = DataLoader(\n    train_ds, \n    batch_size=1024,\n    shuffle=False,\n    num_workers=2,\n)","metadata":{"execution":{"iopub.status.busy":"2023-10-02T04:30:17.817162Z","iopub.execute_input":"2023-10-02T04:30:17.81759Z","iopub.status.idle":"2023-10-02T04:30:17.826917Z","shell.execute_reply.started":"2023-10-02T04:30:17.817554Z","shell.execute_reply":"2023-10-02T04:30:17.826102Z"},"trusted":true},"execution_count":12,"outputs":[]},{"cell_type":"code","source":"\nconfig = {'optimizer_params':{'lr': 0.0001, \"weight_decay\": 0.03 },\n                      'scheduler':{ 'name': \"CosineAnnealingLR\",'params':{\n                                                            'CosineAnnealingLR':{\n                                                                'T_max': 2*len(train_dl),\n                                                                'eta_min': 1.0e-6,\n                                                                'last_epoch': -1}}}}\n\nlightning_model = LightningModel(config=config)\ntrainer = pl.Trainer(\n        max_epochs=10,\n        accelerator=\"auto\",  # set to \"auto\" or \"gpu\" to use GPUs if available\n        devices=\"auto\",  # Uses all available GPUs if applicable\n    )\n\ntrainer.fit(\n        model=lightning_model,\n        train_dataloaders=train_dl,\n        val_dataloaders=train_dl,\n    )","metadata":{"execution":{"iopub.status.busy":"2023-10-02T04:30:18.18002Z","iopub.execute_input":"2023-10-02T04:30:18.180361Z"},"trusted":true},"execution_count":null,"outputs":[{"output_type":"display_data","data":{"text/plain":"Sanity Checking: 0it [00:00, ?it/s]","application/vnd.jupyter.widget-view+json":{"version_major":2,"version_minor":0,"model_id":""}},"metadata":{}},{"output_type":"display_data","data":{"text/plain":"Training: 0it [00:00, ?it/s]","application/vnd.jupyter.widget-view+json":{"version_major":2,"version_minor":0,"model_id":"271852b56168467b894abcb341df687c"}},"metadata":{}}]},{"cell_type":"code","source":"","metadata":{},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"","metadata":{},"execution_count":null,"outputs":[]}]}