Skip to content

Latest commit

 

History

1 Commit

Folders and files

NameName
Last commit message
Last commit date
 
 
 
 
 
 
 
 
 
 
 
 

Repository files navigation

Ağ Dayanıklılık Analizörü (İki Ağ)

İstanbul toplu taşıma ağının hangi durak/istasyonlarının devre dışı kalması şehir ağını orantısız şekilde bozduğunu, nörobilimdeki "lezyon simülasyonu" yöntemiyle ölçen ve fruit-fly connectome'dan elde edilen bir "biyolojik referans dayanıklılık skoru" ile karşılaştıran bir hackathon V1 demosu.

Tek sayfa, kenar çubuğunda filtreler (mod/hat/kritiklik eşiği), ve herhangi bir durağı seçip "kapansa ne olur" sorusuna canlı cevap veren interaktif bir sorgu içerir.

Kurulum

python3 -m venv .venv
source .venv/bin/activate
pip install -r requirements.txt

Fly connectome verisi

Hiçbir API anahtarı/token gerekmiyor. src/fetch_fly.py, FlyEM'in Google Cloud Storage'da yayınladığı halka açık "flat connectome" toplu export dosyalarını kullanır (bkz. "Fly connectome veri kaynağı" bölümü) — ilk çalıştırmada ~500MB indirilir, mushroom body devresine filtrelenir, küçük sonuç (data/fly_raw/neurons.csv, connectivity.csv) önbelleklenir ve büyük ham dosyalar silinir.

Çalıştırma

streamlit run src/app.py

Tek sayfalık bir uygulama — ilk açılışta sırasıyla İBB verisi indirilir/ işlenir, birleşik ağ (raylı sistem + otobüs) için lezyon simülasyonu çalıştırılır, ardından fly connectome verisi (~500MB) indirilip mushroom body devresi (4503 nöron) üzerinde lezyon simülasyonu çalışır. İlk açılış toplamda ~5-7 dakika sürebilir (st.cache_data ile önbelleklenir) — sayfayı açık bırakıp sekme değiştirmeden/yenilemeden bekleyin. Sonraki etkileşimlerde hiçbiri tekrar hesaplanmaz.

