{
 "nbformat": 4,
 "nbformat_minor": 5,
 "metadata": {
  "kernelspec": {
   "display_name": "Python 3",
   "language": "python",
   "name": "python3"
  },
  "language_info": {
   "name": "python"
  },
  "colab": {
   "provenance": []
  }
 },
 "cells": [
  {
   "cell_type": "markdown",
   "metadata": {
    "id": "AlKF82rC3IKj"
   },
   "source": "# Quantum Problem Solver – Gemini Destekli İnteraktif Pipeline\n\nBu notebook ile:\n1. Problemini **doğal dilde** yazarsın\n2. **Gemini** problemi analiz eder, veri tipini ve yaklaşımı önerir\n3. Adım adım interaktif olarak quantum encoding + cihaz seçimi yaparsın\n\n---",
   "id": "AlKF82rC3IKj"
  },
  {
   "cell_type": "markdown",
   "metadata": {
    "id": "6v0buiPn3IKq"
   },
   "source": "## 0. Kurulum",
   "id": "6v0buiPn3IKq"
  },
  {
   "cell_type": "code",
   "metadata": {
    "colab": {
     "base_uri": "https://localhost:8080/"
    },
    "id": "joCYtBjy3IKq",
    "executionInfo": {
     "status": "ok",
     "timestamp": 1788784712225,
     "user_tz": -180,
     "elapsed": 14364,
     "user": {
      "displayName": "Joseph Volkan ÖZCAN",
      "userId": "11389530967736397480"
     }
    },
    "outputId": "9e668aa2-ff56-4c6a-adea-f049e99eb3a0"
   },
   "source": "# Temel paketler\n!pip install -q qiskit qiskit-aer pillow opencv-python-headless google-genai\n\nimport sys\nprint(\"Python:\", sys.version.split()[0])\n\nimport numpy as np\nfrom sklearn.preprocessing import MinMaxScaler\nfrom sklearn.decomposition import PCA\nimport qiskit\nfrom qiskit import QuantumCircuit\nfrom qiskit.circuit.library import ZFeatureMap, ZZFeatureMap\nfrom qiskit.quantum_info import Statevector\n\nprint(f\"Qiskit : {qiskit.__version__}\")\nprint(\"Kurulum tamam!\")",
   "outputs": [
    {
     "output_type": "stream",
     "name": "stdout",
     "text": [
      "\u001b[2K   \u001b[90m━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\u001b[0m \u001b[32m9.8/9.8 MB\u001b[0m \u001b[31m54.3 MB/s\u001b[0m eta \u001b[36m0:00:00\u001b[0m\n",
      "\u001b[2K   \u001b[90m━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\u001b[0m \u001b[32m12.4/12.4 MB\u001b[0m \u001b[31m73.0 MB/s\u001b[0m eta \u001b[36m0:00:00\u001b[0m\n",
      "\u001b[2K   \u001b[90m━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\u001b[0m \u001b[32m2.4/2.4 MB\u001b[0m \u001b[31m66.9 MB/s\u001b[0m eta \u001b[36m0:00:00\u001b[0m\n",
      "\u001b[2K   \u001b[90m━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\u001b[0m \u001b[32m54.9/54.9 kB\u001b[0m \u001b[31m2.8 MB/s\u001b[0m eta \u001b[36m0:00:00\u001b[0m\n",
      "\u001b[?25hPython: 3.13.15\n",
      "Qiskit : 2.5.2\n",
      "Kurulum tamam!\n"
     ]
    }
   ],
   "execution_count": 1,
   "id": "joCYtBjy3IKq"
  },
  {
   "cell_type": "markdown",
   "metadata": {
    "id": "l5B4pJyJ3IKt"
   },
   "source": "## 1. Gemini API Ayarları\n\n1. [Google AI Studio](https://aistudio.google.com/apikey) adresinden API key al\n2. Colab sol menüdeki **🔑 Secrets** ikonuna tıkla\n3. `GEMINI_API_KEY` adında bir secret oluştur ve key’ini yapıştır\n4. Aşağıdaki hücreyi çalıştır",
   "id": "l5B4pJyJ3IKt"
  },