{
 "nbformat": 4,
 "nbformat_minor": 5,
 "metadata": {
  "kernelspec": {
   "display_name": "Python 3",
   "name": "python3"
  },
  "language_info": {
   "name": "python"
  },
  "colab": {
   "provenance": []
  }
 },
 "cells": [
  {
   "cell_type": "markdown",
   "id": "title",
   "metadata": {
    "id": "title"
   },
   "source": "# 悟空 (Origin Wukong) — Home Credit QML Demo\n\n**Amaç:** IBM free kotasından bağımsız olarak **本源悟空 (Origin Wukong)** API ile quantum demo.\n\n| Konu | Açıklama |\n|------|----------|\n| **Platform** | [Origin Quantum Cloud](https://qcloud.originqc.com.cn) |\n| **SDK** | `pyqpanda` / `pyqpanda3` |\n| **Cihaz** | Wukong 72 / 180 qubit (token + kota gerekir) |\n| **Güvenli varsayılan** | Yerel **CPUQVM simülatör** — API yoksa bile notebook biter |\n| **IBM notebook** | Ayrı dosya; orada `use_real_hardware=False` (Aer) |\n\n### Token alma\n1. https://qcloud.originqc.com.cn adresine kayıt olun  \n2. Hesap / çalışma alanından **API Token** kopyalayın  \n3. Colab Secret: `ORIGIN_API_TOKEN` veya aşağıdaki hücreye yapıştırın  \n\n### Çalıştırma sırası\n1 → 9 sırayla (7 = metrik kaydı, **9 = Word raporu**). Gerçek chip için AŞAMA 3’te `USE_WUKONG_CHIP = True`.\n"
  },
  {
   "cell_type": "markdown",
   "id": "s1md",
   "metadata": {
    "id": "s1md"
   },
   "source": "## AŞAMA 1: Kurulum\n"
  },
  {
   "cell_type": "code",
   "execution_count": 1,
   "id": "s1code",
   "metadata": {
    "colab": {
     "base_uri": "https://localhost:8080/"
    },
    "id": "s1code",
    "executionInfo": {
     "status": "ok",
     "timestamp": 1788522269589,
     "user_tz": -180,
     "elapsed": 35068,
     "user": {
      "displayName": "Joseph Volkan ÖZCAN",
      "userId": "11389530967736397480"
     }
    },
    "outputId": "3d42f54a-3141-480a-91d4-d122b5d7a61b"
   },
   "outputs": [
    {
     "output_type": "stream",
     "name": "stdout",
     "text": [
      "📦 Paketler...\n",
      "\u001b[2K   \u001b[90m━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\u001b[0m \u001b[32m1.8/1.8 MB\u001b[0m \u001b[31m19.3 MB/s\u001b[0m eta \u001b[36m0:00:00\u001b[0m\n",
      "\u001b[?25h✅ Kurulum tamam.\n"
     ]
    }
   ],
   "source": "print(\"📦 Paketler...\")\n!pip install -q --upgrade pip\n# pyqpanda3 tercih; yoksa pyqpanda\n!pip install -q pyqpanda3 2>/dev/null || pip install -q pyqpanda\n!pip install -q numpy pandas scikit-learn matplotlib seaborn python-docx\n\nimport numpy as np\nimport pandas as pd\nimport matplotlib.pyplot as plt\nfrom sklearn.model_selection import train_test_split\nfrom sklearn.preprocessing import MinMaxScaler, StandardScaler\nfrom sklearn.decomposition import PCA\nfrom sklearn.impute import SimpleImputer\nfrom sklearn.metrics import accuracy_score, roc_auc_score, classification_report\nfrom sklearn.linear_model import LogisticRegression\nimport warnings\nwarnings.filterwarnings(\"ignore\")\nprint(\"✅ Kurulum tamam.\")\n\n"
  },
  {
   "cell_type": "markdown",
   "id": "s2md",
   "metadata": {
    "id": "s2md"
   },
   "source": "## AŞAMA 2: Origin API Token\n"
  },
  {
   "cell_type": "code",
   "execution_count": 2,
   "id": "s2code",
   "metadata": {
    "colab": {
     "base_uri": "https://localhost:8080/"
    },
    "id": "s2code",
    "executionInfo": {
     "status": "ok",
     "timestamp": 1788522276969,
     "user_tz": -180,
     "elapsed": 1025,
     "user": {
      "displayName": "Joseph Volkan ÖZCAN",
      "userId": "11389530967736397480"
     }
    },
    "outputId": "d625ff42-e183-405f-9eaa-47ee52689484"
   },
   "outputs": [
    {
     "output_type": "stream",
     "name": "stdout",
     "text": [
      "✅ Token Colab Secrets'tan okundu.\n",
      "Token uzunluğu: 96\n"
     ]
    }
   ],
   "source": "import os\nORIGIN_API_TOKEN = None\n\ntry:\n    from google.colab import userdata\n    ORIGIN_API_TOKEN = userdata.get(\"ORIGIN_API_TOKEN\") or userdata.get(\"QPANDA3_API_KEY\") or userdata.get(\"ORIGIN_API_KEY\")\n    if ORIGIN_API_TOKEN:\n        print(\"✅ Token Colab Secrets'tan okundu.\")\nexcept Exception:\n    pass\n\nif not ORIGIN_API_TOKEN:\n    ORIGIN_API_TOKEN = os.environ.get(\"ORIGIN_API_TOKEN\") or os.environ.get(\"QPANDA3_API_KEY\") or os.environ.get(\"ORIGIN_API_KEY\")\n\nif not ORIGIN_API_TOKEN:\n    # İsteğe bağlı: buraya yapıştırın (paylaşmayın)\n    ORIGIN_API_TOKEN = \"\"  # \"your_token_here\"\n\nif ORIGIN_API_TOKEN:\n    print(f\"Token uzunluğu: {len(ORIGIN_API_TOKEN)}\")\nelse:\n    print(\"⚠️ Token yok → yalnızca yerel CPUQVM simülatör kullanılacak.\")\n    print(\"   Token: https://qcloud.originqc.com.cn\")\n\n"
  },
  {
   "cell_type": "markdown",
   "id": "s3md",
   "metadata": {
    "id": "s3md"
   },
   "source": "## AŞAMA 3: Backend seçimi (Simülatör / Wukong)\n\n- `USE_WUKONG_CHIP = False` → yerel simülatör (önerilen geliştirme)\n- `USE_WUKONG_CHIP = True` + token → gerçek Wukong chip (kota harcar; **az shot / az devre**)\n"
  },
  {
   "cell_type": "code",
   "execution_count": 3,
   "id": "s3code",
   "metadata": {
    "colab": {
     "base_uri": "https://localhost:8080/"
    },
    "id": "s3code",
    "executionInfo": {
     "status": "ok",
     "timestamp": 1788522293213,
     "user_tz": -180,
     "elapsed": 554,
     "user": {
      "displayName": "Joseph Volkan ÖZCAN",
      "userId": "11389530967736397480"
     }
    },
    "outputId": "e9d5835a-13f1-48b9-ebf2-851f7da86e4a"
   },
   "outputs": [
    {
     "output_type": "stream",
     "name": "stdout",
     "text": [
      "SDK: pyqpanda3\n",
      "✅ Wukong cloud servisi bağlandı (pyqpanda3).\n",
      "BACKEND_MODE = wukong\n",
      "N_QUBITS=4  SHOTS=500\n"
     ]
    }
   ],
   "source": "# ========== AYAR ==========\nUSE_WUKONG_CHIP = True   # True = gerçek chip (kota!)\nN_QUBITS = 4              # küçük tutun\nSHOTS = 500               # chip için 200–1000 arası\nMAX_TRAIN = 40\nMAX_TEST = 16\n# ==========================\n\nBACKEND_MODE = \"simulator\"  # simulator | wukong\nqcloud_machine = None\nQPANDA_OK = False\nPY3 = False\n\ntry:\n    # Önce pyqpanda3 dene\n    from pyqpanda3.core import QProg, H, RX, RY, RZ, CNOT, X, measure, CPUQVM\n    PY3 = True\n    QPANDA_OK = True\n    print(\"SDK: pyqpanda3\")\nexcept Exception as e3:\n    try:\n        from pyqpanda import *\n        PY3 = False\n        QPANDA_OK = True\n        print(\"SDK: pyqpanda (classic)\")\n    except Exception as e2:\n        print(f\"❌ pyqpanda yüklenemedi: {e3} | {e2}\")\n        QPANDA_OK = False\n\nif QPANDA_OK and USE_WUKONG_CHIP and ORIGIN_API_TOKEN:\n    try:\n        if PY3:\n            import pyqpanda3.qcloud as qcloud\n            service = qcloud.QCloudService(ORIGIN_API_TOKEN)\n            # backend adı ortama göre değişebilir\n            try:\n                qcloud_machine = service.backend(\"origin_wukong\")\n            except Exception:\n                qcloud_machine = service  # bazı sürümlerde service üzerinden run\n            BACKEND_MODE = \"wukong\"\n            print(\"✅ Wukong cloud servisi bağlandı (pyqpanda3).\")\n        else:\n            qcloud_machine = QCloud()\n            try:\n                qcloud_machine.set_configure(72, 72)\n            except Exception:\n                pass\n            qcloud_machine.init_qvm(ORIGIN_API_TOKEN, True)\n            BACKEND_MODE = \"wukong\"\n            print(\"✅ Wukong QCloud bağlandı (pyqpanda).\")\n    except Exception as e:\n        print(f\"⚠️ Wukong bağlantısı başarısız: {e}\")\n        print(\"   Yerel simülatöre düşülüyor.\")\n        BACKEND_MODE = \"simulator\"\n        USE_WUKONG_CHIP = False\nelse:\n    if USE_WUKONG_CHIP and not ORIGIN_API_TOKEN:\n        print(\"⚠️ USE_WUKONG_CHIP=True ama token yok → simülatör.\")\n    BACKEND_MODE = \"simulator\"\n\nprint(f\"BACKEND_MODE = {BACKEND_MODE}\")\nprint(f\"N_QUBITS={N_QUBITS}  SHOTS={SHOTS}\")\n\n"
  },