{
 "nbformat": 4,
 "nbformat_minor": 5,
 "metadata": {
  "kernelspec": {
   "display_name": "Python 3",
   "language": "python",
   "name": "python3"
  },
  "language_info": {
   "name": "python",
   "version": "3.10.0"
  },
  "colab": {
   "provenance": []
  }
 },
 "cells": [
  {
   "cell_type": "markdown",
   "metadata": {
    "id": "OSsMazvSTUxs"
   },
   "source": "# IGA Istanbul Airport – Gerçekçi Gate & Uçuş Atama Optimizasyonu\n## Applied Quantum Machine Learning (21 Aşamalı QML Şablonu)\n\n**Referans:** Joseph Volkan Özcan – Quantum Transform / IGA Quantum Journey  \n**Hedef:** Gerçek IGA kapasite verilerine dayalı, Colab’da çalıştırılabilir hibrit QML PoC  \n**Tarih:** 2026  \n\n---\n\n### Gerçek IGA Rakamları (2025–2026)\n\n| Metrik | Değer | Kaynak / Not |\n|--------|-------|--------------|\n| **Pist (Runway)** | **6** (4 ana + 2 yardımcı) | 4. ana pist (Doğu-Batı, 2.820 m) Eylül 2026’da açıldı |\n| **Saatlik hareket kapasitesi** | 120 → 148 | Triple independent parallel operations (Nisan 2025) |\n| **Yıllık hareket (2025)** | ~549.000 | DHMİ / iGA |\n| **Günlük ortalama (2025)** | ~1.490–1.500 | Avrupa’nın en yoğun havalimanı |\n| **Tek günlük rekor** | **1.787** hareket (30 Ağu 2026) | Resmi rekor |\n| **Yıllık yolcu (2025)** | 84,5 milyon | Avrupa 2. sırada |\n| **Terminal** | 1 (dünyanın en büyük tek çatı altı terminali) | ~1,4 milyon m² |\n| **Contact Gate / Stand (yaklaşık)** | **~110–140** | Pier A/B/D/F/G + remote stands; modelde 48 contact gate kullanıyoruz |\n| **Hedef kapasite** | 90 → 120 → 200 milyon pax | Faz 2 yatırımları devam ediyor |\n\n> **Not:** Tam ölçek (1.500+ uçuş/gün × 120+ gate) klasik exact solver ve NISQ QAOA için imkânsızdır.  \n> Bu notebook **gerçekçi bir peak-period alt-problemi** (ör. 2 saatlik bank, 48 gate, 36 uçuş) üzerinde hibrit QML pipeline’ını gösterir ve ölçeklenebilirlik tartışmasını içerir.",
   "id": "OSsMazvSTUxs"
  },
  {
   "cell_type": "markdown",
   "metadata": {
    "id": "ahOPIGs5TUx0"
   },
   "source": "## AŞAMA 1 – Ortam Kurulumu",
   "id": "ahOPIGs5TUx0"
  },
  {
   "cell_type": "code",
   "metadata": {
    "colab": {
     "base_uri": "https://localhost:8080/",
     "height": 404
    },
    "id": "JZ2e8EccTUx1",
    "executionInfo": {
     "status": "error",
     "timestamp": 1790654409115,
     "user_tz": -180,
     "elapsed": 5969,
     "user": {
      "displayName": "Joseph Volkan ÖZCAN",
      "userId": "11389530967736397480"
     }
    },
    "outputId": "03155275-69bb-43ac-c281-7b3abe2be87c"
   },
   "source": "# Colab için kütüphane kurulumu (bir kere çalıştırın)\n!pip install -q qiskit qiskit-aer qiskit-algorithms qiskit-optimization \\\n               matplotlib seaborn pandas numpy networkx pulp scikit-learn\n\nimport numpy as np\nimport pandas as pd\nimport matplotlib.pyplot as plt\nimport seaborn as sns\nimport networkx as nx\nfrom typing import List, Dict, Tuple\nimport warnings\nwarnings.filterwarnings('ignore')\n\nfrom qiskit.primitives import Sampler\nfrom qiskit_algorithms import QAOA, NumPyMinimumEigensolver\nfrom qiskit_algorithms.optimizers import COBYLA\nfrom qiskit_optimization import QuadraticProgram\nfrom qiskit_optimization.algorithms import MinimumEigenOptimizer\nfrom qiskit_optimization.converters import QuadraticProgramToQubo\n\nprint('✓ Kütüphaneler yüklendi – Qiskit + Aer + Optimization hazır')\nprint('Notebook gerçek IGA 2025-2026 verilerine göre ölçeklendirilmiştir.')",
   "outputs": [
    {
     "output_type": "error",
     "ename": "ImportError",
     "evalue": "cannot import name 'Sampler' from 'qiskit.primitives' (/usr/local/lib/python3.13/dist-packages/qiskit/primitives/__init__.py)",
     "traceback": [
      "\u001b[0;31m---------------------------------------------------------------------------\u001b[0m",
      "\u001b[0;31mImportError\u001b[0m                               Traceback (most recent call last)",
      "\u001b[0;32m/tmp/ipykernel_5197/2140079570.py\u001b[0m in \u001b[0;36m<cell line: 0>\u001b[0;34m()\u001b[0m\n\u001b[1;32m     11\u001b[0m \u001b[0mwarnings\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mfilterwarnings\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m'ignore'\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m     12\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m---> 13\u001b[0;31m \u001b[0;32mfrom\u001b[0m \u001b[0mqiskit\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mprimitives\u001b[0m \u001b[0;32mimport\u001b[0m \u001b[0mSampler\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m\u001b[1;32m     14\u001b[0m \u001b[0;32mfrom\u001b[0m \u001b[0mqiskit_algorithms\u001b[0m \u001b[0;32mimport\u001b[0m \u001b[0mQAOA\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mNumPyMinimumEigensolver\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m     15\u001b[0m \u001b[0;32mfrom\u001b[0m \u001b[0mqiskit_algorithms\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0moptimizers\u001b[0m \u001b[0;32mimport\u001b[0m \u001b[0mCOBYLA\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n",
      "\u001b[0;31mImportError\u001b[0m: cannot import name 'Sampler' from 'qiskit.primitives' (/usr/local/lib/python3.13/dist-packages/qiskit/primitives/__init__.py)",
      "",
      "\u001b[0;31m---------------------------------------------------------------------------\u001b[0;32m\nNOTE: If your import is failing due to a missing package, you can\nmanually install dependencies using either !pip or !apt.\n\nTo view examples of installing some common dependencies, click the\n\"Open Examples\" button below.\n\u001b[0;31m---------------------------------------------------------------------------\u001b[0m\n"
     ],
     "errorDetails": {
      "actions": [
       {
        "action": "open_url",
        "actionText": "Open Examples",
        "url": "/notebooks/snippets/importing_libraries.ipynb"
       }
      ]
     }
    }
   ],
   "execution_count": 2,
   "id": "JZ2e8EccTUx1"
  },