
  {
   "cell_type": "code",
   "metadata": {
    "colab": {
     "base_uri": "https://localhost:8080/"
    },
    "id": "YSWCPhl03IKt",
    "executionInfo": {
     "status": "ok",
     "timestamp": 1788784850982,
     "user_tz": -180,
     "elapsed": 885,
     "user": {
      "displayName": "Joseph Volkan ÖZCAN",
      "userId": "11389530967736397480"
     }
    },
    "outputId": "19613869-bd75-4a70-b081-111510fa9f1b"
   },
   "source": "from google.colab import userdata\nfrom google import genai\nfrom IPython.display import display, Markdown\n\n# API Key'i Secrets'tan al\ntry:\n    API_KEY = userdata.get(\"GEMINI_API_KEY\")\n    client = genai.Client(api_key=API_KEY)\n    print(\"✅ Gemini bağlantısı başarılı!\")\nexcept Exception as e:\n    print(\"❌ GEMINI_API_KEY bulunamadı.\")\n    print(\"Sol menüdeki 🔑 Secrets kısmına GEMINI_API_KEY ekle.\")\n    print(\"Hata:\", e)\n    client = None",
   "outputs": [
    {
     "output_type": "stream",
     "name": "stdout",
     "text": [
      "✅ Gemini bağlantısı başarılı!\n"
     ]
    }
   ],
   "execution_count": 4,
   "id": "YSWCPhl03IKt"
  },
  {
   "cell_type": "markdown",
   "metadata": {
    "id": "U-YZhKtc3IKu"
   },
   "source": "## 2. Quantum Pipeline Motoru",
   "id": "U-YZhKtc3IKu"
  },