
  {
   "cell_type": "markdown",
   "id": "s4md",
   "metadata": {
    "id": "s4md"
   },
   "source": "## AŞAMA 4: Home Credit veri (küçük subset)\n"
  },
  {
   "cell_type": "code",
   "execution_count": 4,
   "id": "s4code",
   "metadata": {
    "colab": {
     "base_uri": "https://localhost:8080/",
     "height": 120
    },
    "id": "s4code",
    "executionInfo": {
     "status": "ok",
     "timestamp": 1788522872211,
     "user_tz": -180,
     "elapsed": 571192,
     "user": {
      "displayName": "Joseph Volkan ÖZCAN",
      "userId": "11389530967736397480"
     }
    },
    "outputId": "bd75492b-20af-4ec3-8adc-3c9259c1c1c2"
   },
   "outputs": [
    {
     "output_type": "stream",
     "name": "stdout",
     "text": [
      "application_train.csv yükleyin...\n"
     ]
    },
    {
     "output_type": "display_data",
     "data": {
      "text/plain": [
       "<IPython.core.display.HTML object>"
      ],
      "text/html": [
       "\n",
       "     <input type=\"file\" id=\"files-d88b2e6c-25ad-46b7-8aef-7b6c082cbc22\" name=\"files[]\" multiple disabled\n",
       "        style=\"border:none\" />\n",
       "     <output id=\"result-d88b2e6c-25ad-46b7-8aef-7b6c082cbc22\">\n",
       "      Upload widget is only available when the cell has been executed in the\n",
       "      current browser session. Please rerun this cell to enable.\n",
       "      </output>\n",
       "      <script>// Copyright 2017 Google LLC\n",
       "//\n",
       "// Licensed under the Apache License, Version 2.0 (the \"License\");\n",
       "// you may not use this file except in compliance with the License.\n",
       "// You may obtain a copy of the License at\n",
       "//\n",
       "//      http://www.apache.org/licenses/LICENSE-2.0\n",
       "//\n",
       "// Unless required by applicable law or agreed to in writing, software\n",
       "// distributed under the License is distributed on an \"AS IS\" BASIS,\n",
       "// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n",
       "// See the License for the specific language governing permissions and\n",
       "// limitations under the License.\n",
       "\n",
       "/**\n",
       " * @fileoverview Helpers for google.colab Python module.\n",
       " */\n",
       "(function(scope) {\n",
       "function span(text, styleAttributes = {}) {\n",
       "  const element = document.createElement('span');\n",
       "  element.textContent = text;\n",
       "  for (const key of Object.keys(styleAttributes)) {\n",
       "    element.style[key] = styleAttributes[key];\n",
       "  }\n",
       "  return element;\n",
       "}\n",
       "\n",
       "// Max number of bytes which will be uploaded at a time.\n",
       "const MAX_PAYLOAD_SIZE = 100 * 1024;\n",
       "\n",
       "function _uploadFiles(inputId, outputId) {\n",
       "  const steps = uploadFilesStep(inputId, outputId);\n",
       "  const outputElement = document.getElementById(outputId);\n",
       "  // Cache steps on the outputElement to make it available for the next call\n",
       "  // to uploadFilesContinue from Python.\n",
       "  outputElement.steps = steps;\n",
       "\n",
       "  return _uploadFilesContinue(outputId);\n",
       "}\n",
       "\n",
       "// This is roughly an async generator (not supported in the browser yet),\n",
       "// where there are multiple asynchronous steps and the Python side is going\n",
       "// to poll for completion of each step.\n",
       "// This uses a Promise to block the python side on completion of each step,\n",
       "// then passes the result of the previous step as the input to the next step.\n",
       "function _uploadFilesContinue(outputId) {\n",
       "  const outputElement = document.getElementById(outputId);\n",
       "  const steps = outputElement.steps;\n",
       "\n",
       "  const next = steps.next(outputElement.lastPromiseValue);\n",
       "  return Promise.resolve(next.value.promise).then((value) => {\n",
       "    // Cache the last promise value to make it available to the next\n",
       "    // step of the generator.\n",
       "    outputElement.lastPromiseValue = value;\n",
       "    return next.value.response;\n",
       "  });\n",
       "}\n",
       "\n",
       "/**\n",
       " * Generator function which is called between each async step of the upload\n",
       " * process.\n",
       " * @param {string} inputId Element ID of the input file picker element.\n",
       " * @param {string} outputId Element ID of the output display.\n",
       " * @return {!Iterable<!Object>} Iterable of next steps.\n",
       " */\n",
       "function* uploadFilesStep(inputId, outputId) {\n",
       "  const inputElement = document.getElementById(inputId);\n",
       "  inputElement.disabled = false;\n",
       "\n",
       "  const outputElement = document.getElementById(outputId);\n",
       "  outputElement.innerHTML = '';\n",
       "\n",
       "  const pickedPromise = new Promise((resolve) => {\n",
       "    inputElement.addEventListener('change', (e) => {\n",
       "      resolve(e.target.files);\n",
       "    });\n",
       "  });\n",
       "\n",
       "  const cancel = document.createElement('button');\n",
       "  inputElement.parentElement.appendChild(cancel);\n",
       "  cancel.textContent = 'Cancel upload';\n",
       "  const cancelPromise = new Promise((resolve) => {\n",
       "    cancel.onclick = () => {\n",
       "      resolve(null);\n",
       "    };\n",
       "  });\n",
       "\n",
       "  // Wait for the user to pick the files.\n",
       "  const files = yield {\n",
       "    promise: Promise.race([pickedPromise, cancelPromise]),\n",
       "    response: {\n",
       "      action: 'starting',\n",
       "    }\n",
       "  };\n",
       "\n",
       "  cancel.remove();\n",
       "\n",
       "  // Disable the input element since further picks are not allowed.\n",
       "  inputElement.disabled = true;\n",
       "\n",
       "  if (!files) {\n",
       "    return {\n",
       "      response: {\n",
       "        action: 'complete',\n",
       "      }\n",
       "    };\n",
       "  }\n",
       "\n",
       "  for (const file of files) {\n",
       "    const li = document.createElement('li');\n",
       "    li.append(span(file.name, {fontWeight: 'bold'}));\n",
       "    li.append(span(\n",
       "        `(${file.type || 'n/a'}) - ${file.size} bytes, ` +\n",
       "        `last modified: ${\n",
       "            file.lastModifiedDate ? file.lastModifiedDate.toLocaleDateString() :\n",
       "                                    'n/a'} - `));\n",
       "    const percent = span('0% done');\n",
       "    li.appendChild(percent);\n",
       "\n",
       "    outputElement.appendChild(li);\n",
       "\n",
       "    const fileDataPromise = new Promise((resolve) => {\n",
       "      const reader = new FileReader();\n",
       "      reader.onload = (e) => {\n",
       "        resolve(e.target.result);\n",
       "      };\n",
       "      reader.readAsArrayBuffer(file);\n",
       "    });\n",
       "    // Wait for the data to be ready.\n",
       "    let fileData = yield {\n",
       "      promise: fileDataPromise,\n",
       "      response: {\n",
       "        action: 'continue',\n",
       "      }\n",
       "    };\n",
       "\n",
       "    // Use a chunked sending to avoid message size limits. See b/62115660.\n",
       "    let position = 0;\n",
       "    do {\n",
       "      const length = Math.min(fileData.byteLength - position, MAX_PAYLOAD_SIZE);\n",
       "      const chunk = new Uint8Array(fileData, position, length);\n",
       "      position += length;\n",
       "\n",
       "      const base64 = btoa(String.fromCharCode.apply(null, chunk));\n",
       "      yield {\n",
       "        response: {\n",
       "          action: 'append',\n",
       "          file: file.name,\n",
       "          data: base64,\n",
       "        },\n",
       "      };\n",
       "\n",
       "      let percentDone = fileData.byteLength === 0 ?\n",
       "          100 :\n",
       "          Math.round((position / fileData.byteLength) * 100);\n",
       "      percent.textContent = `${percentDone}% done`;\n",
       "\n",
       "    } while (position < fileData.byteLength);\n",
       "  }\n",
       "\n",
       "  // All done.\n",
       "  yield {\n",
       "    response: {\n",
       "      action: 'complete',\n",
       "    }\n",
       "  };\n",
       "}\n",
       "\n",
       "scope.google = scope.google || {};\n",
       "scope.google.colab = scope.google.colab || {};\n",
       "scope.google.colab._files = {\n",
       "  _uploadFiles,\n",
       "  _uploadFilesContinue,\n",
       "};\n",
       "})(self);\n",
       "</script> "
      ]
     },
     "metadata": {}
    },
    {
     "output_type": "stream",
     "name": "stdout",
     "text": [
      "Saving application_train.csv to application_train.csv\n",
      "✅ application_train.csv → (307511, 122)\n",
      "Şekil: (307511, 11) default oranı: 0.08072881945686496\n"
     ]
    }
   ],
   "source": "import os\nCANDIDATES = [\n    \"/content/application_train.csv\",\n    \"/content/drive/MyDrive/application_train.csv\",\n    \"./application_train.csv\",\n    \"./data/application_train.csv\",\n]\ndf = None\nfor p in CANDIDATES:\n    if os.path.isfile(p):\n        df = pd.read_csv(p, low_memory=False)\n        print(f\"✅ {p} → {df.shape}\")\n        break\n\nif df is None:\n    try:\n        from google.colab import files\n        print(\"application_train.csv yükleyin...\")\n        up = files.upload()\n        if up:\n            fname = list(up.keys())[0]\n            df = pd.read_csv(fname, low_memory=False)\n            print(f\"✅ {fname} → {df.shape}\")\n    except Exception as e:\n        print(\"Upload yok:\", e)\n\nif df is None or \"TARGET\" not in (df.columns if df is not None else []):\n    # Sentetik yedek — notebook yine çalışsın\n    print(\"⚠️ Gerçek veri yok → sentetik binary classification.\")\n    from sklearn.datasets import make_classification\n    X_syn, y_syn = make_classification(\n        n_samples=400, n_features=8, n_informative=5, n_redundant=1,\n        weights=[0.85, 0.15], random_state=42\n    )\n    df = pd.DataFrame(X_syn, columns=[f\"f{i}\" for i in range(8)])\n    df[\"TARGET\"] = y_syn\nelse:\n    cols = [c for c in [\n        \"AMT_INCOME_TOTAL\", \"AMT_CREDIT\", \"AMT_ANNUITY\", \"AMT_GOODS_PRICE\",\n        \"DAYS_BIRTH\", \"DAYS_EMPLOYED\", \"EXT_SOURCE_1\", \"EXT_SOURCE_2\", \"EXT_SOURCE_3\",\n        \"CNT_CHILDREN\", \"REGION_POPULATION_RELATIVE\"\n    ] if c in df.columns]\n    work = df[cols + [\"TARGET\"]].copy()\n    if \"DAYS_EMPLOYED\" in work.columns:\n        work.loc[work[\"DAYS_EMPLOYED\"] > 0, \"DAYS_EMPLOYED\"] = np.nan\n    imp = SimpleImputer(strategy=\"median\")\n    X_all = imp.fit_transform(work[cols])\n    y_all = work[\"TARGET\"].astype(int).values\n    df = pd.DataFrame(X_all, columns=cols)\n    df[\"TARGET\"] = y_all\n\ny = df[\"TARGET\"].values\nX = df.drop(columns=[\"TARGET\"]).values\nprint(\"Şekil:\", X.shape, \"default oranı:\", y.mean())\n\n"
  },