
  {
   "cell_type": "markdown",
   "metadata": {
    "id": "mLQIYNpXTUx4"
   },
   "source": "## AŞAMA 2 – Problem Tanımı (Gerçek IGA Bağlamı)",
   "id": "mLQIYNpXTUx4"
  },
  {
   "cell_type": "code",
   "metadata": {
    "id": "eODklhqGTUx5",
    "executionInfo": {
     "status": "aborted",
     "timestamp": 1790654156253,
     "user_tz": -180,
     "elapsed": 32538,
     "user": {
      "displayName": "Joseph Volkan ÖZCAN",
      "userId": "11389530967736397480"
     }
    }
   },
   "source": "print('''\n╔══════════════════════════════════════════════════════════════════════════════╗\n║  IGA ISTANBUL AIRPORT – GATE ASSIGNMENT PROBLEM (GAP)                        ║\n╠══════════════════════════════════════════════════════════════════════════════╣\n║  Gerçek durum:                                                               ║\n║  • 6 pist, triple independent operations                                     ║\n║  • Peak gün: 1.700+ hareket                                                  ║\n║  • ~110-140 contact gate + remote stands                                     ║\n║  • Transfer oranı yüksek (~%45-50) → yürüme mesafesi kritik                  ║\n║                                                                              ║\n║  Optimizasyon hedefleri:                                                     ║\n║  1. Yolcu yürüme mesafesini / connection time’ı minimize et                  ║\n║  2. Gate çakışmasını (overlap) tamamen engelle (hard)                        ║\n║  3. Uçak tipi – gate kapasitesi uyumunu sağla                                ║\n║  4. Idle / turnaround süresini azalt                                         ║\n║  5. Gerçek zamanlı disruption’a (hava, gecikme) hızlı re-optimize et         ║\n║                                                                              ║\n║  Bu notebook: 2 saatlik peak bank üzerinde 36 uçuş × 48 gate modeli          ║\n╚══════════════════════════════════════════════════════════════════════════════╝\n''')",
   "outputs": [],
   "execution_count": null,
   "id": "eODklhqGTUx5"
  },
  {
   "cell_type": "markdown",
   "metadata": {
    "id": "0Fdm4pi_TUx6"
   },
   "source": "## AŞAMA 3 – Gerçekçi Sentetik Veri (IGA Ölçekli)",
   "id": "0Fdm4pi_TUx6"
  },