
  {
   "cell_type": "code",
   "metadata": {
    "colab": {
     "base_uri": "https://localhost:8080/"
    },
    "id": "Pa9kjN_e3IKu",
    "executionInfo": {
     "status": "ok",
     "timestamp": 1788784856199,
     "user_tz": -180,
     "elapsed": 41,
     "user": {
      "displayName": "Joseph Volkan ÖZCAN",
      "userId": "11389530967736397480"
     }
    },
    "outputId": "f0a7acfa-63ef-4cab-ea14-992846479f7d"
   },
   "source": "from typing import Optional, Dict, Any\nfrom pathlib import Path\n\nDEVICE_CATALOG = {\n    \"simulator\": {\"name\": \"Aer Simulator\", \"max_qubits\": 32, \"type\": \"simulator\", \"paradigm\": \"gate\"},\n    \"ibm_brisbane\": {\"name\": \"IBM Brisbane\", \"max_qubits\": 127, \"type\": \"superconducting\", \"paradigm\": \"gate\"},\n    \"wukong\": {\"name\": \"Origin Wukong-180\", \"max_qubits\": 180, \"type\": \"superconducting\", \"paradigm\": \"gate\"},\n    \"ionq_aria\": {\"name\": \"IonQ Aria\", \"max_qubits\": 25, \"type\": \"trapped-ion\", \"paradigm\": \"gate\"},\n    \"quera_aquila\": {\"name\": \"QuEra Aquila\", \"max_qubits\": 256, \"type\": \"cold-atom\", \"paradigm\": \"analog\"},\n    \"quera_gemini\": {\"name\": \"QuEra Gemini\", \"max_qubits\": 260, \"type\": \"cold-atom\", \"paradigm\": \"gate\"},\n    \"xanadu_aurora\": {\"name\": \"Xanadu Aurora\", \"max_qubits\": 35, \"type\": \"photonic\", \"paradigm\": \"continuous-variable\"},\n    \"quandela_belenos\": {\"name\": \"Quandela Belenos\", \"max_qubits\": 12, \"type\": \"photonic\", \"paradigm\": \"gate\"},\n    \"dwave_advantage2\": {\"name\": \"D-Wave Advantage2\", \"max_qubits\": 4400, \"type\": \"adiabatic\", \"paradigm\": \"annealing\"},\n}\n\nclass QuantumAppPipeline:\n    def __init__(self, seed=42):\n        np.random.seed(seed)\n        self.data_type = None\n        self.processed_data = None\n        self.device_key = None\n        self.device_info = None\n        self.max_qubits = 10\n        self.recommended_qubits = 0\n        self.encoding_type = None\n        self.circuit = None\n        self.pca = None\n\n    def select_data_type(self, data_type: str):\n        data_type = data_type.lower().strip()\n        if data_type not in {\"csv\", \"image\", \"video\", \"geospatial\"}:\n            raise ValueError(\"csv | image | video | geospatial\")\n        self.data_type = data_type\n        print(f\"[Pipeline] Veri tipi: {data_type}\")\n        return self\n\n    def load_data(self, source, **kwargs):\n        if self.data_type == \"csv\":\n            import pandas as pd\n            df = pd.read_csv(source) if isinstance(source, (str, Path)) else pd.DataFrame(source)\n            self.processed_data = df.select_dtypes(include=[np.number]).values.astype(np.float64)\n        elif self.data_type == \"image\":\n            from PIL import Image\n            img = Image.open(source) if isinstance(source, (str, Path)) else source\n            resize = kwargs.get(\"resize\", (32, 32))\n            img = img.convert(\"L\").resize(resize)\n            self.processed_data = (np.array(img, dtype=np.float64) / 255.0).flatten().reshape(1, -1)\n        elif self.data_type == \"video\":\n            import cv2\n            cap = cv2.VideoCapture(str(source))\n            frames = []\n            for _ in range(kwargs.get(\"max_frames\", 6)):\n                ret, frame = cap.read()\n                if not ret: break\n                frame = cv2.cvtColor(frame, cv2.COLOR_BGR2GRAY)\n                frame = cv2.resize(frame, kwargs.get(\"resize\", (24, 24)))\n                frames.append(frame.astype(np.float64) / 255.0)\n            cap.release()\n            self.processed_data = np.array(frames).flatten().reshape(1, -1)\n        else:  # geospatial basit CSV\n            import pandas as pd\n            self.processed_data = pd.read_csv(source).select_dtypes(include=[np.number]).values.astype(np.float64)\n        print(f\"[Pipeline] Veri yüklendi → {self.processed_data.shape}\")\n        return self\n\n    def select_device(self, key: str):\n        if key not in DEVICE_CATALOG:\n            raise ValueError(f\"Cihaz bulunamadı: {list(DEVICE_CATALOG)}\")\n        self.device_key = key\n        self.device_info = DEVICE_CATALOG[key]\n        self.max_qubits = self.device_info[\"max_qubits\"]\n        print(f\"[Pipeline] Cihaz: {self.device_info['name']} ({self.max_qubits} qubit, {self.device_info['paradigm']})\")\n        if self.device_info[\"paradigm\"] != \"gate\":\n            print(\"⚠ Bu cihaz gate-model değil. Circuit referans amaçlıdır.\")\n        return self\n\n    def analyze_and_recommend(self, force_qubits=None):\n        n_feat = self.processed_data.shape[1]\n        amp_q = int(np.ceil(np.log2(max(n_feat, 2))))\n        max_q = self.max_qubits\n\n        if force_qubits:\n            rec_q = min(force_qubits, max_q)\n            enc = \"angle\" if rec_q >= n_feat else (\"amplitude\" if rec_q >= amp_q else \"dense\")\n        else:\n            if n_feat <= max_q:\n                enc, rec_q = \"angle\", n_feat\n            elif amp_q <= max_q:\n                enc, rec_q = \"amplitude\", amp_q\n            else:\n                enc, rec_q = \"dense\", max_q\n\n        self.recommended_qubits = rec_q\n        self.encoding_type = enc\n        return {\n            \"n_features\": n_feat,\n            \"device\": self.device_info[\"name\"],\n            \"paradigm\": self.device_info[\"paradigm\"],\n            \"recommended_qubits\": rec_q,\n            \"recommended_encoding\": enc,\n            \"amplitude_qubits_needed\": amp_q\n        }\n\n    def encode(self, encoding=None, n_qubits=None, reps=2):\n        encoding = encoding or self.encoding_type\n        n_qubits = min(n_qubits or self.recommended_qubits, self.max_qubits)\n        data = self.processed_data.copy()\n\n        if data.shape[1] > n_qubits and encoding != \"amplitude\":\n            self.pca = PCA(n_components=n_qubits, random_state=42)\n            data = self.pca.fit_transform(data)\n            print(f\"[Pipeline] PCA uygulandı → {data.shape[1]} boyut\")\n\n        if encoding in (\"angle\", \"dense\", \"basis\"):\n            if data.shape[0] == 1:\n                data = data - data.min()\n                rng = data.max() - data.min()\n                data = data / rng * np.pi if rng > 1e-12 else np.full_like(data, np.pi/2)\n            else:\n                data = MinMaxScaler((0, np.pi)).fit_transform(data)\n\n        if encoding == \"angle\":\n            n = min(data.shape[1], n_qubits)\n            qc = ZFeatureMap(n, reps=reps).assign_parameters(data[0, :n])\n        elif encoding == \"amplitude\":\n            sample = np.maximum(data[0].astype(np.float64), 0.0)\n            if np.allclose(sample, sample.flat[0]):\n                sample = np.maximum(self.processed_data[0].astype(np.float64), 0.0)\n            dim = 2 ** n_qubits\n            padded = np.zeros(dim)\n            padded[:min(len(sample), dim)] = sample[:dim]\n            norm = np.linalg.norm(padded)\n            padded = padded / norm if norm > 1e-12 else np.ones(dim)/np.sqrt(dim)\n            qc = QuantumCircuit(n_qubits, name=\"Amplitude\")\n            qc.initialize(padded, range(n_qubits))\n        elif encoding == \"dense\":\n            n = min(data.shape[1], n_qubits)\n            qc = ZZFeatureMap(n, reps=reps, entanglement=\"full\").assign_parameters(data[0, :n])\n        else:  # basis\n            qc = QuantumCircuit(n_qubits)\n            for i, v in enumerate(data[0, :n_qubits]):\n                if v > 0.5: qc.x(i)\n\n        self.circuit = qc\n        self.encoding_type = encoding\n        print(f\"[Pipeline] Circuit: {qc.num_qubits} qubit, depth={qc.depth()}\")\n        return qc\n\n    def summary(self):\n        print(\"\\n\" + \"=\"*55)\n        print(\"ÖZET\")\n        print(\"=\"*55)\n        print(f\"Veri tipi     : {self.data_type}\")\n        print(f\"Veri shape    : {None if self.processed_data is None else self.processed_data.shape}\")\n        print(f\"Cihaz         : {self.device_info['name'] if self.device_info else '-'}\")\n        print(f\"Paradigm      : {self.device_info['paradigm'] if self.device_info else '-'}\")\n        print(f\"Encoding      : {self.encoding_type}\")\n        print(f\"Qubit         : {self.circuit.num_qubits if self.circuit else '-'}\")\n        print(\"=\"*55)\n\nprint(\"Pipeline motoru yüklendi.\")",
   "outputs": [
    {
     "output_type": "stream",
     "name": "stdout",
     "text": [
      "Pipeline motoru yüklendi.\n"
     ]
    }
   ],
   "execution_count": 5,
   "id": "Pa9kjN_e3IKu"
  },