
  {
   "cell_type": "markdown",
   "id": "s5md",
   "metadata": {
    "id": "s5md"
   },
   "source": "## AŞAMA 5: Özellik → açı kodlama (N_QUBITS)\n"
  },
  {
   "cell_type": "code",
   "execution_count": 5,
   "id": "s5code",
   "metadata": {
    "colab": {
     "base_uri": "https://localhost:8080/"
    },
    "id": "s5code",
    "executionInfo": {
     "status": "ok",
     "timestamp": 1788522882081,
     "user_tz": -180,
     "elapsed": 882,
     "user": {
      "displayName": "Joseph Volkan ÖZCAN",
      "userId": "11389530967736397480"
     }
    },
    "outputId": "01e67fe7-c826-4f7a-9c32-235e94c07a82"
   },
   "outputs": [
    {
     "output_type": "stream",
     "name": "stdout",
     "text": [
      "Quantum subset train/test: (40, 4) (16, 4)\n",
      "Train default: 0.5\n",
      "Klasik LR  Acc=0.663  AUC=0.714\n"
     ]
    }
   ],
   "source": "# PCA → N_QUBITS, açılar [0, π]\npca = PCA(n_components=N_QUBITS, random_state=42)\nX_pca = pca.fit_transform(StandardScaler().fit_transform(X))\nscaler = MinMaxScaler((0, np.pi))\nX_ang = scaler.fit_transform(X_pca)\n\nX_tr, X_te, y_tr, y_te = train_test_split(X_ang, y, test_size=0.25, random_state=42, stratify=y)\n\nrng = np.random.RandomState(42)\ndef stratified_sub(Xa, ya, n):\n    pos = np.where(ya == 1)[0]\n    neg = np.where(ya == 0)[0]\n    n_pos = min(n // 2, len(pos))\n    n_neg = min(n - n_pos, len(neg))\n    sel = np.concatenate([rng.choice(pos, n_pos, replace=False), rng.choice(neg, n_neg, replace=False)])\n    rng.shuffle(sel)\n    return Xa[sel], ya[sel]\n\nX_train_q, y_train_q = stratified_sub(X_tr, y_tr, MAX_TRAIN)\nX_test_q, y_test_q = stratified_sub(X_te, y_te, MAX_TEST)\nprint(\"Quantum subset train/test:\", X_train_q.shape, X_test_q.shape)\nprint(\"Train default:\", y_train_q.mean())\n\n# Klasik baseline (aynı subset özellikleri üzerinde geniş set)\nclf = LogisticRegression(max_iter=500, class_weight=\"balanced\")\n# klasik için ham PCA scale farklı olabilir — aynı X_tr üzerinde\nXs = StandardScaler().fit_transform(X_pca)\nXs_tr, Xs_te, ys_tr, ys_te = train_test_split(Xs, y, test_size=0.25, random_state=42, stratify=y)\nclf.fit(Xs_tr, ys_tr)\nyp = clf.predict(Xs_te)\npr = clf.predict_proba(Xs_te)[:, 1]\nprint(f\"Klasik LR  Acc={accuracy_score(ys_te, yp):.3f}  AUC={roc_auc_score(ys_te, pr):.3f}\")\n\n"
  },
  {
   "cell_type": "markdown",
   "id": "s6md",
   "metadata": {
    "id": "s6md"
   },
   "source": "## AŞAMA 6: Variational devre (pyqpanda) + eğitim\n\nHer örnek için angle embedding + parametreli RY/CNOT katmanı.  \nÖlçüm: qubit 0’da P(1) ≈ sınıf skoru.\n\n**Kota koruması:** Chip modunda `MAX_ITER` çok düşük (2–3); simülatörde daha yüksek.\n"
  },