
  {
   "cell_type": "code",
   "metadata": {
    "id": "rpOeySlcTUx7",
    "executionInfo": {
     "status": "aborted",
     "timestamp": 1790654156310,
     "user_tz": -180,
     "elapsed": 32594,
     "user": {
      "displayName": "Joseph Volkan ÖZCAN",
      "userId": "11389530967736397480"
     }
    }
   },
   "source": "np.random.seed(42)\n\n# ============================================================\n# GERÇEK IGA PARAMETRELERİNE DAYALI MODEL BOYUTLARI\n# ============================================================\nN_GATES   = 48          # Contact gate sayısı (gerçek ~110-140; model için ölçeklenmiş)\nN_FLIGHTS = 36          # 2 saatlik peak bank (gerçek peak saatte ~60-80+ hareket)\nTIME_SLOTS = 12         # 10 dakikalık dilimler (2 saat)\n\n# Gate isimlendirme (IGA pier yapısına benzer)\npiers = ['A', 'B', 'D', 'F', 'G']\ngates = []\nfor p in piers:\n    for i in range(1, N_GATES // len(piers) + 1):\n        gates.append(f'{p}{i:02d}')\ngates = gates[:N_GATES]\n\n# Gate pozisyonları (metre cinsinden – terminal merkezine göre)\n# Gerçekte piers farklı uzunluklarda; burada gerçekçi dağılım\ngate_positions = {}\nfor i, g in enumerate(gates):\n    pier_idx = piers.index(g[0])\n    gate_positions[g] = np.array([\n        pier_idx * 350 + np.random.uniform(-30, 30),   # x: pier boyunca\n        (i % (N_GATES // len(piers))) * 45 + np.random.uniform(-10, 10)  # y\n    ])\n\n# Gate kapasitesi (Wide-body uyumlu gate sayısı sınırlı)\nwide_gates = set(np.random.choice(gates, size=int(N_GATES * 0.28), replace=False))\ngate_capacity = {g: 'Wide' if g in wide_gates else 'Narrow' for g in gates}\n\n# Uçuş verisi (Turkish Airlines ağırlıklı hub yapısı)\nairlines = ['TK'] * 22 + ['PC', 'XQ', 'VF', 'BA', 'LH', 'EK', 'QR', 'SQ', 'AF', 'KL', 'UA', 'AA', 'DL', 'CA']\nflight_ids = [f'{a}{np.random.randint(100, 999)}' for a in airlines[:N_FLIGHTS]]\n\nflight_data = pd.DataFrame({\n    'flight_id': flight_ids,\n    'arrival_slot': np.random.randint(0, TIME_SLOTS - 3, N_FLIGHTS),\n    'turnaround_slots': np.random.choice([2, 3, 4], N_FLIGHTS, p=[0.5, 0.35, 0.15]),\n    'passengers': np.random.randint(90, 380, N_FLIGHTS),\n    'aircraft_type': np.random.choice(['Narrow', 'Wide'], N_FLIGHTS, p=[0.72, 0.28]),\n    'origin': np.random.choice(\n        ['ESB','ADB','AYT','FRA','LHR','DXB','JFK','SIN','CDG','AMS','IST-DOM'],\n        N_FLIGHTS\n    ),\n    'is_transfer_heavy': np.random.choice([0, 1], N_FLIGHTS, p=[0.45, 0.55])\n})\nflight_data['departure_slot'] = flight_data['arrival_slot'] + flight_data['turnaround_slots']\nflight_data = flight_data.sort_values('arrival_slot').reset_index(drop=True)\n\nprint(f'Gate sayısı          : {N_GATES}')\nprint(f'Uçuş sayısı (bank)   : {N_FLIGHTS}')\nprint(f'Wide-body gate sayısı: {len(wide_gates)}')\nprint(f'Time slot sayısı     : {TIME_SLOTS} (≈ 2 saat)')\nprint()\ndisplay(flight_data.head(12))\nprint('...')\nprint(f\"\\nUçuş tipi dağılımı:\\n{flight_data['aircraft_type'].value_counts()}\")",
   "outputs": [],
   "execution_count": null,
   "id": "rpOeySlcTUx7"
  },
  {
   "cell_type": "markdown",
   "metadata": {
    "id": "COLtr1ACTUx8"
   },
   "source": "## AŞAMA 4 – Maliyet Matrisi ve Constraint Tanımları",
   "id": "COLtr1ACTUx8"
  },
  {
   "cell_type": "code",
   "metadata": {
    "id": "vh0XouVsTUx9",
    "executionInfo": {
     "status": "aborted",
     "timestamp": 1790654156314,
     "user_tz": -180,
     "elapsed": 32597,
     "user": {
      "displayName": "Joseph Volkan ÖZCAN",
      "userId": "11389530967736397480"
     }
    }
   },
   "source": "def walking_cost(g1: str, g2: str) -> float:\n    \"\"\"Gate’ler arası yürüme mesafesi (metre) – transfer yolcu için kritik\"\"\"\n    return float(np.linalg.norm(gate_positions[g1] - gate_positions[g2]))\n\n# Referans nokta: terminal merkezi (transfer koridoru)\nterminal_center = np.mean(list(gate_positions.values()), axis=0)\n\ndef gate_to_center_cost(g: str) -> float:\n    return float(np.linalg.norm(gate_positions[g] - terminal_center))\n\n# Maliyet matrisi: uçuş × gate\ncost_matrix = np.zeros((N_FLIGHTS, N_GATES))\nfor f_idx in range(N_FLIGHTS):\n    for g_idx, g in enumerate(gates):\n        base = gate_to_center_cost(g)\n        # Transfer-heavy uçuşlar merkeze yakın gate tercih etsin\n        if flight_data.loc[f_idx, 'is_transfer_heavy']:\n            base *= 1.35\n        # Wide-body gate’ler biraz daha pahalı (talep yüksek)\n        if gate_capacity[g] == 'Wide':\n            base *= 1.08\n        cost_matrix[f_idx, g_idx] = base + np.random.uniform(5, 25)\n\nprint('Maliyet matrisi şekli:', cost_matrix.shape)\nprint(f'Ortalama yürüme maliyeti: {cost_matrix.mean():.1f} m')\nprint(f'Min / Max: {cost_matrix.min():.1f} / {cost_matrix.max():.1f} m')\n\n# Görselleştirme\nfig, ax = plt.subplots(figsize=(12, 5))\nsns.heatmap(cost_matrix, cmap='YlOrRd', ax=ax,\n            xticklabels=[g if i % 4 == 0 else '' for i, g in enumerate(gates)],\n            yticklabels=flight_data['flight_id'].tolist())\nax.set_title('Uçuş × Gate Yürüme Maliyet Matrisi (metre)')\nax.set_xlabel('Gates')\nax.set_ylabel('Flights')\nplt.tight_layout()\nplt.show()",
   "outputs": [],
   "execution_count": null,
   "id": "vh0XouVsTUx9"
  },
  {
   "cell_type": "markdown",
   "metadata": {
    "id": "yqLNCrmMTUx9"
   },
   "source": "## AŞAMA 5 – Klasik ILP Baseline (PuLP)",
   "id": "yqLNCrmMTUx9"
  },