{
 "nbformat": 4,
 "nbformat_minor": 0,
 "metadata": {
  "colab": {
   "provenance": [
    {
     "file_id": "1QTAhdI-CL42-YI_mlt1ur4iRXuzqmP5c",
     "timestamp": 1785142506608
    }
   ]
  },
  "kernelspec": {
   "name": "python3",
   "display_name": "Python 3"
  },
  "language_info": {
   "name": "python"
  },
  "widgets": {
   "application/vnd.jupyter.widget-state+json": {
    "version_major": 2,
    "version_minor": 0,
    "state": {
     "8632735776934f61bed73b541f0e8ebd": {
      "model_module": "@jupyter-widgets/controls",
      "model_name": "FileUploadModel",
      "model_module_version": "1.5.0",
      "state": {
       "_counter": 0,
       "_dom_classes": [],
       "_model_module": "@jupyter-widgets/controls",
       "_model_module_version": "1.5.0",
       "_model_name": "FileUploadModel",
       "_view_count": null,
       "_view_module": "@jupyter-widgets/controls",
       "_view_module_version": "1.5.0",
       "_view_name": "FileUploadView",
       "accept": ".csv",
       "button_style": "",
       "data": [],
       "description": "Upload",
       "description_tooltip": null,
       "disabled": false,
       "error": "",
       "icon": "upload",
       "layout": "IPY_MODEL_78f0bcaba51748d7a7832b7b063a4d70",
       "metadata": [],
       "multiple": false,
       "style": "IPY_MODEL_cdd929945b054f05baf319ff0b7e5eb7"
      }
     },
     "78f0bcaba51748d7a7832b7b063a4d70": {
      "model_module": "@jupyter-widgets/base",
      "model_name": "LayoutModel",
      "model_module_version": "1.2.0",
      "state": {
       "_model_module": "@jupyter-widgets/base",
       "_model_module_version": "1.2.0",
       "_model_name": "LayoutModel",
       "_view_count": null,
       "_view_module": "@jupyter-widgets/base",
       "_view_module_version": "1.2.0",
       "_view_name": "LayoutView",
       "align_content": null,
       "align_items": null,
       "align_self": null,
       "border": null,
       "bottom": null,
       "display": null,
       "flex": null,
       "flex_flow": null,
       "grid_area": null,
       "grid_auto_columns": null,
       "grid_auto_flow": null,
       "grid_auto_rows": null,
       "grid_column": null,
       "grid_gap": null,
       "grid_row": null,
       "grid_template_areas": null,
       "grid_template_columns": null,
       "grid_template_rows": null,
       "height": null,
       "justify_content": null,
       "justify_items": null,
       "left": null,
       "margin": null,
       "max_height": null,
       "max_width": null,
       "min_height": null,
       "min_width": null,
       "object_fit": null,
       "object_position": null,
       "order": null,
       "overflow": null,
       "overflow_x": null,
       "overflow_y": null,
       "padding": null,
       "right": null,
       "top": null,
       "visibility": null,
       "width": null
      }
     },
     "cdd929945b054f05baf319ff0b7e5eb7": {
      "model_module": "@jupyter-widgets/controls",
      "model_name": "ButtonStyleModel",
      "model_module_version": "1.5.0",
      "state": {
       "_model_module": "@jupyter-widgets/controls",
       "_model_module_version": "1.5.0",
       "_model_name": "ButtonStyleModel",
       "_view_count": null,
       "_view_module": "@jupyter-widgets/base",
       "_view_module_version": "1.2.0",
       "_view_name": "StyleView",
       "button_color": null,
       "font_weight": ""
      }
     },
     "acfc5ecca00647158f13e95e955d2ed5": {
      "model_module": "@jupyter-widgets/controls",
      "model_name": "VBoxModel",
      "model_module_version": "1.5.0",
      "state": {
       "_dom_classes": [],
       "_model_module": "@jupyter-widgets/controls",
       "_model_module_version": "1.5.0",
       "_model_name": "VBoxModel",
       "_view_count": null,
       "_view_module": "@jupyter-widgets/controls",
       "_view_module_version": "1.5.0",
       "_view_name": "VBoxView",
       "box_style": "",
       "children": [
        "IPY_MODEL_6316a76745814701b2479052d4257f45",
        "IPY_MODEL_19715921bcd94c9ca6c5a5e8f867e417",
        "IPY_MODEL_97a92d40efd7419ca714034ec122ec01",
        "IPY_MODEL_c0b5834ebb8f418098687821387d5010",
        "IPY_MODEL_802614c4a7194682998f718433689011",
        "IPY_MODEL_5c4f0fab1d514908802492def0986380",
        "IPY_MODEL_4dc623aa8888413d97bdbaa44d1f6e01",
        "IPY_MODEL_51c4e734face41029d9606e2f11116c6",
        "IPY_MODEL_4228e0029f45487a96a19b5db377bc23",
        "IPY_MODEL_216abb4b5e2b412886600caad529d499"
       ],
       "layout": "IPY_MODEL_62c93c6087844a1a847e7447759b02bb"
      }
     },
     "6316a76745814701b2479052d4257f45": {
      "model_module": "@jupyter-widgets/controls",
      "model_name": "HTMLModel",
      "model_module_version": "1.5.0",
      "state": {
       "_dom_classes": [],
       "_model_module": "@jupyter-widgets/controls",
       "_model_module_version": "1.5.0",
       "_model_name": "HTMLModel",
       "_view_count": null,
       "_view_module": "@jupyter-widgets/controls",
       "_view_module_version": "1.5.0",
       "_view_name": "HTMLView",
       "description": "",
       "description_tooltip": null,
       "layout": "IPY_MODEL_7ca7fb0eac3744ad9a5c672454c82560",
       "placeholder": "​",
       "style": "IPY_MODEL_a62c607c776d46198bcaa947cd98cf1e",
       "value": "<h3 style='margin-bottom:4px;'>🎯 Problem Tanımı + Encoding & Qubit Seçim Aracı</h3>"
      }
     },
     "19715921bcd94c9ca6c5a5e8f867e417": {
      "model_module": "@jupyter-widgets/controls",
      "model_name": "HTMLModel",
      "model_module_version": "1.5.0",
      "state": {
       "_dom_classes": [],
       "_model_module": "@jupyter-widgets/controls",
       "_model_module_version": "1.5.0",
       "_model_name": "HTMLModel",
       "_view_count": null,
       "_view_module": "@jupyter-widgets/controls",
       "_view_module_version": "1.5.0",
       "_view_name": "HTMLView",
       "description": "",
       "description_tooltip": null,
       "layout": "IPY_MODEL_df2dad43b0844850a63118bbccdbd9fe",
       "placeholder": "​",
       "style": "IPY_MODEL_5325fdf002a54094849bbaddfaa0fa7a",
       "value": "<p style='color:#555; margin-top:0;'>Veri tipini ve boyutunu seçtiğinizde uygun <b>data encoding</b> yöntemi ve ihtiyaç duyulan <b>kübit sayısı</b> otomatik hesaplanır.</p>"
      }
     },
     "97a92d40efd7419ca714034ec122ec01": {
      "model_module": "@jupyter-widgets/controls",
      "model_name": "DropdownModel",
      "model_module_version": "1.5.0",
      "state": {
       "_dom_classes": [],
       "_model_module": "@jupyter-widgets/controls",
       "_model_module_version": "1.5.0",
       "_model_name": "DropdownModel",
       "_options_labels": [
        "Sınıflandırma (Classification)",
        "Regresyon (Regression)",
        "Optimizasyon (Optimization)"
       ],
       "_view_count": null,
       "_view_module": "@jupyter-widgets/controls",
       "_view_module_version": "1.5.0",
       "_view_name": "DropdownView",
       "description": "Problem Tipi:",
       "description_tooltip": null,
       "disabled": false,
       "index": 2,
       "layout": "IPY_MODEL_43cf67a537fe410ba2987b25090bf1de",
       "style": "IPY_MODEL_6b30e8fb7d2447f7b7700ae702bcd184"
      }
     },
     "c0b5834ebb8f418098687821387d5010": {
      "model_module": "@jupyter-widgets/controls",
      "model_name": "IntSliderModel",
      "model_module_version": "1.5.0",
      "state": {
       "_dom_classes": [],
       "_model_module": "@jupyter-widgets/controls",
       "_model_module_version": "1.5.0",
       "_model_name": "IntSliderModel",
       "_view_count": null,
       "_view_module": "@jupyter-widgets/controls",
       "_view_module_version": "1.5.0",
       "_view_name": "IntSliderView",
       "continuous_update": false,
       "description": "Özellik Sayısı:",
       "description_tooltip": null,
       "disabled": false,
       "layout": "IPY_MODEL_d622b940b2cb4632b27f00a5148c4857",
       "max": 30,
       "min": 2,
       "orientation": "horizontal",
       "readout": true,
       "readout_format": "d",
       "step": 1,
       "style": "IPY_MODEL_46ef22d74f3f4209ad5f5fbcfd31175b",
       "value": 23
      }
     },
     "802614c4a7194682998f718433689011": {
      "model_module": "@jupyter-widgets/controls",
      "model_name": "IntSliderModel",
      "model_module_version": "1.5.0",
      "state": {
       "_dom_classes": [],
       "_model_module": "@jupyter-widgets/controls",
       "_model_module_version": "1.5.0",
       "_model_name": "IntSliderModel",
       "_view_count": null,
       "_view_module": "@jupyter-widgets/controls",
       "_view_module_version": "1.5.0",
       "_view_name": "IntSliderView",
       "continuous_update": false,
       "description": "Veri Boyutu:",
       "description_tooltip": null,
       "disabled": false,
       "layout": "IPY_MODEL_03d34428ab8945afa0962d889016fc73",
       "max": 5000,
       "min": 50,
       "orientation": "horizontal",
       "readout": true,
       "readout_format": "d",
       "step": 50,
       "style": "IPY_MODEL_1fd39a1d7b8142eba115ca073b62d89f",
       "value": 2600
      }
     },
     "5c4f0fab1d514908802492def0986380": {
      "model_module": "@jupyter-widgets/controls",
      "model_name": "DropdownModel",
      "model_module_version": "1.5.0",
      "state": {
       "_dom_classes": [],
       "_model_module": "@jupyter-widgets/controls",
       "_model_module_version": "1.5.0",
       "_model_name": "DropdownModel",
       "_options_labels": [
        "Sürekli (Continuous)",
        "Kategorik (Categorical)",
        "Karışık (Mixed)"
       ],
       "_view_count": null,
       "_view_module": "@jupyter-widgets/controls",
       "_view_module_version": "1.5.0",
       "_view_name": "DropdownView",
       "description": "Veri Tipi:",
       "description_tooltip": null,
       "disabled": false,
       "index": 1,
       "layout": "IPY_MODEL_4d540fc04a09481e920c46d53d36895b",
       "style": "IPY_MODEL_88800b3cae2d41d8bb25a0161d353673"
      }
     },
     "4dc623aa8888413d97bdbaa44d1f6e01": {
      "model_module": "@jupyter-widgets/controls",
      "model_name": "DropdownModel",
      "model_module_version": "1.5.0",
      "state": {
       "_dom_classes": [],
       "_model_module": "@jupyter-widgets/controls",
       "_model_module_version": "1.5.0",
       "_model_name": "DropdownModel",
       "_options_labels": [
        "Hızlı prototip / Eğitim (Simülatör öncelikli)",
        "Gerçek donanım denemesi (IBM Quantum)",
        "Yüksek doğruluk / Derin devre (Simülatör + hata azaltma)"
       ],
       "_view_count": null,
       "_view_module": "@jupyter-widgets/controls",
       "_view_module_version": "1.5.0",
       "_view_name": "DropdownView",
       "description": "Öncelik:",
       "description_tooltip": null,
       "disabled": false,
       "index": 1,
       "layout": "IPY_MODEL_d20fd941d9d24d4a9d60cb648b2f71a7",
       "style": "IPY_MODEL_3d6e65c6012d48478876df673b538464"
      }
     },
     "51c4e734face41029d9606e2f11116c6": {
      "model_module": "@jupyter-widgets/controls",
      "model_name": "HTMLModel",
      "model_module_version": "1.5.0",
      "state": {
       "_dom_classes": [],
       "_model_module": "@jupyter-widgets/controls",
       "_model_module_version": "1.5.0",
       "_model_name": "HTMLModel",
       "_view_count": null,
       "_view_module": "@jupyter-widgets/controls",
       "_view_module_version": "1.5.0",
       "_view_name": "HTMLView",
       "description": "",
       "description_tooltip": null,
       "layout": "IPY_MODEL_fd7fb2df9b4547d3afeeacdd7485c945",
       "placeholder": "​",
       "style": "IPY_MODEL_d107039b1b004470a7e159dd9344cb7d",
       "value": "<br>"
      }
     },
     "4228e0029f45487a96a19b5db377bc23": {
      "model_module": "@jupyter-widgets/controls",
      "model_name": "ButtonModel",
      "model_module_version": "1.5.0",
      "state": {
       "_dom_classes": [],
       "_model_module": "@jupyter-widgets/controls",
       "_model_module_version": "1.5.0",
       "_model_name": "ButtonModel",
       "_view_count": null,
       "_view_module": "@jupyter-widgets/controls",
       "_view_module_version": "1.5.0",
       "_view_name": "ButtonView",
       "button_style": "success",
       "description": "Encoding + Qubit + Algoritma & Cihaz Öner",
       "disabled": false,
       "icon": "check",
       "layout": "IPY_MODEL_932a27b0998c450e8458bd20178c2fc8",
       "style": "IPY_MODEL_90ed759a5af94a6c897fcffbc6bfc061",
       "tooltip": ""
      }
     },
     "216abb4b5e2b412886600caad529d499": {
      "model_module": "@jupyter-widgets/output",
      "model_name": "OutputModel",
      "model_module_version": "1.0.0",
      "state": {
       "_dom_classes": [],
       "_model_module": "@jupyter-widgets/output",
       "_model_module_version": "1.0.0",
       "_model_name": "OutputModel",
       "_view_count": null,
       "_view_module": "@jupyter-widgets/output",
       "_view_module_version": "1.0.0",
       "_view_name": "OutputView",
       "layout": "IPY_MODEL_22c0663e000e4f2fb90b44e46a8c49a1",
       "msg_id": "",
       "outputs": [
        {
         "output_type": "display_data",
         "data": {
          "text/plain": "<IPython.core.display.HTML object>",
          "text/html": "<h3 style='color:#1a73e8; margin-bottom:8px;'>🔍 Öneri Sonuçları</h3>"
         },
         "metadata": {}
        },
        {
         "output_type": "stream",
         "name": "stdout",
         "text": [
          "Problem Tipi     : Optimizasyon (Optimization)\n",
          "Özellik Sayısı   : 23\n",
          "Veri Boyutu      : 2600\n",
          "Veri Tipi        : Kategorik (Categorical)\n",
          "Öncelik          : Gerçek donanım denemesi (IBM Quantum)\n",
          "======================================================================\n"
         ]
        },
        {
         "output_type": "display_data",
         "data": {
          "text/plain": "<IPython.core.display.HTML object>",
          "text/html": "<div style='background:#e8f0fe; padding:12px 16px; border-radius:8px; margin:12px 0;'><h4 style='margin:0 0 8px 0; color:#174ea6;'>📐 Veri Encoding Yöntemi & İhtiyaç Duyulan Qubit Hesabı</h4></div>"
         },
         "metadata": {}
        },
        {
         "output_type": "stream",
         "name": "stdout",
         "text": [
          "▶ Birincil Öneri : One-Hot Encoding (klasik) → Angle Encoding / Basis Encoding\n",
          "   Gerekli Qubit : 23\n",
          "   Açıklama      : Kategorik değerler kuantum devresine doğrudan yazılamaz. Önce pandas.get_dummies / OneHotEncoder ile 0-1 vektörüne çevirin. Ardından ortaya çıkan sürekli (0/1) özellikleri Angle Encoding ile kübitlere yerleştirin. Alternatif: her kategori için Basis Encoding (daha az kübit ama daha az esnek).\n",
          "   Qiskit İpucu  : pd.get_dummies(...) → zz_feature_map / Angle Encoding\n",
          "\n"
         ]
        },
        {
         "output_type": "display_data",
         "data": {
          "text/plain": "<IPython.core.display.HTML object>",
          "text/html": "<b>🔄 Alternatif Encoding Yöntemleri:</b>"
         },
         "metadata": {}
        },
        {
         "output_type": "stream",
         "name": "stdout",
         "text": [
          "   1. Basis Encoding (doğrudan)\n",
          "      Qubit ≈ değişken (kategori sayısı log2)\n",
          "      → Her kategorik değişkenin alabileceği değer sayısı 2^k ise k kübit yeterlidir. Küçük kardinaliteli kategoriler için uygundur.\n",
          "\n"
         ]
        },
        {
         "output_type": "display_data",
         "data": {
          "text/plain": "<IPython.core.display.HTML object>",
          "text/html": "<b>📊 Hızlı Qubit Karşılaştırması (mevcut özellik sayısına göre):</b>"
         },
         "metadata": {}
        },
        {
         "output_type": "stream",
         "name": "stdout",
         "text": [
          "   • Angle Encoding / ZZFeatureMap  →  23 kübit  (1 özellik = 1 kübit)\n",
          "   • Amplitude Encoding             →  5 kübit  (ceil(log2(23)) , 2^5 boyuta pad)\n",
          "   • Basis Encoding (kaba tahmin)   →  ~69-184 kübit (değer aralığına bağlı)\n",
          "   • PCA sonrası (önerilen 6 özellik) →  6 kübit (Angle ile)\n",
          "\n"
         ]
        },
        {
         "output_type": "display_data",
         "data": {
          "text/plain": "<IPython.core.display.HTML object>",
          "text/html": "<div style='background:#fff3cd; padding:10px 14px; border-radius:6px; margin:8px 0;'><b>⚠️ Boyut İndirgeme (PCA) Önerilir:</b> Özellik sayısı yüksek (23). Aşama 3'teki PCA adımı ile <b>6</b> boyuta indirmeniz hem kübit sayısını hem de gürültüyü önemli ölçüde azaltır.</div>"
         },
         "metadata": {}
        },
        {
         "output_type": "stream",
         "name": "stdout",
         "text": [
          "\n"
         ]
        },
        {
         "output_type": "display_data",
         "data": {
          "text/plain": "<IPython.core.display.HTML object>",
          "text/html": "<b>⚠️ Encoding ile ilgili uyarılar:</b>"
         },
         "metadata": {}
        },
        {
         "output_type": "stream",
         "name": "stdout",
         "text": [
          "   • One-Hot Encoding özellik sayısını (dolayısıyla kübit ihtiyacını) artırabilir. Kardinalitesi yüksek sütunlarda dikkatli olun veya hedef encoding kullanın.\n",
          "   • Kategorik veri için notebook'taki Aşama 3 örnek kodunu (pd.get_dummies) kullanın.\n",
          "   • Veri boyutu (2600) büyük. Kernel tabanlı yöntemlerde (QSVM) her çift için devre çalıştırılır → hesaplama maliyeti O(n²) artar. Mümkünse örnekleme veya mini-batch düşünün.\n",
          "\n",
          "======================================================================\n"
         ]
        },
        {
         "output_type": "display_data",
         "data": {
          "text/plain": "<IPython.core.display.HTML object>",
          "text/html": "<b>🧠 Önerilen Kuantum Algoritmaları:</b>"
         },
         "metadata": {}
        },
        {
         "output_type": "stream",
         "name": "stdout",
         "text": [
          "   1. QAOA (Quantum Approximate Optimization Algorithm)\n",
          "      → Kombinatoryal optimizasyon için standart yöntem.\n",
          "   2. VQE (Variational Quantum Eigensolver)\n",
          "      → Hamiltonian minimizasyonu gerektiren problemler.\n",
          "   3. Grover / Amplitude Amplification\n",
          "      → Yapılandırılmış arama problemleri (ileri seviye).\n",
          "\n"
         ]
        },
        {
         "output_type": "display_data",
         "data": {
          "text/plain": "<IPython.core.display.HTML object>",
          "text/html": "<b>💻 Önerilen Cihazlar / Çalıştırma Ortamları:</b>"
         },
         "metadata": {}
        },
        {
         "output_type": "stream",
         "name": "stdout",
         "text": [
          "   1. Önce PCA → 4-6 özellik, sonra gerçek donanım\n",
          "      → 12+ kübit doğrudan pratik değildir.\n",
          "   2. AerSimulator + noise model\n",
          "      → Gerçek cihaz gürültüsünü taklit ederek geliştirin.\n",
          "\n"
         ]
        },
        {
         "output_type": "display_data",
         "data": {
          "text/plain": "<IPython.core.display.HTML object>",
          "text/html": "<b>📝 Ek Notlar:</b>"
         },
         "metadata": {}
        },
        {
         "output_type": "stream",
         "name": "stdout",
         "text": [
          "   • Yüksek özellik/veri boyutu → mutlaka PCA ile 4-8 boyuta indirgeme yapın.\n",
          "   • Yüksek kübit ihtiyacı nedeniyle şu an simülatör + PCA zorunludur.\n",
          "   • Kategorik veriler doğrudan işlenemez → One-Hot Encoding zorunlu.\n",
          "\n",
          "======================================================================\n"
         ]
        },
        {
         "output_type": "display_data",
         "data": {
          "text/plain": "<IPython.core.display.HTML object>",
          "text/html": "<b>➡️ Sonraki Adım:</b> Aşama 2'ye geçerek kütüphaneleri kurun. Burada önerilen özellik / kübit sayısını Aşama 3 (PCA) ve Aşama 6-7 (feature_map & ansatz) hücrelerinde kullanın."
         },
         "metadata": {}
        }
       ]
      }
     },
     "62c93c6087844a1a847e7447759b02bb": {
      "model_module": "@jupyter-widgets/base",
      "model_name": "LayoutModel",
      "model_module_version": "1.2.0",
      "state": {
       "_model_module": "@jupyter-widgets/base",
       "_model_module_version": "1.2.0",
       "_model_name": "LayoutModel",
       "_view_count": null,
       "_view_module": "@jupyter-widgets/base",
       "_view_module_version": "1.2.0",
       "_view_name": "LayoutView",
       "align_content": null,
       "align_items": null,
       "align_self": null,
       "border": null,
       "bottom": null,
       "display": null,
       "flex": null,
       "flex_flow": null,
       "grid_area": null,
       "grid_auto_columns": null,
       "grid_auto_flow": null,
       "grid_auto_rows": null,
       "grid_column": null,
       "grid_gap": null,
       "grid_row": null,
       "grid_template_areas": null,
       "grid_template_columns": null,
       "grid_template_rows": null,
       "height": null,
       "justify_content": null,
       "justify_items": null,
       "left": null,
       "margin": null,
       "max_height": null,
       "max_width": null,
       "min_height": null,
       "min_width": null,
       "object_fit": null,
       "object_position": null,
       "order": null,
       "overflow": null,
       "overflow_x": null,
       "overflow_y": null,
       "padding": null,
       "right": null,
       "top": null,
       "visibility": null,
       "width": null
      }
     },
     "7ca7fb0eac3744ad9a5c672454c82560": {
      "model_module": "@jupyter-widgets/base",
      "model_name": "LayoutModel",
      "model_module_version": "1.2.0",
      "state": {
       "_model_module": "@jupyter-widgets/base",
       "_model_module_version": "1.2.0",
       "_model_name": "LayoutModel",
       "_view_count": null,
       "_view_module": "@jupyter-widgets/base",
       "_view_module_version": "1.2.0",
       "_view_name": "LayoutView",
       "align_content": null,
       "align_items": null,
       "align_self": null,
       "border": null,
       "bottom": null,
       "display": null,
       "flex": null,
       "flex_flow": null,
       "grid_area": null,
       "grid_auto_columns": null,
       "grid_auto_flow": null,
       "grid_auto_rows": null,
       "grid_column": null,
       "grid_gap": null,
       "grid_row": null,
       "grid_template_areas": null,
       "grid_template_columns": null,
       "grid_template_rows": null,
       "height": null,
       "justify_content": null,
       "justify_items": null,
       "left": null,
       "margin": null,
       "max_height": null,
       "max_width": null,
       "min_height": null,
       "min_width": null,
       "object_fit": null,
       "object_position": null,
       "order": null,
       "overflow": null,
       "overflow_x": null,
       "overflow_y": null,
       "padding": null,
       "right": null,
       "top": null,
       "visibility": null,
       "width": null
      }
     },
     "a62c607c776d46198bcaa947cd98cf1e": {
      "model_module": "@jupyter-widgets/controls",
      "model_name": "DescriptionStyleModel",
      "model_module_version": "1.5.0",
      "state": {
       "_model_module": "@jupyter-widgets/controls",
       "_model_module_version": "1.5.0",
       "_model_name": "DescriptionStyleModel",
       "_view_count": null,
       "_view_module": "@jupyter-widgets/base",
       "_view_module_version": "1.2.0",
       "_view_name": "StyleView",
       "description_width": ""
      }
     },
     "df2dad43b0844850a63118bbccdbd9fe": {
      "model_module": "@jupyter-widgets/base",
      "model_name": "LayoutModel",
      "model_module_version": "1.2.0",
      "state": {
       "_model_module": "@jupyter-widgets/base",
       "_model_module_version": "1.2.0",
       "_model_name": "LayoutModel",
       "_view_count": null,
       "_view_module": "@jupyter-widgets/base",
       "_view_module_version": "1.2.0",
       "_view_name": "LayoutView",
       "align_content": null,
       "align_items": null,
       "align_self": null,
       "border": null,
       "bottom": null,
       "display": null,
       "flex": null,
       "flex_flow": null,
       "grid_area": null,
       "grid_auto_columns": null,
       "grid_auto_flow": null,
       "grid_auto_rows": null,
       "grid_column": null,
       "grid_gap": null,
       "grid_row": null,
       "grid_template_areas": null,
       "grid_template_columns": null,
       "grid_template_rows": null,
       "height": null,
       "justify_content": null,
       "justify_items": null,
       "left": null,
       "margin": null,
       "max_height": null,
       "max_width": null,
       "min_height": null,
       "min_width": null,
       "object_fit": null,
       "object_position": null,
       "order": null,
       "overflow": null,
       "overflow_x": null,
       "overflow_y": null,
       "padding": null,
       "right": null,
       "top": null,
       "visibility": null,
       "width": null
      }
     },
     "5325fdf002a54094849bbaddfaa0fa7a": {
      "model_module": "@jupyter-widgets/controls",
      "model_name": "DescriptionStyleModel",
      "model_module_version": "1.5.0",
      "state": {
       "_model_module": "@jupyter-widgets/controls",
       "_model_module_version": "1.5.0",
       "_model_name": "DescriptionStyleModel",
       "_view_count": null,
       "_view_module": "@jupyter-widgets/base",
       "_view_module_version": "1.2.0",
       "_view_name": "StyleView",
       "description_width": ""
      }
     },
     "43cf67a537fe410ba2987b25090bf1de": {
      "model_module": "@jupyter-widgets/base",
      "model_name": "LayoutModel",
      "model_module_version": "1.2.0",
      "state": {
       "_model_module": "@jupyter-widgets/base",
       "_model_module_version": "1.2.0",
       "_model_name": "LayoutModel",
       "_view_count": null,
       "_view_module": "@jupyter-widgets/base",
       "_view_module_version": "1.2.0",
       "_view_name": "LayoutView",
       "align_content": null,
       "align_items": null,
       "align_self": null,
       "border": null,
       "bottom": null,
       "display": null,
       "flex": null,
       "flex_flow": null,
       "grid_area": null,
       "grid_auto_columns": null,
       "grid_auto_flow": null,
       "grid_auto_rows": null,
       "grid_column": null,
       "grid_gap": null,
       "grid_row": null,
       "grid_template_areas": null,
       "grid_template_columns": null,
       "grid_template_rows": null,
       "height": null,
       "justify_content": null,
       "justify_items": null,
       "left": null,
       "margin": null,
       "max_height": null,
       "max_width": null,
       "min_height": null,
       "min_width": null,
       "object_fit": null,
       "object_position": null,
       "order": null,
       "overflow": null,
       "overflow_x": null,
       "overflow_y": null,
       "padding": null,
       "right": null,
       "top": null,
       "visibility": null,
       "width": "450px"
      }
     },
     "6b30e8fb7d2447f7b7700ae702bcd184": {
      "model_module": "@jupyter-widgets/controls",
      "model_name": "DescriptionStyleModel",
      "model_module_version": "1.5.0",
      "state": {
       "_model_module": "@jupyter-widgets/controls",
       "_model_module_version": "1.5.0",
       "_model_name": "DescriptionStyleModel",
       "_view_count": null,
       "_view_module": "@jupyter-widgets/base",
       "_view_module_version": "1.2.0",
       "_view_name": "StyleView",
       "description_width": "130px"
      }
     },
     "d622b940b2cb4632b27f00a5148c4857": {
      "model_module": "@jupyter-widgets/base",
      "model_name": "LayoutModel",
      "model_module_version": "1.2.0",
      "state": {
       "_model_module": "@jupyter-widgets/base",
       "_model_module_version": "1.2.0",
       "_model_name": "LayoutModel",
       "_view_count": null,
       "_view_module": "@jupyter-widgets/base",
       "_view_module_version": "1.2.0",
       "_view_name": "LayoutView",
       "align_content": null,
       "align_items": null,
       "align_self": null,
       "border": null,
       "bottom": null,
       "display": null,
       "flex": null,
       "flex_flow": null,
       "grid_area": null,
       "grid_auto_columns": null,
       "grid_auto_flow": null,
       "grid_auto_rows": null,
       "grid_column": null,
       "grid_gap": null,
       "grid_row": null,
       "grid_template_areas": null,
       "grid_template_columns": null,
       "grid_template_rows": null,
       "height": null,
       "justify_content": null,
       "justify_items": null,
       "left": null,
       "margin": null,
       "max_height": null,
       "max_width": null,
       "min_height": null,
       "min_width": null,
       "object_fit": null,
       "object_position": null,
       "order": null,
       "overflow": null,
       "overflow_x": null,
       "overflow_y": null,
       "padding": null,
       "right": null,
       "top": null,
       "visibility": null,
       "width": null
      }
     },
     "46ef22d74f3f4209ad5f5fbcfd31175b": {
      "model_module": "@jupyter-widgets/controls",
      "model_name": "SliderStyleModel",
      "model_module_version": "1.5.0",
      "state": {
       "_model_module": "@jupyter-widgets/controls",
       "_model_module_version": "1.5.0",
       "_model_name": "SliderStyleModel",
       "_view_count": null,
       "_view_module": "@jupyter-widgets/base",
       "_view_module_version": "1.2.0",
       "_view_name": "StyleView",
       "description_width": "130px",
       "handle_color": null
      }
     },
     "03d34428ab8945afa0962d889016fc73": {
      "model_module": "@jupyter-widgets/base",
      "model_name": "LayoutModel",
      "model_module_version": "1.2.0",
      "state": {
       "_model_module": "@jupyter-widgets/base",
       "_model_module_version": "1.2.0",
       "_model_name": "LayoutModel",
       "_view_count": null,
       "_view_module": "@jupyter-widgets/base",
       "_view_module_version": "1.2.0",
       "_view_name": "LayoutView",
       "align_content": null,
       "align_items": null,
       "align_self": null,
       "border": null,
       "bottom": null,
       "display": null,
       "flex": null,
       "flex_flow": null,
       "grid_area": null,
       "grid_auto_columns": null,
       "grid_auto_flow": null,
       "grid_auto_rows": null,
       "grid_column": null,
       "grid_gap": null,
       "grid_row": null,
       "grid_template_areas": null,
       "grid_template_columns": null,
       "grid_template_rows": null,
       "height": null,
       "justify_content": null,
       "justify_items": null,
       "left": null,
       "margin": null,
       "max_height": null,
       "max_width": null,
       "min_height": null,
       "min_width": null,
       "object_fit": null,
       "object_position": null,
       "order": null,
       "overflow": null,
       "overflow_x": null,
       "overflow_y": null,
       "padding": null,
       "right": null,
       "top": null,
       "visibility": null,
       "width": null
      }
     },
     "1fd39a1d7b8142eba115ca073b62d89f": {
      "model_module": "@jupyter-widgets/controls",
      "model_name": "SliderStyleModel",
      "model_module_version": "1.5.0",
      "state": {
       "_model_module": "@jupyter-widgets/controls",
       "_model_module_version": "1.5.0",
       "_model_name": "SliderStyleModel",
       "_view_count": null,
       "_view_module": "@jupyter-widgets/base",
       "_view_module_version": "1.2.0",
       "_view_name": "StyleView",
       "description_width": "130px",
       "handle_color": null
      }
     },
     "4d540fc04a09481e920c46d53d36895b": {
      "model_module": "@jupyter-widgets/base",
      "model_name": "LayoutModel",
      "model_module_version": "1.2.0",
      "state": {
       "_model_module": "@jupyter-widgets/base",
       "_model_module_version": "1.2.0",
       "_model_name": "LayoutModel",
       "_view_count": null,
       "_view_module": "@jupyter-widgets/base",
       "_view_module_version": "1.2.0",
       "_view_name": "LayoutView",
       "align_content": null,
       "align_items": null,
       "align_self": null,
       "border": null,
       "bottom": null,
       "display": null,
       "flex": null,
       "flex_flow": null,
       "grid_area": null,
       "grid_auto_columns": null,
       "grid_auto_flow": null,
       "grid_auto_rows": null,
       "grid_column": null,
       "grid_gap": null,
       "grid_row": null,
       "grid_template_areas": null,
       "grid_template_columns": null,
       "grid_template_rows": null,
       "height": null,
       "justify_content": null,
       "justify_items": null,
       "left": null,
       "margin": null,
       "max_height": null,
       "max_width": null,
       "min_height": null,
       "min_width": null,
       "object_fit": null,
       "object_position": null,
       "order": null,
       "overflow": null,
       "overflow_x": null,
       "overflow_y": null,
       "padding": null,
       "right": null,
       "top": null,
       "visibility": null,
       "width": "450px"
      }
     },
     "88800b3cae2d41d8bb25a0161d353673": {
      "model_module": "@jupyter-widgets/controls",
      "model_name": "DescriptionStyleModel",
      "model_module_version": "1.5.0",
      "state": {
       "_model_module": "@jupyter-widgets/controls",
       "_model_module_version": "1.5.0",
       "_model_name": "DescriptionStyleModel",
       "_view_count": null,
       "_view_module": "@jupyter-widgets/base",
       "_view_module_version": "1.2.0",
       "_view_name": "StyleView",
       "description_width": "130px"
      }
     },
     "d20fd941d9d24d4a9d60cb648b2f71a7": {
      "model_module": "@jupyter-widgets/base",
      "model_name": "LayoutModel",
      "model_module_version": "1.2.0",
      "state": {
       "_model_module": "@jupyter-widgets/base",
       "_model_module_version": "1.2.0",
       "_model_name": "LayoutModel",
       "_view_count": null,
       "_view_module": "@jupyter-widgets/base",
       "_view_module_version": "1.2.0",
       "_view_name": "LayoutView",
       "align_content": null,
       "align_items": null,
       "align_self": null,
       "border": null,
       "bottom": null,
       "display": null,
       "flex": null,
       "flex_flow": null,
       "grid_area": null,
       "grid_auto_columns": null,
       "grid_auto_flow": null,
       "grid_auto_rows": null,
       "grid_column": null,
       "grid_gap": null,
       "grid_row": null,
       "grid_template_areas": null,
       "grid_template_columns": null,
       "grid_template_rows": null,
       "height": null,
       "justify_content": null,
       "justify_items": null,
       "left": null,
       "margin": null,
       "max_height": null,
       "max_width": null,
       "min_height": null,
       "min_width": null,
       "object_fit": null,
       "object_position": null,
       "order": null,
       "overflow": null,
       "overflow_x": null,
       "overflow_y": null,
       "padding": null,
       "right": null,
       "top": null,
       "visibility": null,
       "width": "520px"
      }
     },
     "3d6e65c6012d48478876df673b538464": {
      "model_module": "@jupyter-widgets/controls",
      "model_name": "DescriptionStyleModel",
      "model_module_version": "1.5.0",
      "state": {
       "_model_module": "@jupyter-widgets/controls",
       "_model_module_version": "1.5.0",
       "_model_name": "DescriptionStyleModel",
       "_view_count": null,
       "_view_module": "@jupyter-widgets/base",
       "_view_module_version": "1.2.0",
       "_view_name": "StyleView",
       "description_width": "130px"
      }
     },
     "fd7fb2df9b4547d3afeeacdd7485c945": {
      "model_module": "@jupyter-widgets/base",
      "model_name": "LayoutModel",
      "model_module_version": "1.2.0",
      "state": {
       "_model_module": "@jupyter-widgets/base",
       "_model_module_version": "1.2.0",
       "_model_name": "LayoutModel",
       "_view_count": null,
       "_view_module": "@jupyter-widgets/base",
       "_view_module_version": "1.2.0",
       "_view_name": "LayoutView",
       "align_content": null,
       "align_items": null,
       "align_self": null,
       "border": null,
       "bottom": null,
       "display": null,
       "flex": null,
       "flex_flow": null,
       "grid_area": null,
       "grid_auto_columns": null,
       "grid_auto_flow": null,
       "grid_auto_rows": null,
       "grid_column": null,
       "grid_gap": null,
       "grid_row": null,
       "grid_template_areas": null,
       "grid_template_columns": null,
       "grid_template_rows": null,
       "height": null,
       "justify_content": null,
       "justify_items": null,
       "left": null,
       "margin": null,
       "max_height": null,
       "max_width": null,
       "min_height": null,
       "min_width": null,
       "object_fit": null,
       "object_position": null,
       "order": null,
       "overflow": null,
       "overflow_x": null,
       "overflow_y": null,
       "padding": null,
       "right": null,
       "top": null,
       "visibility": null,
       "width": null
      }
     },
     "d107039b1b004470a7e159dd9344cb7d": {
      "model_module": "@jupyter-widgets/controls",
      "model_name": "DescriptionStyleModel",
      "model_module_version": "1.5.0",
      "state": {
       "_model_module": "@jupyter-widgets/controls",
       "_model_module_version": "1.5.0",
       "_model_name": "DescriptionStyleModel",
       "_view_count": null,
       "_view_module": "@jupyter-widgets/base",
       "_view_module_version": "1.2.0",
       "_view_name": "StyleView",
       "description_width": ""
      }
     },
     "932a27b0998c450e8458bd20178c2fc8": {
      "model_module": "@jupyter-widgets/base",
      "model_name": "LayoutModel",
      "model_module_version": "1.2.0",
      "state": {
       "_model_module": "@jupyter-widgets/base",
       "_model_module_version": "1.2.0",
       "_model_name": "LayoutModel",
       "_view_count": null,
       "_view_module": "@jupyter-widgets/base",
       "_view_module_version": "1.2.0",
       "_view_name": "LayoutView",
       "align_content": null,
       "align_items": null,
       "align_self": null,
       "border": null,
       "bottom": null,
       "display": null,
       "flex": null,
       "flex_flow": null,
       "grid_area": null,
       "grid_auto_columns": null,
       "grid_auto_flow": null,
       "grid_auto_rows": null,
       "grid_column": null,
       "grid_gap": null,
       "grid_row": null,
       "grid_template_areas": null,
       "grid_template_columns": null,
       "grid_template_rows": null,
       "height": "42px",
       "justify_content": null,
       "justify_items": null,
       "left": null,
       "margin": null,
       "max_height": null,
       "max_width": null,
       "min_height": null,
       "min_width": null,
       "object_fit": null,
       "object_position": null,
       "order": null,
       "overflow": null,
       "overflow_x": null,
       "overflow_y": null,
       "padding": null,
       "right": null,
       "top": null,
       "visibility": null,
       "width": "380px"
      }
     },
     "90ed759a5af94a6c897fcffbc6bfc061": {
      "model_module": "@jupyter-widgets/controls",
      "model_name": "ButtonStyleModel",
      "model_module_version": "1.5.0",
      "state": {
       "_model_module": "@jupyter-widgets/controls",
       "_model_module_version": "1.5.0",
       "_model_name": "ButtonStyleModel",
       "_view_count": null,
       "_view_module": "@jupyter-widgets/base",
       "_view_module_version": "1.2.0",
       "_view_name": "StyleView",
       "button_color": null,
       "font_weight": ""
      }
     },
     "22c0663e000e4f2fb90b44e46a8c49a1": {
      "model_module": "@jupyter-widgets/base",
      "model_name": "LayoutModel",
      "model_module_version": "1.2.0",
      "state": {
       "_model_module": "@jupyter-widgets/base",
       "_model_module_version": "1.2.0",
       "_model_name": "LayoutModel",
       "_view_count": null,
       "_view_module": "@jupyter-widgets/base",
       "_view_module_version": "1.2.0",
       "_view_name": "LayoutView",
       "align_content": null,
       "align_items": null,
       "align_self": null,
       "border": null,
       "bottom": null,
       "display": null,
       "flex": null,
       "flex_flow": null,
       "grid_area": null,
       "grid_auto_columns": null,
       "grid_auto_flow": null,
       "grid_auto_rows": null,
       "grid_column": null,
       "grid_gap": null,
       "grid_row": null,
       "grid_template_areas": null,
       "grid_template_columns": null,
       "grid_template_rows": null,
       "height": null,
       "justify_content": null,
       "justify_items": null,
       "left": null,
       "margin": null,
       "max_height": null,
       "max_width": null,
       "min_height": null,
       "min_width": null,
       "object_fit": null,
       "object_position": null,
       "order": null,
       "overflow": null,
       "overflow_x": null,
       "overflow_y": null,
       "padding": null,
       "right": null,
       "top": null,
       "visibility": null,
       "width": null
      }
     }
    }
   }
  }
 },
 "cells": [
  {
   "cell_type": "markdown",
   "source": "Applied QML: Kuantum Makine Öğrenmesi\nUygulama Rehberi\nEğitmen: Joseph Volkan Özcan\n\nMerhaba, bu doküman Applied QML dersi kapsamında bir kuantum makine öğrenmesi projesinin\nuçtan uca nasıl geliştirileceğini aşamalar halinde göstermek için hazırlanmıştır. Bu rehber öğrenme\nsürecini sadeleştirmek adına sadece Python ve IBM Qiskit kullanılarak tasarlanmıştır.",
   "metadata": {
    "id": "rGGf6C1tbUoV"
   }
  },
  {
   "cell_type": "markdown",
   "source": "AŞAMA 1: Kuantum Projesinin Tanımının Yapılması ve Uygun Cihaz/Algoritma Seçimi\n\nProjenin başlangıcında amacın net bir şekilde belirlenmesi gerekir. Çözülmek istenen problem bir\n**Sınıflandırma**, **Regresyon** veya **Optimizasyon** problemi olabilir.\n\nBu aşamada aşağıdaki interaktif seçim aracını kullanarak:\n1. Probleminizi tanımlayın (tip, özellik sayısı, veri boyutu, veri tipi)\n2. Sistem size **uygun data encoding yöntemini** ve **ihtiyaç duyulan kübit sayısını** hesaplasın\n3. Aynı anda **uygun kuantum algoritmalarını** ve **çalıştırılacak cihazları** (simülatör / gerçek IBM Quantum) önerilsin\n\n> **Önemli Not (NISQ Dönemi):** Günümüz kuantum bilgisayarları gürültülü ve sınırlı kübit sayısına sahiptir.\n> Yüksek boyutlu verilerde mutlaka PCA gibi boyut indirgeme yöntemleri kullanılmalı,\n> geliştirme aşamasında mutlaka **simülatör** ile başlanmalıdır.\n>\n> Encoding seçimi, hem kübit ihtiyacını hem de devre derinliğini doğrudan etkiler.\n> Angle Encoding / ZZFeatureMap pratik ve stabil iken, Amplitude Encoding çok daha az kübit kullanır ama hazırlama maliyeti yüksektir.\n",
   "metadata": {
    "id": "31N_czKfbkGF"
   }
  },
  {
   "cell_type": "code",
   "source": "# ============================================================\n# AŞAMA 1 - İnteraktif Problem Tanımı + Cihaz & Algoritma Seçim Aracı\n# + Veri Tipi / Boyuta Göre Encoding Önerisi ve Qubit Hesabı\n# Colab uyumlu (ipywidgets)\n# ============================================================\n\nimport ipywidgets as widgets\nfrom IPython.display import display, clear_output, HTML\nimport math\nimport numpy as np\n\n# ---------- Widget'lar ----------\nproblem_type = widgets.Dropdown(\n    options=[\n        (\"Sınıflandırma (Classification)\", \"classification\"),\n        (\"Regresyon (Regression)\", \"regression\"),\n        (\"Optimizasyon (Optimization)\", \"optimization\")\n    ],\n    value=\"classification\",\n    description=\"Problem Tipi:\",\n    style={\"description_width\": \"130px\"},\n    layout=widgets.Layout(width=\"450px\")\n)\n\nn_features = widgets.IntSlider(\n    value=4,\n    min=2,\n    max=30,\n    step=1,\n    description=\"Özellik Sayısı:\",\n    style={\"description_width\": \"130px\"},\n    continuous_update=False\n)\n\nn_samples = widgets.IntSlider(\n    value=200,\n    min=50,\n    max=5000,\n    step=50,\n    description=\"Veri Boyutu:\",\n    style={\"description_width\": \"130px\"},\n    continuous_update=False\n)\n\ndata_type = widgets.Dropdown(\n    options=[\n        (\"Sürekli (Continuous)\", \"continuous\"),\n        (\"Kategorik (Categorical)\", \"categorical\"),\n        (\"Karışık (Mixed)\", \"mixed\")\n    ],\n    value=\"continuous\",\n    description=\"Veri Tipi:\",\n    style={\"description_width\": \"130px\"},\n    layout=widgets.Layout(width=\"450px\")\n)\n\npriority = widgets.Dropdown(\n    options=[\n        (\"Hızlı prototip / Eğitim (Simülatör öncelikli)\", \"prototype\"),\n        (\"Gerçek donanım denemesi (IBM Quantum)\", \"hardware\"),\n        (\"Yüksek doğruluk / Derin devre (Simülatör + hata azaltma)\", \"accuracy\")\n    ],\n    value=\"prototype\",\n    description=\"Öncelik:\",\n    style={\"description_width\": \"130px\"},\n    layout=widgets.Layout(width=\"520px\")\n)\n\nrun_button = widgets.Button(\n    description=\"Encoding + Qubit + Algoritma & Cihaz Öner\",\n    button_style=\"success\",\n    icon=\"check\",\n    layout=widgets.Layout(width=\"380px\", height=\"42px\")\n)\n\noutput_area = widgets.Output()\n\n# ---------- Yardımcı: Encoding & Qubit Hesap Motoru ----------\ndef compute_encoding_and_qubits(features, samples, dtype):\n    \"\"\"\n    Veri tipi ve boyutuna göre encoding yöntemlerini önerir\n    ve her yöntem için ihtiyaç duyulan qubit sayısını hesaplar.\n    \"\"\"\n    results = {\n        \"primary\": None,          # (isim, qubit, açıklama, qiskit_kod)\n        \"alternatives\": [],       # liste of (isim, qubit, açıklama)\n        \"pca_recommended\": features > 8,\n        \"pca_target\": min(6, max(2, features // 2)) if features > 8 else features,\n        \"warnings\": []\n    }\n\n    # ----- Temel formüller -----\n    # Angle Encoding / ZZFeatureMap: 1 qubit / özellik\n    angle_qubits = features\n\n    # Amplitude Encoding: ceil(log2(n_features)) — vektör boyutu 2^n olmalı\n    amp_qubits = math.ceil(math.log2(max(features, 2)))\n    # Amplitude için padding notu\n    amp_padded = 2 ** amp_qubits\n\n    # Basis Encoding (kaba tahmin): her özellik için ~4-8 bit varsayalım (sürekli → quantize)\n    # Kategorik için one-hot sonrası boyut artar\n    basis_qubits_est = features * 4   # kaba üst sınır\n\n    # ----- Veri tipine göre birincil öneri -----\n    if dtype == \"continuous\":\n        # Sürekli veriler → Angle Encoding veya ZZFeatureMap en pratik\n        if features <= 8:\n            results[\"primary\"] = (\n                \"Angle Encoding + ZZFeatureMap\",\n                angle_qubits,\n                \"Her özellik bir kübitin dönme açısına (RX/RY/RZ) yazılır. \"\n                \"ZZFeatureMap ile özellikler arası etkileşim (entanglement) eklenir. \"\n                \"NISQ için en yaygın ve stabil yöntem.\",\n                \"zz_feature_map(feature_dimension=n, reps=2, entanglement='linear')\"\n            )\n            results[\"alternatives\"].append((\n                \"PauliFeatureMap\",\n                angle_qubits,\n                \"ZZFeatureMap'e benzer, farklı Pauli operatörleri kullanır. Daha zengin kernel üretebilir.\"\n            ))\n            results[\"alternatives\"].append((\n                \"Amplitude Encoding\",\n                amp_qubits,\n                f\"Sadece ~{amp_qubits} kübit kullanır (2^{amp_qubits} = {amp_padded} boyuta pad edilir). \"\n                \"Ancak state preparation maliyeti yüksek, NISQ'te zordur. Büyük özellik setlerinde düşünülebilir.\"\n            ))\n        else:\n            # Yüksek özellik → önce PCA, sonra Angle\n            results[\"primary\"] = (\n                \"PCA → Angle Encoding + ZZFeatureMap\",\n                results[\"pca_target\"],\n                f\"Özellik sayısı ({features}) yüksek. Önce PCA ile {results['pca_target']} boyuta indirin, \"\n                \"ardından Angle Encoding / ZZFeatureMap uygulayın. Doğrudan 20+ kübit NISQ'te pratik değildir.\",\n                \"PCA(n_components=k) + zz_feature_map(feature_dimension=k, reps=2)\"\n            )\n            results[\"alternatives\"].append((\n                \"Amplitude Encoding (PCA sonrası veya doğrudan)\",\n                amp_qubits,\n                f\"Doğrudan uygulanırsa sadece {amp_qubits} kübit gerekir. Ancak hazırlama devresi çok derin olur.\"\n            ))\n            results[\"warnings\"].append(\n                f\"Özellik sayısı {features} > 8 → mutlaka boyut indirgeme (PCA) yapın.\"\n            )\n\n    elif dtype == \"categorical\":\n        # Kategorik → önce One-Hot, sonra Angle veya Basis\n        results[\"primary\"] = (\n            \"One-Hot Encoding (klasik) → Angle Encoding / Basis Encoding\",\n            angle_qubits,   # one-hot sonrası özellik sayısı değişir; kullanıcı bilgilendirilir\n            \"Kategorik değerler kuantum devresine doğrudan yazılamaz. \"\n            \"Önce pandas.get_dummies / OneHotEncoder ile 0-1 vektörüne çevirin. \"\n            \"Ardından ortaya çıkan sürekli (0/1) özellikleri Angle Encoding ile kübitlere yerleştirin. \"\n            \"Alternatif: her kategori için Basis Encoding (daha az kübit ama daha az esnek).\",\n            \"pd.get_dummies(...) → zz_feature_map / Angle Encoding\"\n        )\n        results[\"alternatives\"].append((\n            \"Basis Encoding (doğrudan)\",\n            \"değişken (kategori sayısı log2)\",\n            \"Her kategorik değişkenin alabileceği değer sayısı 2^k ise k kübit yeterlidir. \"\n            \"Küçük kardinaliteli kategoriler için uygundur.\"\n        ))\n        results[\"warnings\"].append(\n            \"One-Hot Encoding özellik sayısını (dolayısıyla kübit ihtiyacını) artırabilir. \"\n            \"Kardinalitesi yüksek sütunlarda dikkatli olun veya hedef encoding kullanın.\"\n        )\n        results[\"warnings\"].append(\n            \"Kategorik veri için notebook'taki Aşama 3 örnek kodunu (pd.get_dummies) kullanın.\"\n        )\n\n    else:  # mixed\n        results[\"primary\"] = (\n            \"Hibrit: Kategorik → One-Hot + Sürekli → Angle/ZZFeatureMap\",\n            angle_qubits,\n            \"Kategorik sütunları One-Hot ile sayısallaştırın, sürekli sütunları olduğu gibi bırakın. \"\n            \"Birleşik özellik vektörünü Angle Encoding veya ZZFeatureMap ile kodlayın. \"\n            \"Toplam özellik sayısı artacağı için PCA ihtimalini göz önünde bulundurun.\",\n            \"One-Hot (kategorik) + StandardScaler + (opsiyonel PCA) + zz_feature_map\"\n        )\n        results[\"alternatives\"].append((\n            \"Ayrı encoding + feature concatenation\",\n            \"değişken\",\n            \"Kategorik ve sürekli özellikleri farklı feature map'lerle kodlayıp devreleri birleştirmek mümkün \"\n            \"ama daha karmaşık devre ve daha fazla kübit gerektirir.\"\n        ))\n        if features > 6:\n            results[\"pca_recommended\"] = True\n            results[\"warnings\"].append(\n                \"Karışık veri + orta/yüksek özellik sayısı → PCA ile 4-6 boyuta indirmeyi şiddetle öneririz.\"\n            )\n\n    # Veri boyutu (n_samples) etkisi — encoding'i değil, kernel/shot maliyetini etkiler\n    if samples > 1000 and dtype != \"optimization\":\n        results[\"warnings\"].append(\n            f\"Veri boyutu ({samples}) büyük. Kernel tabanlı yöntemlerde (QSVM) her çift için devre çalıştırılır → \"\n            \"hesaplama maliyeti O(n²) artar. Mümkünse örnekleme veya mini-batch düşünün.\"\n        )\n    if samples < 80:\n        results[\"warnings\"].append(\n            \"Veri boyutu çok küçük. Model genellemesi zayıf olabilir; cross-validation ve dikkatli regularization kullanın.\"\n        )\n\n    return results\n\n\n# ---------- Ana Öneri Motoru ----------\ndef get_recommendations(prob, features, samples, dtype, prio):\n    recs = {\n        \"algorithms\": [],\n        \"devices\": [],\n        \"notes\": [],\n        \"encoding_info\": None,   # compute_encoding_and_qubits sonucu\n        \"pca_required\": features > 8\n    }\n\n    # 1) Encoding + Qubit hesabı\n    recs[\"encoding_info\"] = compute_encoding_and_qubits(features, samples, dtype)\n\n    # 2) Algoritma önerileri\n    if prob == \"classification\":\n        recs[\"algorithms\"] = [\n            (\"FidelityQuantumKernel + QSVM\", \"Küçük-orta veri setleri, kernel tabanlı sınıflandırma. Bu notebook'un ana yöntemi.\"),\n            (\"Variational Quantum Classifier (VQC)\", \"RealAmplitudes ansatz ile eğitilebilir sınıflandırıcı.\"),\n            (\"Quantum Neural Network (EstimatorQNN / SamplerQNN)\", \"Daha esnek, katmanlı mimariler için.\")\n        ]\n        if features <= 6 and samples <= 500:\n            recs[\"algorithms\"].insert(0, (\n                \"QSVM (Quantum Support Vector Machine)\",\n                \"Küçük özellik sayısı için en temiz ve yorumlanabilir seçenek.\"\n            ))\n    elif prob == \"regression\":\n        recs[\"algorithms\"] = [\n            (\"Variational Quantum Regressor\", \"VQC benzeri varyasyonel regresyon.\"),\n            (\"Quantum Kernel Ridge Regression\", \"Kernel yöntemlerinin regresyona uyarlanmış hali.\"),\n            (\"EstimatorQNN tabanlı regresyon\", \"Beklenti değeri üzerinden sürekli çıktı.\")\n        ]\n    else:  # optimization\n        recs[\"algorithms\"] = [\n            (\"QAOA (Quantum Approximate Optimization Algorithm)\", \"Kombinatoryal optimizasyon için standart yöntem.\"),\n            (\"VQE (Variational Quantum Eigensolver)\", \"Hamiltonian minimizasyonu gerektiren problemler.\"),\n            (\"Grover / Amplitude Amplification\", \"Yapılandırılmış arama problemleri (ileri seviye).\")\n        ]\n\n    # 3) Cihaz önerileri\n    effective_qubits = recs[\"encoding_info\"][\"primary\"][1]\n    if isinstance(effective_qubits, str):\n        effective_qubits = features  # fallback\n\n    if features > 12 or samples > 2000:\n        recs[\"notes\"].append(\"Yüksek özellik/veri boyutu → mutlaka PCA ile 4-8 boyuta indirgeme yapın.\")\n        recs[\"pca_required\"] = True\n\n    if prio == \"prototype\":\n        recs[\"devices\"] = [\n            (\"AerSimulator / StatevectorSampler (qiskit-aer)\", \"En hızlı, gürültüsüz, geliştirme için ideal. Notebook varsayılanı.\"),\n            (\"Qiskit Runtime Simulator\", \"Bulut simülasyonu, gerçek donanım API deneyimi.\")\n        ]\n        recs[\"notes\"].append(\"Önce simülatörde modeli tamamen doğrulayın, sonra gerçek donanıma geçin.\")\n    elif prio == \"hardware\":\n        if effective_qubits <= 5:\n            recs[\"devices\"] = [\n                (\"IBM Quantum küçük gerçek backend'ler\", \"≤5 kübit için uygun gerçek cihazlar.\"),\n                (\"AerSimulator (ön test)\", \"Gerçek cihaza göndermeden önce mutlaka simülatörde doğrulayın.\")\n            ]\n        elif effective_qubits <= 10:\n            recs[\"devices\"] = [\n                (\"IBM Quantum 127+ kübit sistemler (transpilation + error mitigation)\", \"6-10 kübit için PCA sonrası gerçek donanım denenebilir.\"),\n                (\"Qiskit Runtime + SamplerV2 / EstimatorV2\", \"Modern primitives ile çalıştırma.\")\n            ]\n            recs[\"notes\"].append(\"Gerçek donanımda devre derinliğini düşük tutun (reps=1-2). ResilienceLevel kullanın.\")\n        else:\n            recs[\"devices\"] = [\n                (\"Önce PCA → 4-6 özellik, sonra gerçek donanım\", \"12+ kübit doğrudan pratik değildir.\"),\n                (\"AerSimulator + noise model\", \"Gerçek cihaz gürültüsünü taklit ederek geliştirin.\")\n            ]\n            recs[\"notes\"].append(\"Yüksek kübit ihtiyacı nedeniyle şu an simülatör + PCA zorunludur.\")\n    else:  # accuracy\n        recs[\"devices\"] = [\n            (\"StatevectorSampler (exact)\", \"Gürültüsüz, matematiksel olarak doğru sonuçlar.\"),\n            (\"AerSimulator (shot-based) + yüksek shot (8192+)\", \"İstatistiksel kararlılık için.\"),\n            (\"Gerçek donanım + Error Mitigation (ZNE, PEC)\", \"Son aşamada doğruluk artırmak için.\")\n        ]\n        recs[\"notes\"].append(\"Yüksek doğruluk için shot sayısını artırın ve hata azaltma teknikleri uygulayın.\")\n\n    # Genel notlar\n    if samples < 100:\n        recs[\"notes\"].append(\"Veri boyutu çok küçük → overfitting riski; cross-validation kullanın.\")\n    if dtype == \"categorical\":\n        recs[\"notes\"].append(\"Kategorik veriler doğrudan işlenemez → One-Hot Encoding zorunlu.\")\n\n    return recs\n\n\n# ---------- Buton callback ----------\ndef on_button_clicked(b):\n    with output_area:\n        clear_output()\n        recs = get_recommendations(\n            problem_type.value,\n            n_features.value,\n            n_samples.value,\n            data_type.value,\n            priority.value\n        )\n        enc = recs[\"encoding_info\"]\n\n        display(HTML(\"<h3 style='color:#1a73e8; margin-bottom:8px;'>🔍 Öneri Sonuçları</h3>\"))\n\n        # Özet\n        print(f\"Problem Tipi     : {problem_type.label}\")\n        print(f\"Özellik Sayısı   : {n_features.value}\")\n        print(f\"Veri Boyutu      : {n_samples.value}\")\n        print(f\"Veri Tipi        : {data_type.label}\")\n        print(f\"Öncelik          : {priority.label}\")\n        print(\"=\" * 70)\n\n        # ========== ENCODING + QUBIT HESABI (yeni detaylı bölüm) ==========\n        display(HTML(\n            \"<div style='background:#e8f0fe; padding:12px 16px; border-radius:8px; margin:12px 0;'>\"\n            \"<h4 style='margin:0 0 8px 0; color:#174ea6;'>📐 Veri Encoding Yöntemi & İhtiyaç Duyulan Qubit Hesabı</h4>\"\n            \"</div>\"\n        ))\n\n        name, qubits, desc, qiskit_hint = enc[\"primary\"]\n        print(f\"▶ Birincil Öneri : {name}\")\n        print(f\"   Gerekli Qubit : {qubits}\")\n        print(f\"   Açıklama      : {desc}\")\n        print(f\"   Qiskit İpucu  : {qiskit_hint}\")\n        print()\n\n        # Alternatifler\n        if enc[\"alternatives\"]:\n            display(HTML(\"<b>🔄 Alternatif Encoding Yöntemleri:</b>\"))\n            for i, (alt_name, alt_q, alt_desc) in enumerate(enc[\"alternatives\"], 1):\n                print(f\"   {i}. {alt_name}\")\n                print(f\"      Qubit ≈ {alt_q}\")\n                print(f\"      → {alt_desc}\")\n            print()\n\n        # Qubit karşılaştırma tablosu (özet)\n        display(HTML(\"<b>📊 Hızlı Qubit Karşılaştırması (mevcut özellik sayısına göre):</b>\"))\n        f = n_features.value\n        angle_q = f\n        amp_q = math.ceil(math.log2(max(f, 2)))\n        print(f\"   • Angle Encoding / ZZFeatureMap  →  {angle_q} kübit  (1 özellik = 1 kübit)\")\n        print(f\"   • Amplitude Encoding             →  {amp_q} kübit  (ceil(log2({f})) , 2^{amp_q} boyuta pad)\")\n        print(f\"   • Basis Encoding (kaba tahmin)   →  ~{f*3}-{f*8} kübit (değer aralığına bağlı)\")\n        if enc[\"pca_recommended\"]:\n            print(f\"   • PCA sonrası (önerilen {enc['pca_target']} özellik) →  {enc['pca_target']} kübit (Angle ile)\")\n        print()\n\n        # PCA uyarısı\n        if enc[\"pca_recommended\"] or recs[\"pca_required\"]:\n            display(HTML(\n                \"<div style='background:#fff3cd; padding:10px 14px; border-radius:6px; margin:8px 0;'>\"\n                f\"<b>⚠️ Boyut İndirgeme (PCA) Önerilir:</b> Özellik sayısı yüksek ({n_features.value}). \"\n                f\"Aşama 3'teki PCA adımı ile <b>{enc['pca_target']}</b> boyuta indirmeniz \"\n                \"hem kübit sayısını hem de gürültüyü önemli ölçüde azaltır.\"\n                \"</div>\"\n            ))\n            print()\n\n        # Encoding uyarıları\n        if enc[\"warnings\"]:\n            display(HTML(\"<b>⚠️ Encoding ile ilgili uyarılar:</b>\"))\n            for w in enc[\"warnings\"]:\n                print(f\"   • {w}\")\n            print()\n\n        print(\"=\" * 70)\n\n        # ========== ALGORİTMALAR ==========\n        display(HTML(\"<b>🧠 Önerilen Kuantum Algoritmaları:</b>\"))\n        for i, (name, desc) in enumerate(recs[\"algorithms\"], 1):\n            print(f\"   {i}. {name}\")\n            print(f\"      → {desc}\")\n        print()\n\n        # ========== CİHAZLAR ==========\n        display(HTML(\"<b>💻 Önerilen Cihazlar / Çalıştırma Ortamları:</b>\"))\n        for i, (name, desc) in enumerate(recs[\"devices\"], 1):\n            print(f\"   {i}. {name}\")\n            print(f\"      → {desc}\")\n        print()\n\n        # ========== GENEL NOTLAR ==========\n        if recs[\"notes\"]:\n            display(HTML(\"<b>📝 Ek Notlar:</b>\"))\n            for note in recs[\"notes\"]:\n                print(f\"   • {note}\")\n\n        print(\"\\n\" + \"=\" * 70)\n        display(HTML(\n            \"<b>➡️ Sonraki Adım:</b> Aşama 2'ye geçerek kütüphaneleri kurun. \"\n            \"Burada önerilen özellik / kübit sayısını Aşama 3 (PCA) ve Aşama 6-7 \"\n            \"(feature_map & ansatz) hücrelerinde kullanın.\"\n        ))\n\n\n# Bağla ve göster\nrun_button.on_click(on_button_clicked)\n\nui = widgets.VBox([\n    widgets.HTML(\"<h3 style='margin-bottom:4px;'>🎯 Problem Tanımı + Encoding & Qubit Seçim Aracı</h3>\"),\n    widgets.HTML(\"<p style='color:#555; margin-top:0;'>Veri tipini ve boyutunu seçtiğinizde uygun <b>data encoding</b> yöntemi \"\n                 \"ve ihtiyaç duyulan <b>kübit sayısı</b> otomatik hesaplanır.</p>\"),\n    problem_type,\n    n_features,\n    n_samples,\n    data_type,\n    priority,\n    widgets.HTML(\"<br>\"),\n    run_button,\n    output_area\n])\n\ndisplay(ui)\n\n",
   "metadata": {
    "id": "asama1_secim_araci",
    "colab": {
     "base_uri": "https://localhost:8080/",
     "height": 1000,
     "referenced_widgets": [
      "acfc5ecca00647158f13e95e955d2ed5",
      "6316a76745814701b2479052d4257f45",
      "19715921bcd94c9ca6c5a5e8f867e417",
      "97a92d40efd7419ca714034ec122ec01",
      "c0b5834ebb8f418098687821387d5010",
      "802614c4a7194682998f718433689011",
      "5c4f0fab1d514908802492def0986380",
      "4dc623aa8888413d97bdbaa44d1f6e01",
      "51c4e734face41029d9606e2f11116c6",
      "4228e0029f45487a96a19b5db377bc23",
      "216abb4b5e2b412886600caad529d499",
      "62c93c6087844a1a847e7447759b02bb",
      "7ca7fb0eac3744ad9a5c672454c82560",
      "a62c607c776d46198bcaa947cd98cf1e",
      "df2dad43b0844850a63118bbccdbd9fe",
      "5325fdf002a54094849bbaddfaa0fa7a",
      "43cf67a537fe410ba2987b25090bf1de",
      "6b30e8fb7d2447f7b7700ae702bcd184",
      "d622b940b2cb4632b27f00a5148c4857",
      "46ef22d74f3f4209ad5f5fbcfd31175b",
      "03d34428ab8945afa0962d889016fc73",
      "1fd39a1d7b8142eba115ca073b62d89f",
      "4d540fc04a09481e920c46d53d36895b",
      "88800b3cae2d41d8bb25a0161d353673",
      "d20fd941d9d24d4a9d60cb648b2f71a7",
      "3d6e65c6012d48478876df673b538464",
      "fd7fb2df9b4547d3afeeacdd7485c945",
      "d107039b1b004470a7e159dd9344cb7d",
      "932a27b0998c450e8458bd20178c2fc8",
      "90ed759a5af94a6c897fcffbc6bfc061",
      "22c0663e000e4f2fb90b44e46a8c49a1"
     ]
    },
    "executionInfo": {
     "status": "ok",
     "timestamp": 1786468556507,
     "user_tz": -180,
     "elapsed": 161,
     "user": {
      "displayName": "Joseph Volkan ÖZCAN",
      "userId": "11389530967736397480"
     }
    },
    "outputId": "8dc57e9b-c862-4805-caa4-7fb17c051c9a"
   },
   "execution_count": 1,
   "outputs": [
    {
     "output_type": "display_data",
     "data": {
      "text/plain": [
       "VBox(children=(HTML(value=\"<h3 style='margin-bottom:4px;'>🎯 Problem Tanımı + Encoding & Qubit Seçim Aracı</h3>…"
      ],
      "application/vnd.jupyter.widget-view+json": {
       "version_major": 2,
       "version_minor": 0,
       "model_id": "acfc5ecca00647158f13e95e955d2ed5"
      }
     },
     "metadata": {}
    }
   ]
  },
  {
   "cell_type": "markdown",
   "source": "Aşama 2: Kütüphane Kurulumları ve Çevresel Ayarlar\n\nKuantum cihazları ve veri işleme işlemleri için gerekli olan IBM Qiskit kütüphanelerinin kurulumu\nyapılır.\n\nTerminal/CMD Kurulum Komutu:\npip install qiskit qiskit-machine-learning qiskit-ibm-runtime numpy pandas\npython-dotenv scikit-learn",
   "metadata": {
    "id": "qZjBqNL0buPd"
   }
  },
  {
   "cell_type": "code",
   "source": "import os\nfrom dotenv import load_dotenv\nimport numpy as np\n!pip install qiskit qiskit-machine-learning qiskit-ibm-runtime scikit-learn numpy pandas python-dotenv\n!pip install qiskit-algorithms\n!pip install qiskit-aer\nimport pandas as pd\n# Gerçek Makine erişimleri için IBM API anahtarını .env dosyasından alma\nload_dotenv()\nibm_api_key = os.getenv(\"IBM_QUANTUM_TOKEN\")",
   "metadata": {
    "id": "1pIyogXCb5XV",
    "colab": {
     "base_uri": "https://localhost:8080/"
    },
    "executionInfo": {
     "status": "ok",
     "timestamp": 1785868019166,
     "user_tz": -180,
     "elapsed": 39004,
     "user": {
      "displayName": "Joseph Volkan ÖZCAN",
      "userId": "11389530967736397480"
     }
    },
    "outputId": "b5732b54-bd66-498d-ce10-089013b91c85"
   },
   "execution_count": null,
   "outputs": [
    {
     "output_type": "stream",
     "name": "stdout",
     "text": [
      "Collecting qiskit\n",
      "  Downloading qiskit-2.5.1-cp310-abi3-manylinux_2_28_x86_64.whl.metadata (14 kB)\n",
      "Collecting qiskit-machine-learning\n",
      "  Downloading qiskit_machine_learning-0.9.0-py3-none-any.whl.metadata (13 kB)\n",
      "Collecting qiskit-ibm-runtime\n",
      "  Downloading qiskit_ibm_runtime-0.48.0-py3-none-any.whl.metadata (23 kB)\n",
      "Requirement already satisfied: scikit-learn in /usr/local/lib/python3.12/dist-packages (1.6.1)\n",
      "Requirement already satisfied: numpy in /usr/local/lib/python3.12/dist-packages (2.0.2)\n",
      "Requirement already satisfied: pandas in /usr/local/lib/python3.12/dist-packages (2.2.2)\n",
      "Requirement already satisfied: python-dotenv in /usr/local/lib/python3.12/dist-packages (1.2.2)\n",
      "Requirement already satisfied: scipy>=1.14 in /usr/local/lib/python3.12/dist-packages (from qiskit) (1.16.3)\n",
      "Collecting rustworkx>=0.15.0 (from qiskit)\n",
      "  Downloading rustworkx-0.18.1-cp310-abi3-manylinux2014_x86_64.manylinux_2_17_x86_64.whl.metadata (10 kB)\n",
      "Requirement already satisfied: dill>=0.3 in /usr/local/lib/python3.12/dist-packages (from qiskit) (0.3.8)\n",
      "Collecting stevedore>=3.0.0 (from qiskit)\n",
      "  Downloading stevedore-5.9.0-py3-none-any.whl.metadata (2.3 kB)\n",
      "Requirement already satisfied: typing-extensions in /usr/local/lib/python3.12/dist-packages (from qiskit) (4.16.0)\n",
      "Requirement already satisfied: setuptools>=40.1 in /usr/local/lib/python3.12/dist-packages (from qiskit-machine-learning) (75.2.0)\n",
      "Requirement already satisfied: requests>=2.32.4 in /usr/local/lib/python3.12/dist-packages (from qiskit-ibm-runtime) (2.32.4)\n",
      "Collecting requests-ntlm>=1.1.0 (from qiskit-ibm-runtime)\n",
      "  Downloading requests_ntlm-1.3.0-py3-none-any.whl.metadata (2.4 kB)\n",
      "Requirement already satisfied: urllib3>=2.4.0 in /usr/local/lib/python3.12/dist-packages (from qiskit-ibm-runtime) (2.5.0)\n",
      "Requirement already satisfied: python-dateutil>=2.9.0 in /usr/local/lib/python3.12/dist-packages (from qiskit-ibm-runtime) (2.9.0.post0)\n",
      "Collecting ibm-platform-services>=0.61.1 (from qiskit-ibm-runtime)\n",
      "  Downloading ibm_platform_services-0.77.0-py3-none-any.whl.metadata (9.3 kB)\n",
      "Collecting ibm-quantum-schemas<1,>=0.9.20260612 (from qiskit-ibm-runtime)\n",
      "  Downloading ibm_quantum_schemas-0.10.20260723-py3-none-any.whl.metadata (3.1 kB)\n",
      "Requirement already satisfied: pydantic>=2.11.0 in /usr/local/lib/python3.12/dist-packages (from qiskit-ibm-runtime) (2.13.4)\n",
      "Collecting pybase64>=1.4.0 (from qiskit-ibm-runtime)\n",
      "  Downloading pybase64-1.4.3-cp312-cp312-manylinux1_x86_64.manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_5_x86_64.whl.metadata (8.7 kB)\n",
      "Collecting samplomatic>=0.18.0 (from qiskit-ibm-runtime)\n",
      "  Downloading samplomatic-0.20.0-py3-none-any.whl.metadata (6.5 kB)\n",
      "Requirement already satisfied: joblib>=1.2.0 in /usr/local/lib/python3.12/dist-packages (from scikit-learn) (1.5.3)\n",
      "Requirement already satisfied: threadpoolctl>=3.1.0 in /usr/local/lib/python3.12/dist-packages (from scikit-learn) (3.6.0)\n",
      "Requirement already satisfied: pytz>=2020.1 in /usr/local/lib/python3.12/dist-packages (from pandas) (2025.2)\n",
      "Requirement already satisfied: tzdata>=2022.7 in /usr/local/lib/python3.12/dist-packages (from pandas) (2026.3)\n",
      "Collecting ibm_cloud_sdk_core<4.0.0,>=3.24.4 (from ibm-platform-services>=0.61.1->qiskit-ibm-runtime)\n",
      "  Downloading ibm_cloud_sdk_core-3.26.0-py3-none-any.whl.metadata (8.7 kB)\n",
      "Collecting qiskit_qasm3_import<1.0.0,>=0.5.0 (from ibm-quantum-schemas<1,>=0.9.20260612->qiskit-ibm-runtime)\n",
      "  Downloading qiskit_qasm3_import-0.6.0-py3-none-any.whl.metadata (7.2 kB)\n",
      "Requirement already satisfied: annotated-types>=0.6.0 in /usr/local/lib/python3.12/dist-packages (from pydantic>=2.11.0->qiskit-ibm-runtime) (0.7.0)\n",
      "Requirement already satisfied: pydantic-core==2.46.4 in /usr/local/lib/python3.12/dist-packages (from pydantic>=2.11.0->qiskit-ibm-runtime) (2.46.4)\n",
      "Requirement already satisfied: typing-inspection>=0.4.2 in /usr/local/lib/python3.12/dist-packages (from pydantic>=2.11.0->qiskit-ibm-runtime) (0.4.2)\n",
      "Requirement already satisfied: six>=1.5 in /usr/local/lib/python3.12/dist-packages (from python-dateutil>=2.9.0->qiskit-ibm-runtime) (1.17.0)\n",
      "Requirement already satisfied: charset_normalizer<4,>=2 in /usr/local/lib/python3.12/dist-packages (from requests>=2.32.4->qiskit-ibm-runtime) (3.4.9)\n",
      "Requirement already satisfied: idna<4,>=2.5 in /usr/local/lib/python3.12/dist-packages (from requests>=2.32.4->qiskit-ibm-runtime) (3.18)\n",
      "Requirement already satisfied: certifi>=2017.4.17 in /usr/local/lib/python3.12/dist-packages (from requests>=2.32.4->qiskit-ibm-runtime) (2026.6.17)\n",
      "Requirement already satisfied: cryptography>=1.3 in /usr/local/lib/python3.12/dist-packages (from requests-ntlm>=1.1.0->qiskit-ibm-runtime) (49.0.0)\n",
      "Collecting pyspnego>=0.4.0 (from requests-ntlm>=1.1.0->qiskit-ibm-runtime)\n",
      "  Downloading pyspnego-0.12.1-py3-none-any.whl.metadata (4.1 kB)\n",
      "Requirement already satisfied: orjson>=3.9.0 in /usr/local/lib/python3.12/dist-packages (from samplomatic>=0.18.0->qiskit-ibm-runtime) (3.11.9)\n",
      "Requirement already satisfied: cffi>=2.0.0 in /usr/local/lib/python3.12/dist-packages (from cryptography>=1.3->requests-ntlm>=1.1.0->qiskit-ibm-runtime) (2.1.0)\n",
      "Requirement already satisfied: PyJWT<3.0.0,>=2.11.0 in /usr/local/lib/python3.12/dist-packages (from ibm_cloud_sdk_core<4.0.0,>=3.24.4->ibm-platform-services>=0.61.1->qiskit-ibm-runtime) (2.13.0)\n",
      "Collecting openqasm3<2.0,>=0.4 (from openqasm3[parser]<2.0,>=0.4->qiskit_qasm3_import<1.0.0,>=0.5.0->ibm-quantum-schemas<1,>=0.9.20260612->qiskit-ibm-runtime)\n",
      "  Downloading openqasm3-1.0.1-py3-none-any.whl.metadata (6.0 kB)\n",
      "Requirement already satisfied: pycparser in /usr/local/lib/python3.12/dist-packages (from cffi>=2.0.0->cryptography>=1.3->requests-ntlm>=1.1.0->qiskit-ibm-runtime) (3.0)\n",
      "Requirement already satisfied: antlr4_python3_runtime<4.14,>=4.7 in /usr/local/lib/python3.12/dist-packages (from openqasm3[parser]<2.0,>=0.4->qiskit_qasm3_import<1.0.0,>=0.5.0->ibm-quantum-schemas<1,>=0.9.20260612->qiskit-ibm-runtime) (4.9.3)\n",
      "Downloading qiskit-2.5.1-cp310-abi3-manylinux_2_28_x86_64.whl (9.7 MB)\n",
      "\u001b[2K   \u001b[90m━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\u001b[0m \u001b[32m9.7/9.7 MB\u001b[0m \u001b[31m87.3 MB/s\u001b[0m eta \u001b[36m0:00:00\u001b[0m\n",
      "\u001b[?25hDownloading qiskit_machine_learning-0.9.0-py3-none-any.whl (263 kB)\n",
      "\u001b[2K   \u001b[90m━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\u001b[0m \u001b[32m263.1/263.1 kB\u001b[0m \u001b[31m16.8 MB/s\u001b[0m eta \u001b[36m0:00:00\u001b[0m\n",
      "\u001b[?25hDownloading qiskit_ibm_runtime-0.48.0-py3-none-any.whl (2.0 MB)\n",
      "\u001b[2K   \u001b[90m━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\u001b[0m \u001b[32m2.0/2.0 MB\u001b[0m \u001b[31m76.1 MB/s\u001b[0m eta \u001b[36m0:00:00\u001b[0m\n",
      "\u001b[?25hDownloading ibm_platform_services-0.77.0-py3-none-any.whl (412 kB)\n",
      "\u001b[2K   \u001b[90m━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\u001b[0m \u001b[32m412.6/412.6 kB\u001b[0m \u001b[31m25.6 MB/s\u001b[0m eta \u001b[36m0:00:00\u001b[0m\n",
      "\u001b[?25hDownloading ibm_quantum_schemas-0.10.20260723-py3-none-any.whl (120 kB)\n",
      "\u001b[2K   \u001b[90m━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\u001b[0m \u001b[32m120.7/120.7 kB\u001b[0m \u001b[31m8.1 MB/s\u001b[0m eta \u001b[36m0:00:00\u001b[0m\n",
      "\u001b[?25hDownloading pybase64-1.4.3-cp312-cp312-manylinux1_x86_64.manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_5_x86_64.whl (71 kB)\n",
      "\u001b[2K   \u001b[90m━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\u001b[0m \u001b[32m71.6/71.6 kB\u001b[0m \u001b[31m5.2 MB/s\u001b[0m eta \u001b[36m0:00:00\u001b[0m\n",
      "\u001b[?25hDownloading requests_ntlm-1.3.0-py3-none-any.whl (6.6 kB)\n",
      "Downloading rustworkx-0.18.1-cp310-abi3-manylinux2014_x86_64.manylinux_2_17_x86_64.whl (2.4 MB)\n",
      "\u001b[2K   \u001b[90m━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\u001b[0m \u001b[32m2.4/2.4 MB\u001b[0m \u001b[31m59.7 MB/s\u001b[0m eta \u001b[36m0:00:00\u001b[0m\n",
      "\u001b[?25hDownloading samplomatic-0.20.0-py3-none-any.whl (224 kB)\n",
      "\u001b[2K   \u001b[90m━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\u001b[0m \u001b[32m224.2/224.2 kB\u001b[0m \u001b[31m16.2 MB/s\u001b[0m eta \u001b[36m0:00:00\u001b[0m\n",
      "\u001b[?25hDownloading stevedore-5.9.0-py3-none-any.whl (54 kB)\n",
      "\u001b[2K   \u001b[90m━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\u001b[0m \u001b[32m54.5/54.5 kB\u001b[0m \u001b[31m3.3 MB/s\u001b[0m eta \u001b[36m0:00:00\u001b[0m\n",
      "\u001b[?25hDownloading ibm_cloud_sdk_core-3.26.0-py3-none-any.whl (76 kB)\n",
      "\u001b[2K   \u001b[90m━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\u001b[0m \u001b[32m76.6/76.6 kB\u001b[0m \u001b[31m5.5 MB/s\u001b[0m eta \u001b[36m0:00:00\u001b[0m\n",
      "\u001b[?25hDownloading pyspnego-0.12.1-py3-none-any.whl (130 kB)\n",
      "\u001b[2K   \u001b[90m━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\u001b[0m \u001b[32m130.2/130.2 kB\u001b[0m \u001b[31m8.9 MB/s\u001b[0m eta \u001b[36m0:00:00\u001b[0m\n",
      "\u001b[?25hDownloading qiskit_qasm3_import-0.6.0-py3-none-any.whl (29 kB)\n",
      "Downloading openqasm3-1.0.1-py3-none-any.whl (541 kB)\n",
      "\u001b[2K   \u001b[90m━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\u001b[0m \u001b[32m541.5/541.5 kB\u001b[0m \u001b[31m37.2 MB/s\u001b[0m eta \u001b[36m0:00:00\u001b[0m\n",
      "\u001b[?25hInstalling collected packages: openqasm3, stevedore, rustworkx, pybase64, qiskit, ibm_cloud_sdk_core, samplomatic, qiskit_qasm3_import, qiskit-machine-learning, pyspnego, ibm-platform-services, requests-ntlm, ibm-quantum-schemas, qiskit-ibm-runtime\n",
      "Successfully installed ibm-platform-services-0.77.0 ibm-quantum-schemas-0.10.20260723 ibm_cloud_sdk_core-3.26.0 openqasm3-1.0.1 pybase64-1.4.3 pyspnego-0.12.1 qiskit-2.5.1 qiskit-ibm-runtime-0.48.0 qiskit-machine-learning-0.9.0 qiskit_qasm3_import-0.6.0 requests-ntlm-1.3.0 rustworkx-0.18.1 samplomatic-0.20.0 stevedore-5.9.0\n",
      "Collecting qiskit-algorithms\n",
      "  Downloading qiskit_algorithms-0.4.0-py3-none-any.whl.metadata (4.7 kB)\n",
      "Requirement already satisfied: qiskit>=1.0 in /usr/local/lib/python3.12/dist-packages (from qiskit-algorithms) (2.5.1)\n",
      "Requirement already satisfied: scipy>=1.4 in /usr/local/lib/python3.12/dist-packages (from qiskit-algorithms) (1.16.3)\n",
      "Requirement already satisfied: numpy>=1.17 in /usr/local/lib/python3.12/dist-packages (from qiskit-algorithms) (2.0.2)\n",
      "Requirement already satisfied: rustworkx>=0.15.0 in /usr/local/lib/python3.12/dist-packages (from qiskit>=1.0->qiskit-algorithms) (0.18.1)\n",
      "Requirement already satisfied: dill>=0.3 in /usr/local/lib/python3.12/dist-packages (from qiskit>=1.0->qiskit-algorithms) (0.3.8)\n",
      "Requirement already satisfied: stevedore>=3.0.0 in /usr/local/lib/python3.12/dist-packages (from qiskit>=1.0->qiskit-algorithms) (5.9.0)\n",
      "Requirement already satisfied: typing-extensions in /usr/local/lib/python3.12/dist-packages (from qiskit>=1.0->qiskit-algorithms) (4.16.0)\n",
      "Downloading qiskit_algorithms-0.4.0-py3-none-any.whl (327 kB)\n",
      "\u001b[2K   \u001b[90m━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\u001b[0m \u001b[32m327.8/327.8 kB\u001b[0m \u001b[31m16.1 MB/s\u001b[0m eta \u001b[36m0:00:00\u001b[0m\n",
      "\u001b[?25hInstalling collected packages: qiskit-algorithms\n",
      "Successfully installed qiskit-algorithms-0.4.0\n",
      "Collecting qiskit-aer\n",
      "  Downloading qiskit_aer-0.17.2-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl.metadata (8.3 kB)\n",
      "Requirement already satisfied: qiskit>=1.1.0 in /usr/local/lib/python3.12/dist-packages (from qiskit-aer) (2.5.1)\n",
      "Requirement already satisfied: numpy>=1.16.3 in /usr/local/lib/python3.12/dist-packages (from qiskit-aer) (2.0.2)\n",
      "Requirement already satisfied: scipy>=1.0 in /usr/local/lib/python3.12/dist-packages (from qiskit-aer) (1.16.3)\n",
      "Requirement already satisfied: psutil>=5 in /usr/local/lib/python3.12/dist-packages (from qiskit-aer) (5.9.5)\n",
      "Requirement already satisfied: python-dateutil>=2.8.0 in /usr/local/lib/python3.12/dist-packages (from qiskit-aer) (2.9.0.post0)\n",
      "Requirement already satisfied: six>=1.5 in /usr/local/lib/python3.12/dist-packages (from python-dateutil>=2.8.0->qiskit-aer) (1.17.0)\n",
      "Requirement already satisfied: rustworkx>=0.15.0 in /usr/local/lib/python3.12/dist-packages (from qiskit>=1.1.0->qiskit-aer) (0.18.1)\n",
      "Requirement already satisfied: dill>=0.3 in /usr/local/lib/python3.12/dist-packages (from qiskit>=1.1.0->qiskit-aer) (0.3.8)\n",
      "Requirement already satisfied: stevedore>=3.0.0 in /usr/local/lib/python3.12/dist-packages (from qiskit>=1.1.0->qiskit-aer) (5.9.0)\n",
      "Requirement already satisfied: typing-extensions in /usr/local/lib/python3.12/dist-packages (from qiskit>=1.1.0->qiskit-aer) (4.16.0)\n",
      "Downloading qiskit_aer-0.17.2-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl (12.4 MB)\n",
      "\u001b[2K   \u001b[90m━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\u001b[0m \u001b[32m12.4/12.4 MB\u001b[0m \u001b[31m82.7 MB/s\u001b[0m eta \u001b[36m0:00:00\u001b[0m\n",
      "\u001b[?25hInstalling collected packages: qiskit-aer\n",
      "Successfully installed qiskit-aer-0.17.2\n"
     ]
    }
   ]
  },
  {
   "cell_type": "markdown",
   "source": "Aşama 3: Veri Tipi ve Niteliklerinin (Attributes) Belirlenmesi\n(Detaylandırılmış Kısım)\n\nBu aşama, klasik verilerin bir kuantum devresinde (Quantum Circuit) nasıl işleneceğini belirleyen\nen kritik adımlardan biridir. Kuantum Makine Öğrenmesinde (QML) verinin boyutu ve tipi (sürekli\nveya kategorik), kullanılacak kuantum donanımının özelliklerine göre şekillendirilmelidir.\n\n1. Kübit Kısıtları (Qubit Constraints) ve NISQ Dönemi\nGünümüz kuantum bilgisayarları NISQ (Noisy Intermediate-Scale Quantum) olarak adlandırılan\ndönemdedir. Bu cihazların kübit sayısı kısıtlıdır ve kuantum devreleri derinleştikçe (gate derinliği\narttıkça) gürültü (noise) sebebiyle sonuçlar bozulmaya başlar. Qiskit'te `QuantumCircuit`\noluştururken, kullanacağınız veri setindeki her bir özellik (feature) veya nitelik, sıklıkla bir veya daha\nfazla kübit gerektirir.\n\nVeri Boyutu ve Kübit İlişkisi: Eğer 100 farklı özelliğe (kolona) sahip bir veri setiniz\nvarsa, standart bir Açı Kodlaması (Angle Encoding) yöntemi kullandığınızda, bunu\nkuantum cihazına aktarmak için 100 kübite ihtiyacınız olacaktır. NISQ dönemi cihazları\niçin bu genellikle imkansız veya çok gürültülü sonuçlar doğuran bir derinlik yaratır.\n\n",
   "metadata": {
    "id": "XjhKy5LWb_Cd"
   }
  },
  {
   "cell_type": "markdown",
   "source": "2. Boyut İndirgeme (Dimensionality Reduction) ve PCA Kullanımı\nYukarıda bahsedilen kübit sınırlamaları nedeniyle, kuantum modeline girmeden önce klasik verinin\nboyutunun düşürülmesi neredeyse zorunludur. Bunun için en yaygın kullanılan yöntem PCA\n(Principal Component Analysis - Temel Bileşenler Analizi)'dir. PCA, klasik verideki en önemli\nvaryansları korurken özellik sayısını (örneğin 30 boyuttan 4 boyuta) düşürür.\n",
   "metadata": {
    "id": "6zMAq5qScNZV"
   }
  },
  {
   "cell_type": "code",
   "source": "from sklearn.decomposition import PCA\nfrom sklearn.preprocessing import StandardScaler\nfrom sklearn.pipeline import make_pipeline\n\n# Örnek: 30 özelliğe sahip bir veri setini Kuantum cihazına uygun olması için 4 özelliğe indirme\ndef boyut_indirgeme_uygula(X_veri):\n    # Kuantum sistemler -1, 1 aralığında veya Normalize verilere daha iyi tepki verir\n    # Bu yüzden önce standartlaştırma yapılır, ardından PCA ile özellik sayısı düşürülür\n    pipeline = make_pipeline(StandardScaler(), PCA(n_components=4))\n    X_kucultulmus = pipeline.fit_transform(X_veri)\n    return X_kucultulmus",
   "metadata": {
    "id": "uJAuI8ThcQ-m"
   },
   "execution_count": null,
   "outputs": []
  },
  {
   "cell_type": "markdown",
   "source": "3. Sürekli (Continuous) vs. Kategorik (Categorical)\n\nVeri Tipleri\nVerinin türü, Qiskit'te hangi Encoding (Veri Kodlama) yönteminin kullanılacağını belirler.\n-Sürekli Veriler (Continuous Data): Yaş, Gelir, Fiyat gibi sürekli değerlere sahip değişkenler,\nkuantum kapılarının dönüş açılarına (Rotation Angles) yerleştirilmek için idealdir. Bu işlem\nQiskit'te genellikle Angle Encoding (Açı Kodlaması) veya ZZFeatureMap kullanılarak yapılır.\n\n-Kategorik Veriler (Categorical Data): Cinsiyet, Şehir, Renk gibi kategorik verilerin kuantum\ndevresine aktarılmadan önce bir sayısal formata dönüştürülmesi gerekir. QML modelleri kategorik verileri işlerken zorlanabilir. Bu nedenle bu veriler öncelikle One-Hot Encoding\nyöntemiyle işlenmeli, ardından kübitlere dağıtılmalıdır. Örneğin; `NeuralNetworkClassifier`\nveya varyasyonlu devreler kullanılırken, ayrık/kategorik veriler Qiskit içinde özel olarak\ndeğerlendirilmelidir.",
   "metadata": {
    "id": "3j_xImRbcT49"
   }
  },
  {
   "cell_type": "code",
   "source": "# Kategorik veriyi klasik ortamda QML'e hazırlama (One-Hot Encoding örneği)\nimport pandas as pd\nveri_sozlugu = {'Yas': [25, 45, 30], 'Sehir': ['Ankara', 'Izmir', 'Ankara']}\ndf_ornek = pd.DataFrame(veri_sozlugu)\n# 'Sehir' kolonunu One-Hot (0 ve 1'lere) dönüştürme\ndf_one_hot = pd.get_dummies(df_ornek, columns=['Sehir'])\nprint(\"QML Öncesi Veri Tipi Dönüşümü:\")\nprint(df_one_hot.head())",
   "metadata": {
    "id": "Obof57PIch3V",
    "colab": {
     "base_uri": "https://localhost:8080/"
    },
    "executionInfo": {
     "status": "ok",
     "timestamp": 1785868272368,
     "user_tz": -180,
     "elapsed": 24,
     "user": {
      "displayName": "Joseph Volkan ÖZCAN",
      "userId": "11389530967736397480"
     }
    },
    "outputId": "90f66c92-7fbd-4fdf-d109-eb77ef2162dd"
   },
   "execution_count": null,
   "outputs": [
    {
     "output_type": "stream",
     "name": "stdout",
     "text": [
      "QML Öncesi Veri Tipi Dönüşümü:\n",
      "   Yas  Sehir_Ankara  Sehir_Izmir\n",
      "0   25          True        False\n",
      "1   45         False         True\n",
      "2   30          True        False\n"
     ]
    }
   ]
  },
  {
   "cell_type": "markdown",
   "source": "Aşama 4: Veri Üretimi ve KVKK-GDPR\n Projede kullanılacak verinin hazırlanması ve kişisel verilerin korunması işlemleridir.",
   "metadata": {
    "id": "yq6QrZozcnVF"
   }
  },
  {
   "cell_type": "code",
   "source": "import sqlite3\nimport hashlib\nfrom sklearn.datasets import make_classification\nX_synth, y_synth = make_classification(n_samples=200, n_features=4, n_informative=2,\nrandom_state=42)\ndf = pd.DataFrame(X_synth, columns=['Ozellik_1', 'Ozellik_2', 'Ozellik_3', 'Ozellik_4'])\ndf['Hedef_Sinif'] = y_synth",
   "metadata": {
    "id": "ckS-eCvJcv19"
   },
   "execution_count": null,
   "outputs": []
  },
  {
   "cell_type": "code",
   "source": "#Aşama 5: Sürükle Bırak Veri Yükleme\nimport ipywidgets as widgets\nfrom IPython.display import display\nimport io\nuploader = widgets.FileUpload(accept='.csv', multiple=False)\ndisplay(uploader)",
   "metadata": {
    "id": "65f82WQzc9p7",
    "colab": {
     "base_uri": "https://localhost:8080/",
     "height": 49,
     "referenced_widgets": [
      "8632735776934f61bed73b541f0e8ebd",
      "78f0bcaba51748d7a7832b7b063a4d70",
      "cdd929945b054f05baf319ff0b7e5eb7"
     ]
    },
    "executionInfo": {
     "status": "ok",
     "timestamp": 1785868390011,
     "user_tz": -180,
     "elapsed": 28,
     "user": {
      "displayName": "Joseph Volkan ÖZCAN",
      "userId": "11389530967736397480"
     }
    },
    "outputId": "8c5e5537-e907-4acc-ae77-ae775c566ad9"
   },
   "execution_count": null,
   "outputs": [
    {
     "output_type": "display_data",
     "data": {
      "text/plain": [
       "FileUpload(value={}, accept='.csv', description='Upload')"
      ],
      "application/vnd.jupyter.widget-view+json": {
       "version_major": 2,
       "version_minor": 0,
       "model_id": "8632735776934f61bed73b541f0e8ebd"
      }
     },
     "metadata": {}
    }
   ]
  },
  {
   "cell_type": "code",
   "source": "from qiskit import QuantumCircuit\nfrom qiskit.circuit.library import zz_feature_map, real_amplitudes\n\nnum_features = 4  # Özellik sayısı\n\n# Aşama 7: Sınıf yerine güncel fonksiyon kullanımı (ZZFeatureMap -> zz_feature_map)\nfeature_map = zz_feature_map(feature_dimension=num_features, reps=2, entanglement='linear')\n\n# Aşama 6: Sınıf yerine güncel fonksiyon kullanımı (RealAmplitudes -> real_amplitudes)\nansatz = real_amplitudes(num_qubits=num_features, reps=3)\n\n# Encoding ve Ansatz birleştirilmesi (Artık doğrudan plain QuantumCircuit döner)\nqc = QuantumCircuit(num_features)\nqc.compose(feature_map, inplace=True)\nqc.compose(ansatz, inplace=True)\nqc.measure_all()",
   "metadata": {
    "id": "nuZOtjEYdFY2"
   },
   "execution_count": null,
   "outputs": []
  },
  {
   "cell_type": "markdown",
   "source": "Aşama 8: Kuantum Kernel Oluşturulması ve Parametrelerin (Shot) Belirlenmesi QML'de sınıflandırma (örneğin QSVM) yaparken verileri birbirinden ayırmak için \"Kuantum Çekirdek (Quantum Kernel)\" yöntemini kullanırız. Bu aşamada FidelityQuantumKernel ile verilerin kuantum durumlarındaki benzerliğini hesaplarız. Qiskit'te çekirdek tanımlanırken, kaç 'shot' (atış/deneme) yapılacağı sonuçların istatistiksel geçerliliğini doğrudan etkiler (örneğin 1024 shot, gürültüyü tolere etmek için ideal bir başlangıçtır).",
   "metadata": {
    "id": "8q8iATnodJpZ"
   }
  },
  {
   "cell_type": "code",
   "source": "from qiskit_machine_learning.kernels import FidelityQuantumKernel\nfrom qiskit_algorithms.state_fidelities import ComputeUncompute\nfrom qiskit.primitives import StatevectorSampler  # V2 uyumlu resmi Statevector Sampler\n\n# 1. Simülatör ve V2 uyumlu Sampler'ın tanımlanması\nshots = 1024\nsampler = StatevectorSampler()  # Doğrudan BaseSamplerV2 uyumludur\n\n# 2. Durum Doğruluğu (State Fidelity) hesaplayıcısının tanımlanması\nfidelity = ComputeUncompute(sampler=sampler, shots=shots)\n\n# 3. Kuantum Kernel Tanımlanması (Önceki aşamada oluşturulan feature_map kullanılarak)\nqkernel = FidelityQuantumKernel(fidelity=fidelity, feature_map=feature_map)\n\nprint(f\"Kuantum Kernel başarıyla tanımlandı! Toplam Atış (Shot) Sayısı: {shots}\")",
   "metadata": {
    "id": "WhVo_mfPuhMA",
    "colab": {
     "base_uri": "https://localhost:8080/"
    },
    "executionInfo": {
     "status": "ok",
     "timestamp": 1785868459264,
     "user_tz": -180,
     "elapsed": 36,
     "user": {
      "displayName": "Joseph Volkan ÖZCAN",
      "userId": "11389530967736397480"
     }
    },
    "outputId": "d8b9ec79-ad1d-4f89-d102-a1cf4b1916dd"
   },
   "execution_count": null,
   "outputs": [
    {
     "output_type": "stream",
     "name": "stdout",
     "text": [
      "Kuantum Kernel başarıyla tanımlandı! Toplam Atış (Shot) Sayısı: 1024\n"
     ]
    }
   ]
  },
  {
   "cell_type": "markdown",
   "source": "Aşama 9: Programın Çalıştırılması (Simülatör ve Gerçek Kuantum Donanımı)\nBu aşama Qiskit Runtime Primitives (SamplerV2) kullanılarak gerçekleştirilir. Önce devreyi makine diline çeviririz (Transpile), ardından simülatör veya gerçek donanıma göndeririz.",
   "metadata": {
    "id": "FHLFedZGu7mE"
   }
  },
  {
   "cell_type": "code",
   "source": "from qiskit_machine_learning.kernels import FidelityQuantumKernel\nfrom qiskit_algorithms.state_fidelities import ComputeUncompute\nfrom qiskit.primitives import StatevectorSampler  # V2 uyumlu resmi Statevector Sampler\n\n# 1. Simülatör ve V2 uyumlu Sampler'ın tanımlanması\nshots = 1024\nsampler = StatevectorSampler()  # Doğrudan BaseSamplerV2 uyumludur\n\n# 2. Durum Doğruluğu (State Fidelity) hesaplayıcısının tanımlanması\nfidelity = ComputeUncompute(sampler=sampler, shots=shots)\n\n# 3. Kuantum Kernel Tanımlanması (Önceki aşamada oluşturulan feature_map kullanılarak)\nqkernel = FidelityQuantumKernel(fidelity=fidelity, feature_map=feature_map)\n\nprint(f\"Kuantum Kernel başarıyla tanımlandı! Toplam Atış (Shot) Sayısı: {shots}\")",
   "metadata": {
    "id": "SPHwGf62u-ej",
    "colab": {
     "base_uri": "https://localhost:8080/"
    },
    "executionInfo": {
     "status": "ok",
     "timestamp": 1785868505647,
     "user_tz": -180,
     "elapsed": 12,
     "user": {
      "displayName": "Joseph Volkan ÖZCAN",
      "userId": "11389530967736397480"
     }
    },
    "outputId": "77a14ca6-dbc9-496b-bf19-12cd245501eb"
   },
   "execution_count": null,
   "outputs": [
    {
     "output_type": "stream",
     "name": "stdout",
     "text": [
      "Kuantum Kernel başarıyla tanımlandı! Toplam Atış (Shot) Sayısı: 1024\n"
     ]
    }
   ]
  },
  {
   "cell_type": "markdown",
   "source": "Aşama 10: Çıkan Sonucun Ölçülmesi ve De-Anonimizasyon\n\n Kuantum makinesinden gelen sonuçlar (örneğin '00', '01' durumları) frekans/sıklık şeklinde gelir. KVKK için anonimleştirilen veriler, karar mekanizmasında anlamlı hale gelebilmesi için geri dönüştürülmelidir (Sözlük map'leme veya şifre çözme yoluyla).",
   "metadata": {
    "id": "t-Mjo2HuwE2A"
   }
  },
  {
   "cell_type": "code",
   "source": "# Aşama 10: Çıkan Sonucun Ölçülmesi ve De-Anonimizasyon\n# Örnek dummy sonuç: {'00': 500, '11': 524}\nsim_counts = {'00': 500, '11': 524}\nprint(\"Ölçüm Sonuçları (Frekans Dağılımı):\", sim_counts)\n\n# De-anonimizasyon işlemi için haritalama sözlüğü\nmapping_sozlugu = {\n    'hasta_A_anonim': 'Hasta_123_Gercek',\n    'hasta_B_anonim': 'Hasta_456_Gercek'\n}\n\n# Sonuçta analiz edilen kimliğin geri dönüştürülmesi\nanonim_id = 'hasta_A_anonim'\ngercek_kimlik = mapping_sozlugu.get(anonim_id, \"Bilinmeyen\")\nprint(f\"De-anonimizasyon sonucu: {anonim_id} ---> {gercek_kimlik}\")",
   "metadata": {
    "id": "aewR5OvuwLvt",
    "colab": {
     "base_uri": "https://localhost:8080/"
    },
    "executionInfo": {
     "status": "ok",
     "timestamp": 1785868537878,
     "user_tz": -180,
     "elapsed": 12,
     "user": {
      "displayName": "Joseph Volkan ÖZCAN",
      "userId": "11389530967736397480"
     }
    },
    "outputId": "05d69f92-880b-4336-e91e-4505d736e90e"
   },
   "execution_count": null,
   "outputs": [
    {
     "output_type": "stream",
     "name": "stdout",
     "text": [
      "Ölçüm Sonuçları (Frekans Dağılımı): {'00': 500, '11': 524}\n",
      "De-anonimizasyon sonucu: hasta_A_anonim ---> Hasta_123_Gercek\n"
     ]
    }
   ]
  },
  {
   "cell_type": "markdown",
   "source": "Aşama 11: Sonucun Yorumlanması ve Dışarı Aktarılması (CSV & SQL)\n\nKuantum ölçüm sonuçlarını (Frekans ve Olasılıkları) tablo formatına çevirip bir CSV dosyasına veya ilişkisel SQL veritabanına yazmamız gerekir.",
   "metadata": {
    "id": "VJgeHO8mwxJh"
   }
  },
  {
   "cell_type": "code",
   "source": "import sqlite3\nimport pandas as pd\nimport os\n\n# Örnek sim_counts ve shots tanımları (Eğer önceki hücrelerde tanımlı değilse)\nsim_counts = {'00': 500, '11': 524}\nshots = 1024\n\n# Sonuçların DataFrame'e çevrilmesi ve Olasılık Hesabı\nsonuc_df = pd.DataFrame(list(sim_counts.items()), columns=['Kuantum_Durumu', 'Frekans_Sayisi'])\nsonuc_df['Olasilik_%'] = (sonuc_df['Frekans_Sayisi'] / shots) * 100\n\nprint(sonuc_df)\n\n# 1. Çıktıyı CSV'ye Yazma\noutput_dir = \"./sonuclar\"\nos.makedirs(output_dir, exist_ok=True)\ncsv_path = os.path.join(output_dir, \"qml_olcum_sonuclari.csv\")\n\nsonuc_df.to_csv(csv_path, index=False)\nprint(f\"Sonuçlar CSV formatında başarıyla kaydedildi: {csv_path}\")\n\n# 2. Çıktıyı SQL Veritabanına Yazma\ntry:\n    conn = sqlite3.connect('qml_veritabani.db')\n    sonuc_df.to_sql('Kuantum_Frekans_Sonuclari', conn, if_exists='replace', index=False)\n    print(\"Sonuçlar SQL tablosuna başarıyla yazıldı.\")\n    conn.close()\nexcept Exception as e:\n    print(\"SQL'e yazılırken bağlantı veya yazma hatası oluştu:\", e)",
   "metadata": {
    "id": "-12CqExWw-CT",
    "colab": {
     "base_uri": "https://localhost:8080/"
    },
    "executionInfo": {
     "status": "ok",
     "timestamp": 1785868595539,
     "user_tz": -180,
     "elapsed": 62,
     "user": {
      "displayName": "Joseph Volkan ÖZCAN",
      "userId": "11389530967736397480"
     }
    },
    "outputId": "5814b0eb-7175-4181-f4b4-62da8e2c290d"
   },
   "execution_count": null,
   "outputs": [
    {
     "output_type": "stream",
     "name": "stdout",
     "text": [
      "  Kuantum_Durumu  Frekans_Sayisi  Olasilik_%\n",
      "0             00             500   48.828125\n",
      "1             11             524   51.171875\n",
      "Sonuçlar CSV formatında başarıyla kaydedildi: ./sonuclar/qml_olcum_sonuclari.csv\n",
      "Sonuçlar SQL tablosuna başarıyla yazıldı.\n"
     ]
    }
   ]
  },
  {
   "cell_type": "markdown",
   "source": "Aşama 12: Sonucun Histogram Olarak Gösterilmesi\n\nSonuçların sınıf dağılımlarını, süperpozisyon veya olasılık genliklerini görselleştirmek (histogram çizmek), kuantum devre analizinin en standart yoludur.",
   "metadata": {
    "id": "eohhnLJJxnwo"
   }
  },
  {
   "cell_type": "code",
   "source": "# Jupyter'in grafikleri hücre altında göstermesini sağlar\n%matplotlib inline\n\nfrom qiskit.visualization import plot_histogram\nimport matplotlib.pyplot as plt\n\n# Örnek sim_counts verisi\nsim_counts = {'00': 500, '11': 524}\n\n# Kuantum simülatörü/donanımı ölçüm sonuçlarını görselleştirme\nfig = plot_histogram(\n    sim_counts,\n    title=\"Kuantum Devresi Ölçüm Sonuçları (Histogram)\",\n    figsize=(10, 6),\n    color='teal'\n)\n\n# Qiskit plot_histogram bazen doğrudan fig nesnesi döndürür,\n# grafik nesnesini açıkça ekrana çizdirme komutu:\ndisplay(fig)\n\n# Alternatif olarak matplotlib gösterimi\nplt.show()",
   "metadata": {
    "id": "DiaN4oGtxrWs",
    "executionInfo": {
     "status": "ok",
     "timestamp": 1785868701763,
     "user_tz": -180,
     "elapsed": 299,
     "user": {
      "displayName": "Joseph Volkan ÖZCAN",
      "userId": "11389530967736397480"
     }
    },
    "colab": {
     "base_uri": "https://localhost:8080/",
     "height": 607
    },
    "collapsed": true,
    "outputId": "5fd3b376-13b5-4d31-eb41-22c9f3238e3a"
   },
   "execution_count": null,
   "outputs": [
    {
     "output_type": "display_data",
     "data": {
      "text/plain": [
       "<Figure size 1000x600 with 1 Axes>"
      ],
      "image/png": "iVBORw0KGgoAAAANSUhEUgAAA90AAAJOCAYAAACqS2TfAAAAOnRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjEwLjAsIGh0dHBzOi8vbWF0cGxvdGxpYi5vcmcvlHJYcgAAAAlwSFlzAAAPYQAAD2EBqD+naQAATTFJREFUeJzt3Xd8VfX9P/D3TULCDHuIyNSCCAqiIi5EUUBcrRMXItZRrW2tlloHolXrqKPW3QpaS11V60DBAUURqrVFrOsnFMWqgIgQlJnk/P7wkfs1JkEIOQTw+Xw88pD7OZ97zvtz780xr/s5I5MkSRIAAABAjcup7QIAAABgSyV0AwAAQEqEbgAAAEiJ0A0AAAApEboBAAAgJUI3AAAApEToBgAAgJQI3QAAAJASoRsAatnnn38eRUVFERFRVFQUn3/+eS1XBADUFKEbAGpZ796947jjjouIiOOOOy569+5dyxUBADUlkyRJUttFAMB32bRp06Jhw4ax0047xeuvvx5ffPFF7LnnnrVdFgBQA8x0A0ANmjJlSmQymZgyZco6P2fPPfeMnXbaKSIidtpppyoD97hx4yKTycT777+/3nVdeumlkclkYtGiRfHwww+vd418pWPHjnHyySfXag3XXHNNdOvWLUpLS6u9jrLPA2u3++67xy9+8YvaLgPYzAndAOuoLPD885//LNe+dOnS2G233aJu3brxzDPP1FJ1X3nrrbfi0ksvrVYoS9u+++4bmUwmMplM5OTkRGFhYXTt2jVOPPHEePbZZ2u7vFrz5ptvxgknnBBbb711FBQURNu2beP444+PN998s0a384Mf/CD+9Kc/RaNGjWK33XaLP/3pT7H99tvX6DbW5oknnoj+/ftHq1aton79+tG5c+c4+uija/13ZnNTVFQUV199dYwaNSpycv7vz7hMJhNnn312pc+pat+1vj7++OO49NJLY+bMmRu0ns3JqFGj4pZbbon58+fXdinAZkzoBtgARUVFceCBB8asWbPi0UcfjcGDB9dqPW+99VaMGTNmkwzdERHt2rWLP/3pT3HvvffGtddeG4ceemi8/PLLceCBB8YxxxwTa9asqe0SN9g+++wTK1asiH322edb+z7yyCOx8847x/PPPx8jRoyIW2+9NUaOHBmTJ0+OnXfeOR599NEaq2vHHXeME044IQoKCqJ9+/ZxwgknROvWrWts/Wtz3XXXxaGHHhqZTCYuuOCCuOGGG+KII46I9957L+6///6NUsOW4u67747i4uIYNmzYBq3noosuihUrVqzXcz7++OMYM2bMdyp0H3bYYVFYWBi33nprbZcCbMbyarsAgM3VsmXLYtCgQTFz5sx45JFHYsiQIbVd0iavcePGccIJJ5Rr+81vfhPnnHNO3HrrrdGxY8e4+uqrN1o9SZLEypUro169ejW2zpycnKhbt+639pszZ06ceOKJ0blz55g6dWq0bNkyu+wnP/lJ7L333nHiiSfGrFmzonPnzjVW38ZWXFwcl19+eRxwwAExadKkCssXLlxYC1VtGlauXBn5+fnlZqy/zdixY+PQQw9dp8/Y2uTl5UVe3ub1Z2BxcXGUlpZGfn7+RttmTk5OHHnkkXHvvffGmDFjHJIPVIuZboBq+OKLL2Lw4MHxr3/9K/7617/G0KFDs8tOPvnk6NixY4XnVHYO5dixY2O//faLVq1aRUFBQXTv3j1uu+22Cs/t2LFjHHzwwfHSSy9lD2Xv3Llz3Hvvvdk+48aNi6OOOioiIgYMGJA9lLvsvN1MJhOXXnpppev++jmqZYeivvTSS3HOOedEy5Yto0mTJnH66afH6tWrY8mSJXHSSSdF06ZNo2nTpvGLX/wiNuSanLm5ufG73/0uunfvHr///e9j6dKl5Zbfd9990adPn6hXr140a9Ysjj322Pjwww+zy88+++xo2LBhLF++vMK6hw0bFm3atImSkpLsWA8++OCYOHFi7LLLLlGvXr244447IiJiyZIl8dOf/jS22WabKCgoiG233TauvvrqCufN3n///dGnT59o1KhRFBYWRs+ePeOmm27KLl/Xc7qvvfbaWL58edx5553lAndERIsWLeKOO+6IL7/8Mq655ppvfQ2ffvrp6N+/f7amXXfdNcaPH59dXtV5yPvuu2/su+++FWp/8MEHY8yYMbH11ltHo0aN4sgjj4ylS5fGqlWr4qc//Wm0atUqGjZsGCNGjIhVq1attbZFixZFUVFRleept2rVqtzjhQsXxsiRI6N169ZRt27d2GmnneKee+4p1+f999+PTCYT1113Xdx5553RpUuXKCgoiF133TVeffXVtY6xTGW/p6WlpXHTTTdFz549o27dutGyZcsYPHjwWg/LXrx4cZx33nnRs2fPaNiwYRQWFsaQIUPi9ddfL9ev7LW9//7746KLLoqtt9466tevH0VFRev8mZk7d27MmjUrBg4cuNZ+66Ky/dGzzz4be+21VzRp0iQaNmwYXbt2jV/96lfZ+nfdddeIiBgxYkR2/zJu3Ljs8x966KHs72qLFi3ihBNOiI8++qjCth966KHo3r171K1bN3r06BGPPvpohffj6+/xjTfemH2P33rrrVi9enVccskl0adPn2jcuHE0aNAg9t5775g8eXK57Xx9Hbfcckt07tw56tevHwceeGB8+OGHkSRJXH755dGuXbuoV69eHHbYYbF48eIK9R5wwAHxwQcffKdm+IGatXl9xQmwCfjyyy9jyJAh8eqrr8bDDz8cBx98cLXXddttt8UOO+wQhx56aOTl5cUTTzwRP/rRj6K0tDTOOuuscn1nz54dRx55ZIwcOTKGDx8ed999d5x88snRp0+f2GGHHWKfffaJc845J373u9/Fr371q+z5utU9b/fHP/5xtGnTJsaMGRMzZsyIO++8M5o0aRIvv/xytG/fPq688sqYMGFCXHvttdGjR4846aSTqv065ObmxrBhw+Liiy+Ol156KfslxhVXXBEXX3xxHH300XHqqafGp59+GjfffHPss88+8e9//zuaNGkSxxxzTNxyyy3x1FNPZb90iIhYvnx5PPHEE3HyySdHbm5utv3dd9+NYcOGxemnnx4//OEPo2vXrrF8+fLo379/fPTRR3H66adH+/bt4+WXX44LLrggPvnkk7jxxhsj4qtQMmzYsNh///2zM/Jvv/12TJs2LX7yk5+s15ifeOKJ6NixY+y9996VLt9nn32iY8eO8dRTT611PePGjYtTTjkldthhh7jggguiSZMm8e9//zueeeaZ7G3I1tdVV10V9erVi1/+8pcxe/bsuPnmm6NOnTqRk5MTn3/+eVx66aUxY8aMGDduXHTq1CkuueSSKtfVqlWrqFevXjzxxBPx4x//OJo1a1Zl3xUrVsS+++4bs2fPjrPPPjs6deoUDz30UJx88smxZMmSCq/x+PHjY9myZXH66adHJpOJa665Jn7wgx/Ef//736hTp856j3vkyJExbty4GDJkSJx66qlRXFwcL774YsyYMSN22WWXSp/z3//+Nx577LE46qijolOnTrFgwYK44447on///vHWW29F27Zty/W//PLLIz8/P84777xYtWrVes3avvzyyxERsfPOO1e6fOXKlbFo0aIK7V988cW3rvvNN9+Mgw8+OHbccce47LLLoqCgIGbPnh3Tpk2LiK/2I5dddllccsklcdppp2U/t3vssUdEfPU5HDFiROy6665x1VVXxYIFC+Kmm26KadOmZX9XIyKeeuqpOOaYY6Jnz55x1VVXxeeffx4jR46MrbfeutK6xo4dGytXrozTTjstCgoKolmzZlFUVBR/+MMfYtiwYfHDH/4wli1bFn/84x9j0KBB8corr0SvXr3KrePPf/5zrF69On784x/H4sWL45prromjjz469ttvv5gyZUqMGjUq+zk/77zz4u677y73/D59+kTEV3cZcDs/oFoSANbJ2LFjk4hIOnTokNSpUyd57LHHKu03fPjwpEOHDhXaR48enXxzt7t8+fIK/QYNGpR07ty5XFuHDh2SiEimTp2abVu4cGFSUFCQ/PznP8+2PfTQQ0lEJJMnT66w3ohIRo8eXaG9Q4cOyfDhwyuMc9CgQUlpaWm2vV+/fkkmk0nOOOOMbFtxcXHSrl27pH///hXW+039+/dPdthhhyqXP/roo0lEJDfddFOSJEny/vvvJ7m5uckVV1xRrt8bb7yR5OXlZdtLS0uTrbfeOjniiCPK9XvwwQcrvGZlr+MzzzxTru/ll1+eNGjQIPl//+//lWv/5S9/meTm5ibz5s1LkiRJfvKTnySFhYVJcXFxleOYPHlyle9BmSVLliQRkRx22GFV9kmSJDn00EOTiEiKioqSJPm/92bu3LnZ9TRq1Cjp27dvsmLFinLP/fp79833uEz//v3LvXdltffo0SNZvXp1tn3YsGFJJpNJhgwZUu75/fr1q/Sz/k2XXHJJEhFJgwYNkiFDhiRXXHFF8tprr1Xod+ONNyYRkdx3333ZttWrVyf9+vVLGjZsmH0d5s6dm0RE0rx582Tx4sXZvn/729+SiEieeOKJKsdY5pu/py+88EISEck555xToe/aXsuVK1cmJSUl5frPnTs3KSgoSC677LJsW9lr27lz5wq/9+vymUmSJLnooouSiEiWLVtWYVlEfOvPq6++mu3/zf3RDTfckERE8umnn1a5/VdffTWJiGTs2LHl2levXp20atUq6dGjR7nP4ZNPPplERHLJJZdk23r27Jm0a9eu3BimTJmS3beWKXuPCwsLk4ULF5bbXnFxcbJq1apybZ9//nnSunXr5JRTTqmwjpYtWyZLlizJtl9wwQVJRCQ77bRTsmbNmmz7sGHDkvz8/GTlypUVxp6fn5+ceeaZVb42AGvj8HKA9bRgwYKoW7dubLPNNhu8rq+fS7x06dJYtGhR9O/fP/773/9WOMy6e/fu5WZFW7ZsGV27do3//ve/G1xHZUaOHFnu8NO+fftGkiQxcuTIbFtubm7ssssuNVJDw4YNI+Krc+UjvrrIWGlpaRx99NGxaNGi7E+bNm1iu+22yx5Kmslk4qijjooJEyaUm9F74IEHYuutt4699tqr3HY6deoUgwYNKtf20EMPxd577x1NmzYtt62BAwdGSUlJTJ06NSIimjRpEl9++eUGX229bIyNGjVaa7+y5UVFRZUuf/bZZ2PZsmXxy1/+ssI5vhty7ulJJ51Ubqa47L0/5ZRTyvXr27dvfPjhh1FcXLzW9Y0ZMybGjx8fvXv3jokTJ8aFF14Yffr0iZ133jnefvvtbL8JEyZEmzZtyl0krE6dOnHOOefEF198EX//+9/LrfeYY46Jpk2bZh+X/X5U5/P417/+NTKZTIwePbrCsrW9lgUFBdlzsktKSuKzzz7LHpr9r3/9q0L/4cOHV/saAp999lnk5eVlf1e+6bDDDotnn322ws/555//resum4n+29/+tt63IvvnP/8ZCxcujB/96EflPodDhw6Nbt26ZY/W+Pjjj+ONN96Ik046qdwY+vfvHz179qx03UcccUSF0y9yc3OzRwiUlpbG4sWLo7i4OHbZZZdKX/OjjjoqGjdunH3ct2/fiIg44YQTyp3X3rdv31i9enWlh8SX7RsAqkPoBlhPd9xxR+Tn58fgwYPj3Xff3aB1TZs2LQYOHBgNGjSIJk2aRMuWLbPnUH4zdLdv377C85s2bRqff/75BtVQlW9ur+yP1m9+2dC4ceMaqaEsMJcFzffeey+SJIntttsuWrZsWe7n7bffLncBrmOOOSZWrFgRjz/+eHZdEyZMiKOOOqpCYOrUqVOFbb/33nvxzDPPVNhO2bmzZdv60Y9+FN/73vdiyJAh0a5duzjllFOqdcursjGWhe+qfFs4nzNnTkRE9OjRY71rWJv1ee9LS0srfFYrM2zYsHjxxRfj888/j0mTJsVxxx0X//73v+OQQw6JlStXRkTEBx98ENttt12FC4uVnSLxwQcfrLXOsgBenc/jnDlzom3btms9/L0ypaWlccMNN8R2220XBQUF0aJFi2jZsmXMmjWr0telss9fTWnXrl0MHDiwwk/37t2/9bnHHHNM7LnnnnHqqadG69at49hjj40HH3xwnQJ42fvStWvXCsu6deuWXV7232233bZCv8raIqp+ve65557Ycccdo27dutG8efNo2bJlPPXUU5W+5uvzeY6o/POTJImLqAHV5pxugPXUvXv3mDBhQuy///5xwAEHxLRp08r98VbVH2ZlF/MqM2fOnNh///2jW7ducf3118c222wT+fn5MWHChLjhhhsq/LH79fOSvy7ZgIuYVVbXt22vsvYNrSEi4j//+U9E/N8f36WlpZHJZOLpp5+udJtfnynbfffdo2PHjvHggw/GcccdF0888USsWLEijjnmmArPq2yWsbS0NA444ID4xS9+UWlt3/ve9yLiq/OTZ86cGRMnToynn346nn766Rg7dmycdNJJFS72tTaNGzeOrbbaKmbNmrXWfrNmzYqtt946CgsL13ndlVnbZ7Ky13Z93vuI9Xv/CwsL44ADDogDDjgg6tSpE/fcc0/84x//iP79+6/zOtannkwmU2l9VX3u19eVV14ZF198cZxyyilx+eWXR7NmzSInJyd++tOfVhpYN+RK+c2bN4/i4uJYtmzZtx4lsb7q1asXU6dOjcmTJ8dTTz0VzzzzTDzwwAOx3377xaRJk6p8rdNW2et13333xcknnxyHH354nH/++dGqVavIzc2Nq666KvtF1NfVxOd5yZIl0aJFi/WsHuArQjdANey2227x2GOPxdChQ+OAAw6IF198MXsIZNOmTWPJkiUVnvPNWbonnngiVq1aFY8//ni5mZhvXoF3faxtJqayulavXh2ffPJJtbdXU0pKSmL8+PFRv3797OHgXbp0iSRJolOnTtnQuzZHH3103HTTTVFUVBQPPPBAdOzYMXbfffd12n6XLl3iiy++WKerQufn58chhxwShxxySJSWlsaPfvSjuOOOO+Liiy+ucrauMgcffHDcdddd8dJLL1U4BD4i4sUXX4z3338/Tj/99LXWHfHVFxZr2/baPpO1eTuyXXbZJe65557sZ7BDhw4xa9asKC0tLTfb/c4772SXr6+mTZtWerj5N38fu3TpEhMnTozFixev12z3ww8/HAMGDIg//vGP5drTCGndunWLiK+uYr7jjjvW6Lojvro91v777x/7779/XH/99XHllVfGhRdeGJMnT46BAwdWuX8pe1/efffd2G+//cote/fdd7PLy/47e/bsCuuorK0qDz/8cHTu3DkeeeSRcjVVdmpATfjoo49i9erV1b4oJYDDywGqaf/994+//OUvMXv27Bg8eHD2vNsuXbrE0qVLy81ifvLJJ/Hoo4+We37ZLMvXZ1WWLl0aY8eOrXZNDRo0iIioNGB16dIle25ymTvvvLPGZvyqq6SkJM4555x4++2345xzzsnO6v7gBz+I3NzcGDNmTIWZpyRJ4rPPPivXdswxx8SqVavinnvuiWeeeSaOPvroda7h6KOPjunTp8fEiRMrLFuyZEn2nOVvbjMnJycbfr7t1lnfdP7550e9evXi9NNPr7DexYsXxxlnnBH169df6/m4Bx54YDRq1Ciuuuqq7CHaZb7+mnXp0iVmzJgRq1evzrY9+eST5W69lpbly5fH9OnTK1329NNPR8T/HZZ80EEHxfz58+OBBx7I9ikuLo6bb745GjZsWK3Z8C5dusQ777wTn376abbt9ddfz16Vu8wRRxwRSZLEmDFjKqxjbTP5ubm5FZY/9NBDlZ4XvKH69esXEbHWW5hVV2W3yiq7CnjZZ7uq/csuu+wSrVq1ittvv73c78HTTz8db7/9dvZuBG3bto0ePXrEvffeW+76C3//+9/jjTfeWOdaK9t3/uMf/6jyc7ahXnvttYj4vyu1A6wvM90AG+D73/9+3HXXXXHKKafEoYceGs8880wce+yxMWrUqPj+978f55xzTixfvjxuu+22+N73vlfuIj8HHnhgdtb09NNPjy+++CLuuuuuaNWqVbVnn3v16hW5ublx9dVXx9KlS6OgoCB7H/BTTz01zjjjjDjiiCPigAMOiNdffz0mTpy4UQ+ZXLp0adx3330R8VUYmz17djzyyCMxZ86cOPbYY+Pyyy/P9u3SpUv8+te/jgsuuCDef//9OPzww6NRo0Yxd+7cePTRR+O0006L8847L9t/5513jm233TYuvPDCWLVqVaWHllfl/PPPj8cffzwOPvjg7G3Yvvzyy3jjjTfi4Ycfjvfffz9atGgRp556aixevDj222+/aNeuXXzwwQdx8803R69evdZ7Fmy77baLe+65J44//vjo2bNnjBw5Mjp16hTvv/9+/PGPf4xFixbFX/7yl+xsdmUKCwvjhhtuiFNPPTV23XXXOO6446Jp06bx+uuvx/Lly7OHvJ966qnx8MMPx+DBg+Poo4+OOXPmxH333bfWddeU5cuXxx577BG77757DB48OLbZZptYsmRJPPbYY/Hiiy/G4Ycfnr0N02mnnRZ33HFHnHzyyfHaa69Fx44d4+GHH45p06bFjTfeWK1Dqk855ZS4/vrrY9CgQTFy5MhYuHBh3H777bHDDjuUu0DdgAED4sQTT4zf/e538d5778XgwYOjtLQ0XnzxxRgwYECcffbZla7/4IMPjssuuyxGjBgRe+yxR7zxxhvx5z//OZUjCDp37hw9evSI5557rsJF7TbUZZddFlOnTo2hQ4dGhw4dYuHChXHrrbdGu3btyh190qRJk7j99tujUaNG0aBBg+jbt2906tQprr766hgxYkT0798/hg0blr1lWMeOHeNnP/tZdjtXXnllHHbYYbHnnnvGiBEj4vPPP4/f//730aNHj3W6tVnEV6/5I488Et///vdj6NChMXfu3Lj99tuje/fu67yO9fHss89G+/bt3S4MqL6NfLV0gM1W2e2avn7bnTLXXXddEhHJwQcfnKxZsyaZNGlS0qNHjyQ/Pz/p2rVrct9991V6y7DHH3882XHHHZO6desmHTt2TK6++urk7rvvLndbqCT56jZFQ4cOrbDdym6HdNdddyWdO3dOcnNzy92GqKSkJBk1alTSokWLpH79+smgQYOS2bNnV3nLsG+Os6z+b95SaPjw4UmDBg2+9fXr379/udsXNWzYMNluu+2SE044IZk0aVKVz/vrX/+a7LXXXkmDBg2SBg0aJN26dUvOOuus5N13363Q98ILL0wiItl2220rXVdVr2OSJMmyZcuSCy64INl2222T/Pz8pEWLFskee+yRXHfdddnbZz388MPJgQcemLRq1SrJz89P2rdvn5x++unJJ598kl3Put7+qcysWbOSYcOGJVtttVVSp06dpE2bNsmwYcOSN954o0Lfb94yrMzjjz+e7LHHHtnXdrfddkv+8pe/lOvz29/+Ntl6662TgoKCZM8990z++c9/VnnLsIceeqjS7a7rZ+Lr1qxZk9x1113J4YcfnnTo0CEpKChI6tevn/Tu3Tu59tprK9z6acGCBcmIESOSFi1aJPn5+UnPnj0r3KKq7FZQ1157bYXtRSW3xrvvvvuSzp07J/n5+UmvXr2SiRMnVnprv+Li4uTaa69NunXrln0thwwZUu72ZpXdMuznP/95stVWWyX16tVL9txzz2T69Onr/Np+fdm6fGauv/76pGHDhhVuOxYRyVlnnVXpcyp7/765P3r++eeTww47LGnbtm2Sn5+ftG3bNhk2bFiF2+j97W9/S7p3757k5eVVuH3YAw88kPTu3TspKChImjVrlhx//PHJ//73vwr13H///Um3bt2SgoKCpEePHsnjjz+eHHHEEUm3bt2yfdb2HpeWliZXXnll9vPUu3fv5Mknn6zwnla1jvX5nJeUlCRbbbVVctFFF1X62gKsi0yS1MDVbwCAWrds2bLo0aNHvPbaay76tIFeeumlGDVqVIXD0Gvb0qVLo3PnznHNNdeUu33f5q5Xr17RsmXLDb4dX0177LHH4rjjjos5c+bEVlttVdvlAJsp53QDwBaiUaNGsfPOO2dvnUb17bXXXvH222/XyD3oa1Ljxo3jF7/4RVx77bXrfT/tTcGaNWsq3Nd9ypQp8frrr8e+++5bO0WtxdVXXx1nn322wA1sEOd0A8AW4LrrrotGjRrFjBkzYsCAAbVdzmbr008/jbvvvjsivppVTuMc4Q01atSoGDVqVG2XUS0fffRRDBw4ME444YRo27ZtvPPOO3H77bdHmzZt4owzzqjt8ipI6+JswHeL0A0AW4Ann3wypk+fHr17947jjjuutsvZbJWUlMTvfve7+Pzzz+OEE05I5dZc32VNmzaNPn36xB/+8If49NNPo0GDBjF06ND4zW9+E82bN6/t8gBS4ZxuAAAASIlzugEAACAlQjcAAACkxDndVSgtLY2PP/44GjVqFJlMprbLAQAAYBOSJEksW7Ys2rZtGzk5Vc9nC91V+Pjjj2Obbbap7TIAAADYhH344YfRrl27KpcL3VVo1KhRRHz1AhYWFtZyNQAAAGxKioqKYptttslmx6oI3VUoO6S8sLBQ6AYAAKBS33Y6sgupAQAAQEqEbgAAAEiJ0A0AAAApEboBAAAgJUI3AAAApEToBgAAgJQI3QAAAJASoRsAAABSInQDAAAb5NJLL41MJlPup1u3bhERsXjx4vjxj38cXbt2jXr16kX79u3jnHPOiaVLl1a6rs8++yzatWsXmUwmlixZshFHAenIq+0CAACAzd8OO+wQzz33XPZxXt5XUePjjz+Ojz/+OK677rro3r17fPDBB3HGGWfExx9/HA8//HCF9YwcOTJ23HHH+OijjzZa7ZAmoRsAANhgeXl50aZNmwrtPXr0iL/+9a/Zx126dIkrrrgiTjjhhCguLs6G84iI2267LZYsWRKXXHJJPP300xulbkibw8sBAIAN9t5770Xbtm2jc+fOcfzxx8e8efOq7Lt06dIoLCwsF7jfeuutuOyyy+Lee++NnBwxhS2HTzMAALBB+vbtG+PGjYtnnnkmbrvttpg7d27svffesWzZsgp9Fy1aFJdffnmcdtpp2bZVq1bFsGHD4tprr4327dtvzNIhdQ4vBwAANsiQIUOy/95xxx2jb9++0aFDh3jwwQdj5MiR2WVFRUUxdOjQ6N69e1x66aXZ9gsuuCC23377OOGEEzZm2bBRmOkGAABqVJMmTeJ73/tezJ49O9u2bNmyGDx4cDRq1CgeffTRqFOnTnbZCy+8EA899FDk5eVFXl5e7L///hER0aJFixg9evRGrx9qkpluAACgRn3xxRcxZ86cOPHEEyPiqxnuQYMGRUFBQTz++ONRt27dcv3/+te/xooVK7KPX3311TjllFPixRdfjC5dumzU2qGmCd0AAMAGOe+88+KQQw6JDh06xMcffxyjR4+O3NzcGDZsWBQVFcWBBx4Yy5cvj/vuuy+KioqiqKgoIiJatmwZubm5FYL1okWLIiJi++23jyZNmmzs4UCNEroBAIAN8r///S+GDRsWn332WbRs2TL22muvmDFjRrRs2TKmTJkS//jHPyIiYtttty33vLlz50bHjh1roWLYeDJJkiS1XcSmqKioKBo3bpy9nQEAAACUWdfM6EJqAAAAkBKhGwAAAFIidAMAAEBKhG4AAABIidANAAAAKRG6AQAAICVCNwAAAKRE6AYAAICUCN0AAACQEqEbAAAAUiJ0AwAAQEqEbtgMXXrppZHJZMr9dOvWLbt85cqVcdZZZ0Xz5s2jYcOGccQRR8SCBQvKrWPevHkxdOjQqF+/frRq1SrOP//8KC4u3thDAQCALVpebRcAVM8OO+wQzz33XPZxXt7//Tr/7Gc/i6eeeioeeuihaNy4cZx99tnxgx/8IKZNmxYRESUlJTF06NBo06ZNvPzyy/HJJ5/ESSedFHXq1Ikrr7xyo48FAAC2VEI3bKby8vKiTZs2FdqXLl0af/zjH2P8+PGx3377RUTE2LFjY/vtt48ZM2bE7rvvHpMmTYq33nornnvuuWjdunX06tUrLr/88hg1alRceumlkZ+fv7GHAwAAWySHl8Nm6r333ou2bdtG586d4/jjj4958+ZFRMRrr70Wa9asiYEDB2b7duvWLdq3bx/Tp0+PiIjp06dHz549o3Xr1tk+gwYNiqKionjzzTc37kAAAGALJnTDZqhv374xbty4eOaZZ+K2226LuXPnxt577x3Lli2L+fPnR35+fjRp0qTcc1q3bh3z58+PiIj58+eXC9xly8uWAQAANcPh5bAZGjJkSPbfO+64Y/Tt2zc6dOgQDz74YNSrV68WKwMAAL7OTDdsAZo0aRLf+973Yvbs2dGmTZtYvXp1LFmypFyfBQsWZM8Bb9OmTYWrmZc9ruw8cQAAoHqEbtgCfPHFFzFnzpzYaqutok+fPlGnTp14/vnns8vffffdmDdvXvTr1y8iIvr16xdvvPFGLFy4MNvn2WefjcLCwujevftGrx8AALZUDi+HzdB5550XhxxySHTo0CE+/vjjGD16dOTm5sawYcOicePGMXLkyDj33HOjWbNmUVhYGD/+8Y+jX79+sfvuu0dExIEHHhjdu3ePE088Ma655pqYP39+XHTRRXHWWWdFQUFBLY8OAAC2HEI3bIb+97//xbBhw+Kzzz6Lli1bxl577RUzZsyIli1bRkTEDTfcEDk5OXHEEUfEqlWrYtCgQXHrrbdmn5+bmxtPPvlknHnmmdGvX79o0KBBDB8+PC677LLaGhIAAGyRMkmSJLVdxKaoqKgoGjduHEuXLo3CwsLaLgcAAIBNyLpmRud0AwAAQEqEbgAAAEiJ0A0AAAApcSE1AABqTGbMmNouAdhCJKNH13YJNcJMNwAAAKRE6AYAAICUCN0AAACQEqEbAAAAUiJ0AwAAQEqEbgAAAEiJ0A0AAAApEboBAAAgJUI3AAAApEToBgAAgJQI3QAAAJASoRsAAABSInQDAABASoRuAAAASInQDQAAACkRugEAACAlQjcAAACkROgGAACAlAjdAAAAkBKhGwAAAFIidAMAAEBK8mq7ADZMZsyY2i4B2EIko0fXdgkAAFscM90AAACQEqEbAAAAUiJ0AwAAQEqEbgAAAEiJ0A0AAAApEboBAAAgJUI3AAAApEToBgAAgJQI3QAAAJASoRsAAABSInQDAABASoRuAAAASInQDQAAACkRugEAACAlQjcAAACkROgGAACAlAjdAAAAkBKhGwAAAFIidAMAAEBKhG4AAABIidANAAAAKRG6AQAAICVCNwAAAKRE6AYAAICUCN0AAACQEqEbAAAAUiJ0AwAAQEqEbgAAAEiJ0A0AAAApEboBAAAgJUI3AAAApEToBgAAgJQI3QAAAJASoRsAAABSInQDAABASoRuAAAASInQDQAAACkRugEAACAlQjcAAACkZJMO3b/5zW8ik8nET3/602zbvvvuG5lMptzPGWecUe558+bNi6FDh0b9+vWjVatWcf7550dxcfFGrh4AAIDvurzaLqAqr776atxxxx2x4447Vlj2wx/+MC677LLs4/r162f/XVJSEkOHDo02bdrEyy+/HJ988kmcdNJJUadOnbjyyis3Su0AAAAQsYnOdH/xxRdx/PHHx1133RVNmzatsLx+/frRpk2b7E9hYWF22aRJk+Ktt96K++67L3r16hVDhgyJyy+/PG655ZZYvXr1xhwGAAAA33Gb5Ez3WWedFUOHDo2BAwfGr3/96wrL//znP8d9990Xbdq0iUMOOSQuvvji7Gz39OnTo2fPntG6dets/0GDBsWZZ54Zb775ZvTu3bvSba5atSpWrVqVfVxUVBQREWvWrIk1a9ZEREROTk7k5uZGSUlJlJaWZvuWtRcXF0eSJNn23NzcyMnJqbK9bL1l8vK+eju+eSh8Ve116tSpdCwA1VXV/m1T2u+VlpZGSUlJti2TyUReXl6V7cZkTMa08ccEUBPK9nOb6n7vm/VUZZML3ffff3/861//ildffbXS5ccdd1x06NAh2rZtG7NmzYpRo0bFu+++G4888khERMyfP79c4I6I7OP58+dXud2rrroqxowZU6F90qRJ2UDfvn376N27d8yaNSvmzZuX7dO1a9fo1q1bvPLKK/Hpp59m23v16hUdOnSIqVOnxrJly7Lt/fr1i1atWsWkSZPKfRAGDBgQ9erViwkTJpSr4aCDDooVK1bE5MmTs215eXkxdOjQKscDUB3vvfdevPvuu9nHm+J+b9GiRTF9+vRse6NGjWK//faLDz/8MGbOnJltb9myZeyxxx7GZEzGVAtjAqgJZfuzTXW/984776zTODLJ1786rWUffvhh7LLLLvHss89mz+Xed999o1evXnHjjTdW+pwXXngh9t9//5g9e3Z06dIlTjvttPjggw9i4sSJ2T7Lly+PBg0axIQJE2LIkCGVrqeyme5tttkmFi1alD18fVP8hjpTyRcFANWRjB79nZ6ZMyZjMqaaGVO+a+gANWT1r34VEZvufm/JkiXRokWLWLp0ablTnr9pk5rpfu2112LhwoWx8847Z9tKSkpi6tSp8fvf/z5WrVoVubm55Z7Tt2/fiIhs6G7Tpk288sor5fosWLAgIiLatGlT5bYLCgqioKCgQnudOnUqHMadm5tboY6I/3tz17W9qsPD17cdoKZUtX/blPZ7OTk5kZNT8ZIkVbUbkzFVVeP6thvT+o8JYEN8c7+1qe331jWfbVIXUtt///3jjTfeiJkzZ2Z/dtlllzj++ONj5syZlQ627BCArbbaKiK+OvTgjTfeiIULF2b7PPvss1FYWBjdu3ffKOMAAACAiE1sprtRo0bRo0ePcm0NGjSI5s2bR48ePWLOnDkxfvz4OOigg6J58+Yxa9as+NnPfhb77LNP9nD0Aw88MLp37x4nnnhiXHPNNTF//vy46KKL4qyzzqp0JhsAAADSskmF7m+Tn58fzz33XNx4443x5ZdfxjbbbBNHHHFEXHTRRdk+ubm58eSTT8aZZ54Z/fr1iwYNGsTw4cPL3dcbAAAANoZNPnRPmTIl++9tttkm/v73v3/rczp06FDhCnYAAACwsW1S53QDAADAlkToBgAAgJQI3QAAAJASoRsAAABSInQDAABASoRuAAAASInQDQAAACkRugEAACAlQjcAAACkROgGAACAlAjdAAAAkBKhGwAAAFIidAMAAEBKhG4AAABIidANAAAAKRG6AQAAICVCNwAAAKRE6AYAAICUCN0AAACQEqEbAAAAUiJ0AwAAQEqEbgAAAEiJ0A0AAAApEboBAAAgJUI3AAAApEToBgAAgJQI3QAAAJASoRsAAABSInQDAABASoRuAAAASInQDQAAACkRugEAACAlQjcAAACkROgGAACAlAjdAAAAkBKhGwAAAFIidAMAAEBKhG4AAABIidANAAAAKRG6AQAAICVCNwAAAKRE6AYAAICUCN0AAACQEqEbAAAAUiJ0AwAAQEqEbgAAAEiJ0A0AAAApEboBAAAgJUI3AAAApEToBgAAgJQI3QAAAJASoRsAAABSInQDAABASoRuAAAASInQDQAAACkRugEAACAlQjcAAACkROgGAACAlAjdAAAAkBKhGwAAAFIidAMAAEBKhG4AAABIidANAAAAKRG6AQAAICVCNwAAAKRE6AYAAICUCN0AAACQEqEbAAAAUiJ0AwAAQEqEbgAAAEiJ0A0AAAApEboBAAAgJUI3AAAApEToBgAAgJQI3QAAAJASoRsAAABSInQDAABASoRuAAAASInQDQAAACkRugEAACAlQjcAAACkROgGAACAlAjdAAAAkBKhGwAAAFIidAMAAEBKhG4AAABIidANAAAAKRG6AQAAICVCNwAAAKRE6AYAAICUCN0AAACQEqEbAAAAUiJ0AwAAQEqEbgAAAEiJ0A0AAAApEboBAAAgJUI3AAAApEToBgAAgJQI3QAAAJASoRsAAABSInQDAABASoRuAAAASInQDQAAACkRugEAACAlQjcAAACkROgGAACAlAjdAAAAkBKhGwAAAFIidAMAAEBKhG4AAABIidANAAAAKal26J46dWrMmzdvrX0+/PDDmDp1anU3AQAAAJu1aofuAQMGxLhx49ba5957740BAwZUdxMAAACwWat26E6S5Fv7lJaWRiaTqe4mAAAAYLOW6jnd7733XjRu3DjNTQAAAMAmK299Op9yyinlHj/22GPx/vvvV+hXUlKSPZ97yJAhG1QgAAAAbK7WK3R//RzuTCYTM2fOjJkzZ1baN5PJxK677ho33HDDhtQHAAAAm631Ct1z586NiK/O5+7cuXP89Kc/jZ/85CcV+uXm5kbTpk2jQYMGNVMlAAAAbIbWK3R36NAh+++xY8dG7969y7UBAAAA/2e9QvfXDR8+vCbrAAAAgC1OtUN3mVdeeSVeffXVWLJkSZSUlFRYnslk4uKLL97QzQAAAMBmp9qhe/HixXH44YfHtGnT1nrPbqEbAACA76pqh+5zzz03Xnrppdh3331j+PDh0a5du8jL2+CJcwAAANhiVDslP/nkk7HbbrvF888/H5lMpsYKuu222+K2227L3v97hx12iEsuuSR7v++VK1fGz3/+87j//vtj1apVMWjQoLj11lujdevW2XXMmzcvzjzzzJg8eXI0bNgwhg8fHldddZUvBQAAANiocqr7xBUrVsQ+++xTo4E7IqJdu3bxm9/8Jl577bX45z//Gfvtt18cdthh8eabb0ZExM9+9rN44okn4qGHHoq///3v8fHHH8cPfvCD7PNLSkpi6NChsXr16nj55ZfjnnvuiXHjxsUll1xSo3UCAADAt6n21G+vXr2ys9E16ZBDDin3+IorrojbbrstZsyYEe3atYs//vGPMX78+Nhvv/0i4qtbl22//fYxY8aM2H333WPSpEnx1ltvxXPPPRetW7eOXr16xeWXXx6jRo2KSy+9NPLz82u8ZgAAAKhMtUP36NGj49BDD82G3TSUlJTEQw89FF9++WX069cvXnvttVizZk0MHDgw26dbt27Rvn37mD59euy+++4xffr06NmzZ7nDzQcNGhRnnnlmvPnmm9G7d+9Kt7Vq1apYtWpV9nFRUVFERKxZsybWrFkTERE5OTmRm5sbJSUlUVpamu1b1l5cXFzuonK5ubmRk5NTZXvZesuUHf5eXFy8Tu116tSp6qUDqJaq9m+b0n6vtLS03N0yMplM5OXlVdluTMZkTBt/TAA1oWw/t6nu975ZT1WqHbrnz58fQ4cOjf79+8fxxx8fO++8cxQWFlba96STTlqvdb/xxhvRr1+/WLlyZTRs2DAeffTR6N69e8ycOTPy8/OjSZMm5fq3bt065s+fn63r64G7bHnZsqpcddVVMWbMmArtkyZNivr160dERPv27aN3794xa9asmDdvXrZP165do1u3bvHKK6/Ep59+mm3v1atXdOjQIaZOnRrLli3Ltvfr1y9atWoVkyZNKvdBGDBgQNSrVy8mTJhQroaDDjooVqxYEZMnT8625eXlxdChQ6scD0B1vPfee/Huu+9mH2+K+71FixbF9OnTs+2NGjWK/fbbLz788MOYOXNmtr1ly5axxx57GJMxGVMtjAmgJpTtzzbV/d4777yzTuPIJGu739da5OTkRCaTKffN6zfP706SJDKZTKX3716b1atXx7x582Lp0qXx8MMPxx/+8If4+9//HjNnzowRI0aUm5GOiNhtt91iwIABcfXVV8dpp50WH3zwQUycODG7fPny5dGgQYOYMGFC9oJs31TZTPc222wTixYtyn6ZsCl+Q52p5IsCgOpIRo/+Ts/MGZMxGVPNjCn/yisDoCas/tWvImLT3e8tWbIkWrRoEUuXLq1yAjpiA2a6x44dW92nfqv8/PzYdtttIyKiT58+8eqrr8ZNN90UxxxzTKxevTqWLFlSbrZ7wYIF0aZNm4iIaNOmTbzyyivl1rdgwYLssqoUFBREQUFBhfY6depUOIw7Nzc3cnNzK/St6uroVbVXdXj4+rYD1JSq9m+b0n4vJycncnIqXge0qnZjMqaqalzfdmNa/zEBbIhv7rc2tf3euuazaofu4cOHV/ep6620tDRWrVoVffr0iTp16sTzzz8fRxxxREREvPvuuzFv3rzo169fRHx16MEVV1wRCxcujFatWkVExLPPPhuFhYXRvXv3jVYzAAAAbHI3rr7gggtiyJAh0b59+1i2bFmMHz8+pkyZEhMnTozGjRvHyJEj49xzz41mzZpFYWFh/PjHP45+/fplL+Z24IEHRvfu3ePEE0+Ma665JubPnx8XXXRRnHXWWZXOZAMAAEBaqh261+diGe3bt1/nvgsXLoyTTjopPvnkk2jcuHHsuOOOMXHixDjggAMiIuKGG26InJycOOKII2LVqlUxaNCguPXWW7PPz83NjSeffDLOPPPM6NevXzRo0CCGDx8el1122boPDgAAAGpAtUN3x44dK1w4rTKZTKbCCexr88c//nGty+vWrRu33HJL3HLLLVX26dChQ4Ur2AEAAMDGVu3QfdJJJ1UaupcuXRqvv/56zJ07N/r37x8dO3bckPoAAABgs1Xt0D1u3LgqlyVJEr/97W/jmmuu+daZawAAANhSVbwmeg3IZDJx3nnnxQ477BDnn39+GpsAAACATV4qobvMLrvsEi+88EKamwAAAIBNVqqhe86cOet1ETUAAADYktT4fbpLS0vjo48+inHjxsXf/va32H///Wt6EwAAALBZqHbozsnJWestw5IkiaZNm8Zvf/vb6m4CAAAANmvVDt377LNPpaE7JycnmjZtGrvuumuMGDEiWrVqtUEFAgAAwOaq2qF7ypQpNVgGAAAAbHlSvZAaAAAAfJfVyIXUpk2bFjNnzoyioqIoLCyMXr16xZ577lkTqwYAAIDN1gaF7pdffjlGjBgRs2fPjoivLp5Wdp73dtttF2PHjo1+/fpteJUAAACwGap26H7zzTfjwAMPjOXLl8cBBxwQAwYMiK222irmz58fkydPjkmTJsWgQYNixowZ0b1795qsGQAAADYL1Q7dl112WaxevTomTJgQgwcPLrds1KhR8cwzz8Shhx4al112Wdx///0bXCgAAABsbqp9IbUpU6bEkUceWSFwlxk8eHAceeSRMXny5GoXBwAAAJuzaofupUuXRqdOndbap1OnTrF06dLqbgIAAAA2a9UO3W3bto0ZM2astc8//vGPaNu2bXU3AQAAAJu1aofuQw89NKZMmRIXX3xxrFy5styylStXxujRo2Py5Mlx2GGHbXCRAAAAsDmq9oXULr744njyySfjyiuvjDvuuCN22223aN26dSxYsCBeffXV+PTTT6Nz585x8cUX12S9AAAAsNmoduhu3rx5zJgxI37xi1/E/fffHxMmTMguq1u3bowYMSKuvvrqaNasWY0UCgAAAJubaofuiIgWLVrE3XffHXfccUe88847UVRUFIWFhdGtW7eoU6dOTdUIAAAAm6X1Dt1XXHFFfPnllzFmzJhssK5Tp0707Nkz22f16tVx4YUXRqNGjeKXv/xlzVULAAAAm5H1upDac889F5dcckk0b958rTPZ+fn50bx587jwwgvdpxsAAIDvrPUK3ffee280bdo0zj777G/te9ZZZ0WzZs1i7Nix1S4OAAAANmfrFbpffvnlGDhwYBQUFHxr34KCghg4cGBMmzat2sUBAADA5my9QvfHH38cnTt3Xuf+nTp1ik8++WS9iwIAAIAtwXqF7pycnFizZs0691+zZk3k5KzXJgAAAGCLsV6JuG3btvGf//xnnfv/5z//ia233nq9iwIAAIAtwXqF7r333jteeOGFeP/997+17/vvvx8vvPBC7LPPPtWtDQAAADZr6xW6zzrrrFizZk0ceeSRsWjRoir7ffbZZ3HUUUdFcXFxnHnmmRtcJAAAAGyO8tan88477xw//elP48Ybb4zu3bvHGWecEQMGDIh27dpFRMRHH30Uzz//fNx5553x6aefxrnnnhs777xzKoUDAADApm69QndExG9/+9uoW7duXHvttXHFFVfEFVdcUW55kiSRm5sbF1xwQfz617+usUIBAABgc7PeoTuTycSVV14ZI0eOjLFjx8bLL78c8+fPj4iINm3axJ577hknn3xydOnSpcaLBQAAgM3JeofuMl26dDGTDQAAAGvhJtoAAACQEqEbAAAAUiJ0AwAAQEqEbgAAAEiJ0A0AAAApEboBAAAgJUI3AAAApEToBgAAgJQI3QAAAJASoRsAAABSInQDAABASoRuAAAASInQDQAAACkRugEAACAlQjcAAACkROgGAACAlAjdAAAAkBKhGwAAAFIidAMAAEBKhG4AAABIidANAAAAKRG6AQAAICVCNwAAAKRE6AYAAICUCN0AAACQEqEbAAAAUiJ0AwAAQEqEbgAAAEiJ0A0AAAApEboBAAAgJUI3AAAApEToBgAAgJQI3QAAAJASoRsAAABSInQDAABASoRuAAAASInQDQAAACkRugEAACAlQjcAAACkROgGAACAlAjdAAAAkBKhGwAAAFIidAMAAEBKhG4AAABIidANAAAAKRG6AQAAICVCNwAAAKRE6AYAAICUCN0AAACQEqEbAAAAUiJ0AwAAQEqEbgAAAEiJ0A0AAAApEboBAAAgJUI3AAAApEToBgAAgJQI3QAAAJASoRsAAABSInQDAABASoRuAAAASInQDQAAACkRugEAACAlQjcAAACkROgGAACAlAjdAAAAkBKhGwAAAFIidAMAAEBKhG4AAABIidANAAAAKRG6AQAAICVCNwAAAKRE6AYAAICUCN0AAACQEqEbAAAAUiJ0AwAAQEqEbgAAAEiJ0A0AAAApEboBAAAgJUI3AAAApEToBgAAgJQI3QAAAJASoRsAAABSInQDAABASoRuAAAASInQDQAAACkRugEAACAlQjcAAACkROgGAACAlGxyoXvq1KlxyCGHRNu2bSOTycRjjz1WbvnJJ58cmUym3M/gwYPL9Vm8eHEcf/zxUVhYGE2aNImRI0fGF198sRFHAQAAAJtg6P7yyy9jp512iltuuaXKPoMHD45PPvkk+/OXv/yl3PLjjz8+3nzzzXj22WfjySefjKlTp8Zpp52WdukAAABQTl5tF/BNQ4YMiSFDhqy1T0FBQbRp06bSZW+//XY888wz8eqrr8Yuu+wSERE333xzHHTQQXHddddF27Zta7xmAAAAqMwmN9O9LqZMmRKtWrWKrl27xplnnhmfffZZdtn06dOjSZMm2cAdETFw4MDIycmJf/zjH7VRLgAAAN9Rm9xM97cZPHhw/OAHP4hOnTrFnDlz4le/+lUMGTIkpk+fHrm5uTF//vxo1apVuefk5eVFs2bNYv78+VWud9WqVbFq1ars46KiooiIWLNmTaxZsyYiInJyciI3NzdKSkqitLQ027esvbi4OJIkybbn5uZGTk5Ole1l6/16nRERxcXF69Rep06dKscDUB1V7d82pf1eaWlplJSUZNsymUzk5eVV2W5MxmRMG39MADWhbD+3qe73vllPVTa70H3sscdm/92zZ8/Ycccdo0uXLjFlypTYf//9q73eq666KsaMGVOhfdKkSVG/fv2IiGjfvn307t07Zs2aFfPmzcv26dq1a3Tr1i1eeeWV+PTTT7PtvXr1ig4dOsTUqVNj2bJl2fZ+/fpFq1atYtKkSeU+CAMGDIh69erFhAkTytVw0EEHxYoVK2Ly5MnZtry8vBg6dGi1xwtQmffeey/efffd7ONNcb+3aNGimD59era9UaNGsd9++8WHH34YM2fOzLa3bNky9thjD2MyJmOqhTEB1ISy/dmmut9755131mkcmeTrX51uYjKZTDz66KNx+OGHr7Vfy5Yt49e//nWcfvrpcffdd8fPf/7z+Pzzz7PLi4uLo27duvHQQw/F97///UrXUdlM9zbbbBOLFi2KwsLCiNg0v6HOVPJFAUB1JKNHf6dn5ozJmIypZsaUf+WVAVATVv/qVxGx6e73lixZEi1atIilS5dmM2NlNruZ7m/63//+F5999llstdVWEfHVtyBLliyJ1157Lfr06RMRES+88EKUlpZG3759q1xPQUFBFBQUVGivU6dOhcO4c3NzIzc3t0Lfsjd3XdurOjx8fdsBakpV+7dNab+Xk5MTOTkVL0lSVbsxGVNVNa5vuzGt/5gANsQ391ub2n5vXfPZJhe6v/jii5g9e3b28dy5c2PmzJnRrFmzaNasWYwZMyaOOOKIaNOmTcyZMyd+8YtfxLbbbhuDBg2KiIjtt98+Bg8eHD/84Q/j9ttvjzVr1sTZZ58dxx57rCuXAwAAsFFtclcv/+c//xm9e/eO3r17R0TEueeeG717945LLrkkcnNzY9asWXHooYfG9773vRg5cmT06dMnXnzxxXKz1H/+85+jW7dusf/++8dBBx0Ue+21V9x55521NSQAAAC+oza5me5999031naa+cSJE791Hc2aNYvx48fXZFkAAACw3ja5mW4AAADYUgjdAAAAkBKhGwAAAFIidAMAAEBKhG4AAABIidANAAAAKRG6AQAAICVCNwAAAKRE6AYAAICUCN0AAACQEqEbAAAAUiJ0AwAAQEqEbgAAAEiJ0A0AAAApEboBAAAgJUI3AAAApEToBgAAgJQI3QAAAJASoRsAAABSInQDAABASoRuAAAASInQDQAAACkRugEAACAlQjcAAACkROgGAACAlAjdAAAAkBKhGwAAAFIidAMAAEBKhG4AAABIidANAAAAKRG6AQAAICVCNwAAAKRE6AYAAICUCN0AAACQEqEbAAAAUiJ0AwAAQEqEbgAAAEiJ0A0AAAApEboBAAAgJUI3AAAApEToBgAAgJQI3QAAAJASoRsAAABSInQDAABASoRuAAAASInQDQAAACkRugEAACAlQjcAAACkROgGAACAlAjdAAAAkBKhGwAAAFIidAMAAEBKhG4AAABIidANAAAAKRG6AQAAICVCNwAAAKRE6AYAAICUCN0AAACQEqEbAAAAUiJ0AwAAQEqEbgAAAEiJ0A0AAAApEboBAAAgJUI3AAAApEToBgAAgJQI3QAAAJASoRsAAABSInQDAABASoRuAAAASInQDQAAACkRugEAACAlQjcAAACkROgGAACAlAjdAAAAkBKhGwAAAFIidAMAAEBKhG4AAABIidANAAAAKRG6AQAAICVCNwAAAKRE6AYAAICUCN0AAACQEqEbAAAAUiJ0AwAAQEqEbgAAAEiJ0A0AAAApEboBAAAgJUI3AAAApEToBgAAgJQI3QAAAJASoRsAAABSInQDAABASoRuAAAASInQDQAAACkRugEAACAlQjcAAACkROgGAACAlAjdAAAAkBKhGwAAAFIidAMAAEBKhG4AAABIidANAAAAKRG6AQAAICVCNwAAAKRE6AYAAICUCN0AAACQEqEbAAAAUiJ0AwAAQEqEbgAAAEiJ0A0AAAApEboBAAAgJUI3AAAApEToBgAAgJQI3QAAAJASoRsAAABSInQDAABASoRuAAAASInQDQAAACkRugEAACAlQjcAAACkROgGAACAlAjdAAAAkBKhGwAAAFKyRYfuW265JTp27Bh169aNvn37xiuvvFLbJQEAAPAdssWG7gceeCDOPffcGD16dPzrX/+KnXbaKQYNGhQLFy6s7dIAAAD4jthiQ/f1118fP/zhD2PEiBHRvXv3uP3226N+/fpx991313ZpAAAAfEdskaF79erV8dprr8XAgQOzbTk5OTFw4MCYPn16LVYGAADAd0lebReQhkWLFkVJSUm0bt26XHvr1q3jnXfeqfQ5q1atilWrVmUfL126NCIiFi9eHGvWrImIr4J7bm5ulJSURGlpabZvWXtxcXEkSZJtz83NjZycnCrby9ZbJi/vq7ejuLh4ndrr1KkTsXLlWl4JgHVXVFRU5f5tU9rvlZaWRklJSbYtk8lEXl5ele3GZEzGtJHH5G8ToIZ89tlnEbHp7vfKMuPX99GV2SJDd3VcddVVMWbMmArtnTp1qoVqADa+xr/5TW2XAACQ1WIz+dtk2bJl0bhx4yqXb5Ghu0WLFpGbmxsLFiwo175gwYJo06ZNpc+54IIL4txzz80+Li0tjcWLF0fz5s0jk8mkWi+kqaioKLbZZpv48MMPo7CwsLbLAQC+4/xtwpYiSZJYtmxZtG3bdq39tsjQnZ+fH3369Innn38+Dj/88Ij4KkQ///zzcfbZZ1f6nIKCgigoKCjX1qRJk5QrhY2nsLDQ/9gAgE2Gv03YEqxthrvMFhm6IyLOPffcGD58eOyyyy6x2267xY033hhffvlljBgxorZLAwAA4Dtiiw3dxxxzTHz66adxySWXxPz586NXr17xzDPPVLi4GgAAAKRliw3dERFnn312lYeTw3dFQUFBjB49usLpEwAAtcHfJnzXZJJvu745AAAAUC05tV0AAAAAbKmEbgAAAEiJ0A0AAAApEboBAAAgJUI3AAAApEToBgAAgJRs0ffpBr6yYMGCmDt3buTn50dERIcOHaJ58+a1XBUAAGz5hG7Ywt11110xduzY+Ne//hV5eXnRvXv36NatW+y5554xdOjQaNeuXZSWlkZOjgNfAACgpmWSJElquwggHZ999llst912cdZZZ8UPf/jDKCoqigkTJsTzzz8fs2fPjp49e8YNN9wQnTp1iiRJIpPJ1HbJAMAWrri4OBYvXhytWrWq7VJgoxC6YQv2u9/9LsaPHx8zZsyosGzy5MkxatSo+PLLL2PatGnRpEmTjV8gAPCdc+ONN8aYMWPihBNOiKOPPjr69OkT9evXL9enqKgopk2bFgMHDow6derUUqVQMxxPCluwOnXqxBdffBHvvPNORESsXLkyVq9eHRERAwYMiHvvvTeKi4vj2Wefrc0yAYDvkL/85S/RvXv3+Mc//hH77rtv9OnTJy699NL4z3/+EyUlJRER8ec//znGjBkjcLNFELphC3bUUUdFTk5O3HzzzbFy5cqoW7du5OfnR2lpaUREdOvWLZo3bx4ffPBBLVcKAHwXfPrpp5Gfnx9nnnlmvPLKK/Gf//wnvv/978e4ceOiV69e0b9//7j99tvj1ltvjb59+9Z2uVAjHF4OW6jS0tLIZDLx6KOPxk9+8pMoKiqKY445Js4888zo3bt3fPLJJzFlypQ47bTT4o033oiOHTvWdskAwBbuk08+ifvvvz922GGHOPDAA7PtJSUl8fLLL8fdd98djz76aBQVFcW8efOiXbt2tVgt1AyhG7Zwq1atijlz5sTf//73+Nvf/hYvvfRSZDKZ2HrrrWPNmjVx/PHHx2WXXVbbZQIA3xErVqyIiIh69epVeiHX8847L1544YX417/+VRvlQY1zyzDYAi1atCgeeOCBuPbaa6N58+bRrFmzaNq0aQwcODDOP//8WL58efz3v/+NIUOGxHbbbVfb5QIA3yH16tXL/vubgXvlypXx5JNPxogRIzZ2WZAaM92wBTrllFPi9ddfjyFDhkTDhg3js88+i9mzZ8dHH30UHTp0iDFjxkT37t1ru0wA4DtkxYoV5QJ3VX0efPDBGDZsWOTn52+kyiBdQjdsYZIkiYYNG8aECROif//+2bbZs2fHiy++GH/4wx9i8eLF8fDDD0ePHj1quVoA4Lvi5z//eey5557Rp0+faNOmTRQUFFTos2TJErcxZYvj6uWwhXnrrbeic+fO0aBBg2xbJpOJ7bbbLk455ZR4/vnno6CgIB5++OFarBIA+C4ZP3583HDDDXHsscfGgAED4oILLojJkyfHwoULo7i4OCIivvzyyzjppJPiP//5Ty1XCzXLTDdsYVasWBEHH3xwFBcXx7hx46Jjx44Vzpe6/vrrY/z48fHPf/6zlqoEAL5LTj311MjPz4/zzjsv/vKXv8Qf/vCH+OCDD6J3795x1FFHxaBBg2LmzJlx2mmnxZo1a2q7XKhRZrphC1OvXr349a9/HUVFRXHiiSfG+PHj45NPPsleKXTVqlUxY8aM6Nq1ay1XCgB8FxQXF0fnzp2jSZMm0blz57jwwgtj7ty5MXPmzNhll13iN7/5Teyzzz5x+umnx4knnljb5UKNM9MNW6g33ngjLr/88njiiSeiYcOGsddee0WbNm1i4sSJ0aJFi/jDH/4QO+64Y22XCQB8ByxZsiQWLFgQXbt2jdWrV0edOnXKHYn35z//OU488cT497//HTvttFMtVgo1T+iGLdzChQvjySefjMceeyzq1asXPXr0iCOPPDK233772i4NAPgOKy0tjSRJIjc3N+666674yU9+EsuXL6/tsqDGCd3wHVJaWho5Oc4qAQA2Lddff32UlJTE+eefX9ulQI0TugEAgFq1Zs2ayM3NNTnAFknoBgAAgJT4KgkAAABSInQDAABASoRuAAAASInQDQAAACkRugEAACAlQjcAAACkROgGAACAlAjdAAAAkBKhGwAAAFLy/wFNHpPcc8zSZQAAAABJRU5ErkJggg==\n"
     },
     "metadata": {}
    }
   ]
  },
  {
   "cell_type": "code",
   "source": "from google.colab import drive\ndrive.mount('/content/drive')",
   "metadata": {
    "id": "Ijqptf_zEy22"
   },
   "execution_count": null,
   "outputs": []
  }
 ]
}