{
 "cells": [
  {
   "cell_type": "markdown",
   "id": "2d91d93f",
   "metadata": {
    "id": "2d91d93f"
   },
   "source": "# KOBRA — Karapınar Obruk Risk Analiz Motoru\n**BVK Technology · Kuantum destekli obruk tahmin simülatörü · Google Colab / Python**\n\nSüreç: **1** literatür taraması → **2** mevcut simülatör/algoritmalar → **3** veri kaynakları → **4** entegrasyon katmanı →\n**5** uydu/LiDAR/SAR/drone işleme → **6** hibrit klasik–kuantum motor → **7** sonuçlar ve yorumlama.\nFaz 1–3 raporları ayrı Markdown dosyalarıdır (`phase1_literature.md`, `phase2_tools_algorithms.md`, `phase3_data_sources.md`).\n\n**Bu motor ne yapar, ne yapmaz?** Bölgesel tarama ve önceliklendirme yapar: hangi hücrelerde obruk olasılığı yüksek,\nyeraltı suyu senaryolarına göre gelecek yıllarda kaç obruk beklenir, izleme cihazları nereye konmalı. Tek tek obruk\niçin tarih/konum kehaneti üretmez (Karapınar'da çökme öncesi InSAR sinyali literatürde gösterilememiştir).\n\n> Çalışma zamanı: CPU yeterli (≈10–25 dk ilk çalıştırma; önbellekle 3–5 dk). GPU yalnız SAM/YOLO opsiyonları için."
  },
  {
   "cell_type": "markdown",
   "id": "05f8e3ac",
   "metadata": {
    "id": "05f8e3ac"
   },
   "source": "## 0. Kurulum ve gizli anahtarlar"
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "id": "fbd81e38",
   "metadata": {
    "colab": {
     "base_uri": "https://localhost:8080/"
    },
    "id": "fbd81e38",
    "executionInfo": {
     "status": "ok",
     "timestamp": 1791962701206,
     "user_tz": -180,
     "elapsed": 26420,
     "user": {
      "displayName": "Joseph Volkan ÖZCAN",
      "userId": "11389530967736397480"
     }
    },
    "outputId": "61142d74-0ce6-46c8-ded1-d2de9f384f9d"
   },
   "outputs": [
    {
     "output_type": "stream",
     "name": "stdout",
     "text": [
      "\u001b[2K     \u001b[90m━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\u001b[0m \u001b[32m56.2/56.2 kB\u001b[0m \u001b[31m4.9 MB/s\u001b[0m eta \u001b[36m0:00:00\u001b[0m\n",
      "\u001b[2K   \u001b[90m━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\u001b[0m \u001b[32m253.0/253.0 kB\u001b[0m \u001b[31m10.2 MB/s\u001b[0m eta \u001b[36m0:00:00\u001b[0m\n",
      "\u001b[2K   \u001b[90m━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\u001b[0m \u001b[32m5.4/5.4 MB\u001b[0m \u001b[31m77.0 MB/s\u001b[0m eta \u001b[36m0:00:00\u001b[0m\n",
      "\u001b[2K   \u001b[90m━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\u001b[0m \u001b[32m937.5/937.5 kB\u001b[0m \u001b[31m59.7 MB/s\u001b[0m eta \u001b[36m0:00:00\u001b[0m\n",
      "\u001b[2K   \u001b[90m━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\u001b[0m \u001b[32m9.8/9.8 MB\u001b[0m \u001b[31m142.9 MB/s\u001b[0m eta \u001b[36m0:00:00\u001b[0m\n",
      "\u001b[2K   \u001b[90m━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\u001b[0m \u001b[32m12.4/12.4 MB\u001b[0m \u001b[31m133.8 MB/s\u001b[0m eta \u001b[36m0:00:00\u001b[0m\n",
      "\u001b[2K   \u001b[90m━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\u001b[0m \u001b[32m2.0/2.0 MB\u001b[0m \u001b[31m90.7 MB/s\u001b[0m eta \u001b[36m0:00:00\u001b[0m\n",
      "\u001b[2K   \u001b[90m━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\u001b[0m \u001b[32m8.7/8.7 MB\u001b[0m \u001b[31m116.9 MB/s\u001b[0m eta \u001b[36m0:00:00\u001b[0m\n",
      "\u001b[2K   \u001b[90m━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\u001b[0m \u001b[32m2.5/2.5 MB\u001b[0m \u001b[31m77.1 MB/s\u001b[0m eta \u001b[36m0:00:00\u001b[0m\n",
      "\u001b[2K   \u001b[90m━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\u001b[0m \u001b[32m133.0/133.0 kB\u001b[0m \u001b[31m13.4 MB/s\u001b[0m eta \u001b[36m0:00:00\u001b[0m\n",
      "\u001b[2K   \u001b[90m━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\u001b[0m \u001b[32m78.7/78.7 kB\u001b[0m \u001b[31m8.3 MB/s\u001b[0m eta \u001b[36m0:00:00\u001b[0m\n",
      "\u001b[2K   \u001b[90m━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\u001b[0m \u001b[32m51.5/51.5 kB\u001b[0m \u001b[31m5.3 MB/s\u001b[0m eta \u001b[36m0:00:00\u001b[0m\n",
      "\u001b[2K   \u001b[90m━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\u001b[0m \u001b[32m412.6/412.6 kB\u001b[0m \u001b[31m35.6 MB/s\u001b[0m eta \u001b[36m0:00:00\u001b[0m\n",
      "\u001b[2K   \u001b[90m━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\u001b[0m \u001b[32m120.7/120.7 kB\u001b[0m \u001b[31m13.2 MB/s\u001b[0m eta \u001b[36m0:00:00\u001b[0m\n",
      "\u001b[2K   \u001b[90m━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\u001b[0m \u001b[32m25.5/25.5 MB\u001b[0m \u001b[31m92.1 MB/s\u001b[0m eta \u001b[36m0:00:00\u001b[0m\n",
      "\u001b[2K   \u001b[90m━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\u001b[0m \u001b[32m95.7/95.7 kB\u001b[0m \u001b[31m9.7 MB/s\u001b[0m eta \u001b[36m0:00:00\u001b[0m\n",
      "\u001b[2K   \u001b[90m━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\u001b[0m \u001b[32m113.3/113.3 kB\u001b[0m \u001b[31m12.3 MB/s\u001b[0m eta \u001b[36m0:00:00\u001b[0m\n",
      "\u001b[2K   \u001b[90m━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\u001b[0m \u001b[32m2.4/2.4 MB\u001b[0m \u001b[31m111.2 MB/s\u001b[0m eta \u001b[36m0:00:00\u001b[0m\n",
      "\u001b[2K   \u001b[90m━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\u001b[0m \u001b[32m221.7/221.7 kB\u001b[0m \u001b[31m22.7 MB/s\u001b[0m eta \u001b[36m0:00:00\u001b[0m\n",
      "\u001b[2K   \u001b[90m━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\u001b[0m \u001b[32m234.2/234.2 kB\u001b[0m \u001b[31m16.3 MB/s\u001b[0m eta \u001b[36m0:00:00\u001b[0m\n",
      "\u001b[2K   \u001b[90m━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\u001b[0m \u001b[32m54.9/54.9 kB\u001b[0m \u001b[31m5.1 MB/s\u001b[0m eta \u001b[36m0:00:00\u001b[0m\n",
      "\u001b[2K   \u001b[90m━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\u001b[0m \u001b[32m322.4/322.4 kB\u001b[0m \u001b[31m31.0 MB/s\u001b[0m eta \u001b[36m0:00:00\u001b[0m\n",
      "\u001b[2K   \u001b[90m━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\u001b[0m \u001b[32m167.2/167.2 kB\u001b[0m \u001b[31m16.9 MB/s\u001b[0m eta \u001b[36m0:00:00\u001b[0m\n",
      "\u001b[2K   \u001b[90m━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\u001b[0m \u001b[32m102.6/102.6 kB\u001b[0m \u001b[31m11.0 MB/s\u001b[0m eta \u001b[36m0:00:00\u001b[0m\n",
      "\u001b[2K   \u001b[90m━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\u001b[0m \u001b[32m76.8/76.8 kB\u001b[0m \u001b[31m8.0 MB/s\u001b[0m eta \u001b[36m0:00:00\u001b[0m\n",
      "\u001b[2K   \u001b[90m━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\u001b[0m \u001b[32m131.0/131.0 kB\u001b[0m \u001b[31m13.2 MB/s\u001b[0m eta \u001b[36m0:00:00\u001b[0m\n",
      "\u001b[2K   \u001b[90m━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\u001b[0m \u001b[32m7.8/7.8 MB\u001b[0m \u001b[31m150.5 MB/s\u001b[0m eta \u001b[36m0:00:00\u001b[0m\n",
      "\u001b[2K   \u001b[90m━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\u001b[0m \u001b[32m16.0/16.0 MB\u001b[0m \u001b[31m121.1 MB/s\u001b[0m eta \u001b[36m0:00:00\u001b[0m\n",
      "\u001b[2K   \u001b[90m━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\u001b[0m \u001b[32m541.5/541.5 kB\u001b[0m \u001b[31m40.2 MB/s\u001b[0m eta \u001b[36m0:00:00\u001b[0m\n",
      "\u001b[?25h\u001b[31mERROR: pip's dependency resolver does not currently take into account all the packages that are installed. This behaviour is the source of the following dependency conflicts.\n",
      "gcsfs 2025.12.0 requires fsspec==2025.12.0, but you have fsspec 2026.9.0 which is incompatible.\n",
      "datasets 4.8.5 requires fsspec[http]<=2026.2.0,>=2023.1.0, but you have fsspec 2026.9.0 which is incompatible.\u001b[0m\u001b[31m\n",
      "\u001b[0m"
     ]
    }
   ],
   "source": "!pip -q install python-docx rasterio geopandas shapely pyproj lightgbm scikit-image networkx pennylane qiskit qiskit-aer \\\n    qiskit-ibm-runtime dimod dwave-samplers asf_search earthaccess hyp3_sdk h5py\n# Opsiyonel donanım SDK'ları (yalnız kullanacağınız cihaz için):\n# !pip -q install pyqpanda3            # Origin Wukong\n# !pip -q install dwave-system         # D-Wave Leap (hibrit / QPU)\n# !pip -q install amazon-braket-sdk    # IonQ / Rigetti / IQM\n# !pip -q install azure-quantum[qiskit]  # Quantinuum / IonQ / Pasqal"
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "id": "e4b94784",
   "metadata": {
    "colab": {
     "base_uri": "https://localhost:8080/"
    },
    "id": "e4b94784",
    "executionInfo": {
     "status": "ok",
     "timestamp": 1791962704224,
     "user_tz": -180,
     "elapsed": 3017,
     "user": {
      "displayName": "Joseph Volkan ÖZCAN",
      "userId": "11389530967736397480"
     }
    },
    "outputId": "1976cade-9659-4396-bb4e-7b02bc25bcbc"
   },
   "outputs": [
    {
     "output_type": "stream",
     "name": "stdout",
     "text": [
      "{'QISKIT_IBM_TOKEN': '—', 'ORIGIN_QC_API_KEY': '—', 'DWAVE_API_TOKEN': '—', 'EARTHDATA_USERNAME': '—'}\n"
     ]
    }
   ],
   "source": "import os\n# Colab > 🔑 Secrets bölümüne ekleyin; yoksa ilgili adaptör atlanır.\ntry:\n    from google.colab import userdata\n    for k in [\"QISKIT_IBM_TOKEN\", \"QISKIT_IBM_INSTANCE\", \"ORIGIN_QC_API_KEY\", \"DWAVE_API_TOKEN\",\n              \"EARTHDATA_USERNAME\", \"EARTHDATA_PASSWORD\"]:\n        try:\n            v = userdata.get(k)\n            if v: os.environ[k] = v\n        except Exception:\n            pass\nexcept ImportError:\n    pass\n# Önbelleği Drive'da tutmak için (önerilir):\n# from google.colab import drive; drive.mount('/content/drive'); os.environ['KOBRA_ROOT'] = '/content/drive/MyDrive/kobra_data'\nprint({k: ('✓' if os.environ.get(k) else '—') for k in [\"QISKIT_IBM_TOKEN\",\"ORIGIN_QC_API_KEY\",\"DWAVE_API_TOKEN\",\"EARTHDATA_USERNAME\"]})"
  },
  {
   "cell_type": "markdown",
   "id": "baf3516c",
   "metadata": {
    "id": "baf3516c"
   },
   "source": "## Motor kodu\nAşağıdaki hücreler `obruk_engine` paketini Colab diskine yazar (tek dosyalık, bağımsız notebook)."
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "id": "6ce6be30",
   "metadata": {
    "id": "6ce6be30"
   },
   "outputs": [],
   "source": "!mkdir -p obruk_engine/assets"
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "id": "c9af5a64",
   "metadata": {
    "colab": {
     "base_uri": "https://localhost:8080/"
    },
    "id": "c9af5a64",
    "executionInfo": {
     "status": "ok",
     "timestamp": 1791962704341,
     "user_tz": -180,
     "elapsed": 3,
     "user": {
      "displayName": "Joseph Volkan ÖZCAN",
      "userId": "11389530967736397480"
     }
    },
    "outputId": "d9b64ddf-5eeb-44c6-d733-62b954320b88"
   },
   "outputs": [
    {
     "output_type": "stream",
     "name": "stdout",
     "text": [
      "Writing obruk_engine/__init__.py\n"
     ]
    }
   ],
   "source": "%%writefile obruk_engine/__init__.py\n\"\"\"KOBRA — Karapınar Obruk Risk Analiz motoru (BVK Technology).\n\nKuantum destekli obruk tahmin simülatörü. Katmanlar:\n    config       : AOI, yollar, sabitler\n    integration  : Faz 4 — veri entegrasyon katmanı (konnektörler, önbellek, izlenebilirlik)\n    imaging      : Faz 5 — DEM/LiDAR/drone, InSAR (LiCSAR/HyP3/NISAR), optik (Sentinel-2) işleme\n    features     : özellik ızgarası (koşullandırıcı faktörler)\n    physics      : örtü-çökme (kemerlenme) fizik modeli + Monte Carlo\n    models       : klasik modeller + zaman/mekân bloklu doğrulama + Hawkes yoğunluğu\n    quantum      : Faz 6 — cihaz-agnostik hibrit kuantum motoru\n    report       : Faz 7 — sonuçlar, haritalar, yorumlama\n\"\"\"\n__version__ = \"0.1.0\"\n"
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "id": "37d4341c",
   "metadata": {
    "colab": {
     "base_uri": "https://localhost:8080/"
    },
    "id": "37d4341c",
    "executionInfo": {
     "status": "ok",
     "timestamp": 1791962704356,
     "user_tz": -180,
     "elapsed": 10,
     "user": {
      "displayName": "Joseph Volkan ÖZCAN",
      "userId": "11389530967736397480"
     }
    },
    "outputId": "7874da72-053b-4668-96a2-67fc891d0cd6"
   },
   "outputs": [
    {
     "output_type": "stream",
     "name": "stdout",
     "text": [
      "Writing obruk_engine/config.py\n"
     ]
    }
   ],
   "source": "%%writefile obruk_engine/config.py\n\"\"\"Proje yapılandırması: çalışma alanı (AOI), dizinler, sabitler.\"\"\"\nfrom __future__ import annotations\n\nimport os\nfrom dataclasses import dataclass, field\nfrom pathlib import Path\n\n\n@dataclass\nclass AOI:\n    \"\"\"Coğrafi çalışma alanı (WGS84).\"\"\"\n    name: str = \"Karapınar\"\n    west: float = 33.30\n    south: float = 37.50\n    east: float = 34.00\n    north: float = 37.95\n\n    @property\n    def bbox(self):\n        return (self.west, self.south, self.east, self.north)\n\n    @property\n    def center(self):\n        return ((self.west + self.east) / 2, (self.south + self.north) / 2)\n\n    def overpass_bbox(self):\n        return f\"{self.south},{self.west},{self.north},{self.east}\"\n\n\n# Karapınar merkezli UTM 36N (EPSG:32636) metre bazlı ızgara için\nUTM_EPSG = 32636\n\n\n@dataclass\nclass Config:\n    aoi: AOI = field(default_factory=AOI)\n    root: Path = Path(os.environ.get(\"KOBRA_ROOT\", \"./kobra_data\"))\n    grid_res_m: float = 100.0           # özellik ızgarası çözünürlüğü\n    random_seed: int = 42\n    # Obruk tanımı (hedef değişken): literatürdeki \"kuyu tipi / derin\" obruk tanımı\n    min_sinkhole_diameter_m: float = 5.0\n    min_sinkhole_depth_m: float = 1.0\n    # Maarlar volkanik kraterdir; envanterden ayıklanır. Konumlar OSM'de sinkhole=no\n    # etiketli iki krater kenarından alınmıştır (Meke/Acıgöl maar sahası); yarıçap m.\n    exclude_maars: tuple = ((\"maar-1 (Meke sahası)\", 37.6748, 33.6332, 1200.0),\n                            (\"maar-2 (Acıgöl sahası)\", 37.6648, 33.6276, 1200.0))\n\n    def __post_init__(self):\n        self.root = Path(self.root)\n        for sub in (\"cache\", \"raw\", \"derived\", \"outputs\", \"uploads\"):\n            (self.root / sub).mkdir(parents=True, exist_ok=True)\n\n    @property\n    def cache(self):\n        return self.root / \"cache\"\n\n    @property\n    def raw(self):\n        return self.root / \"raw\"\n\n    @property\n    def derived(self):\n        return self.root / \"derived\"\n\n    @property\n    def outputs(self):\n        return self.root / \"outputs\"\n\n    @property\n    def uploads(self):\n        return self.root / \"uploads\"\n"
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "id": "305e3d06",
   "metadata": {
    "colab": {
     "base_uri": "https://localhost:8080/"
    },
    "id": "305e3d06",
    "executionInfo": {
     "status": "ok",
     "timestamp": 1791962704466,
     "user_tz": -180,
     "elapsed": 103,
     "user": {
      "displayName": "Joseph Volkan ÖZCAN",
      "userId": "11389530967736397480"
     }
    },
    "outputId": "8ecba811-d361-403e-c037-5e77f599a32d"
   },
   "outputs": [
    {
     "output_type": "stream",
     "name": "stdout",
     "text": [
      "Writing obruk_engine/integration.py\n"
     ]
    }
   ],
   "source": "%%writefile obruk_engine/integration.py\n\"\"\"Faz 4 — Veri entegrasyon katmanı.\n\nHer konnektör:\n  * tek bir kaynaktan veri çeker (anahtarsız kaynaklar varsayılan, anahtarlı olanlar opsiyonel),\n  * sonucu diske önbellekler (aynı istek ikinci kez ağdan çekilmez),\n  * izlenebilirlik kaydına (provenance) kaynak, URL, lisans, zaman, boyut, durum yazar,\n  * hata olursa motoru durdurmaz: None döner ve hatayı kayda geçirir.\n\nKaynak sınıfları (Faz 3 raporu): A = anahtarsız/doğrudan, B = ücretsiz kayıt (Earthdata, GEE,\nCopernicus), C = resmî talep (DSİ, AFAD, MTA, MGM, TUSAGA) → `load_upload_*` ile yüklenir,\nD = ücretli ticari (ICEYE, Capella, Pléiades, LiDAR uçuşu) → aynı yükleme arayüzü.\n\"\"\"\nfrom __future__ import annotations\n\nimport gzip\nimport hashlib\nimport io\nimport json\nimport time\nfrom dataclasses import dataclass, asdict\nfrom datetime import datetime, timezone\nfrom pathlib import Path\nfrom typing import Any, Optional\n\nimport numpy as np\nimport pandas as pd\nimport requests\n\nfrom .config import Config\n\nUA = {\"User-Agent\": \"KOBRA-obruk-engine/0.1 (BVK Technology research; contact via repo)\"}\n\n# ----------------------------------------------------------------------------------------------\n# Kaynak kataloğu (Faz 3'te canlı doğrulanan uç noktalar)\n# ----------------------------------------------------------------------------------------------\nSOURCES = {\n    \"osm\": dict(name=\"OpenStreetMap (Overpass)\", license=\"ODbL\", cls=\"A\",\n                urls=[\"https://overpass-api.de/api/interpreter\",\n                      \"https://maps.mail.ru/osm/tools/overpass/api/interpreter\",\n                      \"https://overpass.kumi.systems/api/interpreter\",\n                      \"https://overpass.private.coffee/api/interpreter\"]),\n    \"copdem\": dict(name=\"Copernicus DEM GLO-30 (AWS COG)\", license=\"Copernicus DEM lisansı\", cls=\"A\",\n                   url=\"https://copernicus-dem-30m.s3.amazonaws.com/Copernicus_DSM_COG_10_{lat}_00_{lon}_00_DEM/\"\n                       \"Copernicus_DSM_COG_10_{lat}_00_{lon}_00_DEM.tif\"),\n    \"worldcover\": dict(name=\"ESA WorldCover 10 m v200 (2021)\", license=\"CC BY 4.0\", cls=\"A\",\n                       url=\"https://esa-worldcover.s3.eu-central-1.amazonaws.com/v200/2021/map/\"\n                           \"ESA_WorldCover_10m_2021_v200_{tile}_Map.tif\"),\n    \"gem_faults\": dict(name=\"GEM Global Active Faults\", license=\"CC BY-SA 4.0\", cls=\"A\",\n                       url=\"https://raw.githubusercontent.com/GEMScienceTools/gem-global-active-faults/\"\n                           \"master/geojson/gem_active_faults_harmonized.geojson\"),\n    \"ngl\": dict(name=\"Nevada Geodetic Lab GNSS (IGS20 tenv3)\", license=\"Atıf gerekli\", cls=\"A\",\n                url=\"https://geodesy.unr.edu/gps_timeseries/IGS20/tenv3/IGS20/{sta}.tenv3\"),\n    \"power\": dict(name=\"NASA POWER\", license=\"Açık (NASA)\", cls=\"A\",\n                  url=\"https://power.larc.nasa.gov/api/temporal/{res}/point\"),\n    \"openmeteo\": dict(name=\"Open-Meteo ERA5 arşivi\", license=\"CC BY 4.0\", cls=\"A\",\n                      url=\"https://archive-api.open-meteo.com/v1/archive\"),\n    \"afad\": dict(name=\"AFAD deprem kataloğu\", license=\"AFAD kaynak gösterilmeli\", cls=\"A\",\n                 url=\"https://servisnet.afad.gov.tr/apigateway/deprem/apiv2/event/filter\"),\n    \"emsc\": dict(name=\"EMSC SeismicPortal FDSN\", license=\"CC BY\", cls=\"A\",\n                 url=\"https://www.seismicportal.eu/fdsnws/event/1/query\"),\n    \"licsar\": dict(name=\"COMET-LiCSAR\", license=\"CC BY 4.0\", cls=\"A\",\n                   url=\"https://gws-access.jasmin.ac.uk/public/nceo_geohazards/LiCSAR_products.public/{track}/{frame}/\"),\n    \"soilgrids\": dict(name=\"ISRIC SoilGrids 2.0 (WCS)\", license=\"CC BY 4.0\", cls=\"A\",\n                      url=\"https://maps.isric.org/mapserv?map=/map/{prop}.map\"),\n    \"wokam\": dict(name=\"BGR WOKAM karst akifer haritası\", license=\"© BGR\", cls=\"A\",\n                  url=\"https://services.bgr.de/arcgis/rest/services/grundwasser/whymap_wokam/MapServer\"),\n    \"s2_stac\": dict(name=\"Sentinel-2 L2A (Element84 Earth Search STAC, COG)\", license=\"Copernicus açık\", cls=\"A\",\n                    url=\"https://earth-search.aws.element84.com/v1/search\"),\n    \"asf\": dict(name=\"ASF (Sentinel-1 SLC, HyP3, NISAR)\", license=\"Copernicus/NASA açık\", cls=\"B\"),\n    \"grace\": dict(name=\"GRACE/GRACE-FO JPL Mascon (PO.DAAC)\", license=\"NASA açık\", cls=\"B\",\n                  short_name=\"TELLUS_GRAC-GRFO_MASCON_CRI_GRID_RL06.3_V4\"),\n}\n\n# LiCSAR çerçeveleri (AOI'yi kapsayan; Faz 3'te canlı doğrulandı)\nLICSAR_FRAMES = {\n    \"087A_05304_121415\": dict(track=87, direction=\"A\"),\n    \"167D_05276_131313\": dict(track=167, direction=\"D\"),\n    \"167D_05293_151515\": dict(track=167, direction=\"D\"),\n}\n\n# NGL GNSS istasyonları (AOI içi ve Konya referansları)\nNGL_STATIONS = {\"KAPN\": (37.7147, 33.5269), \"KAP1\": (37.7144, 33.5283),\n                \"KNY1\": (37.86, 32.48), \"KONY\": (38.02, 32.51)}\n\n\n@dataclass\nclass ProvRecord:\n    source: str\n    request: str\n    status: str\n    when: str\n    bytes: int = 0\n    license: str = \"\"\n    note: str = \"\"\n    cache: str = \"\"\n\n\nclass DataHub:\n    \"\"\"Tüm konnektörlerin tek giriş noktası (önbellek + izlenebilirlik).\"\"\"\n\n    def __init__(self, cfg: Optional[Config] = None, offline: bool = False, verbose: bool = True):\n        self.cfg = cfg or Config()\n        self.offline = offline\n        self.verbose = verbose\n        self.log: list[ProvRecord] = []\n        self.session = requests.Session()\n        self.session.headers.update(UA)\n\n    # ------------------------------------------------------------------ yardımcılar\n    def _say(self, *a):\n        if self.verbose:\n            print(\"[KOBRA]\", *a)\n\n    def _record(self, source, request, status, nbytes=0, note=\"\", cache=\"\"):\n        rec = ProvRecord(source, request[:300], status,\n                         datetime.now(timezone.utc).isoformat(timespec=\"seconds\"),\n                         nbytes, SOURCES.get(source, {}).get(\"license\", \"\"), note, str(cache))\n        self.log.append(rec)\n        return rec\n\n    def _key(self, *parts) -> str:\n        return hashlib.sha1(\"|\".join(map(str, parts)).encode()).hexdigest()[:16]\n\n    def _get(self, source: str, url: str, params=None, method=\"GET\", data=None, timeout=90,\n             retries=3, binary=False, cache_ext=\"bin\") -> Optional[bytes]:\n        \"\"\"Önbellekli HTTP isteği. Sonucu bytes olarak döner.\"\"\"\n        key = self._key(method, url, json.dumps(params, sort_keys=True, default=str), data)\n        cpath = self.cfg.cache / f\"{source}_{key}.{cache_ext}\"\n        if cpath.exists():\n            self._record(source, url, \"cache\", cpath.stat().st_size, cache=cpath)\n            return cpath.read_bytes()\n        if self.offline:\n            self._record(source, url, \"offline-miss\")\n            return None\n        last = None\n        for i in range(retries):\n            try:\n                r = self.session.request(method, url, params=params, data=data, timeout=timeout,\n                                         allow_redirects=True)\n                if r.status_code == 200 and r.content:\n                    cpath.write_bytes(r.content)\n                    self._record(source, r.url, \"ok\", len(r.content), cache=cpath)\n                    return r.content\n                last = f\"HTTP {r.status_code}\"\n            except Exception as e:  # ağ hataları\n                last = repr(e)[:200]\n            time.sleep(2 * (i + 1))\n        self._record(source, url, \"error\", note=last or \"\")\n        self._say(f\"{source}: hata ({last})\")\n        return None\n\n    def provenance(self) -> pd.DataFrame:\n        return pd.DataFrame([asdict(r) for r in self.log])\n\n    def save_provenance(self, path=None):\n        path = Path(path or self.cfg.outputs / \"provenance.csv\")\n        self.provenance().to_csv(path, index=False)\n        return path\n\n    # ------------------------------------------------------------------ 1. obruk envanteri\n    def osm_sinkholes(self) -> pd.DataFrame:\n        \"\"\"OSM obruk öğeleri. Not: Karapınar'da obruklar `natural=cliff + sinkhole=yes` olarak\n        etiketli; `natural=sinkhole` nadir. Her ikisi de sorgulanır. `sinkhole=no` (maar\n        kenarları) ayrı işaretlenir.\"\"\"\n        bb = self.cfg.aoi.overpass_bbox()\n        q = (f'[out:json][timeout:90];(nwr[\"sinkhole\"]({bb});nwr[\"natural\"=\"sinkhole\"]({bb}););'\n             f'out tags geom;')\n        raw = None\n        for url in SOURCES[\"osm\"][\"urls\"]:\n            raw = self._get(\"osm\", url, params={\"data\": q}, cache_ext=\"json\", retries=1, timeout=150)\n            if raw and raw.lstrip().startswith(b\"{\"):\n                break\n            raw = None\n        if raw is None:\n            return pd.DataFrame(columns=[\"osm_id\", \"lat\", \"lon\", \"name\", \"sinkhole\", \"diameter_m\", \"source\"])\n        els = json.loads(raw)[\"elements\"]\n        rows = []\n        for e in els:\n            t = e.get(\"tags\", {})\n            g = e.get(\"geometry\")\n            if e.get(\"center\"):\n                c = e[\"center\"]\n            elif g:\n                c = {\"lat\": float(np.mean([p[\"lat\"] for p in g])), \"lon\": float(np.mean([p[\"lon\"] for p in g]))}\n            else:\n                c = {\"lat\": e.get(\"lat\"), \"lon\": e.get(\"lon\")}\n            diam = np.nan\n            if g:  # kenar çizgisinden yaklaşık çap\n                la = np.array([p[\"lat\"] for p in g]); lo = np.array([p[\"lon\"] for p in g])\n                dy = (la.max() - la.min()) * 111_320\n                dx = (lo.max() - lo.min()) * 111_320 * np.cos(np.radians(la.mean()))\n                diam = float(np.hypot(dx, dy) / np.sqrt(2))\n            rows.append(dict(osm_id=f'{e[\"type\"]}/{e[\"id\"]}', lat=c[\"lat\"], lon=c[\"lon\"],\n                             name=t.get(\"name\", \"\"), sinkhole=t.get(\"sinkhole\", t.get(\"natural\", \"\")),\n                             diameter_m=diam, source=\"OSM\"))\n        df = pd.DataFrame(rows)\n        self._say(f\"OSM: {len(df)} öğe ({(df.sinkhole != 'no').sum()} obruk, \"\n                  f\"{(df.sinkhole == 'no').sum()} 'sinkhole=no')\")\n        return df\n\n    def osm_places(self) -> pd.DataFrame:\n        \"\"\"Yerleşim noktaları (il/ilçe merkezi, kasaba, köy, mezra, mahalle) — yerleşim kartları için.\"\"\"\n        bb = self.cfg.aoi.overpass_bbox()\n        q = f'[out:json][timeout:90];node[\"place\"~\"^(town|village|hamlet|suburb|neighbourhood)$\"]({bb});out body;'\n        raw = None\n        for url in SOURCES[\"osm\"][\"urls\"]:\n            raw = self._get(\"osm\", url, params={\"data\": q}, cache_ext=\"json\", retries=1, timeout=150)\n            if raw and raw.lstrip().startswith(b\"{\"):\n                break\n            raw = None\n        if raw is None:\n            return pd.DataFrame(columns=[\"name\", \"place\", \"lat\", \"lon\"])\n        rows = [dict(name=e.get(\"tags\", {}).get(\"name\", \"\"), place=e.get(\"tags\", {}).get(\"place\", \"\"),\n                     lat=e[\"lat\"], lon=e[\"lon\"]) for e in json.loads(raw)[\"elements\"]]\n        df = pd.DataFrame(rows)\n        self._say(f\"OSM yerleşim: {len(df)} nokta\")\n        return df\n\n    def load_upload_inventory(self, path) -> pd.DataFrame:\n        \"\"\"AFAD / KTÜN / makale yazarlarından gelen envanter (CSV/XLSX/GeoJSON).\n        Beklenen sütunlar (esnek eşleme): lat, lon, [date|year], [diameter_m], [depth_m], [type].\"\"\"\n        path = Path(path)\n        if path.suffix.lower() in (\".geojson\", \".json\", \".shp\", \".gpkg\"):\n            import geopandas as gpd\n            g = gpd.read_file(path).to_crs(4326)\n            df = pd.DataFrame(g.drop(columns=\"geometry\"))\n            df[\"lon\"] = g.geometry.centroid.x; df[\"lat\"] = g.geometry.centroid.y\n        elif path.suffix.lower() in (\".xlsx\", \".xls\"):\n            df = pd.read_excel(path)\n        else:\n            df = pd.read_csv(path)\n        cols = {c.lower().strip(): c for c in df.columns}\n        ren = {}\n        for std, al in dict(lat=[\"lat\", \"enlem\", \"latitude\", \"y\"], lon=[\"lon\", \"boylam\", \"longitude\", \"lng\", \"x\"],\n                            date=[\"date\", \"tarih\", \"olusum_tarihi\"], year=[\"year\", \"yil\", \"yıl\"],\n                            diameter_m=[\"diameter_m\", \"cap\", \"çap\", \"diameter\"], depth_m=[\"depth_m\", \"derinlik\", \"depth\"],\n                            type=[\"type\", \"tip\"]).items():\n            for a in al:\n                if a in cols:\n                    ren[cols[a]] = std; break\n        df = df.rename(columns=ren)\n        if \"date\" in df and \"year\" not in df:\n            df[\"year\"] = pd.to_datetime(df[\"date\"], errors=\"coerce\").dt.year\n        df[\"source\"] = f\"upload:{path.name}\"\n        self._record(\"upload\", str(path), \"ok\", path.stat().st_size, note=f\"{len(df)} kayıt\")\n        return df\n\n    # ------------------------------------------------------------------ 2. topoğrafya\n    def copdem(self):\n        \"\"\"Copernicus GLO-30 DSM, AOI penceresi. (array, transform, crs) döner.\"\"\"\n        import rasterio\n        from rasterio.merge import merge\n        w, s, e, n = self.cfg.aoi.bbox\n        srcs, paths = [], []\n        for la in range(int(np.floor(s)), int(np.floor(n)) + 1):\n            for lo in range(int(np.floor(w)), int(np.floor(e)) + 1):\n                url = SOURCES[\"copdem\"][\"url\"].format(lat=f\"N{la:02d}\", lon=f\"E{lo:03d}\")\n                b = self._get(\"copdem\", url, cache_ext=\"tif\", timeout=300)\n                if b:\n                    p = self.cfg.cache / f\"copdem_N{la}_E{lo}.tif\"; p.write_bytes(b); paths.append(p)\n        if not paths:\n            return None\n        srcs = [rasterio.open(p) for p in paths]\n        arr, tr = merge(srcs, bounds=(w, s, e, n))\n        crs = srcs[0].crs\n        for r in srcs:\n            r.close()\n        dem = arr[0].astype(\"float32\")\n        dem[dem < -1000] = np.nan\n        self._say(f\"Copernicus DEM: {dem.shape}, {np.nanmin(dem):.0f}–{np.nanmax(dem):.0f} m\")\n        return dem, tr, crs\n\n    def load_upload_raster(self, path, kind=\"lidar_dem\"):\n        \"\"\"LiDAR DEM, drone DSM/ortofoto, ticari SAR/optik GeoTIFF yükleme (sınıf C/D).\"\"\"\n        import rasterio\n        path = Path(path)\n        with rasterio.open(path) as r:\n            arr = r.read()\n            meta = dict(transform=r.transform, crs=r.crs, res=r.res, nodata=r.nodata, bounds=r.bounds)\n        self._record(\"upload\", str(path), \"ok\", path.stat().st_size, note=f\"{kind} {arr.shape} res={meta['res']}\")\n        return arr, meta\n\n    # ------------------------------------------------------------------ 3. arazi örtüsü\n    def worldcover(self):\n        import rasterio\n        from rasterio.windows import from_bounds\n        tile = \"N36E033\"  # 3°×3° karo: 36–39 N, 33–36 E (AOI'yi tamamen kapsar)\n        url = SOURCES[\"worldcover\"][\"url\"].format(tile=tile)\n        try:\n            with rasterio.Env(GDAL_DISABLE_READDIR_ON_OPEN=\"EMPTY_DIR\", CPL_VSIL_CURL_ALLOWED_EXTENSIONS=\".tif\"):\n                with rasterio.open(\"/vsicurl/\" + url) as r:\n                    win = from_bounds(*self.cfg.aoi.bbox, transform=r.transform)\n                    arr = r.read(1, window=win, out_shape=None)\n                    tr = r.window_transform(win)\n                    crs = r.crs\n            self._record(\"worldcover\", url, \"ok\", arr.nbytes)\n            self._say(f\"WorldCover: {arr.shape}\")\n            return arr, tr, crs\n        except Exception as e:\n            self._record(\"worldcover\", url, \"error\", note=repr(e)[:200]); return None\n\n    # ------------------------------------------------------------------ 4. jeoloji / fay\n    def gem_faults(self):\n        import geopandas as gpd\n        from shapely.geometry import box\n        b = self._get(\"gem_faults\", SOURCES[\"gem_faults\"][\"url\"], cache_ext=\"geojson\", timeout=180)\n        if not b:\n            return None\n        g = gpd.read_file(io.BytesIO(b))\n        w, s, e, n = self.cfg.aoi.bbox\n        sel = g[g.intersects(box(w - 0.5, s - 0.5, e + 0.5, n + 0.5))].copy()\n        self._say(f\"GEM aktif fay: AOI ±0.5° içinde {len(sel)} segment\")\n        return sel\n\n    def wokam_karst(self, lon=None, lat=None):\n        \"\"\"WOKAM 'karstlaşabilir kayaç' katmanında nokta sorgusu (identify).\"\"\"\n        lon, lat = lon or self.cfg.aoi.center[0], lat or self.cfg.aoi.center[1]\n        url = SOURCES[\"wokam\"][\"url\"] + \"/identify\"\n        p = dict(geometry=f\"{lon},{lat}\", geometryType=\"esriGeometryPoint\", sr=4326, layers=\"all\",\n                 tolerance=1, mapExtent=\",\".join(map(str, self.cfg.aoi.bbox)), imageDisplay=\"400,400,96\", f=\"json\")\n        b = self._get(\"wokam\", url, params=p, cache_ext=\"json\")\n        return json.loads(b) if b else None\n\n    def soilgrids(self, prop=\"clay\", depth=\"0-5cm\", stat=\"mean\"):\n        \"\"\"SoilGrids 250 m WCS 2.0 (Homolosine yerine EPSG:4326 alt-örnekleme).\"\"\"\n        import rasterio\n        w, s, e, n = self.cfg.aoi.bbox\n        url = SOURCES[\"soilgrids\"][\"url\"].format(prop=prop)\n        params = dict(SERVICE=\"WCS\", VERSION=\"2.0.1\", REQUEST=\"GetCoverage\",\n                      COVERAGEID=f\"{prop}_{depth}_{stat}\", FORMAT=\"GEOTIFF_INT16\",\n                      SUBSETTINGCRS=\"http://www.opengis.net/def/crs/EPSG/0/4326\",\n                      OUTPUTCRS=\"http://www.opengis.net/def/crs/EPSG/0/4326\",\n                      SUBSET=[f\"Lat({s},{n})\", f\"Lon({w},{e})\"], RESOLUTION=[\"Lat(0.0025)\", \"Lon(0.0025)\"])\n        # requests çoklu SUBSET parametresini liste olarak gönderir\n        b = self._get(\"soilgrids\", url, params=params, cache_ext=\"tif\", timeout=180)\n        if not b or not b[:4] in (b\"II*\\x00\", b\"MM\\x00*\"):\n            self._record(\"soilgrids\", url, \"error\", note=\"GeoTIFF dönmedi\")\n            return None\n        with rasterio.MemoryFile(b) as m, m.open() as r:\n            arr = r.read(1).astype(\"float32\"); tr = r.transform; crs = r.crs\n            if r.nodata is not None:\n                arr[arr == r.nodata] = np.nan\n        return arr, tr, crs\n\n    # ------------------------------------------------------------------ 5. hidrometeoroloji\n    def nasa_power_monthly(self, lat=None, lon=None, start=1981, end=None,\n                           params=\"PRECTOTCORR,T2M,EVPTRNS,GWETROOT\"):\n        lon = lon or self.cfg.aoi.center[0]; lat = lat or self.cfg.aoi.center[1]\n        end = end or datetime.now().year - 1\n        b = self._get(\"power\", SOURCES[\"power\"][\"url\"].format(res=\"monthly\"),\n                      params=dict(parameters=params, community=\"AG\", longitude=lon, latitude=lat,\n                                  start=start, end=end, format=\"JSON\"), cache_ext=\"json\", timeout=180)\n        if not b:\n            return None\n        P = json.loads(b)[\"properties\"][\"parameter\"]\n        df = pd.DataFrame(P)\n        df = df[~df.index.str.endswith(\"13\")]  # yıllık toplam satırları at\n        df.index = pd.to_datetime(df.index, format=\"%Y%m\")\n        df = df.replace(-999.0, np.nan)\n        # PRECTOTCORR mm/gün → aylık mm\n        if \"PRECTOTCORR\" in df:\n            df[\"precip_mm\"] = df[\"PRECTOTCORR\"] * df.index.days_in_month\n        self._say(f\"NASA POWER: {df.index.min():%Y-%m} → {df.index.max():%Y-%m}\")\n        return df\n\n    def openmeteo_daily(self, lat=None, lon=None, start=\"1990-01-01\", end=None,\n                        daily=\"precipitation_sum,et0_fao_evapotranspiration,temperature_2m_mean\"):\n        lon = lon or self.cfg.aoi.center[0]; lat = lat or self.cfg.aoi.center[1]\n        end = end or (datetime.now().date().replace(day=1)).isoformat()\n        b = self._get(\"openmeteo\", SOURCES[\"openmeteo\"][\"url\"],\n                      params=dict(latitude=lat, longitude=lon, start_date=start, end_date=end, daily=daily,\n                                  timezone=\"Europe/Istanbul\"), cache_ext=\"json\", timeout=180)\n        if not b:\n            return None\n        d = json.loads(b)[\"daily\"]\n        df = pd.DataFrame(d); df[\"time\"] = pd.to_datetime(df[\"time\"]); return df.set_index(\"time\")\n\n    def load_upload_wells(self, path) -> pd.DataFrame:\n        \"\"\"DSİ gözlem kuyusu seviyeleri (e-Devlet Hidrometrik Veri Talebi çıktısı).\n        Beklenen: well_id, lat, lon, date, depth_to_water_m (statik seviye, yüzeyden derinlik).\"\"\"\n        df = pd.read_csv(path) if str(path).endswith(\".csv\") else pd.read_excel(path)\n        cols = {c.lower(): c for c in df.columns}\n        ren = {}\n        for std, al in dict(well_id=[\"well_id\", \"kuyu_no\", \"kuyu\"], lat=[\"lat\", \"enlem\"], lon=[\"lon\", \"boylam\"],\n                            date=[\"date\", \"tarih\"], depth_to_water_m=[\"depth_to_water_m\", \"statik_seviye\", \"seviye_m\"]).items():\n            for a in al:\n                if a in cols:\n                    ren[cols[a]] = std; break\n        df = df.rename(columns=ren); df[\"date\"] = pd.to_datetime(df[\"date\"], errors=\"coerce\")\n        self._record(\"upload\", str(path), \"ok\", Path(path).stat().st_size, note=f\"{df.well_id.nunique()} kuyu\")\n        return df\n\n    def grace_tws(self, earthdata_login: bool = True):\n        \"\"\"GRACE/GRACE-FO JPL mascon (TWS, cm EWH) — Earthdata girişi gerekir (sınıf B).\n        Colab'da: from google.colab import userdata; os.environ['EARTHDATA_USERNAME']=...\"\"\"\n        try:\n            import earthaccess, xarray as xr\n            earthaccess.login(strategy=\"environment\" if earthdata_login else \"interactive\")\n            res = earthaccess.search_data(short_name=SOURCES[\"grace\"][\"short_name\"])\n            files = earthaccess.download(res[:1], str(self.cfg.raw))\n            ds = xr.open_dataset(files[0])\n            lon0, lat0 = self.cfg.aoi.center\n            ts = ds[\"lwe_thickness\"].sel(lat=lat0, lon=lon0 % 360, method=\"nearest\").to_series()\n            self._record(\"grace\", \"earthaccess\", \"ok\", note=f\"{len(ts)} ay\")\n            return ts\n        except Exception as e:\n            self._record(\"grace\", \"earthaccess\", \"skipped\", note=repr(e)[:200]); return None\n\n    # ------------------------------------------------------------------ 6. jeodezi\n    def ngl_gnss(self, sta=\"KAPN\") -> Optional[pd.DataFrame]:\n        b = self._get(\"ngl\", SOURCES[\"ngl\"][\"url\"].format(sta=sta), cache_ext=\"tenv3\")\n        if not b:\n            return None\n        lines = b.decode().splitlines()\n        hdr = lines[0].split()\n        df = pd.read_csv(io.StringIO(\"\\n\".join(lines[1:])), sep=r\"\\s+\", header=None)\n        df.columns = hdr[:df.shape[1]]\n        df[\"date\"] = pd.to_datetime(df[\"YYMMMDD\"], format=\"%y%b%d\")\n        # NGL: konum = tam sayı kısım (_e0, ____n0, u0) + kesir (__east, _north, ____up)\n        col = lambda key: [c for c in df.columns if c.strip(\"_\").startswith(key)][0]\n        out = pd.DataFrame({\"date\": df[\"date\"], \"decyear\": df[col(\"yyyy\")]})\n        for k, (i0, fr) in dict(e=(\"e0\", \"east\"), n=(\"n0\", \"north\"), u=(\"u0\", \"up\")).items():\n            v = df[col(i0)].astype(float) + df[col(fr)].astype(float)\n            out[k] = (v - v.iloc[0]) * 1000.0  # mm, ilk epoka göre\n        out[\"station\"] = sta\n        self._say(f\"NGL {sta}: {len(out)} gün, {out.date.min():%Y-%m} → {out.date.max():%Y-%m}\")\n        return out\n\n    # ------------------------------------------------------------------ 7. sismisite\n    def afad_quakes(self, start=\"2000-01-01 00:00:00\", end=None, min_mag=0.0, pad=0.5):\n        w, s, e, n = self.cfg.aoi.bbox\n        end = end or datetime.now().strftime(\"%Y-%m-%d %H:%M:%S\")\n        b = self._get(\"afad\", SOURCES[\"afad\"][\"url\"],\n                      params=dict(start=start, end=end, minlat=s - pad, maxlat=n + pad, minlon=w - pad,\n                                  maxlon=e + pad, minmag=min_mag, orderby=\"timedesc\", format=\"json\"),\n                      cache_ext=\"json\", timeout=120)\n        if not b:\n            return None\n        try:\n            df = pd.DataFrame(json.loads(b))\n        except Exception:\n            return None\n        if df.empty:\n            return df\n        df = df.rename(columns={\"latitude\": \"lat\", \"longitude\": \"lon\", \"magnitude\": \"mag\"})\n        for c in (\"lat\", \"lon\", \"mag\", \"depth\"):\n            if c in df:\n                df[c] = pd.to_numeric(df[c], errors=\"coerce\")\n        df[\"date\"] = pd.to_datetime(df[\"date\"], errors=\"coerce\")\n        return df\n\n    def emsc_quakes(self, start=\"2000-01-01\", end=None, pad=0.5):\n        w, s, e, n = self.cfg.aoi.bbox\n        end = end or datetime.now().strftime(\"%Y-%m-%d\")\n        b = self._get(\"emsc\", SOURCES[\"emsc\"][\"url\"],\n                      params=dict(minlat=s - pad, maxlat=n + pad, minlon=w - pad, maxlon=e + pad,\n                                  starttime=start, endtime=end, format=\"text\", limit=20000),\n                      cache_ext=\"txt\", timeout=120)\n        if not b:\n            return None\n        df = pd.read_csv(io.StringIO(b.decode()), sep=\"|\")\n        df.columns = [c.strip(\"# \").strip() for c in df.columns]\n        return df.rename(columns={\"Latitude\": \"lat\", \"Longitude\": \"lon\", \"Magnitude\": \"mag\", \"Time\": \"date\"})\n\n    # ------------------------------------------------------------------ 8. InSAR — LiCSAR\n    def licsar_list(self, frame=\"087A_05304_121415\", kind=\"interferograms\") -> list[str]:\n        tr = LICSAR_FRAMES[frame][\"track\"]\n        url = SOURCES[\"licsar\"][\"url\"].format(track=tr, frame=frame).replace(\".public\", \"\") + f\"{kind}/\"\n        b = self._get(\"licsar\", url, cache_ext=\"html\")\n        if not b:\n            return []\n        import re\n        return sorted(set(re.findall(r'href=\"(\\d{8}(?:_\\d{8})?)\"', b.decode())))\n\n    def licsar_file(self, frame, rel, cache=True):\n        \"\"\"LiCSAR dosyasını indirir ve yerel yolu döndürür. rel ör: 'metadata/{frame}.geo.U.tif'.\"\"\"\n        tr = LICSAR_FRAMES[frame][\"track\"]\n        url = SOURCES[\"licsar\"][\"url\"].format(track=tr, frame=frame) + rel\n        b = self._get(\"licsar\", url, cache_ext=Path(rel).suffix.lstrip(\".\") or \"bin\", timeout=300)\n        if not b:\n            return None\n        p = self.cfg.raw / \"licsar\" / frame / rel\n        p.parent.mkdir(parents=True, exist_ok=True)\n        if not p.exists():\n            p.write_bytes(b)\n        return p\n\n    # ------------------------------------------------------------------ 9. InSAR — ASF / NISAR (sınıf B)\n    def asf_search_s1(self, start=\"2023-01-01\", end=None, max_results=200):\n        \"\"\"Sentinel-1 SLC sahne listesi (arama anahtarsız; indirme/HyP3 Earthdata gerektirir).\"\"\"\n        try:\n            import asf_search as asf\n            from shapely.geometry import box\n            res = asf.geo_search(platform=asf.PLATFORM.SENTINEL1, processingLevel=\"SLC\",\n                                 intersectsWith=box(*self.cfg.aoi.bbox).wkt, start=start, end=end,\n                                 maxResults=max_results)\n            df = pd.DataFrame([r.properties for r in res])\n            self._record(\"asf\", \"geo_search S1 SLC\", \"ok\", note=f\"{len(df)} sahne\")\n            return df\n        except Exception as e:\n            self._record(\"asf\", \"geo_search\", \"skipped\", note=repr(e)[:200]); return None\n\n    def nisar_gunw(self):\n        \"\"\"NISAR L-bant GUNW (PROVISIONAL, 2026-06-17→) granül listesi — earthaccess.\"\"\"\n        try:\n            import earthaccess\n            res = earthaccess.search_data(short_name=\"NISAR_L2_GUNW_PROVISIONAL_V1\",\n                                          bounding_box=self.cfg.aoi.bbox)\n            self._record(\"asf\", \"NISAR GUNW search\", \"ok\", note=f\"{len(res)} granül\")\n            return res\n        except Exception as e:\n            self._record(\"asf\", \"NISAR GUNW search\", \"skipped\", note=repr(e)[:200]); return None\n\n    def hyp3_submit_insar(self, pairs: list[tuple[str, str]], name=\"kobra\"):\n        \"\"\"ASF HyP3 on-demand InSAR (8.000 kredi/ay ücretsiz). Earthdata kimliği gerekir.\"\"\"\n        import hyp3_sdk\n        hyp3 = hyp3_sdk.HyP3()\n        jobs = hyp3_sdk.Batch()\n        for ref, sec in pairs:\n            jobs += hyp3.submit_insar_job(ref, sec, name=name, include_look_vectors=True,\n                                          include_displacement_maps=True, looks=\"10x2\")\n        self._record(\"asf\", \"HyP3 submit\", \"ok\", note=f\"{len(pairs)} çift\")\n        return jobs\n\n    # ------------------------------------------------------------------ 10. optik — Sentinel-2 STAC\n    def s2_search(self, start, end, max_cloud=10, limit=200, bbox=None):\n        body = dict(collections=[\"sentinel-2-l2a\"], bbox=list(bbox or self.cfg.aoi.bbox),\n                    datetime=f\"{start}T00:00:00Z/{end}T23:59:59Z\", limit=limit,\n                    query={\"eo:cloud_cover\": {\"lt\": max_cloud}})\n        key = self._key(\"s2\", json.dumps(body, sort_keys=True))\n        cpath = self.cfg.cache / f\"s2stac_{key}.json\"\n        if cpath.exists():\n            feats = json.loads(cpath.read_text())\n        else:\n            if self.offline:\n                return []\n            try:\n                r = self.session.post(SOURCES[\"s2_stac\"][\"url\"], json=body, timeout=120)\n                feats = r.json().get(\"features\", [])\n                cpath.write_text(json.dumps(feats))\n                self._record(\"s2_stac\", \"search \" + body[\"datetime\"], \"ok\", len(r.content))\n            except Exception as e:\n                self._record(\"s2_stac\", \"search\", \"error\", note=repr(e)[:200]); return []\n        return feats\n\n    # ------------------------------------------------------------------ özet\n    def catalogue(self) -> pd.DataFrame:\n        return pd.DataFrame([dict(key=k, name=v[\"name\"], cls=v[\"cls\"], license=v[\"license\"])\n                             for k, v in SOURCES.items()])\n"
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "id": "2cd61580",
   "metadata": {
    "colab": {
     "base_uri": "https://localhost:8080/"
    },
    "id": "2cd61580",
    "executionInfo": {
     "status": "ok",
     "timestamp": 1791962704506,
     "user_tz": -180,
     "elapsed": 40,
     "user": {
      "displayName": "Joseph Volkan ÖZCAN",
      "userId": "11389530967736397480"
     }
    },
    "outputId": "2082cf7d-9b3e-4cf0-ee17-5f91c0f9ae10"
   },
   "outputs": [
    {
     "output_type": "stream",
     "name": "stdout",
     "text": [
      "Writing obruk_engine/imaging.py\n"
     ]
    }
   ],
   "source": "%%writefile obruk_engine/imaging.py\n\"\"\"Faz 5 — Uydu, LiDAR, SAR ve drone görüntü işleme katmanı.\n\nAlt modüller\n  A. DEM / LiDAR / drone DSM  : kapalı çukur (depresyon) çıkarımı, şekil öznitelikleri, obruk\n                                benzerlik skoru, hillshade, yerel rölyef, iki dönem DEM farkı (DoD)\n  B. InSAR (COMET-LiCSAR)     : AOI penceresinde küçük-baz SBAS ters çözümü → LOS hız + zaman serisi,\n                                yükselen/alçalan birleşimiyle düşey + doğu ayrıştırması, GNSS kalibrasyonu\n  C. NISAR L-bant GUNW        : HDF5 okuyucu (deneysel; PROVISIONAL ürün yapısı)\n  D. Sentinel-2 optik         : yaz NDVI kompoziti (sulama = yeraltı suyu çekimi vekili),\n                                obruk başına \"koyuluk kontrastı\" zaman serisi → oluşum yılı tarihlemesi\n  E. SAR genlik / ticari SAR  : log-oran değişim tespiti (ICEYE/Capella/Umbra/S1 RTC yığınları)\n  F. Drone ortofoto           : karanlık-dairesel boşluk adayları (klasik); opsiyonel SAM (segment-geospatial)\n\"\"\"\nfrom __future__ import annotations\n\nimport warnings\nfrom dataclasses import dataclass\nfrom typing import Optional\n\nimport numpy as np\nimport pandas as pd\n\nwarnings.filterwarnings(\"ignore\", category=RuntimeWarning)\n\nS1_WAVELENGTH_MM = 55.465763      # Sentinel-1 C-bant\nNISAR_L_WAVELENGTH_MM = 237.9     # NISAR L-bant (~1257.5 MHz)\n\n\n# ==============================================================================================\n# Ortak: yeniden projeksiyon\n# ==============================================================================================\ndef reproject_to(arr, src_tr, src_crs, dst_crs, res, bounds=None, resampling=\"bilinear\", nodata=np.nan):\n    import rasterio\n    from rasterio.warp import calculate_default_transform, reproject, Resampling\n    h, w = arr.shape\n    if bounds is None:\n        from rasterio.transform import array_bounds\n        bounds = array_bounds(h, w, src_tr)  # (s?, ...) rasterio: (west, south, east, north)\n        b = bounds\n        bounds = (b[0], b[1], b[2], b[3])\n    tr, W, H = calculate_default_transform(src_crs, dst_crs, w, h, *bounds, resolution=res)\n    out = np.full((H, W), nodata, dtype=\"float32\")\n    reproject(arr.astype(\"float32\"), out, src_transform=src_tr, src_crs=src_crs, dst_transform=tr,\n              dst_crs=dst_crs, resampling=getattr(Resampling, resampling), src_nodata=np.nan, dst_nodata=nodata)\n    return out, tr\n\n\n# ==============================================================================================\n# A. DEM / LiDAR / drone\n# ==============================================================================================\ndef fill_depressions(dem: np.ndarray) -> np.ndarray:\n    \"\"\"Morfolojik yeniden yapılandırma ile çukur doldurma (Priority-Flood'a eşdeğer sonuç).\"\"\"\n    from skimage.morphology import reconstruction\n    z = dem.copy()\n    nan = ~np.isfinite(z)\n    if nan.any():\n        z[nan] = np.nanmin(z) - 1  # veri boşlukları çıkış (outlet) gibi davranır\n    seed = z.copy()\n    seed[1:-1, 1:-1] = z.max()\n    filled = reconstruction(seed, z, method=\"erosion\")\n    filled[nan] = np.nan\n    return filled\n\n\ndef hillshade(dem, res, az=315, alt=45):\n    dy, dx = np.gradient(dem, res)\n    slope = np.arctan(np.hypot(dx, dy)); aspect = np.arctan2(-dx, dy)\n    a, z = np.radians(az), np.radians(90 - alt)\n    hs = np.cos(z) * np.cos(slope) + np.sin(z) * np.sin(slope) * np.cos(a - aspect)\n    return np.clip(hs, 0, 1)\n\n\ndef slope_deg(dem, res):\n    dy, dx = np.gradient(dem, res)\n    return np.degrees(np.arctan(np.hypot(dx, dy)))\n\n\ndef local_relief(dem, res, radius_m=300):\n    from scipy.ndimage import uniform_filter\n    k = max(3, int(round(2 * radius_m / res)) | 1)\n    m = np.where(np.isfinite(dem), dem, np.nanmean(dem))\n    return dem - uniform_filter(m, k)\n\n\n@dataclass\nclass Depression:\n    label: int\n    row: float\n    col: float\n    x: float\n    y: float\n    area_m2: float\n    eq_diam_m: float\n    max_depth_m: float\n    mean_depth_m: float\n    circularity: float\n    depth_diam: float\n    score: float\n\n\ndef extract_depressions(dem, transform, res, min_depth=1.0, min_area_m2=None, max_area_m2=2.0e6):\n    \"\"\"Kapalı çukurları çıkarır ve obruk benzerlik skoru (0–1) atar.\n\n    Skor bileşenleri (literatür: Wood vd. 2023; Coşkuner vd. 2025; Al-Halbouni vd. 2018):\n      * dairesellik (4πA/P²) yüksek,\n      * derinlik/çap oranı obruk aralığında (~0.15–1.0; Karapınar kuyu tipi obruklar yüksek),\n      * alan küçük-orta (çok büyük kapalı havzalar = tektonik/göl tabanı, düşük skor).\n    \"\"\"\n    from skimage.measure import label, regionprops\n    filled = fill_depressions(dem)\n    depth = filled - dem\n    min_area_m2 = min_area_m2 or 2 * res * res\n    mask = depth >= min_depth\n    lab = label(mask, connectivity=2)\n    out = []\n    for rp in regionprops(lab, intensity_image=depth):\n        area = rp.area * res * res\n        if area < min_area_m2 or area > max_area_m2:\n            continue\n        per = max(rp.perimeter * res, 1e-6)\n        circ = float(np.clip(4 * np.pi * area / per ** 2, 0, 1.2))\n        diam = float(np.sqrt(4 * area / np.pi))\n        dmax = float(rp.intensity_max); dmean = float(rp.intensity_mean)\n        dd = dmax / diam\n        s_circ = np.clip((circ - 0.3) / 0.5, 0, 1)\n        s_dd = np.exp(-((np.log(max(dd, 1e-3)) - np.log(0.4)) ** 2) / (2 * 0.9 ** 2))\n        s_area = 1.0 / (1 + (area / 1.5e5) ** 1.5)\n        score = float((s_circ ** 0.5) * s_dd * s_area)\n        r, c = rp.centroid\n        x, y = transform * (c + 0.5, r + 0.5)\n        out.append(Depression(rp.label, r, c, x, y, area, diam, dmax, dmean, circ, dd, score))\n    df = pd.DataFrame([d.__dict__ for d in out])\n    return df, depth\n\n\ndef dem_of_difference(dem_new, dem_old, lod_m=0.15):\n    \"\"\"İki dönem drone/LiDAR DEM farkı. LoD (algılama sınırı) altındaki farklar sıfırlanır.\n    Negatif farklar → çökme/oturma (öncül sarkma veya yeni obruk).\"\"\"\n    d = dem_new - dem_old\n    d[np.abs(d) < lod_m] = 0\n    return d\n\n\n# ==============================================================================================\n# B. InSAR — COMET-LiCSAR küçük-baz SBAS\n# ==============================================================================================\ndef _read_window(path_or_url, bbox):\n    import rasterio\n    from rasterio.windows import from_bounds\n    src = path_or_url if str(path_or_url).startswith(\"/vsicurl/\") or not str(path_or_url).startswith(\"http\") \\\n        else \"/vsicurl/\" + str(path_or_url)\n    with rasterio.Env(GDAL_DISABLE_READDIR_ON_OPEN=\"EMPTY_DIR\", GDAL_HTTP_MAX_RETRY=\"3\", GDAL_HTTP_RETRY_DELAY=\"2\"):\n        with rasterio.open(src) as r:\n            win = from_bounds(*bbox, transform=r.transform).round_offsets().round_lengths()\n            a = r.read(1, window=win).astype(\"float32\")\n            tr = r.window_transform(win)\n            if r.nodata is not None:\n                a[a == r.nodata] = np.nan\n            crs = r.crs\n    a[a == 0] = np.nan\n    return a, tr, crs\n\n\ndef select_sbas_network(ifg_names, start, end, max_btemp_days=24, min_btemp_days=6):\n    \"\"\"Tarih aralığındaki kısa-baz interferogramları seç (6–24 gün; LiCSAR standart ağı).\"\"\"\n    rows = []\n    for n in ifg_names:\n        if \"_\" not in n:\n            continue\n        a, b = n.split(\"_\")\n        da, db = pd.Timestamp(a), pd.Timestamp(b)\n        bt = (db - da).days\n        if da >= pd.Timestamp(start) and db <= pd.Timestamp(end) and min_btemp_days <= bt <= max_btemp_days:\n            rows.append((n, da, db, bt))\n    return pd.DataFrame(rows, columns=[\"name\", \"d1\", \"d2\", \"btemp\"])\n\n\ndef sbas_invert(stack_rad, net: pd.DataFrame, coh=None, coh_min=0.25, wavelength_mm=S1_WAVELENGTH_MM,\n                ref_mask=None, smooth_lambda=0.05, min_frac=0.6, chunk=8000):\n    \"\"\"Piksel bazında SBAS ters çözümü (en küçük kareler, epok artımları üzerinden).\n\n    stack_rad : (N_ifg, H, W) açılmış faz (rad)\n    Dönüş     : epok listesi, kümülatif LOS yer değiştirme (mm, N_ep×H×W), LOS hız (mm/yıl), RMS kapanma\n    İşaret    : LiCSAR'da pozitif faz → uydudan uzaklaşma; burada d = -φ·λ/(4π) ile\n                pozitif = uyduya yaklaşma (yükselme) olacak şekilde dönüştürülür.\n    \"\"\"\n    epochs = sorted(set(net.d1) | set(net.d2))\n    idx = {d: i for i, d in enumerate(epochs)}\n    N, H, W = stack_rad.shape\n    M = len(epochs) - 1\n    # Artım parametrizasyonu: ifg(i,j) = Σ_{k=i}^{j-1} v_k\n    A = np.zeros((N, M))\n    for r, (d1, d2) in enumerate(zip(net.d1, net.d2)):\n        A[r, idx[d1]:idx[d2]] = 1.0\n    disp = -stack_rad * wavelength_mm / (4 * np.pi)\n    if ref_mask is not None:  # referans alanı (ör. kararlı kaya) medyanını çıkar\n        ref = np.nanmedian(disp[:, ref_mask], axis=1)\n        disp = disp - ref[:, None, None]\n    Y = disp.reshape(N, -1)\n    valid = np.isfinite(Y)\n    if coh is not None:\n        valid &= (coh.reshape(N, -1) >= coh_min)\n    out = np.full((M, H * W), np.nan, dtype=\"float32\")\n    # Hız artımlarına zayıf zamansal düzgünleştirme (Tikhonov) → ağdaki boşluklarda da tam rank\n    # (LiCSBAS'taki boşluk köprüleme yaklaşımına benzer). λ küçük: veri varken çözümü etkilemez.\n    dt = np.array([(epochs[k + 1] - epochs[k]).days for k in range(M)], float)\n    Dm = np.zeros((M - 1, M))\n    for k in range(M - 1):\n        Dm[k, k], Dm[k, k + 1] = 1 / dt[k], -1 / dt[k + 1]\n    Dm *= smooth_lambda * np.median(dt)\n    enough = np.where(valid.sum(axis=0) >= max(5, int(min_frac * N)))[0]\n    # Ağırlıklı normal denklemler, piksel bloklarında vektörize: (AᵀWA + DᵀD) v = AᵀW y\n    DtD = Dm.T @ Dm\n    Yz = np.where(valid, Y, 0.0)\n    for s0 in range(0, len(enough), chunk):\n        pix = enough[s0:s0 + chunk]\n        Wt = valid[:, pix].astype(float)                       # (N, P)\n        G = np.einsum(\"np,nm,nk->pmk\", Wt, A, A) + DtD[None]   # (P, M, M)\n        rhs = np.einsum(\"np,nm->pm\", Wt * Yz[:, pix], A)       # (P, M)\n        out[:, pix] = np.linalg.solve(G, rhs[..., None])[..., 0].T\n    cum = np.vstack([np.zeros((1, H * W), \"float32\"), np.cumsum(out, axis=0)]).reshape(M + 1, H, W)\n    t = np.array([(e - epochs[0]).days / 365.25 for e in epochs])\n    # doğrusal hız\n    tt = t - t.mean()\n    vel = np.nansum(tt[:, None, None] * (cum - np.nanmean(cum, axis=0)), axis=0) / np.sum(tt ** 2)\n    vel[~np.isfinite(cum).all(axis=0)] = np.nan\n    resid = Y - A @ np.nan_to_num(out)\n    rms = np.sqrt(np.nanmean(np.where(valid, resid, np.nan) ** 2, axis=0)).reshape(H, W)\n    return epochs, cum, vel.astype(\"float32\"), rms\n\n\ndef licsar_velocity(hub, frame, start, end, bbox=None, max_ifg=80, coh_min=0.25, verbose=True):\n    \"\"\"LiCSAR çerçevesi için AOI penceresinde SBAS LOS hız haritası.\"\"\"\n    from .integration import LICSAR_FRAMES, SOURCES\n    bbox = bbox or hub.cfg.aoi.bbox\n    names = hub.licsar_list(frame)\n    net = select_sbas_network(names, start, end)\n    if net.empty:\n        return None\n    # ağ çok büyükse epok sürekliliğini koruyarak en kısa bazları tut\n    net = net.sort_values([\"d1\", \"btemp\"]).groupby(\"d1\").head(2).reset_index(drop=True)\n    if len(net) > max_ifg:\n        net = net.iloc[np.linspace(0, len(net) - 1, max_ifg).astype(int)].reset_index(drop=True)\n    tr_no = LICSAR_FRAMES[frame][\"track\"]\n    base = SOURCES[\"licsar\"][\"url\"].format(track=tr_no, frame=frame) + \"interferograms/\"\n    unw, coh, keep = [], [], []\n    tr = crs = None\n    cache = hub.cfg.derived / f\"licsar_stack_{frame}_{start}_{end}_{len(net)}.pkl\"\n    if cache.exists():\n        import pickle\n        net, unw, coh, tr, crs = pickle.load(open(cache, \"rb\"))\n        keep = list(range(len(net)))\n        names_iter = []\n    else:\n        names_iter = list(net.name)\n    for i, n in enumerate(names_iter):\n        try:\n            urls = licsar_ifg_urls(hub, base, n)\n            a, tr, crs = _read_window(urls[\"unw\"], bbox)\n            c, _, _ = _read_window(urls[\"cc\"], bbox)\n            c = c / 255.0 if np.nanmax(c) > 1.5 else c\n            if unw and a.shape != unw[0].shape:\n                continue\n            unw.append(a); coh.append(c); keep.append(i)\n            hub._record(\"licsar\", f\"{frame}/{n} unw+cc (pencere)\", \"ok\", a.nbytes * 2)\n        except Exception as e:\n            hub._record(\"licsar\", f\"{frame}/{n}\", \"error\", note=repr(e)[:150])\n        if verbose and i % 10 == 0:\n            print(f\"[KOBRA] LiCSAR {frame}: {i + 1}/{len(net)}\")\n    net = net.iloc[keep].reset_index(drop=True)\n    if not cache.exists():\n        import pickle\n        pickle.dump((net, unw, coh, tr, crs), open(cache, \"wb\"))\n    U_, C_ = np.array(unw), np.array(coh)\n    good = [i for i in range(len(net)) if np.mean(np.isfinite(U_[i]) & (C_[i] >= coh_min)) >= 0.05]\n    net, unw, coh = net.iloc[good].reset_index(drop=True), U_[good], C_[good]\n    # bağlı ağ kontrolü: en uzun bağlı epok zincirini kullan\n    net, unw, coh = _largest_connected(net, np.array(unw), np.array(coh))\n    stack, cohs = unw, coh\n    epochs, cum, vel, rms = sbas_invert(stack, net, cohs, coh_min=coh_min)\n    meancoh = np.nanmean(cohs, axis=0)\n    # LOS birim vektörleri\n    lv = {}\n    for comp in \"ENU\":\n        p = hub.licsar_file(frame, f\"metadata/{frame}.geo.{comp}.tif\")\n        if p:\n            lv[comp] = _read_window(str(p), bbox)[0]\n    return dict(frame=frame, epochs=epochs, cum=cum, vel=vel, rms=rms, meancoh=meancoh,\n                transform=tr, crs=crs, los=lv, n_ifg=len(net), network=net)\n\n\ndef licsar_ifg_urls(hub, base, name):\n    \"\"\"Interferogram dosyalarının gerçek URL'leri. Güncel ürünler JASMIN'de, eski ürünler CEDA\n    arşivine (data.ceda.ac.uk/neodc/comet/...) yönlendirilir; klasör listesi çözülür.\"\"\"\n    import re\n    b = hub._get(\"licsar\", base.replace(\"LiCSAR_products.public\", \"LiCSAR_products\") + name, cache_ext=\"html\")\n    hrefs = re.findall(r\"href='([^']+)'\", b.decode()) if b else []\n    pick = lambda suf: next((h for h in hrefs if h.endswith(suf)), f\"{base}{name}/{name}{suf}\")\n    return {\"unw\": pick(\".geo.unw.tif\"), \"cc\": pick(\".geo.cc.tif\")}\n\n\ndef _largest_connected(net, unw, coh):\n    import networkx as nx\n    if len(net) == 0:\n        raise RuntimeError(\"LiCSAR: okunabilen interferogram yok (erişim/kapsama)\")\n    G = nx.Graph()\n    for i, (a, b) in enumerate(zip(net.d1, net.d2)):\n        G.add_edge(a, b, i=i)\n    comp = max(nx.connected_components(G), key=len)\n    keep = [i for i, (a, b) in enumerate(zip(net.d1, net.d2)) if a in comp and b in comp]\n    return net.iloc[keep].reset_index(drop=True), unw[keep], coh[keep]\n\n\ndef clean_velocity(hub, frame, r, bbox=None, coh_min=0.5, ref_hgt_pct=85, ref_coh=0.55):\n    \"\"\"Düşük koherensli pikselleri maskele (tarımsal dekorelasyon/faz açma hatası) ve hızı,\n    havza çevresindeki yüksek (kararlı kabul edilen) kayalık alanların medyanına göre referansla.\n    Dönüş: temiz hız, referans ofseti (mm/yıl), referans piksel sayısı.\"\"\"\n    bbox = bbox or hub.cfg.aoi.bbox\n    vel = r[\"vel\"].copy()\n    vel[~(r[\"meancoh\"] >= coh_min)] = np.nan\n    p = hub.licsar_file(frame, f\"metadata/{frame}.geo.hgt.tif\")\n    off, n = 0.0, 0\n    if p:\n        hgt = _read_window(str(p), bbox)[0]\n        if hgt.shape == vel.shape:\n            m = (hgt >= np.nanpercentile(hgt, ref_hgt_pct)) & (r[\"meancoh\"] >= ref_coh) & np.isfinite(vel)\n            n = int(m.sum())\n            if n > 50:\n                off = float(np.nanmedian(vel[m]))\n    return vel - off, off, n\n\n\ndef decompose_asc_desc(v_asc, los_asc, v_desc, los_desc):\n    \"\"\"Yükselen + alçalan LOS hızlarından düşey (U) ve doğu (E) bileşenleri (kuzey ihmal).\n    los_* : {'E','N','U'} birim vektör dizileri (aynı ızgarada).\"\"\"\n    H, W = v_asc.shape\n    U = np.full((H, W), np.nan, \"float32\"); E = np.full((H, W), np.nan, \"float32\")\n    ok = np.isfinite(v_asc) & np.isfinite(v_desc)\n    a = np.stack([np.stack([los_asc[\"E\"][ok], los_asc[\"U\"][ok]], -1),\n                  np.stack([los_desc[\"E\"][ok], los_desc[\"U\"][ok]], -1)], 1)  # (n,2,2)\n    b = np.stack([v_asc[ok], v_desc[ok]], -1)[..., None]\n    sol = np.linalg.solve(a, b)[..., 0]\n    E[ok], U[ok] = sol[:, 0], sol[:, 1]\n    return U, E\n\n\ndef calibrate_to_gnss(vel_map, transform, gnss_rate_mm, lonlat, los_up=None, win=2):\n    \"\"\"LOS hız haritasını GNSS istasyonunun hızına bağla (referans ofseti).\"\"\"\n    inv = ~transform\n    c, r = inv * lonlat\n    r, c = int(r), int(c)\n    patch = vel_map[max(r - win, 0):r + win + 1, max(c - win, 0):c + win + 1]\n    obs = np.nanmedian(patch)\n    target = gnss_rate_mm * (np.nanmedian(los_up[max(r - win, 0):r + win + 1, max(c - win, 0):c + win + 1])\n                             if los_up is not None else 1.0)\n    off = target - obs\n    return vel_map + off, float(off)\n\n\n# ==============================================================================================\n# C. NISAR L-bant GUNW (deneysel)\n# ==============================================================================================\ndef read_nisar_gunw(path, freq=\"A\", pol=\"HH\"):\n    \"\"\"NISAR L2 GUNW HDF5 açılmış faz + koherens. PROVISIONAL ürün yolu sürümle değişebilir;\n    yol bulunamazsa mevcut veri setleri listelenir.\"\"\"\n    import h5py\n    with h5py.File(path, \"r\") as f:\n        cands = []\n        f.visititems(lambda n, o: cands.append(n) if isinstance(o, h5py.Dataset) else None)\n        unw = [c for c in cands if c.endswith(\"unwrappedPhase\") and f\"frequency{freq}\" in c and pol in c]\n        coh = [c for c in cands if c.endswith(\"coherenceMagnitude\") and f\"frequency{freq}\" in c and pol in c]\n        if not unw:\n            return dict(datasets=cands)\n        return dict(unw=f[unw[0]][()], coh=f[coh[0]][()] if coh else None, path_unw=unw[0],\n                    wavelength_mm=NISAR_L_WAVELENGTH_MM)\n\n\n# ==============================================================================================\n# D. Sentinel-2 — sulama vekili ve obruk tarihleme\n# ==============================================================================================\ndef _s2_read(href, bounds_utm, out_res=None, overview_level=None):\n    import rasterio\n    from rasterio.windows import from_bounds\n    with rasterio.Env(GDAL_DISABLE_READDIR_ON_OPEN=\"EMPTY_DIR\", AWS_NO_SIGN_REQUEST=\"YES\"):\n        kw = {}\n        if overview_level is not None:\n            kw[\"overview_level\"] = overview_level\n        with rasterio.open(href, **kw) as r:\n            win = from_bounds(*bounds_utm, transform=r.transform).round_offsets().round_lengths()\n            a = r.read(1, window=win, boundless=True, fill_value=0).astype(\"float32\")\n            tr = r.window_transform(win)\n    return a, tr\n\n\ndef s2_summer_ndvi(hub, years, grid_bounds_utm, res=80, months=(\"07-01\", \"08-31\"), max_cloud=10,\n                   per_year=4, verbose=True):\n    \"\"\"Yıllık yaz (Tem–Ağu) maksimum NDVI kompoziti. Kurak Konya yazında yüksek NDVI = sulanan\n    tarla = yeraltı suyu çekimi vekili. Dönüş: {yıl: (NDVI dizisi, transform)} UTM 36N, ~res m.\"\"\"\n    from pyproj import Transformer\n    import rasterio\n    from rasterio.warp import reproject, Resampling\n    from rasterio.transform import from_origin\n    xmin, ymin, xmax, ymax = grid_bounds_utm\n    W = int(np.ceil((xmax - xmin) / res)); H = int(np.ceil((ymax - ymin) / res))\n    dst_tr = from_origin(xmin, ymax, res, res)\n    ov = {80: 2, 160: 3}.get(res, None)  # 10 m → overview 3 = 80 m (2,4,8,16 kat)\n    out = {}\n    for yr in years:\n        feats = hub.s2_search(f\"{yr}-{months[0]}\", f\"{yr}-{months[1]}\", max_cloud=max_cloud)\n        if not feats:\n            continue\n        # karo başına en az bulutlu `per_year` sahne\n        # Önce veri kapsamı tam (yörünge kenarı olmayan) sahneler, sonra en az bulutlu\n        df = pd.DataFrame([dict(tile=f[\"properties\"].get(\"grid:code\"), cc=f[\"properties\"][\"eo:cloud_cover\"],\n                                nod=f[\"properties\"].get(\"s2:nodata_pixel_percentage\", 0.0), f=f) for f in feats])\n        df[\"nod_bin\"] = (df.nod > 5).astype(int)\n        df = df.sort_values([\"nod_bin\", \"cc\"])\n        sel = df.groupby(\"tile\").head(per_year)\n        comp = np.full((H, W), np.nan, \"float32\")\n        for _, row in sel.iterrows():\n            a = row.f[\"assets\"]\n            try:\n                red, tr = _s2_read(a[\"red\"][\"href\"], grid_bounds_utm, overview_level=ov)\n                nir, _ = _s2_read(a[\"nir\"][\"href\"], grid_bounds_utm, overview_level=ov)\n                scl, trs = _s2_read(a[\"scl\"][\"href\"], grid_bounds_utm, overview_level=None if ov is None else max(ov - 1, 0))\n            except Exception as e:\n                hub._record(\"s2_stac\", a[\"red\"][\"href\"], \"error\", note=repr(e)[:150]); continue\n            with np.errstate(all=\"ignore\"):\n                ndvi = (nir - red) / (nir + red)\n            ndvi[(red <= 0) | (nir <= 0)] = np.nan\n            nd = np.full((H, W), np.nan, \"float32\")\n            reproject(ndvi, nd, src_transform=tr, src_crs=\"EPSG:32636\", dst_transform=dst_tr,\n                      dst_crs=\"EPSG:32636\", resampling=Resampling.average, src_nodata=np.nan, dst_nodata=np.nan)\n            sc = np.zeros((H, W), \"float32\")\n            reproject(scl, sc, src_transform=trs, src_crs=\"EPSG:32636\", dst_transform=dst_tr,\n                      dst_crs=\"EPSG:32636\", resampling=Resampling.nearest)\n            nd[np.isin(sc, [3, 8, 9, 10, 11])] = np.nan  # bulut gölgesi, bulut, sirrus, kar\n            comp = np.fmax(comp, nd)\n            hub._record(\"s2_stac\", f\"{row.tile} {row.f['properties']['datetime'][:10]} NDVI\", \"ok\", nd.nbytes)\n        out[yr] = comp\n        if verbose:\n            print(f\"[KOBRA] S2 yaz NDVI {yr}: {len(sel)} sahne, sulanan (NDVI>0.5) oranı \"\n                  f\"{np.nanmean(comp > 0.5):.1%}\")\n    return out, dst_tr\n\n\ndef s2_date_sinkholes(hub, pts_utm: pd.DataFrame, years, months=(\"06-01\", \"09-30\"), max_cloud=5,\n                      per_year=3, half=40, verbose=True):\n    \"\"\"Obruk başına oluşum yılı tarihlemesi (Sentinel-2, 10 m).\n\n    Fikir: derin bir obruk yaz güneşinde gölge + boşluk nedeniyle çevresine göre belirgin koyu\n    bir leke oluşturur. Merkez (r≤15 m) ile halka (40–80 m) arasındaki görünür-NIR yansıma\n    kontrastı (C = 1 − merkez/halka) yıl bazında hesaplanır. Kontrastın kalıcı olarak eşiği\n    aştığı ilk yıl = oluşum yılı (≤ ilk gözlem yılı ise \"öncesi\").\n    pts_utm: id, x, y sütunları (EPSG:32636).\n    \"\"\"\n    rows = []\n    for yr in years:\n        feats = hub.s2_search(f\"{yr}-{months[0]}\", f\"{yr}-{months[1]}\", max_cloud=max_cloud)\n        if not feats:\n            if verbose:\n                print(f\"[KOBRA] S2 tarihleme {yr}: sahne yok\")\n            continue\n        df = pd.DataFrame([dict(tile=f[\"properties\"].get(\"grid:code\"), cc=f[\"properties\"][\"eo:cloud_cover\"],\n                                sdate=f[\"properties\"][\"datetime\"][:10], f=f) for f in feats]).sort_values(\"cc\")\n        if df.empty:\n            continue\n        sel = df.groupby(\"tile\").head(per_year)\n        for _, s in sel.iterrows():\n            a = s.f[\"assets\"]\n            bbox = s.f[\"bbox\"]  # lon/lat\n            for _, p in pts_utm.iterrows():\n                if not (bbox[0] <= p.lon <= bbox[2] and bbox[1] <= p.lat <= bbox[3]):\n                    continue\n                b = (p.x - 100, p.y - 100, p.x + 100, p.y + 100)\n                try:\n                    vis = []\n                    for band in (\"red\", \"nir\", \"green\"):\n                        arr, _ = _s2_read(a[band][\"href\"], b)\n                        vis.append(arr)\n                except Exception:\n                    continue\n                v = np.mean(vis, axis=0)\n                if (v <= 0).mean() > 0.2:\n                    continue\n                n = v.shape[0]; yy, xx = np.mgrid[:n, :n]; rr = np.hypot(yy - n / 2 + 0.5, xx - n / 2 + 0.5) * 10\n                cen = np.nanmean(v[rr <= 15]); ring = np.nanmean(v[(rr >= 40) & (rr <= 80)])\n                rows.append(dict(id=p.id, year=yr, date=s.sdate, contrast=1 - cen / ring if ring > 0 else np.nan))\n        if verbose:\n            print(f\"[KOBRA] S2 tarihleme {yr}: {len(sel)} sahne\")\n    ts = pd.DataFrame(rows)\n    if ts.empty:\n        return ts, pd.DataFrame()\n    ann = ts.groupby([\"id\", \"year\"]).contrast.median().unstack()\n    res = []\n    for i, r in ann.iterrows():\n        v = r.values; yrs = ann.columns.values\n        thr = max(0.12, np.nanmedian(v[: min(2, len(v))]) + 0.08) if np.isfinite(v[:2]).any() else 0.12\n        on = v >= 0.12\n        first = None\n        for k in range(len(v)):\n            if on[k] and np.nanmean(on[k:]) >= 0.75:  # kalıcı\n                first = int(yrs[k]); break\n        status = (\"öncesi\" if first is not None and first == yrs[0] else\n                  \"yeni\" if first is not None else \"tespit_yok\")\n        res.append(dict(id=i, first_year=first, status=status, max_contrast=float(np.nanmax(v))))\n    return ts, pd.DataFrame(res)\n\n\n# ==============================================================================================\n# E. SAR genlik değişimi (ticari / S1 RTC yığınları)\n# ==============================================================================================\ndef sar_log_ratio(amp_before, amp_after, enl=4.0, pfa=1e-3):\n    \"\"\"Log-oran değişim tespiti; eşik, Gamma dağılımlı speckle için yaklaşık (Rignot & van Zyl).\"\"\"\n    from scipy.ndimage import uniform_filter\n    a = uniform_filter(np.nan_to_num(amp_before ** 2), 3); b = uniform_filter(np.nan_to_num(amp_after ** 2), 3)\n    lr = 10 * np.log10((b + 1e-6) / (a + 1e-6))\n    sigma = 10 / np.log(10) * np.sqrt(2 / (enl * 9))\n    from scipy.stats import norm\n    thr = norm.ppf(1 - pfa) * sigma\n    return lr, np.abs(lr) > thr\n\n\n# ==============================================================================================\n# F. Drone ortofoto — boşluk adayları\n# ==============================================================================================\ndef drone_hole_candidates(rgb, gsd_m, min_diam_m=1.0, max_diam_m=60.0):\n    \"\"\"Klasik yöntem: koyu + dairesel bölgeler (gölge/boşluk). SAM (segment-geospatial) kuruluysa\n    `sam_segments` ile daha iyi maskeler alınabilir; bu fonksiyon bağımlılıksız temel çizgidir.\"\"\"\n    from skimage.color import rgb2gray\n    from skimage.filters import threshold_otsu\n    from skimage.measure import label, regionprops\n    g = rgb2gray(np.moveaxis(rgb[:3], 0, -1).astype(\"float32\") / max(rgb.max(), 1))\n    t = threshold_otsu(g[np.isfinite(g)])\n    dark = g < min(t, np.nanpercentile(g, 5))\n    rows = []\n    for rp in regionprops(label(dark)):\n        d = np.sqrt(4 * rp.area / np.pi) * gsd_m\n        if min_diam_m <= d <= max_diam_m:\n            circ = 4 * np.pi * rp.area / max(rp.perimeter, 1) ** 2\n            if circ > 0.5:\n                rows.append(dict(row=rp.centroid[0], col=rp.centroid[1], diam_m=d, circularity=circ))\n    return pd.DataFrame(rows)\n\n\ndef sam_segments(image_path, out_path):\n    \"\"\"Opsiyonel: segment-geospatial (SAM) ile otomatik maske (Colab GPU önerilir).\"\"\"\n    from samgeo import SamGeo\n    sam = SamGeo(model_type=\"vit_h\", automatic=True)\n    sam.generate(image_path, out_path)\n    return out_path\n"
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "id": "7b17271a",
   "metadata": {
    "colab": {
     "base_uri": "https://localhost:8080/"
    },
    "id": "7b17271a",
    "executionInfo": {
     "status": "ok",
     "timestamp": 1791962704546,
     "user_tz": -180,
     "elapsed": 39,
     "user": {
      "displayName": "Joseph Volkan ÖZCAN",
      "userId": "11389530967736397480"
     }
    },
    "outputId": "dce6465d-c4f9-455c-c9e8-e8a0abd9c166"
   },
   "outputs": [
    {
     "output_type": "stream",
     "name": "stdout",
     "text": [
      "Writing obruk_engine/features.py\n"
     ]
    }
   ],
   "source": "%%writefile obruk_engine/features.py\n\"\"\"Özellik ızgarası: koşullandırıcı faktörlerin ortak UTM ızgarasına (varsayılan 100 m) taşınması.\n\nStatik katmanlar  : yükseklik, eğim, yerel rölyef, DEM çukur derinliği/yoğunluğu, faya uzaklık,\n                    arazi örtüsü oranları, kil oranı, InSAR LOS/düşey hız ve koherens,\n                    yaz NDVI (sulama vekili) ortalaması ve eğilimi\nDinamik katmanlar : kesme yılına (cutoff) kadar bilinen obruklara uzaklık ve çekirdek yoğunluğu\n                    (zaman sızıntısını önlemek için yalnızca geçmiş bilgisi kullanılır)\n\"\"\"\nfrom __future__ import annotations\n\nfrom dataclasses import dataclass, field\n\nimport numpy as np\nimport pandas as pd\nfrom pyproj import Transformer\nfrom rasterio.transform import from_origin, rowcol\nfrom rasterio.warp import reproject, Resampling\nfrom scipy.ndimage import distance_transform_edt, gaussian_filter\n\nfrom .config import Config, UTM_EPSG\n\n\n@dataclass\nclass Grid:\n    xmin: float\n    ymin: float\n    xmax: float\n    ymax: float\n    res: float\n    layers: dict = field(default_factory=dict)\n\n    @property\n    def shape(self):\n        return (int(np.ceil((self.ymax - self.ymin) / self.res)), int(np.ceil((self.xmax - self.xmin) / self.res)))\n\n    @property\n    def transform(self):\n        return from_origin(self.xmin, self.ymax, self.res, self.res)\n\n    @property\n    def crs(self):\n        return f\"EPSG:{UTM_EPSG}\"\n\n    def xy(self):\n        H, W = self.shape\n        cols, rows = np.meshgrid(np.arange(W), np.arange(H))\n        x = self.xmin + (cols + 0.5) * self.res\n        y = self.ymax - (rows + 0.5) * self.res\n        return x, y\n\n    def rc(self, x, y):\n        r, c = rowcol(self.transform, x, y)\n        return np.asarray(r), np.asarray(c)\n\n    def put(self, name, arr, src_tr, src_crs, resampling=\"average\"):\n        out = np.full(self.shape, np.nan, \"float32\")\n        reproject(np.asarray(arr, \"float32\"), out, src_transform=src_tr, src_crs=src_crs,\n                  dst_transform=self.transform, dst_crs=self.crs,\n                  resampling=getattr(Resampling, resampling), src_nodata=np.nan, dst_nodata=np.nan)\n        self.layers[name] = out\n        return out\n\n    def frame(self, names=None) -> pd.DataFrame:\n        names = names or list(self.layers)\n        x, y = self.xy()\n        H, W = self.shape\n        d = {\"row\": np.repeat(np.arange(H), W), \"col\": np.tile(np.arange(W), H),\n             \"x\": x.ravel(), \"y\": y.ravel()}\n        for n in names:\n            d[n] = self.layers[n].ravel()\n        return pd.DataFrame(d)\n\n\ndef make_grid(cfg: Config) -> Grid:\n    T = Transformer.from_crs(4326, UTM_EPSG, always_xy=True)\n    w, s, e, n = cfg.aoi.bbox\n    xs, ys = T.transform([w, e, w, e], [s, s, n, n])\n    r = cfg.grid_res_m\n    return Grid(np.floor(min(xs) / r) * r, np.floor(min(ys) / r) * r,\n                np.ceil(max(xs) / r) * r, np.ceil(max(ys) / r) * r, r)\n\n\ndef to_utm(df, lon=\"lon\", lat=\"lat\"):\n    T = Transformer.from_crs(4326, UTM_EPSG, always_xy=True)\n    df = df.copy()\n    df[\"x\"], df[\"y\"] = T.transform(df[lon].values, df[lat].values)\n    return df\n\n\ndef add_terrain(g: Grid, dem30, tr30, crs30, depth30=None, depressions=None):\n    from . import imaging as im\n    g.put(\"elev\", dem30, tr30, crs30)\n    g.put(\"slope\", im.slope_deg(dem30, abs(tr30.a)), tr30, crs30)\n    g.put(\"relief_300m\", im.local_relief(dem30, abs(tr30.a), 300), tr30, crs30)\n    g.put(\"relief_1km\", im.local_relief(dem30, abs(tr30.a), 1000), tr30, crs30)\n    if depth30 is not None:\n        g.put(\"dem_depression_depth\", np.where(np.isfinite(depth30), depth30, 0), tr30, crs30, \"max\")\n    if depressions is not None and len(depressions):\n        H, W = g.shape\n        cnt = np.zeros(g.shape, \"float32\")\n        r, c = g.rc(depressions.x.values, depressions.y.values)\n        ok = (r >= 0) & (r < H) & (c >= 0) & (c < W)\n        np.add.at(cnt, (r[ok], c[ok]), depressions.score.values[ok] + 0.05)\n        g.layers[\"depression_density_1km\"] = gaussian_filter(cnt, 1000 / g.res / 2) * (1e6 / g.res ** 2)\n\n\ndef add_distance_to_lines(g: Grid, gdf, name=\"dist_fault_km\"):\n    \"\"\"Hat (fay) katmanına uzaklık (km).\"\"\"\n    from rasterio.features import rasterize\n    if gdf is None or len(gdf) == 0:\n        return\n    gg = gdf.to_crs(g.crs)\n    m = rasterize([(geom, 1) for geom in gg.geometry], out_shape=g.shape, transform=g.transform,\n                  all_touched=True, fill=0).astype(bool)\n    if not m.any():  # fay ızgara dışında: ızgara kenarı yerine gerçek mesafe\n        from shapely.geometry import Point\n        x, y = g.xy()\n        from shapely import distance, points\n        u = gg.geometry.union_all()\n        d = distance(points(x.ravel(), y.ravel()), u).reshape(g.shape) / 1000\n        g.layers[name] = d.astype(\"float32\"); return\n    g.layers[name] = (distance_transform_edt(~m) * g.res / 1000).astype(\"float32\")\n\n\ndef add_landcover(g: Grid, wc, tr, crs):\n    \"\"\"WorldCover oranları: ekili alan (40), çayır/mera (30), çıplak (60), yapılaşma (50), su (80).\"\"\"\n    for cls, nm in [(40, \"lc_cropland\"), (30, \"lc_grass\"), (60, \"lc_bare\"), (50, \"lc_built\"), (80, \"lc_water\")]:\n        g.put(nm, (wc == cls).astype(\"float32\"), tr, crs, \"average\")\n\n\ndef add_insar(g: Grid, sbas: dict, prefix=\"los\"):\n    for fr, r in sbas.items():\n        tag = \"asc\" if fr[3] == \"A\" else \"desc\"\n        g.put(f\"{prefix}_vel_{tag}\", r[\"vel\"], r[\"transform\"], r[\"crs\"], \"average\")\n        g.put(f\"insar_coh_{tag}\", r[\"meancoh\"], r[\"transform\"], r[\"crs\"], \"average\")\n\n\ndef add_ndvi(g: Grid, ndvi_by_year: dict, tr):\n    yrs = sorted(ndvi_by_year)\n    stack = []\n    for y in yrs:\n        out = np.full(g.shape, np.nan, \"float32\")\n        reproject(ndvi_by_year[y], out, src_transform=tr, src_crs=g.crs, dst_transform=g.transform,\n                  dst_crs=g.crs, resampling=Resampling.average, src_nodata=np.nan, dst_nodata=np.nan)\n        stack.append(out)\n    S = np.array(stack)\n    g.layers[\"ndvi_summer_mean\"] = np.nanmean(S, 0)\n    g.layers[\"irrigated_freq\"] = np.nanmean(S > 0.5, 0).astype(\"float32\")\n    t = np.array(yrs, float) - np.mean(yrs)\n    Sm = S - np.nanmean(S, 0)\n    g.layers[\"ndvi_trend_per_yr\"] = (np.nansum(t[:, None, None] * Sm, 0) / np.sum(t ** 2)).astype(\"float32\")\n    # 3 km çevredeki sulama yoğunluğu (çekim baskısı mekânsal olarak yayılır)\n    irr = np.nan_to_num(g.layers[\"irrigated_freq\"])\n    g.layers[\"irrigation_3km\"] = gaussian_filter(irr, 3000 / g.res / 2).astype(\"float32\")\n\n\ndef prior_sinkhole_layers(g: Grid, sk: pd.DataFrame, cutoff_year=None, bw_m=500):\n    \"\"\"Kesme yılına (dahil) kadar bilinen obruklardan: uzaklık (km) ve çekirdek yoğunluğu.\n    Literatür: 500 m tampon alanın %1,7'si ile sonraki obrukların %65'ini yakalar (Gökkaya vd. 2026).\"\"\"\n    s = sk if cutoff_year is None else sk[sk.year.fillna(-1) <= cutoff_year]\n    H, W = g.shape\n    m = np.zeros(g.shape, bool)\n    if len(s):\n        r, c = g.rc(s.x.values, s.y.values)\n        ok = (r >= 0) & (r < H) & (c >= 0) & (c < W)\n        m[r[ok], c[ok]] = True\n    if not m.any():\n        return np.full(g.shape, 50.0, \"float32\"), np.zeros(g.shape, \"float32\")\n    dist = (distance_transform_edt(~m) * g.res / 1000).astype(\"float32\")\n    dens = gaussian_filter(m.astype(\"float32\"), bw_m / g.res) * (1e6 / g.res ** 2)\n    return dist, dens.astype(\"float32\")\n\n\ndef label_layer(g: Grid, sk: pd.DataFrame, buffer_cells=0):\n    H, W = g.shape\n    y = np.zeros(g.shape, \"int8\")\n    r, c = g.rc(sk.x.values, sk.y.values)\n    ok = (r >= 0) & (r < H) & (c >= 0) & (c < W)\n    y[r[ok], c[ok]] = 1\n    if buffer_cells:\n        from scipy.ndimage import binary_dilation\n        y = binary_dilation(y, iterations=buffer_cells).astype(\"int8\")\n    return y\n"
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "id": "80627e0e",
   "metadata": {
    "colab": {
     "base_uri": "https://localhost:8080/"
    },
    "id": "80627e0e",
    "executionInfo": {
     "status": "ok",
     "timestamp": 1791962704548,
     "user_tz": -180,
     "elapsed": 2,
     "user": {
      "displayName": "Joseph Volkan ÖZCAN",
      "userId": "11389530967736397480"
     }
    },
    "outputId": "532e785b-55e6-41d8-c788-5bc34847d51c"
   },
   "outputs": [
    {
     "output_type": "stream",
     "name": "stdout",
     "text": [
      "Writing obruk_engine/physics.py\n"
     ]
    }
   ],
   "source": "%%writefile obruk_engine/physics.py\n\"\"\"Fizik tabanlı örtü-çökme (cover-collapse) simülatörü — popülasyon Monte Carlo.\n\nKavramsal model (Karapınar için literatürle uyumlu; bkz. Faz 1 raporu, bölüm A–C):\n  * Örtü (Kuvaterner göl çökelleri + yüzeye yakın kohezif kapak kaya) altındaki karstlaşmış İnsuyu\n    kireçtaşında, örtü–ana kaya ara yüzeyinde (derinlik H) boşluklar bulunur.\n  * Yeraltı suyu seviyesi (YAS) ara yüzeyin altına indiğinde kaldırma desteği kaybolur ve\n    süffozyon/dökülme (raveling) başlar: boşluk \"aktive\" olur ve yarıçapı a(t) g m/yıl hızla büyür.\n  * Kapak tıkacı (silindir, yarıçap a, kalınlık H) dengesi:\n        Direnç  = 2πaH · (c' + K·γ·H/2·tanφ')\n        Ağırlık = γ·πa²·H\n        FS = 2(c' + K·γ·H/2·tanφ') / (γ·a)\n    FS < 1 olduğunda ani çökme (Karapınar'da gözlenen kuyu tipi obruk) olur; a_crit = 2τ/γ.\n  * Çöken boşluk popülasyondan çıkar → popülasyon tükenmesi. Bu, YAS düşmeye devam ederken\n    yıllık obruk sayısının azalmasını (Gökkaya vd. 2026; Ölü Deniz analoğu) mekanistik olarak üretir.\n\nKalibrasyon: N (boşluk sayısı), H dağılımı (log-normal medyan/σ) ve büyüme hızı medyanı, gözlenen\nyıllık obruk sayılarına (2000–2010 ≈ 3/yıl, 2016–2019 ≈ 32/yıl, 2020–2024 ≈ 22/yıl; havza ölçeği)\nızgara araması + Nelder–Mead ile uydurulur. Senaryolar: YAS eğilimi (m/yıl) değiştirilerek 2026–2040\nbeklenen obruk sayıları ve belirsizlik bantları üretilir.\n\"\"\"\nfrom __future__ import annotations\n\nfrom dataclasses import dataclass\n\nimport numpy as np\nimport pandas as pd\n\nGAMMA = 19.0      # kN/m³ örtü birim hacim ağırlığı\nK0 = 0.5          # yanal toprak basıncı katsayısı\n\n# Gözlem hedefleri (Faz 1): havza ölçeğinde yıllık obruk sayısı ortalamaları\nOBS_RATES = [((2000, 2010), 3.0), ((2016, 2019), 32.0), ((2020, 2024), 22.0)]\n# Yeraltı suyu ortalama derinliği (30 uzun dönem kuyu, Orhan vd. 2024): yıl → m\nWT_ANCHORS = {1983: 0.0, 2000: 23.63, 2014: 31.47, 2022: 39.45}  # 1983 göreli (Doğan & Yılmaz: 1983–2008 ≈ 24 m)\n\n\ndef water_table_history(years, anchors=None, wt_1983_abs=None):\n    \"\"\"Ortalama YAS derinliği (m, yüzeyden). 1983 değeri, 1983–2008 arası ~24 m düşüşten geri hesaplanır.\"\"\"\n    a = dict(anchors or WT_ANCHORS)\n    if wt_1983_abs is None:\n        # 2000: 23.63 m; 1983–2008 arası ~24 m düşüş ≈ 0.96 m/yıl → 1983 ≈ 23.63 − 17·0.96\n        a[1983] = 23.63 - 17 * 0.96\n    ys = np.array(sorted(a)); vs = np.array([a[y] for y in ys])\n    years = np.asarray(years, float)\n    out = np.interp(years, ys, vs)\n    # son çapadan sonra son dönem eğilimiyle (2014–2022 ≈ 1,0 m/yıl) doğrusal dışdeğerleme\n    slope = (vs[-1] - vs[-2]) / (ys[-1] - ys[-2])\n    out = np.where(years > ys[-1], vs[-1] + slope * (years - ys[-1]), out)\n    out = np.where(years < ys[0], vs[0] - 0.3 * (ys[0] - years), out)\n    return out\n\n\n@dataclass\nclass CoverParams:\n    n_cavities: float = 3000.0      # AOI/havzadaki potansiyel boşluk sayısı\n    h_median: float = 38.0          # örtü kalınlığı (ara yüzey derinliği) log-normal medyanı, m\n    h_sigma: float = 0.35           # log-normal σ\n    g_median: float = 0.8           # aktive boşluk yarıçap büyüme hızı medyanı, m/yıl\n    g_sigma: float = 0.6\n    c_kpa: tuple = (20.0, 80.0)     # efektif kohezyon aralığı (kapak kaya + kil), kPa\n    phi_deg: tuple = (22.0, 34.0)\n    a0: tuple = (0.5, 3.0)          # başlangıç boşluk yarıçapı, m\n    seep_delta: float = 2.0         # YAS ara yüzeye bu kadar yaklaşınca süffozyon başlar, m\n    # Boşluk derinliği modeli: \"horizons\" = sondajlarda gözlenen karst boşluk seviyeleri\n    # (Orhan vd. 2024: ~24–47 m, 70–93 m, 131–179 m), \"lognormal\" = tek dağılım\n    h_mode: str = \"horizons\"\n    horizons: tuple = ((24.0, 47.0), (70.0, 93.0), (131.0, 179.0))\n    horizon_weights: tuple = (1.0, 1.0, 1.0)  # seviye başına göreli boşluk yoğunluğu (m başına)\n    # Düşüm hızına bağımlılık: süffozyon/dökülme hidrolik eğim değişimiyle hızlanır (Tihansky 1999).\n    # g_etkin = g · (beta + (1−beta)·clip(dWT/dt / 1 m/yıl, 0, 2)). beta = durağan YAS'ta kalan oran.\n    # VARSAYIM (kalibre edilmedi): beta = 0,3 — DSİ kuyu verisiyle güncellenmeli.\n    beta_static: float = 0.3\n\n\ndef critical_radius(c, phi_deg, H, gamma=GAMMA, K=K0):\n    tau = c + K * gamma * H / 2 * np.tan(np.radians(phi_deg))\n    return 2 * tau / gamma\n\n\nM_POP = 20000  # sabit sanal popülasyon; gerçek sayı ağırlıkla (N/M) ölçeklenir → pürüzsüz amaç fonksiyonu\n\n\ndef simulate(params: CoverParams, years, wt_depth, n_mc=1, seed=0, poisson=True):\n    \"\"\"Yıllık çökme sayıları. wt_depth: years ile aynı uzunlukta YAS derinliği (m).\n\n    Ortak rastgele sayılar: her Monte Carlo üyesi sabit standart normal/uniform çekilişleri\n    parametrelerle dönüştürür; böylece kalibrasyon amaç fonksiyonu parametrelerde süreklidir.\n    poisson=True ise beklenen sayı etrafında Poisson gürültüsü eklenir (gözlem belirsizliği).\n    Dönüş: (n_mc × len(years)).\"\"\"\n    years = np.asarray(years)\n    out = np.zeros((n_mc, len(years)))\n    w = params.n_cavities / M_POP\n    for m in range(n_mc):\n        rng = np.random.default_rng(seed + 7919 * m)\n        z1, z2 = rng.standard_normal(M_POP), rng.standard_normal(M_POP)\n        u1, u2, u3 = rng.random(M_POP), rng.random(M_POP), rng.random(M_POP)\n        if params.h_mode == \"horizons\":\n            hz = np.array(params.horizons); wts = np.array(params.horizon_weights) * (hz[:, 1] - hz[:, 0])\n            k = np.searchsorted(np.cumsum(wts / wts.sum()), (np.argsort(np.argsort(z1)) + 0.5) / M_POP)\n            uu = rng.random(M_POP)\n            H = hz[k, 0] + uu * (hz[k, 1] - hz[k, 0])\n        else:\n            H = np.exp(np.log(params.h_median) + params.h_sigma * z1)\n        g = np.exp(np.log(params.g_median) + params.g_sigma * z2)\n        c = params.c_kpa[0] + u1 * (params.c_kpa[1] - params.c_kpa[0])\n        phi = params.phi_deg[0] + u2 * (params.phi_deg[1] - params.phi_deg[0])\n        a = params.a0[0] + u3 * (params.a0[1] - params.a0[0])\n        ac = critical_radius(c, phi, H)\n        alive = np.ones(M_POP, bool)\n        dwt = np.diff(np.asarray(wt_depth, float), prepend=wt_depth[0])\n        for k, wt in enumerate(wt_depth):\n            active = alive & (wt >= H - params.seep_delta)\n            mult = params.beta_static + (1 - params.beta_static) * np.clip(dwt[k] / 1.0, 0, 2)\n            a[active] += g[active] * mult\n            col = active & (a >= ac)\n            out[m, k] = col.sum() * w\n            alive &= ~col\n        if poisson:\n            out[m] = rng.poisson(out[m])\n    return out\n\n\ndef calibration_loss(p: CoverParams, years, wt, obs=OBS_RATES, area_frac=1.0, n_mc=2):\n    sim = simulate(p, years, wt, n_mc=n_mc, poisson=False).mean(0)\n    loss = 0.0\n    for (y0, y1), r in obs:\n        m = (years >= y0) & (years <= y1)\n        loss += (np.log1p(sim[m].mean()) - np.log1p(r * area_frac)) ** 2\n    return loss, sim\n\n\n# Örtü kalınlığı mekânsal olarak değişkendir (Kuvaterner örtü yer yer 400 m'ye ulaşır); tek bir\n# derinlikte toplanmış (σ→0) dejenere çözümleri engellemek için alt sınır.\nSIG_MIN = 0.15\n\n\ndef calibrate_horizons(years=None, obs=OBS_RATES, area_frac=1.0, verbose=True):\n    \"\"\"Karst boşluk seviyeleri modeliyle kalibrasyon: N, büyüme hızı medyanı/σ ve süffozyon eşiği.\"\"\"\n    from scipy.optimize import minimize\n    years = np.arange(1990, 2026) if years is None else np.asarray(years)\n    wt = water_table_history(years)\n    best = None\n    for N in (1000, 2000, 4000, 8000):\n        for gm in (0.2, 0.5, 1.0, 2.0):\n            for gs in (0.3, 0.8):\n                for sd in (0.0, 2.0, 5.0):\n                    p = CoverParams(n_cavities=N, g_median=gm, g_sigma=gs, seep_delta=sd)\n                    l, _ = calibration_loss(p, years, wt, obs, area_frac, n_mc=1)\n                    if best is None or l < best[0]:\n                        best = (l, p)\n    p0 = best[1]\n\n    def mk(v):\n        return CoverParams(n_cavities=float(np.exp(v[0])), g_median=float(np.exp(v[1])),\n                           g_sigma=float(0.1 + abs(v[2])), seep_delta=float(np.clip(v[3], -5, 15)))\n\n    r = minimize(lambda v: calibration_loss(mk(v), years, wt, obs, area_frac, n_mc=1)[0],\n                 [np.log(p0.n_cavities), np.log(p0.g_median), p0.g_sigma - 0.1, p0.seep_delta],\n                 method=\"Nelder-Mead\", options=dict(maxiter=200, xatol=1e-2, fatol=1e-4))\n    p = mk(r.x)\n    loss, sim = calibration_loss(p, years, wt, obs, area_frac, n_mc=4)\n    if verbose:\n        print(f\"[KOBRA] fizik (karst seviyeleri) kalibrasyonu: N={p.n_cavities:.0f}, g_med={p.g_median:.2f} m/yıl \"\n              f\"(σ={p.g_sigma:.2f}), süffozyon eşiği={p.seep_delta:.1f} m, kayıp={loss:.4f}\")\n    return p, pd.DataFrame(dict(year=years, wt_depth=wt, sim_rate=sim))\n\n\ndef calibrate(years=None, obs=OBS_RATES, area_frac=1.0, seed=0, verbose=True):\n    \"\"\"Kaba ızgara + Nelder–Mead. area_frac: AOI'nin havza obruklarındaki payı (Karapınar ≈ 0,77).\"\"\"\n    from scipy.optimize import minimize\n    years = np.arange(1990, 2026) if years is None else np.asarray(years)\n    wt = water_table_history(years)\n    best = None\n    for N in (800, 1500, 3000, 6000):\n        for hm in (28.0, 32.0, 36.0, 40.0, 45.0):\n            for hs in (0.18, 0.25, 0.35):\n                for gm in (0.3, 0.8, 2.0):\n                    p = CoverParams(n_cavities=N, h_median=hm, h_sigma=hs, g_median=gm)\n                    l, _ = calibration_loss(p, years, wt, obs, area_frac, n_mc=1)\n                    if best is None or l < best[0]:\n                        best = (l, p)\n\n    def f(v):\n        p = CoverParams(n_cavities=np.exp(v[0]), h_median=v[1], h_sigma=SIG_MIN + abs(v[2]), g_median=np.exp(v[3]))\n        return calibration_loss(p, years, wt, obs, area_frac, n_mc=1)[0]\n\n    p0 = best[1]\n    x0 = [np.log(p0.n_cavities), p0.h_median, max(p0.h_sigma - SIG_MIN, 0.01), np.log(p0.g_median)]\n    r = minimize(f, x0, method=\"Nelder-Mead\", options=dict(maxiter=160, xatol=1e-2, fatol=1e-3))\n    v = r.x\n    p = CoverParams(n_cavities=float(np.exp(v[0])), h_median=float(v[1]), h_sigma=float(SIG_MIN + abs(v[2])),\n                    g_median=float(np.exp(v[3])))\n    loss, sim = calibration_loss(p, years, wt, obs, area_frac, n_mc=4)\n    if verbose:\n        print(f\"[KOBRA] fizik kalibrasyonu: N={p.n_cavities:.0f}, H_med={p.h_median:.1f} m (σ={p.h_sigma:.2f}), \"\n              f\"g_med={p.g_median:.2f} m/yıl, kayıp={loss:.4f}\")\n    return p, pd.DataFrame(dict(year=years, wt_depth=wt, sim_rate=sim))\n\n\ndef scenarios(p: CoverParams, start=1990, hist_end=2025, horizon=2040, trends=None, n_mc=64, seed=1):\n    \"\"\"YAS senaryoları: m/yıl düşüş (pozitif = derinleşme). Belirsizlik: Monte Carlo + parametre jitter.\"\"\"\n    trends = trends or {\"Mevcut eğilim (1,0 m/yıl)\": 1.0, \"Yarıya indirme (0,5 m/yıl)\": 0.5,\n                        \"Stabilizasyon (0 m/yıl)\": 0.0, \"Toparlanma (−0,5 m/yıl)\": -0.5}\n    years = np.arange(start, horizon + 1)\n    hist = water_table_history(np.arange(start, hist_end + 1))\n    rows = []\n    for name, tr in trends.items():\n        rng = np.random.default_rng(seed)  # tüm senaryolar aynı parametre çekilişlerini kullanır\n        fut = hist[-1] + tr * np.arange(1, horizon - hist_end + 1)\n        wt = np.concatenate([hist, fut])\n        sims = []\n        for k in range(n_mc // 8):\n            from dataclasses import replace\n            pj = replace(p, n_cavities=p.n_cavities * rng.lognormal(0, 0.15),\n                         h_median=p.h_median * rng.lognormal(0, 0.05), g_median=p.g_median * rng.lognormal(0, 0.2))\n            sims.append(simulate(pj, years, wt, n_mc=8, seed=seed + k))\n        S = np.vstack(sims)\n        for i, y in enumerate(years):\n            rows.append(dict(scenario=name, year=y, wt_depth=wt[i], mean=S[:, i].mean(),\n                             p05=np.percentile(S[:, i], 5), p95=np.percentile(S[:, i], 95)))\n    df = pd.DataFrame(rows)\n    summ = (df[df.year > hist_end].groupby(\"scenario\")\n            .agg(total_2026_2040=(\"mean\", \"sum\"), lo=(\"p05\", \"sum\"), hi=(\"p95\", \"sum\")).round(0))\n    return df, summ\n\n\ndef spatial_allocation(prob_map, annual_total):\n    \"\"\"Bölgesel beklenen yıllık obruk sayısını hücrelere duyarlılık olasılığıyla dağıt\n    (hücre başına yıllık beklenen olay ve en az bir olay olasılığı).\"\"\"\n    w = np.nan_to_num(prob_map); w = w / w.sum()\n    lam = w * annual_total\n    return lam, 1 - np.exp(-lam)\n"
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "id": "d2b5b7ee",
   "metadata": {
    "colab": {
     "base_uri": "https://localhost:8080/"
    },
    "id": "d2b5b7ee",
    "executionInfo": {
     "status": "ok",
     "timestamp": 1791962704557,
     "user_tz": -180,
     "elapsed": 9,
     "user": {
      "displayName": "Joseph Volkan ÖZCAN",
      "userId": "11389530967736397480"
     }
    },
    "outputId": "f276e317-7e22-439c-f44a-847d54afa7f4"
   },
   "outputs": [
    {
     "output_type": "stream",
     "name": "stdout",
     "text": [
      "Writing obruk_engine/models.py\n"
     ]
    }
   ],
   "source": "%%writefile obruk_engine/models.py\n\"\"\"Klasik tahmin çekirdeği + dürüst doğrulama.\n\nModeller\n  * proximity   : yalnızca geçmiş obruklara uzaklık/yoğunluk (literatürdeki en güçlü taban çizgisi)\n  * logreg      : standartlaştırılmış lojistik regresyon (yorumlanabilir referans)\n  * rf          : Random Forest\n  * lgbm        : LightGBM (dengesiz sınıf ağırlıklı)\n  * ensemble    : sıra-ortalaması (rank-average) — proximity + en iyi öğrenen\nDoğrulama\n  * mekânsal blok CV  : 5 km bloklar (GroupKFold) — mekânsal sızıntıyı önler\n  * zamansal doğrulama: kesme yılına kadar bilinen obruklarla eğit → sonraki obrukları tahmin et\n  * metrikler         : ROC-AUC, PR-AUC, alan-yakalama eğrisi (alanın %1/2/5/10'unda yakalanan oran),\n                        bootstrap %95 güven aralığı\n  * Poisson hücre-yıl modeli (Hawkes-benzeri öz-uyarım + tükenme): tarihli envanter olduğunda\n\"\"\"\nfrom __future__ import annotations\n\nimport numpy as np\nimport pandas as pd\nfrom scipy.spatial import cKDTree\nfrom sklearn.ensemble import RandomForestClassifier\nfrom sklearn.linear_model import LogisticRegression, PoissonRegressor\nfrom sklearn.metrics import roc_auc_score, average_precision_score\nfrom sklearn.model_selection import GroupKFold\nfrom sklearn.pipeline import make_pipeline\nfrom sklearn.preprocessing import StandardScaler\nfrom sklearn.impute import SimpleImputer\n\n\n# ------------------------------------------------------------------------------ geçmiş obruk öznitelikleri\ndef prior_features(cells_xy: np.ndarray, prior_xy: np.ndarray, self_mask=None, bw=500.0, cell=100.0):\n    \"\"\"Her hücre için: en yakın *başka* geçmiş obruğa uzaklık (km) ve 500 m çekirdek yoğunluğu.\n    self_mask: hücrenin kendisinde bir geçmiş obruk varsa True (kendini sayma — sızıntı önleme).\"\"\"\n    n = len(cells_xy)\n    if prior_xy is None or len(prior_xy) == 0:\n        return np.full(n, 50.0), np.zeros(n)\n    t = cKDTree(prior_xy)\n    k = min(2, len(prior_xy))\n    d, _ = t.query(cells_xy, k=k)\n    d = d.reshape(n, -1)\n    if self_mask is not None and k == 2:\n        dist = np.where(self_mask & (d[:, 0] < cell * 0.75), d[:, 1], d[:, 0])\n    else:\n        dist = d[:, 0]\n    # Gauss çekirdek yoğunluğu (adet/km²), kendisi hariç\n    nb = t.query_ball_point(cells_xy, r=3 * bw)\n    dens = np.zeros(n)\n    for i, ids in enumerate(nb):\n        if not ids:\n            continue\n        dd = np.linalg.norm(prior_xy[ids] - cells_xy[i], axis=1)\n        if self_mask is not None and self_mask[i]:\n            dd = dd[dd > cell * 0.75]\n        dens[i] = np.exp(-0.5 * (dd / bw) ** 2).sum() / (2 * np.pi * (bw / 1000) ** 2)\n    return dist / 1000.0, dens\n\n\n# ------------------------------------------------------------------------------ metrikler\ndef capture_curve(score, y, fracs=(0.01, 0.02, 0.05, 0.10, 0.20)):\n    \"\"\"Alanın en riskli %f'lik kısmında yakalanan pozitif oranı (risk haritasının operasyonel ölçütü).\"\"\"\n    order = np.argsort(-score)\n    ys = y[order]\n    n = len(y); tot = max(ys.sum(), 1)\n    return {f\"cap@{int(f * 100)}%\": float(ys[: max(1, int(f * n))].sum() / tot) for f in fracs}\n\n\ndef metrics(score, y, n_boot=300, seed=0):\n    ok = np.isfinite(score)\n    score, y = score[ok], y[ok]\n    m = dict(auc=roc_auc_score(y, score), ap=average_precision_score(y, score), n_pos=int(y.sum()))\n    m.update(capture_curve(score, y))\n    rng = np.random.default_rng(seed)\n    pos, neg = np.where(y == 1)[0], np.where(y == 0)[0]\n    aucs = []\n    for _ in range(n_boot):\n        ip = rng.choice(pos, len(pos)); ineg = rng.choice(neg, min(len(neg), 20000))\n        idx = np.r_[ip, ineg]\n        aucs.append(roc_auc_score(y[idx], score[idx]))\n    m[\"auc_lo\"], m[\"auc_hi\"] = np.percentile(aucs, [2.5, 97.5])\n    return m\n\n\n# ------------------------------------------------------------------------------ modeller\ndef make_models(seed=42):\n    imp = lambda: SimpleImputer(strategy=\"median\")\n    models = {\n        \"logreg\": make_pipeline(imp(), StandardScaler(), LogisticRegression(C=0.3, class_weight=\"balanced\", max_iter=2000)),\n        \"rf\": make_pipeline(imp(), RandomForestClassifier(n_estimators=400, min_samples_leaf=3, class_weight=\"balanced_subsample\",\n                                                          max_features=\"sqrt\", n_jobs=-1, random_state=seed)),\n    }\n    try:\n        import lightgbm as lgb\n        models[\"lgbm\"] = make_pipeline(imp(), lgb.LGBMClassifier(n_estimators=300, learning_rate=0.03, num_leaves=15,\n                                                                 min_child_samples=5, subsample=0.8, subsample_freq=1,\n                                                                 colsample_bytree=0.8, reg_lambda=1.0,\n                                                                 scale_pos_weight=50, random_state=seed, verbose=-1))\n    except ImportError:\n        pass\n    return models\n\n\ndef sample_training(df, ycol=\"label\", neg_per_pos=60, seed=42, exclude=None):\n    rng = np.random.default_rng(seed)\n    pos = df.index[df[ycol] == 1]\n    negpool = df.index[(df[ycol] == 0) & (~exclude if exclude is not None else True)]\n    neg = rng.choice(negpool, min(len(negpool), max(2000, neg_per_pos * len(pos))), replace=False)\n    return df.loc[np.r_[pos, neg]]\n\n\ndef rank01(x):\n    r = pd.Series(x).rank(pct=True).values\n    return np.where(np.isfinite(x), r, np.nan)\n\n\n# ------------------------------------------------------------------------------ mekânsal blok CV\ndef spatial_block_cv(df, feats, ycol=\"label\", block_m=5000, k=5, seed=42, neg_per_pos=60, extra_scores=None,\n                     use_prior=True, quantum_scorer=None):\n    \"\"\"5 km blok GroupKFold. Her katta eğitim negatifleri örneklenir; test tüm blok hücreleri.\n\n    use_prior=True: \"geçmiş obruklara uzaklık/yoğunluk\" öznitelikleri HER KATTA yalnız eğitim\n    bloklarındaki obruklardan hesaplanır (test bloklarındaki hedefler sızmaz). Eğitim hücrelerinde\n    hücrenin kendisi hariç tutulur. Ayrıca 'proximity' taban çizgisi aynı şekilde katlar-dışı üretilir.\n    Dönüş: model→metrik tablosu ve tüm hücreler için katlar-dışı (OOF) skorlar.\"\"\"\n    df = df.copy().reset_index(drop=True)\n    df[\"block\"] = (np.floor(df.x / block_m)).astype(int) * 100000 + (np.floor(df.y / block_m)).astype(int)\n    gkf = GroupKFold(n_splits=k)\n    models = make_models(seed)\n    names = list(models) + ([\"proximity\", \"ensemble\"] if use_prior else [])\n    oof = {m: np.full(len(df), np.nan) for m in names}\n    qoof = {}\n    fx = list(feats) + ([\"dist_prior_km\", \"dens_prior\"] if use_prior else [])\n    xy = df[[\"x\", \"y\"]].values\n    for tr, te in gkf.split(df, df[ycol], df[\"block\"]):\n        D = df.copy()\n        if use_prior:\n            pos_tr = tr[df[ycol].values[tr] == 1]\n            self_mask = np.zeros(len(df), bool); self_mask[pos_tr] = True\n            d, k_ = prior_features(xy, xy[pos_tr], self_mask=self_mask)\n            D[\"dist_prior_km\"], D[\"dens_prior\"] = d, k_\n            oof[\"proximity\"][te] = -d[te] + 1e-3 * k_[te]\n        dtr = sample_training(D.iloc[tr], ycol, neg_per_pos, seed)\n        if dtr[ycol].sum() < 3:\n            continue\n        for name, mdl in make_models(seed).items():\n            mdl.fit(dtr[fx], dtr[ycol])\n            oof[name][te] = mdl.predict_proba(D.iloc[te][fx])[:, 1]\n        if quantum_scorer is not None:\n            for qn, qv in quantum_scorer(dtr[fx].values, dtr[ycol].values, D.iloc[te][fx].values).items():\n                qoof.setdefault(qn, np.full(len(df), np.nan))[te] = qv\n    oof.update(qoof)\n    if use_prior:\n        learners = [m for m in (\"lgbm\", \"rf\", \"logreg\") if m in oof]\n        y_ = df[ycol].values\n        best = max(learners, key=lambda m: roc_auc_score(y_[np.isfinite(oof[m])], oof[m][np.isfinite(oof[m])]))\n        oof[\"ensemble\"] = 0.5 * rank01(oof[\"proximity\"]) + 0.5 * rank01(oof[best])\n    rows = []\n    y = df[ycol].values\n    for name, s in oof.items():\n        rows.append(dict(model=name, **metrics(s, y)))\n    for name, s in (extra_scores or {}).items():\n        rows.append(dict(model=name, **metrics(s, y)))\n    return pd.DataFrame(rows).set_index(\"model\"), oof\n\n\n# ------------------------------------------------------------------------------ zamansal doğrulama\ndef temporal_validation(cells: pd.DataFrame, static_feats, sk: pd.DataFrame, cutoff_year, seed=42,\n                        neg_per_pos=60, quantum_scorer=None):\n    \"\"\"Kesme yılına kadar bilinen obruklarla (öncesi + ≤cutoff) eğit; sonra oluşanları tahmin et.\n\n    cells : ızgara hücreleri (x, y + statik öznitelikler)\n    sk    : obruklar (x, y, year; year NaN = tarihi bilinmeyen/eski → 'öncesi' sayılır)\n    Dönüş : metrik tablosu, skorlar (tüm hücreler), kullanılan öznitelik listesi\n    \"\"\"\n    sk = sk.copy()\n    old = sk[(sk.year.isna()) | (sk.year <= cutoff_year)]\n    new = sk[sk.year > cutoff_year]\n    xy = cells[[\"x\", \"y\"]].values\n    t = cKDTree(xy)\n    _, i_old = t.query(old[[\"x\", \"y\"]].values)\n    _, i_new = t.query(new[[\"x\", \"y\"]].values)\n    y_old = np.zeros(len(cells), int); y_old[i_old] = 1\n    y_new = np.zeros(len(cells), int); y_new[i_new] = 1\n    d_prior, k_prior = prior_features(xy, old[[\"x\", \"y\"]].values, self_mask=y_old.astype(bool))\n    X = cells.copy()\n    X[\"dist_prior_km\"], X[\"dens_prior\"] = d_prior, k_prior\n    feats = list(static_feats) + [\"dist_prior_km\", \"dens_prior\"]\n    X[\"label\"] = y_old\n    # Eğitim: eski obruk hücreleri (pozitif) + örneklenmiş negatifler; test: yeni obrukların hücreleri\n    # (eski obruk hücreleri test kümesinden çıkarılır — zaten bilinenler).\n    tr = sample_training(X, \"label\", neg_per_pos, seed)\n    test_mask = (y_old == 0)\n    y_test = y_new[test_mask]\n    scores = {\"proximity\": -d_prior + 1e-3 * k_prior}\n    for name, mdl in make_models(seed).items():\n        mdl.fit(tr[feats], tr[\"label\"])\n        scores[name] = mdl.predict_proba(X[feats])[:, 1]\n    best = max((\"lgbm\", \"rf\", \"logreg\"), key=lambda m: roc_auc_score(y_test, scores[m][test_mask])\n               if m in scores else -1)\n    scores[\"ensemble\"] = 0.5 * rank01(scores[\"proximity\"]) + 0.5 * rank01(scores[best])\n    if quantum_scorer is not None:\n        qs = quantum_scorer(tr[feats].values, tr[\"label\"].values, X[feats].values)\n        for k_, v in qs.items():\n            scores[k_] = v\n    rows = []\n    for name, s in scores.items():\n        rows.append(dict(model=name, **metrics(s[test_mask], y_test)))\n    res = pd.DataFrame(rows).set_index(\"model\")\n    res.attrs.update(dict(cutoff=cutoff_year, n_train_pos=int(y_old.sum()), n_test_pos=int(y_test.sum()),\n                          best_learner=best))\n    return res, scores, feats, X\n\n\n# ------------------------------------------------------------------------------ hücre-yıl Poisson (Hawkes-benzeri)\ndef poisson_cell_year(cells: pd.DataFrame, static_feats, sk_dated: pd.DataFrame, years, annual: pd.DataFrame,\n                      radius=500.0, seed=42, neg_frac=0.05):\n    \"\"\"λ(hücre, yıl) = exp(β·x_statik + γ·z_yıl + α·log(1+N_geçmiş_500m) + δ·N_kümülatif_bölge).\n    α > 0 → mekânsal öz-uyarım (kümelenme), δ < 0 → bölgesel tükenme. annual: yıl indeksli\n    (ör. wt_depth, drawdown, precip_anom). Hafıza için negatif hücre-yıllar alt-örneklenir\n    (ağırlıklandırılır).\"\"\"\n    rng = np.random.default_rng(seed)\n    xy = cells[[\"x\", \"y\"]].values\n    t = cKDTree(xy)\n    _, idx = t.query(sk_dated[[\"x\", \"y\"]].values)\n    sk_dated = sk_dated.assign(cell=idx)\n    rows = []\n    for y in years:\n        prev = sk_dated[sk_dated.year < y]\n        cnt_prev = np.zeros(len(cells))\n        if len(prev):\n            tp = cKDTree(prev[[\"x\", \"y\"]].values)\n            cnt_prev = np.array([len(v) for v in tp.query_ball_point(xy, r=radius)])\n        ev = np.zeros(len(cells)); np.add.at(ev, sk_dated[sk_dated.year == y].cell.values, 1)\n        keep = (ev > 0) | (rng.random(len(cells)) < neg_frac)\n        w = np.where(ev > 0, 1.0, 1.0 / neg_frac)\n        d = cells.loc[keep, static_feats].copy()\n        d[\"log_prev500\"] = np.log1p(cnt_prev[keep])\n        d[\"cum_region\"] = len(prev)\n        for c in annual.columns:\n            d[c] = annual.loc[y, c] if y in annual.index else np.nan\n        d[\"events\"] = ev[keep]; d[\"w\"] = w[keep]; d[\"year\"] = y\n        rows.append(d)\n    D = pd.concat(rows, ignore_index=True)\n    fx = [c for c in D.columns if c not in (\"events\", \"w\", \"year\")]\n    mdl = make_pipeline(SimpleImputer(strategy=\"median\"), StandardScaler(), PoissonRegressor(alpha=1e-3, max_iter=3000))\n    mdl.fit(D[fx], D[\"events\"], poissonregressor__sample_weight=D[\"w\"])\n    coef = pd.Series(mdl[-1].coef_, index=fx).sort_values()\n    return mdl, coef, fx\n"
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "id": "e696a84e",
   "metadata": {
    "colab": {
     "base_uri": "https://localhost:8080/"
    },
    "id": "e696a84e",
    "executionInfo": {
     "status": "ok",
     "timestamp": 1791962704570,
     "user_tz": -180,
     "elapsed": 13,
     "user": {
      "displayName": "Joseph Volkan ÖZCAN",
      "userId": "11389530967736397480"
     }
    },
    "outputId": "8772b064-bf0a-410d-d11f-7ebe7ee8defb"
   },
   "outputs": [
    {
     "output_type": "stream",
     "name": "stdout",
     "text": [
      "Writing obruk_engine/quantum.py\n"
     ]
    }
   ],
   "source": "%%writefile obruk_engine/quantum.py\n\"\"\"Faz 6 — Hibrit klasik–kuantum motor (cihaz-agnostik).\n\nİlke (BVK kuantum yığını): hangi cihaz kullanılıyorsa onun kendi derleyicisi/çalıştırıcısı en yüksek\nperformansla kullanılır. Ortak ara temsil Qiskit `QuantumCircuit` / OpenQASM'dır; her sağlayıcıya\nayrı yürütme adaptörü vardır. Donanım uygunluğu derleme SONRASI 2-kübit kapı sayısı ve tahmini\ndevre sadakatiyle belirlenir (derleme öncesi tahminle değil).\n\nAdaptörler (anahtar → arka uç)\n  sim.statevector   : NumPy durum vektörü (durum önbellekli çekirdek; en hızlı, kesin)\n  sim.pennylane     : PennyLane default.qubit / lightning.qubit (VQC eğitimi, geri yayılım)\n  sim.aer           : Qiskit Aer (gürültüsüz ya da cihaz gürültü modeliyle)\n  ibm:<backend>     : IBM Quantum Runtime (Heron: ibm_fez, ibm_kingston, ibm_torino…) — SamplerV2,\n                      transpiler opt.3 + DD + twirling\n  origin:<backend>  : Origin Quantum Wukong (pyqpanda3 QCloudService; QASM → QProg)\n  braket:<arn>      : Amazon Braket (IonQ, Rigetti, IQM; OpenQASM 3)\n  azure:<target>    : Azure Quantum (Quantinuum, IonQ, Pasqal)\n  QUBO              : exact | sa (dwave-samplers) | qaoa (Aer/statevector) | dwave.hybrid | dwave.qpu\n\nAlgoritmalar\n  1. Nyström kuantum çekirdeği (ZZ-tipi öznitelik haritası; m işaret noktası) → lojistik/SVM\n  2. Değişkensel kuantum sınıflandırıcı (VQC, veri yeniden yükleme) — PennyLane\n  3. İzleme ağı yerleşimi QUBO'su (InSAR köşe yansıtıcı / GNSS / piyezometre) — SA, QAOA, D-Wave\n\"\"\"\nfrom __future__ import annotations\n\nimport itertools\nimport os\nimport time\nfrom dataclasses import dataclass\n\nimport numpy as np\nimport pandas as pd\n\n\n# =============================================================================================\n# 1. Öznitelik haritası (tek tanım — hem NumPy hem Qiskit)\n# =============================================================================================\n@dataclass\nclass FeatureMap:\n    n_qubits: int = 6\n    reps: int = 2\n    entangle: str = \"ring\"   # ring | linear\n\n    def pairs(self):\n        n = self.n_qubits\n        p = [(i, i + 1) for i in range(n - 1)]\n        if self.entangle == \"ring\" and n > 2:\n            p.append((n - 1, 0))\n        return p\n\n    # ---- NumPy durum vektörü (ölçeklenebilir, toplu) --------------------------------------\n    def states(self, X: np.ndarray, batch=4096) -> np.ndarray:\n        \"\"\"|ψ(x)⟩ = Π_reps [ U_ZZ(x) · H^{⊗n} ] |0⟩, U_ZZ = Π exp(-i x_i Z_i) Π exp(-i (π−x_i)(π−x_j) Z_iZ_j)\"\"\"\n        n = self.n_qubits\n        dim = 2 ** n\n        bits = ((np.arange(dim)[:, None] >> np.arange(n)[None, ::-1]) & 1).astype(np.int8)  # qubit 0 = MSB\n        z = 1 - 2 * bits  # ±1\n        out = np.empty((len(X), dim), np.complex64)\n        Hn = np.ones(dim) / np.sqrt(dim)\n        for s in range(0, len(X), batch):\n            x = X[s:s + batch]\n            psi = np.tile(Hn.astype(np.complex128), (len(x), 1))\n            for r in range(self.reps):\n                if r > 0:  # H^{⊗n} uygula (Walsh–Hadamard)\n                    psi = _wht(psi, n)\n                phase = x @ z.T  # Σ x_i z_i\n                for (i, j) in self.pairs():\n                    phase = phase + np.outer((np.pi - x[:, i]) * (np.pi - x[:, j]), z[:, i] * z[:, j])\n                psi = psi * np.exp(-1j * phase)\n            out[s:s + batch] = psi.astype(np.complex64)\n        return out\n\n    # ---- Qiskit devresi (donanım yolu) ------------------------------------------------------\n    def circuit(self, x):\n        from qiskit import QuantumCircuit\n        n = self.n_qubits\n        qc = QuantumCircuit(n)\n        for r in range(self.reps):\n            qc.h(range(n))\n            for i in range(n):\n                qc.rz(2 * x[i], i)\n            for (i, j) in self.pairs():\n                qc.cx(i, j); qc.rz(2 * (np.pi - x[i]) * (np.pi - x[j]), j); qc.cx(i, j)\n        return qc\n\n    def fidelity_circuit(self, x, y):\n        \"\"\"Hesapla-geri al (compute–uncompute): P(|0…0⟩) = |⟨ψ(y)|ψ(x)⟩|²\"\"\"\n        qc = self.circuit(x).compose(self.circuit(y).inverse())\n        qc.measure_all()\n        return qc\n\n\ndef _wht(psi, n):\n    \"\"\"Toplu Walsh–Hadamard dönüşümü (H^{⊗n}).\"\"\"\n    B = psi.shape[0]\n    a = psi.reshape(B, *([2] * n))\n    for ax in range(1, n + 1):\n        a0 = np.take(a, 0, axis=ax); a1 = np.take(a, 1, axis=ax)\n        a = np.stack([(a0 + a1) / np.sqrt(2), (a0 - a1) / np.sqrt(2)], axis=ax)\n    return a.reshape(B, -1)\n\n\n# =============================================================================================\n# 2. Ön işleme: PCA → [0, π] ölçekleme\n# =============================================================================================\nclass QPrep:\n    \"\"\"PCA → [0, π·bandwidth]. bandwidth < 1, ZZ öznitelik haritasında çekirdek yoğunlaşmasını\n    (exponential concentration) önler (Shaydulin & Wild 2022, 'bandwidth' ölçekleme).\"\"\"\n\n    def __init__(self, n_qubits=6, bandwidth=1.0):\n        self.bw = bandwidth\n        from sklearn.decomposition import PCA\n        from sklearn.impute import SimpleImputer\n        from sklearn.preprocessing import StandardScaler\n        self.imp, self.sc, self.pca = SimpleImputer(strategy=\"median\"), StandardScaler(), PCA(n_components=n_qubits)\n\n    def fit(self, X):\n        Z = self.pca.fit_transform(self.sc.fit_transform(self.imp.fit_transform(X)))\n        self.lo, self.hi = np.percentile(Z, 1, 0), np.percentile(Z, 99, 0)\n        return self\n\n    def transform(self, X):\n        Z = self.pca.transform(self.sc.transform(self.imp.transform(X)))\n        return np.clip((Z - self.lo) / (self.hi - self.lo + 1e-9), 0, 1) * np.pi * self.bw\n\n\n# =============================================================================================\n# 3. Yürütme adaptörleri\n# =============================================================================================\nclass Executor:\n    \"\"\"Bir devre listesini seçilen arka uçta çalıştırır, her devre için P(0…0) döndürür.\"\"\"\n\n    def __init__(self, backend=\"sim.aer\", shots=2048, fidelity_floor=0.25, verbose=True, **kw):\n        self.backend, self.shots, self.floor, self.verbose, self.kw = backend, shots, fidelity_floor, verbose, kw\n        self.report = {}\n\n    # ---- derleme sonrası uygunluk ---------------------------------------------------------\n    def compile_check(self, qc, target=None):\n        \"\"\"Hedef cihaza transpile et, 2q kapı sayısı ve tahmini sadakati hesapla.\"\"\"\n        from qiskit import transpile\n        if target is None:\n            from qiskit_ibm_runtime.fake_provider import FakeFez\n            target = FakeFez()\n        t = transpile(qc, backend=target, optimization_level=3, seed_transpiler=7)\n        ops = t.count_ops()\n        n2 = sum(v for k, v in ops.items() if k in (\"cz\", \"cx\", \"ecr\", \"rzz\"))\n        n1 = sum(v for k, v in ops.items() if k in (\"sx\", \"x\", \"rz\", \"rx\", \"u\", \"u3\"))\n        e2, e1, ero = 3e-3, 2.5e-4, 1.5e-2  # Heron r2 tipik medyanları; cihaz özelliklerinden okunabilir\n        try:\n            props = target.target\n            errs2 = [v.error for k in (\"cz\", \"ecr\") if k in props.operation_names for v in props[k].values() if v and v.error]\n            if errs2:\n                e2 = float(np.median(errs2))\n        except Exception:\n            pass\n        fid = (1 - e2) ** n2 * (1 - e1) ** n1 * (1 - ero) ** qc.num_qubits\n        rep = dict(n2q=int(n2), n1q=int(n1), depth=int(t.depth()), est_fidelity=float(fid),\n                   eligible=bool(fid >= self.floor), target=getattr(target, \"name\", str(target)))\n        self.report = rep\n        return t, rep\n\n    # ---- çalıştır --------------------------------------------------------------------------\n    def p0(self, circuits):\n        b = self.backend\n        if b == \"sim.aer\":\n            return self._aer(circuits)\n        if b.startswith(\"sim.aer_noise\"):\n            return self._aer(circuits, noise=True)\n        if b.startswith(\"ibm:\"):\n            return self._ibm(circuits, b.split(\":\", 1)[1])\n        if b.startswith(\"origin:\"):\n            return self._origin(circuits, b.split(\":\", 1)[1])\n        if b.startswith(\"braket:\"):\n            return self._braket(circuits, b.split(\":\", 1)[1])\n        if b.startswith(\"azure:\"):\n            return self._azure(circuits, b.split(\":\", 1)[1])\n        raise ValueError(f\"bilinmeyen arka uç: {b}\")\n\n    @staticmethod\n    def _p0_from_counts(counts, n):\n        tot = sum(counts.values())\n        return counts.get(\"0\" * n, 0) / max(tot, 1)\n\n    def _aer(self, circuits, noise=False):\n        from qiskit import transpile\n        from qiskit_aer import AerSimulator\n        if noise:\n            from qiskit_ibm_runtime.fake_provider import FakeFez\n            sim = AerSimulator.from_backend(FakeFez())\n        else:\n            sim = AerSimulator()\n        tc = transpile(circuits, sim, optimization_level=1)\n        res = sim.run(tc, shots=self.shots).result()\n        return np.array([self._p0_from_counts(res.get_counts(i), c.num_qubits) for i, c in enumerate(circuits)])\n\n    def _ibm(self, circuits, backend_name):\n        \"\"\"IBM Quantum (Heron). Kimlik: QISKIT_IBM_TOKEN (+ isteğe bağlı QISKIT_IBM_INSTANCE).\"\"\"\n        from qiskit import transpile\n        from qiskit_ibm_runtime import QiskitRuntimeService, SamplerV2\n        svc = QiskitRuntimeService(channel=os.environ.get(\"QISKIT_IBM_CHANNEL\", \"ibm_quantum_platform\"),\n                                   token=os.environ.get(\"QISKIT_IBM_TOKEN\"),\n                                   instance=os.environ.get(\"QISKIT_IBM_INSTANCE\"))\n        be = svc.backend(backend_name)\n        _, rep = self.compile_check(circuits[0], be)\n        if not rep[\"eligible\"]:\n            raise RuntimeError(f\"Derleme sonrası sadakat {rep['est_fidelity']:.3f} < eşik; donanım çalıştırması \"\n                               f\"anlamsız olur (2q={rep['n2q']}). Kübit/tekrar sayısını azaltın.\")\n        tc = transpile(circuits, be, optimization_level=3, seed_transpiler=7)\n        sampler = SamplerV2(mode=be)\n        sampler.options.dynamical_decoupling.enable = True\n        sampler.options.twirling.enable_gates = True\n        job = sampler.run(tc, shots=self.shots)\n        if self.verbose:\n            print(f\"[KOBRA] IBM {backend_name} iş: {job.job_id()}\")\n        res = job.result()\n        out = []\n        for i, c in enumerate(circuits):\n            counts = res[i].data.meas.get_counts()\n            out.append(self._p0_from_counts(counts, c.num_qubits))\n        return np.array(out)\n\n    def _origin(self, circuits, backend_name):\n        \"\"\"Origin Quantum (Wukong). Kimlik: ORIGIN_QC_API_KEY. QASM → QProg dönüşümü pyqpanda3 ile.\n        Not: pyqpanda3 bulut API'si sürümle değişebilir; `QCloudService(api_key).backends()` ile\n        güncel arka uç adını doğrulayın.\"\"\"\n        from qiskit import qasm2, transpile\n        from pyqpanda3.intermediate_compiler import convert_qasm_string_to_qprog\n        from pyqpanda3.qcloud import QCloudService, QCloudOptions\n        svc = QCloudService(api_key=os.environ[\"ORIGIN_QC_API_KEY\"])\n        be = svc.backend(backend_name)\n        opts = QCloudOptions(); opts.set_amend(True); opts.set_mapping(True); opts.set_optimization(True)\n        out = []\n        for c in circuits:\n            base = transpile(c, basis_gates=[\"u3\", \"cx\", \"rz\", \"h\", \"x\", \"sx\"], optimization_level=3)\n            prog = convert_qasm_string_to_qprog(qasm2.dumps(base))\n            job = be.run(prog, self.shots, opts)\n            probs = job.result().get_probs()\n            p = probs[0] if isinstance(probs, list) else probs\n            out.append(float(p.get(\"0\" * c.num_qubits, p.get(\"0x0\", 0.0))))\n        return np.array(out)\n\n    def _braket(self, circuits, arn):\n        \"\"\"Amazon Braket (IonQ/Rigetti/IQM). AWS kimlik bilgileri ortamdan.\"\"\"\n        from braket.aws import AwsDevice\n        from braket.ir.openqasm import Program\n        from qiskit import qasm3, transpile\n        dev = AwsDevice(arn)\n        out = []\n        for c in circuits:\n            base = transpile(c, basis_gates=[\"rz\", \"rx\", \"ry\", \"cx\", \"h\", \"x\"], optimization_level=3)\n            res = dev.run(Program(source=qasm3.dumps(base)), shots=self.shots).result()\n            out.append(self._p0_from_counts(dict(res.measurement_counts), c.num_qubits))\n        return np.array(out)\n\n    def _azure(self, circuits, target):\n        from azure.quantum import Workspace\n        from azure.quantum.qiskit import AzureQuantumProvider\n        from qiskit import transpile\n        ws = Workspace(resource_id=os.environ[\"AZURE_QUANTUM_RESOURCE_ID\"], location=os.environ.get(\"AZURE_QUANTUM_LOCATION\", \"westeurope\"))\n        be = AzureQuantumProvider(ws).get_backend(target)\n        res = be.run(transpile(circuits, be), shots=self.shots).result()\n        return np.array([self._p0_from_counts(res.get_counts(i), c.num_qubits) for i, c in enumerate(circuits)])\n\n\n# =============================================================================================\n# 4. Nyström kuantum çekirdek sınıflandırıcısı\n# =============================================================================================\nclass QuantumKernelClassifier:\n    \"\"\"K(x, l_j) = |⟨ψ(l_j)|ψ(x)⟩|² ile m işaret noktasına (landmark) göre Nyström öznitelikleri,\n    ardından L2-düzenli lojistik regresyon. Simülatörde durum önbelleği: N+m durum, N·m iç çarpım\n    (N² devre yerine). Donanımda yalnız (eğitim örneklemi × m) + (puanlanacak hücreler × m)\n    devre gerekir; tüm ızgara için donanım değil simülatör/öğrenilmiş vekil kullanılır.\"\"\"\n\n    def __init__(self, n_qubits=6, reps=2, n_landmarks=32, C=1.0, backend=\"sim.statevector\", seed=42,\n                 shots=2048, bandwidth=1.0):\n        self.fm = FeatureMap(n_qubits, reps)\n        self.prep = QPrep(n_qubits, bandwidth)\n        self.bandwidth = bandwidth\n        self.m, self.C, self.backend, self.seed, self.shots = n_landmarks, C, backend, seed, shots\n        self.timing = {}\n\n    def _kernel(self, Xq):\n        if self.backend == \"sim.statevector\":\n            S = self.fm.states(Xq)\n            return np.abs(S.conj() @ self.L_states.T) ** 2\n        ex = Executor(self.backend, shots=self.shots)\n        circs = [self.fm.fidelity_circuit(x, l) for x in Xq for l in self.L]\n        return ex.p0(circs).reshape(len(Xq), len(self.L))\n\n    def fit(self, X, y):\n        from sklearn.linear_model import LogisticRegression\n        from sklearn.cluster import KMeans\n        t0 = time.time()\n        self.prep.fit(X)\n        Xq = self.prep.transform(X)\n        # işaret noktaları: sınıf başına k-means merkezleri (pozitifler azınlık → dengeli)\n        rng = np.random.default_rng(self.seed)\n        mp = max(2, self.m // 3)\n        Lp = KMeans(min(mp, (y == 1).sum()), n_init=4, random_state=self.seed).fit(Xq[y == 1]).cluster_centers_\n        Ln = KMeans(self.m - len(Lp), n_init=4, random_state=self.seed).fit(Xq[y == 0]).cluster_centers_\n        self.L = np.vstack([Lp, Ln])\n        self.L_states = self.fm.states(self.L)\n        K = self._kernel(Xq)\n        # Nyström normalizasyonu: Φ = K · W^{-1/2}\n        W = np.abs(self.L_states.conj() @ self.L_states.T) ** 2\n        u, s, vt = np.linalg.svd(W)\n        self.W_isqrt = u @ np.diag(1 / np.sqrt(np.maximum(s, 1e-6))) @ vt\n        self.clf = LogisticRegression(C=self.C, class_weight=\"balanced\", max_iter=3000).fit(K @ self.W_isqrt, y)\n        self.timing[\"fit_s\"] = time.time() - t0\n        return self\n\n    def predict_proba_1d(self, X):\n        return self.predict_proba(X)\n\n    def predict_proba(self, X, batch=50000):\n        t0 = time.time()\n        out = np.empty(len(X))\n        for s in range(0, len(X), batch):\n            Xq = self.prep.transform(X[s:s + batch])\n            out[s:s + batch] = self.clf.predict_proba(self._kernel(Xq) @ self.W_isqrt)[:, 1]\n        self.timing[\"predict_s\"] = time.time() - t0\n        return out\n\n\ndef tune_bandwidth(X, y, make, grid=(0.05, 0.1, 0.2, 0.4, 0.7, 1.0), seed=42):\n    \"\"\"İç doğrulama (tabakalı %30) ile bant genişliği/gamma seçimi — kuantum ve klasik çekirdeğe\n    aynı bütçe uygulanır (adil kıyas).\"\"\"\n    from sklearn.model_selection import train_test_split\n    from sklearn.metrics import roc_auc_score\n    Xa, Xb, ya, yb = train_test_split(X, y, test_size=0.3, stratify=y, random_state=seed)\n    scores = {}\n    for bw in grid:\n        try:\n            scores[bw] = roc_auc_score(yb, make(bw).fit(Xa, ya).predict_proba(Xb))\n        except Exception:\n            scores[bw] = np.nan\n    best = max(scores, key=lambda k: -1 if np.isnan(scores[k]) else scores[k])\n    return best, scores\n\n\nclass RBFNystroemClassifier:\n    \"\"\"Adil klasik kıyas: aynı PCA boyutu + aynı işaret noktası sayısıyla RBF Nyström + lojistik.\"\"\"\n\n    def __init__(self, n_dim=6, n_components=32, gamma=0.5, seed=42):\n        self.n_dim, self.m, self.gamma, self.seed = n_dim, n_components, gamma, seed\n\n    def fit(self, X, y):\n        from sklearn.kernel_approximation import Nystroem\n        from sklearn.linear_model import LogisticRegression\n        self.prep = QPrep(self.n_dim).fit(X)\n        Z = self.prep.transform(X)\n        self.ny = Nystroem(gamma=self.gamma, n_components=self.m, random_state=self.seed).fit(Z)\n        self.clf = LogisticRegression(class_weight=\"balanced\", max_iter=3000).fit(self.ny.transform(Z), y)\n        return self\n\n    def predict_proba(self, X):\n        return self.clf.predict_proba(self.ny.transform(self.prep.transform(X)))[:, 1]\n\n\ndef classical_rbf_nystroem(X, y, Xall, n_components=32, seed=42, n_dim=6, gamma=0.5):\n    from sklearn.kernel_approximation import Nystroem\n    from sklearn.linear_model import LogisticRegression\n    prep = QPrep(n_dim).fit(X)\n    ny = Nystroem(gamma=gamma, n_components=n_components, random_state=seed).fit(prep.transform(X))\n    clf = LogisticRegression(class_weight=\"balanced\", max_iter=3000).fit(ny.transform(prep.transform(X)), y)\n    return clf.predict_proba(ny.transform(prep.transform(Xall)))[:, 1]\n\n\n# =============================================================================================\n# 5. VQC (PennyLane, veri yeniden yükleme)\n# =============================================================================================\ndef train_vqc(X, y, n_qubits=6, layers=3, epochs=60, lr=0.05, seed=42, device=\"default.qubit\"):\n    import pennylane as qml\n    from pennylane import numpy as pnp\n    prep = QPrep(n_qubits).fit(X)\n    Xq = prep.transform(X)\n    dev = qml.device(device, wires=n_qubits)\n\n    @qml.qnode(dev, interface=\"autograd\")\n    def circuit(w, x):\n        for l in range(layers):\n            for i in range(n_qubits):\n                qml.RY(x[i], wires=i)\n                qml.Rot(*w[l, i], wires=i)\n            for i in range(n_qubits):\n                qml.CZ(wires=[i, (i + 1) % n_qubits])\n        return qml.expval(qml.PauliZ(0))\n\n    rng = np.random.default_rng(seed)\n    w = pnp.array(rng.normal(0, 0.1, (layers, n_qubits, 3)), requires_grad=True)\n    b = pnp.array(0.0, requires_grad=True)\n    pw = (y == 0).sum() / max((y == 1).sum(), 1)\n    opt = qml.AdamOptimizer(lr)\n    idx_all = np.arange(len(y))\n\n    def loss(w, b, xb, yb):\n        preds = pnp.stack([circuit(w, x) for x in xb]) + b\n        p = 1 / (1 + pnp.exp(-3 * preds))\n        wts = pnp.where(yb == 1, pw, 1.0)\n        return -pnp.mean(wts * (yb * pnp.log(p + 1e-7) + (1 - yb) * pnp.log(1 - p + 1e-7)))\n\n    for ep in range(epochs):\n        bi = rng.choice(idx_all, min(64, len(idx_all)), replace=False)\n        (w, b), _ = opt.step_and_cost(lambda w_, b_: loss(w_, b_, Xq[bi], y[bi]), w, b)\n\n    def predict(Xn):\n        Z = prep.transform(Xn)\n        return np.array([float(circuit(w, x) + b) for x in Z])\n    return predict\n\n\n# =============================================================================================\n# 6. İzleme ağı yerleşimi — QUBO\n# =============================================================================================\ndef build_monitoring_qubo(xy, risk, K, radius=1500.0, lam_red=1.0, penalty=None):\n    \"\"\"Aday noktalardan K tanesini seç: Σ risk_i x_i büyük, yakın çiftlerin (radius içinde)\n    örtüşmesi küçük, Σ x_i = K. Minimizasyon biçiminde QUBO sözlüğü döndürür.\n        E(x) = −Σ r_i x_i + λ Σ_{i<j} o_ij x_i x_j + P (Σ x_i − K)²\"\"\"\n    n = len(risk)\n    r = np.asarray(risk, float); r = r / r.max()\n    D = np.linalg.norm(xy[:, None] - xy[None], axis=-1)\n    O = np.clip(1 - D / radius, 0, 1) * np.sqrt(np.outer(r, r))\n    P = penalty if penalty is not None else 2.0 * r.max() + lam_red\n    Q = {}\n    for i in range(n):\n        Q[(i, i)] = -r[i] + P * (1 - 2 * K)\n    for i in range(n):\n        for j in range(i + 1, n):\n            Q[(i, j)] = lam_red * O[i, j] + 2 * P\n    return Q\n\n\ndef qubo_energy(Q, x):\n    return sum(v * x[i] * x[j] for (i, j), v in Q.items())\n\n\ndef solve_qubo(Q, n, method=\"sa\", reps=200, seed=42, p=2, K=None):\n    \"\"\"method: exact | sa | qaoa | dwave.hybrid | dwave.qpu\"\"\"\n    t0 = time.time()\n    if method == \"exact\":\n        if n > 22:\n            raise ValueError(\"exact yalnızca n ≤ 22\")\n        best = None\n        for bits in itertools.product((0, 1), repeat=n):\n            e = qubo_energy(Q, bits)\n            if best is None or e < best[0]:\n                best = (e, bits)\n        x = np.array(best[1])\n    elif method == \"sa\":\n        from dwave.samplers import SimulatedAnnealingSampler\n        ss = SimulatedAnnealingSampler().sample_qubo(Q, num_reads=reps, seed=seed)\n        x = np.array([ss.first.sample[i] for i in range(n)])\n    elif method == \"qaoa\":\n        x = _qaoa_statevector(Q, n, p=p, seed=seed)\n    elif method.startswith(\"dwave\"):\n        if method == \"dwave.hybrid\":\n            from dwave.system import LeapHybridSampler\n            ss = LeapHybridSampler().sample_qubo(Q)\n        else:\n            from dwave.system import DWaveSampler, EmbeddingComposite\n            ss = EmbeddingComposite(DWaveSampler()).sample_qubo(Q, num_reads=reps)\n        x = np.array([ss.first.sample[i] for i in range(n)])\n    else:\n        raise ValueError(method)\n    return x, qubo_energy(Q, x), time.time() - t0\n\n\ndef _qubo_to_ising_diag(Q, n):\n    \"\"\"QUBO enerjisini tüm 2^n durum için vektör olarak hesapla (statevector QAOA için).\"\"\"\n    dim = 2 ** n\n    bits = ((np.arange(dim)[:, None] >> np.arange(n)[None, ::-1]) & 1).astype(float)\n    E = np.zeros(dim)\n    for (i, j), v in Q.items():\n        E += v * bits[:, i] * bits[:, j]\n    return E, bits\n\n\ndef _qaoa_statevector(Q, n, p=2, seed=42, restarts=6):\n    \"\"\"QAOA (p katman) — kesin durum vektörü simülasyonu, COBYLA ile açı optimizasyonu.\n    Donanım yolu: aynı açılarla Qiskit devresi `qaoa_circuit` üzerinden Executor'a verilir.\"\"\"\n    from scipy.optimize import minimize\n    if n > 20:\n        raise ValueError(\"statevector QAOA n ≤ 20\")\n    E, bits = _qubo_to_ising_diag(Q, n)\n    En = (E - E.min()) / (E.max() - E.min() + 1e-12)\n    dim = 2 ** n\n    rng = np.random.default_rng(seed)\n\n    def state(th):\n        g, b = th[:p], th[p:]\n        psi = np.ones(dim, complex) / np.sqrt(dim)\n        for k in range(p):\n            psi = psi * np.exp(-1j * g[k] * En * np.pi)\n            # karıştırıcı: Π exp(-i b X_i)\n            c, s = np.cos(b[k]), -1j * np.sin(b[k])\n            a = psi.reshape([2] * n)\n            for ax in range(n):\n                a0, a1 = np.take(a, 0, ax), np.take(a, 1, ax)\n                a = np.stack([c * a0 + s * a1, s * a0 + c * a1], axis=ax)\n            psi = a.reshape(dim)\n        return psi\n\n    def cost(th):\n        return float(np.real(np.vdot(state(th), En * state(th))))\n\n    best = None\n    for r in range(restarts):\n        th0 = rng.uniform(0, np.pi / 2, 2 * p)\n        res = minimize(cost, th0, method=\"COBYLA\", options=dict(maxiter=300))\n        if best is None or res.fun < best.fun:\n            best = res\n    probs = np.abs(state(best.x)) ** 2\n    top = np.argsort(-probs)[:64]\n    cand = bits[top]\n    k = int(np.argmin(E[top]))  # en olası 64 durum içinden en düşük enerji (örneklemeye eşdeğer)\n    return cand[k].astype(int)\n\n\ndef qaoa_circuit(Q, n, gammas, betas):\n    \"\"\"Donanım yürütmesi için QAOA devresi (QUBO → Ising: x = (1 − z)/2).\"\"\"\n    from qiskit import QuantumCircuit\n    h = np.zeros(n); J = {}\n    for (i, j), v in Q.items():\n        if i == j:\n            h[i] += -v / 2\n        else:\n            h[i] += -v / 4; h[j] += -v / 4; J[(i, j)] = J.get((i, j), 0) + v / 4\n    qc = QuantumCircuit(n); qc.h(range(n))\n    for g, b in zip(gammas, betas):\n        for i in range(n):\n            qc.rz(2 * g * h[i], i)\n        for (i, j), v in J.items():\n            qc.rzz(2 * g * v, i, j)\n        qc.rx(2 * b, range(n))\n    qc.measure_all()\n    return qc\n"
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "id": "ce89e87d",
   "metadata": {
    "colab": {
     "base_uri": "https://localhost:8080/"
    },
    "id": "ce89e87d",
    "executionInfo": {
     "status": "ok",
     "timestamp": 1791962704625,
     "user_tz": -180,
     "elapsed": 55,
     "user": {
      "displayName": "Joseph Volkan ÖZCAN",
      "userId": "11389530967736397480"
     }
    },
    "outputId": "ed1c65a7-a78b-438f-cf25-0ef9dfd0fa88"
   },
   "outputs": [
    {
     "output_type": "stream",
     "name": "stdout",
     "text": [
      "Writing obruk_engine/interpret.py\n"
     ]
    }
   ],
   "source": "%%writefile obruk_engine/interpret.py\n\"\"\"Yorumlama motoru — jeodezi ve obruk mühendisliği bakışıyla, vatandaşın anlayacağı dilde.\n\nNe üretir?\n  * nokta / hücre yorumu      : risk sınıfı + 4–6 bulgu (yakınlık, yer hareketi, farklı oturma, yeraltı suyu\n                                baskısı, fay, kapalı çukur) + ne yapmalı + \"ne söyleyebiliriz / söyleyemeyiz\"\n  * yerleşim kartları         : OSM köy/mahalle noktaları çevresinde (1–3 km) özet ve sıralama\n  * bölge özeti               : tüm çalışma alanı için düz dilde 1 sayfalık anlatım\n  * kurum notları             : AFAD / belediye / DSİ için teknik öneriler\n\nTasarım ilkeleri\n  1. Tek kaynak: eşikler ve metin şablonları burada tanımlanır; HTML harita arayüzü aynı JSON'u kullanır\n     (Python ile tarayıcıdaki yorum birebir aynıdır).\n  2. Her cümle bir ölçüme ya da literatür bulgusuna dayanır; ölçüm yoksa \"ölçülemedi\" denir, tahmin edilmez.\n  3. Belirsizlik saklanmaz: olasılıklar \"yaklaşık\" ve \"model tahmini\" olarak verilir; kesin tarih/konum verilmez.\n\"\"\"\nfrom __future__ import annotations\n\nimport json\nimport math\n\nimport numpy as np\nimport pandas as pd\n\n# ----------------------------------------------------------------------------------------------\n# Eşikler (tek kaynak — webmap.py bunları JSON olarak tarayıcıya gömer)\n# ----------------------------------------------------------------------------------------------\nTHRESHOLDS = {\n    # Duyarlılık yüzdeliği (çalışma alanındaki tüm hücreler arasında sıra): sınıf sınırları.\n    # Gerekçe: doğrulamada en riskli %10'luk alan, görülmemiş obrukların büyük bölümünü içeriyor.\n    \"risk_pct\": [0.50, 0.80, 0.95, 0.99],\n    \"risk_names\": [\"Çok düşük\", \"Düşük\", \"Orta\", \"Yüksek\", \"Çok yüksek\"],\n    \"risk_colors\": [\"#2f855a\", \"#84a83a\", \"#d69e2e\", \"#dd6b20\", \"#c53030\"],\n    # Yakınlık (km): Gökkaya vd. 2026 — eski obrukların 500 m tamponu yeni obrukların %65'ini içeriyor\n    \"near_km\": 0.5, \"mid_km\": 2.0,\n    # InSAR düşey hız (mm/yıl, negatif = çökme)\n    \"vel_classes\": [-10.0, -30.0, -60.0],\n    # Farklı oturma: açısal bozulma hızı (rad/yıl). Bjerrum (1963) çatlak eşiği ≈ 1/500\n    \"bjerrum_limit\": 1.0 / 500.0, \"tilt_years_max\": 50.0,\n    # Yapılaşmış alan payı: Copernicus DEM bir yüzey modelidir (çatılar dahil); yerleşim içinde kapalı çukur\n    # bulgusu bina aralarından kaynaklanabileceği için gösterilmez\n    \"built_max\": 0.3,\n    # Sulama yoğunluğu (3 km çevrede yaz NDVI > 0,5 sıklığı)\n    \"irr_high\": 0.35, \"irr_mid\": 0.15,\n    # Fay yakınlığı (km) — GEM küresel diri fay haritası (kaba ölçek)\n    \"fault_km\": 3.0,\n    # Kapalı çukur derinliği (m) — 30 m DEM\n    \"depression_m\": 1.0,\n}\n\nGENERAL_ACTIONS = [\n    \"Bilinen bir obruğun kenarına yaklaşmayın: obruk kenarları alttan oyulmuş olabilir ve uyarı vermeden göçebilir.\",\n    \"Yerde yeni dairesel çökme, halka şeklinde çatlak, kuyuda ani su seviyesi değişimi, eğilen direk/çit veya \"\n    \"binada yeni çatlak fark ederseniz yaklaşmayın, çevreyi işaretleyin ve 112 Acil Çağrı Merkezi ile \"\n    \"belediyenize/AFAD'a bildirin.\",\n]\nACTIONS_BY_LEVEL = {\n    0: [\"Olağan dikkat yeterli; yeni yapılarda standart zemin etüdü uygulanır.\"],\n    1: [\"Yeni yapı veya kuyu öncesi zemin etüdünde karstik boşluk ihtimali sorulmalıdır.\"],\n    2: [\"Yeni bina, ahır, depo veya ağır tesis için zemin etüdüne jeofizik tarama (mikrogravite, elektrik \"\n        \"özdirenç veya yeraltı radarı) eklenmesi önerilir.\",\n        \"Tarlada açılan küçük çukurları doldurup geçmeyin; büyüyorsa bildirin.\"],\n    3: [\"Yeni yapılaşma öncesi jeofizik zemin etüdü ve gerekirse sondaj yaptırın.\",\n        \"Yeraltı suyu çekimini azaltacak sulama yöntemleri (damla sulama, su bütçesi) bu bölgede önceliklidir.\",\n        \"Mevcut yapılarda çatlak gelişimini fotoğrafla ve tarihleyerek izleyin.\"],\n    4: [\"Bu hücre bilinen obruk kümelerinin içinde veya hemen yanında: yeni yapılaşma ve yeni kuyu açılması \"\n        \"uzman değerlendirmesi olmadan yapılmamalı.\",\n        \"Yollar, sulama hatları ve hayvan barınakları için düzenli gözle kontrol ve yerel izleme önerilir.\",\n        \"Belediye/AFAD ile paylaşılmak üzere değişiklikleri fotoğraf ve konumla kaydedin.\"],\n}\n\nSAY = [\n    \"Bölgenin hangi kesimlerinin obruk açısından daha riskli olduğunu (göreli sıralama) söyleyebiliriz.\",\n    \"Uydu radarı ve GNSS ile ölçülen geniş alanlı yer çökmesinin hızını söyleyebiliriz.\",\n    \"Yeraltı suyu düşüşü sürerse önümüzdeki 15 yılda bölgede beklenen obruk sayısının büyüklüğünü \"\n    \"(geniş bir aralıkla) söyleyebiliriz.\",\n]\nCANNOT_SAY = [\n    \"Bir obruğun tam olarak nerede ve ne zaman açılacağını söyleyemeyiz.\",\n    \"Belirli bir evin, ahırın veya tarlanın altında boşluk olup olmadığını söyleyemeyiz; bunun için yerinde \"\n    \"jeofizik etüt ve sondaj gerekir.\",\n    \"100 metreden küçük ayrıntıları ve uydu sinyalinin bozulduğu tarlalardaki hareketi göremeyiz.\",\n    \"Kullanılan obruk envanteri eksiktir (açık kaynaktaki 44 obruk; AFAD'ın kaydı 741); harita tam envanter \"\n    \"geldiğinde değişebilir.\",\n]\n\n\ndef set_inventory_size(n: int, official: int = 741):\n    \"\"\"'Söyleyemeyiz' listesindeki envanter cümlesini çalıştırmadaki gerçek sayıyla güncelle.\"\"\"\n    CANNOT_SAY[3] = (f\"Kullanılan obruk envanteri eksiktir (bu çalıştırmada {n} obruk; AFAD'ın kaydı {official}); \"\n                     \"harita tam envanter geldiğinde değişebilir.\")\n\nTEMPLATES = {\n    \"proximity_near\": \"En yakın bilinen obruk yaklaşık {d_m:.0f} m uzakta. Obruklar kümeler hâlinde oluşur: \"\n                      \"Konya'da yeni obrukların yaklaşık üçte ikisi eski bir obruğun 500 m çevresinde açılmıştır.\",\n    \"proximity_mid\": \"En yakın bilinen obruk yaklaşık {d_km:.1f} km uzakta. Bu mesafe obruk kümelerinin etki \"\n                     \"alanının sınırındadır.\",\n    \"proximity_far\": \"En yakın bilinen obruk {d_km:.1f} km uzakta; bilinen obruk kümelerinin dışındasınız.\",\n    \"vel_stable\": \"Uydu radarı (2022–2024) burada belirgin bir yer çökmesi göstermiyor (yılda {v:.0f} mm).\",\n    \"vel_slow\": \"Zemin yılda yaklaşık {v_abs:.0f} mm çöküyor (uydu radarı, 2022–2024). Bu yavaş ve geniş alana yayılan \"\n                \"oturma, yeraltı suyu azaldıkça kil katmanlarının sıkışmasından kaynaklanır.\",\n    \"vel_mid\": \"Zemin yılda yaklaşık {v_abs:.0f} mm çöküyor (uydu radarı, 2022–2024). Bu, yeraltı suyunun belirgin biçimde \"\n               \"azaldığı bir alanın işaretidir; geniş alanlı oturma kendisi obruk değildir ama aynı nedene bağlıdır.\",\n    \"vel_fast\": \"Zemin yılda yaklaşık {v_abs:.0f} mm çöküyor (uydu radarı, 2022–2024): bölgedeki en hızlı çökme sınıfı. \"\n                \"Karapınar'da obruklar çoğunlukla bu hızlı çöken alanların ortasında değil, kenarında açılmıştır.\",\n    \"vel_none\": \"Bu noktada uydu radar ölçümü yapılamadı: tarla ve bitki örtüsü radar sinyalini bozuyor. Bu, hareket \"\n                \"olmadığı anlamına gelmez.\",\n    \"tilt\": \"Komşu noktalar arasındaki çökme farkı, yaklaşık {years:.0f} yılda yapılar için kabul edilen çatlak \"\n            \"eşiğine (1/500 eğim farkı) ulaşacak hızda. Bu, binalarda zamanla çatlak oluşabileceğini gösterir; \"\n            \"100 m ölçekli bir tahmindir.\",\n    \"irr_high\": \"3 km çevredeki arazide yaz sulama oranı yaklaşık %{irr:.0f}. Sulama suyu büyük ölçüde \"\n                \"yeraltından çekilir; su seviyesi düştükçe kireçtaşındaki boşlukların üstündeki toprak desteğini kaybeder.\",\n    \"irr_mid\": \"3 km çevredeki arazide yaz sulama oranı yaklaşık %{irr:.0f}; yeraltı suyu çekim baskısı orta düzeyde.\",\n    \"irr_trend\": \"Bu kesimde yeşil (sulanan) alan 2017'den bu yana artış eğiliminde.\",\n    \"fault\": \"Haritalanmış bir diri faya yaklaşık {f:.1f} km uzaktasınız. Fay zonları boyunca derinden yükselen \"\n             \"karbondioksitli su kireçtaşını daha hızlı eritir; Konya obrukları fay hatları boyunca kümelenir.\",\n    \"depression\": \"Yükseklik modelinde burada yaklaşık {dd:.1f} m derinliğinde kapalı bir çukur görünüyor; eski bir obruk \"\n                  \"ya da yavaş bir çöküntü olabilir (yerinde bakılmalı).\",\n    \"probability\": \"Model, bu noktanın 1 km çevresinde önümüzdeki 1 yıl içinde en az bir obruk açılma olasılığını \"\n                   \"yaklaşık %{p:.1f} olarak tahmin ediyor (göreli gösterge; belirsizliği yüksek).\",\n    \"headline\": \"{level} obruk duyarlılığı. Bu nokta, çalışma alanının en riskli %{top:.0f} dilimi içinde.\",\n    \"headline_low\": \"{level} obruk duyarlılığı. Bu nokta, çalışma alanının daha az riskli kesiminde.\",\n}\n\n\n# ----------------------------------------------------------------------------------------------\n# Yardımcılar\n# ----------------------------------------------------------------------------------------------\ndef _fmt(key: str, **kw) -> str:\n    \"\"\"Şablonu doldur ve ondalık ayırıcıyı Türkçe virgüle çevir (1.5 → 1,5).\"\"\"\n    import re\n    return re.sub(r\"(\\d)\\.(\\d)\", r\"\\1,\\2\", TEMPLATES[key].format(**kw))\n\n\ndef level_of(pct: float) -> int:\n    if pct is None or not np.isfinite(pct):\n        return 0\n    return int(np.searchsorted(THRESHOLDS[\"risk_pct\"], pct, side=\"right\"))\n\n\ndef _f(x):\n    try:\n        x = float(x)\n        return x if math.isfinite(x) else None\n    except (TypeError, ValueError):\n        return None\n\n\ndef interpret_values(v: dict) -> dict:\n    \"\"\"Tek bir nokta için yorum. v anahtarları (eksik olabilir):\n    pct (0–1 duyarlılık yüzdeliği), dist_prior_km, vel_up (mm/yıl), tilt_rate (rad/yıl),\n    irrigation_3km (0–1), ndvi_trend_per_yr, dist_fault_km, dem_depression_depth (m), p1km (0–1).\"\"\"\n    T = THRESHOLDS\n    pct = _f(v.get(\"pct\")) or 0.0\n    lvl = level_of(pct)\n    out = {\"level\": lvl, \"level_name\": T[\"risk_names\"][lvl], \"color\": T[\"risk_colors\"][lvl], \"findings\": []}\n    if lvl >= 2:\n        out[\"headline\"] = _fmt(\"headline\", level=T[\"risk_names\"][lvl], top=max(1.0, (1 - pct) * 100))\n    else:\n        out[\"headline\"] = _fmt(\"headline_low\", level=T[\"risk_names\"][lvl])\n    F = out[\"findings\"]\n    d = _f(v.get(\"dist_prior_km\"))\n    if d is not None:\n        key = \"proximity_near\" if d <= T[\"near_km\"] else \"proximity_mid\" if d <= T[\"mid_km\"] else \"proximity_far\"\n        F.append(dict(topic=\"Obruk mühendisliği · yakınlık\", text=_fmt(key, d_m=d * 1000, d_km=d)))\n    vel = _f(v.get(\"vel_up\"))\n    if vel is None:\n        F.append(dict(topic=\"Jeodezi · yer hareketi\", text=TEMPLATES[\"vel_none\"]))\n    else:\n        c = T[\"vel_classes\"]\n        key = \"vel_stable\" if vel > c[0] else \"vel_slow\" if vel > c[1] else \"vel_mid\" if vel > c[2] else \"vel_fast\"\n        F.append(dict(topic=\"Jeodezi · yer hareketi\", text=_fmt(key, v=vel, v_abs=abs(vel))))\n    tilt = _f(v.get(\"tilt_rate\"))\n    if tilt is not None and tilt > 0:\n        years = T[\"bjerrum_limit\"] / tilt\n        if years <= T[\"tilt_years_max\"]:\n            F.append(dict(topic=\"Jeodezi · farklı oturma\", text=_fmt(\"tilt\", years=years)))\n    irr = _f(v.get(\"irrigation_3km\"))\n    if irr is not None and irr >= T[\"irr_mid\"]:\n        key = \"irr_high\" if irr >= T[\"irr_high\"] else \"irr_mid\"\n        txt = _fmt(key, irr=irr * 100)\n        tr = _f(v.get(\"ndvi_trend_per_yr\"))\n        if tr is not None and tr > 0.005:\n            txt += \" \" + TEMPLATES[\"irr_trend\"]\n        F.append(dict(topic=\"Hidrojeoloji · yeraltı suyu baskısı\", text=txt))\n    fk = _f(v.get(\"dist_fault_km\"))\n    if fk is not None and fk <= T[\"fault_km\"]:\n        F.append(dict(topic=\"Jeoloji · fay\", text=_fmt(\"fault\", f=fk)))\n    dd = _f(v.get(\"dem_depression_depth\"))\n    built = _f(v.get(\"lc_built\"))\n    if dd is not None and dd >= T[\"depression_m\"] and (built is None or built < T[\"built_max\"]):\n        F.append(dict(topic=\"Topoğrafya · kapalı çukur\", text=_fmt(\"depression\", dd=dd)))\n    p = _f(v.get(\"p1km\"))\n    if p is not None and lvl >= 2:\n        F.append(dict(topic=\"Model · olasılık\", text=_fmt(\"probability\", p=p * 100)))\n    out[\"actions\"] = ACTIONS_BY_LEVEL[lvl] + GENERAL_ACTIONS\n    out[\"can_say\"], out[\"cannot_say\"] = SAY, CANNOT_SAY\n    return out\n\n\ndef to_text(card: dict) -> str:\n    lines = [card[\"headline\"], \"\"]\n    for f in card[\"findings\"]:\n        lines.append(f\"• {f['topic']}: {f['text']}\")\n    lines += [\"\", \"Ne yapmalı?\"] + [f\"  – {a}\" for a in card[\"actions\"]]\n    return \"\\n\".join(lines)\n\n\n# ----------------------------------------------------------------------------------------------\n# Izgara türevleri (yorum için gerekli ek katmanlar)\n# ----------------------------------------------------------------------------------------------\ndef add_interpretation_layers(R):\n    \"\"\"Tabloya yüzdelik, farklı oturma hızı ve 1 km çevre olasılığı ekler.\"\"\"\n    from scipy.ndimage import gaussian_filter\n    g, df = R[\"grid\"], R[\"table\"]\n    df[\"sus_pct\"] = df[\"susceptibility\"].rank(pct=True)\n    # farklı oturma: düşey hız alanı (yoksa yükselen LOS/cos ~ düşey kabul edilmez → yalnız vel_up)\n    if \"vel_up\" in g.layers:\n        v = g.layers[\"vel_up\"].astype(\"float32\")\n        m = np.isfinite(v).astype(\"float32\")\n        num = gaussian_filter(np.nan_to_num(v), 1.5); den = gaussian_filter(m, 1.5)\n        vs = np.where(den > 0.5, num / np.maximum(den, 1e-6), np.nan)\n        gy, gx = np.gradient(vs, g.res * 1000.0)  # mm/yıl / mm = rad/yıl\n        tilt = np.hypot(gx, gy)\n        tilt[~np.isfinite(v)] = np.nan\n        g.layers[\"tilt_rate\"] = tilt.astype(\"float32\")\n        df[\"tilt_rate\"] = tilt[df.row.values, df.col.values]\n    # 1 km çevrede 1 yılda ≥1 obruk olasılığı (Poisson, λ toplamı)\n    if \"exp_annual_events\" in df:\n        lam = np.zeros(g.shape, \"float32\"); lam[df.row.values, df.col.values] = df[\"exp_annual_events\"].values\n        r = int(round(1000 / g.res))\n        yy, xx = np.mgrid[-r:r + 1, -r:r + 1]\n        k = (xx ** 2 + yy ** 2 <= r * r).astype(\"float32\")\n        from scipy.signal import fftconvolve\n        lam1 = fftconvolve(lam, k, mode=\"same\")\n        g.layers[\"lam_1km\"] = lam1.astype(\"float32\")\n        df[\"p1km\"] = 1 - np.exp(-np.clip(lam1[df.row.values, df.col.values], 0, None))\n    return df\n\n\ndef interpret_cell(R, row: int, col: int) -> dict:\n    df = R[\"table\"]\n    s = df[(df.row == row) & (df.col == col)]\n    if s.empty:\n        return {\"headline\": \"Bu nokta çalışma alanı dışında veya su yüzeyi.\", \"findings\": [], \"actions\": []}\n    s = s.iloc[0]\n    v = {k: s.get(k) for k in (\"dist_prior_km\", \"vel_up\", \"tilt_rate\", \"irrigation_3km\", \"ndvi_trend_per_yr\",\n                               \"dist_fault_km\", \"dem_depression_depth\", \"p1km\", \"lc_built\")}\n    v[\"pct\"] = s.get(\"sus_pct\")\n    return interpret_values(v)\n\n\ndef interpret_lonlat(R, lon, lat):\n    from . import features as Fm\n    p = Fm.to_utm(pd.DataFrame(dict(lon=[lon], lat=[lat])))\n    r, c = R[\"grid\"].rc(p.x.values, p.y.values)\n    return interpret_cell(R, int(r[0]), int(c[0]))\n\n\n# ----------------------------------------------------------------------------------------------\n# Yerleşim kartları\n# ----------------------------------------------------------------------------------------------\ndef settlement_cards(R, places: pd.DataFrame, radius_m=1000.0, scen_bau_total=None, scen_stab_total=None):\n    \"\"\"places: name, lat, lon, place. Her yerleşim için çevre istatistikleri + yorum kartı.\n    15 yıllık beklenen sayılar: senaryo toplamı × AOI payı × (yerleşim çevresinin ağırlık payı).\"\"\"\n    from scipy.spatial import cKDTree\n    from . import features as Fm\n    df = R[\"table\"]\n    if places is None or len(places) == 0:\n        return pd.DataFrame()\n    P = Fm.to_utm(places.copy())\n    tree = cKDTree(df[[\"x\", \"y\"]].values)\n    inv = R.get(\"inventory\")\n    sk_tree = cKDTree(inv[[\"x\", \"y\"]].values) if inv is not None and len(inv) else None\n    w = np.nan_to_num(df[\"exp_annual_events\"].values); wsum = w.sum() or 1.0\n    aoi_frac = 572 / 741\n    rows = []\n    for _, p in P.iterrows():\n        idx = tree.query_ball_point([p.x, p.y], r=radius_m)\n        if not idx:\n            continue\n        sub = df.iloc[idx]\n        idx3 = tree.query_ball_point([p.x, p.y], r=3000)\n        sub3 = df.iloc[idx3]\n        v = dict(pct=float(np.nanpercentile(sub.sus_pct, 90)),\n                 dist_prior_km=(float(sk_tree.query([p.x, p.y])[0]) / 1000.0) if sk_tree is not None\n                 else float(np.nanmin(sub.dist_prior_km)),\n                 vel_up=float(np.nanmedian(sub.vel_up)) if \"vel_up\" in sub and np.isfinite(sub.vel_up).any() else None,\n                 tilt_rate=float(np.nanpercentile(sub.tilt_rate, 90)) if \"tilt_rate\" in sub and np.isfinite(sub.tilt_rate).any() else None,\n                 irrigation_3km=float(np.nanmean(sub3.irrigated_freq)) if \"irrigated_freq\" in sub3 else None,\n                 ndvi_trend_per_yr=float(np.nanmean(sub3.ndvi_trend_per_yr)) if \"ndvi_trend_per_yr\" in sub3 else None,\n                 dist_fault_km=float(np.nanmin(sub.dist_fault_km)) if \"dist_fault_km\" in sub else None,\n                 dem_depression_depth=float(np.nanmax(sub.dem_depression_depth)) if \"dem_depression_depth\" in sub else None,\n                 lc_built=float(np.nanmean(sub.lc_built)) if \"lc_built\" in sub else None,\n                 p1km=float(1 - np.exp(-np.nansum(sub.exp_annual_events))))\n        card = interpret_values(v)\n        share = float(np.nansum(sub.exp_annual_events) / wsum)\n        rows.append(dict(name=p.get(\"name\", \"\"), place=p.get(\"place\", \"\"), lat=p.lat, lon=p.lon,\n                         level=card[\"level\"], level_name=card[\"level_name\"], color=card[\"color\"],\n                         pct90=v[\"pct\"], nearest_sinkhole_km=v[\"dist_prior_km\"], vel_up=v[\"vel_up\"],\n                         p1km_1yr=v[\"p1km\"],\n                         exp15_bau=None if scen_bau_total is None else scen_bau_total * aoi_frac * share,\n                         exp15_stab=None if scen_stab_total is None else scen_stab_total * aoi_frac * share,\n                         card=card))\n    out = pd.DataFrame(rows).sort_values([\"level\", \"pct90\"], ascending=False).reset_index(drop=True)\n    return out\n\n\n# ----------------------------------------------------------------------------------------------\n# Bölge özeti ve kurum notları\n# ----------------------------------------------------------------------------------------------\ndef regional_summary(R, settlements: pd.DataFrame | None = None) -> dict:\n    df, cv = R[\"table\"], R[\"cv\"]\n    g = R[\"grid\"]\n    vel = g.layers.get(\"vel_up\")\n    vmin = float(np.nanpercentile(vel, 1)) if vel is not None else None\n    summ = R[\"phys_summary\"]\n    bau = summ.loc[[i for i in summ.index if i.startswith(\"Mevcut\")][0]]\n    stab = summ.loc[[i for i in summ.index if i.startswith(\"Stabil\")][0]]\n    ens = cv.loc[\"ensemble\"] if \"ensemble\" in cv.index else cv.iloc[0]\n    n_hi = int((df.sus_pct >= THRESHOLDS[\"risk_pct\"][3]).sum()) * (R[\"cfg\"].grid_res_m / 1000) ** 2\n    paras = [\n        \"Karapınar'da obruklar, kireçtaşı içinde yeraltı suyunun binlerce yılda açtığı boşlukların üstündeki toprak \"\n        \"örtünün, yeraltı suyu çekildikçe desteğini kaybedip aniden çökmesiyle oluşur. Bu nedenle obrukların \"\n        \"sayısı, sulama için yeraltı suyunun yoğun çekildiği 2000'lerden sonra hızla artmıştır.\",\n        f\"Uydu radar ölçümlerine göre (2022–2024) bölgenin en hızlı çöken kesiminde zemin yılda yaklaşık \"\n        f\"{abs(vmin):.0f} mm alçalıyor. Bu geniş alanlı oturma doğrudan obruk değildir; yeraltı suyunun azaldığını gösteren bir \"\n        \"belirtidir. Obruklar çoğunlukla hızlı çöken alanların kenarında açılmıştır.\" if vmin is not None else \"\",\n        f\"Risk haritasının en riskli %10'luk kesimi, modelin eğitimde görmediği bölgelerdeki obrukların yaklaşık \"\n        f\"%{ens['cap@10%'] * 100:.0f} kadarını içine aldı. En yüksek risk sınıfı (tanım gereği alanın %1'i, yaklaşık {n_hi:.0f} km²) \"\n        \"bilinen obruk kümelerinin çevresinde toplanıyor.\",\n        f\"Yeraltı suyu bugünkü hızla (yılda yaklaşık 1 m) düşmeye devam ederse Konya havzasında 2026–2040 arasında \"\n        f\"yaklaşık {bau.total_2026_2040:.0f} (olası aralık {bau.lo:.0f}–{bau.hi:.0f}) yeni obruk bekleniyor. Düşüş \"\n        f\"durdurulursa beklenen sayı yaklaşık {stab.total_2026_2040:.0f} (olası aralık {stab.lo:.0f}–{stab.hi:.0f}). \"\n        \"Bu fark, su seviyesi sabitlendiğinde boşlukların büyümesinin ne kadar yavaşlayacağına ilişkin henüz \"\n        \"doğrulanmamış bir varsayıma dayanır.\",\n    ]\n    if settlements is not None and len(settlements):\n        top = settlements.head(5)\n        names = \", \".join(f\"{r['name']}\" for _, r in top.iterrows() if r[\"name\"])\n        if names:\n            paras.append(f\"Çevresinde (1 km) en yüksek risk görülen yerleşimler: {names}. Bu sıralama göreli bir \"\n                         \"önceliklendirmedir; yerinde inceleme yerine geçmez.\")\n    return {\"paragraphs\": [p for p in paras if p], \"can_say\": SAY, \"cannot_say\": CANNOT_SAY}\n\n\nINSTITUTION_NOTES = [\n    (\"AFAD / Valilik\", \"Çok yüksek ve yüksek sınıftaki yerleşimler için yerinde gözlem programı; obruk \"\n     \"envanterinin (tarih, çap, derinlik, koordinat) açık ve makine okunur biçimde güncellenmesi motorun \"\n     \"doğruluğunu en çok artıracak adımdır.\"),\n    (\"Belediye / İl Özel İdaresi\", \"Yüksek sınıflarda imar ve yapı izni süreçlerinde jeofizik zemin etüdü şartı; \"\n     \"yol ve altyapı hatlarında periyodik kontrol.\"),\n    (\"DSİ\", \"Gözlem kuyusu seviyelerinin paylaşılması ve ruhsatsız kuyu çekiminin azaltılması; motor su düşüşü \"\n     \"durduğunda 15 yıllık beklenen obruk sayısının yaklaşık üçte bire indiğini öngörüyor (varsayıma duyarlı).\"),\n    (\"HGM / TKGM\", \"KAP1/KAPN çevresinde TUSAGA-Aktif ve yeni GNSS noktalarıyla uydu radar hızlarının \"\n     \"doğrulanması; önerilen 5 izleme noktasına köşe yansıtıcı veya GNSS kurulması.\"),\n]\n\n\ndef thresholds_json() -> str:\n    return json.dumps(dict(T=THRESHOLDS, TPL=TEMPLATES, ACT=ACTIONS_BY_LEVEL, GEN=GENERAL_ACTIONS,\n                           SAY=SAY, CANNOT=CANNOT_SAY), ensure_ascii=False)\n"
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "id": "1068b5a2",
   "metadata": {
    "colab": {
     "base_uri": "https://localhost:8080/"
    },
    "id": "1068b5a2",
    "executionInfo": {
     "status": "ok",
     "timestamp": 1791962704638,
     "user_tz": -180,
     "elapsed": 13,
     "user": {
      "displayName": "Joseph Volkan ÖZCAN",
      "userId": "11389530967736397480"
     }
    },
    "outputId": "3ea77c93-eca8-49da-f257-d88442a64bd2"
   },
   "outputs": [
    {
     "output_type": "stream",
     "name": "stdout",
     "text": [
      "Writing obruk_engine/webmap.py\n"
     ]
    }
   ],
   "source": "%%writefile obruk_engine/webmap.py\n\"\"\"Katmanlı HTML harita arayüzü (tek dosya, çevrimdışı açılabilir).\n\nLeaflet (cdnjs) + gömülü PNG katmanlar + gömülü değer ızgarası. Tarayıcıdaki \"tıkla-yorumla\" işlevi,\ninterpret.py'deki eşik ve şablonları JSON olarak kullanır; Python ve tarayıcı aynı yorumu üretir.\n\nKatmanlar\n  Altlık    : arazi gölgesi (yerel, her zaman çalışır) · OpenStreetMap · uydu görüntüsü (Esri) — son ikisi internet ister\n  Raster    : obruk risk sınıfı · 1 km çevrede 1 yıllık olasılık · düşey yer hareketi (InSAR) · farklı oturma ·\n              sulama sıklığı · kuantum çekirdek skoru\n  Vektör    : bilinen obruklar · diri faylar · yerleşimler (yorum kartlı) · önerilen izleme noktaları · GNSS · çalışma alanı\nSekmeler    : Nokta yorumu · Yerleşimler · Bölge özeti · Kurumlar · Teknik\n\"\"\"\nfrom __future__ import annotations\n\nimport base64\nimport io\nimport json\nfrom datetime import datetime\nfrom pathlib import Path\n\nimport numpy as np\nimport pandas as pd\n\nfrom . import interpret as I\n\nASSETS = Path(__file__).parent / \"assets\"\n\n\n# ----------------------------------------------------------------------------------------------\n# Yardımcılar: EPSG:3857 ızgarası, PNG kodlama\n# ----------------------------------------------------------------------------------------------\ndef _merc_grid(cfg, res=100.0):\n    from pyproj import Transformer\n    from rasterio.transform import from_origin\n    T = Transformer.from_crs(4326, 3857, always_xy=True)\n    w, s, e, n = cfg.aoi.bbox\n    x0, y0 = T.transform(w, s); x1, y1 = T.transform(e, n)\n    W = int(np.ceil((x1 - x0) / res)); H = int(np.ceil((y1 - y0) / res))\n    # bounds3857 = (sol, alt, sağ, üst); raster kökeni sol-üst (x0, y1)\n    return dict(tr=from_origin(x0, y1, res, res), W=W, H=H, bounds3857=(x0, y1 - H * res, x0 + W * res, y1),\n                latlon_bounds=[[s, w], [n, e]], res=res)\n\n\ndef _to_merc(arr, src_tr, src_crs, M, resampling=\"average\"):\n    from rasterio.warp import reproject, Resampling\n    out = np.full((M[\"H\"], M[\"W\"]), np.nan, \"float32\")\n    reproject(np.asarray(arr, \"float32\"), out, src_transform=src_tr, src_crs=src_crs, dst_transform=M[\"tr\"],\n              dst_crs=\"EPSG:3857\", resampling=getattr(Resampling, resampling), src_nodata=np.nan, dst_nodata=np.nan)\n    return out\n\n\ndef _latlon_bounds_of(M):\n    from pyproj import Transformer\n    T = Transformer.from_crs(3857, 4326, always_xy=True)\n    x0, y0, x1, y1 = M[\"bounds3857\"]\n    lo0, la0 = T.transform(x0, y0); lo1, la1 = T.transform(x1, y1)\n    return [[la0, lo0], [la1, lo1]]\n\n\ndef _png(rgba):\n    from PIL import Image\n    b = io.BytesIO()\n    Image.fromarray(np.ascontiguousarray(rgba)).save(b, format=\"PNG\", optimize=True)\n    return \"data:image/png;base64,\" + base64.b64encode(b.getvalue()).decode()\n\n\ndef _cmap_rgba(a, cmap, vmin, vmax, alpha=0.8, mask=None, log=False):\n    import matplotlib\n    cm = matplotlib.colormaps[cmap]\n    x = np.array(a, float)\n    if log:\n        x = np.log10(np.clip(x, 10 ** vmin, None));\n    t = np.clip((x - vmin) / (vmax - vmin), 0, 1)\n    rgba = (cm(np.nan_to_num(t)) * 255).astype(\"uint8\")\n    al = np.where(np.isfinite(a), int(alpha * 255), 0)\n    if mask is not None:\n        al = np.where(mask, al, 0)\n    rgba[..., 3] = al\n    return rgba\n\n\ndef _hex_rgb(h):\n    h = h.lstrip(\"#\")\n    return tuple(int(h[i:i + 2], 16) for i in (0, 2, 4))\n\n\ndef _classes_rgba(cls, colors, alpha=0.72, transparent_class0=True):\n    H, W = cls.shape\n    rgba = np.zeros((H, W, 4), \"uint8\")\n    for k, c in enumerate(colors):\n        m = cls == k\n        rgba[m, :3] = _hex_rgb(c)\n        rgba[m, 3] = 0 if (k == 0 and transparent_class0) else int(alpha * 255)\n    return rgba\n\n\ndef _clean(o):\n    \"\"\"JSON için: NumPy türlerini Python'a, NaN/inf değerlerini null'a çevir.\"\"\"\n    if isinstance(o, dict):\n        return {str(k): _clean(v) for k, v in o.items()}\n    if isinstance(o, (list, tuple)):\n        return [_clean(v) for v in o]\n    if isinstance(o, (np.bool_, bool)):\n        return bool(o)\n    if isinstance(o, (np.integer,)):\n        return int(o)\n    if isinstance(o, (np.floating, float)):\n        return float(o) if np.isfinite(o) else None\n    return o\n\n\ndef _b64_typed(arr, dtype):\n    return base64.b64encode(np.ascontiguousarray(arr.astype(dtype)).tobytes()).decode()\n\n\n# ----------------------------------------------------------------------------------------------\n# Veri paketini hazırla\n# ----------------------------------------------------------------------------------------------\ndef build_payload(R, settlements: pd.DataFrame | None, hub=None, value_res=200.0):\n    from pyproj import Transformer\n    cfg, g, df = R[\"cfg\"], R[\"grid\"], R[\"table\"]\n    M = _merc_grid(cfg, 100.0)\n    MV = _merc_grid(cfg, value_res)\n\n    def layer_from_df(col):\n        a = np.full(g.shape, np.nan, \"float32\")\n        if col in df:\n            a[df.row.values, df.col.values] = df[col].values\n        return a\n\n    L = {}\n    # risk sınıfı\n    pct = _to_merc(layer_from_df(\"sus_pct\"), g.transform, g.crs, M, \"average\")\n    cls = np.searchsorted(np.array(I.THRESHOLDS[\"risk_pct\"]), np.nan_to_num(pct, nan=-1), side=\"right\")\n    cls = np.where(np.isfinite(pct), cls, -1)\n    names = list(I.THRESHOLDS[\"risk_names\"]); names[0] = names[0] + \" (renksiz)\"\n    L[\"risk\"] = dict(name=\"Obruk risk sınıfı\", group=\"Risk\", img=_png(_classes_rgba(cls, I.THRESHOLDS[\"risk_colors\"])),\n                     legend=dict(kind=\"classes\", items=list(zip(names, I.THRESHOLDS[\"risk_colors\"]))),\n                     note=\"Duyarlılık yüzdeliği: Çok yüksek = alanın en riskli %1'i; Yüksek = %1–5; Orta = %5–20.\",\n                     on=True)\n    # 1 km çevrede 1 yıllık olasılık\n    if \"p1km\" in df:\n        p1 = _to_merc(layer_from_df(\"p1km\"), g.transform, g.crs, M, \"average\")\n        L[\"p1km\"] = dict(name=\"1 km çevrede 1 yılda obruk olasılığı\", group=\"Risk\",\n                         img=_png(_cmap_rgba(p1, \"YlOrRd\", -3, -0.5, 0.75, mask=p1 > 1e-3, log=True)),\n                         legend=dict(kind=\"ramp\", colors=[\"#ffffcc\", \"#fd8d3c\", \"#800026\"], labels=[\"%0,1\", \"%3\", \"%30+\"]),\n                         note=\"Model tahmini; göreli gösterge olarak okunmalı.\", on=False)\n    # InSAR düşey hız\n    if \"vel_up\" in g.layers:\n        v = _to_merc(g.layers[\"vel_up\"], g.transform, g.crs, M, \"average\")\n        L[\"vel\"] = dict(name=\"Düşey yer hareketi 2022–24 (mm/yıl)\", group=\"Jeodezi\",\n                        img=_png(_cmap_rgba(v, \"RdBu\", -100, 100, 0.8)),\n                        legend=dict(kind=\"ramp\", colors=[\"#67001f\", \"#f7f7f7\", \"#053061\"], labels=[\"−100\", \"0\", \"+100\"]),\n                        note=\"COMET-LiCSAR SBAS, yükselen + alçalan ayrıştırma. Boş alanlar: tarımsal dekorelasyon.\",\n                        on=False)\n    if \"tilt_rate\" in g.layers:\n        t = _to_merc(g.layers[\"tilt_rate\"], g.transform, g.crs, M, \"average\")\n        yrs = I.THRESHOLDS[\"bjerrum_limit\"] / np.where(t > 0, t, np.nan)\n        cls_t = np.full(t.shape, -1); cls_t[yrs <= 50] = 1; cls_t[yrs <= 25] = 2; cls_t[yrs <= 10] = 3\n        L[\"tilt\"] = dict(name=\"Farklı oturma: 1/500 eşiğine kalan süre\", group=\"Jeodezi\",\n                         img=_png(_classes_rgba(cls_t, [\"#000000\", \"#f6e05e\", \"#ed8936\", \"#c53030\"], 0.75)),\n                         legend=dict(kind=\"classes\", items=[[\"25–50 yıl\", \"#f6e05e\"], [\"10–25 yıl\", \"#ed8936\"], [\"10 yıldan az\", \"#c53030\"]]),\n                         note=\"Bjerrum (1963) açısal bozulma sınırı 1/500; 100 m ölçekte, yapı tasarımı için kullanılamaz.\",\n                         on=False)\n    if \"irrigated_freq\" in g.layers:\n        ir = _to_merc(g.layers[\"irrigated_freq\"], g.transform, g.crs, M, \"average\")\n        L[\"irr\"] = dict(name=\"Yaz sulama sıklığı 2017–25\", group=\"Hidrojeoloji\",\n                        img=_png(_cmap_rgba(ir, \"Greens\", 0.05, 1.0, 0.75, mask=ir > 0.05)),\n                        legend=dict(kind=\"ramp\", colors=[\"#e5f5e0\", \"#74c476\", \"#00441b\"], labels=[\"%5\", \"%50\", \"%100\"]),\n                        note=\"Sentinel-2 yaz NDVI > 0,5 olan yılların oranı; yeraltı suyu çekim baskısı vekili.\", on=False)\n    if \"q_susceptibility\" in df:\n        q = _to_merc(layer_from_df(\"q_susceptibility\"), g.transform, g.crs, M, \"average\")\n        qr = pd.Series(q.ravel()).rank(pct=True).values.reshape(q.shape)\n        L[\"quantum\"] = dict(name=\"Kuantum çekirdek skoru (teknik)\", group=\"Teknik\",\n                            img=_png(_cmap_rgba(qr, \"viridis\", 0.5, 1.0, 0.7, mask=qr > 0.5)),\n                            legend=dict(kind=\"ramp\", colors=[\"#440154\", \"#21918c\", \"#fde725\"], labels=[\"%50\", \"%75\", \"%100\"]),\n                            note=\"6 kübit Nyström kuantum çekirdeği; klasik modellerle kıyas amaçlı.\", on=False)\n    # altlık: arazi gölgesi\n    base = None\n    if \"elev\" in g.layers:\n        from . import imaging as im\n        e = _to_merc(g.layers[\"elev\"], g.transform, g.crs, M, \"bilinear\")\n        hs = im.hillshade(np.where(np.isfinite(e), e, np.nanmean(e)), M[\"res\"] * 0.8)\n        grey = (180 + 70 * (hs - 0.5)).clip(0, 255).astype(\"uint8\")\n        rgba = np.stack([grey, grey, (grey * 0.98).astype(\"uint8\"), np.full_like(grey, 255)], -1)\n        base = _png(rgba)\n\n    # değer ızgarası (tıkla-yorumla)\n    vals = {}\n    for key, col, scale, dt, src in [\n        (\"pct\", \"sus_pct\", 250, \"uint8\", \"df\"), (\"dprior\", \"dist_prior_km\", 100, \"uint16\", \"df\"),\n        (\"vel\", \"vel_up\", 10, \"int16\", \"grid\"), (\"tilt\", \"tilt_rate\", 1e7, \"uint16\", \"grid\"),\n        (\"irr3\", \"irrigation_3km\", 250, \"uint8\", \"grid\"), (\"trend\", \"ndvi_trend_per_yr\", 10000, \"int16\", \"grid\"),\n        (\"fault\", \"dist_fault_km\", 100, \"uint16\", \"grid\"), (\"dep\", \"dem_depression_depth\", 10, \"uint16\", \"grid\"),\n        (\"p1\", \"p1km\", 10000, \"uint16\", \"df\"), (\"built\", \"lc_built\", 250, \"uint8\", \"grid\")]:\n        a = layer_from_df(col) if src == \"df\" else g.layers.get(col)\n        if a is None:\n            continue\n        m = _to_merc(a, g.transform, g.crs, MV, \"average\")\n        info = np.iinfo(dt)\n        nod = info.max if info.min == 0 else info.min\n        q = np.where(np.isfinite(m), np.clip(np.round(m * scale), info.min + (0 if info.min == 0 else 1), info.max - 1), nod)\n        vals[key] = dict(b64=_b64_typed(q, dt), dtype=dt, scale=scale, nodata=int(nod))\n\n    # vektörler\n    T = Transformer.from_crs(g.crs, 4326, always_xy=True)\n    sk = R[\"inventory\"]\n    sinks = [dict(lat=float(r.lat), lon=float(r.lon), name=str(r.get(\"name\", \"\") or \"\"),\n                  d=None if not np.isfinite(r.get(\"diameter_m\", np.nan)) else round(float(r.diameter_m)))\n             for _, r in sk.iterrows()]\n    faults = None\n    if hub is not None:\n        try:\n            fa = hub.gem_faults()\n            if fa is not None and len(fa):\n                faults = json.loads(fa[[\"geometry\"]].to_json())\n        except Exception:\n            faults = None\n    qb = R.get(\"qubo\", {})\n    mon = []\n    if qb and qb.get(\"solutions\"):\n        best = qb[\"results\"].sort_values(\"energy\").iloc[0].method\n        x = np.asarray(qb[\"solutions\"][best]).astype(int)\n        for (cx, cy, mass), sel in zip(qb[\"cand\"], x):\n            lo, la = T.transform(cx, cy)\n            mon.append(dict(lat=la, lon=lo, sel=int(sel), mass=round(float(mass), 3)))\n    from .integration import NGL_STATIONS\n    gn = R.get(\"gnss\", {})\n    gnss = [dict(name=k, lat=v[0], lon=v[1], up=gn.get(k, {}).get(\"up\"), period=f\"{gn.get(k, {}).get('start', '')} → {gn.get(k, {}).get('end', '')}\")\n            for k, v in NGL_STATIONS.items() if k.startswith(\"KAP\")]\n    sett = []\n    if settlements is not None and len(settlements):\n        for _, r in settlements.iterrows():\n            sett.append(dict(name=r[\"name\"] or \"(adsız)\", place=r[\"place\"], lat=r.lat, lon=r.lon, level=int(r.level),\n                             pct=round(float(r.pct90), 3), dk=None if r.nearest_sinkhole_km is None else round(float(r.nearest_sinkhole_km), 2),\n                             vel=None if r.vel_up is None or not np.isfinite(r.vel_up) else round(float(r.vel_up), 1),\n                             p1=round(float(r.p1km_1yr), 4),\n                             e15=None if r.exp15_bau is None else round(float(r.exp15_bau), 2),\n                             e15s=None if r.exp15_stab is None else round(float(r.exp15_stab), 2),\n                             card=r.card))\n    # özetler\n    cv = R[\"cv\"]\n    keep = [m for m in [\"ensemble\", \"lgbm\", \"rf\", \"logreg\", \"proximity\", \"rbf_nystroem\", \"q_kernel\"] if m in cv.index]\n    names = dict(ensemble=\"Topluluk (yakınlık + öğrenen)\", lgbm=\"LightGBM\", rf=\"Random Forest\", logreg=\"Lojistik regresyon\",\n                 proximity=\"Yakınlık taban çizgisi\", rbf_nystroem=\"Klasik çekirdek (RBF)\", q_kernel=\"Kuantum çekirdek (6 kübit)\")\n    cvt = [dict(model=names.get(m, m), auc=round(float(cv.loc[m, \"auc\"]), 3), lo=round(float(cv.loc[m, \"auc_lo\"]), 3),\n                hi=round(float(cv.loc[m, \"auc_hi\"]), 3), c1=round(float(cv.loc[m, \"cap@1%\"]), 3),\n                c5=round(float(cv.loc[m, \"cap@5%\"]), 3), c10=round(float(cv.loc[m, \"cap@10%\"]), 3)) for m in keep]\n    ps = R[\"phys_summary\"].reset_index()\n    scen = [dict(name=r.scenario, mean=float(r.total_2026_2040), lo=float(r.lo), hi=float(r.hi)) for _, r in ps.iterrows()]\n    hw = R[\"hw_readiness\"].to_dict(\"records\")\n    reg = I.regional_summary(R, settlements)\n    meta = dict(run=datetime.now().strftime(\"%Y-%m-%d %H:%M\"), n_cells=int(len(df)), n_inv=int(len(sk)),\n                grid=R[\"cfg\"].grid_res_m, lam2026=round(float(R.get(\"lam_aoi_2026\", np.nan)), 1),\n                best=R.get(\"best_learner\", \"\"), aoi=list(cfg.aoi.bbox))\n    return dict(meta=meta, base=base, layers=L, bounds=_latlon_bounds_of(M), vgrid=dict(\n        x0=MV[\"bounds3857\"][0], y1=MV[\"bounds3857\"][3], res=MV[\"res\"], W=MV[\"W\"], H=MV[\"H\"], vals=vals),\n        sinks=sinks, faults=faults, mon=mon, gnss=gnss, sett=sett, cv=cvt, scen=scen, hw=hw, reg=reg,\n        inst=I.INSTITUTION_NOTES, rules=json.loads(I.thresholds_json()))\n\n\n# ----------------------------------------------------------------------------------------------\n# HTML\n# ----------------------------------------------------------------------------------------------\ndef build_webmap(R, settlements=None, path=None, hub=None):\n    P = build_payload(R, settlements, hub)\n    css = (ASSETS / \"leaflet.min.css\").read_text() if (ASSETS / \"leaflet.min.css\").exists() else \"\"\n    html = HTML_TEMPLATE.replace(\"/*LEAFLET_CSS*/\", css).replace(\"__PAYLOAD__\", json.dumps(_clean(P), ensure_ascii=False, allow_nan=False))\n    path = Path(path or R[\"cfg\"].outputs / \"KOBRA_harita.html\")\n    path.write_text(html, encoding=\"utf-8\")\n    return path\n\n\nHTML_TEMPLATE = r\"\"\"<!doctype html>\n<html lang=\"tr\"><head><meta charset=\"utf-8\"><meta name=\"viewport\" content=\"width=device-width,initial-scale=1,viewport-fit=cover\">\n<title>KOBRA Obruk Haritası</title>\n<link rel=\"preconnect\" href=\"https://fonts.googleapis.com\"><link rel=\"preconnect\" href=\"https://fonts.gstatic.com\" crossorigin>\n<link rel=\"stylesheet\" href=\"https://fonts.googleapis.com/css2?family=Barlow+Condensed:wght@500;600;700&family=IBM+Plex+Sans:wght@400;500;600&family=IBM+Plex+Mono:wght@400;500&display=swap\">\n<style>/*LEAFLET_CSS*/</style>\n<style>\n/* Düzen: sol panel (sekme + kartlar) | sağ harita; telefonda harita üstte, panel altta. Arazi etüdü defteri havası:\n   kireçtaşı griliği, yeraltı suyu mavisi-yeşili vurgu, risk renkleri yalnız anlam için. */\n:root{\n  --bg:#eef0ec; --panel:#f8f9f6; --ink:#1d2a2c; --muted:#5b6a6c; --line:#d5dbd6; --accent:#0e6b70; --accent-ink:#ffffff;\n  --chip:#e4e9e5; --shadow:0 1px 2px rgba(20,40,40,.08);\n  --f-display:\"Barlow Condensed\",\"Arial Narrow\",system-ui,sans-serif; --f-body:\"IBM Plex Sans\",system-ui,-apple-system,\"Segoe UI\",sans-serif;\n  --f-mono:\"IBM Plex Mono\",ui-monospace,Menlo,Consolas,monospace;\n}\n@media (prefers-color-scheme: dark){:root:not([data-theme=\"light\"]){\n  --bg:#131a1b; --panel:#1a2324; --ink:#e3ebea; --muted:#9aaaa9; --line:#2d3a3b; --accent:#3fb5b0; --accent-ink:#0b1414;\n  --chip:#243031; --shadow:0 1px 2px rgba(0,0,0,.4); color-scheme:dark}}\n:root[data-theme=\"dark\"]{--bg:#131a1b; --panel:#1a2324; --ink:#e3ebea; --muted:#9aaaa9; --line:#2d3a3b; --accent:#3fb5b0; --accent-ink:#0b1414;\n  --chip:#243031; --shadow:0 1px 2px rgba(0,0,0,.4); color-scheme:dark}\nhtml,body{height:100%;margin:0}\nbody{background:var(--bg);color:var(--ink);font:14px/1.5 var(--f-body)}\n.app{display:grid;grid-template-columns:minmax(320px,420px) 1fr;height:100%}\naside{background:var(--panel);border-right:1px solid var(--line);display:flex;flex-direction:column;min-width:0;min-height:0}\nheader.brand{padding:14px 16px 10px;border-bottom:1px solid var(--line)}\n.brand h1{font:700 24px/1 var(--f-display);letter-spacing:.02em;margin:0;text-wrap:balance}\n.brand p{margin:4px 0 0;color:var(--muted);font-size:12.5px}\nnav.tabs{display:flex;gap:2px;padding:8px 10px 0;border-bottom:1px solid var(--line);overflow-x:auto}\nnav.tabs button{font:600 12.5px var(--f-body);border:0;background:none;color:var(--muted);padding:8px 10px;border-bottom:2px solid transparent;cursor:pointer;white-space:nowrap}\nnav.tabs button[aria-selected=\"true\"]{color:var(--ink);border-bottom-color:var(--accent)}\nnav.tabs button:focus-visible,button:focus-visible,input:focus-visible{outline:2px solid var(--accent);outline-offset:2px}\n.pane{padding:14px 16px 24px;overflow:auto;flex:1;min-height:0}\n.pane h2{font:600 18px/1.2 var(--f-display);letter-spacing:.03em;text-transform:uppercase;margin:0 0 8px;color:var(--muted)}\n.pane h3{font:600 15px/1.3 var(--f-body);margin:14px 0 6px}\n.pane p{margin:0 0 10px;max-width:65ch}\n.lvl{display:inline-flex;align-items:center;gap:6px;font:600 12px var(--f-body);padding:3px 9px;border-radius:999px;color:#fff}\n.headline{font:500 15px/1.4 var(--f-body);margin:8px 0 12px}\n.finding{border-left:3px solid var(--line);padding:2px 0 2px 10px;margin:0 0 10px}\n.finding .t{font:600 11px var(--f-mono);letter-spacing:.04em;text-transform:uppercase;color:var(--muted)}\nul.act{padding-left:18px;margin:6px 0 12px} ul.act li{margin:0 0 6px}\ndetails{border:1px solid var(--line);border-radius:6px;padding:8px 10px;margin:8px 0;background:var(--bg)}\nsummary{cursor:pointer;font-weight:600}\n.empty{color:var(--muted);border:1px dashed var(--line);border-radius:8px;padding:14px}\ntable{border-collapse:collapse;width:100%;font-size:12.5px;font-variant-numeric:tabular-nums}\nth,td{padding:5px 6px;border-bottom:1px solid var(--line);text-align:right;vertical-align:top}\nth:first-child,td:first-child{text-align:left}\nth{font:600 11px var(--f-mono);text-transform:uppercase;letter-spacing:.03em;color:var(--muted)}\n.tbl{overflow-x:auto}\n.srow{display:grid;grid-template-columns:12px 1fr auto;gap:8px;align-items:center;padding:7px 4px;border-bottom:1px solid var(--line);cursor:pointer}\n.srow:hover{background:var(--chip)} .srow .dot{width:12px;height:12px;border-radius:50%}\n.srow .meta{color:var(--muted);font:12px var(--f-mono)}\ninput.search{width:100%;box-sizing:border-box;padding:8px 10px;border:1px solid var(--line);border-radius:6px;background:var(--bg);color:var(--ink);font:14px var(--f-body);margin-bottom:8px}\n.mapwrap{position:relative;min-width:0;min-height:0}\n#map{position:absolute;inset:0;background:var(--bg)}\n.layers{position:absolute;top:12px;right:12px;z-index:500;background:var(--panel);border:1px solid var(--line);border-radius:8px;box-shadow:var(--shadow);width:min(300px,calc(100% - 24px));max-height:calc(100% - 24px);overflow:auto;font-size:13px}\n.layers .hd{display:flex;justify-content:space-between;align-items:center;padding:8px 10px;border-bottom:1px solid var(--line);font:600 15px var(--f-display);letter-spacing:.04em;text-transform:uppercase}\n.layers .hd button{border:1px solid var(--line);background:var(--bg);color:var(--ink);border-radius:4px;font:12px var(--f-body);padding:2px 8px;cursor:pointer}\n.layers .bd{padding:6px 10px 10px}\n.grp{font:600 11px var(--f-mono);letter-spacing:.05em;text-transform:uppercase;color:var(--muted);margin:10px 0 4px}\n.lay{display:grid;grid-template-columns:auto 1fr;gap:6px;align-items:start;margin:4px 0}\n.lay input[type=range]{grid-column:2;width:100%;accent-color:var(--accent)}\n.lay label{cursor:pointer}\n.legend{position:absolute;left:12px;bottom:12px;z-index:500;background:var(--panel);border:1px solid var(--line);border-radius:8px;box-shadow:var(--shadow);padding:8px 10px;font-size:12px;max-width:min(320px,calc(100% - 24px))}\n.legend .ttl{font:600 12px var(--f-body);margin-bottom:4px}\n.legend .row{display:flex;align-items:center;gap:6px;margin:2px 0}\n.legend .sw{width:14px;height:10px;border-radius:2px}\n.legend .ramp{height:10px;border-radius:2px;margin:4px 0 2px}\n.legend .lbls{display:flex;justify-content:space-between;color:var(--muted);font:11px var(--f-mono)}\n.legend .note{color:var(--muted);margin-top:4px;max-width:36ch}\n.kv{display:grid;grid-template-columns:1fr auto;gap:2px 10px;font-size:13px}\n.kv span:nth-child(even){font-family:var(--f-mono);text-align:right}\n.callout{background:var(--chip);border-radius:6px;padding:10px 12px;margin:10px 0;font-size:13px}\na{color:var(--accent)}\n.pane h2.title{text-transform:none;color:var(--ink);font-size:24px;letter-spacing:.01em;margin-bottom:2px}\n.leaflet-container{font:13px var(--f-body);background:var(--bg)}\n.leaflet-popup-content{margin:10px 12px;font:13px/1.45 var(--f-body)}\n.leaflet-popup-content-wrapper,.leaflet-popup-tip{background:var(--panel);color:var(--ink)}\n@media (max-width:820px){.app{grid-template-columns:1fr;grid-template-rows:55vh auto;height:auto;min-height:100%}\n  .mapwrap{order:1;height:55vh} aside{order:2;border-right:0;border-top:1px solid var(--line)} .layers{width:min(250px,calc(100% - 24px))}\n  .legend{font-size:11px;padding:6px 8px;max-width:180px} .legend .note{display:none} .legend .row{margin:1px 0}}\n@media (prefers-reduced-motion:reduce){*{transition:none!important;animation:none!important}}\n</style></head>\n<body>\n<div class=\"app\">\n  <aside>\n    <header class=\"brand\"><h1>Karapınar Obruk Haritası</h1>\n      <p id=\"runmeta\">KOBRA · BVK Technology</p></header>\n    <nav class=\"tabs\" role=\"tablist\">\n      <button role=\"tab\" id=\"t-point\" aria-selected=\"true\">Nokta yorumu</button>\n      <button role=\"tab\" id=\"t-sett\" aria-selected=\"false\">Yerleşimler</button>\n      <button role=\"tab\" id=\"t-reg\" aria-selected=\"false\">Bölge özeti</button>\n      <button role=\"tab\" id=\"t-inst\" aria-selected=\"false\">Kurumlar</button>\n      <button role=\"tab\" id=\"t-tech\" aria-selected=\"false\">Teknik</button>\n    </nav>\n    <section class=\"pane\" id=\"p-point\"></section>\n    <section class=\"pane\" id=\"p-sett\" hidden></section>\n    <section class=\"pane\" id=\"p-reg\" hidden></section>\n    <section class=\"pane\" id=\"p-inst\" hidden></section>\n    <section class=\"pane\" id=\"p-tech\" hidden></section>\n  </aside>\n  <div class=\"mapwrap\"><div id=\"map\" role=\"region\" aria-label=\"Obruk risk haritası\"></div>\n    <div class=\"layers\" id=\"layers\"><div class=\"hd\">Katmanlar <button id=\"lyrToggle\" aria-expanded=\"true\">Gizle</button></div><div class=\"bd\" id=\"lyrBody\"></div></div>\n    <div class=\"legend\" id=\"legend\"></div>\n  </div>\n</div>\n<script src=\"https://cdnjs.cloudflare.com/ajax/libs/leaflet/1.9.4/leaflet.min.js\"></script>\n<script>\nconst D = __PAYLOAD__;\nconst RU = D.rules, T = RU.T;\nconst $ = s => document.querySelector(s);\nconst esc = s => String(s ?? \"\").replace(/[&<>\"']/g, c => ({\"&\":\"&amp;\",\"<\":\"&lt;\",\">\":\"&gt;\",'\"':\"&quot;\",\"'\":\"&#39;\"}[c]));\nconst trnum = s => String(s).replace(/(\\d)\\.(\\d)/g, \"$1,$2\").replace(/(^|[\\s(])-(\\d)/g, \"$1−$2\");\nfunction fmt(tpl, kw){ return trnum(tpl.replace(/\\{(\\w+)(?::\\.(\\d)f)?\\}/g, (m, k, d) => { const v = kw[k]; if (v == null) return \"\"; return d != null ? Number(v).toFixed(+d) : String(v); })); }\n\n/* ---------- yorum motoru (interpret.py ile aynı kurallar) ---------- */\nfunction levelOf(p){ if (p == null || isNaN(p)) return 0; let k = 0; for (const t of T.risk_pct) if (p >= t) k++; return k; }\nfunction interpret(v){\n  const lvl = levelOf(v.pct ?? 0), F = [];\n  const out = {level:lvl, level_name:T.risk_names[lvl], color:T.risk_colors[lvl]};\n  out.headline = lvl >= 2 ? fmt(RU.TPL.headline, {level:T.risk_names[lvl], top:Math.max(1, (1 - v.pct) * 100)}) : fmt(RU.TPL.headline_low, {level:T.risk_names[lvl]});\n  if (v.dist_prior_km != null){ const d = v.dist_prior_km; const k = d <= T.near_km ? \"proximity_near\" : d <= T.mid_km ? \"proximity_mid\" : \"proximity_far\";\n    F.push({topic:\"Obruk mühendisliği · yakınlık\", text:fmt(RU.TPL[k], {d_m:d * 1000, d_km:d})}); }\n  if (v.vel_up == null) F.push({topic:\"Jeodezi · yer hareketi\", text:RU.TPL.vel_none});\n  else { const c = T.vel_classes, x = v.vel_up; const k = x > c[0] ? \"vel_stable\" : x > c[1] ? \"vel_slow\" : x > c[2] ? \"vel_mid\" : \"vel_fast\";\n    F.push({topic:\"Jeodezi · yer hareketi\", text:fmt(RU.TPL[k], {v:x, v_abs:Math.abs(x)})}); }\n  if (v.tilt_rate != null && v.tilt_rate > 0){ const y = T.bjerrum_limit / v.tilt_rate; if (y <= T.tilt_years_max) F.push({topic:\"Jeodezi · farklı oturma\", text:fmt(RU.TPL.tilt, {years:y})}); }\n  if (v.irrigation_3km != null && v.irrigation_3km >= T.irr_mid){ let t = fmt(RU.TPL[v.irrigation_3km >= T.irr_high ? \"irr_high\" : \"irr_mid\"], {irr:v.irrigation_3km * 100});\n    if (v.ndvi_trend_per_yr != null && v.ndvi_trend_per_yr > 0.005) t += \" \" + RU.TPL.irr_trend; F.push({topic:\"Hidrojeoloji · yeraltı suyu baskısı\", text:t}); }\n  if (v.dist_fault_km != null && v.dist_fault_km <= T.fault_km) F.push({topic:\"Jeoloji · fay\", text:fmt(RU.TPL.fault, {f:v.dist_fault_km})});\n  if (v.dem_depression_depth != null && v.dem_depression_depth >= T.depression_m && (v.lc_built == null || v.lc_built < T.built_max)) F.push({topic:\"Topoğrafya · kapalı çukur\", text:fmt(RU.TPL.depression, {dd:v.dem_depression_depth})});\n  if (v.p1km != null && lvl >= 2) F.push({topic:\"Model · olasılık\", text:fmt(RU.TPL.probability, {p:v.p1km * 100})});\n  out.findings = F; out.actions = (RU.ACT[lvl] || []).concat(RU.GEN); return out;\n}\nfunction cardHTML(c, title){\n  return `${title ? `<h3>${esc(title)}</h3>` : \"\"}<span class=\"lvl\" style=\"background:${c.color}\">${esc(c.level_name)}</span>\n  <p class=\"headline\">${esc(trnum(c.headline))}</p>\n  ${c.findings.map(f => `<div class=\"finding\"><div class=\"t\">${esc(f.topic)}</div><div>${esc(trnum(f.text))}</div></div>`).join(\"\")}\n  <h3>Ne yapmalı?</h3><ul class=\"act\">${c.actions.map(a => `<li>${esc(a)}</li>`).join(\"\")}</ul>\n  <details><summary>Bu harita neyi söyleyebilir, neyi söyleyemez?</summary>\n  <p><b>Söyleyebildiklerimiz</b></p><ul class=\"act\">${RU.SAY.map(s => `<li>${esc(s)}</li>`).join(\"\")}</ul>\n  <p><b>Söyleyemediklerimiz</b></p><ul class=\"act\">${RU.CANNOT.map(s => `<li>${esc(s)}</li>`).join(\"\")}</ul></details>`;\n}\n\n/* ---------- değer ızgarası ---------- */\nconst VG = D.vgrid, V = {};\nfor (const [k, o] of Object.entries(VG.vals)){\n  const bin = atob(o.b64), buf = new ArrayBuffer(bin.length), u8 = new Uint8Array(buf);\n  for (let i = 0; i < bin.length; i++) u8[i] = bin.charCodeAt(i);\n  const A = {uint8:Uint8Array, uint16:Uint16Array, int16:Int16Array}[o.dtype];\n  V[k] = {a:new A(buf), s:o.scale, nod:o.nodata};\n}\nfunction sample(lat, lng){\n  const p = L.CRS.EPSG3857.project(L.latLng(lat, lng));\n  const c = Math.floor((p.x - VG.x0) / VG.res), r = Math.floor((VG.y1 - p.y) / VG.res);\n  if (c < 0 || r < 0 || c >= VG.W || r >= VG.H) return null;\n  const i = r * VG.W + c, g = k => { const o = V[k]; if (!o) return null; const x = o.a[i]; return x === o.nod ? null : x / o.s; };\n  const pct = g(\"pct\"); if (pct == null) return null;\n  return {pct, dist_prior_km:g(\"dprior\"), vel_up:g(\"vel\"), tilt_rate:g(\"tilt\"), irrigation_3km:g(\"irr3\"),\n          ndvi_trend_per_yr:g(\"trend\"), dist_fault_km:g(\"fault\"), dem_depression_depth:g(\"dep\"), p1km:g(\"p1\"), lc_built:g(\"built\")};\n}\n\n/* ---------- harita ---------- */\nconst map = L.map(\"map\", {zoomControl:true, preferCanvas:true}).fitBounds(D.bounds); window.__kmap = map;\nmap.createPane(\"base\"); map.getPane(\"base\").style.zIndex = 150;\nconst bases = {\n  \"Arazi gölgesi (çevrimdışı)\": D.base ? L.imageOverlay(D.base, D.bounds, {pane:\"base\"}) : L.layerGroup(),\n  \"OpenStreetMap\": L.tileLayer(\"https://{s}.tile.openstreetmap.org/{z}/{x}/{y}.png\", {maxZoom:18, attribution:\"© OpenStreetMap\"}),\n  \"Uydu görüntüsü (Esri)\": L.tileLayer(\"https://server.arcgisonline.com/ArcGIS/rest/services/World_Imagery/MapServer/tile/{z}/{y}/{x}\", {maxZoom:18, attribution:\"Esri, Maxar\"}),\n};\nlet curBase = bases[\"Arazi gölgesi (çevrimdışı)\"].addTo(map);\nconst over = {}, order = [\"risk\", \"p1km\", \"vel\", \"tilt\", \"irr\", \"quantum\"];\nfor (const k of order){ const l = D.layers[k]; if (!l) continue; over[k] = L.imageOverlay(l.img, D.bounds, {opacity:1, interactive:false}); if (l.on) over[k].addTo(map); }\nconst vec = {};\nvec.sinks = L.layerGroup(D.sinks.map(s => L.circleMarker([s.lat, s.lon], {radius:5, color:\"#111\", weight:1.5, fillColor:\"#fff\", fillOpacity:.95})\n  .bindPopup(`<b>${esc(s.name || \"Obruk\")}</b><br>${s.d ? \"Yaklaşık çap: \" + s.d + \" m<br>\" : \"\"}<span style=\"opacity:.75\">Kaynak: OpenStreetMap</span>`).on(\"click\", e => showPoint(e.latlng)))).addTo(map);\nvec.faults = D.faults ? L.geoJSON(D.faults, {style:{color:\"#7b341e\", weight:2, dashArray:\"6 4\"}}).addTo(map) : L.layerGroup();\nvec.sett = L.layerGroup(D.sett.map((s, i) => L.circleMarker([s.lat, s.lon], {radius: s.place === \"town\" ? 8 : s.place === \"village\" ? 6 : 4.5, color:\"#fff\", weight:1.2, fillColor:T.risk_colors[s.level], fillOpacity:1})\n  .bindTooltip(esc(s.name)).on(\"click\", () => showSett(i)))).addTo(map);\nvec.mon = L.layerGroup(D.mon.filter(m => m.sel).map(m => L.marker([m.lat, m.lon], {icon:L.divIcon({className:\"\", html:'<div style=\"width:16px;height:16px;transform:rotate(45deg);background:#0e6b70;border:2px solid #fff;box-shadow:0 0 0 1px #0e6b70\"></div>', iconSize:[16,16], iconAnchor:[8,8]})})\n  .bindPopup(`<b>Önerilen izleme noktası</b><br>2 km çevresindeki beklenen yıllık obruk: ${trnum(m.mass.toFixed(2))}<br>InSAR köşe yansıtıcısı, GNSS veya piyezometre için aday.`)));\nvec.gnss = L.layerGroup(D.gnss.map(g => L.marker([g.lat, g.lon], {icon:L.divIcon({className:\"\", html:'<div style=\"width:0;height:0;border-left:8px solid transparent;border-right:8px solid transparent;border-bottom:14px solid #b45309\"></div>', iconSize:[16,14], iconAnchor:[8,10]})})\n  .bindPopup(`<b>GNSS ${esc(g.name)}</b><br>${esc(g.period)}<br>Düşey hız: ${g.up != null ? trnum(g.up.toFixed(1)) + \" mm/yıl\" : \"—\"}<br><span style=\"opacity:.75\">Nevada Geodetic Laboratory</span>`))).addTo(map);\nvec.aoi = L.rectangle([[D.meta.aoi[1], D.meta.aoi[0]], [D.meta.aoi[3], D.meta.aoi[2]]], {color:\"#0e6b70\", weight:1, fill:false, dashArray:\"3 3\", interactive:false}).addTo(map);\n\n/* ---------- katman paneli ---------- */\nconst body = $(\"#lyrBody\"); let h = '<div class=\"grp\">Altlık</div>';\nObject.keys(bases).forEach((n, i) => h += `<div class=\"lay\"><input type=\"radio\" name=\"base\" id=\"b${i}\" ${i === 0 ? \"checked\" : \"\"}><label for=\"b${i}\">${esc(n)}</label></div>`);\nlet lastGroup = \"\";\nfor (const k of order){ const l = D.layers[k]; if (!l) continue;\n  if (l.group !== lastGroup){ h += `<div class=\"grp\">${esc(l.group)}</div>`; lastGroup = l.group; }\n  h += `<div class=\"lay\"><input type=\"checkbox\" id=\"o-${k}\" ${l.on ? \"checked\" : \"\"}><label for=\"o-${k}\">${esc(l.name)}</label>\n        <input type=\"range\" id=\"op-${k}\" min=\"0\" max=\"100\" value=\"${k === \"risk\" ? 75 : 85}\" aria-label=\"${esc(l.name)} saydamlık\"></div>`; }\nh += '<div class=\"grp\">Noktalar ve çizgiler</div>';\nconst vn = {sinks:\"Bilinen obruklar\", sett:\"Yerleşimler (yorum kartlı)\", faults:\"Diri faylar (GEM)\", mon:\"Önerilen izleme noktaları\", gnss:\"GNSS istasyonları\", aoi:\"Çalışma alanı\"};\nfor (const [k, n] of Object.entries(vn)) h += `<div class=\"lay\"><input type=\"checkbox\" id=\"v-${k}\" ${map.hasLayer(vec[k]) ? \"checked\" : \"\"}><label for=\"v-${k}\">${n}</label></div>`;\nbody.innerHTML = h;\nObject.keys(bases).forEach((n, i) => $(\"#b\" + i).addEventListener(\"change\", () => { map.removeLayer(curBase); curBase = bases[n].addTo(map); }));\nfor (const k of order){ if (!over[k]) continue;\n  const op = $(\"#op-\" + k); over[k].setOpacity(op.value / 100);\n  $(\"#o-\" + k).addEventListener(\"change\", e => { e.target.checked ? over[k].addTo(map) : map.removeLayer(over[k]); legend(); });\n  op.addEventListener(\"input\", () => over[k].setOpacity(op.value / 100)); }\nfor (const k of Object.keys(vn)) $(\"#v-\" + k).addEventListener(\"change\", e => e.target.checked ? vec[k].addTo(map) : map.removeLayer(vec[k]));\n$(\"#lyrToggle\").addEventListener(\"click\", e => { const b = $(\"#lyrBody\"); b.hidden = !b.hidden; e.target.textContent = b.hidden ? \"Göster\" : \"Gizle\"; e.target.setAttribute(\"aria-expanded\", String(!b.hidden)); });\nif (window.matchMedia(\"(max-width:820px)\").matches) $(\"#lyrToggle\").click();\n\nfunction legend(){\n  const on = order.filter(k => over[k] && map.hasLayer(over[k]));\n  const k = on[on.length - 1];\n  if (!k){ $(\"#legend\").innerHTML = '<div class=\"ttl\">Katman seçilmedi</div>'; return; }\n  const l = D.layers[k], lg = l.legend; let x = `<div class=\"ttl\">${esc(l.name)}</div>`;\n  if (lg.kind === \"classes\") x += lg.items.map(([n, c]) => `<div class=\"row\"><span class=\"sw\" style=\"background:${c}\"></span>${esc(n)}</div>`).join(\"\");\n  else x += `<div class=\"ramp\" style=\"background:linear-gradient(90deg,${lg.colors.join(\",\")})\"></div><div class=\"lbls\">${lg.labels.map(esc).map(s => `<span>${s}</span>`).join(\"\")}</div>`;\n  if (l.note) x += `<div class=\"note\">${esc(l.note)}</div>`;\n  $(\"#legend\").innerHTML = x;\n}\nlegend();\n\n/* ---------- sekmeler ---------- */\nconst tabs = [\"point\", \"sett\", \"reg\", \"inst\", \"tech\"];\nfunction openTab(t){ tabs.forEach(x => { $(\"#t-\" + x).setAttribute(\"aria-selected\", String(x === t)); $(\"#p-\" + x).hidden = x !== t; }); try{ localStorage.setItem(\"kobra-tab\", t); }catch(e){} }\ntabs.forEach(t => $(\"#t-\" + t).addEventListener(\"click\", () => openTab(t)));\n\n/* Nokta yorumu */\nlet clickMark = null;\nfunction showPoint(latlng){\n  const v = sample(latlng.lat, latlng.lng);\n  if (clickMark) map.removeLayer(clickMark);\n  clickMark = L.circleMarker(latlng, {radius:7, color:\"#0e6b70\", weight:3, fill:false}).addTo(map);\n  const where = `${trnum(latlng.lat.toFixed(4))}° K, ${trnum(latlng.lng.toFixed(4))}° D`;\n  $(\"#p-point\").innerHTML = v ? `<h2>Seçilen nokta</h2><p class=\"meta\" style=\"font-family:var(--f-mono);color:var(--muted)\">${where}</p>` + cardHTML(interpret(v))\n    : `<h2>Seçilen nokta</h2><p class=\"empty\">${where}: çalışma alanı dışında veya su yüzeyi. Haritada çerçeve içinde bir noktaya dokunun.</p>`;\n  openTab(\"point\");\n}\nmap.on(\"click\", e => showPoint(e.latlng));\nconst topSett = D.sett[0];\n$(\"#p-point\").innerHTML = `<h2>Nokta yorumu</h2><p class=\"empty\">Haritada herhangi bir noktaya dokunun: o noktanın obruk riski, yer hareketi ve yeraltı suyu baskısı sade bir dille burada açıklanır.</p>\n <div class=\"callout\"><b>Nasıl okunur?</b> Renkli alanlar göreli riski gösterir: kırmızı alanlar bölgenin en riskli %1'i, turuncu %1–5, sarı %5–20. Beyaz daireler bilinen obruklardır; renkli küçük noktalar yerleşimlerdir, üzerine dokununca o yerleşimin kartı açılır.</div>\n ${topSett ? `<p>Örnek: en yüksek riskli yerleşim <a href=\"#\" id=\"exTop\">${esc(topSett.name)}</a>.</p>` : \"\"}`;\nif (topSett) $(\"#exTop\").addEventListener(\"click\", e => { e.preventDefault(); showSett(0); });\n\n/* Yerleşimler */\nfunction showSett(i){\n  const s = D.sett[i]; map.setView([s.lat, s.lon], Math.max(map.getZoom(), 12));\n  const extra = `<div class=\"kv\"><span>En yakın bilinen obruk</span><span>${s.dk != null ? trnum(s.dk.toFixed(2)) + \" km\" : \"—\"}</span>\n   <span>Düşey hız (medyan, 1 km)</span><span>${s.vel != null ? trnum(s.vel.toFixed(0)) + \" mm/yıl\" : \"ölçülemedi\"}</span>\n   <span>1 km'de 1 yıl içinde ≥1 obruk</span><span>%${trnum((s.p1 * 100).toFixed(1))}</span>\n   ${s.e15 != null ? `<span>1 km'de 2026–40 beklenen (mevcut eğilim)</span><span>${trnum(s.e15.toFixed(1))}</span><span>Aynı, su düşüşü durursa</span><span>${trnum(s.e15s.toFixed(1))}</span>` : \"\"}</div>`;\n  $(\"#p-sett\").innerHTML = `<button id=\"back\" style=\"border:1px solid var(--line);background:var(--bg);color:var(--ink);border-radius:4px;padding:4px 10px;cursor:pointer;margin-bottom:8px\">← Tüm yerleşimler</button>\n    <h2 class=\"title\">${esc(s.name)}</h2><p style=\"color:var(--muted);margin-top:-4px\">${esc(placeTr(s.place))} · çevre: 1 km</p>${extra}${cardHTML(s.card)}`;\n  $(\"#back\").addEventListener(\"click\", listSett); openTab(\"sett\");\n}\nfunction placeTr(p){ return {town:\"İlçe/kasaba merkezi\", village:\"Köy\", hamlet:\"Mezra/yayla\", suburb:\"Mahalle\", neighbourhood:\"Mahalle\"}[p] || p; }\nfunction listSett(){\n  $(\"#p-sett\").innerHTML = `<h2>Yerleşimler</h2><p>Her yerleşimin 1 km çevresindeki en riskli %10'luk kesime göre sıralanmıştır. Bir satıra dokunun.</p>\n   <label for=\"q\" class=\"grp\" style=\"display:block\">Yerleşim ara</label><input class=\"search\" id=\"q\" placeholder=\"ör. Karapınar, Kolca\">\n   <div id=\"slist\"></div>`;\n  const draw = f => { $(\"#slist\").innerHTML = D.sett.map((s, i) => [s, i]).filter(([s]) => !f || s.name.toLocaleLowerCase(\"tr\").includes(f))\n      .slice(0, 200).map(([s, i]) => `<div class=\"srow\" data-i=\"${i}\" tabindex=\"0\"><span class=\"dot\" style=\"background:${T.risk_colors[s.level]}\"></span><span>${esc(s.name)} <span class=\"meta\">${esc(placeTr(s.place))}</span></span><span class=\"meta\">${esc(T.risk_names[s.level])}</span></div>`).join(\"\");\n    document.querySelectorAll(\".srow\").forEach(el => { const go = () => showSett(+el.dataset.i); el.addEventListener(\"click\", go); el.addEventListener(\"keydown\", e => { if (e.key === \"Enter\") go(); }); }); };\n  draw(\"\"); $(\"#q\").addEventListener(\"input\", e => draw(e.target.value.trim().toLocaleLowerCase(\"tr\")));\n}\nlistSett();\n\n/* Bölge özeti */\n$(\"#p-reg\").innerHTML = `<h2>Bölge özeti</h2>${D.reg.paragraphs.map(p => `<p>${esc(trnum(p))}</p>`).join(\"\")}\n <h3>Yeraltı suyu senaryoları (Konya havzası, 2026–2040)</h3><div class=\"tbl\"><table><tr><th>Senaryo</th><th>Beklenen</th><th>Aralık</th></tr>\n ${D.scen.map(s => `<tr><td>${esc(s.name)}</td><td>${Math.round(s.mean)}</td><td>${Math.round(s.lo)}–${Math.round(s.hi)}</td></tr>`).join(\"\")}</table></div>\n <div class=\"callout\"><b>Söyleyebildiklerimiz</b><ul class=\"act\">${D.reg.can_say.map(s => `<li>${esc(s)}</li>`).join(\"\")}</ul>\n <b>Söyleyemediklerimiz</b><ul class=\"act\">${D.reg.cannot_say.map(s => `<li>${esc(s)}</li>`).join(\"\")}</ul></div>`;\n\n/* Kurumlar */\nconst lvlCount = [0,0,0,0,0]; D.sett.forEach(s => lvlCount[s.level]++);\n$(\"#p-inst\").innerHTML = `<h2>Kurumlar için</h2><p>${D.sett.length} yerleşimin risk sınıflarına dağılımı:</p>\n <div class=\"kv\">${T.risk_names.map((n, i) => `<span><span class=\"sw\" style=\"display:inline-block;width:10px;height:10px;border-radius:2px;background:${T.risk_colors[i]};margin-right:6px\"></span>${esc(n)}</span><span>${lvlCount[i]}</span>`).join(\"\")}</div>\n ${D.inst.map(([k, t]) => `<h3>${esc(k)}</h3><p>${esc(t)}</p>`).join(\"\")}\n <h3>Önerilen izleme noktaları</h3><p>Haritadaki baklava işaretleri, beklenen obruk yoğunluğunu en iyi kapsayan ve birbirinden en az 1,5 km uzak 5 noktadır (QUBO optimizasyonu).</p>`;\n\n/* Teknik */\n$(\"#p-tech\").innerHTML = `<h2>Teknik</h2><div class=\"kv\"><span>Çalıştırma</span><span>${esc(D.meta.run)}</span><span>Izgara</span><span>${D.meta.grid} m · ${D.meta.n_cells.toLocaleString(\"tr-TR\")} hücre</span>\n <span>Obruk envanteri</span><span>${D.meta.n_inv}</span><span>En iyi öğrenen</span><span>${esc(D.meta.best)}</span><span>2026 beklenen (AOI)</span><span>${trnum(String(D.meta.lam2026))} / yıl</span></div>\n <h3>Doğrulama (5 km mekânsal blok, katlar dışı)</h3><div class=\"tbl\"><table><tr><th>Model</th><th>AUC</th><th>%95 GA</th><th>%1</th><th>%5</th><th>%10</th></tr>\n ${D.cv.map(r => `<tr><td>${esc(r.model)}</td><td>${trnum(r.auc.toFixed(3))}</td><td>${trnum(r.lo.toFixed(2))}–${trnum(r.hi.toFixed(2))}</td><td>${Math.round(r.c1 * 100)}</td><td>${Math.round(r.c5 * 100)}</td><td>${Math.round(r.c10 * 100)}</td></tr>`).join(\"\")}</table></div>\n <p style=\"color:var(--muted);font-size:12.5px\">%1/%5/%10: haritanın en riskli o kadarlık alanında yakalanan, eğitimde görülmemiş obruk yüzdesi.</p>\n <h3>Kuantum donanım hazırlığı (IBM Heron, derleme sonrası)</h3><div class=\"tbl\"><table><tr><th>Devre</th><th>2q kapı</th><th>Derinlik</th><th>Sadakat</th><th>Uygun</th></tr>\n ${D.hw.map(r => `<tr><td>${esc(r.circuit)}</td><td>${r.n2q}</td><td>${r.depth}</td><td>${trnum(r.est_fidelity.toFixed(2))}</td><td>${r.eligible ? \"Evet\" : \"Hayır\"}</td></tr>`).join(\"\")}</table></div>\n <p style=\"color:var(--muted);font-size:12.5px\">Kaynaklar: COMET-LiCSAR, Nevada Geodetic Laboratory, Copernicus DEM, ESA WorldCover, Sentinel-2 (Element84), SoilGrids, GEM Global Active Faults, OpenStreetMap, NASA POWER, AFAD.</p>`;\n$(\"#runmeta\").textContent = `KOBRA · çalıştırma ${D.meta.run} · ${D.meta.n_inv} obruk · ${D.meta.grid} m ızgara`;\ntry{ const t = localStorage.getItem(\"kobra-tab\"); if (t && tabs.includes(t) && t !== \"point\") openTab(t); }catch(e){}\n</script>\n</body></html>\"\"\"\n"
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "id": "5e3e2386",
   "metadata": {
    "colab": {
     "base_uri": "https://localhost:8080/"
    },
    "id": "5e3e2386",
    "executionInfo": {
     "status": "ok",
     "timestamp": 1791962704640,
     "user_tz": -180,
     "elapsed": 2,
     "user": {
      "displayName": "Joseph Volkan ÖZCAN",
      "userId": "11389530967736397480"
     }
    },
    "outputId": "7ca70692-94a0-4ba6-b53e-d16fd74f5690"
   },
   "outputs": [
    {
     "output_type": "stream",
     "name": "stdout",
     "text": [
      "Writing obruk_engine/results.py\n"
     ]
    }
   ],
   "source": "%%writefile obruk_engine/results.py\n\"\"\"Çalıştırma sonuç raporu — aynı içerikten Word (.docx) ve HTML üretir.\n\nHer çalıştırmanın sonunda pipeline.run_all() bu modülü çağırır:\n    kobra_data/outputs/KOBRA_Sonuc_Raporu.docx\n    kobra_data/outputs/KOBRA_Sonuc_Raporu.html   (KOBRA_harita.html'e bağlantı verir)\n\nTek kaynak ilkesi: build_content(R) çalıştırmanın sayılarından bir içerik modeli kurar (bölümler,\nparagraflar, tablolar, şekiller, notlar). to_docx() ve to_html() bu modeli yalnızca biçimlendirir;\niki çıktıdaki sayı ve cümleler birebir aynıdır. Cümleler sonuçlara göre otomatik kurulur (örneğin kuantum\nile klasik çekirdeğin güven aralıkları örtüşüyorsa \"fark anlamlı değil\" denir).\n\"\"\"\nfrom __future__ import annotations\n\nimport base64\nimport html as _html\nimport io\nimport re\nfrom dataclasses import dataclass, field\nfrom datetime import datetime\nfrom pathlib import Path\n\nimport numpy as np\nimport pandas as pd\n\nfrom . import interpret as I\n\nMODEL_NAMES = dict(ensemble=\"Topluluk (yakınlık + öğrenen)\", lgbm=\"LightGBM\", rf=\"Random Forest\",\n                   logreg=\"Lojistik regresyon\", proximity=\"Yakınlık taban çizgisi\",\n                   rbf_nystroem=\"Klasik çekirdek (RBF Nyström)\", q_kernel=\"Kuantum çekirdek (6 kübit)\")\nFEATURE_TR = dict(elev=\"yükseklik\", slope=\"eğim\", relief_300m=\"300 m yerel rölyef\", relief_1km=\"1 km yerel rölyef\",\n                  dem_depression_depth=\"kapalı çukur derinliği\", depression_density_1km=\"kapalı çukur yoğunluğu\",\n                  dist_fault_km=\"faya uzaklık\", lc_cropland=\"ekili alan oranı\", lc_grass=\"mera oranı\", lc_bare=\"çıplak arazi oranı\",\n                  clay=\"kil oranı\", los_vel_asc_filled=\"uydu radarı hızı\", insar_coh_asc=\"radar koherensi\",\n                  ndvi_summer_mean=\"yaz NDVI ortalaması\", irrigated_freq=\"sulama sıklığı\", ndvi_trend_per_yr=\"NDVI eğilimi\",\n                  irrigation_3km=\"3 km sulama yoğunluğu\", dist_prior_km=\"geçmiş obruğa uzaklık\", dens_prior=\"obruk yoğunluğu\")\nPLACE_TR = dict(town=\"İlçe/kasaba merkezi\", village=\"Köy\", hamlet=\"Mezra/yayla\", suburb=\"Mahalle\",\n                neighbourhood=\"Mahalle\")\n\n\n# ----------------------------------------------------------------------------------------------\n# İçerik modeli\n# ----------------------------------------------------------------------------------------------\n@dataclass\nclass Block:\n    kind: str                 # h1 | h2 | p | bullets | table | figure | note | kv\n    text: str = \"\"\n    items: list = field(default_factory=list)\n    rows: list = field(default_factory=list)       # tablo: ilk satır başlık\n    widths: list = field(default_factory=list)     # tablo sütun oranları\n    num_cols: tuple = ()\n    png: bytes = b\"\"\n    caption: str = \"\"\n    width_cm: float = 15.5\n\n\ndef tr(x, d=1):\n    \"\"\"Sayıyı Türkçe biçimle yaz (ondalık virgül, binlik nokta, gerçek eksi işareti).\"\"\"\n    if x is None or (isinstance(x, float) and not np.isfinite(x)):\n        return \"—\"\n    s = f\"{x:,.{d}f}\".replace(\",\", \"§\").replace(\".\", \",\").replace(\"§\", \".\")\n    return s.replace(\"-\", \"−\")\n\n\ndef pct(x, d=0):\n    return \"—\" if x is None else \"%\" + tr(100 * x, d)\n\n\ndef _fig_png(fig, dpi=150):\n    import matplotlib.pyplot as plt\n    b = io.BytesIO(); fig.savefig(b, format=\"png\", dpi=dpi, bbox_inches=\"tight\"); plt.close(fig)\n    return b.getvalue()\n\n\ndef _ci_overlap(cv, a, b):\n    if a not in cv.index or b not in cv.index:\n        return True\n    return not (cv.loc[a, \"auc_lo\"] > cv.loc[b, \"auc_hi\"] or cv.loc[b, \"auc_lo\"] > cv.loc[a, \"auc_hi\"])\n\n\ndef build_content(R) -> dict:\n    from . import report as RP\n    cfg, cv, df = R[\"cfg\"], R[\"cv\"], R[\"table\"]\n    g, sk = R[\"grid\"], R[\"inventory\"]\n    summ = R[\"phys_summary\"]\n    key = lambda p: [i for i in summ.index if i.startswith(p)][0]\n    bau, stab = summ.loc[key(\"Mevcut\")], summ.loc[key(\"Stabil\")]\n    half, rec = summ.loc[key(\"Yarıya\")], summ.loc[key(\"Toparlanma\")]\n    ens = cv.loc[\"ensemble\"] if \"ensemble\" in cv.index else cv.iloc[0]\n    best = R.get(\"best_learner\", \"\")\n    vel = g.layers.get(\"vel_up\")\n    vmin = float(np.nanpercentile(vel, 1)) if vel is not None else None\n    vcov = float(np.isfinite(vel).mean()) if vel is not None else None\n    st = R.get(\"settlements\")\n    reg = R.get(\"regional\") or I.regional_summary(R, st)\n    run_time = datetime.now().strftime(\"%d.%m.%Y %H:%M\")\n    meta = dict(title=\"KOBRA Sonuç Raporu\", subtitle=\"Karapınar obruk risk analizi — çalıştırma sonuçları\",\n                run=run_time, n_inv=len(sk), n_cells=len(df), grid=cfg.grid_res_m,\n                runtime=R.get(\"runtime_s\"), aoi=cfg.aoi.bbox)\n    B: list[Block] = []\n\n    # ---------------------------------------------------------------- 1. Özet\n    B.append(Block(\"h1\", \"1. Özet\"))\n    for p in reg[\"paragraphs\"]:\n        B.append(Block(\"p\", p))\n    kv = [[\"Gösterge\", \"Değer\"],\n          [\"Çalışma alanı\", f\"{tr(cfg.aoi.west, 2)}–{tr(cfg.aoi.east, 2)}° D, {tr(cfg.aoi.south, 2)}–{tr(cfg.aoi.north, 2)}° K\"],\n          [\"Izgara\", f\"{tr(cfg.grid_res_m, 0)} m · {tr(len(df), 0)} hücre\"],\n          [\"Kullanılan obruk envanteri\", f\"{len(sk)} obruk\"],\n          [\"Topluluk modeli AUC (%95 GA)\", f\"{tr(ens.auc, 3)} ({tr(ens.auc_lo, 2)}–{tr(ens.auc_hi, 2)})\"],\n          [\"En riskli %10 alanda yakalanan obruk\", pct(ens[\"cap@10%\"])],\n          [\"En hızlı çöken %1'lik kesim, düşey\", f\"{tr(vmin, 0)} mm/yıl\" if vmin is not None else \"—\"],\n          [\"2026'da AOI'de beklenen obruk\", f\"yaklaşık {tr(R.get('lam_aoi_2026', np.nan), 1)} / yıl\"],\n          [\"2026–2040, havza (mevcut eğilim)\", f\"{tr(bau.total_2026_2040, 0)} ({tr(bau.lo, 0)}–{tr(bau.hi, 0)})\"],\n          [\"2026–2040, havza (düşüş durursa)\", f\"{tr(stab.total_2026_2040, 0)} ({tr(stab.lo, 0)}–{tr(stab.hi, 0)})\"]]\n    B.append(Block(\"table\", rows=kv, widths=[0.5, 0.5]))\n    B.append(Block(\"note\", \"Bu rapor bir tarama ve önceliklendirme çıktısıdır. Tek bir obruğun yerini ve tarihini \"\n                           \"öngörmez; bir yapının altında boşluk olup olmadığını söylemez. Ayrıntı için 7. bölüme bakın.\"))\n\n    # ---------------------------------------------------------------- 2. Risk haritası\n    B.append(Block(\"h1\", \"2. Obruk risk haritası\"))\n    B.append(Block(\"p\", f\"Harita, geçmiş obruklara yakınlık ile {MODEL_NAMES.get(best, best)} modelinin sıra-ortalamasıdır. \"\n                        \"Koyu renkler göreli olarak daha riskli alanları gösterir; mavi daireler bu çalıştırmada kullanılan \"\n                        \"obruklardır.\"))\n    B.append(Block(\"figure\", png=_fig_png(RP.fig_susceptibility(R)), caption=\"Şekil 1. Obruk duyarlılığı (100 m ızgara).\"))\n    rows = [[\"Model\", \"AUC (%95 GA)\", \"En riskli %1\", \"%5\", \"%10\"]]\n    for m in [\"ensemble\", \"lgbm\", \"rf\", \"logreg\", \"proximity\", \"rbf_nystroem\", \"q_kernel\"]:\n        if m in cv.index:\n            r = cv.loc[m]\n            rows.append([MODEL_NAMES[m], f\"{tr(r.auc, 3)} ({tr(r.auc_lo, 2)}–{tr(r.auc_hi, 2)})\",\n                         pct(r[\"cap@1%\"]), pct(r[\"cap@5%\"]), pct(r[\"cap@10%\"])])\n    B.append(Block(\"h2\", \"Doğrulama\"))\n    B.append(Block(\"p\", \"Model, 5 km'lik bloklara ayrılan alanda her seferinde bir grup bloğu hiç görmeden eğitildi ve o \"\n                        \"bloklardaki obrukları ne kadar iyi sıraladığı ölçüldü. Yüzdeler, haritanın en riskli o kadarlık \"\n                        \"alanında yakalanan obruk oranıdır.\"))\n    B.append(Block(\"table\", rows=rows, widths=[0.36, 0.25, 0.13, 0.13, 0.13], num_cols=(1, 2, 3, 4)))\n    prox_auc = cv.loc[\"proximity\", \"auc\"] if \"proximity\" in cv.index else None\n    if prox_auc is not None:\n        gain = ens.auc - prox_auc\n        B.append(Block(\"p\", f\"Yalnızca geçmiş obruklara uzaklığa bakan taban çizgisi AUC {tr(prox_auc, 3)} verdi; topluluk \"\n                            f\"modeli buna {tr(gain, 3)} ekledi. Bu, arazi, sulama ve fay bilgisinin yakınlığın ötesinde \"\n                            f\"{'anlamlı' if not _ci_overlap(cv, 'ensemble', 'proximity') else 'sınırlı'} bir katkı yaptığını gösterir.\"))\n    B.append(Block(\"figure\", png=_fig_png(RP.fig_capture(R)), caption=\"Şekil 2. Alan-yakalama eğrileri (katlar dışı).\",\n                   width_cm=12.5))\n    imp = R.get(\"importance\")\n    if imp is not None:\n        top = \", \".join(FEATURE_TR.get(k, k) for k in imp.head(6).index)\n        B.append(Block(\"p\", f\"Seçilen öğrenenin ({MODEL_NAMES.get(best, best)}) en çok kullandığı öznitelikler: {top}.\"))\n\n    # ---------------------------------------------------------------- 3. Jeodezi\n    B.append(Block(\"h1\", \"3. Yer hareketi (jeodezi)\"))\n    if vel is not None:\n        B.append(Block(\"p\", f\"COMET-LiCSAR uydu radar interferogramlarından küçük-baz (SBAS) yöntemiyle 2022–2024 hızları \"\n                            f\"hesaplandı; yükselen ve alçalan yörüngeler birleştirilerek düşey bileşen çıkarıldı. Ölçüm, \"\n                            f\"alanın yaklaşık {pct(vcov)} kadarında güvenilir (koherens ≥ 0,5); boş kalan kesimler çoğunlukla \"\n                            f\"tarım alanlarıdır. En hızlı çöken %1'lik kesimde düşey hız yaklaşık {tr(vmin, 0)} mm/yıl.\"))\n        B.append(Block(\"figure\", png=_fig_png(RP.fig_insar(R)), caption=\"Şekil 3. Düşey yer hareketi, 2022–2024 (mm/yıl).\"))\n    gn = R.get(\"gnss\", {})\n    if gn:\n        rows = [[\"GNSS istasyonu\", \"Dönem\", \"Düşey hız\", \"Doğu hızı\"]]\n        for k, v in gn.items():\n            rows.append([k, f\"{v['start']} → {v['end']}\", f\"{tr(v['up'], 1)} mm/yıl\", f\"{tr(v['east'], 1)} mm/yıl\"])\n        B.append(Block(\"table\", rows=rows, widths=[0.2, 0.36, 0.22, 0.22], num_cols=(2, 3)))\n        chk = R.get(\"gnss_insar_check\")\n        if chk:\n            ratio = chk[\"insar_up_at_KAP1\"] / chk[\"gnss_up_KAP1\"] if chk[\"gnss_up_KAP1\"] else np.nan\n            B.append(Block(\"p\", f\"KAP1 istasyonunda uydu radarı {tr(chk['insar_up_at_KAP1'], 0)} mm/yıl, GNSS \"\n                                f\"{tr(chk['gnss_up_KAP1'], 0)} mm/yıl düşey hız veriyor (oran {tr(ratio, 1)}). Dönemler \"\n                                \"(2022–2024 ve 2020–2023), ölçek (100 m piksel ve tek nokta) ve referanslama farklı; fark \"\n                                \"TUSAGA-Aktif verisiyle aynı döneme bağlanarak çözülmelidir.\"))\n        B.append(Block(\"figure\", png=_fig_png(RP.fig_gnss(R)), caption=\"Şekil 4. GNSS düşey zaman serileri.\", width_cm=14))\n\n    # ---------------------------------------------------------------- 4. Senaryolar\n    B.append(Block(\"h1\", \"4. Yeraltı suyu senaryoları\"))\n    cal = R[\"phys_cal\"]\n    from .physics import OBS_RATES\n    fits = []\n    for (a, b), r in OBS_RATES:\n        m = cal[(cal.year >= a) & (cal.year <= b)].sim_rate.mean()\n        fits.append(f\"{a}–{b}: gözlenen {tr(r, 0)}, model {tr(m, 1)}\")\n    pp = R[\"phys_params\"]\n    B.append(Block(\"p\", \"Fizik tabanlı örtü-çökme simülatörü, kireçtaşındaki boşlukların üstündeki örtünün yeraltı suyu \"\n                        \"düştükçe nasıl taşıyamaz hâle geldiğini Monte Carlo yöntemiyle canlandırır. Kalibrasyon: \"\n                        + \"; \".join(fits) + \" obruk/yıl.\"))\n    B.append(Block(\"figure\", png=_fig_png(RP.fig_physics(R)), caption=\"Şekil 5. Kalibrasyon ve senaryolar.\"))\n    rows = [[\"Senaryo (2026–2040, Konya havzası)\", \"Beklenen obruk\", \"%5–95 aralığı\"]]\n    for name, r in [(key(\"Mevcut\"), bau), (key(\"Yarıya\"), half), (key(\"Stabil\"), stab), (key(\"Toparlanma\"), rec)]:\n        rows.append([name, tr(r.total_2026_2040, 0), f\"{tr(r.lo, 0)}–{tr(r.hi, 0)}\"])\n    B.append(Block(\"table\", rows=rows, widths=[0.56, 0.22, 0.22], num_cols=(1, 2)))\n    B.append(Block(\"note\", f\"Senaryolar arasındaki fark, su seviyesi sabitlendiğinde boşluk büyümesinin {pct(pp.beta_static)} \"\n                           \"oranında sürdüğü varsayımına (β) dayanır; bu değer kalibre edilmedi. DSİ kuyu verisiyle \"\n                           \"güncellenmelidir.\"))\n\n    # ---------------------------------------------------------------- 5. Yerleşimler\n    if st is not None and len(st):\n        B.append(Block(\"h1\", \"5. Yerleşimler\"))\n        cnt = st.level_name.value_counts()\n        dist = \", \".join(f\"{n}: {int(cnt.get(n, 0))}\" for n in reversed(I.THRESHOLDS[\"risk_names\"]))\n        B.append(Block(\"p\", f\"OpenStreetMap'teki {len(st)} yerleşim noktası için 1 km çevrenin en riskli %10'luk dilimine \"\n                            f\"göre risk sınıfı atandı ({dist}). Sıralama göreli bir önceliklendirmedir; yerinde inceleme yerine \"\n                            \"geçmez.\"))\n        rows = [[\"Yerleşim\", \"Tür\", \"Sınıf\", \"En yakın obruk\", \"Düşey hız\", \"2026–40 beklenen*\"]]\n        for _, r in st.head(15).iterrows():\n            rows.append([r[\"name\"] or \"(adsız)\", PLACE_TR.get(r.place, r.place), r.level_name,\n                         f\"{tr(r.nearest_sinkhole_km, 2)} km\",\n                         f\"{tr(r.vel_up, 0)} mm/yıl\" if r.vel_up is not None and np.isfinite(r.vel_up) else \"ölçülemedi\",\n                         f\"{tr(r.exp15_bau, 1)} / {tr(r.exp15_stab, 1)}\" if r.exp15_bau is not None else \"—\"])\n        B.append(Block(\"table\", rows=rows, widths=[0.25, 0.15, 0.13, 0.15, 0.15, 0.17], num_cols=(3, 4, 5)))\n        B.append(Block(\"p\", \"* 1 km çevrede 2026–2040 arasında beklenen obruk sayısı: mevcut eğilim / su düşüşü durursa.\"))\n        top = st.iloc[0]\n        B.append(Block(\"h2\", f\"Örnek yorum kartı: {top['name']}\"))\n        B.append(Block(\"p\", top.card[\"headline\"]))\n        B.append(Block(\"bullets\", items=[f\"{f['topic']}: {f['text']}\" for f in top.card[\"findings\"]]))\n        B.append(Block(\"p\", \"Ne yapmalı?\"))\n        B.append(Block(\"bullets\", items=top.card[\"actions\"]))\n\n    # ---------------------------------------------------------------- 6. İzleme ağı ve kuantum\n    B.append(Block(\"h1\", \"6. İzleme ağı ve kuantum hesaplama\"))\n    qb = R[\"qubo\"]; res = qb[\"results\"].copy()\n    B.append(Block(\"p\", f\"Beklenen obruk yoğunluğunu en iyi kapsayan ve birbirinden en az 1,5 km uzak {qb['K']} izleme noktası \"\n                        f\"(InSAR köşe yansıtıcısı, GNSS veya piyezometre) {len(qb['cand'])} aday arasından QUBO \"\n                        \"optimizasyonuyla seçildi.\"))\n    B.append(Block(\"figure\", png=_fig_png(RP.fig_qubo(R)), caption=\"Şekil 6. Önerilen izleme noktaları.\", width_cm=12.5))\n    rows = [[\"Çözücü\", \"Enerji\", \"Kısıt sağlandı\", \"Kapsanan risk\", \"Süre (s)\"]]\n    nm = {\"exact\": \"Kesin arama\", \"sa\": \"Benzetimli tavlama\", \"qaoa\": \"QAOA (p=2)\", \"dwave.hybrid\": \"D-Wave hibrit\"}\n    for _, r in res.iterrows():\n        rows.append([nm.get(r.method, r.method), tr(r.energy, 3), \"Evet\" if r.get(\"feasible\", True) else \"Hayır\",\n                     tr(r.get(\"risk_mass\", np.nan), 3), tr(r.time_s, 1)])\n    B.append(Block(\"table\", rows=rows, widths=[0.3, 0.17, 0.17, 0.18, 0.18], num_cols=(1, 3, 4)))\n    q_note = \"\"\n    if \"q_kernel\" in cv.index and \"rbf_nystroem\" in cv.index:\n        qa, ra = cv.loc[\"q_kernel\", \"auc\"], cv.loc[\"rbf_nystroem\", \"auc\"]\n        same = _ci_overlap(cv, \"q_kernel\", \"rbf_nystroem\")\n        q_note = (f\"Kuantum çekirdek AUC {tr(qa, 3)}, aynı bütçeli klasik çekirdek {tr(ra, 3)} verdi; \"\n                  + (\"güven aralıkları örtüştüğü için aralarındaki fark anlamlı değil. \" if same else\n                     (\"kuantum çekirdek anlamlı biçimde daha iyi. \" if qa > ra else \"klasik çekirdek anlamlı biçimde daha iyi. \"))\n                  + f\"En iyi klasik öğrenen ({MODEL_NAMES.get(best, best)}) AUC {tr(cv.loc[best, 'auc'], 3)} ile ikisinin de önünde.\")\n        B.append(Block(\"p\", q_note))\n    hw = R[\"hw_readiness\"]\n    rows = [[\"Devre (IBM Heron'a derlendikten sonra)\", \"2 kübitlik kapı\", \"Derinlik\", \"Tahmini sadakat\", \"Uygun\"]]\n    for _, r in hw.iterrows():\n        rows.append([r.circuit, tr(r.n2q, 0), tr(r.depth, 0), tr(r.est_fidelity, 2), \"Evet\" if r.eligible else \"Hayır\"])\n    B.append(Block(\"table\", rows=rows, widths=[0.4, 0.15, 0.13, 0.17, 0.15], num_cols=(1, 2, 3)))\n\n    # ---------------------------------------------------------------- 7. Söyleyebildiklerimiz\n    B.append(Block(\"h1\", \"7. Ne söyleyebiliriz, ne söyleyemeyiz?\"))\n    B.append(Block(\"h2\", \"Söyleyebildiklerimiz\"))\n    B.append(Block(\"bullets\", items=I.SAY))\n    B.append(Block(\"h2\", \"Söyleyemediklerimiz\"))\n    B.append(Block(\"bullets\", items=I.CANNOT_SAY))\n    B.append(Block(\"h2\", \"Kurumlar için öneriler\"))\n    B.append(Block(\"bullets\", items=[f\"{k}: {t}\" for k, t in I.INSTITUTION_NOTES]))\n\n    # ---------------------------------------------------------------- 8. İzlenebilirlik\n    B.append(Block(\"h1\", \"8. Veri izlenebilirliği ve dosyalar\"))\n    prov = R.get(\"provenance\")\n    if prov is not None and len(prov):\n        sm = prov.groupby(\"source\").agg(istek=(\"status\", \"size\"),\n                                        basarili=(\"status\", lambda s: int(s.isin([\"ok\", \"cache\"]).sum()))).reset_index()\n        rows = [[\"Kaynak\", \"İstek\", \"Başarılı / önbellek\"]] + [[r.source, str(r.istek), str(r.basarili)] for _, r in sm.iterrows()]\n        B.append(Block(\"table\", rows=rows, widths=[0.5, 0.25, 0.25], num_cols=(1, 2)))\n    files = sorted(p.name for p in cfg.outputs.glob(\"*\") if p.is_file())\n    B.append(Block(\"p\", \"Bu çalıştırmanın çıktı klasöründeki dosyalar: \" + \", \".join(files) + \".\"))\n    return dict(meta=meta, blocks=B)\n\n\n# ----------------------------------------------------------------------------------------------\n# Word\n# ----------------------------------------------------------------------------------------------\ndef to_docx(content: dict, path) -> Path:\n    from docx import Document\n    from docx.enum.section import WD_ORIENT\n    from docx.enum.table import WD_TABLE_ALIGNMENT\n    from docx.enum.text import WD_ALIGN_PARAGRAPH\n    from docx.oxml import OxmlElement\n    from docx.oxml.ns import qn\n    from docx.shared import Cm, Pt, RGBColor\n\n    ACC, INK, MUT, HEAD, NOTE = RGBColor(0x0E, 0x6B, 0x70), RGBColor(0x1D, 0x2A, 0x2C), RGBColor(0x5B, 0x6A, 0x6C), \"E6EDEA\", \"F1F5F3\"\n    doc = Document()\n    z = doc.settings.element.find(qn(\"w:zoom\"))  # varsayılan şablonda eksik öznitelik (şema uyumu)\n    if z is not None and z.get(qn(\"w:percent\")) is None:\n        z.set(qn(\"w:percent\"), \"100\")\n    sec = doc.sections[0]\n    sec.page_width, sec.page_height = Cm(21.0), Cm(29.7)\n    for m in (\"left_margin\", \"right_margin\", \"top_margin\", \"bottom_margin\"):\n        setattr(sec, m, Cm(2.0))\n    st = doc.styles[\"Normal\"]; st.font.name = \"Calibri\"; st.font.size = Pt(10.5); st.font.color.rgb = INK\n    st.element.rPr.rFonts.set(qn(\"w:eastAsia\"), \"Calibri\")\n    st.paragraph_format.space_after = Pt(6); st.paragraph_format.line_spacing = 1.15\n    for lvl, size, color in ((1, 16, ACC), (2, 13, INK)):\n        h = doc.styles[f\"Heading {lvl}\"]; h.font.name = \"Calibri\"; h.font.size = Pt(size); h.font.bold = True\n        h.font.color.rgb = color; h.element.rPr.rFonts.set(qn(\"w:eastAsia\"), \"Calibri\")\n        h.paragraph_format.space_before = Pt(14 if lvl == 1 else 10); h.paragraph_format.space_after = Pt(6)\n\n    def shade(cell, fill):\n        tcPr = cell._tc.get_or_add_tcPr(); sh = OxmlElement(\"w:shd\")\n        sh.set(qn(\"w:val\"), \"clear\"); sh.set(qn(\"w:color\"), \"auto\"); sh.set(qn(\"w:fill\"), fill); tcPr.append(sh)\n\n    def field(par, instr):\n        r = par.add_run(); f1 = OxmlElement(\"w:fldChar\"); f1.set(qn(\"w:fldCharType\"), \"begin\")\n        it = OxmlElement(\"w:instrText\"); it.set(qn(\"xml:space\"), \"preserve\"); it.text = instr\n        f2 = OxmlElement(\"w:fldChar\"); f2.set(qn(\"w:fldCharType\"), \"end\")\n        r._r.append(f1); r._r.append(it); r._r.append(f2)\n\n    # üst/alt bilgi\n    hp = sec.header.paragraphs[0]; hp.alignment = WD_ALIGN_PARAGRAPH.RIGHT\n    rr = hp.add_run(\"KOBRA · Karapınar obruk risk analizi · sonuç raporu\"); rr.font.size = Pt(8); rr.font.color.rgb = MUT\n    fp = sec.footer.paragraphs[0]; fp.alignment = WD_ALIGN_PARAGRAPH.CENTER\n    rr = fp.add_run(\"BVK Technology · sayfa \"); rr.font.size = Pt(8); rr.font.color.rgb = MUT\n    field(fp, \"PAGE\")\n\n    m = content[\"meta\"]\n    p = doc.add_paragraph(); r = p.add_run(\"BVK Technology · KOBRA\"); r.font.size = Pt(10); r.font.color.rgb = MUT\n    p = doc.add_paragraph(); r = p.add_run(m[\"title\"]); r.font.size = Pt(26); r.bold = True; r.font.color.rgb = ACC\n    p = doc.add_paragraph(); r = p.add_run(m[\"subtitle\"]); r.font.size = Pt(13)\n    rt = f\"{tr(m['runtime'] / 60, 1)} dk\" if m.get(\"runtime\") else \"—\"\n    p = doc.add_paragraph(); r = p.add_run(f\"Çalıştırma: {m['run']} · {m['n_inv']} obruk · {tr(m['grid'], 0)} m ızgara · \"\n                                           f\"{tr(m['n_cells'], 0)} hücre · süre {rt}\")\n    r.font.size = Pt(9); r.font.color.rgb = MUT\n\n    content_w = 17.0\n    for b in content[\"blocks\"]:\n        if b.kind == \"h1\":\n            doc.add_heading(b.text, level=1)\n        elif b.kind == \"h2\":\n            doc.add_heading(b.text, level=2)\n        elif b.kind == \"p\":\n            doc.add_paragraph(b.text)\n        elif b.kind == \"bullets\":\n            for it in b.items:\n                doc.add_paragraph(it, style=\"List Bullet\")\n        elif b.kind == \"figure\":\n            doc.add_picture(io.BytesIO(b.png), width=Cm(min(b.width_cm, content_w)))\n            doc.paragraphs[-1].alignment = WD_ALIGN_PARAGRAPH.CENTER\n            cp = doc.add_paragraph(); cp.alignment = WD_ALIGN_PARAGRAPH.CENTER\n            cr = cp.add_run(b.caption); cr.italic = True; cr.font.size = Pt(8.5); cr.font.color.rgb = MUT\n        elif b.kind == \"table\":\n            nrow, ncol = len(b.rows), len(b.rows[0])\n            t = doc.add_table(rows=nrow, cols=ncol); t.style = \"Table Grid\"; t.alignment = WD_TABLE_ALIGNMENT.CENTER\n            t.autofit = False\n            ws = b.widths or [1 / ncol] * ncol\n            for j, col in enumerate(t.columns):\n                col.width = Cm(content_w * ws[j])\n            for i, row in enumerate(b.rows):\n                for j, val in enumerate(row):\n                    c = t.cell(i, j); c.width = Cm(content_w * ws[j])\n                    c.text = \"\"; pr = c.paragraphs[0]\n                    run = pr.add_run(str(val)); run.font.size = Pt(9); run.bold = i == 0\n                    pr.paragraph_format.space_after = Pt(0)\n                    if j in b.num_cols and i > 0:\n                        pr.alignment = WD_ALIGN_PARAGRAPH.RIGHT\n                    if i == 0:\n                        shade(c, HEAD)\n            doc.add_paragraph()\n        elif b.kind == \"note\":\n            t = doc.add_table(rows=1, cols=1); c = t.cell(0, 0); shade(c, NOTE); c.width = Cm(content_w)\n            c.text = \"\"; run = c.paragraphs[0].add_run(b.text); run.font.size = Pt(9.5)\n            doc.add_paragraph()\n    path = Path(path)\n    doc.save(path)\n    return path\n\n\n# ----------------------------------------------------------------------------------------------\n# HTML\n# ----------------------------------------------------------------------------------------------\ndef to_html(content: dict, path, map_file=\"KOBRA_harita.html\") -> Path:\n    esc = lambda s: _html.escape(str(s))\n    m = content[\"meta\"]\n    toc, body = [], []\n    sec_i = 0\n    for b in content[\"blocks\"]:\n        if b.kind == \"h1\":\n            sec_i += 1; sid = f\"s{sec_i}\"\n            toc.append(f'<a href=\"#{sid}\">{esc(b.text)}</a>')\n            body.append(f'</section><section id=\"{sid}\"><h2>{esc(b.text)}</h2>')\n        elif b.kind == \"h2\":\n            body.append(f\"<h3>{esc(b.text)}</h3>\")\n        elif b.kind == \"p\":\n            body.append(f\"<p>{esc(b.text)}</p>\")\n        elif b.kind == \"bullets\":\n            body.append(\"<ul>\" + \"\".join(f\"<li>{esc(i)}</li>\" for i in b.items) + \"</ul>\")\n        elif b.kind == \"figure\":\n            src = \"data:image/png;base64,\" + base64.b64encode(b.png).decode()\n            body.append(f'<figure><img src=\"{src}\" alt=\"{esc(b.caption)}\" style=\"max-width:{b.width_cm / 17 * 100:.0f}%\">'\n                        f\"<figcaption>{esc(b.caption)}</figcaption></figure>\")\n        elif b.kind == \"table\":\n            h = \"\".join(f\"<th{' class=n' if j in b.num_cols else ''}>{esc(v)}</th>\" for j, v in enumerate(b.rows[0]))\n            rows = \"\".join(\"<tr>\" + \"\".join(f\"<td{' class=n' if j in b.num_cols else ''}>{esc(v)}</td>\"\n                                             for j, v in enumerate(r)) + \"</tr>\" for r in b.rows[1:])\n            body.append(f'<div class=\"tbl\"><table><thead><tr>{h}</tr></thead><tbody>{rows}</tbody></table></div>')\n        elif b.kind == \"note\":\n            body.append(f'<p class=\"note\">{esc(b.text)}</p>')\n    rt = f\"{tr(m['runtime'] / 60, 1)} dk\" if m.get(\"runtime\") else \"—\"\n    html = f\"\"\"<!doctype html><html lang=\"tr\"><head><meta charset=\"utf-8\">\n<meta name=\"viewport\" content=\"width=device-width,initial-scale=1,viewport-fit=cover\">\n<title>KOBRA Sonuç Raporu</title>\n<link rel=\"stylesheet\" href=\"https://fonts.googleapis.com/css2?family=Barlow+Condensed:wght@600;700&family=IBM+Plex+Sans:wght@400;500;600&family=IBM+Plex+Mono:wght@400&display=swap\">\n<style>\n/* Rapor düzeni: dar okuma sütunu + yapışkan içindekiler; harita arayüzüyle aynı palet ve yazı tipleri */\n:root{{--bg:#eef0ec;--paper:#f8f9f6;--ink:#1d2a2c;--muted:#5b6a6c;--line:#d5dbd6;--accent:#0e6b70;--note:#e4ece8;\n  --f-display:\"Barlow Condensed\",\"Arial Narrow\",system-ui,sans-serif;--f-body:\"IBM Plex Sans\",system-ui,-apple-system,\"Segoe UI\",sans-serif;\n  --f-mono:\"IBM Plex Mono\",ui-monospace,Menlo,monospace}}\n@media (prefers-color-scheme:dark){{:root:not([data-theme=\"light\"]){{--bg:#131a1b;--paper:#1a2324;--ink:#e3ebea;--muted:#9aaaa9;--line:#2d3a3b;--accent:#3fb5b0;--note:#243031;color-scheme:dark}}}}\n:root[data-theme=\"dark\"]{{--bg:#131a1b;--paper:#1a2324;--ink:#e3ebea;--muted:#9aaaa9;--line:#2d3a3b;--accent:#3fb5b0;--note:#243031;color-scheme:dark}}\nhtml,body{{margin:0}} body{{background:var(--bg);color:var(--ink);font:15px/1.6 var(--f-body);padding:0 16px}}\n.wrap{{max-width:1100px;margin:0 auto;display:grid;grid-template-columns:220px minmax(0,1fr);gap:32px;padding-block:28px}}\nnav{{position:sticky;top:16px;align-self:start;display:flex;flex-direction:column;gap:6px;font-size:13.5px}}\nnav a{{color:var(--muted);text-decoration:none}} nav a:hover{{color:var(--accent)}}\nnav .map{{margin-top:12px;display:inline-block;background:var(--accent);color:var(--paper);padding:8px 12px;border-radius:6px;font-weight:600;text-align:center}}\nmain{{background:var(--paper);border:1px solid var(--line);border-radius:10px;padding:28px 32px;min-width:0}}\nheader .eyebrow{{font:12px var(--f-mono);letter-spacing:.06em;text-transform:uppercase;color:var(--muted)}}\nh1{{font:700 40px/1.05 var(--f-display);margin:6px 0 4px;text-wrap:balance}}\nheader p{{margin:0;color:var(--muted)}}\nh2{{font:700 26px/1.2 var(--f-display);letter-spacing:.01em;color:var(--accent);margin:36px 0 10px;padding-top:8px;border-top:1px solid var(--line)}}\nh3{{font-size:16px;margin:20px 0 6px}}\np,li{{max-width:72ch}} ul{{padding-left:20px}}\nfigure{{margin:16px 0;text-align:center}} figure img{{max-width:100%;height:auto;border:1px solid var(--line);border-radius:6px;background:#fff}}\nfigcaption{{font-size:12.5px;color:var(--muted);margin-top:4px}}\n.tbl{{overflow-x:auto;margin:10px 0 14px}}\ntable{{border-collapse:collapse;width:100%;font-size:13.5px;font-variant-numeric:tabular-nums}}\nth,td{{padding:6px 8px;border-bottom:1px solid var(--line);text-align:left;vertical-align:top}}\nth{{font:600 11.5px var(--f-mono);text-transform:uppercase;letter-spacing:.03em;color:var(--muted);background:var(--note)}}\n.n{{text-align:right}}\n.note{{background:var(--note);border-left:3px solid var(--accent);padding:10px 14px;border-radius:4px;max-width:none}}\n@media (max-width:820px){{.wrap{{grid-template-columns:1fr}} nav{{position:static;flex-direction:row;flex-wrap:wrap;gap:10px}} main{{padding:20px 16px}}}}\n@media print{{nav{{display:none}} .wrap{{display:block}} main{{border:0}} body{{background:#fff}}}}\n</style></head><body><div class=\"wrap\">\n<nav aria-label=\"İçindekiler\">{''.join(toc)}<a class=\"map\" href=\"{esc(map_file)}\">Katmanlı haritayı aç</a></nav>\n<main><header><div class=\"eyebrow\">BVK Technology · KOBRA</div><h1>{esc(m['title'])}</h1>\n<p>{esc(m['subtitle'])}</p><p>Çalıştırma {esc(m['run'])} · {m['n_inv']} obruk · {esc(tr(m['grid'], 0))} m ızgara ·\n{esc(tr(m['n_cells'], 0))} hücre · süre {esc(rt)}</p></header>\n<section>{''.join(body)}</section></main></div></body></html>\"\"\"\n    path = Path(path)\n    path.write_text(html, encoding=\"utf-8\")\n    return path\n\n\ndef write_reports(R, stem=\"KOBRA_Sonuc_Raporu\"):\n    \"\"\"HTML ve Word raporlarını birbirinden bağımsız üretir: biri başarısız olursa diğeri yine yazılır.\n    Dönüş: (docx_yolu | None, html_yolu | None, hatalar sözlüğü).\"\"\"\n    out = R[\"cfg\"].outputs\n    errors = {}\n    c = build_content(R)\n    map_file = Path(R[\"webmap\"]).name if R.get(\"webmap\") else \"KOBRA_harita.html\"\n    h = d = None\n    try:\n        h = to_html(c, out / f\"{stem}.html\", map_file=map_file)\n    except Exception as e:\n        errors[\"html\"] = repr(e)\n    try:\n        d = to_docx(c, out / f\"{stem}.docx\")\n    except ModuleNotFoundError as e:\n        errors[\"docx\"] = (f\"{e!r} — Word raporu için python-docx gerekir: \"\n                          \"!pip -q install python-docx  komutunu çalıştırıp raporu yeniden üretin.\")\n    except Exception as e:\n        errors[\"docx\"] = repr(e)\n    return d, h, errors\n"
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "id": "3055b90f",
   "metadata": {
    "colab": {
     "base_uri": "https://localhost:8080/"
    },
    "id": "3055b90f",
    "executionInfo": {
     "status": "ok",
     "timestamp": 1791962704647,
     "user_tz": -180,
     "elapsed": 6,
     "user": {
      "displayName": "Joseph Volkan ÖZCAN",
      "userId": "11389530967736397480"
     }
    },
    "outputId": "92e6c8b3-bc10-42e9-815a-f38e04b1b70e"
   },
   "outputs": [
    {
     "output_type": "stream",
     "name": "stdout",
     "text": [
      "Writing obruk_engine/pipeline.py\n"
     ]
    }
   ],
   "source": "%%writefile obruk_engine/pipeline.py\n\"\"\"Uçtan uca KOBRA iş akışı (Colab'da tek çağrı: `run_all()`).\n\nAdımlar: veri → görüntü işleme → özellik ızgarası → klasik + kuantum doğrulama → nihai haritalar →\nfizik simülatörü (senaryolar) → izleme ağı QUBO → donanım hazırlık raporu → çıktılar.\n\"\"\"\nfrom __future__ import annotations\n\nimport json\nimport os\nimport pickle\nimport time\nfrom pathlib import Path\n\nimport numpy as np\nimport pandas as pd\n\nfrom .config import Config\nfrom .integration import DataHub, NGL_STATIONS\nfrom . import imaging as im, features as F, models as M, physics as PH, quantum as Q\nfrom . import interpret as I, webmap as W\n\n# Not: alçalan çerçeve (167D) AOI'nin yalnız batı kısmını (≈33,73°D'ye kadar) kapsar; ondan türeyen\n# katmanlar (los_vel_desc, vel_up, vel_east) öznitelik olarak KULLANILMAZ — kapsama sınırı obrukların\n# bulunduğu batı bölgesiyle çakıştığı için model \"veri var mı\" bilgisini öğrenir (eksiklik sızıntısı).\n# Bu katmanlar haritalama ve GNSS kontrolü için tutulur. Yükselen LOS hızı koherens maskesindeki\n# boşluklar 1 km normalize konvolüsyonla doldurularak kullanılır.\nSTATIC_FEATS = [\"elev\", \"slope\", \"relief_300m\", \"relief_1km\", \"dem_depression_depth\", \"depression_density_1km\",\n                \"dist_fault_km\", \"lc_cropland\", \"lc_grass\", \"lc_bare\", \"clay\",\n                \"los_vel_asc_filled\", \"insar_coh_asc\",\n                \"ndvi_summer_mean\", \"irrigated_freq\", \"ndvi_trend_per_yr\", \"irrigation_3km\"]\nMIN_FEATURE_COVERAGE = 0.95  # AOI hücrelerinin en az %95'inde tanımlı olmayan öznitelik dışarıda kalır\n\n\ndef fill_gaps(a, sigma_cells=5):\n    \"\"\"Normalize konvolüsyon ile boşluk doldurma (yalnız komşulukta veri varsa).\"\"\"\n    from scipy.ndimage import gaussian_filter\n    m = np.isfinite(a).astype(\"float32\")\n    num = gaussian_filter(np.nan_to_num(a), sigma_cells); den = gaussian_filter(m, sigma_cells)\n    out = np.where(m > 0, a, np.where(den > 0.05, num / np.maximum(den, 1e-6), np.nan))\n    return out.astype(\"float32\")\n\n\ndef _say(*a):\n    print(\"[KOBRA]\", *a)\n\n\ndef load_inventory(hub: DataHub, upload_path=None):\n    cfg = hub.cfg\n    osm = hub.osm_sinkholes()\n    sk = osm[osm.sinkhole != \"no\"].copy()\n    sk[\"year\"] = np.nan\n    if upload_path:\n        up = hub.load_upload_inventory(upload_path)\n        sk = pd.concat([sk, up], ignore_index=True)\n    sk = F.to_utm(sk)\n    # maar sahalarını ayıkla\n    for name, la, lo, rad in cfg.exclude_maars:\n        x, y = F.to_utm(pd.DataFrame(dict(lon=[lo], lat=[la])))[[\"x\", \"y\"]].values[0]\n        sk = sk[np.hypot(sk.x - x, sk.y - y) > rad]\n    # aynı 100 m hücreye düşen yinelenen kayıtları tekille\n    sk[\"cx\"], sk[\"cy\"] = (sk.x // cfg.grid_res_m), (sk.y // cfg.grid_res_m)\n    sk = sk.drop_duplicates([\"cx\", \"cy\"]).drop(columns=[\"cx\", \"cy\"]).reset_index(drop=True)\n    _say(f\"Envanter: {len(sk)} obruk (maarlar ayıklandı, hücre-tekil)\")\n    return sk\n\n\ndef build_grid(hub: DataHub, sbas=None, ndvi=None):\n    cfg = hub.cfg\n    g = F.make_grid(cfg)\n    dem, tr, crs = hub.copdem()\n    d30, tr30 = im.reproject_to(dem, tr, crs, g.crs, 30)\n    dep, depth = im.extract_depressions(d30, tr30, 30, min_depth=1.0)\n    F.add_terrain(g, d30, tr30, g.crs, depth, dep)\n    F.add_distance_to_lines(g, hub.gem_faults())\n    wc = hub.worldcover()\n    if wc is not None:\n        F.add_landcover(g, *wc)\n    sg = hub.soilgrids(\"clay\")\n    if sg is not None:\n        g.put(\"clay\", sg[0] / 10.0, sg[1], sg[2])  # g/kg → %\n    if sbas:\n        sbas = {k: dict(v) for k, v in sbas.items()}\n        for fr, r in sbas.items():\n            r[\"vel\"], off, n = im.clean_velocity(hub, fr, r)\n            _say(f\"InSAR {fr}: koherens<0,5 maskelendi, referans ofseti {off:+.1f} mm/yıl ({n} yüksek-arazi pikseli), \"\n                 f\"geçerli %{np.isfinite(r['vel']).mean() * 100:.0f}\")\n        F.add_insar(g, sbas)\n        if \"los_vel_asc\" in g.layers:\n            g.layers[\"los_vel_asc_filled\"] = fill_gaps(fill_gaps(g.layers[\"los_vel_asc\"], 5), 20)\n        fa = [k for k in sbas if k[3] == \"A\"]; fd = [k for k in sbas if k[3] == \"D\"]\n        if fa and fd:\n            A, D = sbas[fa[0]], sbas[fd[0]]\n            # ortak ızgaraya taşı ve ayrıştır\n            def on_grid(arr, r):\n                out = np.full(g.shape, np.nan, \"float32\")\n                from rasterio.warp import reproject, Resampling\n                reproject(arr.astype(\"float32\"), out, src_transform=r[\"transform\"], src_crs=r[\"crs\"],\n                          dst_transform=g.transform, dst_crs=g.crs, resampling=Resampling.average,\n                          src_nodata=np.nan, dst_nodata=np.nan)\n                return out\n            la = {c: on_grid(A[\"los\"][c], A) for c in \"ENU\" if c in A[\"los\"]}\n            ld = {c: on_grid(D[\"los\"][c], D) for c in \"ENU\" if c in D[\"los\"]}\n            if len(la) == 3 and len(ld) == 3:\n                U, E = im.decompose_asc_desc(g.layers[\"los_vel_asc\"], la, g.layers[\"los_vel_desc\"], ld)\n                g.layers[\"vel_up\"], g.layers[\"vel_east\"] = U, E\n    if ndvi:\n        F.add_ndvi(g, ndvi[0], ndvi[1])\n    return g, dep, sbas\n\n\ndef gnss_rates(hub):\n    out = {}\n    for s in (\"KAPN\", \"KAP1\"):\n        d = hub.ngl_gnss(s)\n        if d is not None and len(d) > 100:\n            t = d.decyear - d.decyear.iloc[0]\n            out[s] = dict(up=float(np.polyfit(t, d.u, 1)[0]), east=float(np.polyfit(t, d.e, 1)[0]),\n                          start=str(d.date.min().date()), end=str(d.date.max().date()), series=d)\n    return out\n\n\nQK_LOG = []\n\n\ndef quantum_scorers(n_qubits=6, n_landmarks=32, seed=42):\n    \"\"\"Her katta: kuantum çekirdek bant genişliği ve RBF gamma'sı aynı iç doğrulamayla seçilir.\"\"\"\n    def scorer(Xtr, ytr, Xte):\n        mkq = lambda bw: Q.QuantumKernelClassifier(n_qubits=n_qubits, reps=2, n_landmarks=n_landmarks, seed=seed,\n                                                   bandwidth=bw)\n        bw, sq = Q.tune_bandwidth(Xtr, ytr, mkq, seed=seed)\n        mkc = lambda gm: Q.RBFNystroemClassifier(n_qubits, n_landmarks, gamma=gm, seed=seed)\n        gm, sc = Q.tune_bandwidth(Xtr, ytr, mkc, grid=(0.05, 0.1, 0.25, 0.5, 1.0, 2.0), seed=seed)\n        QK_LOG.append(dict(q_bw=bw, q_inner=sq[bw], rbf_gamma=gm, rbf_inner=sc[gm]))\n        return {\"q_kernel\": mkq(bw).fit(Xtr, ytr).predict_proba(Xte),\n                \"rbf_nystroem\": mkc(gm).fit(Xtr, ytr).predict_proba(Xte)}\n    return scorer\n\n\ndef run_all(cfg: Config | None = None, inventory_upload=None, sbas_pickle=None, ndvi_pickle=None,\n            compute_insar=False, compute_ndvi=False, insar_period=(\"2022-06-01\", \"2024-06-01\"),\n            quantum=True, qubo_method_list=(\"exact\", \"sa\", \"qaoa\"), dwave=False, seed=42, interpret=True, reports=True):\n    t0 = time.time()\n    cfg = cfg or Config()\n    hub = DataHub(cfg)\n    R = dict(cfg=cfg)\n\n    # ---------------------------------------------------------------- veri + görüntü\n    sk = load_inventory(hub, inventory_upload)\n    R[\"inventory\"] = sk\n    sbas = None\n    if sbas_pickle and Path(sbas_pickle).exists():\n        sbas = pickle.load(open(sbas_pickle, \"rb\"))\n    elif compute_insar:\n        sbas = {}\n        for fr in (\"087A_05304_121415\", \"167D_05276_131313\"):\n            r = im.licsar_velocity(hub, fr, *insar_period)\n            if r:\n                sbas[fr] = r\n    ndvi = None\n    if ndvi_pickle and Path(ndvi_pickle).exists():\n        ndvi = pickle.load(open(ndvi_pickle, \"rb\"))\n    elif compute_ndvi:\n        g0 = F.make_grid(cfg)\n        ndvi = im.s2_summer_ndvi(hub, range(2017, 2026), (g0.xmin, g0.ymin, g0.xmax, g0.ymax), res=80)\n    g, dep, sbas = build_grid(hub, sbas, ndvi)\n    R.update(grid=g, depressions=dep, sbas=sbas)\n    R[\"gnss\"] = gnss_rates(hub)\n\n    # GNSS ile InSAR düşey hız kalibrasyon kontrolü (KAP1 2020–2023)\n    if \"vel_up\" in g.layers and \"KAP1\" in R[\"gnss\"]:\n        r, c = g.rc(*F.to_utm(pd.DataFrame(dict(lon=[NGL_STATIONS[\"KAP1\"][1]], lat=[NGL_STATIONS[\"KAP1\"][0]])))[[\"x\", \"y\"]].values[0])\n        patch = g.layers[\"vel_up\"][max(int(r) - 2, 0):int(r) + 3, max(int(c) - 2, 0):int(c) + 3]\n        R[\"gnss_insar_check\"] = dict(insar_up_at_KAP1=float(np.nanmedian(patch)), gnss_up_KAP1=R[\"gnss\"][\"KAP1\"][\"up\"])\n\n    # ---------------------------------------------------------------- tablo\n    df = g.frame()\n    valid = np.isfinite(df[\"elev\"]) & (df.get(\"lc_water\", 0) < 0.5)\n    df = df[valid].reset_index(drop=True)\n    cov = {f: float(np.isfinite(df[f]).mean()) for f in STATIC_FEATS if f in df.columns}\n    feats = [f for f, c in cov.items() if c >= MIN_FEATURE_COVERAGE]\n    R[\"feature_coverage\"] = cov\n    dropped = [f for f, c in cov.items() if c < MIN_FEATURE_COVERAGE]\n    if dropped:\n        _say(f\"Kapsama < %{MIN_FEATURE_COVERAGE * 100:.0f} olduğu için dışarıda: {dropped}\")\n    yv = F.label_layer(g, sk)\n    df[\"label\"] = yv[df.row.values, df.col.values]  # NOT: \"y\" UTM koordinatıdır, etiket ayrı sütunda\n    R[\"features\"] = feats\n    _say(f\"Izgara: {len(df):,} hücre, {df.label.sum()} pozitif, {len(feats)} statik öznitelik\")\n\n    # ---------------------------------------------------------------- doğrulama\n    qs = quantum_scorers(seed=seed) if quantum else None\n    QK_LOG.clear()\n    cv, oof = M.spatial_block_cv(df, feats, \"label\", block_m=5000, k=5, seed=seed, quantum_scorer=qs)\n    R[\"cv\"], R[\"oof\"] = cv, oof\n    R[\"qk_tuning\"] = pd.DataFrame(QK_LOG)\n    _say(\"Mekânsal blok CV:\\n\" + cv[[\"auc\", \"auc_lo\", \"auc_hi\", \"ap\", \"cap@1%\", \"cap@5%\", \"cap@10%\"]].round(3).to_string())\n\n    # ---------------------------------------------------------------- nihai modeller (tüm veri)\n    xy = df[[\"x\", \"y\"]].values\n    pos = np.where(df.label.values == 1)[0]\n    sm = np.zeros(len(df), bool); sm[pos] = True\n    df[\"dist_prior_km\"], df[\"dens_prior\"] = M.prior_features(xy, xy[pos], self_mask=sm)\n    fx = feats + [\"dist_prior_km\", \"dens_prior\"]\n    tr = M.sample_training(df, \"label\", 60, seed)\n    final = {}\n    for name, mdl in M.make_models(seed).items():\n        mdl.fit(tr[fx], tr.label); final[name] = mdl\n    best = cv.loc[[m for m in (\"lgbm\", \"rf\", \"logreg\") if m in cv.index], \"auc\"].idxmax()\n    p_best = final[best].predict_proba(df[fx])[:, 1]\n    prox = -df.dist_prior_km.values\n    df[\"p_learner\"], df[\"p_proximity\"] = p_best, M.rank01(prox)\n    df[\"susceptibility\"] = 0.5 * M.rank01(prox) + 0.5 * M.rank01(p_best)\n    R[\"best_learner\"] = best\n    # öznitelik önemi (permütasyon yerine LightGBM kazanç / RF önem)\n    try:\n        est = final[best][-1]\n        imp = getattr(est, \"feature_importances_\", None)\n        if imp is None:\n            imp = np.abs(est.coef_[0])\n        R[\"importance\"] = pd.Series(imp, index=fx).sort_values(ascending=False)\n    except Exception:\n        R[\"importance\"] = None\n    if quantum:\n        bw = float(R[\"qk_tuning\"].q_bw.median()) if len(R.get(\"qk_tuning\", [])) else 0.2\n        qk = Q.QuantumKernelClassifier(n_qubits=6, reps=2, n_landmarks=32, seed=seed, bandwidth=bw).fit(tr[fx].values, tr.label.values)\n        df[\"q_susceptibility\"] = qk.predict_proba(df[fx].values)\n        R[\"q_timing\"] = qk.timing\n        R[\"q_model\"] = qk\n    R[\"table\"] = df\n\n    # ---------------------------------------------------------------- fizik simülatörü\n    pphys, cal = PH.calibrate_horizons(area_frac=1.0)\n    scen, summ = PH.scenarios(pphys)\n    R.update(phys_params=pphys, phys_cal=cal, phys_scen=scen, phys_summary=summ)\n    # AOI payı: Karapınar ≈ 572/741 ≈ 0.77 (AFAD 2026); mevcut eğilim 2026 beklenen yıllık sayı\n    aoi_frac = 572 / 741\n    lam_aoi = float(scen[(scen.year == 2026) & scen.scenario.str.startswith(\"Mevcut\")][\"mean\"].iloc[0]) * aoi_frac\n    lam, p1 = PH.spatial_allocation(df[\"susceptibility\"].values ** 4, lam_aoi)\n    df[\"exp_annual_events\"], df[\"p_event_1yr\"] = lam, p1\n    R[\"lam_aoi_2026\"] = lam_aoi\n\n    # ---------------------------------------------------------------- izleme ağı QUBO\n    R[\"qubo\"] = monitoring_network(df, n_cand=16, K=5, methods=qubo_method_list, dwave=dwave, seed=seed)\n\n    # ---------------------------------------------------------------- donanım hazırlığı\n    ex = Q.Executor(\"sim.aer\")\n    x0 = np.full(6, 1.0); x1 = np.full(6, 2.0)\n    _, rep = ex.compile_check(Q.FeatureMap(6, 2).fidelity_circuit(x0, x1))\n    _, rep1 = ex.compile_check(Q.FeatureMap(6, 1).fidelity_circuit(x0, x1))\n    qq = R[\"qubo\"][\"Q\"]\n    _, rep2 = ex.compile_check(Q.qaoa_circuit(qq, len(R[\"qubo\"][\"cand\"]), [0.4, 0.8], [0.6, 0.3]))\n    R[\"hw_readiness\"] = pd.DataFrame([dict(circuit=\"Q-çekirdek 6q×2 tekrar\", **rep),\n                                      dict(circuit=\"Q-çekirdek 6q×1 tekrar\", **rep1),\n                                      dict(circuit=f\"QAOA p=2, {len(R['qubo']['cand'])}q\", **rep2)])\n\n    # ---------------------------------------------------------------- yorumlama + harita arayüzü\n    if interpret:\n        I.set_inventory_size(len(sk))\n        I.add_interpretation_layers(R)\n        places = hub.osm_places()\n        summ = R[\"phys_summary\"]\n        bau = float(summ.loc[[i for i in summ.index if i.startswith(\"Mevcut\")][0], \"total_2026_2040\"])\n        stab = float(summ.loc[[i for i in summ.index if i.startswith(\"Stabil\")][0], \"total_2026_2040\"])\n        R[\"settlements\"] = I.settlement_cards(R, places, scen_bau_total=bau, scen_stab_total=stab)\n        R[\"regional\"] = I.regional_summary(R, R[\"settlements\"])\n        R[\"webmap\"] = W.build_webmap(R, R[\"settlements\"], hub=hub)\n        _say(f\"Yorumlama: {len(R['settlements'])} yerleşim kartı; harita arayüzü → {R['webmap']}\")\n\n    # ---------------------------------------------------------------- çıktılar\n    save_outputs(R)\n    hub.save_provenance()\n    R[\"provenance\"] = hub.provenance()\n    R[\"runtime_s\"] = time.time() - t0\n    # ---------------------------------------------------------------- sonuç raporları (Word + HTML)\n    if reports:\n        from . import results as RS\n        try:\n            R[\"report_docx\"], R[\"report_html\"], R[\"report_errors\"] = RS.write_reports(R)\n        except Exception as e:  # içerik kurulamadıysa: analiz yine de döner\n            R[\"report_docx\"], R[\"report_html\"], R[\"report_errors\"] = None, None, {\"content\": repr(e)}\n        for k in (\"report_html\", \"report_docx\"):\n            if R[k]:\n                _say(f\"Sonuç raporu → {R[k]}\")\n        for k, msg in R[\"report_errors\"].items():\n            _say(f\"UYARI — {k} raporu üretilemedi: {msg}\")\n    _say(f\"Tamamlandı: {R['runtime_s'] / 60:.1f} dk\")\n    return R\n\n\ndef monitoring_network(df, n_cand=16, K=5, methods=(\"exact\", \"sa\", \"qaoa\"), dwave=False, seed=42, min_sep=1500):\n    \"\"\"En riskli bölgelerden birbirinden ≥ min_sep uzak n_cand aday seç; K izleme noktası için QUBO.\"\"\"\n    from scipy.spatial import cKDTree\n    # Risk kütlesi: adayın 2 km çevresindeki beklenen yıllık obruk sayısı toplamı\n    xy = df[[\"x\", \"y\"]].values; lam = df[\"exp_annual_events\"].values\n    tree = cKDTree(xy)\n    top = np.argsort(-lam)[:5000]\n    mass = np.array([lam[tree.query_ball_point(xy[i], r=2000)].sum() for i in top])\n    order = top[np.argsort(-mass)]; mass_s = np.sort(mass)[::-1]\n    cand = []\n    for i, m in zip(order, mass_s):\n        if all(np.hypot(xy[i, 0] - c[0], xy[i, 1] - c[1]) >= min_sep for c in cand):\n            cand.append((xy[i, 0], xy[i, 1], m))\n        if len(cand) >= n_cand:\n            break\n    cand = np.array(cand)\n    Qd = Q.build_monitoring_qubo(cand[:, :2], cand[:, 2], K=K, radius=min_sep * 2)\n    res, sols = [], {}\n    meths = list(methods) + ([\"dwave.hybrid\"] if dwave else [])\n    for m in meths:\n        try:\n            x, e, t = Q.solve_qubo(Qd, len(cand), m, seed=seed)\n            sel = np.where(x == 1)[0]\n            covered = float(cand[sel, 2].sum())  # seçilen noktaların risk kütlesi (beklenen obruk/yıl, 2 km)\n            res.append(dict(method=m, energy=e, n_selected=int(x.sum()), feasible=bool(x.sum() == K),\n                            risk_mass=covered, time_s=t, x=x))\n            sols[m] = x\n        except Exception as ex:\n            res.append(dict(method=m, energy=np.nan, n_selected=0, time_s=np.nan, x=None, error=repr(ex)[:120]))\n    R = pd.DataFrame(res)\n    if R.energy.notna().any():\n        e_opt = R.energy.min()\n        R[\"gap_to_opt\"] = R.energy - e_opt\n    return dict(cand=cand, Q=Qd, results=R, K=K, solutions=sols)\n\n\ndef save_outputs(R):\n    cfg, g, df = R[\"cfg\"], R[\"grid\"], R[\"table\"]\n    import rasterio\n    out = cfg.outputs\n    for col in (\"susceptibility\", \"p_learner\", \"p_proximity\", \"q_susceptibility\", \"exp_annual_events\", \"p_event_1yr\"):\n        if col not in df:\n            continue\n        a = np.full(g.shape, np.nan, \"float32\")\n        a[df.row.values, df.col.values] = df[col].values\n        with rasterio.open(out / f\"{col}.tif\", \"w\", driver=\"GTiff\", height=a.shape[0], width=a.shape[1], count=1,\n                           dtype=\"float32\", crs=g.crs, transform=g.transform, compress=\"deflate\", nodata=np.nan) as w:\n            w.write(a, 1)\n    R[\"cv\"].to_csv(out / \"cv_metrics.csv\")\n    R[\"phys_scen\"].to_csv(out / \"physics_scenarios.csv\", index=False)\n    R[\"hw_readiness\"].to_csv(out / \"hardware_readiness.csv\", index=False)\n    R[\"inventory\"].to_csv(out / \"inventory_used.csv\", index=False)\n    q = R[\"qubo\"][\"results\"].drop(columns=[\"x\"], errors=\"ignore\")\n    q.to_csv(out / \"qubo_monitoring.csv\", index=False)\n    if R.get(\"settlements\") is not None and len(R[\"settlements\"]):\n        st = R[\"settlements\"].copy()\n        st[\"yorum\"] = st.card.map(lambda c: \" | \".join(f[\"text\"] for f in c[\"findings\"]))\n        st.drop(columns=[\"card\"]).to_csv(out / \"yerlesim_kartlari.csv\", index=False, encoding=\"utf-8-sig\")\n    if R.get(\"regional\"):\n        (out / \"bolge_ozeti.txt\").write_text(\"\\n\\n\".join(R[\"regional\"][\"paragraphs\"]), encoding=\"utf-8\")\n"
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "id": "48148e59",
   "metadata": {
    "colab": {
     "base_uri": "https://localhost:8080/"
    },
    "id": "48148e59",
    "executionInfo": {
     "status": "ok",
     "timestamp": 1791962704656,
     "user_tz": -180,
     "elapsed": 9,
     "user": {
      "displayName": "Joseph Volkan ÖZCAN",
      "userId": "11389530967736397480"
     }
    },
    "outputId": "320b63d7-c56c-496e-d33e-f5423446d996"
   },
   "outputs": [
    {
     "output_type": "stream",
     "name": "stdout",
     "text": [
      "Writing obruk_engine/report.py\n"
     ]
    }
   ],
   "source": "%%writefile obruk_engine/report.py\n\"\"\"Faz 7 — Sonuçlar ve yorumlama: haritalar, grafikler ve tek dosyalık HTML raporu.\"\"\"\nfrom __future__ import annotations\n\nimport base64\nimport io\nfrom datetime import datetime\n\nimport matplotlib\nmatplotlib.use(\"Agg\")\nimport matplotlib.pyplot as plt\nimport numpy as np\nimport pandas as pd\n\nfrom . import features as F\nfrom .integration import NGL_STATIONS\n\nINK, MUTED, ACC, ACC2, WARN = \"#1d2433\", \"#6b7280\", \"#0f766e\", \"#b45309\", \"#b91c1c\"\nplt.rcParams.update({\"font.size\": 9, \"axes.edgecolor\": \"#9ca3af\", \"axes.labelcolor\": INK, \"xtick.color\": MUTED,\n                     \"ytick.color\": MUTED, \"axes.titleweight\": \"bold\", \"axes.titlesize\": 10, \"figure.dpi\": 130})\n\n\ndef _img(fig):\n    b = io.BytesIO(); fig.savefig(b, format=\"png\", bbox_inches=\"tight\"); plt.close(fig)\n    return base64.b64encode(b.getvalue()).decode()\n\n\ndef _extent(g):\n    return [g.xmin / 1000, g.xmax / 1000, g.ymin / 1000, g.ymax / 1000]\n\n\ndef _grid_from(df, g, col):\n    a = np.full(g.shape, np.nan, \"float32\"); a[df.row.values, df.col.values] = df[col].values\n    return a\n\n\ndef fig_susceptibility(R, col=\"susceptibility\", title=\"Obruk duyarlılığı (topluluk: yakınlık + öğrenen)\"):\n    g, df, sk = R[\"grid\"], R[\"table\"], R[\"inventory\"]\n    fig, ax = plt.subplots(figsize=(7.2, 5.4))\n    a = _grid_from(df, g, col)\n    im = ax.imshow(a, extent=_extent(g), cmap=\"magma_r\", vmin=np.nanpercentile(a, 50), vmax=np.nanpercentile(a, 99.8))\n    ax.scatter(sk.x / 1000, sk.y / 1000, s=10, facecolor=\"none\", edgecolor=\"#22d3ee\", lw=0.9, label=f\"Obruk (n={len(sk)})\")\n    gn = F.to_utm(pd.DataFrame([dict(n=k, lat=v[0], lon=v[1]) for k, v in NGL_STATIONS.items() if k.startswith(\"KAP\")]))\n    ax.scatter(gn.x / 1000, gn.y / 1000, marker=\"^\", s=40, c=ACC2, label=\"GNSS KAPN/KAP1\")\n    ax.set_xlabel(\"UTM 36N doğu (km)\"); ax.set_ylabel(\"kuzey (km)\"); ax.set_title(title)\n    ax.legend(loc=\"lower right\", fontsize=7, frameon=True)\n    fig.colorbar(im, ax=ax, shrink=0.75, label=\"sıra-ölçekli skor\")\n    return fig\n\n\ndef fig_insar(R):\n    g = R[\"grid\"]\n    lay = \"vel_up\" if \"vel_up\" in g.layers else \"los_vel_asc\"\n    if lay not in g.layers:\n        return None\n    fig, ax = plt.subplots(figsize=(7.2, 5.4))\n    a = g.layers[lay]\n    im = ax.imshow(a, extent=_extent(g), cmap=\"RdBu\", vmin=-80, vmax=80)\n    sk = R[\"inventory\"]\n    ax.scatter(sk.x / 1000, sk.y / 1000, s=10, facecolor=\"none\", edgecolor=\"k\", lw=0.8)\n    ax.set_title((\"Düşey hız (yükselen+alçalan ayrıştırma)\" if lay == \"vel_up\" else \"LOS hız (yükselen)\") +\n                 \" — COMET-LiCSAR SBAS, 2022–2024\")\n    ax.set_xlabel(\"UTM 36N doğu (km)\"); ax.set_ylabel(\"kuzey (km)\")\n    fig.colorbar(im, ax=ax, shrink=0.75, label=\"mm/yıl (− = çökme)\")\n    return fig\n\n\ndef fig_capture(R):\n    df = R[\"table\"]; y = df.label.values\n    fig, ax = plt.subplots(figsize=(6.4, 4.2))\n    fr = np.linspace(0, 0.3, 61)\n    cols = {\"proximity\": MUTED, \"logreg\": \"#64748b\", \"rf\": \"#0891b2\", \"lgbm\": ACC, \"ensemble\": INK,\n            \"q_kernel\": \"#7c3aed\", \"rbf_nystroem\": ACC2}\n    for name, s in R[\"oof\"].items():\n        ok = np.isfinite(s)\n        if ok.sum() < 100:\n            continue\n        o = np.argsort(-s[ok]); yy = y[ok][o]; n = ok.sum()\n        cap = [yy[: max(1, int(f * n))].sum() / max(yy.sum(), 1) for f in fr]\n        ax.plot(fr * 100, np.array(cap) * 100, label=name, color=cols.get(name, None), lw=2 if name in (\"ensemble\", \"q_kernel\") else 1.2)\n    ax.plot(fr * 100, fr * 100, \":\", color=\"#9ca3af\", label=\"rastgele\")\n    ax.set_xlabel(\"En riskli alan payı (%)\"); ax.set_ylabel(\"Yakalanan obruk (%)\")\n    ax.set_title(\"Alan-yakalama eğrileri (mekânsal blok CV, katlar-dışı)\")\n    ax.legend(fontsize=7, ncol=2)\n    return fig\n\n\ndef fig_physics(R):\n    cal, scen = R[\"phys_cal\"], R[\"phys_scen\"]\n    from .physics import OBS_RATES\n    fig, axs = plt.subplots(1, 2, figsize=(10.5, 3.8))\n    ax = axs[0]\n    ax.bar(cal.year, cal.sim_rate, color=\"#99f6e4\", label=\"Simülasyon (yıllık)\")\n    for (a, b), r in OBS_RATES:\n        ax.hlines(r, a - 0.4, b + 0.4, color=WARN, lw=2.5)\n    ax.plot([], [], color=WARN, lw=2.5, label=\"Gözlenen dönem ortalaması (havza)\")\n    ax2 = ax.twinx(); ax2.plot(cal.year, cal.wt_depth, color=INK, lw=1.2); ax2.invert_yaxis()\n    ax2.set_ylabel(\"Ort. YAS derinliği (m)\")\n    ax.set_title(\"Örtü-çökme simülatörü kalibrasyonu\"); ax.set_ylabel(\"obruk/yıl\"); ax.legend(fontsize=7, loc=\"upper left\")\n    ax = axs[1]\n    cmap = {s: c for s, c in zip(scen.scenario.unique(), [WARN, ACC2, ACC, \"#2563eb\"])}\n    for s, d in scen.groupby(\"scenario\"):\n        d = d[d.year >= 2010]\n        ax.plot(d.year, d[\"mean\"], color=cmap[s], label=s, lw=1.6)\n        ax.fill_between(d.year, d.p05, d.p95, color=cmap[s], alpha=0.12)\n    ax.axvline(2025.5, color=\"#9ca3af\", ls=\":\")\n    ax.set_title(\"YAS senaryoları — beklenen yıllık obruk (havza, %5–95)\"); ax.legend(fontsize=7)\n    return fig\n\n\ndef fig_qubo(R):\n    g, df = R[\"grid\"], R[\"table\"]\n    qb = R[\"qubo\"]; cand = qb[\"cand\"]; res = qb[\"results\"]\n    fig, ax = plt.subplots(figsize=(7.2, 5.4))\n    a = _grid_from(df, g, \"susceptibility\")\n    ax.imshow(a, extent=_extent(g), cmap=\"Greys\", vmin=np.nanpercentile(a, 50), vmax=1)\n    ax.scatter(cand[:, 0] / 1000, cand[:, 1] / 1000, s=30, facecolor=\"none\", edgecolor=MUTED, label=\"aday\")\n    mk = {\"exact\": (\"o\", ACC, 110), \"sa\": (\"s\", ACC2, 60), \"qaoa\": (\"x\", \"#7c3aed\", 60), \"dwave.hybrid\": (\"D\", WARN, 50)}\n    for meth, xs in qb.get(\"solutions\", {}).items():\n        sel = cand[np.asarray(xs).astype(int) == 1]\n        m, c, s = mk.get(meth, (\"+\", INK, 50))\n        e = float(res.loc[res.method == meth, \"energy\"].iloc[0])\n        ax.scatter(sel[:, 0] / 1000, sel[:, 1] / 1000, marker=m, s=s,\n                   facecolor=\"none\" if m in \"os\" else c, edgecolor=c, lw=1.4, label=f\"{meth} (E={e:.2f})\")\n    ax.set_xlim(g.xmin / 1000, g.xmax / 1000); ax.set_ylim(g.ymin / 1000, g.ymax / 1000)\n    ax.set_title(f\"İzleme ağı yerleşimi QUBO — {qb['K']} nokta / {len(cand)} aday\")\n    ax.legend(fontsize=7); ax.set_xlabel(\"UTM 36N doğu (km)\"); ax.set_ylabel(\"kuzey (km)\")\n    return fig\n\n\ndef fig_gnss(R):\n    if not R.get(\"gnss\"):\n        return None\n    fig, ax = plt.subplots(figsize=(7.2, 3.2))\n    for s, c in ((\"KAPN\", ACC), (\"KAP1\", WARN)):\n        if s in R[\"gnss\"]:\n            d = R[\"gnss\"][s][\"series\"]\n            ax.plot(d.date, d.u - d.u.iloc[:30].median(), \".\", ms=1.5, color=c,\n                    label=f\"{s} düşey {R['gnss'][s]['up']:.1f} mm/yıl\")\n    ax.set_ylabel(\"düşey (mm, istasyon başına göreli)\"); ax.legend(fontsize=7)\n    ax.set_title(\"GNSS düşey zaman serileri (Nevada Geodetic Lab, IGS20)\")\n    return fig\n\n\ndef fig_importance(R, top=14):\n    imp = R.get(\"importance\")\n    if imp is None:\n        return None\n    imp = imp.head(top)[::-1]\n    fig, ax = plt.subplots(figsize=(6.2, 4.0))\n    ax.barh(imp.index, imp.values / imp.values.max(), color=ACC)\n    ax.set_title(f\"Öznitelik önemi — {R['best_learner']} (göreli)\")\n    return fig\n\n\ndef html_report(R, path):\n    cv = R[\"cv\"].copy()\n    cols = [c for c in [\"auc\", \"auc_lo\", \"auc_hi\", \"ap\", \"cap@1%\", \"cap@2%\", \"cap@5%\", \"cap@10%\"] if c in cv]\n    cvt = cv[cols].round(3).to_html(classes=\"t\", border=0)\n    hw = R[\"hw_readiness\"].round(3).to_html(classes=\"t\", border=0, index=False)\n    qb = R[\"qubo\"][\"results\"].drop(columns=[\"x\"], errors=\"ignore\").round(3).to_html(classes=\"t\", border=0, index=False)\n    ps = R[\"phys_summary\"].to_html(classes=\"t\", border=0)\n    pp = R[\"phys_params\"]\n    gn = \"\".join(f\"<li><b>{k}</b> ({v['start']} → {v['end']}): düşey {v['up']:.1f} mm/yıl, doğu {v['east']:.1f} mm/yıl</li>\"\n                 for k, v in R[\"gnss\"].items())\n    chk = R.get(\"gnss_insar_check\")\n    chk_s = (f\"KAP1 konumunda InSAR düşey hız {chk['insar_up_at_KAP1']:.1f} mm/yıl (2022–24), GNSS {chk['gnss_up_KAP1']:.1f} \"\n             f\"mm/yıl (2020–23).\" if chk else \"InSAR–GNSS karşılaştırması yapılamadı.\")\n    figs = []\n    for fn, cap in ((fig_susceptibility, \"Nihai duyarlılık haritası\"), (fig_insar, \"InSAR deformasyon\"),\n                    (fig_capture, \"Doğrulama\"), (fig_importance, \"Öznitelik önemi\"), (fig_physics, \"Fizik simülatörü\"),\n                    (fig_qubo, \"İzleme ağı\"), (fig_gnss, \"GNSS\")):\n        f = fn(R)\n        if f is not None:\n            figs.append((cap, _img(f)))\n    if \"q_susceptibility\" in R[\"table\"]:\n        figs.insert(1, (\"Kuantum çekirdek haritası\", _img(fig_susceptibility(R, \"q_susceptibility\",\n                                                                               \"Kuantum çekirdek (6 kübit, Nyström-32) skoru\"))))\n    imgs = \"\".join(f'<figure><img src=\"data:image/png;base64,{b}\"/><figcaption>{c}</figcaption></figure>' for c, b in figs)\n    prov = R[\"provenance\"].groupby([\"source\", \"status\"]).size().unstack(fill_value=0).to_html(classes=\"t\", border=0)\n    html = f\"\"\"<!doctype html><html lang=\"tr\"><head><meta charset=\"utf-8\"><meta name=\"viewport\" content=\"width=device-width,initial-scale=1\">\n<title>KOBRA Çalıştırma Raporu</title><style>\n:root{{--ink:#1d2433;--muted:#6b7280;--acc:#0f766e;--bg:#fbfaf7;--card:#fff;--line:#e5e7eb}}\nbody{{font-family:Inter,system-ui,sans-serif;color:var(--ink);background:var(--bg);margin:0;padding:0 16px}}\nmain{{max-width:1040px;margin:24px auto}} h1{{font-size:24px;margin:0}} h2{{font-size:17px;margin-top:28px;border-bottom:1px solid var(--line);padding-bottom:4px}}\n.sub{{color:var(--muted)}} .t{{border-collapse:collapse;font-size:12px;margin:8px 0;overflow-x:auto;display:block}}\n.t th,.t td{{padding:4px 8px;border-bottom:1px solid var(--line);text-align:right}} .t th:first-child,.t td:first-child{{text-align:left}}\nfigure{{margin:12px 0;background:var(--card);border:1px solid var(--line);border-radius:8px;padding:8px}} img{{max-width:100%}}\nfigcaption{{color:var(--muted);font-size:12px}} .note{{background:#fff7ed;border-left:3px solid #b45309;padding:8px 12px;font-size:13px}}\n</style></head><body><main>\n<h1>KOBRA — Karapınar Obruk Risk Analiz Motoru</h1>\n<div class=\"sub\">Çalıştırma: {datetime.now():%Y-%m-%d %H:%M} · ızgara {R['cfg'].grid_res_m:.0f} m · {len(R['table']):,} hücre ·\nenvanter {len(R['inventory'])} obruk · süre {R.get('runtime_s', 0) / 60:.1f} dk</div>\n<p class=\"note\">Bu bir tarama ve önceliklendirme motorudur; tek tek obruk için zaman/konum kehaneti üretmez.\nEtiketler açık OSM envanterinden gelir (AFAD'ın 741 obruğunun küçük bir alt kümesi); AFAD/KTÜN veya makale envanteri\nyüklendiğinde tüm metrikler yeniden hesaplanır.</p>\n<h2>1. Doğrulama (mekânsal blok CV, 5 km)</h2>{cvt}\n<p>\"cap@x%\": haritanın en riskli %x alanında yakalanan obruk oranı. \"proximity\", geçmiş obruklara uzaklık taban çizgisidir;\nyakınlık öznitelikleri her katta yalnız eğitim bloklarından hesaplanmıştır (sızıntısız). En iyi öğrenen: <b>{R['best_learner']}</b>.</p>\n<h2>2. Jeodezi</h2><ul>{gn}</ul><p>{chk_s}</p>\n<h2>3. Fizik simülatörü (örtü-çökme, karst boşluk seviyeleri)</h2>\n<p>Kalibre parametreler: N={pp.n_cavities:.0f} boşluk, büyüme medyanı {pp.g_median:.2f} m/yıl (σ={pp.g_sigma:.2f}),\nsüffozyon eşiği {pp.seep_delta:.1f} m, durağan YAS büyüme oranı β={pp.beta_static} (<b>varsayım</b>).\n2026 için AOI beklenen yıllık obruk: {R['lam_aoi_2026']:.1f}.</p>{ps}\n<h2>4. Kuantum</h2><p>İzleme ağı QUBO sonuçları:</p>{qb}<p>Donanım hazırlığı (IBM Heron, derleme sonrası):</p>{hw}\n<h2>5. Şekiller</h2>{imgs}\n<h2>6. Veri izlenebilirliği</h2>{prov}\n</main></body></html>\"\"\"\n    open(path, \"w\", encoding=\"utf-8\").write(html)\n    return path\n"
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "id": "5124f786",
   "metadata": {
    "colab": {
     "base_uri": "https://localhost:8080/"
    },
    "id": "5124f786",
    "executionInfo": {
     "status": "ok",
     "timestamp": 1791962704660,
     "user_tz": -180,
     "elapsed": 4,
     "user": {
      "displayName": "Joseph Volkan ÖZCAN",
      "userId": "11389530967736397480"
     }
    },
    "outputId": "eac5e5a5-e675-4091-ca97-27a69349957d"
   },
   "outputs": [
    {
     "output_type": "stream",
     "name": "stdout",
     "text": [
      "Writing obruk_engine/assets/leaflet.min.css\n"
     ]
    }
   ],
   "source": "%%writefile obruk_engine/assets/leaflet.min.css\n.leaflet-image-layer,.leaflet-layer,.leaflet-marker-icon,.leaflet-marker-shadow,.leaflet-pane,.leaflet-pane>canvas,.leaflet-pane>svg,.leaflet-tile,.leaflet-tile-container,.leaflet-zoom-box{position:absolute;left:0;top:0}.leaflet-container{overflow:hidden}.leaflet-marker-icon,.leaflet-marker-shadow,.leaflet-tile{-webkit-user-select:none;-moz-user-select:none;user-select:none;-webkit-user-drag:none}.leaflet-tile::selection{background:0 0}.leaflet-safari .leaflet-tile{image-rendering:-webkit-optimize-contrast}.leaflet-safari .leaflet-tile-container{width:1600px;height:1600px;-webkit-transform-origin:0 0}.leaflet-marker-icon,.leaflet-marker-shadow{display:block}.leaflet-container .leaflet-overlay-pane svg{max-width:none!important;max-height:none!important}.leaflet-container .leaflet-marker-pane img,.leaflet-container .leaflet-shadow-pane img,.leaflet-container .leaflet-tile,.leaflet-container .leaflet-tile-pane img,.leaflet-container img.leaflet-image-layer{max-width:none!important;max-height:none!important;width:auto;padding:0}.leaflet-container img.leaflet-tile{mix-blend-mode:plus-lighter}.leaflet-container.leaflet-touch-zoom{-ms-touch-action:pan-x pan-y;touch-action:pan-x pan-y}.leaflet-container.leaflet-touch-drag{-ms-touch-action:pinch-zoom;touch-action:none;touch-action:pinch-zoom}.leaflet-container.leaflet-touch-drag.leaflet-touch-zoom{-ms-touch-action:none;touch-action:none}.leaflet-container{-webkit-tap-highlight-color:transparent}.leaflet-container a{-webkit-tap-highlight-color:rgba(51,181,229,.4)}.leaflet-tile{filter:inherit;visibility:hidden}.leaflet-tile-loaded{visibility:inherit}.leaflet-zoom-box{width:0;height:0;-moz-box-sizing:border-box;box-sizing:border-box;z-index:800}.leaflet-overlay-pane svg{-moz-user-select:none}.leaflet-pane{z-index:400}.leaflet-tile-pane{z-index:200}.leaflet-overlay-pane{z-index:400}.leaflet-shadow-pane{z-index:500}.leaflet-marker-pane{z-index:600}.leaflet-tooltip-pane{z-index:650}.leaflet-popup-pane{z-index:700}.leaflet-map-pane canvas{z-index:100}.leaflet-map-pane svg{z-index:200}.leaflet-vml-shape{width:1px;height:1px}.lvml{behavior:url(#default#VML);display:inline-block;position:absolute}.leaflet-control{position:relative;z-index:800;pointer-events:visiblePainted;pointer-events:auto}.leaflet-bottom,.leaflet-top{position:absolute;z-index:1000;pointer-events:none}.leaflet-top{top:0}.leaflet-right{right:0}.leaflet-bottom{bottom:0}.leaflet-left{left:0}.leaflet-control{float:left;clear:both}.leaflet-right .leaflet-control{float:right}.leaflet-top .leaflet-control{margin-top:10px}.leaflet-bottom .leaflet-control{margin-bottom:10px}.leaflet-left .leaflet-control{margin-left:10px}.leaflet-right .leaflet-control{margin-right:10px}.leaflet-fade-anim .leaflet-popup{opacity:0;-webkit-transition:opacity .2s linear;-moz-transition:opacity .2s linear;transition:opacity .2s linear}.leaflet-fade-anim .leaflet-map-pane .leaflet-popup{opacity:1}.leaflet-zoom-animated{-webkit-transform-origin:0 0;-ms-transform-origin:0 0;transform-origin:0 0}svg.leaflet-zoom-animated{will-change:transform}.leaflet-zoom-anim .leaflet-zoom-animated{-webkit-transition:-webkit-transform .25s cubic-bezier(0,0,.25,1);-moz-transition:-moz-transform .25s cubic-bezier(0,0,.25,1);transition:transform .25s cubic-bezier(0,0,.25,1)}.leaflet-pan-anim .leaflet-tile,.leaflet-zoom-anim .leaflet-tile{-webkit-transition:none;-moz-transition:none;transition:none}.leaflet-zoom-anim .leaflet-zoom-hide{visibility:hidden}.leaflet-interactive{cursor:pointer}.leaflet-grab{cursor:-webkit-grab;cursor:-moz-grab;cursor:grab}.leaflet-crosshair,.leaflet-crosshair .leaflet-interactive{cursor:crosshair}.leaflet-control,.leaflet-popup-pane{cursor:auto}.leaflet-dragging .leaflet-grab,.leaflet-dragging .leaflet-grab .leaflet-interactive,.leaflet-dragging .leaflet-marker-draggable{cursor:move;cursor:-webkit-grabbing;cursor:-moz-grabbing;cursor:grabbing}.leaflet-image-layer,.leaflet-marker-icon,.leaflet-marker-shadow,.leaflet-pane>svg path,.leaflet-tile-container{pointer-events:none}.leaflet-image-layer.leaflet-interactive,.leaflet-marker-icon.leaflet-interactive,.leaflet-pane>svg path.leaflet-interactive,svg.leaflet-image-layer.leaflet-interactive path{pointer-events:visiblePainted;pointer-events:auto}.leaflet-container{background:#ddd;outline-offset:1px}.leaflet-container a{color:#0078a8}.leaflet-zoom-box{border:2px dotted #38f;background:rgba(255,255,255,.5)}.leaflet-container{font-family:\"Helvetica Neue\",Arial,Helvetica,sans-serif;font-size:12px;font-size:.75rem;line-height:1.5}.leaflet-bar{box-shadow:0 1px 5px rgba(0,0,0,.65);border-radius:4px}.leaflet-bar a{background-color:#fff;border-bottom:1px solid #ccc;width:26px;height:26px;line-height:26px;display:block;text-align:center;text-decoration:none;color:#000}.leaflet-bar a,.leaflet-control-layers-toggle{background-position:50% 50%;background-repeat:no-repeat;display:block}.leaflet-bar a:focus,.leaflet-bar a:hover{background-color:#f4f4f4}.leaflet-bar a:first-child{border-top-left-radius:4px;border-top-right-radius:4px}.leaflet-bar a:last-child{border-bottom-left-radius:4px;border-bottom-right-radius:4px;border-bottom:none}.leaflet-bar a.leaflet-disabled{cursor:default;background-color:#f4f4f4;color:#bbb}.leaflet-touch .leaflet-bar a{width:30px;height:30px;line-height:30px}.leaflet-touch .leaflet-bar a:first-child{border-top-left-radius:2px;border-top-right-radius:2px}.leaflet-touch .leaflet-bar a:last-child{border-bottom-left-radius:2px;border-bottom-right-radius:2px}.leaflet-control-zoom-in,.leaflet-control-zoom-out{font:bold 18px 'Lucida Console',Monaco,monospace;text-indent:1px}.leaflet-touch .leaflet-control-zoom-in,.leaflet-touch .leaflet-control-zoom-out{font-size:22px}.leaflet-control-layers{box-shadow:0 1px 5px rgba(0,0,0,.4);background:#fff;border-radius:5px}.leaflet-control-layers-toggle{background-image:url(images/layers.png);width:36px;height:36px}.leaflet-retina .leaflet-control-layers-toggle{background-image:url(images/layers-2x.png);background-size:26px 26px}.leaflet-touch .leaflet-control-layers-toggle{width:44px;height:44px}.leaflet-control-layers .leaflet-control-layers-list,.leaflet-control-layers-expanded .leaflet-control-layers-toggle{display:none}.leaflet-control-layers-expanded .leaflet-control-layers-list{display:block;position:relative}.leaflet-control-layers-expanded{padding:6px 10px 6px 6px;color:#333;background:#fff}.leaflet-control-layers-scrollbar{overflow-y:scroll;overflow-x:hidden;padding-right:5px}.leaflet-control-layers-selector{margin-top:2px;position:relative;top:1px}.leaflet-control-layers label{display:block;font-size:13px;font-size:1.08333em}.leaflet-control-layers-separator{height:0;border-top:1px solid #ddd;margin:5px -10px 5px -6px}.leaflet-default-icon-path{background-image:url(images/marker-icon.png)}.leaflet-container .leaflet-control-attribution{background:#fff;background:rgba(255,255,255,.8);margin:0}.leaflet-control-attribution,.leaflet-control-scale-line{padding:0 5px;color:#333;line-height:1.4}.leaflet-control-attribution a{text-decoration:none}.leaflet-control-attribution a:focus,.leaflet-control-attribution a:hover{text-decoration:underline}.leaflet-attribution-flag{display:inline!important;vertical-align:baseline!important;width:1em;height:.6669em}.leaflet-left .leaflet-control-scale{margin-left:5px}.leaflet-bottom .leaflet-control-scale{margin-bottom:5px}.leaflet-control-scale-line{border:2px solid #777;border-top:none;line-height:1.1;padding:2px 5px 1px;white-space:nowrap;-moz-box-sizing:border-box;box-sizing:border-box;background:rgba(255,255,255,.8);text-shadow:1px 1px #fff}.leaflet-control-scale-line:not(:first-child){border-top:2px solid #777;border-bottom:none;margin-top:-2px}.leaflet-control-scale-line:not(:first-child):not(:last-child){border-bottom:2px solid #777}.leaflet-touch .leaflet-bar,.leaflet-touch .leaflet-control-attribution,.leaflet-touch .leaflet-control-layers{box-shadow:none}.leaflet-touch .leaflet-bar,.leaflet-touch .leaflet-control-layers{border:2px solid rgba(0,0,0,.2);background-clip:padding-box}.leaflet-popup{position:absolute;text-align:center;margin-bottom:20px}.leaflet-popup-content-wrapper{padding:1px;text-align:left;border-radius:12px}.leaflet-popup-content{margin:13px 24px 13px 20px;line-height:1.3;font-size:13px;font-size:1.08333em;min-height:1px}.leaflet-popup-content p{margin:17px 0;margin:1.3em 0}.leaflet-popup-tip-container{width:40px;height:20px;position:absolute;left:50%;margin-top:-1px;margin-left:-20px;overflow:hidden;pointer-events:none}.leaflet-popup-tip{width:17px;height:17px;padding:1px;margin:-10px auto 0;pointer-events:auto;-webkit-transform:rotate(45deg);-moz-transform:rotate(45deg);-ms-transform:rotate(45deg);transform:rotate(45deg)}.leaflet-popup-content-wrapper,.leaflet-popup-tip{background:#fff;color:#333;box-shadow:0 3px 14px rgba(0,0,0,.4)}.leaflet-container a.leaflet-popup-close-button{position:absolute;top:0;right:0;border:none;text-align:center;width:24px;height:24px;font:16px/24px Tahoma,Verdana,sans-serif;color:#757575;text-decoration:none;background:0 0}.leaflet-container a.leaflet-popup-close-button:focus,.leaflet-container a.leaflet-popup-close-button:hover{color:#585858}.leaflet-popup-scrolled{overflow:auto}.leaflet-oldie .leaflet-popup-content-wrapper{-ms-zoom:1}.leaflet-oldie .leaflet-popup-tip{width:24px;margin:0 auto}.leaflet-oldie .leaflet-control-layers,.leaflet-oldie .leaflet-control-zoom,.leaflet-oldie .leaflet-popup-content-wrapper,.leaflet-oldie .leaflet-popup-tip{border:1px solid #999}.leaflet-div-icon{background:#fff;border:1px solid #666}.leaflet-tooltip{position:absolute;padding:6px;background-color:#fff;border:1px solid #fff;border-radius:3px;color:#222;white-space:nowrap;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;pointer-events:none;box-shadow:0 1px 3px rgba(0,0,0,.4)}.leaflet-tooltip.leaflet-interactive{cursor:pointer;pointer-events:auto}.leaflet-tooltip-bottom:before,.leaflet-tooltip-left:before,.leaflet-tooltip-right:before,.leaflet-tooltip-top:before{position:absolute;pointer-events:none;border:6px solid transparent;background:0 0;content:\"\"}.leaflet-tooltip-bottom{margin-top:6px}.leaflet-tooltip-top{margin-top:-6px}.leaflet-tooltip-bottom:before,.leaflet-tooltip-top:before{left:50%;margin-left:-6px}.leaflet-tooltip-top:before{bottom:0;margin-bottom:-12px;border-top-color:#fff}.leaflet-tooltip-bottom:before{top:0;margin-top:-12px;margin-left:-6px;border-bottom-color:#fff}.leaflet-tooltip-left{margin-left:-6px}.leaflet-tooltip-right{margin-left:6px}.leaflet-tooltip-left:before,.leaflet-tooltip-right:before{top:50%;margin-top:-6px}.leaflet-tooltip-left:before{right:0;margin-right:-12px;border-left-color:#fff}.leaflet-tooltip-right:before{left:0;margin-left:-12px;border-right-color:#fff}@media print{.leaflet-control{-webkit-print-color-adjust:exact;print-color-adjust:exact}}"
  },
  {
   "cell_type": "markdown",
   "id": "1f5d71ae",
   "metadata": {
    "id": "1f5d71ae"
   },
   "source": "## Faz 4 — Veri entegrasyon katmanı\nSınıf A (anahtarsız) konnektörler doğrudan çalışır. Sınıf B (Earthdata/GEE), sınıf C (DSİ, AFAD, MTA, MGM, TUSAGA — resmî talep)\nve sınıf D (ticari SAR/optik, LiDAR uçuşu, drone) için `load_upload_*` arayüzleri vardır. Her istek önbelleğe alınır ve\n`provenance.csv` izlenebilirlik kaydına yazılır."
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "id": "07efe260",
   "metadata": {
    "colab": {
     "base_uri": "https://localhost:8080/",
     "height": 520
    },
    "id": "07efe260",
    "executionInfo": {
     "status": "ok",
     "timestamp": 1791962705014,
     "user_tz": -180,
     "elapsed": 353,
     "user": {
      "displayName": "Joseph Volkan ÖZCAN",
      "userId": "11389530967736397480"
     }
    },
    "outputId": "d00ce612-addb-48ba-d832-2008799379e3"
   },
   "outputs": [
    {
     "output_type": "display_data",
     "data": {
      "text/plain": [
       "           key                                               name cls  \\\n",
       "0          osm                           OpenStreetMap (Overpass)   A   \n",
       "1       copdem                    Copernicus DEM GLO-30 (AWS COG)   A   \n",
       "2   worldcover                    ESA WorldCover 10 m v200 (2021)   A   \n",
       "3   gem_faults                           GEM Global Active Faults   A   \n",
       "4          ngl             Nevada Geodetic Lab GNSS (IGS20 tenv3)   A   \n",
       "5        power                                         NASA POWER   A   \n",
       "6    openmeteo                             Open-Meteo ERA5 arşivi   A   \n",
       "7         afad                               AFAD deprem kataloğu   A   \n",
       "8         emsc                            EMSC SeismicPortal FDSN   A   \n",
       "9       licsar                                       COMET-LiCSAR   A   \n",
       "10   soilgrids                          ISRIC SoilGrids 2.0 (WCS)   A   \n",
       "11       wokam                    BGR WOKAM karst akifer haritası   A   \n",
       "12     s2_stac  Sentinel-2 L2A (Element84 Earth Search STAC, COG)   A   \n",
       "13         asf                  ASF (Sentinel-1 SLC, HyP3, NISAR)   B   \n",
       "14       grace                GRACE/GRACE-FO JPL Mascon (PO.DAAC)   B   \n",
       "\n",
       "                     license  \n",
       "0                       ODbL  \n",
       "1     Copernicus DEM lisansı  \n",
       "2                  CC BY 4.0  \n",
       "3               CC BY-SA 4.0  \n",
       "4               Atıf gerekli  \n",
       "5                Açık (NASA)  \n",
       "6                  CC BY 4.0  \n",
       "7   AFAD kaynak gösterilmeli  \n",
       "8                      CC BY  \n",
       "9                  CC BY 4.0  \n",
       "10                 CC BY 4.0  \n",
       "11                     © BGR  \n",
       "12           Copernicus açık  \n",
       "13      Copernicus/NASA açık  \n",
       "14                 NASA açık  "
      ],
      "text/html": [
       "\n",
       "  <div id=\"df-ad8f436d-84c1-4365-828e-f029a8555803\" class=\"colab-df-container\">\n",
       "    <div>\n",
       "<style scoped>\n",
       "    .dataframe tbody tr th:only-of-type {\n",
       "        vertical-align: middle;\n",
       "    }\n",
       "\n",
       "    .dataframe tbody tr th {\n",
       "        vertical-align: top;\n",
       "    }\n",
       "\n",
       "    .dataframe thead th {\n",
       "        text-align: right;\n",
       "    }\n",
       "</style>\n",
       "<table border=\"1\" class=\"dataframe\">\n",
       "  <thead>\n",
       "    <tr style=\"text-align: right;\">\n",
       "      <th></th>\n",
       "      <th>key</th>\n",
       "      <th>name</th>\n",
       "      <th>cls</th>\n",
       "      <th>license</th>\n",
       "    </tr>\n",
       "  </thead>\n",
       "  <tbody>\n",
       "    <tr>\n",
       "      <th>0</th>\n",
       "      <td>osm</td>\n",
       "      <td>OpenStreetMap (Overpass)</td>\n",
       "      <td>A</td>\n",
       "      <td>ODbL</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>1</th>\n",
       "      <td>copdem</td>\n",
       "      <td>Copernicus DEM GLO-30 (AWS COG)</td>\n",
       "      <td>A</td>\n",
       "      <td>Copernicus DEM lisansı</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>2</th>\n",
       "      <td>worldcover</td>\n",
       "      <td>ESA WorldCover 10 m v200 (2021)</td>\n",
       "      <td>A</td>\n",
       "      <td>CC BY 4.0</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>3</th>\n",
       "      <td>gem_faults</td>\n",
       "      <td>GEM Global Active Faults</td>\n",
       "      <td>A</td>\n",
       "      <td>CC BY-SA 4.0</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>4</th>\n",
       "      <td>ngl</td>\n",
       "      <td>Nevada Geodetic Lab GNSS (IGS20 tenv3)</td>\n",
       "      <td>A</td>\n",
       "      <td>Atıf gerekli</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>5</th>\n",
       "      <td>power</td>\n",
       "      <td>NASA POWER</td>\n",
       "      <td>A</td>\n",
       "      <td>Açık (NASA)</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>6</th>\n",
       "      <td>openmeteo</td>\n",
       "      <td>Open-Meteo ERA5 arşivi</td>\n",
       "      <td>A</td>\n",
       "      <td>CC BY 4.0</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>7</th>\n",
       "      <td>afad</td>\n",
       "      <td>AFAD deprem kataloğu</td>\n",
       "      <td>A</td>\n",
       "      <td>AFAD kaynak gösterilmeli</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>8</th>\n",
       "      <td>emsc</td>\n",
       "      <td>EMSC SeismicPortal FDSN</td>\n",
       "      <td>A</td>\n",
       "      <td>CC BY</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>9</th>\n",
       "      <td>licsar</td>\n",
       "      <td>COMET-LiCSAR</td>\n",
       "      <td>A</td>\n",
       "      <td>CC BY 4.0</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>10</th>\n",
       "      <td>soilgrids</td>\n",
       "      <td>ISRIC SoilGrids 2.0 (WCS)</td>\n",
       "      <td>A</td>\n",
       "      <td>CC BY 4.0</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>11</th>\n",
       "      <td>wokam</td>\n",
       "      <td>BGR WOKAM karst akifer haritası</td>\n",
       "      <td>A</td>\n",
       "      <td>© BGR</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>12</th>\n",
       "      <td>s2_stac</td>\n",
       "      <td>Sentinel-2 L2A (Element84 Earth Search STAC, COG)</td>\n",
       "      <td>A</td>\n",
       "      <td>Copernicus açık</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>13</th>\n",
       "      <td>asf</td>\n",
       "      <td>ASF (Sentinel-1 SLC, HyP3, NISAR)</td>\n",
       "      <td>B</td>\n",
       "      <td>Copernicus/NASA açık</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>14</th>\n",
       "      <td>grace</td>\n",
       "      <td>GRACE/GRACE-FO JPL Mascon (PO.DAAC)</td>\n",
       "      <td>B</td>\n",
       "      <td>NASA açık</td>\n",
       "    </tr>\n",
       "  </tbody>\n",
       "</table>\n",
       "</div>\n",
       "    <div class=\"colab-df-buttons\">\n",
       "\n",
       "  <div class=\"colab-df-container\">\n",
       "    <button class=\"colab-df-convert\" onclick=\"convertToInteractive('df-ad8f436d-84c1-4365-828e-f029a8555803')\"\n",
       "            title=\"Convert this dataframe to an interactive table.\"\n",
       "            style=\"display:none;\">\n",
       "\n",
       "  <svg xmlns=\"http://www.w3.org/2000/svg\" height=\"24px\" viewBox=\"0 -960 960 960\">\n",
       "    <path d=\"M120-120v-720h720v720H120Zm60-500h600v-160H180v160Zm220 220h160v-160H400v160Zm0 220h160v-160H400v160ZM180-400h160v-160H180v160Zm440 0h160v-160H620v160ZM180-180h160v-160H180v160Zm440 0h160v-160H620v160Z\"/>\n",
       "  </svg>\n",
       "    </button>\n",
       "\n",
       "  <style>\n",
       "    .colab-df-container {\n",
       "      display:flex;\n",
       "      gap: 12px;\n",
       "    }\n",
       "\n",
       "    .colab-df-convert {\n",
       "      background-color: #E8F0FE;\n",
       "      border: none;\n",
       "      border-radius: 50%;\n",
       "      cursor: pointer;\n",
       "      display: none;\n",
       "      fill: #1967D2;\n",
       "      height: 32px;\n",
       "      padding: 0 0 0 0;\n",
       "      width: 32px;\n",
       "    }\n",
       "\n",
       "    .colab-df-convert:hover {\n",
       "      background-color: #E2EBFA;\n",
       "      box-shadow: 0px 1px 2px rgba(60, 64, 67, 0.3), 0px 1px 3px 1px rgba(60, 64, 67, 0.15);\n",
       "      fill: #174EA6;\n",
       "    }\n",
       "\n",
       "    .colab-df-buttons div {\n",
       "      margin-bottom: 4px;\n",
       "    }\n",
       "\n",
       "    [theme=dark] .colab-df-convert {\n",
       "      background-color: #3B4455;\n",
       "      fill: #D2E3FC;\n",
       "    }\n",
       "\n",
       "    [theme=dark] .colab-df-convert:hover {\n",
       "      background-color: #434B5C;\n",
       "      box-shadow: 0px 1px 3px 1px rgba(0, 0, 0, 0.15);\n",
       "      filter: drop-shadow(0px 1px 2px rgba(0, 0, 0, 0.3));\n",
       "      fill: #FFFFFF;\n",
       "    }\n",
       "  </style>\n",
       "\n",
       "    <script>\n",
       "      const buttonEl =\n",
       "        document.querySelector('#df-ad8f436d-84c1-4365-828e-f029a8555803 button.colab-df-convert');\n",
       "      buttonEl.style.display =\n",
       "        google.colab.kernel.accessAllowed ? 'block' : 'none';\n",
       "\n",
       "      async function convertToInteractive(key) {\n",
       "        const element = document.querySelector('#df-ad8f436d-84c1-4365-828e-f029a8555803');\n",
       "        const dataTable =\n",
       "          await google.colab.kernel.invokeFunction('convertToInteractive',\n",
       "                                                    [key], {});\n",
       "        if (!dataTable) return;\n",
       "\n",
       "        const docLinkHtml = 'Like what you see? Visit the ' +\n",
       "          '<a target=\"_blank\" href=https://colab.research.google.com/notebooks/data_table.ipynb>data table notebook</a>'\n",
       "          + ' to learn more about interactive tables.';\n",
       "        element.innerHTML = '';\n",
       "        dataTable['output_type'] = 'display_data';\n",
       "        await google.colab.output.renderOutput(dataTable, element);\n",
       "        const docLink = document.createElement('div');\n",
       "        docLink.innerHTML = docLinkHtml;\n",
       "        element.appendChild(docLink);\n",
       "      }\n",
       "    </script>\n",
       "  </div>\n",
       "\n",
       "\n",
       "    </div>\n",
       "  </div>\n"
      ],
      "application/vnd.google.colaboratory.intrinsic+json": {
       "type": "dataframe",
       "summary": "{\n  \"name\": \"display(hub\",\n  \"rows\": 15,\n  \"fields\": [\n    {\n      \"column\": \"key\",\n      \"properties\": {\n        \"dtype\": \"string\",\n        \"num_unique_values\": 15,\n        \"samples\": [\n          \"licsar\",\n          \"wokam\",\n          \"osm\"\n        ],\n        \"semantic_type\": \"\",\n        \"description\": \"\"\n      }\n    },\n    {\n      \"column\": \"name\",\n      \"properties\": {\n        \"dtype\": \"string\",\n        \"num_unique_values\": 15,\n        \"samples\": [\n          \"COMET-LiCSAR\",\n          \"BGR WOKAM karst akifer haritas\\u0131\",\n          \"OpenStreetMap (Overpass)\"\n        ],\n        \"semantic_type\": \"\",\n        \"description\": \"\"\n      }\n    },\n    {\n      \"column\": \"cls\",\n      \"properties\": {\n        \"dtype\": \"category\",\n        \"num_unique_values\": 2,\n        \"samples\": [\n          \"B\",\n          \"A\"\n        ],\n        \"semantic_type\": \"\",\n        \"description\": \"\"\n      }\n    },\n    {\n      \"column\": \"license\",\n      \"properties\": {\n        \"dtype\": \"string\",\n        \"num_unique_values\": 12,\n        \"samples\": [\n          \"Copernicus/NASA a\\u00e7\\u0131k\",\n          \"Copernicus a\\u00e7\\u0131k\"\n        ],\n        \"semantic_type\": \"\",\n        \"description\": \"\"\n      }\n    }\n  ]\n}"
      }
     },
     "metadata": {}
    }
   ],
   "source": "import warnings; warnings.filterwarnings('ignore')\nimport numpy as np, pandas as pd, matplotlib.pyplot as plt\nfrom obruk_engine.config import Config\nfrom obruk_engine.integration import DataHub\ncfg = Config()\nhub = DataHub(cfg)\ndisplay(hub.catalogue())"
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "id": "b115aca9",
   "metadata": {
    "colab": {
     "base_uri": "https://localhost:8080/",
     "height": 440
    },
    "id": "b115aca9",
    "executionInfo": {
     "status": "ok",
     "timestamp": 1791962711699,
     "user_tz": -180,
     "elapsed": 6683,
     "user": {
      "displayName": "Joseph Volkan ÖZCAN",
      "userId": "11389530967736397480"
     }
    },
    "outputId": "c17d09ed-9ab1-44df-c996-a53b1b31fc7b"
   },
   "outputs": [
    {
     "output_type": "stream",
     "name": "stdout",
     "text": [
      "[KOBRA] OSM: 49 öğe (47 obruk, 2 'sinkhole=no')\n",
      "[KOBRA] NGL KAPN: 2308 gün, 2009-01 → 2015-10\n",
      "[KOBRA] NGL KAP1: 363 gün, 2020-09 → 2023-05\n",
      "[KOBRA] NASA POWER: 1981-01 → 2025-12\n",
      "49 OSM öğesi; 1575 AFAD depremi (AOI ±0,5°)\n"
     ]
    },
    {
     "output_type": "display_data",
     "data": {
      "text/plain": [
       "<Figure size 1200x350 with 2 Axes>"
      ],
      "image/png": "iVBORw0KGgoAAAANSUhEUgAAA/cAAAFPCAYAAAAIgD7+AAAAOnRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjEwLjAsIGh0dHBzOi8vbWF0cGxvdGxpYi5vcmcvlHJYcgAAAAlwSFlzAAAPYQAAD2EBqD+naQAA+CBJREFUeJzsnXl4VOXZh+8zeybJJCE7IQkE2RdBFERlUSOoqFi1VpRqXXC3uFssn1q14lKt1FqruFYRrK0WV8QgIgiCIovsS4BAIPsy2WY/3x9nzkkmmewTsr33dc0FM2d7z8xkznne5/f8HkmWZRmBQCAQCAQCgUAgEAgE3RZdZw9AIBAIBAKBQCAQCAQCQfsQwb1AIBAIBAKBQCAQCATdHBHcCwQCgUAgEAgEAoFA0M0Rwb1AIBAIBAKBQCAQCATdHBHcCwQCgUAgEAgEAoFA0M0Rwb1AIBAIBAKBQCAQCATdHBHcCwQCgUAgEAgEAoFA0M0Rwb1AIBAIBAKBQCAQCATdHBHcCwQCgUAgEAgEAoFA0M0Rwb1A0Ivo378/v/vd7wJeO3ToEJIk8Ze//AWAiIiIBut0RS688ELmzJnT2cMI4PTTT+fBBx/s7GEIBAJBp/G73/2O/v37B7wmSRKPPfZYk9v179+fiy66qOMG1kruv/9+brvtNiorK8nLy+PUU0/l888/7/DjdsVrm6D3sHz5ciIiIigsLOzsoQjaiAjuBYI6HDx4kDvvvJPBgwdjtVqxWq0MHz6cO+64g23btgWs+9hjjyFJEomJiVRXVzfYV7AblcrKSh599FFGjhxJeHg4sbGxjBkzhrlz53Ls2LGAddeuXcsFF1xASkoKFouFtLQ0Lr74Yt5///2QnnN8fDzvvvsuM2bMAOCNN97glltuCekxQs3333/PihUreOihhzp7KAE89NBDvPzyy+Tl5XX2UAQCgaDNXHDBBcTExJCfn99gWXl5OcnJyUyYMAGfz9cJozsx/O53v+P9998nMjKS5ORknE4nZ599doceM9i17dtvv0WSJCRJYtOmTUHHGRER0eg+x48fjyRJvPLKK42u88svv3DFFVeQnp6OxWIhJSWF8847j5deeqnRba688kokSWr1dVg9F0mS0Ol09O3bl2nTpvHtt982WNftdvO3v/2N0047jcjISCIiIjjttNP429/+htvtDlh3+PDhnHzyyQ328fHHHyNJElOmTGmw7M0330SSJFasWAHA22+/HTC++o8ffvgh6HlIkoTNZmPKlCknZAKoIzn//PM56aSTWLBgQWcPRdBGRHAvEPj57LPPGDlyJO+++y6ZmZn89a9/ZeHChVxwwQV88cUXjBkzhsOHDzfYrqCgoMmLporb7Wby5Mk899xzTJo0iRdeeIGHH36YU045hffff5+9e/dq63744YdMnjyZ/Px85s6dy0svvcTs2bMpLS1l0aJFIT3v8PBwZs+ezbBhwwD4zW9+w8SJE0N6jFDz3HPPce6553LSSSd19lACmDlzJjabjX/84x+dPRSBQCBoM//4xz9wuVzcc889DZY9/PDDFBUV8dprr6HT9dzbyJEjR3LgwAGWLVvGihUr2LRpE1artUOP2dy1rTn1Q3327dvHjz/+SP/+/Vm8eHHQddatW8epp57K1q1bmTNnDn//+9+56aab0Ol0LFy4MOg2drudTz/9lP79+7NkyRJkWW7VuM477zzeffdd3nnnHW699Va2bdvGOeecw5dffqmtU1VVxXnnncfcuXNJSkri6aef5rnnnqNv377MnTuX8847j6qqKm39s846i+3bt1NeXh5wrO+//x6DwcCPP/7YYELg+++/R6/XN7jnefzxx3n33XcbPOp/Lup5/Otf/+LBBx9k//79XHzxxXz11Vetej+6GrfccguvvvoqFRUVnT0UQVuQBQKBvH//fjk8PFweNmyYfOzYsQbL3W63vHDhQjknJ0d77dFHH5UBecyYMXJiYqJcXV0dsE16ero8Y8YM7fm///1vGZAXL17cYP81NTVyeXm59nz48OHyiBEjZKfT2WDd/Pz8Np2jOqbrrruuzdt3BfLz82WDwSC//vrrnT2UoNx5551yenq67PP5OnsoAoFA0GaeeeYZGZC/+uor7bWNGzfKOp1OfvDBBxvd7rrrrpPT09MDXgPkRx99tMnj1b9m9jYau7atWrVKu9cA5E2bNgUsv+666+Tw8PCg+3zkkUfkhIQE+b///a8sSZJ88ODBButceOGFcnx8vFxaWhp0TMF48803ZaPRKH/zzTcyIH/77bctO0lZ+S7ccccdAa9t27ZNBuRp06Zpr918880yIL/00ksN9vH3v/9dBuRbb71Ve+2dd96RAfmLL74IWPf000+Xr776ahmQ169fH7Bs8ODB8tixY7Xn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dB8Mza8iEPR8Bg0axPvvv8+sWbMYMmQI11xzDSeffDKyLHPw4EHef/99dDpdg4tIMB599NGgtVlff/01jz76KJdccgmnn346ERERZGdn8+abb+J0OgPq52bOnMmAAQO4+OKLGThwIFVVVWRlZfHpp59y2mmncfHFFzd6/Pj4eO6//34WLFjARRddxIUXXsjmzZv58ssvG8irpk2bRlpaGjfeeCMPPPAAer2eN998k/j4eHJycrT13nnnHf7xj3/wq1/9ioEDB1JRUcGiRYuw2WxceOGFgDKxccstt7BgwQK2bNnCtGnTMBqN7Nu3jw8//JCFCxdyxRVXBIzz/PPP58MPPyQ6OpoZM2Y0+96CorIwGAxkZWVx8803t2ibE8nXX39NWloaY8eO7eyhCAQCQbfkpJNOYsWKFUydOpXp06fzzTffYLPZmtymuWvKtGnTMJlMXHzxxdxyyy1UVlayaNEiEhISAtRwiYmJzJ07l+eff57LLruM888/n61bt/LJJ58QFxfXZA3yN998w5133smvf/1rBg8ejMfj4d1330Wv13P55Zc3Of7WXtvmzp3LX//6V7Zu3Roga1+8eDGxsbGNTjBfcsklLFq0iM8//5zLLruMu+66i+rqan71q18xdOhQXC4X69at44MPPqB///5cf/312n71en2j1+pLLrmEP/7xjyxdurTdhnIAf/3rX9m9eze33347y5cv1zL0X331FcuWLWPKlCk8//zzDbZTs/Hr169v4Etw+umnI0kSP/zwAxdffHGjn+WXX37J7t27G7x+xhlnkJGR0eS4f/e73/HII4/wzDPPcOmll2qvS5LElClTtH71XZmCggK2bdvGHXfc0dlDEbQBEdwLBH5mzpzJL7/8wvPPP8+KFSt48803kSSJ9PR0ZsyYwa233tpAWh6MqVOnMmXKlAY1bZdffjkVFRWsWLGCb775hpKSEmJiYhg/fjz33XdfwITA66+/zrJly/j3v//NsWPHkGWZjIwM/vjHP/LQQw8FuLYH48knn8RisfDPf/6TVatWMWHCBFasWNHgomw0Gvn444+5/fbb+b//+z+SkpK4++67iYmJ0S7ooATuGzduZOnSpVrQf9FFF7F48eIAJ+J//vOfjBs3jldffZWHH34Yg8FA//79mT17dlDfgmuvvZbPPvuMK6+8ErPZ3Ox7C8qN14UXXsi///3vLhfc+3w+/vvf/zZw7BcIBAJB6xg1ahRffvklmZmZXHzxxSxfvryBhL4+TV1ThgwZwn/+8x/mz5/P/fffT1JSErfddhvx8fHccMMNAes+88wzWK1WFi1axPLly5kwYQJfffUVU6ZMwWKxNHr8k08+menTp/Ppp59y5MgRXC4XZ599Nl9++SWnn356k2Nv7bUtOjqau+++O0CaX1BQQFZWFrNmzWq0vvrcc8/FarXy3nvvcdlll/GXv/yFDz/8kC+++ILXXnsNl8tFWloat99+O/Pnzyc6OlqrvT/jjDPo06dP0P2OHDmSAQMG8N5774UkuI+IiGDlypX84x//4L333uOBBx5AlmWGDh3Kiy++yO23347RaGyw3emnn47BYMDj8TSY4LDZbIwcOZJt27Y1Kcl/5JFHgr7+1ltvNRvch4WFceedd/LYY4/x7bffMnXqVM2bKDk5ubnT7hJ89NFHmM3mFvkgCboektzdi0IEAsEJxefzMXr0aP79738HGNm0hWXLlnHppZfy3XffMWnSpBZvt2bNGqZOncru3bsbdAXoTP73v/9x9dVXc+DAgW5zERcIBIKeQluvKS2hvLyc6OhonnzySf74xz+2aJvp06dzzz33BNSFN0VXvbYJ2scXX3zBRRddxNatWwM8ALoqY8eOZerUqSek9aUg9Iiae4FA0Cp0Oh3Tp09nyZIl7d7XokWLyMjIaLWpzaRJk5g2bRrPPvtsu8cQSp555hnuvPNOEdgLBAJBJ9DWa0p9gnW8UQOdqVOntng/qsKtpXTVa5ugfaxatYqrrrqqWwT2y5cvZ9++fcybN6+zhyJoI0KWLxAIWsyiRYuQJIkvv/yyxZmIYCxdupRt27bx+eefs3DhwjZJ2EPVDjCUrF+/vrOHIBAIBL2OUFxT6vLBBx/w9ttvc+GFFxIREcHatWtZsmQJ06ZNa1Fr3A8++ICKigo++OADEhISWnXsrnhtE7SP5557rrOH0GLOP/98rYxA0D0Rwb1AIGgx69evZ/HixZx00knccsstbd7PrFmziIiI4MYbb+T2228P4QgFAoFA0NsI9TVl9OjRGAwGnn32Wex2u2ay9+STT7Zo+127dvH000+TlJTE008/3e7xCAQCQUsRNfcCgUAgEAgEAoFAIBB0c0TNvUAgEAgEAoFAIBAIBN0cEdwLBAKBQCAQCAQCgUDQzekVNfc+n49jx44RGRkpek8LBAKBoNORZZmKigr69u2LTifm2UOBuNYLBAKBoKtxoq/3vSK4P3bsGKmpqZ09DIFAIBAIAjhy5Aj9+vXr7GH0CMS1XiAQCARdlRN1ve8VwX1kZCSgvKk2m62TRyMQCASC3o7dbic1NVW7Pgnaj7jWCwQCgaCrcaKv970iuFfleTabTVzwBQKBQNBlEPLx0CGu9QKBQCDoqpyo632nFvotWLCA0047jcjISBISErj00kvZs2dPwDpTp05FkqSAx6233tpJIxYIBAKBQCAQCAQCgaDr0anB/erVq7njjjv44Ycf+Prrr3G73UybNo2qqqqA9ebMmcPx48e1x7PPPttJIxYIBAKBQCAQCAQCgaDr0amy/OXLlwc8f/vtt0lISGDTpk1MnjxZe91qtZKUlHSihycQCAQCgUAgEAgEAkG3oEv13ykvLwegT58+Aa8vXryYuLg4Ro4cybx586iurm5yP06nE7vdHvAQCAQCgUAgEAgEAoGgp9JlDPV8Ph933303Z555JiNHjtRev/rqq0lPT6dv375s27aNhx56iD179vDRRx81uq8FCxbwpz/96UQMWyAQCAQCgUAgEAgEgk5HkmVZ7uxBANx22218+eWXrF27tskegN988w3nnnsu+/fvZ+DAgUHXcTqdOJ1O7bnagqC8vFw46AoEAoGg07Hb7URFRYnrUggR76lAIBAIuhon+trUJTL3d955J5999hnfffddk4E9wIQJEwCaDO7NZjNmsznk4xQIBAKBQCAQCAQCgaAr0qnBvSzL3HXXXXz88cd8++23DBgwoNlttmzZAkBycnIHj04gEAgEAoFAIBAIBILuQacG93fccQfvv/8+y5YtIzIykry8PACioqIICwvjwIEDvP/++1x44YXExsaybds27rnnHiZPnszo0aM7c+itIt/uYMnGHGaNTyPRZuns4QgEAoFA0GPx+bpEtaFAIBAIBCecTnXLf+WVVygvL2fq1KkkJydrjw8++AAAk8lEVlYW06ZNY+jQodx3331cfvnlfPrpp5057FazZGMOWbvyWbIxp7OHIhAIBAJBj6awwtn8SgKBQCAQ9EA6XZbfFKmpqaxevfoEjabjmDU+LeBfgUAgEAgEHcPRsmoGpXb2KAQCgUAgOPF0CUO9nky+3cGiNdlInT0QgUAgEAh6AcfK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\n"
     },
     "metadata": {}
    }
   ],
   "source": "osm = hub.osm_sinkholes()          # Karapınar'da obruklar natural=cliff + sinkhole=yes olarak etiketli\nkapn, kap1 = hub.ngl_gnss('KAPN'), hub.ngl_gnss('KAP1')\npower = hub.nasa_power_monthly()\nquakes = hub.afad_quakes()\nprint(len(osm), 'OSM öğesi;', len(quakes) if quakes is not None else 0, 'AFAD depremi (AOI ±0,5°)')\nfig, ax = plt.subplots(1, 2, figsize=(12, 3.5))\nfor d in (kapn, kap1): ax[0].plot(d.date, d.u, '.', ms=1, label=d.station.iloc[0])\nax[0].set_title('GNSS düşey (mm)'); ax[0].legend()\npower['precip_mm'].resample('YE').sum().plot(ax=ax[1], title='Yıllık yağış (NASA POWER, mm)'); plt.show()"
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "id": "a49dc8e4",
   "metadata": {
    "id": "a49dc8e4"
   },
   "outputs": [],
   "source": "# Resmî/ticari veriler geldiğinde (CSV/XLSX/GeoJSON/GeoTIFF) buraya yükleyin:\n# inv   = hub.load_upload_inventory('/content/AFAD_obruk_envanteri.xlsx')   # lat, lon, tarih, çap, derinlik\n# wells = hub.load_upload_wells('/content/DSI_kuyu_seviyeleri.csv')         # well_id, lat, lon, date, depth_to_water_m\n# lidar, meta = hub.load_upload_raster('/content/lidar_dem.tif', 'lidar_dem')\n# s1 = hub.asf_search_s1(start='2024-01-01')   # Sentinel-1 SLC listesi (arama anahtarsız)\n# gunw = hub.nisar_gunw()                       # NISAR L-bant GUNW (Earthdata girişi)"
  },
  {
   "cell_type": "markdown",
   "id": "38d471a2",
   "metadata": {
    "id": "38d471a2"
   },
   "source": "## Faz 5 — Görüntü işleme katmanı\n* **DEM/LiDAR/drone:** kapalı çukur çıkarımı + obruk benzerlik skoru (dairesellik, derinlik/çap, alan); iki dönem DEM farkı.\n* **InSAR (COMET-LiCSAR):** AOI penceresinde küçük-baz SBAS (Tikhonov köprülemeli), koherens maskesi, kararlı yüksek araziye\n  referanslama, yükselen+alçalan → düşey/doğu ayrıştırma; GNSS ile kontrol.\n* **NISAR L-bant:** GUNW okuyucu (tarımsal alanlarda C-bant dekorelasyonuna karşı).\n* **Sentinel-2:** yaz NDVI kompoziti → sulama sıklığı (yeraltı suyu çekim baskısı vekili).\n* **SAR genlik / drone ortofoto:** log-oran değişim tespiti, karanlık-dairesel boşluk adayları, opsiyonel SAM."
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "id": "23633bf0",
   "metadata": {
    "colab": {
     "base_uri": "https://localhost:8080/",
     "height": 503
    },
    "id": "23633bf0",
    "executionInfo": {
     "status": "ok",
     "timestamp": 1791962720953,
     "user_tz": -180,
     "elapsed": 9251,
     "user": {
      "displayName": "Joseph Volkan ÖZCAN",
      "userId": "11389530967736397480"
     }
    },
    "outputId": "bbb1ce39-336a-408d-f71c-11b2765c5173"
   },
   "outputs": [
    {
     "output_type": "stream",
     "name": "stdout",
     "text": [
      "[KOBRA] Copernicus DEM: (1620, 2520), 967–2021 m\n",
      "730 kapalı çukur; 5 obruk-benzeri (skor>0,3)\n"
     ]
    },
    {
     "output_type": "display_data",
     "data": {
      "text/plain": [
       "<Figure size 800x500 with 1 Axes>"
      ],
      "image/png": "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9CYsXLgQl1xyCf71r3/hxz/+MWbOnIkvf/nLvvVJp9M47LDD8MQTT+Bd73oX9ttvPwwMDOCPf/wjNmzYgK6urjpbckKBH3/88cjn8zjnnHPQ09ODjRs34vrrr8fIyIh1yqNeesc73oFbbrkFt956K3bbbTdzvVwuG3AkKR6PI5lMeq719vbikEMOwf/7f/8PJ5xwAgDgpptuwujoKN785jfjO9/5zrTKNDg4iHK5jHXr1uHCCy8EABxzzDHm/oMPPggAOOCAAzzv7b///ggEAnjwwQfx9re/vWY+p556Kvbcc0986Utfwg033ICLL74YHR0duPzyy3H00Ufjy1/+Mn75y1/iYx/7GA488EAcfvjh06rH+eefjy9+8Yu4/PLL8Z73vAcAcN999+Huu+/Gm9/8ZsydOxdr167FZZddhiOPPBKPP/44EomEJ42zzz4bbW1tuOCCC/DUU0/hsssuw3PPPWeUIjChiJuamnDuueeiqakJd9xxBz772c9ibGwMX/3qV6dVZhuVy2WcdNJJuP322/HmN78ZH/rQh5BKpXDrrbfi0UcfxaJFi3Yo/fvuuw/HH388DjjgAFx33XWIx+PTTuOpp57CW97yFpx55pl4z3veg91339363LPPPos//OEPOOWUU7Bw4UJs2bIFl19+OY444gg8/vjjnik8ALjooosQiUTwsY99DPl8HpFIZLvq2KAdoBfa1dKg/34aHR11Abivf/3r63r+3//+twvAffe73+25/rGPfcwF4N5xxx3m2oIFC1wA7u9+9ztPfrNmzXL33Xdfc+2iiy5yk8mk+/TTT3vS/NSnPuUGg0F33bp1ruu67po1a1wAbktLi9vf3+959nOf+5wLwH3Xu97luf4///M/bmdnp+eaduN+9rOfdQG411577ZT6VioV13UnpyfWrFnjuf+Xv/zFBeD+5S9/cV3XdR988EEXgHv11VdPSasW1XJlM+2PfOQj5toRRxzhArB+zjzzTPMcy3/fffe53/ve99zm5mbj1j7llFPco446ynVdd9rTK9Fo1OTX2dnpfuc73/HcP+uss9xgMGh9d8aMGe6b3/zmqumzX9/73veaa6VSyZ07d67rOI77pS99yVwfHh524/F4XS56iOmVj370o24gEHCvvPJKzzNsH0krV650Abg///nPzTW27f777+8WCgVz/Stf+YoLwL3uuuuqpnnmmWe6iUTCzeVy5pptegWA+7nPfa5qvX7605+6ANxvfOMbU+6RlzXPkji+rrjiCk85yJN///vf3ZaWFvfEE0/0lJV9pMk2ZigTbr755inP63GZy+WmTJGsWbPGjUaj7oUXXmiusT677LKLtX0b9J+jxvRKg2oSXZDNzc11PX/jjTcCAM4991zP9Y9+9KMAMMVdPnv2bPzP//yP+U+384MPPoi+vj4AwNVXX43DDjsM7e3tGBgYMJ9jjz0W5XIZf/3rXz1pLl++HDNmzLCW733ve5/n/2GHHYbBwcGqrtbf/e532HvvvT3lJNncxtWInow///nPU6Z1dpS4dDGVSnmu9/b24tZbb53y+fCHP2xN501vehOy2Syuv/56pFIpXH/99ds9tXLTTTfhxhtvxNe//nXMnz8f4+PjnvvZbNbX4ozFYnWvinr3u99tfgeDQRxwwAFwXRdnnHGGud7W1obdd98dzz77bF1puq6Ls88+G9/+9rdx1VVXYcWKFZ770oovFosYHBzE4sWL0dbWhn/9619T0nvve9+LcDhs/r///e9HKBQyY0anmUqlMDAwgMMOOwyZTAZPPvlkXeWuRr/73e/Q1dWFc845Z8q96fKypL/85S84/vjjccwxx+Daa6+tO+DYRgsXLsTxxx9f87loNGoCvsvlMgYHB9HU1ITdd9/d2v4rVqzYLs9Lg3YeNaZXGlSTuBJCKzI/eu655xAIBLB48WLP9Z6eHrS1teG5557zXF+8ePEUYcepgbVr16KnpwerVq3Cww8/7Ask+vv7Pf8XLlzoW7758+d7/re3twMAhoeHp6z6IK1evRrLly/3TXM6tHDhQpx77rn4xje+gV/+8pc47LDD8LrXvc7EI+wIpdNpAFMBYjKZxLHHHlt3OjNmzMCxxx6LX/3qV8hkMiiXyzj55JO3q0xHHXUUAOCEE07A61//euy1115oamoye2DE43EUCgXru7lcrm4lofu1tbUVsVhsytRXa2srBgcH60rz5z//OdLpNC677DK85S1vmXI/m83ikksuwRVXXIGNGzfCdV1zzxafs+uuu3r+NzU1YdasWZ6Yhsceewznn38+7rjjjilAeEdifkirV6/G7rvvjlBo54n/XC6HE088Efvvvz9++9vf7nDa1cavpEqlgm9/+9u49NJLsWbNGk/cS2dn53an26DnjxqejgbVpJaWFsyePRuPPvrotN7bEatJU6VSwate9SqrtX7rrbdOAQTVFFUwGLRelwpje8ivvrYAwK9//et4+OGH8elPfxrZbBYf/OAHsXTpUmzYsGGHysA+0oBve+itb30rbrrpJvzgBz/ACSecgLa2th1Oc9GiRdh3333xy1/+0lybNWsWyuXyFOBYKBQwODg4ZV7ej2z9uqN9feihh6K7uxvf+973MDQ0NOX+Oeecgy984Qt405vehN/+9rcmnqazs9O6Z0otGhkZwRFHHIGHHnoIF154If70pz/h1ltvNfFG25Pm9tB0eBmY8DiceOKJ+Oc//4mbb755h9OrF2h+8YtfxLnnnovDDz8cV111Ff785z/j1ltvxdKlS61t1fByvPDU8HQ0qC466aST8MMf/hArV67EIYccUvXZBQsWoFKpYNWqVdhzzz3N9S1btmBkZAQLFizwPP/MM8/AdV2PYOLqC652WLRoEdLp9LSs9Z1JixYtqgm66DGRKzMATPHskJYtW4Zly5bh/PPPx913341DDz0UP/jBD3DxxRdvdzl/8YtfwHEcE4C7I/Q///M/OPPMM3HPPffgN7/5zQ6nR8pms55VTPvssw8A4P7778drXvMac/3+++9HpVIx918IWrx4Mb7yla/gyCOPxKtf/WrcfvvtHi/SNddcgxUrVnhWxORyuSk8QFq1apXx/AATnqnNmzebet95550YHBzEtdde6wl0XbNmzU6r06JFi/DPf/4TxWLRM9Ujabq87DgOfvnLX+L1r389TjnlFNx000048sgjrelJ8OqXXr10zTXX4KijjsJPfvITz/WRkZFpBXc36D9HDU9Hg+qiT3ziE0gmk3j3u9+NLVu2TLm/evVqfPvb3wYAI0D1ipJvfOMbAIATTzzRc33Tpk2eFS1jY2P4+c9/jn322Qc9PT0AJmIMVq5ciT//+c9T8h4ZGUGpVNr+ytVBy5cvx0MPPTRl5Q0waTUz6l/Gl5TL5Skbpo2NjU0p77JlyxAIBKYsKZ4OfelLX8Itt9yCU089dYobf3uoqakJl112GS644AK89rWvnda7pVJpylJQALj33nvxyCOPeFaqHH300ejo6MBll13mefayyy5DIpGYwi//aXrZy16GG2+8EU888QRe+9rXemJMgsHgFK/Jd7/7XV8L/oc//CGKxaL5f9lll6FUKplVQvTMyDQLhQIuvfTSnVaf5cuXY2BgAN/73vem3GO+CxYsQDAYnBIrVa0ckUgE1157LQ488EC89rWvxb333mvu2cbG+Pg4fvazn+1QXWztf/XVV2Pjxo07lG6Dnj9qeDoaVBctWrQIv/rVr8yyRLkj6d13342rr77a7Gux9957Y8WKFfjhD39o3MX33nsvfvazn+ENb3iDx9IDJuI3zjjjDNx3333o7u7GT3/6U2zZsgVXXHGFeebjH/84/vjHP+Kkk07Caaedhv333x/j4+N45JFHcM0112Dt2rXPq2Xz8Y9/HNdccw1OOeUUvOtd78L++++PoaEh/PGPf8QPfvAD7L333li6dCkOPvhgnHfeeRgaGkJHRwd+/etfTwEYd9xxB84++2yccsop2G233VAqlfCLX/wCwWCwrriRUqmEq666CsCEVf3cc8/hj3/8Ix5++GEcddRR1l1hR0dHzTuaqi1H1YGT9VI6nca8efNw6qmnYunSpUgmk3jkkUdwxRVXoLW1FZ/5zGfMs/F4HBdddBHOOussnHLKKTj++OPxt7/9DVdddRW+8IUveJY7v1B08MEH47rrrsNrXvManHzyyfjDH/6AcDiMk046Cb/4xS/Q2tqKJUuWYOXKlbjtttus8QTABIA45phj8KY3vQlPPfUULr30Urzyla/E6173OgDAK17xCrS3t2PFihX44Ac/CMdx8Itf/GKHp/4kvfOd78TPf/5znHvuubj33ntx2GGHYXx8HLfddhs+8IEP4PWvfz1aW1txyimn4Lvf/S4cx8GiRYtw/fXXT5kC0xSPx3H99dfj6KOPxgknnIC77roLe+21F4477jjMnz8fZ5xxBj7+8Y8jGAzipz/9KWbMmIF169Ztd11OOukkXHjhhTj99NPxile8Ao888gh++ctfYpdddtnuNBv0PNMLs2imQf9X6emnn3bf8573uL29vW4kEnGbm5vdQw891P3ud7/rWSJXLBbdz3/+8+7ChQvdcDjszps3zz3vvPM8z7ju5PLLP//5z+7LXvYyNxqNunvssYd1OWkqlXLPO+88d/HixW4kEnG7urrcV7ziFe7XvvY1swyRS/q++tWvTnmfy/a2bt3que63bE8vqxwcHHTPPvtsd86cOW4kEnHnzp3rrlixwh0YGDDPrF692j322GPdaDTqdnd3u5/+9KfdW2+91bP88Nlnn3Xf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0tTURP71r3+RsWPHkkWLFslh0O1Pp556KtmwYQN55513SHl5+WG1nfTWW28lK1asIE1NTeSzzz4jS5YsIWVlZaSzs5MQktriNXLkSPLBBx+QtWvXkgULFpAFCxbI/o+EPBKS2jk1cuRIcvvtt2c8P1Lrsb+/n6xfv56sX7+eACCPPPIIWb9+vbxrY9myZaSoqIj861//Il999RU555xzhFtmjzrqKLJ69Wry6aefkgkTJmRss/R4PKSyspJcdtllZPPmzeSvf/0rcTgcB3XLrFo+o9EoOfvss0ltbS3ZsGFDRj+lK/0///xz8uijj5INGzaQXbt2kb/85S+kvLycXH755YdNPtXy2N/fT37yk5+QlStXkqamJvLee++ROXPmkAkTJpBwOCyHcbjXpVZ7JSS15dXhcJAnn3xygP8joR61ZAYhQzOe0i2zt912G9m2bRt5/PHH81tmWfzhD38gI0eOJBaLhRxzzDFk1apVhzpJugBA+HnuuecIIYTs3buXLFq0iJSUlBCr1UrGjx9PbrvttozzHQghZPfu3eT0008ndrudlJWVkVtvvZXEYrFDkCMxLrroIlJdXU0sFgsZMWIEueiii0hDQ4P8PhQKkR/+8IekuLiYOBwOct5555G2traMMA73PBJCyLvvvksAkPr6+oznR2o9fvjhh8L2ecUVVxBCUttm77zzTlJZWUmsVis55ZRTBuS9p6eHXHLJJaSgoIC4XC5y1VVXkf7+/gw3GzduJMcffzyxWq1kxIgRZNmyZQcri4QQ9Xw2NTUp9lN6Bsu6devI/PnzidvtJjabjUyZMoXcd999GQL7UOdTLY/BYJCceuqppLy8nJjNZjJq1Chy7bXXDlDcDve61GqvhBDyxz/+kdjtduLxeAb4PxLqUUtmEDJ04+mHH35IZs+eTSwWCxk7dmxGHHqRv9o+jzzyyCOPPPI4KBh2azryyCOPPPLII4/DE3nSkUceeeSRRx55HBTkSUceeeSRRx555HFQkCcdeeSRRx555JHHQUGedOSRRx555JFHHgcFedKRRx555JFHHnkcFORJRx555JFHHnnkcVCQJx155JFHHnnkkcdBQZ505JFHHnnkkUceBwV50pFHHnnkkUceeRwU5ElHHnnkkUceeeRxUJAnHXnkkUceeeSRx0HB/wc5/5PZbk3EqwAAAABJRU5ErkJggg==\n"
     },
     "metadata": {}
    }
   ],
   "source": "from obruk_engine import imaging as im, features as F\ndem, tr, crs = hub.copdem()\nd30, tr30 = im.reproject_to(dem, tr, crs, 'EPSG:32636', 30)\ndep, depth = im.extract_depressions(d30, tr30, 30, min_depth=1.0)\nprint(len(dep), 'kapalı çukur;', (dep.score > 0.3).sum(), 'obruk-benzeri (skor>0,3)')\nplt.figure(figsize=(8, 5)); plt.imshow(im.hillshade(d30, 30), cmap='gray')\nplt.scatter(dep.col, dep.row, s=dep.score * 80 + 2, c=dep.score, cmap='autumn'); plt.title('Copernicus DEM 30 m kapalı çukurlar'); plt.show()"
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "id": "df08c0d2",
   "metadata": {
    "colab": {
     "base_uri": "https://localhost:8080/",
     "height": 268
    },
    "id": "df08c0d2",
    "executionInfo": {
     "status": "error",
     "timestamp": 1791965434388,
     "user_tz": -180,
     "elapsed": 333699,
     "user": {
      "displayName": "Joseph Volkan ÖZCAN",
      "userId": "11389530967736397480"
     }
    },
    "outputId": "a21bcbf2-6a97-4b78-96a8-d384737a70f5"
   },
   "outputs": [
    {
     "output_type": "stream",
     "name": "stdout",
     "text": [
      "[KOBRA] licsar: hata (ConnectionError(MaxRetryError(\"HTTPSConnectionPool(host='gws-access.jasmin.ac.uk', port=443): Max retries exceeded with url: /public/nceo_geohazards/LiCSAR_products/87/087A_05304_121415/interferograms)\n",
      "[KOBRA] licsar: hata (ConnectionError(MaxRetryError(\"HTTPSConnectionPool(host='gws-access.jasmin.ac.uk', port=443): Max retries exceeded with url: /public/nceo_geohazards/LiCSAR_products/167/167D_05276_131313/interferogram)\n"
     ]
    },
    {
     "output_type": "error",
     "ename": "TypeError",
     "evalue": "'NoneType' object is not subscriptable",
     "traceback": [
      "\u001b[0;31m---------------------------------------------------------------------------\u001b[0m",
      "\u001b[0;31mTypeError\u001b[0m                                 Traceback (most recent call last)",
      "\u001b[0;32m/tmp/ipykernel_624/4247579536.py\u001b[0m in \u001b[0;36m<cell line: 0>\u001b[0;34m()\u001b[0m\n\u001b[1;32m      4\u001b[0m \u001b[0;32mfor\u001b[0m \u001b[0mfr\u001b[0m \u001b[0;32min\u001b[0m \u001b[0;34m(\u001b[0m\u001b[0;34m'087A_05304_121415'\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0;34m'167D_05276_131313'\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m      5\u001b[0m     \u001b[0msbas\u001b[0m\u001b[0;34m[\u001b[0m\u001b[0mfr\u001b[0m\u001b[0;34m]\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0mim\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mlicsar_velocity\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mhub\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mfr\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0;34m'2022-06-01'\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0;34m'2024-06-01'\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mmax_ifg\u001b[0m\u001b[0;34m=\u001b[0m\u001b[0;36m70\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m----> 6\u001b[0;31m pickle.dump({k: {kk: v[kk] for kk in ['epochs','vel','rms','meancoh','transform','crs','los','n_ifg','cum']} for k, v in sbas.items()},\n\u001b[0m\u001b[1;32m      7\u001b[0m             open(cfg.derived / 'licsar_sbas.pkl', 'wb'))\n\u001b[1;32m      8\u001b[0m \u001b[0;32mfor\u001b[0m \u001b[0mfr\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mr\u001b[0m \u001b[0;32min\u001b[0m \u001b[0msbas\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mitems\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n",
      "\u001b[0;31mTypeError\u001b[0m: 'NoneType' object is not subscriptable"
     ]
    }
   ],
   "source": "# InSAR SBAS (ilk çalıştırmada her çerçeve ≈ 3–5 dk indirme; sonra önbellekten)\nimport pickle\nsbas = {}\nfor fr in ('087A_05304_121415', '167D_05276_131313'):\n    sbas[fr] = im.licsar_velocity(hub, fr, '2022-06-01', '2024-06-01', max_ifg=70)\npickle.dump({k: {kk: v[kk] for kk in ['epochs','vel','rms','meancoh','transform','crs','los','n_ifg','cum']} for k, v in sbas.items()},\n            open(cfg.derived / 'licsar_sbas.pkl', 'wb'))\nfor fr, r in sbas.items():\n    v, off, n = im.clean_velocity(hub, fr, r)\n    print(fr, f'referans ofseti {off:+.1f} mm/yıl, hız %1/%50/%99 =', np.nanpercentile(v, [1, 50, 99]).round(1))"
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "id": "78198357",
   "metadata": {
    "id": "78198357"
   },
   "outputs": [],
   "source": "# Sentinel-2 yaz NDVI kompozitleri (2017–2025, ~80 m)\ng0 = F.make_grid(cfg)\nndvi = im.s2_summer_ndvi(hub, range(2017, 2026), (g0.xmin, g0.ymin, g0.xmax, g0.ymax), res=80)\npickle.dump(ndvi, open(cfg.derived / 's2_ndvi.pkl', 'wb'))"
  },
  {
   "cell_type": "markdown",
   "id": "8a1a5b61",
   "metadata": {
    "id": "8a1a5b61"
   },
   "source": "## Faz 6 — Hibrit klasik–kuantum motor\nTek ara temsil (Qiskit devresi / OpenQASM) + cihaz başına yürütme adaptörü: `sim.statevector`, `sim.aer`, `sim.aer_noise`,\n`ibm:<backend>`, `origin:<backend>`, `braket:<arn>`, `azure:<target>`; QUBO için `exact`, `sa`, `qaoa`, `dwave.hybrid`, `dwave.qpu`.\nDonanım uygunluğu **derleme sonrası** 2-kübit kapı sayısı ve tahmini sadakatle belirlenir."
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "id": "b0e76387",
   "metadata": {
    "id": "b0e76387"
   },
   "outputs": [],
   "source": "from obruk_engine import quantum as Q\nfrom qiskit.quantum_info import Statevector\n# Doğruluk kontrolü: NumPy durum vektörü = Qiskit devresi\nfm = Q.FeatureMap(4, 2); x = np.random.default_rng(0).uniform(0, np.pi, (1, 4))\nsv = Statevector(fm.circuit(x[0])).data.reshape([2]*4).transpose([3,2,1,0]).reshape(-1)\nprint('örtüşme |<qiskit|numpy>|² =', abs(np.vdot(sv, fm.states(x)[0]))**2)\nex = Q.Executor('sim.aer')\nfor reps in (1, 2):\n    _, rep = ex.compile_check(Q.FeatureMap(6, reps).fidelity_circuit(np.ones(6), 2*np.ones(6)))\n    print(f'6 kübit × {reps} tekrar →', rep)"
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "id": "00e57549",
   "metadata": {
    "id": "00e57549"
   },
   "outputs": [],
   "source": "# Gerçek donanım (opsiyonel): IBM Heron üzerinde birkaç çekirdek değeri ölçüp simülatörle karşılaştırın.\n# Ücretsiz planda ayda 10 dk; 6q×1 tekrar devresi önerilir.\nif os.environ.get('QISKIT_IBM_TOKEN'):\n    xs = np.random.default_rng(1).uniform(0, 0.6, (4, 6))\n    circs = [Q.FeatureMap(6, 1).fidelity_circuit(xs[0], xs[i]) for i in range(1, 4)]\n    S = Q.FeatureMap(6, 1).states(xs); exact = np.abs(S[1:].conj() @ S[0])**2\n    hw = Q.Executor('ibm:ibm_fez', shots=4000).p0(circs)      # arka uç adını hesabınıza göre değiştirin\n    print('kesin:', exact.round(3), ' donanım:', hw.round(3))\nif os.environ.get('ORIGIN_QC_API_KEY'):\n    pass  # Q.Executor('origin:<WK_backend_adı>').p0(circs)  — QCloudService(api_key).backends() ile adı doğrulayın"
  },
  {
   "cell_type": "markdown",
   "id": "7da99128",
   "metadata": {
    "id": "7da99128"
   },
   "source": "## Uçtan uca çalıştırma (Faz 4→7)"
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "id": "b61c2dc9",
   "metadata": {
    "id": "b61c2dc9"
   },
   "outputs": [],
   "source": "from obruk_engine import pipeline as P, report as RP\nR = P.run_all(cfg,\n              inventory_upload=None,                       # AFAD/KTÜN envanteri gelince yolunu verin\n              sbas_pickle=cfg.derived / 'licsar_sbas.pkl',\n              ndvi_pickle=cfg.derived / 's2_ndvi.pkl',\n              quantum=True, dwave=bool(os.environ.get('DWAVE_API_TOKEN')))\ndisplay(R['cv'][['auc','auc_lo','auc_hi','ap','cap@1%','cap@5%','cap@10%']].round(3))"
  },
  {
   "cell_type": "markdown",
   "id": "8ca88b6b",
   "metadata": {
    "id": "8ca88b6b"
   },
   "source": "## Faz 7 — Sonuçlar ve yorumlama"
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "id": "96c57b50",
   "metadata": {
    "id": "96c57b50"
   },
   "outputs": [],
   "source": "for f in (RP.fig_susceptibility(R), RP.fig_insar(R), RP.fig_capture(R), RP.fig_importance(R),\n          RP.fig_physics(R), RP.fig_qubo(R), RP.fig_gnss(R)):\n    if f is not None: display(f)\ndisplay(R['phys_summary']); display(R['qubo']['results'].drop(columns=['x'])); display(R['hw_readiness'])\npath = RP.html_report(R, cfg.outputs / 'KOBRA_rapor.html'); print('Rapor:', path)\nprint('GeoTIFF çıktıları:', sorted(p.name for p in cfg.outputs.glob('*.tif')))"
  },
  {
   "cell_type": "markdown",
   "id": "40fbdb44",
   "metadata": {
    "id": "40fbdb44"
   },
   "source": "## Yorumlama motoru ve katmanlı harita arayüzü\nYorumlama motoru (`interpret.py`) her nokta ve yerleşim için jeodezi (uydu radarı, GNSS, farklı oturma) ve obruk\nmühendisliği (yakınlık, örtü-çökme mekanizması, yeraltı suyu baskısı, fay) bulgularını vatandaşın anlayacağı dilde\nyazar; ne yapılması gerektiğini ve haritanın neyi söyleyip neyi söyleyemeyeceğini ekler. Harita arayüzü\n(`KOBRA_harita.html`) tek dosyadır, internetsiz de açılır (altlık: arazi gölgesi); aynı kuralları tarayıcıda uygular."
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "id": "a3948ccb",
   "metadata": {
    "id": "a3948ccb"
   },
   "outputs": [],
   "source": "from obruk_engine import interpret as I\n# Herhangi bir nokta için yorum (örnek: Karapınar ilçe merkezi)\nprint(I.to_text(I.interpret_lonlat(R, 33.545, 37.715)))\nprint()\ndisplay(R['settlements'][['name','place','level_name','nearest_sinkhole_km','vel_up','p1km_1yr','exp15_bau','exp15_stab']].head(15).round(3))"
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "id": "f9df7c8a",
   "metadata": {
    "id": "f9df7c8a"
   },
   "outputs": [],
   "source": "# Katmanlı harita arayüzü: Colab içinde göster ve indir\nfrom IPython.display import HTML, display\ndisplay(HTML(open(R['webmap'], encoding='utf-8').read()))\ntry:\n    from google.colab import files; files.download(str(R['webmap']))\nexcept Exception:\n    print('Harita dosyası:', R['webmap'])"
  },
  {
   "cell_type": "markdown",
   "id": "80f31bcd",
   "metadata": {
    "id": "80f31bcd"
   },
   "source": "## Sonuç raporları: Word ve HTML\nHer çalıştırmanın sonunda motor iki rapor üretir: `KOBRA_Sonuc_Raporu.docx` ve `KOBRA_Sonuc_Raporu.html`. İkisi aynı içerikten\n(özet, risk haritası ve doğrulama, jeodezi, senaryolar, yerleşimler, izleme ağı ve kuantum, söyleyebildiklerimiz /\nsöyleyemediklerimiz, veri izlenebilirliği) oluşturulur; cümleler bu çalıştırmanın sayılarına göre otomatik kurulur.\nHTML rapor, aynı klasördeki katmanlı haritaya (`KOBRA_harita.html`) bağlantı verir."
  },
  {
   "cell_type": "code",
   "execution_count": 1,
   "id": "f15b88d5",
   "metadata": {
    "id": "f15b88d5",
    "executionInfo": {
     "status": "error",
     "timestamp": 1793196920777,
     "user_tz": -180,
     "elapsed": 20,
     "user": {
      "displayName": "Joseph Volkan ÖZCAN",
      "userId": "11389530967736397480"
     }
    },
    "outputId": "b76af529-a43e-4105-bd21-45be1689dd30",
    "colab": {
     "base_uri": "https://localhost:8080/",
     "height": 389
    }
   },
   "outputs": [
    {
     "output_type": "error",
     "ename": "ModuleNotFoundError",
     "evalue": "No module named 'obruk_engine'",
     "traceback": [
      "\u001b[0;31m---------------------------------------------------------------------------\u001b[0m",
      "\u001b[0;31mModuleNotFoundError\u001b[0m                       Traceback (most recent call last)",
      "\u001b[0;32m/tmp/ipykernel_1264/103138572.py\u001b[0m in \u001b[0;36m<cell line: 0>\u001b[0;34m()\u001b[0m\n\u001b[1;32m      1\u001b[0m \u001b[0;32mfrom\u001b[0m \u001b[0mIPython\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mdisplay\u001b[0m \u001b[0;32mimport\u001b[0m \u001b[0mHTML\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mdisplay\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m----> 2\u001b[0;31m \u001b[0;32mfrom\u001b[0m \u001b[0mobruk_engine\u001b[0m \u001b[0;32mimport\u001b[0m \u001b[0mresults\u001b[0m \u001b[0;32mas\u001b[0m \u001b[0mRS\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m\u001b[1;32m      3\u001b[0m \u001b[0;31m# Rapor yoksa (ör. python-docx eksikti) analizi yeniden çalıştırmadan şimdi üret\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m      4\u001b[0m \u001b[0;32mif\u001b[0m \u001b[0;32mnot\u001b[0m \u001b[0;34m(\u001b[0m\u001b[0mR\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mget\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m'report_docx'\u001b[0m\u001b[0;34m)\u001b[0m \u001b[0;32mand\u001b[0m \u001b[0mR\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mget\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m'report_html'\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m      5\u001b[0m     \u001b[0;32mtry\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n",
      "\u001b[0;31mModuleNotFoundError\u001b[0m: No module named 'obruk_engine'",
      "",
      "\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"
       }
      ]
     }
    }
   ],
   "source": "from IPython.display import HTML, display\nfrom obruk_engine import results as RS\n# Rapor yoksa (ör. python-docx eksikti) analizi yeniden çalıştırmadan şimdi üret\nif not (R.get('report_docx') and R.get('report_html')):\n    try:\n        import docx  # noqa: F401\n    except ModuleNotFoundError:\n        import subprocess, sys\n        subprocess.run([sys.executable, '-m', 'pip', '-q', 'install', 'python-docx'], check=True)\n    R['report_docx'], R['report_html'], R['report_errors'] = RS.write_reports(R)\nprint('Word  :', R.get('report_docx')); print('HTML  :', R.get('report_html')); print('Harita:', R.get('webmap'))\nfor k, msg in (R.get('report_errors') or {}).items():\n    print(f'UYARI ({k}):', msg)\nif R.get('report_html'):\n    display(HTML(open(R['report_html'], encoding='utf-8').read()))\n# Dosyaları indir (Colab)\ntry:\n    from google.colab import files\n    for k in ('report_docx', 'report_html', 'webmap'):\n        if R.get(k):\n            files.download(str(R[k]))\nexcept Exception:\n    pass"
  },
  {
   "cell_type": "markdown",
   "id": "9fda5d98",
   "metadata": {
    "id": "9fda5d98"
   },
   "source": "### Yorumlama rehberi\n* **Doğrulama:** \"cap@5%\" — haritanın en riskli %5 alanı, katlar-dışı obrukların ne kadarını yakalıyor. Yakınlık (proximity)\n  taban çizgisini geçmeyen bir model operasyonel değer katmaz.\n* **Kuantum çekirdek:** aynı PCA boyutu, aynı işaret noktası sayısı ve aynı bant-genişliği ayarlama bütçesiyle RBF Nyström'e\n  karşı kıyaslanır. Üstünlük ancak bu kıyasta görülürse iddia edilebilir.\n* **Fizik simülatörü:** senaryo farkları β (durağan YAS'ta süffozyon oranı) varsayımına duyarlıdır; DSİ kuyu verisi ve tarihli\n  envanterle yeniden kalibre edilmelidir.\n* **İzleme ağı:** QUBO çözümleri (kesin/SA/QAOA/D-Wave) aynı amaç fonksiyonunda karşılaştırılır; 16 kübitlik QAOA bugün\n  donanım sadakat eşiğinin altındadır (bkz. donanım hazırlık tablosu).\n\n### Veri talepleri (sonuçları en çok iyileştirecek sırayla)\n1. AFAD/KTÜN tarihli obruk envanteri (≈741 kayıt) veya Gökkaya–Gutiérrez 2026 / Orhan vd. 2024 envanterleri\n2. DSİ gözlem kuyusu seviyeleri (e-Devlet Hidrometrik Veri Talebi)\n3. HGM 5 m DEM veya LiDAR; MTA 1:25k jeoloji + diri fay vektörleri\n4. NISAR L-bant GUNW zaman serisi (Earthdata) ve TUSAGA-Aktif RINEX"
  }
 ],
 "metadata": {
  "colab": {
   "provenance": [],
   "machine_shape": "hm",
   "gpuType": "T4"
  },
  "kernelspec": {
   "display_name": "Python 3",
   "name": "python3"
  },
  "language_info": {
   "name": "python"
  },
  "accelerator": "GPU"
 },
 "nbformat": 4,
 "nbformat_minor": 5
}