
  {
   "cell_type": "code",
   "metadata": {
    "id": "IFHSXIFiTUx-",
    "executionInfo": {
     "status": "aborted",
     "timestamp": 1790654156317,
     "user_tz": -180,
     "elapsed": 32600,
     "user": {
      "displayName": "Joseph Volkan ÖZCAN",
      "userId": "11389530967736397480"
     }
    }
   },
   "source": "import pulp\n\ndef solve_classical_gap(flights_df, gates_list, cost_mat, gate_cap, verbose=True):\n    \"\"\"Integer Linear Programming ile Gate Assignment\"\"\"\n    n_f, n_g = len(flights_df), len(gates_list)\n    prob = pulp.LpProblem('IGA_Gate_Assignment', pulp.LpMinimize)\n\n    x = pulp.LpVariable.dicts('x',\n                             ((i, j) for i in range(n_f) for j in range(n_g)),\n                             cat='Binary')\n\n    # Objective\n    prob += pulp.lpSum(cost_mat[i, j] * x[(i, j)] for i in range(n_f) for j in range(n_g))\n\n    # Her uçuş tam 1 gate\n    for i in range(n_f):\n        prob += pulp.lpSum(x[(i, j)] for j in range(n_g)) == 1\n\n    # Zaman çakışması (aynı gate’de overlap yok)\n    for j in range(n_g):\n        for i1 in range(n_f):\n            for i2 in range(i1 + 1, n_f):\n                a1 = flights_df.loc[i1, 'arrival_slot']\n                d1 = flights_df.loc[i1, 'departure_slot']\n                a2 = flights_df.loc[i2, 'arrival_slot']\n                d2 = flights_df.loc[i2, 'departure_slot']\n                if not (d1 <= a2 or d2 <= a1):\n                    prob += x[(i1, j)] + x[(i2, j)] <= 1\n\n    # Uçak tipi – gate kapasitesi\n    for i in range(n_f):\n        if flights_df.loc[i, 'aircraft_type'] == 'Wide':\n            for j, g in enumerate(gates_list):\n                if gate_cap[g] != 'Wide':\n                    prob += x[(i, j)] == 0\n\n    status = prob.solve(pulp.PULP_CBC_CMD(msg=0, timeLimit=60))\n    assignment = {}\n    total_cost = 0.0\n    if pulp.LpStatus[status] == 'Optimal':\n        for i in range(n_f):\n            for j in range(n_g):\n                if pulp.value(x[(i, j)]) > 0.5:\n                    assignment[flights_df.loc[i, 'flight_id']] = gates_list[j]\n                    total_cost += cost_mat[i, j]\n        if verbose:\n            print('Klasik Optimal Atama (ilk 15):')\n            for k, (f, g) in enumerate(assignment.items()):\n                if k < 15:\n                    print(f'  {f:8s} → {g}')\n            print(f'...\\nToplam yürüme maliyeti: {total_cost:,.1f} m')\n    else:\n        print('Klasik solver durumu:', pulp.LpStatus[status])\n    return assignment, total_cost\n\nclassical_assignment, classical_cost = solve_classical_gap(\n    flight_data, gates, cost_matrix, gate_capacity\n)\nprint(f'\\n✓ Klasik baseline maliyet: {classical_cost:,.1f} metre')",
   "outputs": [],
   "execution_count": null,
   "id": "IFHSXIFiTUx-"
  },
  {
   "cell_type": "markdown",
   "metadata": {
    "id": "8Q2rwSBdTUx_"
   },
   "source": "## AŞAMA 6 – QUBO Formülasyonu",
   "id": "8Q2rwSBdTUx_"
  },
  {
   "cell_type": "code",
   "metadata": {
    "id": "3Ge3b2rbTUx_",
    "executionInfo": {
     "status": "aborted",
     "timestamp": 1790654156320,
     "user_tz": -180,
     "elapsed": 32601,
     "user": {
      "displayName": "Joseph Volkan ÖZCAN",
      "userId": "11389530967736397480"
     }
    }
   },
   "source": "def create_qubo(flights_df, gates_list, cost_mat, gate_cap, penalty=250.0):\n    \"\"\"\n    GAP → QUBO\n    Değişken sayısı = N_FLIGHTS × N_GATES\n    Bu örnekte 36 × 48 = 1.728 binary değişken (büyük; simülasyon için\n    daha sonra küçük alt-problemlere böleceğiz veya classical pre-solve yapacağız).\n    \"\"\"\n    n_f, n_g = len(flights_df), len(gates_list)\n    n_vars = n_f * n_g\n\n    def idx(f, g):\n        return f * n_g + g\n\n    Q = np.zeros((n_vars, n_vars))\n\n    # 1. Objective (maliyet) – diagonal\n    for f in range(n_f):\n        for g in range(n_g):\n            Q[idx(f, g), idx(f, g)] += cost_mat[f, g]\n\n    # 2. Her uçuş tam 1 gate (penalty)\n    for f in range(n_f):\n        for g1 in range(n_g):\n            for g2 in range(n_g):\n                i, j = idx(f, g1), idx(f, g2)\n                if g1 == g2:\n                    Q[i, i] -= penalty\n                else:\n                    Q[i, j] += penalty\n\n    # 3. Zaman çakışması penalty\n    for g in range(n_g):\n        for f1 in range(n_f):\n            for f2 in range(f1 + 1, n_f):\n                a1, d1 = flights_df.loc[f1, 'arrival_slot'], flights_df.loc[f1, 'departure_slot']\n                a2, d2 = flights_df.loc[f2, 'arrival_slot'], flights_df.loc[f2, 'departure_slot']\n                if not (d1 <= a2 or d2 <= a1):\n                    i, j = idx(f1, g), idx(f2, g)\n                    Q[i, j] += penalty\n                    Q[j, i] += penalty\n\n    # 4. Kapasite (Wide-body only Wide gates) – çok yüksek penalty\n    for f in range(n_f):\n        if flights_df.loc[f, 'aircraft_type'] == 'Wide':\n            for g, gate_name in enumerate(gates_list):\n                if gate_cap[gate_name] != 'Wide':\n                    Q[idx(f, g), idx(f, g)] += penalty * 5\n\n    return Q, n_vars\n\nprint('Tam ölçek QUBO boyutu hesaplanıyor...')\nQ_full, n_vars_full = create_qubo(flight_data, gates, cost_matrix, gate_capacity)\nprint(f'Tam model değişken sayısı: {n_vars_full} (36 × 48)')\nprint('→ NISQ ve Colab simülasyonu için çok büyük.')\nprint('→ Aşağıda gerçekçi bir alt-problem (8 uçuş × 10 gate) ile QAOA çalıştıracağız.')\nprint('→ Büyük ölçekte decomposition + hybrid classical-quantum kullanılır.')",
   "outputs": [],
   "execution_count": null,
   "id": "3Ge3b2rbTUx_"
  },