
  {
   "cell_type": "code",
   "execution_count": 6,
   "id": "s6code",
   "metadata": {
    "colab": {
     "base_uri": "https://localhost:8080/"
    },
    "id": "s6code",
    "executionInfo": {
     "status": "ok",
     "timestamp": 1788523061409,
     "user_tz": -180,
     "elapsed": 173240,
     "user": {
      "displayName": "Joseph Volkan ÖZCAN",
      "userId": "11389530967736397480"
     }
    },
    "outputId": "72e51fec-db64-4841-f090-34720c19da47"
   },
   "outputs": [
    {
     "output_type": "stream",
     "name": "stdout",
     "text": [
      "Eğitim başlıyor | mode=wukong | max_iter=3 | batch=12\n",
      "   chip run fallback local: Quantum computer under maintenance. Please try again later.\n",
      "   chip run fallback local: Quantum computer under maintenance. Please try again later.\n",
      "   chip run fallback local: Quantum computer under maintenance. Please try again later.\n",
      "   chip run fallback local: Quantum computer under maintenance. Please try again later.\n",
      "   chip run fallback local: Quantum computer under maintenance. Please try again later.\n",
      "   chip run fallback local: Quantum computer under maintenance. Please try again later.\n",
      "   chip run fallback local: Quantum computer under maintenance. Please try again later.\n",
      "   chip run fallback local: Quantum computer under maintenance. Please try again later.\n",
      "   chip run fallback local: Quantum computer under maintenance. Please try again later.\n",
      "   chip run fallback local: Quantum computer under maintenance. Please try again later.\n",
      "   chip run fallback local: Quantum computer under maintenance. Please try again later.\n",
      "   chip run fallback local: Quantum computer under maintenance. Please try again later.\n",
      "   chip run fallback local: Quantum computer under maintenance. Please try again later.\n",
      "   chip run fallback local: Quantum computer under maintenance. Please try again later.\n",
      "   chip run fallback local: Quantum computer under maintenance. Please try again later.\n",
      "   chip run fallback local: Quantum computer under maintenance. Please try again later.\n",
      "   chip run fallback local: Quantum computer under maintenance. Please try again later.\n",
      "   chip run fallback local: Quantum computer under maintenance. Please try again later.\n",
      "   chip run fallback local: Quantum computer under maintenance. Please try again later.\n",
      "   chip run fallback local: Quantum computer under maintenance. Please try again later.\n",
      "   chip run fallback local: Quantum computer under maintenance. Please try again later.\n",
      "   chip run fallback local: Quantum computer under maintenance. Please try again later.\n",
      "   chip run fallback local: Quantum computer under maintenance. Please try again later.\n",
      "   chip run fallback local: Quantum computer under maintenance. Please try again later.\n",
      "   chip run fallback local: Quantum computer under maintenance. Please try again later.\n",
      "   chip run fallback local: Quantum computer under maintenance. Please try again later.\n",
      "   chip run fallback local: Quantum computer under maintenance. Please try again later.\n",
      "   chip run fallback local: Quantum computer under maintenance. Please try again later.\n",
      "   chip run fallback local: Quantum computer under maintenance. Please try again later.\n",
      "   chip run fallback local: Quantum computer under maintenance. Please try again later.\n",
      "   chip run fallback local: Quantum computer under maintenance. Please try again later.\n",
      "   chip run fallback local: Quantum computer under maintenance. Please try again later.\n",
      "   chip run fallback local: Quantum computer under maintenance. Please try again later.\n",
      "   chip run fallback local: Quantum computer under maintenance. Please try again later.\n",
      "   chip run fallback local: Quantum computer under maintenance. Please try again later.\n",
      "   chip run fallback local: Quantum computer under maintenance. Please try again later.\n",
      "   chip run fallback local: Quantum computer under maintenance. Please try again later.\n",
      "   chip run fallback local: Quantum computer under maintenance. Please try again later.\n",
      "   chip run fallback local: Quantum computer under maintenance. Please try again later.\n",
      "   chip run fallback local: Quantum computer under maintenance. Please try again later.\n",
      "   chip run fallback local: Quantum computer under maintenance. Please try again later.\n",
      "   chip run fallback local: Quantum computer under maintenance. Please try again later.\n",
      "   chip run fallback local: Quantum computer under maintenance. Please try again later.\n",
      "   chip run fallback local: Quantum computer under maintenance. Please try again later.\n",
      "   chip run fallback local: Quantum computer under maintenance. Please try again later.\n",
      "   chip run fallback local: Quantum computer under maintenance. Please try again later.\n",
      "   chip run fallback local: Quantum computer under maintenance. Please try again later.\n",
      "   chip run fallback local: Quantum computer under maintenance. Please try again later.\n",
      "   chip run fallback local: Quantum computer under maintenance. Please try again later.\n",
      "   chip run fallback local: Quantum computer under maintenance. Please try again later.\n",
      "   chip run fallback local: Quantum computer under maintenance. Please try again later.\n",
      "   chip run fallback local: Quantum computer under maintenance. Please try again later.\n",
      "   chip run fallback local: Quantum computer under maintenance. Please try again later.\n",
      "   chip run fallback local: Quantum computer under maintenance. Please try again later.\n",
      "   chip run fallback local: Quantum computer under maintenance. Please try again later.\n",
      "   chip run fallback local: Quantum computer under maintenance. Please try again later.\n",
      "   chip run fallback local: Quantum computer under maintenance. Please try again later.\n",
      "   chip run fallback local: Quantum computer under maintenance. Please try again later.\n",
      "   chip run fallback local: Quantum computer under maintenance. Please try again later.\n",
      "   chip run fallback local: Quantum computer under maintenance. Please try again later.\n",
      "  iter 1/3  cost=0.2748\n",
      "   chip run fallback local: Quantum computer under maintenance. Please try again later.\n",
      "   chip run fallback local: Quantum computer under maintenance. Please try again later.\n",
      "   chip run fallback local: Quantum computer under maintenance. Please try again later.\n",
      "   chip run fallback local: Quantum computer under maintenance. Please try again later.\n",
      "   chip run fallback local: Quantum computer under maintenance. Please try again later.\n",
      "   chip run fallback local: Quantum computer under maintenance. Please try again later.\n",
      "   chip run fallback local: Quantum computer under maintenance. Please try again later.\n",
      "   chip run fallback local: Quantum computer under maintenance. Please try again later.\n",
      "   chip run fallback local: Quantum computer under maintenance. Please try again later.\n",
      "   chip run fallback local: Quantum computer under maintenance. Please try again later.\n",
      "   chip run fallback local: Quantum computer under maintenance. Please try again later.\n",
      "   chip run fallback local: Quantum computer under maintenance. Please try again later.\n",
      "   chip run fallback local: Quantum computer under maintenance. Please try again later.\n",
      "   chip run fallback local: Quantum computer under maintenance. Please try again later.\n",
      "   chip run fallback local: Quantum computer under maintenance. Please try again later.\n",
      "   chip run fallback local: Quantum computer under maintenance. Please try again later.\n",
      "   chip run fallback local: Quantum computer under maintenance. Please try again later.\n",
      "   chip run fallback local: Quantum computer under maintenance. Please try again later.\n",
      "   chip run fallback local: Quantum computer under maintenance. Please try again later.\n",
      "   chip run fallback local: Quantum computer under maintenance. Please try again later.\n",
      "   chip run fallback local: Quantum computer under maintenance. Please try again later.\n",
      "   chip run fallback local: Quantum computer under maintenance. Please try again later.\n",
      "   chip run fallback local: Quantum computer under maintenance. Please try again later.\n",
      "   chip run fallback local: Quantum computer under maintenance. Please try again later.\n",
      "   chip run fallback local: Quantum computer under maintenance. Please try again later.\n",
      "   chip run fallback local: Quantum computer under maintenance. Please try again later.\n",
      "   chip run fallback local: Quantum computer under maintenance. Please try again later.\n",
      "   chip run fallback local: Quantum computer under maintenance. Please try again later.\n",
      "   chip run fallback local: Quantum computer under maintenance. Please try again later.\n",
      "   chip run fallback local: Quantum computer under maintenance. Please try again later.\n",
      "   chip run fallback local: Quantum computer under maintenance. Please try again later.\n",
      "   chip run fallback local: Quantum computer under maintenance. Please try again later.\n",
      "   chip run fallback local: Quantum computer under maintenance. Please try again later.\n",
      "   chip run fallback local: Quantum computer under maintenance. Please try again later.\n",
      "   chip run fallback local: Quantum computer under maintenance. Please try again later.\n",
      "   chip run fallback local: Quantum computer under maintenance. Please try again later.\n",
      "   chip run fallback local: Quantum computer under maintenance. Please try again later.\n",
      "   chip run fallback local: Quantum computer under maintenance. Please try again later.\n",
      "   chip run fallback local: Quantum computer under maintenance. Please try again later.\n",
      "   chip run fallback local: Quantum computer under maintenance. Please try again later.\n",
      "   chip run fallback local: Quantum computer under maintenance. Please try again later.\n",
      "   chip run fallback local: Quantum computer under maintenance. Please try again later.\n",
      "   chip run fallback local: Quantum computer under maintenance. Please try again later.\n",
      "   chip run fallback local: Quantum computer under maintenance. Please try again later.\n",
      "   chip run fallback local: Quantum computer under maintenance. Please try again later.\n",
      "   chip run fallback local: Quantum computer under maintenance. Please try again later.\n",
      "   chip run fallback local: Quantum computer under maintenance. Please try again later.\n",
      "   chip run fallback local: Quantum computer under maintenance. Please try again later.\n",
      "   chip run fallback local: Quantum computer under maintenance. Please try again later.\n",
      "   chip run fallback local: Quantum computer under maintenance. Please try again later.\n",
      "   chip run fallback local: Quantum computer under maintenance. Please try again later.\n",
      "   chip run fallback local: Quantum computer under maintenance. Please try again later.\n",
      "   chip run fallback local: Quantum computer under maintenance. Please try again later.\n",
      "   chip run fallback local: Quantum computer under maintenance. Please try again later.\n",
      "   chip run fallback local: Quantum computer under maintenance. Please try again later.\n",
      "   chip run fallback local: Quantum computer under maintenance. Please try again later.\n",
      "   chip run fallback local: Quantum computer under maintenance. Please try again later.\n",
      "   chip run fallback local: Quantum computer under maintenance. Please try again later.\n",
      "   chip run fallback local: Quantum computer under maintenance. Please try again later.\n",
      "   chip run fallback local: Quantum computer under maintenance. Please try again later.\n",
      "  iter 2/3  cost=0.2364\n",
      "   chip run fallback local: Quantum computer under maintenance. Please try again later.\n",
      "   chip run fallback local: Quantum computer under maintenance. Please try again later.\n",
      "   chip run fallback local: Quantum computer under maintenance. Please try again later.\n",
      "   chip run fallback local: Quantum computer under maintenance. Please try again later.\n",
      "   chip run fallback local: Quantum computer under maintenance. Please try again later.\n",
      "   chip run fallback local: Quantum computer under maintenance. Please try again later.\n",
      "   chip run fallback local: Quantum computer under maintenance. Please try again later.\n",
      "   chip run fallback local: Quantum computer under maintenance. Please try again later.\n",
      "   chip run fallback local: Quantum computer under maintenance. Please try again later.\n",
      "   chip run fallback local: Quantum computer under maintenance. Please try again later.\n",
      "   chip run fallback local: Quantum computer under maintenance. Please try again later.\n",
      "   chip run fallback local: Quantum computer under maintenance. Please try again later.\n",
      "   chip run fallback local: Quantum computer under maintenance. Please try again later.\n",
      "   chip run fallback local: Quantum computer under maintenance. Please try again later.\n",
      "   chip run fallback local: Quantum computer under maintenance. Please try again later.\n",
      "   chip run fallback local: Quantum computer under maintenance. Please try again later.\n",
      "   chip run fallback local: Quantum computer under maintenance. Please try again later.\n",
      "   chip run fallback local: Quantum computer under maintenance. Please try again later.\n",
      "   chip run fallback local: Quantum computer under maintenance. Please try again later.\n",
      "   chip run fallback local: Quantum computer under maintenance. Please try again later.\n",
      "   chip run fallback local: Quantum computer under maintenance. Please try again later.\n",
      "   chip run fallback local: Quantum computer under maintenance. Please try again later.\n",
      "   chip run fallback local: Quantum computer under maintenance. Please try again later.\n",
      "   chip run fallback local: Quantum computer under maintenance. Please try again later.\n",
      "   chip run fallback local: Quantum computer under maintenance. Please try again later.\n",
      "   chip run fallback local: Quantum computer under maintenance. Please try again later.\n",
      "   chip run fallback local: Quantum computer under maintenance. Please try again later.\n",
      "   chip run fallback local: Quantum computer under maintenance. Please try again later.\n",
      "   chip run fallback local: Quantum computer under maintenance. Please try again later.\n",
      "   chip run fallback local: Quantum computer under maintenance. Please try again later.\n",
      "   chip run fallback local: Quantum computer under maintenance. Please try again later.\n",
      "   chip run fallback local: Quantum computer under maintenance. Please try again later.\n",
      "   chip run fallback local: Quantum computer under maintenance. Please try again later.\n",
      "   chip run fallback local: Quantum computer under maintenance. Please try again later.\n",
      "   chip run fallback local: Quantum computer under maintenance. Please try again later.\n",
      "   chip run fallback local: Quantum computer under maintenance. Please try again later.\n",
      "   chip run fallback local: Quantum computer under maintenance. Please try again later.\n",
      "   chip run fallback local: Quantum computer under maintenance. Please try again later.\n",
      "   chip run fallback local: Quantum computer under maintenance. Please try again later.\n",
      "   chip run fallback local: Quantum computer under maintenance. Please try again later.\n",
      "   chip run fallback local: Quantum computer under maintenance. Please try again later.\n",
      "   chip run fallback local: Quantum computer under maintenance. Please try again later.\n",
      "   chip run fallback local: Quantum computer under maintenance. Please try again later.\n",
      "   chip run fallback local: Quantum computer under maintenance. Please try again later.\n",
      "   chip run fallback local: Quantum computer under maintenance. Please try again later.\n",
      "   chip run fallback local: Quantum computer under maintenance. Please try again later.\n",
      "   chip run fallback local: Quantum computer under maintenance. Please try again later.\n",
      "   chip run fallback local: Quantum computer under maintenance. Please try again later.\n",
      "   chip run fallback local: Quantum computer under maintenance. Please try again later.\n",
      "   chip run fallback local: Quantum computer under maintenance. Please try again later.\n",
      "   chip run fallback local: Quantum computer under maintenance. Please try again later.\n",
      "   chip run fallback local: Quantum computer under maintenance. Please try again later.\n",
      "   chip run fallback local: Quantum computer under maintenance. Please try again later.\n",
      "   chip run fallback local: Quantum computer under maintenance. Please try again later.\n",
      "   chip run fallback local: Quantum computer under maintenance. Please try again later.\n",
      "   chip run fallback local: Quantum computer under maintenance. Please try again later.\n",
      "   chip run fallback local: Quantum computer under maintenance. Please try again later.\n",
      "   chip run fallback local: Quantum computer under maintenance. Please try again later.\n",
      "   chip run fallback local: Quantum computer under maintenance. Please try again later.\n",
      "   chip run fallback local: Quantum computer under maintenance. Please try again later.\n",
      "  iter 3/3  cost=0.2407\n",
      "Eğitim bitti.\n"
     ]
    }
   ],
   "source": "if not QPANDA_OK:\n    raise RuntimeError(\"pyqpanda / pyqpanda3 yok — AŞAMA 1'i kontrol edin.\")\n\nMAX_ITER = 3 if BACKEND_MODE == \"wukong\" else 25\nBATCH_EVAL = min(12, len(X_train_q))  # cost için alt örnek\n\ndef build_prog(x_angles, weights, py3=PY3):\n    \"\"\"x_angles: (n_qubits,), weights: (n_qubits,) RY angles after embedding.\"\"\"\n    n = len(x_angles)\n    if py3:\n        from pyqpanda3.core import QProg, RY, CNOT, measure\n        prog = QProg()\n        for i in range(n):\n            prog << RY(i, float(x_angles[i]))\n        for i in range(n):\n            prog << RY(i, float(weights[i]))\n        for i in range(n - 1):\n            prog << CNOT(i, i + 1)\n        prog << measure([0], [0])\n        return prog\n    else:\n        prog = QProg()\n        q = qcloud_machine.qAlloc_many(n) if (BACKEND_MODE == \"wukong\" and qcloud_machine is not None and not PY3) else None\n        # local path uses CPUQVM alloc inside run\n        return None  # classic path handled in run_counts\n\ndef run_counts(x_angles, weights, shots=SHOTS):\n    \"\"\"Return P(measure qubit0 == 1).\"\"\"\n    n = len(x_angles)\n    if PY3:\n        from pyqpanda3.core import QProg, RY, CNOT, measure, CPUQVM\n        prog = QProg()\n        for i in range(n):\n            prog << RY(i, float(x_angles[i]))\n        for i in range(n):\n            prog << RY(i, float(weights[i]))\n        for i in range(n - 1):\n            prog << CNOT(i, i + 1)\n        prog << measure([0], [0])\n        if BACKEND_MODE == \"wukong\" and qcloud_machine is not None:\n            try:\n                # pyqpanda3 cloud run — API sürüme göre değişebilir\n                if hasattr(qcloud_machine, \"run\"):\n                    qcloud_machine.run(prog, shots=shots)\n                    counts = qcloud_machine.result().get_counts()\n                else:\n                    # fallback local\n                    qvm = CPUQVM()\n                    qvm.run(prog, shots)\n                    counts = qvm.result().get_counts()\n            except Exception as e:\n                print(f\"   chip run fallback local: {e}\")\n                qvm = CPUQVM()\n                qvm.run(prog, shots)\n                counts = qvm.result().get_counts()\n        else:\n            qvm = CPUQVM()\n            qvm.run(prog, shots)\n            counts = qvm.result().get_counts()\n        # counts keys '0'/'1' or '00'..\n        c1 = 0.0\n        total = sum(counts.values()) or 1\n        for k, v in counts.items():\n            bit = str(k).replace(\" \", \"\")[-1]  # measured cbit\n            if bit == \"1\":\n                c1 += v\n        return c1 / total\n    else:\n        # pyqpanda classic\n        machine = CPUQVM()\n        machine.init_qvm()\n        q = machine.qAlloc_many(n)\n        c = machine.cAlloc_many(1)\n        prog = QProg()\n        for i in range(n):\n            prog << RY(q[i], float(x_angles[i]))\n        for i in range(n):\n            prog << RY(q[i], float(weights[i]))\n        for i in range(n - 1):\n            prog << CNOT(q[i], q[i + 1])\n        prog << Measure(q[0], c[0])\n        if BACKEND_MODE == \"wukong\" and qcloud_machine is not None:\n            try:\n                # gerçek chip\n                chip = getattr(real_chip_type, \"origin_72\", 2)\n                result = qcloud_machine.real_chip_measure(prog, shots, chip)\n                # result dict probabilities or counts\n                if isinstance(result, dict):\n                    c1 = 0.0\n                    for k, v in result.items():\n                        if str(k)[-1] == \"1\":\n                            c1 += float(v)\n                    # if values are probs already\n                    s = sum(float(v) for v in result.values())\n                    if s <= 1.5:\n                        return c1\n                    return c1 / (s or 1)\n            except Exception as e:\n                print(f\"   real_chip_measure fallback: {e}\")\n        result = machine.run_with_configuration(prog, c, shots)\n        machine.finalize()\n        c1 = 0.0\n        total = sum(result.values()) or 1\n        for k, v in result.items():\n            if str(k)[-1] == \"1\":\n                c1 += v\n        return c1 / total\n\n\ndef predict_proba_batch(Xbatch, weights):\n    return np.array([run_counts(x, weights) for x in Xbatch])\n\n\ndef cost(weights, Xb, yb):\n    # y in {0,1}; score = P(1); MSE\n    scores = predict_proba_batch(Xb, weights)\n    return float(np.mean((scores - yb) ** 2))\n\n\nrng = np.random.RandomState(0)\nweights = rng.uniform(0, np.pi, size=N_QUBITS)\nprint(f\"Eğitim başlıyor | mode={BACKEND_MODE} | max_iter={MAX_ITER} | batch={BATCH_EVAL}\")\n\nhistory = []\nstep = 0.35\nfor it in range(MAX_ITER):\n    # mini-batch\n    idx = rng.choice(len(X_train_q), size=BATCH_EVAL, replace=False)\n    Xb, yb = X_train_q[idx], y_train_q[idx]\n    c0 = cost(weights, Xb, yb)\n    history.append(c0)\n    # basit sayısal gradyan (kotayı korumak için kaba)\n    grad = np.zeros_like(weights)\n    eps = 0.15\n    for i in range(len(weights)):\n        w2 = weights.copy()\n        w2[i] += eps\n        grad[i] = (cost(w2, Xb, yb) - c0) / eps\n    weights = weights - step * grad\n    weights = np.clip(weights, 0, 2 * np.pi)\n    print(f\"  iter {it+1}/{MAX_ITER}  cost={c0:.4f}\")\n\nprint(\"Eğitim bitti.\")\nplt.figure(figsize=(6, 3))\nplt.plot(history, marker=\"o\")\nplt.title(f\"Cost ({BACKEND_MODE})\")\nplt.xlabel(\"iter\"); plt.ylabel(\"MSE\"); plt.grid(True)\nplt.show()\n\n"
  },