
  {
   "cell_type": "markdown",
   "metadata": {
    "id": "1n_mQj-53IKw"
   },
   "source": "## 3. 🎯 ADIM 1 – Problemini Anlat\n\nAşağıdaki kutuya **ne tür bir problem çözmek istediğini** ve **elindeki verinin ne olduğunu** yaz.\n\nÖrnekler:\n- \"Müşteri churn tahmin etmek istiyorum. Elimde 50 bin satırlık CSV var, 20 özellik içeriyor.\"\n- \"Uydu görüntülerinden tarım alanlarını sınıflandırmak istiyorum.\"\n- \"Kredi risk skorlaması için tabular data kullanacağım.\"\n- \"Kısa videolardan hareket tanıma yapmak istiyorum.\"",
   "id": "1n_mQj-53IKw"
  },
  {
   "cell_type": "code",
   "metadata": {
    "colab": {
     "base_uri": "https://localhost:8080/"
    },
    "id": "4lOJiSTq3IKw",
    "executionInfo": {
     "status": "ok",
     "timestamp": 1788784933903,
     "user_tz": -180,
     "elapsed": 36,
     "user": {
      "displayName": "Joseph Volkan ÖZCAN",
      "userId": "11389530967736397480"
     }
    },
    "outputId": "9a9d40bf-6b09-4cc3-f95b-95a4a97d955e"
   },
   "source": "#@title 📝 Problemini buraya yaz { run: \"auto\" }\nproblem_description = \"airline crew pairing & rostering için ibm qiskit veya wukong ile çalışan bir colab oluşturmak istiyorum\"  #@param {type:\"string\"}\n\nprint(\"Girilen problem:\")\nprint(problem_description)",
   "outputs": [
    {
     "output_type": "stream",
     "name": "stdout",
     "text": [
      "Girilen problem:\n",
      "airline crew pairing & rostering için ibm qiskit veya wukong ile çalışan bir colab oluşturmak istiyorum\n"
     ]
    }
   ],
   "execution_count": 44,
   "id": "4lOJiSTq3IKw"
  },