{"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":[{"sourceId":87793,"databundleVersionId":11228175,"sourceType":"competition"}],"dockerImageVersionId":30918,"isInternetEnabled":true,"language":"python","sourceType":"notebook","isGpuEnabled":false}},"nbformat_minor":4,"nbformat":4,"cells":[{"cell_type":"code","source":"import os\nimport numpy as np\nimport pandas as pd\nimport tensorflow as tf\nfrom tensorflow.keras.models import Model\nfrom tensorflow.keras.layers import Input, Embedding, Conv1D, BatchNormalization, Dropout, LeakyReLU, Add\nfrom tensorflow.keras.preprocessing.sequence import pad_sequences\nfrom tensorflow.keras.callbacks import EarlyStopping, ReduceLROnPlateau, ModelCheckpoint\n\nnp.random.seed(42)\ntf.random.set_seed(42)\n\n# Define file paths\nSEQ_TRAIN_PATH = '/kaggle/input/stanford-rna-3d-folding/train_sequences.csv'\nLABELS_TRAIN_PATH = '/kaggle/input/stanford-rna-3d-folding/train_labels.csv'\nSEQ_VALID_PATH = '/kaggle/input/stanford-rna-3d-folding/validation_sequences.csv'\nLABELS_VALID_PATH = '/kaggle/input/stanford-rna-3d-folding/validation_labels.csv'\nSEQ_TEST_PATH = '/kaggle/input/stanford-rna-3d-folding/test_sequences.csv'\nSAMPLE_SUBMISSION_PATH = '/kaggle/input/stanford-rna-3d-folding/sample_submission.csv'\n\n# Load CSV files\ntrain_seq = pd.read_csv(SEQ_TRAIN_PATH)\ntrain_lbls = pd.read_csv(LABELS_TRAIN_PATH).fillna(0)\nvalid_seq = pd.read_csv(SEQ_VALID_PATH)\nvalid_lbls = pd.read_csv(LABELS_VALID_PATH).fillna(0)\ntest_seq = pd.read_csv(SEQ_TEST_PATH)\n\n# Nucleotide encoding\nnucleotide_dict = {'A': 1, 'C': 2, 'G': 3, 'U': 4}\ntrain_seq['encoded'] = train_seq['sequence'].apply(lambda seq: [nucleotide_dict.get(ch, 0) for ch in seq])\nvalid_seq['encoded'] = valid_seq['sequence'].apply(lambda seq: [nucleotide_dict.get(ch, 0) for ch in seq])\ntest_seq['encoded'] = test_seq['sequence'].apply(lambda seq: [nucleotide_dict.get(ch, 0) for ch in seq])\n\n# Process labels\ndef process_labels_data(labels_data):\n    label_dict = {}\n    for idx, row in labels_data.iterrows():\n        target_id, resid = \"_\".join(row['ID'].split('_')[:-1]), int(row['ID'].split('_')[-1])\n        coord = np.array([row['x_1'], row['y_1'], row['z_1']], dtype=np.float32)\n        label_dict.setdefault(target_id, []).append((resid, coord))\n    \n    for key in label_dict:\n        label_dict[key] = np.stack([c for _, c in sorted(label_dict[key])])\n    return label_dict\n\ntrain_labels_dict = process_labels_data(train_lbls)\nvalid_labels_dict = process_labels_data(valid_lbls)\n\n# Create datasets\ndef create_data(sequences_data, labels_mapping):\n    X, y = [], []\n    for _, row in sequences_data.iterrows():\n        if row['target_id'] in labels_mapping:\n            X.append(row['encoded'])\n            y.append(labels_mapping[row['target_id']])\n    return X, y\n\nX_train_data, y_train_data = create_data(train_seq, train_labels_dict)\nX_valid_data, y_valid_data = create_data(valid_seq, valid_labels_dict)\n\n# Padding sequences and labels\nmax_seq_len = max(len(seq) for seq in X_train_data)\nX_train_padded = pad_sequences(X_train_data, maxlen=max_seq_len, padding='post')\nX_valid_padded = pad_sequences(X_valid_data, maxlen=max_seq_len, padding='post')\n\ndef pad_labels(coord_array, max_len):\n    return np.pad(coord_array, ((0, max_len - coord_array.shape[0]), (0, 0)), mode='constant')\n\ny_train_padded = np.array([pad_labels(arr, max_seq_len) for arr in y_train_data])\ny_valid_padded = np.array([pad_labels(arr, max_seq_len) for arr in y_valid_data])\n\n# Model Architecture\nvocab_size = len(nucleotide_dict) + 1\nembedding_dim = 32\nnum_filters = 128\nkernel_size = 3\ndrop_rate = 0.3\n\ninput_seq = Input(shape=(max_seq_len,))\nx = Embedding(input_dim=vocab_size, output_dim=embedding_dim, mask_zero=True)(input_seq)\n\n# First Conv Block\nx1 = Conv1D(num_filters, kernel_size, padding='same')(x)\nx1 = BatchNormalization()(x1)\nx1 = LeakyReLU()(x1)\nx1 = Dropout(drop_rate)(x1)\n\n# Second Conv Block with Residual Connection\nx2 = Conv1D(num_filters, kernel_size, padding='same')(x1)\nx2 = BatchNormalization()(x2)\nx2 = LeakyReLU()(x2)\nx2 = Dropout(drop_rate)(x2)\nx2 = Add()([x1, x2])  # Residual Connection\n\n# Third Conv Block\nx3 = Conv1D(num_filters, kernel_size, padding='same')(x2)\nx3 = BatchNormalization()(x3)\nx3 = LeakyReLU()(x3)\nx3 = Dropout(drop_rate)(x3)\n\n# Output Layer\noutput_coords = Conv1D(3, kernel_size=1, padding='same', activation='linear')(x3)\n\nmodel = Model(inputs=input_seq, outputs=output_coords)\nmodel.compile(optimizer='adam', loss='mse')\n\nmodel.summary()\n\n# Callbacks\ncallbacks = [\n    EarlyStopping(monitor='val_loss', patience=5, restore_best_weights=True),\n    ReduceLROnPlateau(monitor='val_loss', factor=0.5, patience=3, min_lr=1e-6),\n    ModelCheckpoint('best_model.keras', monitor='val_loss', save_best_only=True)\n\n]\n\n# Train Model\nhistory = model.fit(X_train_padded, y_train_padded,\n                    validation_data=(X_valid_padded, y_valid_padded),\n                    epochs=50,\n                    batch_size=32,\n                    callbacks=callbacks)\n\n# Test Data Preparation\nX_test_data = test_seq['encoded'].tolist()\nX_test_padded = pad_sequences(X_test_data, maxlen=max_seq_len, padding='post')\n\n# Predictions\npredictions = model.predict(X_test_padded)\n\n# Create Submission File\nsubmission_rows = []\nfor idx, row in test_seq.iterrows():\n    target_id, encoded_seq = row['target_id'], row['encoded']\n    pred_coords = predictions[idx][:len(encoded_seq)]\n\n    for i, coords in enumerate(pred_coords):\n        submission_rows.append({\n            'ID': f\"{target_id}_{i+1}\",\n            'resname': row['sequence'][i],\n            'resid': i+1,\n            **{f\"x_{j+1}\": coords[0] for j in range(5)},\n            **{f\"y_{j+1}\": coords[1] for j in range(5)},\n            **{f\"z_{j+1}\": coords[2] for j in range(5)}\n        })\n\nsubmission_df = pd.DataFrame(submission_rows)\nsubmission_df.to_csv('/kaggle/working/submission.csv', index=False)\n\nprint(\"Submission file created successfully.\")\n","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2025-03-05T23:34:22.373841Z","iopub.execute_input":"2025-03-05T23:34:22.374129Z","iopub.status.idle":"2025-03-05T23:39:30.295532Z","shell.execute_reply.started":"2025-03-05T23:34:22.374106Z","shell.execute_reply":"2025-03-05T23:39:30.294634Z"}},"outputs":[],"execution_count":null}]}