
  {
   "cell_type": "markdown",
   "metadata": {
    "id": "u3r8DhkqTUyB"
   },
   "source": "## AŞAMA 7–11 – Ölçeklenmiş Alt-Problem ile QAOA Pipeline\n\nGerçekçi peak-period alt-problemi: **8 uçuş × 10 gate = 80 qubit** (Colab’da simüle edilebilir).",
   "id": "u3r8DhkqTUyB"
  },
  {
   "cell_type": "code",
   "metadata": {
    "id": "nHE7S0eoTUyC",
    "executionInfo": {
     "status": "aborted",
     "timestamp": 1790654156322,
     "user_tz": -180,
     "elapsed": 32602,
     "user": {
      "displayName": "Joseph Volkan ÖZCAN",
      "userId": "11389530967736397480"
     }
    }
   },
   "source": "# ============================================================\n# ÖLÇEKLENMİŞ ALT-PROBLEM (QAOA için)\n# ============================================================\nSUB_FLIGHTS = 8\nSUB_GATES   = 10\n\nsub_flights_df = flight_data.iloc[:SUB_FLIGHTS].copy().reset_index(drop=True)\nsub_gates = gates[:SUB_GATES]\nsub_cost = cost_matrix[:SUB_FLIGHTS, :SUB_GATES]\nsub_gate_cap = {g: gate_capacity[g] for g in sub_gates}\n\nprint(f'Alt-problem: {SUB_FLIGHTS} uçuş × {SUB_GATES} gate = {SUB_FLIGHTS * SUB_GATES} değişken')\nprint('Uçuşlar:', sub_flights_df['flight_id'].tolist())\nprint('Gates  :', sub_gates)\n\n# Klasik baseline (alt-problem)\nsub_classical_assign, sub_classical_cost = solve_classical_gap(\n    sub_flights_df, sub_gates, sub_cost, sub_gate_cap, verbose=True\n)",
   "outputs": [],
   "execution_count": null,
   "id": "nHE7S0eoTUyC"
  },
  {
   "cell_type": "code",
   "metadata": {
    "id": "xTJAd6MRTUyD",
    "executionInfo": {
     "status": "aborted",
     "timestamp": 1790654156324,
     "user_tz": -180,
     "elapsed": 32604,
     "user": {
      "displayName": "Joseph Volkan ÖZCAN",
      "userId": "11389530967736397480"
     }
    }
   },
   "source": "# QUBO oluştur\nQ_sub, n_qubits = create_qubo(sub_flights_df, sub_gates, sub_cost, sub_gate_cap, penalty=180.0)\nprint(f'QUBO boyutu: {n_qubits} × {n_qubits}')\n\n# QuadraticProgram\nqp = QuadraticProgram('IGA_Sub_GAP')\nfor i in range(n_qubits):\n    qp.binary_var(name=f'x{i}')\n\nlinear = {f'x{i}': float(Q_sub[i, i]) for i in range(n_qubits)}\nquadratic = {}\nfor i in range(n_qubits):\n    for j in range(i + 1, n_qubits):\n        if abs(Q_sub[i, j]) > 1e-8:\n            quadratic[(f'x{i}', f'x{j}')] = float(Q_sub[i, j])\n\nqp.minimize(linear=linear, quadratic=quadratic)\nprint(f'QuadraticProgram oluşturuldu – {qp.get_num_binary_vars()} binary değişken')",
   "outputs": [],
   "execution_count": null,
   "id": "xTJAd6MRTUyD"
  },
  {
   "cell_type": "code",
   "metadata": {
    "id": "-O1029X6TUyD",
    "executionInfo": {
     "status": "aborted",
     "timestamp": 1790654156805,
     "user_tz": -180,
     "elapsed": 33084,
     "user": {
      "displayName": "Joseph Volkan ÖZCAN",
      "userId": "11389530967736397480"
     }
    }
   },
   "source": "# Exact solver (doğrulama)\nprint('Exact klasik solver çalışıyor...')\nexact = MinimumEigenOptimizer(NumPyMinimumEigensolver())\nexact_result = exact.solve(qp)\nprint(exact_result.prettyprint())",
   "outputs": [],
   "execution_count": null,
   "id": "-O1029X6TUyD"
  },
  {
   "cell_type": "code",
   "metadata": {
    "id": "tUDRuuaWTUyE",
    "executionInfo": {
     "status": "aborted",
     "timestamp": 1790654156808,
     "user_tz": -180,
     "elapsed": 33086,
     "user": {
      "displayName": "Joseph Volkan ÖZCAN",
      "userId": "11389530967736397480"
     }
    }
   },
   "source": "# QAOA (p=1 – hızlı simülasyon)\nprint('QAOA (p=1) çalışıyor... (30-90 saniye sürebilir)')\nsampler = Sampler()\noptimizer = COBYLA(maxiter=60)\nqaoa = QAOA(sampler=sampler, optimizer=optimizer, reps=1)\nqaoa_opt = MinimumEigenOptimizer(qaoa)\nqaoa_result = qaoa_opt.solve(qp)\nprint(qaoa_result.prettyprint())",
   "outputs": [],
   "execution_count": null,
   "id": "tUDRuuaWTUyE"
  },