
  {
   "cell_type": "markdown",
   "metadata": {
    "id": "84qDwpxM3IKx"
   },
   "source": "## 4. 🤖 ADIM 2 – Gemini Problemi Analiz Etsin",
   "id": "84qDwpxM3IKx"
  },
  {
   "cell_type": "code",
   "metadata": {
    "colab": {
     "base_uri": "https://localhost:8080/",
     "height": 95
    },
    "id": "Ot_QV7xD3IKx",
    "executionInfo": {
     "status": "ok",
     "timestamp": 1788784938854,
     "user_tz": -180,
     "elapsed": 329,
     "user": {
      "displayName": "Joseph Volkan ÖZCAN",
      "userId": "11389530967736397480"
     }
    },
    "outputId": "40f6620c-f36c-4daa-85a5-94cbe29d6204"
   },
   "source": "def ask_gemini(prompt: str, model: str = \"gemini-2.5-flash\") -> str:\n    if client is None:\n        return \"Gemini bağlantısı yok. API key kontrol et.\"\n    try:\n        response = client.models.generate_content(\n            model=model,\n            contents=prompt\n        )\n        return response.text\n    except Exception as e:\n        return f\"Hata: {e}\"\n\nanalysis_prompt = f\"\"\"\nSen bir Quantum Machine Learning uzmanısın. Kullanıcının problemini analiz et ve şu başlıklarla Türkçe cevap ver:\n\n1. Problemin özeti (1-2 cümle)\n2. Önerilen veri tipi (sadece şu seçeneklerden biri: csv, image, video, geospatial)\n3. Neden bu veri tipi?\n4. Önerilen encoding yöntemleri (angle, amplitude, dense, basis) ve kısa gerekçe\n5. Uygun cihaz önerileri (gate-model olanları önceliklendir: simulator, ibm_brisbane, wukong, ionq_aria, quera_gemini, quandela_belenos)\n6. Dikkat edilmesi gerekenler (qubit sayısı, PCA ihtiyacı, annealing/photonic uyumsuzluğu vb.)\n7. Kısa bir sonraki adım önerisi\n\nKullanıcının yazdığı problem:\n{problem_description}\n\"\"\"\n\nprint(\"Gemini analiz ediyor...\\n\")\ngemini_analysis = ask_gemini(analysis_prompt)\ndisplay(Markdown(gemini_analysis))",
   "outputs": [
    {
     "output_type": "stream",
     "name": "stdout",
     "text": [
      "Gemini analiz ediyor...\n",
      "\n"
     ]
    },
    {
     "output_type": "display_data",
     "data": {
      "text/plain": [
       "<IPython.core.display.Markdown object>"
      ],
      "text/markdown": "Hata: 404 NOT_FOUND. {'error': {'code': 404, 'message': 'This model models/gemini-2.5-flash is no longer available to new users. Please update your code to use models/gemini-3.6-flash for the latest features and improvements. We recommend you to use the Interactions API.', 'status': 'NOT_FOUND'}}"
     },
     "metadata": {}
    }
   ],
   "execution_count": 45,
   "id": "Ot_QV7xD3IKx"
  },