
  {
   "cell_type": "markdown",
   "id": "s7md",
   "metadata": {
    "id": "s7md"
   },
   "source": "## AŞAMA 7: Değerlendirme\n"
  },
  {
   "cell_type": "code",
   "execution_count": 7,
   "id": "s7code",
   "metadata": {
    "colab": {
     "base_uri": "https://localhost:8080/"
    },
    "id": "s7code",
    "executionInfo": {
     "status": "ok",
     "timestamp": 1788523194721,
     "user_tz": -180,
     "elapsed": 9918,
     "user": {
      "displayName": "Joseph Volkan ÖZCAN",
      "userId": "11389530967736397480"
     }
    },
    "outputId": "f6c0002a-1e10-402d-ac91-4239c49f6c87"
   },
   "outputs": [
    {
     "output_type": "stream",
     "name": "stdout",
     "text": [
      "   chip run fallback local: Quantum computer under maintenance. Please try again later.\n",
      "   chip run fallback local: Quantum computer under maintenance. Please try again later.\n",
      "   chip run fallback local: Quantum computer under maintenance. Please try again later.\n",
      "   chip run fallback local: Quantum computer under maintenance. Please try again later.\n",
      "   chip run fallback local: Quantum computer under maintenance. Please try again later.\n",
      "   chip run fallback local: Quantum computer under maintenance. Please try again later.\n",
      "   chip run fallback local: Quantum computer under maintenance. Please try again later.\n",
      "   chip run fallback local: Quantum computer under maintenance. Please try again later.\n",
      "   chip run fallback local: Quantum computer under maintenance. Please try again later.\n",
      "   chip run fallback local: Quantum computer under maintenance. Please try again later.\n",
      "   chip run fallback local: Quantum computer under maintenance. Please try again later.\n",
      "   chip run fallback local: Quantum computer under maintenance. Please try again later.\n",
      "   chip run fallback local: Quantum computer under maintenance. Please try again later.\n",
      "   chip run fallback local: Quantum computer under maintenance. Please try again later.\n",
      "   chip run fallback local: Quantum computer under maintenance. Please try again later.\n",
      "   chip run fallback local: Quantum computer under maintenance. Please try again later.\n",
      "=== Quantum VQC-like (wukong) | n_qubits=4 ===\n",
      "  accuracy    : 0.5000\n",
      "  precision   : 0.5000\n",
      "  recall      : 1.0000\n",
      "  f1          : 0.6667\n",
      "  roc_auc     : 0.3750\n",
      "              precision    recall  f1-score   support\n",
      "\n",
      "           0      0.000     0.000     0.000         8\n",
      "           1      0.500     1.000     0.667         8\n",
      "\n",
      "    accuracy                          0.500        16\n",
      "   macro avg      0.250     0.500     0.333        16\n",
      "weighted avg      0.250     0.500     0.333        16\n",
      "\n",
      "\n",
      "=== Klasik Logistic Regression ===\n",
      "  accuracy    : 0.6627\n",
      "  precision   : 0.1457\n",
      "  recall      : 0.6536\n",
      "  f1          : 0.2383\n",
      "  roc_auc     : 0.7138\n",
      "✅ JSON: /content/wukong_outputs/wukong_summary_20260904_115954.json\n",
      "✅ CSV : /content/wukong_outputs/wukong_metrics_20260904_115954.csv\n",
      "✅ AŞAMA 7 tamamlandı.\n"
     ]
    }
   ],
   "source": "# ============================================================\n# AŞAMA 7: Değerlendirme + sonuç kaydı\n# ============================================================\nimport os, json\nfrom datetime import datetime\nfrom sklearn.metrics import (\n    accuracy_score, roc_auc_score, precision_score, recall_score, f1_score,\n    classification_report, confusion_matrix, ConfusionMatrixDisplay\n)\n\nscores_te = predict_proba_batch(X_test_q, weights)\ny_pred = (scores_te >= 0.5).astype(int)\n\nq_metrics = {\n    \"accuracy\": float(accuracy_score(y_test_q, y_pred)),\n    \"precision\": float(precision_score(y_test_q, y_pred, zero_division=0)),\n    \"recall\": float(recall_score(y_test_q, y_pred, zero_division=0)),\n    \"f1\": float(f1_score(y_test_q, y_pred, zero_division=0)),\n    \"roc_auc\": float(roc_auc_score(y_test_q, scores_te)) if len(np.unique(y_test_q)) > 1 else float(\"nan\"),\n}\n\n# Klasik (AŞAMA 5'te eğitildiyse)\nclassical_metrics = {}\nif \"clf\" in globals() and \"ys_te\" in globals():\n    yp_c = clf.predict(Xs_te)\n    pr_c = clf.predict_proba(Xs_te)[:, 1]\n    classical_metrics = {\n        \"model\": \"Logistic Regression\",\n        \"accuracy\": float(accuracy_score(ys_te, yp_c)),\n        \"precision\": float(precision_score(ys_te, yp_c, zero_division=0)),\n        \"recall\": float(recall_score(ys_te, yp_c, zero_division=0)),\n        \"f1\": float(f1_score(ys_te, yp_c, zero_division=0)),\n        \"roc_auc\": float(roc_auc_score(ys_te, pr_c)),\n    }\n\nprint(f\"=== Quantum VQC-like ({BACKEND_MODE}) | n_qubits={N_QUBITS} ===\")\nfor k, v in q_metrics.items():\n    print(f\"  {k:12s}: {v:.4f}\" if v == v else f\"  {k:12s}: NaN\")\nprint(classification_report(y_test_q, y_pred, digits=3, zero_division=0))\n\nif classical_metrics:\n    print(f\"\\n=== Klasik {classical_metrics['model']} ===\")\n    for k in [\"accuracy\", \"precision\", \"recall\", \"f1\", \"roc_auc\"]:\n        print(f\"  {k:12s}: {classical_metrics[k]:.4f}\")\n\n# Görseller\nfig, axes = plt.subplots(1, 2, figsize=(11, 4))\ncm = confusion_matrix(y_test_q, y_pred)\nConfusionMatrixDisplay(cm, display_labels=[\"OK\", \"Default\"]).plot(ax=axes[0], colorbar=False)\naxes[0].set_title(f\"Quantum ({BACKEND_MODE})\")\nif \"history\" in globals() and history:\n    axes[1].plot(history, marker=\"o\")\n    axes[1].set_title(\"Training cost\")\n    axes[1].set_xlabel(\"iter\")\n    axes[1].set_ylabel(\"MSE\")\n    axes[1].grid(True)\nelse:\n    axes[1].axis(\"off\")\nplt.tight_layout()\nplt.show()\n\n# Kayıt\nrun_id = datetime.now().strftime(\"%Y%m%d_%H%M%S\")\nOUT = os.path.abspath(\"./wukong_outputs\")\nos.makedirs(OUT, exist_ok=True)\n\nsummary = {\n    \"run_id\": run_id,\n    \"backend_mode\": BACKEND_MODE,\n    \"n_qubits\": int(N_QUBITS),\n    \"shots\": int(SHOTS),\n    \"max_train\": int(MAX_TRAIN),\n    \"max_test\": int(MAX_TEST),\n    \"use_wukong_chip\": bool(USE_WUKONG_CHIP),\n    \"quantum_metrics\": q_metrics,\n    \"classical_metrics\": classical_metrics,\n    \"train_cost_history\": [float(x) for x in (history if \"history\" in globals() else [])],\n}\nsummary_path = os.path.join(OUT, f\"wukong_summary_{run_id}.json\")\nwith open(summary_path, \"w\") as f:\n    json.dump(summary, f, indent=2)\nprint(f\"✅ JSON: {summary_path}\")\n\n# CSV metrik\nrows = []\nif classical_metrics:\n    rows.append({\"type\": \"classical\", **{k: classical_metrics.get(k) for k in [\"model\", \"accuracy\", \"precision\", \"recall\", \"f1\", \"roc_auc\"]}})\nrows.append({\n    \"type\": \"quantum\",\n    \"model\": f\"VQC-like ({BACKEND_MODE})\",\n    \"accuracy\": q_metrics[\"accuracy\"],\n    \"precision\": q_metrics[\"precision\"],\n    \"recall\": q_metrics[\"recall\"],\n    \"f1\": q_metrics[\"f1\"],\n    \"roc_auc\": q_metrics[\"roc_auc\"],\n})\nmetrics_df = pd.DataFrame(rows)\nmetrics_path = os.path.join(OUT, f\"wukong_metrics_{run_id}.csv\")\nmetrics_df.to_csv(metrics_path, index=False)\nprint(f\"✅ CSV : {metrics_path}\")\nprint(\"✅ AŞAMA 7 tamamlandı.\")\n\n"
  },