
  {
   "cell_type": "markdown",
   "metadata": {
    "id": "HYUCMeuUTUyF"
   },
   "source": "## AŞAMA 12 – Sonuç Çıkarımı ve Karşılaştırma",
   "id": "HYUCMeuUTUyF"
  },
  {
   "cell_type": "code",
   "metadata": {
    "id": "zJOcTYUGTUyG",
    "executionInfo": {
     "status": "aborted",
     "timestamp": 1790654156811,
     "user_tz": -180,
     "elapsed": 33089,
     "user": {
      "displayName": "Joseph Volkan ÖZCAN",
      "userId": "11389530967736397480"
     }
    }
   },
   "source": "def extract_assignment(result, n_f, n_g, flight_ids, gate_list):\n    x = result.x\n    assignment = {}\n    for f_idx, fid in enumerate(flight_ids):\n        for g_idx, g in enumerate(gate_list):\n            if x[f_idx * n_g + g_idx] > 0.5:\n                assignment[fid] = g\n    return assignment\n\nqaoa_assign = extract_assignment(\n    qaoa_result, SUB_FLIGHTS, SUB_GATES,\n    sub_flights_df['flight_id'].tolist(), sub_gates\n)\n\ndef compute_cost(assignment, flights_df, gate_list, cost_mat):\n    total = 0.0\n    for i, fid in enumerate(flights_df['flight_id']):\n        if fid in assignment:\n            g = assignment[fid]\n            j = gate_list.index(g)\n            total += cost_mat[i, j]\n    return total\n\nqaoa_cost = compute_cost(qaoa_assign, sub_flights_df, sub_gates, sub_cost)\n\nprint('='*60)\nprint('KARŞILAŞTIRMA (Alt-problem)')\nprint('='*60)\nprint(f'Klasik ILP maliyet : {sub_classical_cost:,.1f} m')\nprint(f'QAOA maliyet       : {qaoa_cost:,.1f} m')\nprint(f'Exact maliyet      : {exact_result.fval:,.1f}')\nprint()\nprint('Klasik atama:', sub_classical_assign)\nprint('QAOA atama  :', qaoa_assign)",
   "outputs": [],
   "execution_count": null,
   "id": "zJOcTYUGTUyG"
  },
  {
   "cell_type": "markdown",
   "metadata": {
    "id": "s03jhsoDTUyG"
   },
   "source": "## AŞAMA 13–14 – Görselleştirme",
   "id": "s03jhsoDTUyG"
  },
  {
   "cell_type": "code",
   "metadata": {
    "id": "PEYJDjoJTUyH",
    "executionInfo": {
     "status": "aborted",
     "timestamp": 1790654156814,
     "user_tz": -180,
     "elapsed": 33091,
     "user": {
      "displayName": "Joseph Volkan ÖZCAN",
      "userId": "11389530967736397480"
     }
    }
   },
   "source": "fig, axes = plt.subplots(1, 2, figsize=(14, 5))\n\n# Atama matrisi\nmat = np.zeros((SUB_FLIGHTS, SUB_GATES))\nfor i, fid in enumerate(sub_flights_df['flight_id']):\n    if fid in qaoa_assign:\n        j = sub_gates.index(qaoa_assign[fid])\n        mat[i, j] = 1\n\nsns.heatmap(mat, annot=True, cmap='Blues', cbar=False,\n            xticklabels=sub_gates, yticklabels=sub_flights_df['flight_id'],\n            ax=axes[0])\naxes[0].set_title('QAOA Gate Assignment Matrix')\naxes[0].set_xlabel('Gates')\naxes[0].set_ylabel('Flights')\n\n# Bipartite graph\nG = nx.Graph()\nG.add_nodes_from(sub_flights_df['flight_id'], bipartite=0)\nG.add_nodes_from(sub_gates, bipartite=1)\nfor f, g in qaoa_assign.items():\n    G.add_edge(f, g)\n\npos = {}\npos.update((n, (0, i)) for i, n in enumerate(sub_flights_df['flight_id']))\npos.update((n, (1, i)) for i, n in enumerate(sub_gates))\nnx.draw(G, pos, with_labels=True,\n        node_color=['#5B9BD5']*SUB_FLIGHTS + ['#70AD47']*SUB_GATES,\n        node_size=900, font_size=8, ax=axes[1])\naxes[1].set_title('Flight → Gate Assignment Graph')\n\nplt.tight_layout()\nplt.show()",
   "outputs": [],
   "execution_count": null,
   "id": "PEYJDjoJTUyH"
  },
  {
   "cell_type": "markdown",
   "metadata": {
    "id": "CQ6vCVBQTUyI"
   },
   "source": "## AŞAMA 15 – Ölçeklenebilirlik ve Quantum Advantage Tartışması",
   "id": "CQ6vCVBQTUyI"
  },