{"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":87793,"databundleVersionId":12276181,"sourceType":"competition"},{"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":"# 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\nimport numpy as np # linear algebra\nimport 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\nimport os\nfor 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":"import numpy as np\nimport pandas as pd\n\ndef add_noise(coords, scale=0.01):\n    # دي الدالة اللي بتعمل \"ديك أم النويز\"\n    # بتضيف هزة عشوائية بسيطة جداً للإحداثيات\n    return coords + np.random.normal(0, scale, coords.shape)","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2026-01-23T12:57:37.817147Z","iopub.execute_input":"2026-01-23T12:57:37.817591Z","iopub.status.idle":"2026-01-23T12:57:39.034502Z","shell.execute_reply.started":"2026-01-23T12:57:37.817567Z","shell.execute_reply":"2026-01-23T12:57:39.033612Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"import pandas as pd\nimport numpy as np\n\n# 1. تحميل البيانات اللي ظاهرة عندك في الـ Input على اليمين\npath = '/kaggle/input/stanford-rna-3d-folding-part-2/'\ntest = pd.read_csv(path + 'test_sequences.csv')\nsample = pd.read_csv(path + 'sample_submission.csv')\n\n# 2. بناء ملف التسليم باستخدام دالة النويز بتاعتك\nresults = []\n\nprint(\"🚀 جاري معالجة البيانات وإضافة النويز...\")\n\nfor _, row in test.iterrows():\n    L = len(row['sequence'])\n    # بناء شكل لولبي (Helix) كبداية للإحداثيات\n    t = np.arange(L)\n    base_coords = np.zeros((L, 3))\n    base_coords[:, 0] = 10 * np.cos(t * 0.1)\n    base_coords[:, 1] = 10 * np.sin(t * 0.1)\n    base_coords[:, 2] = t * 2.8\n\n    node_id_prefix = row['target_id']\n    \n    for i in range(L):\n        res = {'id': f\"{node_id_prefix}_{i+1}\"}\n        # توليد 5 حالات (States) باستخدام دالة add_noise اللي إنت كتبتها\n        for m in range(1, 6):\n            # بنزود الـ scale شوية مع كل حالة عشان التنوع\n            noisy_coord = add_noise(base_coords[i], scale=0.01 * m)\n            res[f'x_{m}'], res[f'y_{m}'], res[f'z_{m}'] = noisy_coord\n        results.append(res)\n\n# 3. حفظ الملف النهائي\nsubmission = pd.DataFrame(results)\n# التأكد من ترتيب الأعمدة زي الـ Sample بالضبط\nsubmission = sample[['id']].merge(submission, on='id', how='left').fillna(0.0)\nsubmission.to_csv('submission.csv', index=False)\n\nprint(\"✅ مبروك يا دكتور! ملف submission.csv بقى جاهز في الـ Output.\")","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2026-01-23T12:59:33.601947Z","iopub.execute_input":"2026-01-23T12:59:33.602678Z","iopub.status.idle":"2026-01-23T12:59:33.628841Z","shell.execute_reply.started":"2026-01-23T12:59:33.602645Z","shell.execute_reply":"2026-01-23T12:59:33.627863Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"import os\nimport pandas as pd\n\n# كود ذكي عشان يعرف المسار الصح أياً كان اسمه\ninput_dirs = [d for d in os.listdir('/kaggle/input/') if 'stanford-rna' in d.lower()]\nif input_dirs:\n    path = f'/kaggle/input/{input_dirs[0]}/'\n    print(f\"✅ تم العثور على المسار الصحيح: {path}\")\n    \n    # تحميل البيانات\n    test = pd.read_csv(path + 'test_sequences.csv')\n    sample = pd.read_csv(path + 'sample_submission.csv')\n    print(\"💎 الملفات اتحملت بنجاح!\")\nelse:\n    print(\"❌ مش لاقي فولدر المسابقة.. اتأكد إنك ضفتها من Add Input\")","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2026-01-23T13:01:03.103866Z","iopub.execute_input":"2026-01-23T13:01:03.104172Z","iopub.status.idle":"2026-01-23T13:01:03.141563Z","shell.execute_reply.started":"2026-01-23T13:01:03.104147Z","shell.execute_reply":"2026-01-23T13:01:03.140722Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"import numpy as np\nimport pandas as pd\n\n# 1. التأكد من وجود الدالة اللي إنت كتبتها (للاحتياط)\ndef add_noise(coords, scale=0.01):\n    return coords + np.random.normal(0, scale, coords.shape)\n\n# 2. بناء ملف التسليم\nresults = []\nprint(\"🚀 جاري معالجة المتواليات وإضافة النويز الذكي...\")\n\nfor _, row in test.iterrows():\n    L = len(row['sequence'])\n    \n    # بناء إحداثيات افتراضية (Helix) لأن ده المطلوب في المرحلة دي\n    t = np.arange(L)\n    base_coords = np.zeros((L, 3))\n    base_coords[:, 0] = 10 * np.cos(t * 0.1)\n    base_coords[:, 1] = 10 * np.sin(t * 0.1)\n    base_coords[:, 2] = t * 2.8 # المسافة بين النيوكليوتيدات\n\n    node_id_prefix = row['target_id']\n    \n    for i in range(L):\n        res = {'id': f\"{node_id_prefix}_{i+1}\"}\n        # تطبيق النويز لـ 5 حالات مختلفة\n        for m in range(1, 6):\n            noisy_coord = add_noise(base_coords[i], scale=0.01 * m)\n            res[f'x_{m}'], res[f'y_{m}'], res[f'z_{m}'] = noisy_coord\n        results.append(res)\n\n# 3. تجميع وحفظ الملف\nsubmission = pd.DataFrame(results)\n# نربطها مع الـ sample لضمان الترتيب الصحيح للأعمدة والـ IDs\nfinal_sub = sample[['id']].merge(submission, on='id', how='left').fillna(0.0)\nfinal_sub.to_csv('submission.csv', index=False)\n\nprint(\"🎯 عاش يا دكتور! الملف submission.csv جاهز دلوقتي.\")","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2026-01-23T13:01:36.397017Z","iopub.execute_input":"2026-01-23T13:01:36.397774Z","iopub.status.idle":"2026-01-23T13:01:36.738902Z","shell.execute_reply.started":"2026-01-23T13:01:36.397747Z","shell.execute_reply":"2026-01-23T13:01:36.737891Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"# 3. حفظ الملف النهائي بطريقة مضمونة\nsubmission = pd.DataFrame(results)\n\n# بنشوف أسماء الأعمدة اللي موجودة فعلاً في الـ sample عشان نمشي وراها\nprint(f\"أعمدة ملف الـ sample هي: {sample.columns.tolist()}\")\n\n# بدل الـ Merge اللي عمل Error، هنحفظ ملفنا علطول\n# بس هنتأكد إن الأعمدة مترتبة صح (id وبعدين x1, y1, z1...)\ncols = ['id'] + [f'{axis}_{m}' for m in range(1, 6) for axis in ['x', 'y', 'z']]\n\n# لو الـ sample طلع اسم العمود فيه مختلف (مثلاً ID كابيتال)، الكود ده هيصلحه:\nif 'id' not in submission.columns and 'ID' in sample.columns:\n    submission.rename(columns={'id': 'ID'}, inplace=True)\n\nsubmission.to_csv('submission.csv', index=False)\n\nprint(\"🎯 أخيراً يا دكتور! الملف submission.csv اتحفظ بنجاح.\")","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2026-01-23T13:02:33.574298Z","iopub.execute_input":"2026-01-23T13:02:33.574823Z","iopub.status.idle":"2026-01-23T13:02:33.841561Z","shell.execute_reply.started":"2026-01-23T13:02:33.574792Z","shell.execute_reply":"2026-01-23T13:02:33.840919Z"}},"outputs":[],"execution_count":null}]}