
  {
   "cell_type": "markdown",
   "id": "s8md",
   "metadata": {
    "id": "s8md"
   },
   "source": "## AŞAMA 8: Bağlantı testi (opsiyonel tek Bell / chip)\n\nToken varsa **tek** küçük devre ile Wukong erişimini doğrular.  \nEğitim döngüsü gibi onlarca job göndermez.\n"
  },
  {
   "cell_type": "code",
   "execution_count": 8,
   "id": "s8code",
   "metadata": {
    "colab": {
     "base_uri": "https://localhost:8080/"
    },
    "id": "s8code",
    "executionInfo": {
     "status": "ok",
     "timestamp": 1788523202057,
     "user_tz": -180,
     "elapsed": 21,
     "user": {
      "displayName": "Joseph Volkan ÖZCAN",
      "userId": "11389530967736397480"
     }
    },
    "outputId": "98957cb1-8f7b-48da-c5ff-12e626d95a12"
   },
   "outputs": [
    {
     "output_type": "stream",
     "name": "stdout",
     "text": [
      "Tek seferlik bağlantı / örnek devre testi...\n",
      "Yerel Bell counts: {'11': 102, '00': 98}\n",
      "Cloud backend nesnesi: <class 'pyqpanda3.qcloud.qcloud.QCloudBackend'>\n",
      "✅ Test hücresi tamam (ağır eğitim yok).\n",
      "✅ AŞAMA 8 / notebook sonu.\n"
     ]
    }
   ],
   "source": "if BACKEND_MODE == \"wukong\" and ORIGIN_API_TOKEN:\n    print(\"Tek seferlik bağlantı / örnek devre testi...\")\n    try:\n        if PY3:\n            from pyqpanda3.core import QProg, H, CNOT, measure, CPUQVM\n            prog = QProg()\n            prog << H(0) << CNOT(0, 1) << measure([0, 1], [0, 1])\n            # yerel doğrulama\n            qvm = CPUQVM()\n            qvm.run(prog, 200)\n            print(\"Yerel Bell counts:\", qvm.result().get_counts())\n            print(\"Cloud backend nesnesi:\", type(qcloud_machine))\n        else:\n            print(\"pyqpanda classic: token ile init edilmiş QCloud mevcut.\" if qcloud_machine else \"yok\")\n        print(\"✅ Test hücresi tamam (ağır eğitim yok).\")\n    except Exception as e:\n        print(\"Test hata:\", e)\nelse:\n    print(\"Simülatör modu — chip testi atlandı.\")\n    print(\"Wukong için: ORIGIN_API_TOKEN + USE_WUKONG_CHIP=True\")\n\nprint(\"✅ AŞAMA 8 / notebook sonu.\")\n\n"
  },