
  {
   "cell_type": "code",
   "metadata": {
    "id": "F225zfu9TUyI",
    "executionInfo": {
     "status": "aborted",
     "timestamp": 1790654156816,
     "user_tz": -180,
     "elapsed": 33092,
     "user": {
      "displayName": "Joseph Volkan ÖZCAN",
      "userId": "11389530967736397480"
     }
    }
   },
   "source": "print('''\n╔══════════════════════════════════════════════════════════════════════════════╗\n║  ÖLÇEKLENEBİLİRLİK ANALİZİ – GERÇEK IGA                                    ║\n╠══════════════════════════════════════════════════════════════════════════════╣\n║  Gerçek peak gün: 1.700+ hareket                                           ║\n║  Contact gate: ~110-140                                                    ║\n║  Değişken sayısı (tam gün): ~1.700 × 120 ≈ 200.000 binary değişken         ║\n║                                                                            ║\n║  Klasik exact solver: İmkânsız (exponential)                               ║\n║  Klasik heuristik / MIP: Dakikalar–saatler (re-optimization zor)           ║\n║                                                                            ║\n║  Quantum yaklaşım (önerilen):                                              ║\n║  1. Zaman dilimine göre decomposition (2-4 saatlik banklar)                ║\n║  2. Gate clustering (pier bazlı alt-problemler)                            ║\n║  3. QAOA / Quantum Annealing (D-Wave) / hybrid solvers                     ║\n║  4. Klasik local search ile feasibility repair                             ║\n║  5. Real-time disruption → sadece etkilenen alt-problemi quantum’a gönder  ║\n║                                                                            ║\n║  Bu notebook’taki 8×10 model, decomposition sonrası ortaya çıkan           ║\n║  tipik alt-problem boyutunu temsil eder.                                   ║\n╚══════════════════════════════════════════════════════════════════════════════╝\n''')",
   "outputs": [],
   "execution_count": null,
   "id": "F225zfu9TUyI"
  },
  {
   "cell_type": "markdown",
   "metadata": {
    "id": "T_qWK2LaTUyJ"
   },
   "source": "## AŞAMA 16 – NISQ Gerçekleri & Error Mitigation",
   "id": "T_qWK2LaTUyJ"
  },
  {
   "cell_type": "code",
   "metadata": {
    "id": "JpZ7-FWdTUyK",
    "executionInfo": {
     "status": "aborted",
     "timestamp": 1790654156819,
     "user_tz": -180,
     "elapsed": 33095,
     "user": {
      "displayName": "Joseph Volkan ÖZCAN",
      "userId": "11389530967736397480"
     }
    }
   },
   "source": "print('''\nGerçek donanımda (IBM Heron, IonQ Forte, Quantinuum...):\n• Noise, decoherence, readout error\n• 80-100 qubit’lik problemler bile zorlayıcı\n\nStratejiler:\n1. Zero-Noise Extrapolation (ZNE)\n2. Measurement Error Mitigation\n3. CVaR-VQE (outlier’lara robust)\n4. Problem decomposition + classical post-processing\n5. Quantum-inspired algorithms (şu an production’da daha pratik)\n\nIGA için önerilen yol: Hybrid classical-quantum + quantum-inspired solvers\n(Lufthansa Industry Solutions, IonQ+DESY, BQP benzeri yaklaşımlar).\n''')",
   "outputs": [],
   "execution_count": null,
   "id": "JpZ7-FWdTUyK"
  },
  {
   "cell_type": "markdown",
   "metadata": {
    "id": "VKlhBwZfTUyK"
   },
   "source": "## AŞAMA 17 – Hybrid Pipeline Mimarisi (IGA için)",
   "id": "VKlhBwZfTUyK"
  },
  {
   "cell_type": "code",
   "metadata": {
    "id": "ljZv_q9zTUyL",
    "executionInfo": {
     "status": "aborted",
     "timestamp": 1790654156903,
     "user_tz": -180,
     "elapsed": 33178,
     "user": {
      "displayName": "Joseph Volkan ÖZCAN",
      "userId": "11389530967736397480"
     }
    }
   },
   "source": "print('''\nÖnerilen IGA Hybrid Pipeline (sunumdaki “Hybrid Approach” ile uyumlu):\n\n1. Klasik pre-processing\n   - Data cleaning, constraint filtering, gate clustering (pier bazlı)\n   - Transfer yolcu matrisini güncelleme\n\n2. Quantum / Quantum-inspired core\n   - Alt-problem QUBO’larını QAOA veya Annealing ile çöz\n   - veya quantum-inspired evolutionary / tensor network solvers\n\n3. Klasik post-processing\n   - Feasibility repair\n   - Local search (2-opt, swap)\n   - Multi-objective ranking (yürüme + yakıt + carbon + on-time)\n\n4. Real-time loop\n   - Weather / delay disruption geldiğinde sadece etkilenen\n     2-4 saatlik bank + ilgili pier’leri re-optimize et\n\n5. Entegrasyon\n   - AODB, RMS, FIDS ile API üzerinden bağlantı\n''')",
   "outputs": [],
   "execution_count": null,
   "id": "ljZv_q9zTUyL"
  },
  {
   "cell_type": "markdown",
   "metadata": {
    "id": "MDZnyCb1TUyM"
   },
   "source": "## AŞAMA 18 – İş Değeri ve KPI’lar",
   "id": "MDZnyCb1TUyM"
  },
  {
   "cell_type": "code",
   "metadata": {
    "id": "M0Bs9zzvTUyM",
    "executionInfo": {
     "status": "aborted",
     "timestamp": 1790654156906,
     "user_tz": -180,
     "elapsed": 33180,
     "user": {
      "displayName": "Joseph Volkan ÖZCAN",
      "userId": "11389530967736397480"
     }
    }
   },
   "source": "print('''\nIGA / Turkish Airlines için beklenen faydalar:\n\n• Ortalama connection walking distance ↓\n• Gate conflict / re-assignment sayısı ↓\n• Turnaround idle time ↓ → yakıt & CO₂ ↓\n• Transfer yolcu memnuniyeti ↑\n• On-time performance ↑\n• Peak saatte ek slot kapasitesi yaratma potansiyeli\n\nKPI örnekleri:\n- Average passenger walking distance (m)\n- % of connecting passengers within MCT\n- Number of gate conflicts per day\n- Average taxi-in / taxi-out time\n- Carbon intensity per turnaround\n''')",
   "outputs": [],
   "execution_count": null,
   "id": "M0Bs9zzvTUyM"
  },