
  {
   "cell_type": "markdown",
   "metadata": {
    "id": "HgKWhosJ3IKy"
   },
   "source": "## 5. 📊 ADIM 3 – Veri Tipini Onayla ve Veriyi Yükle\n\nGemini’nin önerdiği veri tipini aşağıya yaz (veya kendin seç).  \nSonra kendi dosyanı yükle veya örnek veri kullan.",
   "id": "HgKWhosJ3IKy"
  },
  {
   "cell_type": "code",
   "metadata": {
    "id": "aEPVHL1q3IKy"
   },
   "source": "#@title Veri tipi ve dosya { run: \"auto\" }\nselected_data_type = \"csv\"  #@param [\"csv\", \"image\", \"video\", \"geospatial\"]\nuse_sample_data = True      #@param {type:\"boolean\"}\n\npipe = QuantumAppPipeline()\npipe.select_data_type(selected_data_type)\n\nif use_sample_data and selected_data_type == \"csv\":\n    import pandas as pd\n    # Örnek churn benzeri veri\n    sample = pd.DataFrame(np.random.rand(200, 18), columns=[f\"feat_{i}\" for i in range(18)])\n    sample.to_csv(\"sample_data.csv\", index=False)\n    pipe.load_data(\"sample_data.csv\")\n    print(\"Örnek CSV yüklendi (200 satır × 18 özellik)\")\nelif use_sample_data and selected_data_type == \"image\":\n    from PIL import Image\n    img = Image.fromarray((np.random.rand(64, 64)*255).astype(np.uint8))\n    img.save(\"sample_img.png\")\n    pipe.load_data(\"sample_img.png\", resize=(16, 16))\n    print(\"Örnek resim yüklendi\")\nelse:\n    print(\"Kendi dosyanı yüklemek için sol menüden Upload yap, sonra aşağıdaki satırı düzenle:\")\n    print('# pipe.load_data(\"senin_dosyan.csv\")')",
   "outputs": [],
   "execution_count": null,
   "id": "aEPVHL1q3IKy"
  },
  {
   "cell_type": "markdown",
   "metadata": {
    "id": "vZGN7Rqu3IKz"
   },
   "source": "## 6. 🖥️ ADIM 4 – Cihaz Seçimi\n\nGemini’nin önerdiği cihazlardan birini seç.",
   "id": "vZGN7Rqu3IKz"
  },
  {
   "cell_type": "code",
   "metadata": {
    "id": "S8x9K6lj3IKz"
   },
   "source": "#@title Cihaz seç { run: \"auto\" }\nselected_device = \"wukong\"  #@param [\"simulator\", \"ibm_brisbane\", \"wukong\", \"ionq_aria\", \"quera_aquila\", \"quera_gemini\", \"xanadu_aurora\", \"quandela_belenos\", \"dwave_advantage2\"]\n\npipe.select_device(selected_device)\nreport = pipe.analyze_and_recommend()\n\nprint(\"\\n--- Analiz Raporu ---\")\nfor k, v in report.items():\n    print(f\"{k:25}: {v}\")",
   "outputs": [],
   "execution_count": null,
   "id": "S8x9K6lj3IKz"
  },
  {
   "cell_type": "markdown",
   "metadata": {
    "id": "5I0uhSbx3IK0"
   },
   "source": "## 7. ⚙️ ADIM 5 – Encoding & Circuit Üret",
   "id": "5I0uhSbx3IK0"
  },