
  {
   "cell_type": "markdown",
   "id": "s9md",
   "metadata": {
    "id": "s9md"
   },
   "source": "## AŞAMA 9: Word Raporu (quantum sonuçlarıyla)\n\nAŞAMA 7’deki metrikleri okuyup `wukong_outputs/HomeCredit_Wukong_QML_Raporu_<run_id>.docx` üretir.\nColab’da indirme dener.\n"
  },
  {
   "cell_type": "code",
   "execution_count": 9,
   "id": "s9code",
   "metadata": {
    "colab": {
     "base_uri": "https://localhost:8080/",
     "height": 68
    },
    "id": "s9code",
    "executionInfo": {
     "status": "ok",
     "timestamp": 1788523211261,
     "user_tz": -180,
     "elapsed": 3643,
     "user": {
      "displayName": "Joseph Volkan ÖZCAN",
      "userId": "11389530967736397480"
     }
    },
    "outputId": "5783a658-f90d-4163-98d8-a922e5c23582"
   },
   "outputs": [
    {
     "output_type": "stream",
     "name": "stdout",
     "text": [
      "✅ Word raporu: /content/wukong_outputs/HomeCredit_Wukong_QML_Raporu_20260904_115954.docx\n"
     ]
    },
    {
     "output_type": "display_data",
     "data": {
      "text/plain": [
       "<IPython.core.display.Javascript object>"
      ],
      "application/javascript": [
       "\n",
       "    async function download(id, filename, size) {\n",
       "      if (!google.colab.kernel.accessAllowed) {\n",
       "        return;\n",
       "      }\n",
       "      const div = document.createElement('div');\n",
       "      const label = document.createElement('label');\n",
       "      label.textContent = `Downloading \"${filename}\": `;\n",
       "      div.appendChild(label);\n",
       "      const progress = document.createElement('progress');\n",
       "      progress.max = size;\n",
       "      div.appendChild(progress);\n",
       "      document.body.appendChild(div);\n",
       "\n",
       "      const buffers = [];\n",
       "      let downloaded = 0;\n",
       "\n",
       "      const channel = await google.colab.kernel.comms.open(id);\n",
       "      // Send a message to notify the kernel that we're ready.\n",
       "      channel.send({})\n",
       "\n",
       "      for await (const message of channel.messages) {\n",
       "        // Send a message to notify the kernel that we're ready.\n",
       "        channel.send({})\n",
       "        if (message.buffers) {\n",
       "          for (const buffer of message.buffers) {\n",
       "            buffers.push(buffer);\n",
       "            downloaded += buffer.byteLength;\n",
       "            progress.value = downloaded;\n",
       "          }\n",
       "        }\n",
       "      }\n",
       "      const blob = new Blob(buffers, {type: 'application/binary'});\n",
       "      const a = document.createElement('a');\n",
       "      a.href = window.URL.createObjectURL(blob);\n",
       "      a.download = filename;\n",
       "      div.appendChild(a);\n",
       "      a.click();\n",
       "      div.remove();\n",
       "    }\n",
       "  "
      ]
     },
     "metadata": {}
    },
    {
     "output_type": "display_data",
     "data": {
      "text/plain": [
       "<IPython.core.display.Javascript object>"
      ],
      "application/javascript": [
       "download(\"download_b7c3b7fd-0058-4d8e-804d-2a029db449f2\", \"HomeCredit_Wukong_QML_Raporu_20260904_115954.docx\", 37991)"
      ]
     },
     "metadata": {}
    },
    {
     "output_type": "stream",
     "name": "stdout",
     "text": [
      "📥 İndirme başlatıldı.\n",
      "✅ AŞAMA 9 tamamlandı.\n"
     ]
    }
   ],
   "source": "# ============================================================\n# AŞAMA 9: Word raporu\n# ============================================================\n!pip install -q python-docx\n\nfrom docx import Document\nfrom docx.shared import Pt, RGBColor, Cm\nfrom docx.enum.text import WD_ALIGN_PARAGRAPH\nfrom docx.enum.table import WD_TABLE_ALIGNMENT\nfrom docx.oxml.ns import qn\nfrom docx.oxml import OxmlElement\nimport os\nfrom datetime import datetime\n\ndef _font(run, size=11, bold=False, color=(30, 41, 59), italic=False):\n    run.font.name = \"Calibri\"\n    run._element.rPr.rFonts.set(qn(\"w:eastAsia\"), \"Calibri\")\n    run.font.size = Pt(size)\n    run.bold = bold\n    run.italic = italic\n    run.font.color.rgb = RGBColor(*color)\n\ndef _shade(cell, hex_color):\n    tc = cell._tc\n    tcPr = tc.get_or_add_tcPr()\n    for child in list(tcPr):\n        if child.tag == qn(\"w:shd\"):\n            tcPr.remove(child)\n    shd = OxmlElement(\"w:shd\")\n    shd.set(qn(\"w:fill\"), hex_color)\n    shd.set(qn(\"w:val\"), \"clear\")\n    tcPr.append(shd)\n\ndef _h(doc, text, level=1):\n    p = doc.add_heading(text, level=level)\n    for r in p.runs:\n        _font(r, size=16 if level == 1 else 13, bold=True, color=(15, 23, 42) if level == 1 else (30, 58, 95))\n\ndef _p(doc, text, size=11, italic=False):\n    p = doc.add_paragraph()\n    p.paragraph_format.space_after = Pt(8)\n    p.paragraph_format.alignment = WD_ALIGN_PARAGRAPH.JUSTIFY\n    r = p.add_run(text)\n    _font(r, size=size, italic=italic)\n    return p\n\ndef _b(doc, text):\n    p = doc.add_paragraph(style=\"List Bullet\")\n    if p.runs:\n        p.runs[0].text = text\n        _font(p.runs[0], size=10.5)\n    else:\n        r = p.add_run(text)\n        _font(r, size=10.5)\n\ndef _fmt(v):\n    try:\n        if v is None or (isinstance(v, float) and v != v):\n            return \"—\"\n        return f\"{float(v):.4f}\"\n    except Exception:\n        return str(v)\n\n# Metrikler yoksa uyarı\nif \"q_metrics\" not in globals():\n    raise RuntimeError(\"q_metrics yok — önce AŞAMA 7'yi çalıştırın.\")\n\nrun_id_local = globals().get(\"run_id\", datetime.now().strftime(\"%Y%m%d_%H%M%S\"))\nOUT = globals().get(\"OUT\", os.path.abspath(\"./wukong_outputs\"))\nos.makedirs(OUT, exist_ok=True)\n\ndoc = Document()\nfor s in doc.sections:\n    s.top_margin = Cm(2)\n    s.bottom_margin = Cm(2)\n    s.left_margin = Cm(2.2)\n    s.right_margin = Cm(2.2)\n\nt = doc.add_paragraph()\nt.alignment = WD_ALIGN_PARAGRAPH.CENTER\nr = t.add_run(\"HOME CREDIT DEFAULT RISK\")\n_font(r, size=18, bold=True, color=(15, 23, 42))\n\nt2 = doc.add_paragraph()\nt2.alignment = WD_ALIGN_PARAGRAPH.CENTER\nr2 = t2.add_run(\"Origin Wukong / pyqpanda QML Raporu\")\n_font(r2, size=14, bold=True, color=(30, 58, 95))\n\nt3 = doc.add_paragraph()\nt3.alignment = WD_ALIGN_PARAGRAPH.CENTER\nr3 = t3.add_run(\n    f\"run_id={run_id_local} · backend={BACKEND_MODE} · n_qubits={N_QUBITS} · shots={SHOTS}\"\n)\n_font(r3, size=10, italic=True, color=(100, 116, 139))\n\n_h(doc, \"1. Problem\", 1)\n_p(doc, \"Home Credit Default Risk: başvuru sahibinin ödemede güçlük yaşayıp yaşamayacağı (TARGET 0/1). Default oranı yaklaşık %8. Bu notebook Origin Wukong API (veya yerel CPUQVM) ile küçük ölçekli VQC-benzeri sınıflandırma demosudur.\")\n\n_h(doc, \"2. Çalıştırma özeti\", 1)\n_b(doc, f\"Backend: {BACKEND_MODE}\")\n_b(doc, f\"USE_WUKONG_CHIP: {USE_WUKONG_CHIP}\")\n_b(doc, f\"n_qubits={N_QUBITS}, shots={SHOTS}, train/test subset={MAX_TRAIN}/{MAX_TEST}\")\n_b(doc, \"SDK: pyqpanda3 veya pyqpanda\")\n_b(doc, \"IBM kotası kullanılmaz (ayrı Qiskit notebook).\")\n\n_h(doc, \"3. Quantum sonuçları\", 1)\nheaders = [\"Metrik\", \"Değer\"]\ntable = doc.add_table(rows=1, cols=2)\ntable.style = \"Table Grid\"\nfor i, h in enumerate(headers):\n    table.rows[0].cells[i].text = \"\"\n    run = table.rows[0].cells[i].paragraphs[0].add_run(h)\n    _font(run, size=10, bold=True, color=(255, 255, 255))\n    _shade(table.rows[0].cells[i], \"065F46\")\nfor k in [\"accuracy\", \"precision\", \"recall\", \"f1\", \"roc_auc\"]:\n    row = table.add_row().cells\n    row[0].text = \"\"\n    row[1].text = \"\"\n    r0 = row[0].paragraphs[0].add_run(k)\n    r1 = row[1].paragraphs[0].add_run(_fmt(q_metrics.get(k)))\n    _font(r0, size=10)\n    _font(r1, size=10)\n    _shade(row[0], \"ECFDF5\")\n    _shade(row[1], \"ECFDF5\")\n\nif classical_metrics:\n    _h(doc, \"4. Klasik baseline\", 1)\n    ct = doc.add_table(rows=1, cols=2)\n    ct.style = \"Table Grid\"\n    for i, h in enumerate(headers):\n        ct.rows[0].cells[i].text = \"\"\n        run = ct.rows[0].cells[i].paragraphs[0].add_run(h)\n        _font(run, size=10, bold=True, color=(255, 255, 255))\n        _shade(ct.rows[0].cells[i], \"1E3A5F\")\n    for k in [\"model\", \"accuracy\", \"precision\", \"recall\", \"f1\", \"roc_auc\"]:\n        if k not in classical_metrics:\n            continue\n        row = ct.add_row().cells\n        row[0].text = \"\"\n        row[1].text = \"\"\n        r0 = row[0].paragraphs[0].add_run(k)\n        val = classical_metrics[k] if k == \"model\" else _fmt(classical_metrics[k])\n        r1 = row[1].paragraphs[0].add_run(str(val))\n        _font(r0, size=10)\n        _font(r1, size=10)\n\n_h(doc, \"5. Yorum\", 1)\n_p(doc, \"Quantum metrikler küçük stratified subset üzerindedir; production benchmark değildir. Chip modunda düşük iterasyon kotayı korur. Klasik modeller geniş test setinde referans sağlar.\")\n_b(doc, \"Geliştirme: USE_WUKONG_CHIP=False (CPUQVM)\")\n_b(doc, \"Gerçek Wukong: token + USE_WUKONG_CHIP=True, az shot/iter\")\n_b(doc, \"IBM free süre bu notebook'ta harcanmaz\")\n\n_h(doc, \"6. Referanslar\", 1)\n_b(doc, \"Origin Quantum Cloud: https://qcloud.originqc.com.cn\")\n_b(doc, \"Kaggle Home Credit Default Risk\")\n_b(doc, \"pyqpanda / pyqpanda3\")\n\nend = doc.add_paragraph()\nend.alignment = WD_ALIGN_PARAGRAPH.CENTER\ner = end.add_run(\"— Wukong notebook AŞAMA 9 —\")\n_font(er, size=10, italic=True, color=(148, 163, 184))\n\nreport_path = os.path.join(OUT, f\"HomeCredit_Wukong_QML_Raporu_{run_id_local}.docx\")\ndoc.save(report_path)\nprint(f\"✅ Word raporu: {report_path}\")\n\ntry:\n    from google.colab import files\n    files.download(report_path)\n    print(\"📥 İndirme başlatıldı.\")\nexcept Exception:\n    print(\"   (Colab download yok — dosya wukong_outputs/ altında)\")\n\nprint(\"✅ AŞAMA 9 tamamlandı.\")\n\n"
  },
  {
   "cell_type": "markdown",
   "id": "close",
   "metadata": {
    "id": "close"
   },
   "source": "## Kapanış\n\n| Çıktı | Konum |\n|-------|--------|\n| Metrik JSON | `wukong_outputs/wukong_summary_<run_id>.json` |\n| Metrik CSV | `wukong_outputs/wukong_metrics_<run_id>.csv` |\n| **Word rapor** | `wukong_outputs/HomeCredit_Wukong_QML_Raporu_<run_id>.docx` |\n\n**Sıra:** 1→9. Word için AŞAMA 7’den sonra **AŞAMA 9** zorunlu.\n\n- Simülatör: `USE_WUKONG_CHIP = False`\n- Wukong chip: token + `USE_WUKONG_CHIP = True`\n- IBM notebook ayrıdır; bu dosya Origin kotası kullanır (chip açıksa)\n\n**2026 · Origin Wukong Home Credit QML**\n"
  }
 ]
}