{"metadata":{"kernelspec":{"language":"python","display_name":"Python 3","name":"python3"},"language_info":{"name":"python","version":"3.11.11","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":12276181,"isSourceIdPinned":false,"sourceType":"competition"},{"sourceId":395882,"sourceType":"modelInstanceVersion","isSourceIdPinned":false,"modelInstanceId":324961,"modelId":345796}],"dockerImageVersionId":31040,"isInternetEnabled":false,"language":"python","sourceType":"notebook","isGpuEnabled":false}},"nbformat_minor":4,"nbformat":4,"cells":[{"cell_type":"code","source":"# === Install required Python packages from your uploaded requirements.txt ===\n!pip install /kaggle/input/keyvulee_v3/pytorch/default/9/biopython-1.85-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl --no-index --quiet\n!pip install /kaggle/input/keyvulee_v3/pytorch/default/9/ptflops-0.7.4-py3-none-any.whl --no-index --quiet --no-deps\n\n# === Standard imports ===\nimport sys, os\nimport pandas as pd\nimport numpy as np\nimport torch\nfrom torch.utils.data import DataLoader\n# === Add the path to your uploaded code files ===\nsys.path.append(\"/kaggle/input/keyvulee_v3/pytorch/default/9/src_v3\")\n\n# === Import your custom modules ===\nfrom config_v3 import get_config\nfrom dataset_v2 import RNAFMDataset, rna_collate_fn\nfrom model_v3 import create_model\n\nprint(\"✅ Direct imports successful!\")","metadata":{"_uuid":"8f2839f25d086af736a60e9eeb907d3b93b6e0e5","_cell_guid":"b1076dfc-b9ad-4769-8c92-a6c4dae69d19","trusted":true,"execution":{"iopub.status.busy":"2025-05-16T03:42:39.859413Z","iopub.execute_input":"2025-05-16T03:42:39.859853Z","iopub.status.idle":"2025-05-16T03:43:29.105740Z","shell.execute_reply.started":"2025-05-16T03:42:39.859820Z","shell.execute_reply":"2025-05-16T03:43:29.104477Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"ckpt_path = \"/kaggle/input/keyvulee_v3/pytorch/default/9/epoch1-step1284.ckpt\"\ndevice = torch.device(\"cuda\" if torch.cuda.is_available() else \"cpu\")\n\nmodel = create_model(get_config())\nmodel = model.to(device)\nmodel.eval()\n\ncheckpoint = torch.load(ckpt_path, map_location=device, weights_only=False)\nstate_dict = checkpoint.get(\"state_dict\", checkpoint)\nmodel.load_state_dict(state_dict, strict=False)\n\nprint(\"✅ Model loaded.\")","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2025-05-16T03:43:36.525433Z","iopub.execute_input":"2025-05-16T03:43:36.526045Z","iopub.status.idle":"2025-05-16T03:43:36.872751Z","shell.execute_reply.started":"2025-05-16T03:43:36.526013Z","shell.execute_reply":"2025-05-16T03:43:36.871736Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"config = get_config()\nconfig.data.test_sequences = \"/kaggle/input/stanford-rna-3d-folding/test_sequences.csv\"\nconfig.data.use_cache = False\nconfig.output_dir = \"/kaggle/working\"\n\ntest_dataset = RNAFMDataset(\n    sequences_csv=config.data.test_sequences,\n    coords_csv=None,\n    max_len=config.data.max_len,\n    device=\"cpu\",\n    use_cache=False,\n    cache_dir=config.data.cache_dir,\n    msa_dir=config.data.msa_dir,\n    window_size=config.data.window_size,\n    stride=config.data.stride,\n)\n\nfrom torch.utils.data import DataLoader\ntest_loader = DataLoader(\n    test_dataset,\n    batch_size=1,\n    shuffle=False,\n    num_workers=0,\n    collate_fn=rna_collate_fn,\n)\n\nprint(\"✅ Dataset loaded and ready.\")","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2025-05-16T03:43:39.333441Z","iopub.execute_input":"2025-05-16T03:43:39.334218Z","iopub.status.idle":"2025-05-16T03:43:41.992888Z","shell.execute_reply.started":"2025-05-16T03:43:39.334183Z","shell.execute_reply":"2025-05-16T03:43:41.991812Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"import numpy as np\nimport pandas as pd\n\nrows = []\n\n# Optional: controls how many noisy decoys are created per structure\ndef generate_decoys(pred, num_decoys=5, noise_scale=0.5):\n    return [pred + np.random.normal(scale=noise_scale, size=pred.shape) for _ in range(num_decoys)]\n\nwith torch.no_grad():\n    for batch in test_loader:\n        emb = batch['embeddings'].to(device)\n        mask = batch['mask'].to(device)\n        ids = batch['id']\n        preds = model(emb).cpu().numpy()\n\n        for i, seq_id in enumerate(ids):\n            L = mask[i].sum().item()\n            pred_coords = preds[i][:L]\n            decoys = generate_decoys(pred_coords)\n\n            # Get original sequence\n            seq = test_dataset.seq_dict.get(seq_id, \"A\" * L)\n\n            for j in range(L):\n                row = {\n                    \"ID\": f\"{seq_id}_{j+1}\",\n                    \"resname\": seq[j] if j < len(seq) else \"A\",\n                    \"resid\": j+1\n                }\n                for d, dec in enumerate(decoys):\n                    x, y, z = dec[j]\n                    row[f\"x_{d+1}\"] = x\n                    row[f\"y_{d+1}\"] = y\n                    row[f\"z_{d+1}\"] = z\n                rows.append(row)\n\n# Save as submission.csv\nsubmission_df = pd.DataFrame(rows)\nsubmission_df.to_csv(\"/kaggle/working/submission.csv\", index=False)\n\nprint(\"✅ submission.csv saved and ready to submit!\")\n","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2025-05-16T03:44:53.300222Z","iopub.execute_input":"2025-05-16T03:44:53.300569Z","iopub.status.idle":"2025-05-16T03:45:01.103211Z","shell.execute_reply.started":"2025-05-16T03:44:53.300545Z","shell.execute_reply":"2025-05-16T03:45:01.102270Z"}},"outputs":[],"execution_count":null}]}