
  {
   "cell_type": "markdown",
   "metadata": {
    "id": "FTYdYhZXTUyN"
   },
   "source": "## AŞAMA 19 – Öğrenci Egzersizleri",
   "id": "FTYdYhZXTUyN"
  },
  {
   "cell_type": "code",
   "metadata": {
    "id": "YqKqMtUWTUyN",
    "executionInfo": {
     "status": "aborted",
     "timestamp": 1790654156909,
     "user_tz": -180,
     "elapsed": 33182,
     "user": {
      "displayName": "Joseph Volkan ÖZCAN",
      "userId": "11389530967736397480"
     }
    }
   },
   "source": "print('''\n1. SUB_FLIGHTS ve SUB_GATES değerlerini 10×12, 12×14 yap.\n   Simülasyon süresi ve approximation ratio nasıl değişiyor?\n\n2. QAOA p=1 → p=2 dene. İyileşme var mı? Süre ne kadar arttı?\n\n3. Penalty parametresini 100 / 180 / 300 arasında değiştir.\n   Constraint violation oranı ve maliyet nasıl etkileniyor?\n\n4. Transfer-heavy uçuşlara daha yüksek ağırlık ver.\n   Merkeze yakın gate’ler ne kadar daha fazla kullanılıyor?\n\n5. CVaR-VQE dene (qiskit_algorithms).\n\n6. Aynı QUBO’yu D-Wave Ocean SDK / Leap hybrid solver’a gönder.\n\n7. Gerçek bir peak saat dilimi için (ör. 08:00-10:00) daha fazla\n   uçuş ekleyip decomposition stratejisi tasarla.\n''')",
   "outputs": [],
   "execution_count": null,
   "id": "YqKqMtUWTUyN"
  },
  {
   "cell_type": "markdown",
   "metadata": {
    "id": "VfN-dhZLTUyO"
   },
   "source": "## AŞAMA 20 – Kaynaklar",
   "id": "VfN-dhZLTUyO"
  },
  {
   "cell_type": "code",
   "metadata": {
    "id": "EWdbZWc_TUyP",
    "executionInfo": {
     "status": "aborted",
     "timestamp": 1790654156911,
     "user_tz": -180,
     "elapsed": 33183,
     "user": {
      "displayName": "Joseph Volkan ÖZCAN",
      "userId": "11389530967736397480"
     }
    }
   },
   "source": "print('''\nAkademik / Endüstri referansları:\n• Optimal Flight-Gate Assignment on a Digital Quantum Computer\n  (Phys. Rev. Applied 20, 064025 – 2023)\n• IonQ + DESY Gate Assignment experiments\n• Lufthansa Industry Solutions + Universität Hamburg quantum gate project\n• iGA resmi açıklamaları (4. pist açılışı – Eylül 2026)\n• EUROCONTROL / DHMİ trafik verileri\n\nKütüphaneler:\n• Qiskit Optimization\n• PennyLane\n• D-Wave Ocean / Leap\n• Amazon Braket\n\nIGA Quantum Journey (sunum):\nAwareness → Solution training → Case selection → Applied delivery → PoC\n''')",
   "outputs": [],
   "execution_count": null,
   "id": "EWdbZWc_TUyP"
  },
  {
   "cell_type": "markdown",
   "metadata": {
    "id": "pqOirY8-TUyR"
   },
   "source": "## AŞAMA 21 – Özet",
   "id": "pqOirY8-TUyR"
  },
  {
   "cell_type": "code",
   "metadata": {
    "id": "iJ0SJ279TUyS",
    "executionInfo": {
     "status": "aborted",
     "timestamp": 1790654156914,
     "user_tz": -180,
     "elapsed": 33186,
     "user": {
      "displayName": "Joseph Volkan ÖZCAN",
      "userId": "11389530967736397480"
     }
    }
   },
   "source": "print('''\n╔══════════════════════════════════════════════════════════════════════════════╗\n║  ÖZET                                                                        ║\n╠══════════════════════════════════════════════════════════════════════════════╣\n║  ✓ Gerçek IGA 2025-2026 verileri (6 pist, ~1.500 günlük hareket,            ║\n║    ~110-140 gate) modele yansıtıldı                                          ║\n║  ✓ 36 uçuş × 48 gate ölçekli gerçekçi veri seti üretildi                     ║\n║  ✓ Klasik ILP baseline (PuLP) çalıştırıldı                                   ║\n║  ✓ QUBO formülasyonu + 8×10 alt-problem ile QAOA pipeline tamamlandı         ║\n║  ✓ Sonuçlar karşılaştırıldı ve görselleştirildi                              ║\n║  ✓ Ölçeklenebilirlik, NISQ, hybrid mimari ve iş değeri tartışıldı            ║\n║  ✓ 21 aşamalı QML şablonu uygulandı                                          ║\n║                                                                              ║\n║  Bu notebook öğrenciler için doğrudan Colab’da çalıştırılabilir              ║\n║  ve kendi case’lerine (crew, inventory, routing...) uyarlanabilir.           ║\n║                                                                              ║\n║  Teşekkürler – Joseph Volkan Özcan / Quantum Task Force referanslı materyal  ║\n╚══════════════════════════════════════════════════════════════════════════════╝\n''')",
   "outputs": [],
   "execution_count": null,
   "id": "iJ0SJ279TUyS"
  }
 ]
}