Veri kaynakları ve varsayımlar

  • İBB verisi: "Raylı Sistemler İstasyon Bazlı Yolcu ve Yolculuk Sayıları" (2025 tam yılı — data.ibb.gov.tr'de her yıl ayrı bir kaynak olarak yayınlanıyor, en güncel tamamlanmış yıl kullanıldı — CKAN CSV). Gerçek istasyon adı, koordinat, ilçe ve günlük yolcu sayısı içerir. 19 hat, 302 istasyon-hat kombinasyonu (2023'e göre M8, M9 ve iki yeni TCDD hattı eklenmiş durumda).
  • Varsayım — hat sırası: Kaynak veride istasyonların hat üzerindeki sırası (güzergah bilgisi) yok. Bu yüzden her hattaki istasyonlar coğrafi en-yakın-komşu zinciriyle sıralanarak yaklaşık bir güzergah kenar kümesi oluşturuldu (src/build_graph.py::_order_line_nearest_neighbor). Aktarma istasyonları, farklı hatlarda 250m'den yakın koordinatlı istasyonları birbirine bağlayarak modellendi.
  • İETT otobüs verisi: https://api.ibb.gov.tr/iett/ibb/ibb.asmx SOAP servisinden (DurakDetay_GYY, HatServisi_GYY metotları) çekiliyor. WSDL'i standart araçlarla (zeep) parse etmek bir AuthHeader tanım hatasına takılıyordu; bunun yerine requests ile elle hazırlanmış ham SOAP 1.1 POST zarfı kullanıldı — kimlik doğrulama gerekmiyor, token gerekmiyor. 782 hat, ~13.200 benzersiz durak, gerçek güzergah sırası (SIRANO alanı — raylı sistemdeki gibi coğrafi yaklaşıklığa gerek yok) ~34 saniyede eşzamanlı (ThreadPoolExecutor) çekildi (src/fetch_iett_bus.py). Durak bazlı yolcu sayısı verisi bu serviste yok — bu yüzden otobüs durakları için "etkilenen yolcu sayısı" cümlesi gösterilemiyor (dürüstçe belirtiliyor, sıfır ile doldurulmuyor).
  • Birleşik ağ: raylı sistem + otobüs, build_unified_graph() ile tek bir grafta birleştiriliyor (13.420 düğüm, 17.850 kenar). Farklı modlardaki (bus/rail) 250m'den yakın duraklar ızgara-tabanlı (spatial hash) bir aramayla aktarma kenarıyla bağlanıyor — O(n²) yerine O(n), 13.400+ düğümde bu fark saniyeler ile saatler arasındaki farka denk geliyor.
  • Fly connectome veri kaynağı: male-cns:v1.0 veri setinden mushroom body devresi (öğrenme/hafıza ile ilişkili, iyi tanımlanmış bir alt-devre: Kenyon Cell + MBON + PAM + PPL + APL tipleri, ~4503 nöron / 77.741 kenar, min. 5 sinapslık ağırlık eşiği) çekiliyor — tüm 166.000+ nöron değil. Not: neuPrint'in Cypher sorgu API'si (neuprint.janelia.org) test sırasında kalıcı 504/timeout hatası veriyordu (basit RETURN 1 sorgusu bile 60sn+ timeout alıyordu — sunucu tarafı genel bir kesinti, token/sorgu tasarımıyla ilgisizdi). Bunun yerine FlyEM'in GCS'de yayınladığı halka açık "flat connectome" toplu export dosyaları kullanıldı (storage.googleapis.com/flyem-male-cns/v1.0/connectome-data/ flat-connectome/) — bu yaklaşım [cobanov/fly-connectome-template] (https://github.com/cobanov/fly-connectome-template) referans alınarak benimsendi (onlar da aynı bulk-export deseniyle soma pozisyon atlası oluşturmuş).

data/ klasörünün hiçbir dosyası commit edilmiyor — hepsi fetch_*.py betikleri ile her klonda yeniden üretilebilir (bkz. Kurulum). Tek istisna assets/brain_atlas/: küçük, yeniden dağıtılabilir, üçüncü taraf lisanslı bir veri seti olduğu için repoya gömülü.

Algoritma özeti

  1. Baseline metrikler: ortalama en kısa yol, en büyük bağlı bileşen boyutu, global efficiency (networkx.global_efficiency).

  2. Lezyon: her düğüm tek tek graftan çıkarılır, metrikler yeniden hesaplanır; efficiency ve bağlı-bileşen düşüşünün ortalaması "kritiklik skoru" olarak alınır.

  3. R_city / R_bio: tüm düğümlerin ortalama kritiklik skoru, tek bir "dayanıklılık bozulma" özet sayısı olarak kullanılır. Performans notu (büyük graflar): fly connectome grafı (4503 düğüm, 77.741 kenar) için tüm düğümleri tek tek lezyon edip her seferinde tam global_efficiency (tüm düğüm çiftleri arası en kısa yol, O(n²)) hesaplamak pratik değil — bu yüzden (a) global_efficiency rastgele bir kaynak-düğüm örneklemi üzerinden tahmin edilir (istatistiksel olarak sapmasız Monte Carlo yaklaşımı), (b) lezyon edilecek adaylar ağırlıklı dereceye göre en yüksek ~300 düğüm + tarafsız rastgele ~150 düğümün birleşiminden seçilir (gerçek kritik düğümler neredeyse hep yüksek bağlantılı hub'lardır; R_bio gibi popülasyon ortalaması sadece tarafsız rastgele alt kümeden hesaplanır ki taraflı çıkmasın), (c) düğüm başına lezyon işlemleri birbirinden bağımsız olduğundan multiprocessing ile CPU çekirdeklerine paralel dağıtılır. Bu üç optimizasyon olmadan tam analiz tahminen 10+ saat sürerdi; optimize haliyle ~3 dakikaya iniyor. Doğrulama: algoritma en kritik nöron olarak APL'yi buldu — mushroom body'deki tüm Kenyon Cell'lere global GABAerjik inhibisyon sağlayan, kaybı devre çapında dizregülasyona yol açtığı bilinen nöron türü; bu, sonucun biyolojik olarak anlamlı olduğunun bağımsız bir doğrulaması.

    Ağ büyüklüğü / seyrelme notu (önemli düzeltme): otobüs ağı eklenip birleşik ağ 215'ten 13.400+ düğüme çıkınca, R_city sıfıra çok yakın (anlamsız) çıkmaya başladı. Sebep bir hata değil, metriğin matematiksel doğası: global_efficiency, TÜM düğüm çiftlerinin ortalaması olduğundan, tek bir düğümün (ne kadar önemli olursa olsun) çıkarılması devasa bir ağda istatistiksel olarak "seyreliyor" — aynı formül 215 düğümde anlamlı sayılar (ör. en kritik istasyon ~15) verirken, ~63 kat büyük ağda aynı oranda küçülüyor (kanıt: en yüksek dereceli durak — İstanbul Havalimanı, 170 bağlantı — çıkarıldığında bile skor sadece 0.28 çıkıyor). Bu yüzden: R_city/R_bio karşılaştırması artık sadece raylı sistem ağı (270 düğüm — fly'ın 4503 düğümüyle çok daha karşılaştırılabilir bir ölçek) üzerinden hesaplanıyor; harita/Top-10/interaktif "durak seçin" aracı ise 13.400+ düğümlü birleşik ağın HAM skorlarını kullanmaya devam ediyor ama mutlak sayı yerine sıralama (rank) ile sunuluyor — sıralama, mutlak değer seyrelse bile her zaman doğru kalır.

    macOS multiprocessing notu: geliştirme sırasında streamlit'in AppTest test aracıyla çalıştırırken worker'lar sonsuz döngüde çöküp-yeniden-başlıyordu (RuntimeError: ...bootstrapping phase...). Sebep macOS'ta varsayılan spawn başlatma yönteminin, script gerçek bir __main__ modülü olarak çalışmadığı bağlamlarda (ör. AppTest veya python -c) __main__'i yeniden import etmeye çalışıp başarısız olması. Çözüm: lesion_analysis.py'da multiprocessing.get_context("fork") kullanmak — fork, child process'i mevcut bellekten kopyaladığı için bu yeniden-import adımına hiç ihtiyaç duymuyor.

  4. Öneri: en kritik 5 istasyonun coğrafi en yakın komşularından adaylar çıkarılır, her biri eklenip dayanıklılık iyileşmesi ölçülür (greedy), en iyi 3 öneri gösterilir.

  5. Yapısal imza karşılaştırması (structural_metrics.py) — R_bio/R_city tek bir sayı, neden farklı olduğunu açıklamaz. Üç ucuz, literatürde köklü metrikle (degree_gini, average_clustering, bridge_fraction) fly ve raylı sistem ağının yapısal imzasını karşılaştırdık. Gerçek sonuç (uydurulmadı, veriden çıktı): fly'ın hub-bağımlılığı (Gini) İstanbul'dan daha düşük değil, hatta biraz daha yüksek — yani dayanıklılığı az sayıda süper-bağlantılı hub'dan gelmiyor. Asıl fark: fly'ın kümelenme katsayısı İstanbul'dan ~26 kat yüksek, ve İstanbul'da kenarların %50'si köprü (tek arıza noktası) iken fly'da bu oran %0.01. Yani fly'ın dayanıklılığı yerel yedeklilikten geliyor.

    Bu bulgu recommend.py'daki öneri sıralamasını değiştirmiyor (hâlâ gerçek resilience_improvement_pct esas alınıyor — doğrulanmamış bir biyolojik proxy'nin gerçek en iyi öneriyi gölgelememesi için bilinçli bir karar) — her önerinin yerel kümelenmeye katkısını (local_clustering_gain, bio_aligned) ek, açıklayıcı bir sütun olarak ekliyor. Dürüst bulgu: mevcut coğrafi-yakınlık sezgiseli, üç öneriden hiçbirinde bu biyolojik ilkeyi doğal olarak yakalamıyor — bu, gelecekte fly-ilhamlı bir aday-arama stratejisi (üçgen kapayan bağlantıları önceliklendirme) için net bir gerekçe oluşturuyor.

