{"metadata":{"kernelspec":{"language":"python","display_name":"Python 3","name":"python3"},"language_info":{"name":"python","version":"3.12.12","mimetype":"text/x-python","codemirror_mode":{"name":"ipython","version":3},"pygments_lexer":"ipython3","nbconvert_exporter":"python","file_extension":".py"},"kaggle":{"accelerator":"nvidiaTeslaT4","dataSources":[{"sourceId":118765,"databundleVersionId":15231210,"sourceType":"competition"}],"dockerImageVersionId":31260,"isInternetEnabled":false,"language":"python","sourceType":"notebook","isGpuEnabled":true}},"nbformat_minor":4,"nbformat":4,"cells":[{"cell_type":"code","source":"# ============================================================\n# Stanford RNA 3D Folding Part 2\n# ============================================================\n\nimport os\nimport math\nimport random\nimport numpy as np\nimport pandas as pd\nfrom tqdm import tqdm\n\n# -------------------------\n# Config\n# -------------------------\nDATA_ROOT = \"/kaggle/input/stanford-rna-3d-folding-2\"\nTEST_SEQ_PATH = f\"{DATA_ROOT}/test_sequences.csv\"\nSAMPLE_SUB_PATH = f\"{DATA_ROOT}/sample_submission.csv\"\nOUT_PATH = \"submission.csv\"\n\nnp.random.seed(42)\nrandom.seed(42)\n\n# -------------------------\n# Load data\n# -------------------------\ntest_df = pd.read_csv(TEST_SEQ_PATH)\nsample_sub = pd.read_csv(SAMPLE_SUB_PATH)\n\n# -------------------------\n# Geometry utilities\n# -------------------------\ndef helical_coords(n, radius=8.0, rise=3.4, twist=32.7):\n    \"\"\"\n    Generate a simple RNA-like helix backbone (C1' trace).\n    Parameters loosely inspired by A-form RNA.\n    \"\"\"\n    coords = np.zeros((n, 3), dtype=np.float32)\n    for i in range(n):\n        angle = np.deg2rad(i * twist)\n        x = radius * np.cos(angle)\n        y = radius * np.sin(angle)\n        z = i * rise\n        coords[i] = [x, y, z]\n    return coords\n\ndef perturb(coords, noise=1.0):\n    \"\"\"Add small Gaussian noise for alternate conformations\"\"\"\n    return coords + np.random.normal(scale=noise, size=coords.shape)\n\ndef center(coords):\n    return coords - coords.mean(axis=0, keepdims=True)\n\n# -------------------------\n# Build predictions\n# -------------------------\nrows = []\n\nfor _, row in tqdm(test_df.iterrows(), total=len(test_df)):\n    target_id = row[\"target_id\"]\n    seq = row[\"sequence\"]\n    L = len(seq)\n\n    # Base helix\n    base = center(helical_coords(L))\n\n    # Generate 5 conformations\n    preds = []\n    for k in range(5):\n        conf = perturb(base, noise=0.5 + 0.2 * k)\n        conf = np.clip(conf, -999.999, 9999.999)\n        preds.append(conf)\n\n    # Write per-residue rows\n    for i, nt in enumerate(seq):\n        out = {\n            \"ID\": f\"{target_id}_{i+1}\",\n            \"resname\": nt,\n            \"resid\": i + 1,\n        }\n        for k in range(5):\n            out[f\"x_{k+1}\"] = preds[k][i, 0]\n            out[f\"y_{k+1}\"] = preds[k][i, 1]\n            out[f\"z_{k+1}\"] = preds[k][i, 2]\n        rows.append(out)\n\n# -------------------------\n# Create submission\n# -------------------------\nsub = pd.DataFrame(rows)\n\n# Ensure column order matches sample submission\nexpected_cols = list(sample_sub.columns)\nsub = sub[expected_cols]\n\nsub.to_csv(OUT_PATH, index=False)\n\nprint(\"submission.csv written\")\ndisplay(sub.head())","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2026-01-26T11:55:40.321694Z","iopub.execute_input":"2026-01-26T11:55:40.322292Z","iopub.status.idle":"2026-01-26T11:55:41.097704Z","shell.execute_reply.started":"2026-01-26T11:55:40.322263Z","shell.execute_reply":"2026-01-26T11:55:41.096923Z"}},"outputs":[],"execution_count":null}]}