
  {
   "cell_type": "code",
   "metadata": {
    "id": "z1rGE-pi3IK0"
   },
   "source": "#@title Encoding ayarları { run: \"auto\" }\nencoding_choice = \"auto\"  #@param [\"auto\", \"angle\", \"amplitude\", \"dense\", \"basis\"]\nmanual_qubits = 0         #@param {type:\"integer\"}\n\nif encoding_choice == \"auto\":\n    qc = pipe.encode()\nelse:\n    nq = manual_qubits if manual_qubits > 0 else None\n    qc = pipe.encode(encoding=encoding_choice, n_qubits=nq)\n\npipe.summary()\nprint(\"\\nCircuit çizimi:\")\nprint(qc.draw(output=\"text\", fold=100))",
   "outputs": [],
   "execution_count": null,
   "id": "z1rGE-pi3IK0"
  },
  {
   "cell_type": "markdown",
   "metadata": {
    "id": "jO3lISwm3IK0"
   },
   "source": "## 8. 💬 ADIM 6 – Gemini’den Sonraki Adım Tavsiyesi Al",
   "id": "jO3lISwm3IK0"
  },
  {
   "cell_type": "code",
   "metadata": {
    "id": "THneG_PT3IK1"
   },
   "source": "followup_prompt = f\"\"\"\nKullanıcı şu problemi çözmek istiyor:\n{problem_description}\n\nŞu ana kadar yapılanlar:\n- Veri tipi: {pipe.data_type}\n- Cihaz: {pipe.device_info['name'] if pipe.device_info else 'seçilmedi'}\n- Encoding: {pipe.encoding_type}\n- Qubit sayısı: {pipe.circuit.num_qubits if pipe.circuit else 'yok'}\n\nKısa ve net olarak:\n1. Bu seçimlerin problem için uygun olup olmadığını söyle\n2. Bir sonraki mantıklı adımı öner (örneğin VQC eğitimi, feature map iyileştirme, gerçek donanıma gönderme, hibrit model vb.)\n3. Varsa kritik uyarıları belirt\n\nCevabını Türkçe ve uygulanabilir tut.\n\"\"\"\n\nprint(\"Gemini sonraki adımları öneriyor...\\n\")\nnext_steps = ask_gemini(followup_prompt)\ndisplay(Markdown(next_steps))",
   "outputs": [],
   "execution_count": null,
   "id": "THneG_PT3IK1"
  },
  {
   "cell_type": "markdown",
   "metadata": {
    "id": "LBnvDwHy3IK1"
   },
   "source": "## 9. İsteğe Bağlı – Statevector Kontrolü",
   "id": "LBnvDwHy3IK1"
  },
  {
   "cell_type": "code",
   "metadata": {
    "id": "qp857dT53IK2"
   },
   "source": "if pipe.circuit is not None:\n    try:\n        sv = Statevector.from_instruction(pipe.circuit)\n        print(\"Statevector norm:\", round(np.linalg.norm(sv.data), 6))\n        print(\"İlk 6 amplitude :\", np.round(sv.data[:6], 4))\n    except Exception as e:\n        print(\"Statevector alınamadı (circuit çok büyük veya initialize içeriyor olabilir):\", e)\nelse:\n    print(\"Önce circuit üret.\")",
   "outputs": [],
   "execution_count": null,
   "id": "qp857dT53IK2"
  },
  {
   "cell_type": "markdown",
   "metadata": {
    "id": "4kLl9nKs3IK2"
   },
   "source": "---\n\n### Nasıl Kullanılır?\n\n1. **Secrets** kısmına `GEMINI_API_KEY` ekle\n2. Problemini **3. hücredeki** kutuya yaz\n3. Gemini analizini oku\n4. Veri tipi + cihaz + encoding seçimlerini formlardan yap\n5. Circuit’i üret ve Gemini’nin sonraki adım önerisini al\n\nBu yapı tamamen interaktif ilerler. İstediğin zaman geri dönüp farklı cihaz veya encoding deneyebilirsin.\n\nBaşarılar! 🚀",
   "id": "4kLl9nKs3IK2"
  }
 ]
}