Dış doğrulama / ilgili literatür

Kendi kümelenme bulgumuzu, yayınlanmış bir çalışmanın metodolojisiyle bağımsız olarak test ettik: derece dizisini koruyan rastgele (null-model) bir ağa göre gerçek kümelenme katsayısının kaç kat yüksek olduğunu ölçtük (structural_metrics.py::clustering_vs_random).

Ağ Kümelenme / rastgele-ağ oranı
Tüm FlyWire beyni (Lin, Yang ve ark. 2023, yayınlanmış) 9.18×
Bizim mushroom body alt-devremiz ~1.9×
İstanbul raylı sistem ağımız ~2.5×

Dürüst bulgu: MB alt-devremizin oranı beklenenin aksine hem yayınlanmış tüm-beyin değerinden hem de kendi raylı sistem ağımızınkinden düşük çıktı — muhtemelen MB'nin zaten çok yoğun olması (ort. derece ~34.5) rastgele yeniden bağlansa bile tesadüfi kümelenme üretiyor. Mutlak kümelenme (0.54 vs 0.02) hâlâ İstanbul'dan çok daha yüksek ve dayanıklılık için belirleyici olan bu mutlak değer — ama bu nüansı gizlemedik.

Kaynaklar:

  • Lin A., Yang R., et al. (2023). Network Statistics of the Whole-Brain Connectome of Drosophila. bioRxiv 2023.07.29.551086. Kod: murthylab/flywire-network-analysis.
  • Berg S., Beckett I.R., et al. (2025). Sexual dimorphism in the complete connectome of the Drosophila male central nervous system. bioRxiv 2025.10.09.680999. (Kullandığımız MaleCNS v1.0 veri setinin birincil kaynak yayını.) Veri: flyconnectome/2025malecns.

Bilinen sınırlamalar (V1)

  • Hat güzergahları gerçek sıra bilgisi yerine coğrafi yaklaşıklıkla kuruldu (raylı sistem; otobüs tarafında İETT gerçek sıra numarası veriyor).
  • Öneri algoritması hız için kritik istasyonların bir örneklemi üzerinden dayanıklılık iyileşmesini hesaplar (tüm ağ yerine), ve sadece raylı sistem ağında çalışır (otobüs dahil ~13.400 düğümlük ağda performans nedeniyle V1 kapsamı dışında).
  • Yapısal imza karşılaştırması sadece 3 ucuz metrikle sınırlı; daha kesin bir "redundancy" ölçümü (ör. k-bağlantılılık, edge-disjoint path sayısı) büyük graflarda hesaplama açısından pahalı, V1'e dahil edilmedi.

About

Applies neuroscience's lesion-simulation method to Istanbul's transit network (metro + bus) and benchmarks it against a real fruit-fly brain connectome — an open-source network resilience analyzer with an interactive Streamlit dashboard.

Topics

Resources

Stars

0 stars

Watchers

0 watching

Forks

Releases

Packages

Contributors

Languages