{"metadata":{"kernelspec":{"language":"python","display_name":"Python 3","name":"python3"},"language_info":{"pygments_lexer":"ipython3","nbconvert_exporter":"python","version":"3.6.4","file_extension":".py","codemirror_mode":{"name":"ipython","version":3},"name":"python","mimetype":"text/x-python"},"kaggle":{"accelerator":"none","dataSources":[{"sourceId":118765,"databundleVersionId":15231210,"sourceType":"competition"},{"sourceId":14445876,"sourceType":"datasetVersion","datasetId":9227527}],"dockerImageVersionId":31259,"isInternetEnabled":false,"language":"python","sourceType":"notebook","isGpuEnabled":false}},"nbformat_minor":4,"nbformat":4,"cells":[{"cell_type":"code","source":"import os\nimport sys\nimport subprocess\nimport warnings\n\nprint(\"📦 Biopython (.whl) fayli qidirilmoqda...\")\n\nwhl_path = None\nfor root, dirs, files in os.walk('/kaggle/input'):\n    for file in files:\n        if file.endswith('.whl') and 'bio' in file.lower():\n            whl_path = os.path.join(root, file)\n            print(f\"✅ Fayl topildi: {whl_path}\")\n            break\n    if whl_path: break\n\nif whl_path:\n    try:\n        print(f\"O'rnatish boshlandi...\")\n        subprocess.check_call([sys.executable, \"-m\", \"pip\", \"install\", whl_path, \"--no-deps\", \"--no-index\"])\n        print(\"🎉 Biopython MUVAFFAQIYATLI o'rnatildi!\")\n    except Exception as e:\n        print(f\"❌ Xatolik: {e}\")\nelse:\n    print(\"❌ .whl fayl topilmadi! Dataset qo'shilganini tekshiring.\")\n\ntry:\n    from Bio import pairwise2\n    from Bio.Seq import Seq\n    print(\"✅ Bio kutubxonasi ishga tushdi!\")\nexcept ImportError:\n    print(\"⚠️ Kutubxona yuklanmadi.\")\n\nimport pandas as pd\nimport numpy as np\nimport random\nimport time\nwarnings.filterwarnings('ignore')\n\nbase_path = '/kaggle/input/stanford-rna-3d-folding-2/'\ntrain_seqs = pd.read_csv(os.path.join(base_path, 'train_sequences.csv'))\nvalid_seqs = pd.read_csv(os.path.join(base_path, 'validation_sequences.csv'))\ntest_seqs = pd.read_csv(os.path.join(base_path, 'test_sequences.csv'))\ntrain_labels = pd.read_csv(os.path.join(base_path, 'train_labels.csv'))\nvalid_labels = pd.read_csv(os.path.join(base_path, 'validation_labels.csv'))\n\nprint(f\"Yuklandi: {len(train_seqs)} train, {len(test_seqs)} test.\")\n\ndef process_labels(labels_df):\n    \"\"\"Target ID larni koordinatalarga bog'laymiz\"\"\"\n    coords_dict = {}\n    \n    for id_prefix, group in labels_df.groupby(lambda x: labels_df['ID'][x].split('_')[0]):\n        coords = []\n        for _, row in group.sort_values('resid').iterrows():\n            coords.append([row['x_1'], row['y_1'], row['z_1']])\n        \n        coords_dict[id_prefix] = np.array(coords)\n    \n    return coords_dict\n\nprint(\"Training koordinatalari qayta ishlanmoqda (Biroz vaqt oladi)...\")\ntrain_coords_dict = process_labels(train_labels)\nprint(f\"✅ Tayyor! {len(train_coords_dict)} ta struktura saqlandi.\")\n\nfrom Bio import pairwise2\nfrom Bio.Seq import Seq\nfrom scipy.spatial.transform import Rotation as R\n\ndef find_similar_sequences(query_seq, train_seqs_df, train_coords_dict, temporal_cutoff=None, top_n=8):\n    similar_seqs = []\n    query_seq_obj = Seq(query_seq)\n    \n    if temporal_cutoff:\n        filtered_train_seqs = train_seqs_df[train_seqs_df['temporal_cutoff'] < temporal_cutoff]\n    else:\n        filtered_train_seqs = train_seqs_df\n    \n    for _, row in filtered_train_seqs.iterrows():\n        target_id = row['target_id']\n        train_seq = row['sequence']\n        \n        if target_id not in train_coords_dict: continue\n        \n        if abs(len(train_seq) - len(query_seq)) / max(len(train_seq), len(query_seq)) > 0.5:\n            continue\n        \n        alignments = pairwise2.align.globalms(query_seq_obj, train_seq, 2, -1, -10, -0.5, one_alignment_only=True)\n        \n        if alignments:\n            alignment = alignments[0]\n            similarity_score = alignment.score / (2 * min(len(query_seq), len(train_seq)))\n            similar_seqs.append((target_id, train_seq, similarity_score, train_coords_dict[target_id]))\n    \n    similar_seqs.sort(key=lambda x: x[2], reverse=True)\n    return similar_seqs[:top_n]\n\ndef adapt_template_to_query(query_seq, template_seq, template_coords):\n    query_seq_obj = Seq(query_seq)\n    template_seq_obj = Seq(template_seq)\n    alignments = pairwise2.align.globalms(query_seq_obj, template_seq_obj, 2, -1, -10, -0.5, one_alignment_only=True)\n    \n    if not alignments: return generate_basic_structure(query_seq)\n            \n    alignment = alignments[0]\n    aligned_query = alignment.seqA\n    aligned_template = alignment.seqB\n    \n    query_coords = np.zeros((len(query_seq), 3))\n    query_coords.fill(np.nan)\n    \n    query_idx = 0\n    template_idx = 0\n    \n    for i in range(len(aligned_query)):\n        q_char = aligned_query[i]\n        t_char = aligned_template[i]\n        \n        if q_char != '-' and t_char != '-':\n            if template_idx < len(template_coords):\n                query_coords[query_idx] = template_coords[template_idx]\n            template_idx += 1\n            query_idx += 1\n        elif q_char != '-' and t_char == '-':\n            query_idx += 1\n        elif q_char == '-' and t_char != '-':\n            template_idx += 1\n            \n    df_coords = pd.DataFrame(query_coords)\n    df_coords = df_coords.interpolate(method='linear', limit_direction='both')\n    query_coords = df_coords.values\n    if np.isnan(query_coords).any(): query_coords = np.nan_to_num(query_coords)\n    return query_coords\n\ndef generate_basic_structure(sequence):\n    n = len(sequence)\n    coords = np.zeros((n, 3))\n    for i in range(n):\n        angle = i * 0.6\n        coords[i] = [10.0 * np.cos(angle), 10.0 * np.sin(angle), i * 2.5]\n    return coords\n\ndef adaptive_rna_constraints(coordinates, sequence, confidence=1.0):\n    refined = coordinates.copy()\n    n = len(sequence)\n    strength = 0.8 * (1.0 - min(confidence, 0.8))\n    for i in range(n - 1):\n        curr, next_pos = refined[i], refined[i+1]\n        dist = np.linalg.norm(next_pos - curr)\n        if dist < 5.5 or dist > 6.5: \n            target = 6.0\n            direc = (next_pos - curr)\n            norm = np.linalg.norm(direc)\n            if norm < 1e-10: direc = np.random.normal(0,1,3)\n            else: direc = direc / norm\n            adj = (target - dist) * strength\n            refined[i+1] = curr + direc * (dist + adj)\n    return refined\n\ndef predict_rna_structures(sequence, target_id, train_seqs, train_coords, n_preds=5, temporal_cutoff=None):\n    predictions = []\n    similar = find_similar_sequences(sequence, train_seqs, train_coords, temporal_cutoff, top_n=8)\n    \n    if similar:\n        for templ_id, templ_seq, sim, templ_coords in similar:\n            adapted = adapt_template_to_query(sequence, templ_seq, templ_coords)\n            refined = adaptive_rna_constraints(adapted, sequence, confidence=sim)\n            \n            rand_scale = max(0.03, 0.6 - sim)\n            \n            final = refined + np.random.normal(0, rand_scale, refined.shape)\n            predictions.append(final)\n            if len(predictions) >= n_preds: break\n    \n    while len(predictions) < n_preds:\n        base = generate_basic_structure(sequence)\n        base += np.random.normal(0, 1.0, base.shape) \n        predictions.append(base)\n    \n    return predictions[:n_preds]\n\nprint(\"✅ Original Logic (Bio) tayyor!\")\n\n\nall_predictions = []\nstart_time = time.time()\ntotal_targets = len(test_seqs)\n\nprint(\"🚀 Bashorat boshlandi...\")\n\nfor idx, row in test_seqs.iterrows():\n    t_id = row['target_id']\n    seq = row['sequence']\n    cutoff = row['temporal_cutoff'] if 'temporal_cutoff' in row else None\n    \n    if idx % 5 == 0:\n        elapsed = time.time() - start_time\n        print(f\"Ishlanmoqda: {idx+1}/{total_targets} - {t_id}\")\n        \n    preds = predict_rna_structures(seq, t_id, train_seqs, train_coords_dict, \n                                 n_preds=5, temporal_cutoff=cutoff)\n    \n    for j in range(len(seq)):\n        pred_row = {\n            'ID': f\"{t_id}_{j+1}\",\n            'resname': seq[j],\n            'resid': j + 1\n        }\n        \n        for i in range(5):\n            pred_row[f'x_{i+1}'] = preds[i][j][0]\n            pred_row[f'y_{i+1}'] = preds[i][j][1]\n            pred_row[f'z_{i+1}'] = preds[i][j][2]\n            \n        all_predictions.append(pred_row)\n\nsubmission_df = pd.DataFrame(all_predictions)\n\ncols = ['ID', 'resname', 'resid']\nfor i in range(1, 6):\n    cols.extend([f'x_{i}', f'y_{i}', f'z_{i}'])\n\nsubmission_df = submission_df[cols]\n\nsubmission_df.to_csv('submission.csv', index=False)\nprint(f\"🎉 TAYYOR! Total vaqt: {time.time() - start_time:.1f} sekund\")\nprint(submission_df.head())","metadata":{"_uuid":"8f2839f25d086af736a60e9eeb907d3b93b6e0e5","_cell_guid":"b1076dfc-b9ad-4769-8c92-a6c4dae69d19","trusted":true},"outputs":[],"execution_count":null}]}