{"metadata":{"kernelspec":{"display_name":"Python 3","language":"python","name":"python3"},"language_info":{"codemirror_mode":{"name":"ipython","version":3},"codemirror_version":"3.0.0","file_extension":".py","mimetype":"text/x-python","name":"python","nbconvert_exporter":"python","pygments_lexer":"ipython3","version":"3.10.0"},"kaggle":{"accelerator":"none","dataSources":[{"sourceId":87793,"databundleVersionId":12276181,"isSourceIdPinned":false,"sourceType":"competition"}],"dockerImageVersionId":31259,"isInternetEnabled":false,"language":"python","sourceType":"notebook","isGpuEnabled":false}},"nbformat_minor":4,"nbformat":4,"cells":[{"cell_type":"markdown","source":"# Approach 1: Heuristic/Rule-Based RNA Structure Prediction\n\n**Core Principle**: RNA follows predictable geometric rules\n\nThis approach implements:\n1. **Geometric Rules**: Hand-crafted algorithms for RNA folding\n2. **Structural Constraints**: RNA-specific bond lengths and angles\n3. **Parameter Variation**: Multiple conformations through rule modifications\n4. **Physics-Based Generation**: Realistic 3D coordinate generation","metadata":{}},{"cell_type":"code","source":"import pandas as pd\nimport numpy as np\nimport matplotlib.pyplot as plt\nfrom pathlib import Path\nimport warnings\nwarnings.filterwarnings('ignore')\n\n# Load data\ndata_dir = Path(\"/kaggle/input/stanford-rna-3d-folding\")\ntrain_seq = pd.read_csv(data_dir / 'train_sequences.csv')\ntrain_labels = pd.read_csv(data_dir / 'train_labels.csv')\ntest_seq = pd.read_csv(data_dir / 'test_sequences.csv')\nsample_sub = pd.read_csv(data_dir / 'sample_submission.csv')\n\nprint(f\"Data loaded: {len(train_seq)} train, {len(test_seq)} test sequences\")","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2026-01-16T09:30:24.356827Z","iopub.execute_input":"2026-01-16T09:30:24.357160Z","iopub.status.idle":"2026-01-16T09:30:24.600625Z","shell.execute_reply.started":"2026-01-16T09:30:24.357130Z","shell.execute_reply":"2026-01-16T09:30:24.599718Z"}},"outputs":[],"execution_count":null},{"cell_type":"markdown","source":"## 1. RNA Structural Rules and Constraints","metadata":{}},{"cell_type":"code","source":"class RNAGeometricRules:\n    def __init__(self):\n        # RNA structural constants (in Angstroms)\n        self.C1_PRIME_DISTANCE = 5.9  # Average distance between consecutive C1' atoms\n        self.HELIX_RADIUS = 10.0  # Typical RNA helix radius\n        self.RISE_PER_RESIDUE = 2.8  # Vertical rise per residue in helix\n        \n    def calculate_helical_coordinates(self, sequence, variation_params=None):\n        \"\"\"\n        Generate RNA coordinates using helical geometry\n        \"\"\"\n        if variation_params is None:\n            variation_params = {\n                'radius_variation': 0.0,\n                'angle_variation': 0.0,\n                'rise_variation': 0.0,\n                'twist_variation': 0.0\n            }\n        \n        n_residues = len(sequence)\n        coords = np.zeros((n_residues, 3))\n        \n        # Apply variations\n        radius = self.HELIX_RADIUS * (1 + variation_params['radius_variation'])\n        rise = self.RISE_PER_RESIDUE * (1 + variation_params['rise_variation'])\n        twist_per_residue = 32.7 + variation_params['twist_variation']  # degrees\n        \n        for i, nucleotide in enumerate(sequence):\n            # Calculate angle for this residue\n            angle = np.radians(i * twist_per_residue + variation_params['angle_variation'])\n            \n            # Calculate 3D coordinates\n            coords[i, 0] = radius * np.cos(angle)\n            coords[i, 1] = radius * np.sin(angle)\n            coords[i, 2] = i * rise\n        \n        return coords\n    \n    def generate_conformation(self, sequence, conformation_id=0):\n        \"\"\"\n        Generate one conformation with specific variation parameters\n        \"\"\"\n        # Different variation parameters for diversity\n        variation_sets = [\n            {'radius_variation': 0.0, 'angle_variation': 0.0, 'rise_variation': 0.0, 'twist_variation': 0.0},\n            {'radius_variation': 0.1, 'angle_variation': 10, 'rise_variation': 0.05, 'twist_variation': 2.0},\n            {'radius_variation': -0.1, 'angle_variation': -10, 'rise_variation': -0.05, 'twist_variation': -2.0},\n            {'radius_variation': 0.15, 'angle_variation': 20, 'rise_variation': 0.1, 'twist_variation': 5.0},\n            {'radius_variation': -0.15, 'angle_variation': -20, 'rise_variation': -0.1, 'twist_variation': -5.0}\n        ]\n        \n        params = variation_sets[conformation_id % len(variation_sets)]\n        \n        # Generate base helical coordinates\n        coords = self.calculate_helical_coordinates(sequence, params)\n        \n        return coords\n\n# Initialize geometric rules engine\ngeo_rules = RNAGeometricRules()\nprint(\"Geometric rules engine initialized\")","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2026-01-16T09:30:24.603035Z","iopub.execute_input":"2026-01-16T09:30:24.603405Z","iopub.status.idle":"2026-01-16T09:30:24.615876Z","shell.execute_reply.started":"2026-01-16T09:30:24.603368Z","shell.execute_reply":"2026-01-16T09:30:24.614804Z"}},"outputs":[],"execution_count":null},{"cell_type":"markdown","source":"## 2. Structure Generation Pipeline","metadata":{}},{"cell_type":"code","source":"## 2. Structure Generation Pipeline\ndef generate_rna_structure_heuristic(sequence, conformation_id=0):\n    \"\"\"\n    Complete heuristic RNA structure generation\n    \"\"\"\n    # Generate base helical coordinates\n    coords = geo_rules.generate_conformation(sequence, conformation_id)\n    \n    # Apply final geometric constraints\n    # Ensure proper inter-residue distances\n    for i in range(1, len(coords)):\n        distance = np.linalg.norm(coords[i] - coords[i-1])\n        if distance > 8.0:  # Too far apart\n            direction = (coords[i] - coords[i-1]) / distance\n            coords[i] = coords[i-1] + direction * geo_rules.C1_PRIME_DISTANCE\n        elif distance < 4.0:  # Too close\n            direction = (coords[i] - coords[i-1]) / distance\n            coords[i] = coords[i-1] + direction * geo_rules.C1_PRIME_DISTANCE\n    \n    return coords\n\ndef generate_multiple_conformations(sequence, n_conformations=5):\n    \"\"\"\n    Generate multiple diverse conformations\n    \"\"\"\n    conformations = []\n    \n    for i in range(n_conformations):\n        coords = generate_rna_structure_heuristic(sequence, conformation_id=i)\n        conformations.append(coords)\n    \n    return conformations\n\n# Test structure generation\ntest_sequence = test_seq['sequence'].iloc[0]\nprint(f\"Generating structures for sequence: {test_sequence[:50]}...\")\n\nconformations = generate_multiple_conformations(test_sequence, n_conformations=5)\nprint(f\"Generated {len(conformations)} conformations\")\nprint(f\"Each conformation shape: {conformations[0].shape}\")","metadata":{"trusted":true},"outputs":[],"execution_count":null},{"cell_type":"markdown","source":"## 3. Submission Generation","metadata":{}},{"cell_type":"code","source":"## 3. Submission Generation\ndef create_submission_heuristic(test_sequences):\n    \"\"\"\n    Create submission using heuristic approach\n    \"\"\"\n    submission_rows = []\n    \n    for idx, test_row in test_sequences.iterrows():\n        target_id = test_row['target_id']\n        sequence = test_row['sequence']\n        \n        print(f\"Processing {target_id}, length: {len(sequence)}\")\n        \n        # Generate 5 conformations\n        conformations = generate_multiple_conformations(sequence, n_conformations=5)\n        \n        # Create submission rows\n        for i, nucleotide in enumerate(sequence):\n            row_data = {\n                'ID': f\"{target_id}_{i+1}\",\n                'resname': nucleotide,\n                'resid': i + 1\n            }\n            \n            # Add coordinates for all 5 conformations\n            for conf_id in range(5):\n                if i < len(conformations[conf_id]):\n                    coords = conformations[conf_id][i]\n                    row_data[f'x_{conf_id+1}'] = coords[0]\n                    row_data[f'y_{conf_id+1}'] = coords[1]\n                    row_data[f'z_{conf_id+1}'] = coords[2]\n                else:\n                    row_data[f'x_{conf_id+1}'] = 0.0\n                    row_data[f'y_{conf_id+1}'] = 0.0\n                    row_data[f'z_{conf_id+1}'] = 0.0\n            \n            submission_rows.append(row_data)\n    \n    return pd.DataFrame(submission_rows)\n\n# Generate submission\nsubmission_heuristic = create_submission_heuristic(test_seq)\nprint(f\"Generated submission with {len(submission_heuristic)} rows\")\nprint(f\"Expected rows: {sample_sub.shape[0]}\")","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2026-01-16T09:30:24.649183Z","iopub.execute_input":"2026-01-16T09:30:24.649582Z","iopub.status.idle":"2026-01-16T09:30:24.855118Z","shell.execute_reply.started":"2026-01-16T09:30:24.649547Z","shell.execute_reply":"2026-01-16T09:30:24.853848Z"}},"outputs":[],"execution_count":null},{"cell_type":"markdown","source":"## 4. Quality Validation and Final Submission","metadata":{}},{"cell_type":"code","source":"def validate_heuristic_submission(submission_df):\n    \"\"\"\n    Validate heuristic submission\n    \"\"\"\n    print(\"=== Heuristic Submission Validation ===\")\n    \n    # Check format\n    expected_cols = ['ID', 'resname', 'resid'] + [f'{coord}_{i}' for coord in ['x', 'y', 'z'] for i in range(1, 6)]\n    missing_cols = set(expected_cols) - set(submission_df.columns)\n    extra_cols = set(submission_df.columns) - set(expected_cols)\n    \n    print(f\"Missing columns: {missing_cols}\")\n    print(f\"Extra columns: {extra_cols}\")\n    print(f\"Shape: {submission_df.shape}\")\n    \n    # Check coordinate statistics\n    coord_cols = [f'{coord}_{i}' for coord in ['x', 'y', 'z'] for i in range(1, 6)]\n    coord_values = submission_df[coord_cols].values\n    \n    print(f\"Coordinate statistics:\")\n    print(f\"  Min: {coord_values.min():.3f}\")\n    print(f\"  Max: {coord_values.max():.3f}\")\n    print(f\"  Mean: {coord_values.mean():.3f}\")\n    print(f\"  Std: {coord_values.std():.3f}\")\n    \n    return True\n\n# Validate submission\nvalidate_heuristic_submission(submission_heuristic)\n\n# Save submission\nsubmission_heuristic.to_csv('submission.csv', index=False)\nprint(\"\\nHeuristic submission saved as 'submission.csv'\")","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2026-01-16T09:30:24.857097Z","iopub.execute_input":"2026-01-16T09:30:24.857385Z","iopub.status.idle":"2026-01-16T09:30:24.928912Z","shell.execute_reply.started":"2026-01-16T09:30:24.857358Z","shell.execute_reply":"2026-01-16T09:30:24.928017Z"}},"outputs":[],"execution_count":null},{"cell_type":"markdown","source":"## Approach 1 Summary\n\n**Key Strengths:**\n- Very fast computation (no training required)\n- Highly interpretable (each step follows explicit rules)\n- Consistent with known RNA physics and geometry\n- Minimal computational resources required\n\n**Key Components:**\n1. **Geometric Rules**: Hand-crafted algorithms for RNA folding\n2. **Structural Constraints**: RNA-specific bond lengths and angles\n3. **Parameter Variation**: Multiple conformations through rule modifications\n4. **Physics Validation**: Ensures realistic inter-residue distances\n\n**Expected Performance:**\n- Good for simple RNA structures with regular patterns\n- Limited for complex tertiary interactions\n- Conservative but physically realistic predictions\n- Fast and reliable for basic folding patterns","metadata":{}}]}