{
 "cells": [
  {
   "cell_type": "markdown",
   "id": "685e0ed5",
   "metadata": {
    "id": "685e0ed5"
   },
   "source": "# Quantum-Driven Adaptive Metasurface — Phase 1 Computational Benchmark\n\n**Purpose:** establish a reproducible 16-cell binary benchmark before coupling the framework to a full-wave EM solver.\n\nThis notebook intentionally uses a **synthetic but structured electromagnetic objective landscape**. It is not a physical claim and must not be interpreted as a substitute for CST/HFSS/COMSOL results.\n\n## Research questions\n\n1. Can the QUBO representation recover the global optimum on a small, exactly enumerable problem?\n2. How do simulated annealing and a genetic algorithm compare with exhaustive ground truth?\n3. How does a small-depth QAOA simulation perform on the same Hamiltonian?\n4. How does the optimization landscape change when the dielectric environment changes?\n5. Can the same optimization interface later accept a surrogate/full-wave EM objective without changing the benchmark logic?\n\n## Benchmark\n\n- 16 binary reconfigurable cells\n- 65,536 possible configurations\n- structured pairwise coupling + unary terms\n- three dielectric environments\n- exhaustive ground truth\n- simulated annealing\n- genetic algorithm\n- QUBO / Ising mapping\n- state-vector QAOA simulation\n- paper-ready metrics and plots\n"
  },
  {
   "cell_type": "code",
   "execution_count": 1,
   "id": "80a4c08e",
   "metadata": {
    "id": "80a4c08e",
    "executionInfo": {
     "status": "ok",
     "timestamp": 1787860513921,
     "user_tz": -180,
     "elapsed": 487,
     "user": {
      "displayName": "Joseph Volkan ÖZCAN",
      "userId": "11389530967736397480"
     }
    },
    "outputId": "e49bae44-6661-4d8d-ef55-eadef517d5dd",
    "colab": {
     "base_uri": "https://localhost:8080/"
    }
   },
   "outputs": [
    {
     "output_type": "stream",
     "name": "stdout",
     "text": [
      "N = 16\n",
      "Search space = 65536\n"
     ]
    }
   ],
   "source": "import numpy as np\nimport pandas as pd\nimport matplotlib.pyplot as plt\nfrom dataclasses import dataclass\nfrom time import perf_counter\n\nSEED = 42\nrng = np.random.default_rng(SEED)\nN = 16\n\nprint(\"N =\", N)\nprint(\"Search space =\", 2**N)\n\n\n# Set True to run the dependency-light 16-qubit state-vector QAOA sweep.\n# False keeps the default notebook execution fast and reproducible.\nRUN_QAOA = False\n"
  },
  {
   "cell_type": "markdown",
   "id": "e4e36a12",
   "metadata": {
    "id": "e4e36a12"
   },
   "source": "## 1. Structured synthetic EM landscape\n\nWe model the objective as\n\n\\[\nJ(x;\\epsilon_r)=x^TQx+c^Tx+c_0\n\\]\n\nwith binary cell states \\(x_i\\in\\{0,1\\}\\).\n\nThe matrix is constructed from:\n\n- local state preferences,\n- nearest-neighbor coupling,\n- longer-range coupling,\n- environment-dependent perturbations.\n\nLower \\(J\\) is better.\n\nThe structure is deliberately quadratic so that the exact problem has a valid QUBO representation while still exhibiting non-trivial interactions between cells.\n"
  },
  {
   "cell_type": "code",
   "execution_count": 2,
   "id": "70b36e49",
   "metadata": {
    "id": "70b36e49",
    "executionInfo": {
     "status": "ok",
     "timestamp": 1787860513942,
     "user_tz": -180,
     "elapsed": 14,
     "user": {
      "displayName": "Joseph Volkan ÖZCAN",
      "userId": "11389530967736397480"
     }
    },
    "outputId": "574458bd-b517-40fd-aed3-bda4bd4f820a",
    "colab": {
     "base_uri": "https://localhost:8080/"
    }
   },
   "outputs": [
    {
     "output_type": "stream",
     "name": "stdout",
     "text": [
      "E1 epsilon_r = 2.5 Q symmetric = True\n",
      "E2 epsilon_r = 4.0 Q symmetric = True\n",
      "E3 epsilon_r = 6.0 Q symmetric = True\n"
     ]
    }
   ],
   "source": "@dataclass\nclass Environment:\n    name: str\n    eps_r: float\n    loss_tangent: float\n\nENVIRONMENTS = [\n    Environment(\"E1\", 2.5, 0.010),\n    Environment(\"E2\", 4.0, 0.020),\n    Environment(\"E3\", 6.0, 0.035),\n]\n\ndef build_qubo(n=N, eps_r=4.0, loss_tangent=0.02, seed=123):\n    local_rng = np.random.default_rng(seed)\n    Q = np.zeros((n, n), dtype=float)\n\n    # Environment-dependent local preferences.\n    for i in range(n):\n        phase = 2*np.pi*i/n\n        Q[i, i] = (\n            0.20*np.cos(phase)\n            + 0.06*(eps_r - 4.0)\n            + 0.04*loss_tangent*100\n            + local_rng.normal(0, 0.03)\n        )\n\n    # Nearest-neighbor periodic coupling.\n    for i in range(n):\n        j = (i + 1) % n\n        coupling = -0.55 + 0.035*(eps_r - 4.0)\n        Q[i, j] += coupling\n        Q[j, i] += coupling\n\n    # Next-nearest-neighbor interaction.\n    for i in range(n):\n        j = (i + 2) % n\n        coupling = 0.18 - 0.015*(eps_r - 4.0)\n        Q[i, j] += coupling\n        Q[j, i] += coupling\n\n    # Weak long-range structured coupling.\n    for i in range(n):\n        for j in range(i+3, n):\n            d = min(abs(i-j), n-abs(i-j))\n            if d in (4, 5, 6):\n                value = 0.035*np.cos(2*np.pi*d/n)\n                Q[i, j] += value\n                Q[j, i] += value\n\n    # Small random perturbation prevents excessive symmetry.\n    noise = local_rng.normal(0, 0.012, size=(n, n))\n    noise = (noise + noise.T)/2\n    Q += noise\n\n    # A global constant is unnecessary for optimization.\n    return Q\n\ndef qubo_energy(x, Q):\n    x = np.asarray(x, dtype=float)\n    return float(x @ Q @ x)\n\nQ_by_env = {\n    env.name: build_qubo(N, env.eps_r, env.loss_tangent, seed=100+idx)\n    for idx, env in enumerate(ENVIRONMENTS)\n}\n\nfor env in ENVIRONMENTS:\n    print(env.name, \"epsilon_r =\", env.eps_r, \"Q symmetric =\", np.allclose(Q_by_env[env.name], Q_by_env[env.name].T))\n"
  },
  {
   "cell_type": "markdown",
   "id": "478083da",
   "metadata": {
    "id": "478083da"
   },
   "source": "## 2. Exact ground truth\n\nFor \\(N=16\\), exhaustive enumeration is practical:\n\n\\[\n2^{16}=65,536.\n\\]\n\nThis gives the exact minimum energy against which all heuristics and quantum methods can be measured.\n"
  },
  {
   "cell_type": "code",
   "execution_count": 3,
   "id": "628136c8",
   "metadata": {
    "id": "628136c8",
    "executionInfo": {
     "status": "ok",
     "timestamp": 1787860515647,
     "user_tz": -180,
     "elapsed": 1703,
     "user": {
      "displayName": "Joseph Volkan ÖZCAN",
      "userId": "11389530967736397480"
     }
    },
    "outputId": "3b304cf3-8f28-455c-a4dd-b45f8976942b",
    "colab": {
     "base_uri": "https://localhost:8080/"
    }
   },
   "outputs": [
    {
     "output_type": "stream",
     "name": "stdout",
     "text": [
      "E1 ground-state energy: -14.593127 state: 1111111111111111\n",
      "E2 ground-state energy: -12.102127 state: 1111111111111111\n",
      "E3 ground-state energy: -7.740218 state: 1111111111111111\n"
     ]
    }
   ],
   "source": "def bits_from_int(k, n=N):\n    return np.array([(k >> i) & 1 for i in range(n)], dtype=np.int8)\n\ndef exhaustive_optimum(Q):\n    best_e = np.inf\n    best_x = None\n    energies = np.empty(2**N)\n\n    for k in range(2**N):\n        x = bits_from_int(k)\n        e = qubo_energy(x, Q)\n        energies[k] = e\n        if e < best_e:\n            best_e, best_x = e, x.copy()\n\n    return best_x, best_e, energies\n\nground_truth = {}\nfor env in ENVIRONMENTS:\n    x_star, e_star, energies = exhaustive_optimum(Q_by_env[env.name])\n    ground_truth[env.name] = {\"x\": x_star, \"energy\": e_star, \"energies\": energies}\n    print(env.name, \"ground-state energy:\", round(e_star, 6), \"state:\", \"\".join(map(str, x_star)))\n"
  },
  {
   "cell_type": "markdown",
   "id": "972f81e6",
   "metadata": {
    "id": "972f81e6"
   },
   "source": "## 3. Classical baseline A — simulated annealing\n\nWe use a binary single-bit-flip simulated annealing implementation.\n\nThe goal is not to optimize this implementation aggressively; the goal is to establish a transparent and reproducible baseline with the same objective function used by the quantum methods.\n"
  },
  {
   "cell_type": "code",
   "execution_count": 4,
   "id": "3adb915f",
   "metadata": {
    "id": "3adb915f",
    "executionInfo": {
     "status": "ok",
     "timestamp": 1787860515658,
     "user_tz": -180,
     "elapsed": 7,
     "user": {
      "displayName": "Joseph Volkan ÖZCAN",
      "userId": "11389530967736397480"
     }
    }
   },
   "outputs": [],
   "source": "def simulated_annealing(Q, n=N, steps=5000, T0=1.5, Tend=0.001, seed=42):\n    local_rng = np.random.default_rng(seed)\n    x = local_rng.integers(0, 2, size=n, dtype=np.int8)\n    e = qubo_energy(x, Q)\n    best_x, best_e = x.copy(), e\n\n    for step in range(steps):\n        alpha = step / max(steps - 1, 1)\n        T = T0 * (Tend/T0)**alpha\n\n        i = local_rng.integers(0, n)\n        y = x.copy()\n        y[i] ^= 1\n        e_new = qubo_energy(y, Q)\n        delta = e_new - e\n\n        if delta <= 0 or local_rng.random() < np.exp(-delta / max(T, 1e-12)):\n            x, e = y, e_new\n\n        if e < best_e:\n            best_x, best_e = x.copy(), e\n\n    return best_x, best_e\n"
  },
  {
   "cell_type": "markdown",
   "id": "c51eebd3",
   "metadata": {
    "id": "c51eebd3"
   },
   "source": "## 4. Classical baseline B — genetic algorithm\n"
  },
  {
   "cell_type": "code",
   "execution_count": 5,
   "id": "d8606f2a",
   "metadata": {
    "id": "d8606f2a",
    "executionInfo": {
     "status": "ok",
     "timestamp": 1787860515695,
     "user_tz": -180,
     "elapsed": 9,
     "user": {
      "displayName": "Joseph Volkan ÖZCAN",
      "userId": "11389530967736397480"
     }
    }
   },
   "outputs": [],
   "source": "def genetic_algorithm(Q, n=N, population_size=80, generations=150, mutation_rate=0.03, seed=42):\n    local_rng = np.random.default_rng(seed)\n    pop = local_rng.integers(0, 2, size=(population_size, n), dtype=np.int8)\n\n    def fitness(population):\n        return np.array([qubo_energy(x, Q) for x in population])\n\n    best_x, best_e = None, np.inf\n\n    for _ in range(generations):\n        energies = fitness(pop)\n        order = np.argsort(energies)\n        pop = pop[order]\n        energies = energies[order]\n\n        if energies[0] < best_e:\n            best_x, best_e = pop[0].copy(), energies[0]\n\n        elite_count = max(2, population_size // 8)\n        elites = pop[:elite_count]\n\n        children = []\n        while len(children) < population_size - elite_count:\n            p1 = elites[local_rng.integers(0, elite_count)]\n            p2 = elites[local_rng.integers(0, elite_count)]\n            point = local_rng.integers(1, n)\n            child = np.concatenate([p1[:point], p2[point:]]).copy()\n\n            mutation = local_rng.random(n) < mutation_rate\n            child[mutation] ^= 1\n            children.append(child)\n\n        pop = np.vstack([elites, np.array(children, dtype=np.int8)])\n\n    return best_x, best_e\n"
  },
  {
   "cell_type": "markdown",
   "id": "c22b8599",
   "metadata": {
    "id": "c22b8599"
   },
   "source": "## 5. QUBO → Ising conversion\n\nFor binary variables:\n\n\\[\nx_i = \\frac{1-z_i}{2}, \\qquad z_i\\in\\{-1,+1\\}.\n\\]\n\nThe resulting Ising Hamiltonian has the form\n\n\\[\nH(z)=\\sum_i h_i Z_i+\\sum_{i<j}J_{ij}Z_iZ_j + C.\n\\]\n\nThe constant does not affect the optimizer.\n"
  },
  {
   "cell_type": "code",
   "execution_count": 6,
   "id": "33bac583",
   "metadata": {
    "id": "33bac583",
    "executionInfo": {
     "status": "ok",
     "timestamp": 1787860515718,
     "user_tz": -180,
     "elapsed": 19,
     "user": {
      "displayName": "Joseph Volkan ÖZCAN",
      "userId": "11389530967736397480"
     }
    },
    "outputId": "24038b48-8fc9-4202-b8e5-9c825d29505e",
    "colab": {
     "base_uri": "https://localhost:8080/"
    }
   },
   "outputs": [
    {
     "output_type": "stream",
     "name": "stdout",
     "text": [
      "E1 QUBO = -14.593127 Ising + constant = -14.468794\n",
      "E2 QUBO = -12.102127 Ising + constant = -12.411095\n",
      "E3 QUBO = -7.740218 Ising + constant = -8.820594\n"
     ]
    }
   ],
   "source": "def qubo_to_ising(Q):\n    Q = np.asarray(Q, dtype=float)\n    n = Q.shape[0]\n\n    h = np.zeros(n)\n    J = np.zeros((n, n))\n    constant = 0.0\n\n    # x_i = (1 - z_i)/2\n    # x^T Q x for symmetric Q.\n    constant += 0.25 * np.sum(Q)\n\n    # Linear terms from diagonal and off-diagonal contributions.\n    for i in range(n):\n        h[i] -= 0.5 * Q[i, i]\n        for j in range(i+1, n):\n            qij = Q[i, j] + Q[j, i]\n            h[i] -= 0.25 * qij\n            h[j] -= 0.25 * qij\n            J[i, j] += 0.25 * qij\n            J[j, i] = J[i, j]\n\n    return h, J, constant\n\ndef ising_energy(z, h, J):\n    z = np.asarray(z, dtype=float)\n    e = float(h @ z)\n    for i in range(len(z)):\n        for j in range(i+1, len(z)):\n            e += J[i, j] * z[i] * z[j]\n    return e\n\nfor env in ENVIRONMENTS:\n    h, J, c = qubo_to_ising(Q_by_env[env.name])\n    x_star = ground_truth[env.name][\"x\"]\n    z_star = 1 - 2*x_star\n    print(env.name,\n          \"QUBO =\", round(qubo_energy(x_star, Q_by_env[env.name]), 6),\n          \"Ising + constant =\", round(ising_energy(z_star, h, J) + c, 6))\n"
  },
  {
   "cell_type": "markdown",
   "id": "ebaea518",
   "metadata": {
    "id": "ebaea518"
   },
   "source": "## 6. Small-depth QAOA simulator\n\nThis is a dependency-light state-vector implementation for the 16-qubit proof-of-concept.\n\nIt applies:\n\n- the cost phase \\(e^{-i\\gamma H_C}\\),\n- the X-rotation mixer \\(e^{-i\beta X}\\),\n\nfor depth \\(p\\).\n\nThe implementation is intentionally transparent and is not intended to replace a hardware SDK implementation. The same Ising Hamiltonian can later be sent to Qiskit, PennyLane, Quantinuum, IonQ, Rigetti, etc.\n"
  },
  {
   "cell_type": "code",
   "execution_count": 7,
   "id": "8f115861",
   "metadata": {
    "id": "8f115861",
    "executionInfo": {
     "status": "ok",
     "timestamp": 1787860515734,
     "user_tz": -180,
     "elapsed": 12,
     "user": {
      "displayName": "Joseph Volkan ÖZCAN",
      "userId": "11389530967736397480"
     }
    }
   },
   "outputs": [],
   "source": "def bit_z(bit):\n    return 1.0 if bit == 0 else -1.0\n\ndef ising_spectrum(h, J):\n    n = len(h)\n    dim = 2**n\n    energies = np.zeros(dim)\n    for k in range(dim):\n        z = np.array([1 if ((k >> i) & 1) == 0 else -1 for i in range(n)], dtype=float)\n        energies[k] = ising_energy(z, h, J)\n    return energies\n\ndef apply_cost_phase(state, cost_energies, gamma):\n    return state * np.exp(-1j * gamma * cost_energies)\n\ndef apply_single_qubit_rx(state, beta, qubit, n):\n    out = state.copy()\n    dim = 2**n\n    c = np.cos(beta)\n    s = -1j*np.sin(beta)\n    step = 2**qubit\n    for base in range(0, dim, 2*step):\n        for offset in range(step):\n            i0 = base + offset\n            i1 = i0 + step\n            a, b = state[i0], state[i1]\n            out[i0] = c*a + s*b\n            out[i1] = s*a + c*b\n    return out\n\ndef qaoa_state(h, J, gammas, betas):\n    n = len(h)\n    dim = 2**n\n    state = np.ones(dim, dtype=complex) / np.sqrt(dim)\n    cost = ising_spectrum(h, J)\n\n    for gamma, beta in zip(gammas, betas):\n        state = apply_cost_phase(state, cost, gamma)\n        for q in range(n):\n            state = apply_single_qubit_rx(state, beta, q, n)\n    return state\n\ndef qaoa_expectation(h, J, gammas, betas):\n    state = qaoa_state(h, J, gammas, betas)\n    cost = ising_spectrum(h, J)\n    probs = np.abs(state)**2\n    return float(probs @ cost)\n\ndef random_qaoa_search(h, J, depth=1, samples=12, seed=42):\n    local_rng = np.random.default_rng(seed)\n    best = (np.inf, None, None)\n\n    for _ in range(samples):\n        gammas = local_rng.uniform(-np.pi, np.pi, depth)\n        betas = local_rng.uniform(-np.pi/2, np.pi/2, depth)\n        value = qaoa_expectation(h, J, gammas, betas)\n        if value < best[0]:\n            best = (value, gammas.copy(), betas.copy())\n\n    return best\n\ndef most_probable_qaoa_solution(h, J, gammas, betas):\n    state = qaoa_state(h, J, gammas, betas)\n    probs = np.abs(state)**2\n    index = int(np.argmax(probs))\n    x = bits_from_int(index, len(h))\n    return x, float(probs[index]), float(ising_spectrum(h, J)[index])\n"
  },
  {
   "cell_type": "markdown",
   "id": "1a52f054",
   "metadata": {
    "id": "1a52f054"
   },
   "source": "## 7. Run the complete benchmark\n\nFor reproducibility, each classical method uses a fixed seed. QAOA uses a bounded random parameter search so that the notebook remains dependency-light.\n\nFor publication, this section should later be upgraded to multi-seed statistical runs and hardware backends.\n\n\n**Runtime note:** `RUN_QAOA=False` by default. Enable it after the classical benchmark is validated, or replace the local state-vector implementation with a Qiskit/PennyLane backend for scalable experiments.\n"
  },
  {
   "cell_type": "code",
   "execution_count": 8,
   "id": "0d9fb603",
   "metadata": {
    "id": "0d9fb603",
    "executionInfo": {
     "status": "ok",
     "timestamp": 1787860516815,
     "user_tz": -180,
     "elapsed": 1076,
     "user": {
      "displayName": "Joseph Volkan ÖZCAN",
      "userId": "11389530967736397480"
     }
    },
    "outputId": "0fb8a757-0734-4d41-bd7c-061e3aaf4ca4",
    "colab": {
     "base_uri": "https://localhost:8080/",
     "height": 421
    }
   },
   "outputs": [
    {
     "output_type": "execute_result",
     "data": {
      "text/plain": [
       "   Environment               Method     Energy  Gap  Runtime_s\n",
       "0           E1           Exhaustive -14.593127  0.0        NaN\n",
       "1           E1  Simulated Annealing -14.593127  0.0   0.073073\n",
       "2           E1    Genetic Algorithm -14.593127  0.0   0.287463\n",
       "3           E1             QAOA p=1        NaN  NaN        NaN\n",
       "4           E2           Exhaustive -12.102127  0.0        NaN\n",
       "5           E2  Simulated Annealing -12.102127  0.0   0.070673\n",
       "6           E2    Genetic Algorithm -12.102127  0.0   0.257302\n",
       "7           E2             QAOA p=1        NaN  NaN        NaN\n",
       "8           E3           Exhaustive  -7.740218  0.0        NaN\n",
       "9           E3  Simulated Annealing  -7.740218  0.0   0.063897\n",
       "10          E3    Genetic Algorithm  -7.740218  0.0   0.249444\n",
       "11          E3             QAOA p=1        NaN  NaN        NaN"
      ],
      "text/html": [
       "\n",
       "  <div id=\"df-441aaaae-a271-46eb-907c-b81392a24826\" class=\"colab-df-container\">\n",
       "    <div>\n",
       "<style scoped>\n",
       "    .dataframe tbody tr th:only-of-type {\n",
       "        vertical-align: middle;\n",
       "    }\n",
       "\n",
       "    .dataframe tbody tr th {\n",
       "        vertical-align: top;\n",
       "    }\n",
       "\n",
       "    .dataframe thead th {\n",
       "        text-align: right;\n",
       "    }\n",
       "</style>\n",
       "<table border=\"1\" class=\"dataframe\">\n",
       "  <thead>\n",
       "    <tr style=\"text-align: right;\">\n",
       "      <th></th>\n",
       "      <th>Environment</th>\n",
       "      <th>Method</th>\n",
       "      <th>Energy</th>\n",
       "      <th>Gap</th>\n",
       "      <th>Runtime_s</th>\n",
       "    </tr>\n",
       "  </thead>\n",
       "  <tbody>\n",
       "    <tr>\n",
       "      <th>0</th>\n",
       "      <td>E1</td>\n",
       "      <td>Exhaustive</td>\n",
       "      <td>-14.593127</td>\n",
       "      <td>0.0</td>\n",
       "      <td>NaN</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>1</th>\n",
       "      <td>E1</td>\n",
       "      <td>Simulated Annealing</td>\n",
       "      <td>-14.593127</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.073073</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>2</th>\n",
       "      <td>E1</td>\n",
       "      <td>Genetic Algorithm</td>\n",
       "      <td>-14.593127</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.287463</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>3</th>\n",
       "      <td>E1</td>\n",
       "      <td>QAOA p=1</td>\n",
       "      <td>NaN</td>\n",
       "      <td>NaN</td>\n",
       "      <td>NaN</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>4</th>\n",
       "      <td>E2</td>\n",
       "      <td>Exhaustive</td>\n",
       "      <td>-12.102127</td>\n",
       "      <td>0.0</td>\n",
       "      <td>NaN</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>5</th>\n",
       "      <td>E2</td>\n",
       "      <td>Simulated Annealing</td>\n",
       "      <td>-12.102127</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.070673</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>6</th>\n",
       "      <td>E2</td>\n",
       "      <td>Genetic Algorithm</td>\n",
       "      <td>-12.102127</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.257302</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>7</th>\n",
       "      <td>E2</td>\n",
       "      <td>QAOA p=1</td>\n",
       "      <td>NaN</td>\n",
       "      <td>NaN</td>\n",
       "      <td>NaN</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>8</th>\n",
       "      <td>E3</td>\n",
       "      <td>Exhaustive</td>\n",
       "      <td>-7.740218</td>\n",
       "      <td>0.0</td>\n",
       "      <td>NaN</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>9</th>\n",
       "      <td>E3</td>\n",
       "      <td>Simulated Annealing</td>\n",
       "      <td>-7.740218</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.063897</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>10</th>\n",
       "      <td>E3</td>\n",
       "      <td>Genetic Algorithm</td>\n",
       "      <td>-7.740218</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.249444</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>11</th>\n",
       "      <td>E3</td>\n",
       "      <td>QAOA p=1</td>\n",
       "      <td>NaN</td>\n",
       "      <td>NaN</td>\n",
       "      <td>NaN</td>\n",
       "    </tr>\n",
       "  </tbody>\n",
       "</table>\n",
       "</div>\n",
       "    <div class=\"colab-df-buttons\">\n",
       "\n",
       "  <div class=\"colab-df-container\">\n",
       "    <button class=\"colab-df-convert\" onclick=\"convertToInteractive('df-441aaaae-a271-46eb-907c-b81392a24826')\"\n",
       "            title=\"Convert this dataframe to an interactive table.\"\n",
       "            style=\"display:none;\">\n",
       "\n",
       "  <svg xmlns=\"http://www.w3.org/2000/svg\" height=\"24px\" viewBox=\"0 -960 960 960\">\n",
       "    <path d=\"M120-120v-720h720v720H120Zm60-500h600v-160H180v160Zm220 220h160v-160H400v160Zm0 220h160v-160H400v160ZM180-400h160v-160H180v160Zm440 0h160v-160H620v160ZM180-180h160v-160H180v160Zm440 0h160v-160H620v160Z\"/>\n",
       "  </svg>\n",
       "    </button>\n",
       "\n",
       "  <style>\n",
       "    .colab-df-container {\n",
       "      display:flex;\n",
       "      gap: 12px;\n",
       "    }\n",
       "\n",
       "    .colab-df-convert {\n",
       "      background-color: #E8F0FE;\n",
       "      border: none;\n",
       "      border-radius: 50%;\n",
       "      cursor: pointer;\n",
       "      display: none;\n",
       "      fill: #1967D2;\n",
       "      height: 32px;\n",
       "      padding: 0 0 0 0;\n",
       "      width: 32px;\n",
       "    }\n",
       "\n",
       "    .colab-df-convert:hover {\n",
       "      background-color: #E2EBFA;\n",
       "      box-shadow: 0px 1px 2px rgba(60, 64, 67, 0.3), 0px 1px 3px 1px rgba(60, 64, 67, 0.15);\n",
       "      fill: #174EA6;\n",
       "    }\n",
       "\n",
       "    .colab-df-buttons div {\n",
       "      margin-bottom: 4px;\n",
       "    }\n",
       "\n",
       "    [theme=dark] .colab-df-convert {\n",
       "      background-color: #3B4455;\n",
       "      fill: #D2E3FC;\n",
       "    }\n",
       "\n",
       "    [theme=dark] .colab-df-convert:hover {\n",
       "      background-color: #434B5C;\n",
       "      box-shadow: 0px 1px 3px 1px rgba(0, 0, 0, 0.15);\n",
       "      filter: drop-shadow(0px 1px 2px rgba(0, 0, 0, 0.3));\n",
       "      fill: #FFFFFF;\n",
       "    }\n",
       "  </style>\n",
       "\n",
       "    <script>\n",
       "      const buttonEl =\n",
       "        document.querySelector('#df-441aaaae-a271-46eb-907c-b81392a24826 button.colab-df-convert');\n",
       "      buttonEl.style.display =\n",
       "        google.colab.kernel.accessAllowed ? 'block' : 'none';\n",
       "\n",
       "      async function convertToInteractive(key) {\n",
       "        const element = document.querySelector('#df-441aaaae-a271-46eb-907c-b81392a24826');\n",
       "        const dataTable =\n",
       "          await google.colab.kernel.invokeFunction('convertToInteractive',\n",
       "                                                    [key], {});\n",
       "        if (!dataTable) return;\n",
       "\n",
       "        const docLinkHtml = 'Like what you see? Visit the ' +\n",
       "          '<a target=\"_blank\" href=https://colab.research.google.com/notebooks/data_table.ipynb>data table notebook</a>'\n",
       "          + ' to learn more about interactive tables.';\n",
       "        element.innerHTML = '';\n",
       "        dataTable['output_type'] = 'display_data';\n",
       "        await google.colab.output.renderOutput(dataTable, element);\n",
       "        const docLink = document.createElement('div');\n",
       "        docLink.innerHTML = docLinkHtml;\n",
       "        element.appendChild(docLink);\n",
       "      }\n",
       "    </script>\n",
       "  </div>\n",
       "\n",
       "\n",
       "  <div id=\"id_33751e21-cc42-4dcb-a239-969fdce9eef8\">\n",
       "    <style>\n",
       "      .colab-df-generate {\n",
       "        background-color: #E8F0FE;\n",
       "        border: none;\n",
       "        border-radius: 50%;\n",
       "        cursor: pointer;\n",
       "        display: none;\n",
       "        fill: #1967D2;\n",
       "        height: 32px;\n",
       "        padding: 0 0 0 0;\n",
       "        width: 32px;\n",
       "      }\n",
       "\n",
       "      .colab-df-generate:hover {\n",
       "        background-color: #E2EBFA;\n",
       "        box-shadow: 0px 1px 2px rgba(60, 64, 67, 0.3), 0px 1px 3px 1px rgba(60, 64, 67, 0.15);\n",
       "        fill: #174EA6;\n",
       "      }\n",
       "\n",
       "      [theme=dark] .colab-df-generate {\n",
       "        background-color: #3B4455;\n",
       "        fill: #D2E3FC;\n",
       "      }\n",
       "\n",
       "      [theme=dark] .colab-df-generate:hover {\n",
       "        background-color: #434B5C;\n",
       "        box-shadow: 0px 1px 3px 1px rgba(0, 0, 0, 0.15);\n",
       "        filter: drop-shadow(0px 1px 2px rgba(0, 0, 0, 0.3));\n",
       "        fill: #FFFFFF;\n",
       "      }\n",
       "    </style>\n",
       "    <button class=\"colab-df-generate\" onclick=\"generateWithVariable('results_df')\"\n",
       "            title=\"Generate code using this dataframe.\"\n",
       "            style=\"display:none;\">\n",
       "\n",
       "  <svg xmlns=\"http://www.w3.org/2000/svg\" height=\"24px\"viewBox=\"0 0 24 24\"\n",
       "       width=\"24px\">\n",
       "    <path d=\"M7,19H8.4L18.45,9,17,7.55,7,17.6ZM5,21V16.75L18.45,3.32a2,2,0,0,1,2.83,0l1.4,1.43a1.91,1.91,0,0,1,.58,1.4,1.91,1.91,0,0,1-.58,1.4L9.25,21ZM18.45,9,17,7.55Zm-12,3A5.31,5.31,0,0,0,4.9,8.1,5.31,5.31,0,0,0,1,6.5,5.31,5.31,0,0,0,4.9,4.9,5.31,5.31,0,0,0,6.5,1,5.31,5.31,0,0,0,8.1,4.9,5.31,5.31,0,0,0,12,6.5,5.46,5.46,0,0,0,6.5,12Z\"/>\n",
       "  </svg>\n",
       "    </button>\n",
       "    <script>\n",
       "      (() => {\n",
       "      const buttonEl =\n",
       "        document.querySelector('#id_33751e21-cc42-4dcb-a239-969fdce9eef8 button.colab-df-generate');\n",
       "      buttonEl.style.display =\n",
       "        google.colab.kernel.accessAllowed ? 'block' : 'none';\n",
       "\n",
       "      buttonEl.onclick = () => {\n",
       "        google.colab.notebook.generateWithVariable('results_df');\n",
       "      }\n",
       "      })();\n",
       "    </script>\n",
       "  </div>\n",
       "\n",
       "    </div>\n",
       "  </div>\n"
      ],
      "application/vnd.google.colaboratory.intrinsic+json": {
       "type": "dataframe",
       "variable_name": "results_df",
       "summary": "{\n  \"name\": \"results_df\",\n  \"rows\": 12,\n  \"fields\": [\n    {\n      \"column\": \"Environment\",\n      \"properties\": {\n        \"dtype\": \"category\",\n        \"num_unique_values\": 3,\n        \"samples\": [\n          \"E1\",\n          \"E2\",\n          \"E3\"\n        ],\n        \"semantic_type\": \"\",\n        \"description\": \"\"\n      }\n    },\n    {\n      \"column\": \"Method\",\n      \"properties\": {\n        \"dtype\": \"category\",\n        \"num_unique_values\": 4,\n        \"samples\": [\n          \"Simulated Annealing\",\n          \"QAOA p=1\",\n          \"Exhaustive\"\n        ],\n        \"semantic_type\": \"\",\n        \"description\": \"\"\n      }\n    },\n    {\n      \"column\": \"Energy\",\n      \"properties\": {\n        \"dtype\": \"number\",\n        \"std\": 3.004032501589077,\n        \"min\": -14.593127238467497,\n        \"max\": -7.740218288322012,\n        \"num_unique_values\": 3,\n        \"samples\": [\n          -14.593127238467497,\n          -12.102126809928329,\n          -7.740218288322012\n        ],\n        \"semantic_type\": \"\",\n        \"description\": \"\"\n      }\n    },\n    {\n      \"column\": \"Gap\",\n      \"properties\": {\n        \"dtype\": \"number\",\n        \"std\": 0.0,\n        \"min\": 0.0,\n        \"max\": 0.0,\n        \"num_unique_values\": 1,\n        \"samples\": [\n          0.0\n        ],\n        \"semantic_type\": \"\",\n        \"description\": \"\"\n      }\n    },\n    {\n      \"column\": \"Runtime_s\",\n      \"properties\": {\n        \"dtype\": \"number\",\n        \"std\": 0.10788345435863507,\n        \"min\": 0.06389710499999524,\n        \"max\": 0.28746331799999325,\n        \"num_unique_values\": 6,\n        \"samples\": [\n          0.07307328499999244\n        ],\n        \"semantic_type\": \"\",\n        \"description\": \"\"\n      }\n    }\n  ]\n}"
      }
     },
     "metadata": {},
     "execution_count": 8
    }
   ],
   "source": "def relative_gap(found, optimum):\n    return (found - optimum) / max(abs(optimum), 1e-12)\n\nrecords = []\n\nfor env_idx, env in enumerate(ENVIRONMENTS):\n    Q = Q_by_env[env.name]\n    optimum = ground_truth[env.name][\"energy\"]\n\n    # Simulated annealing\n    t0 = perf_counter()\n    sa_x, sa_e = simulated_annealing(Q, seed=SEED+env_idx)\n    sa_t = perf_counter() - t0\n\n    # Genetic algorithm\n    t0 = perf_counter()\n    ga_x, ga_e = genetic_algorithm(Q, seed=SEED+env_idx)\n    ga_t = perf_counter() - t0\n\n    # QAOA (optional; state-vector sweep is computationally heavier)\n    qaoa_qubo_e, qaoa_t = np.nan, np.nan\n    if RUN_QAOA:\n        h, J, constant = qubo_to_ising(Q)\n        t0 = perf_counter()\n        q_exp, gammas, betas = random_qaoa_search(h, J, depth=1, samples=12, seed=SEED+env_idx)\n        qaoa_x, qaoa_p, qaoa_ising = most_probable_qaoa_solution(h, J, gammas, betas)\n        qaoa_qubo_e = qubo_energy(qaoa_x, Q)\n        qaoa_t = perf_counter() - t0\n\n    records += [\n        {\"Environment\": env.name, \"Method\": \"Exhaustive\", \"Energy\": optimum, \"Gap\": 0.0, \"Runtime_s\": np.nan},\n        {\"Environment\": env.name, \"Method\": \"Simulated Annealing\", \"Energy\": sa_e, \"Gap\": relative_gap(sa_e, optimum), \"Runtime_s\": sa_t},\n        {\"Environment\": env.name, \"Method\": \"Genetic Algorithm\", \"Energy\": ga_e, \"Gap\": relative_gap(ga_e, optimum), \"Runtime_s\": ga_t},\n        {\"Environment\": env.name, \"Method\": \"QAOA p=1\", \"Energy\": qaoa_qubo_e, \"Gap\": relative_gap(qaoa_qubo_e, optimum), \"Runtime_s\": qaoa_t},\n    ]\n\nresults_df = pd.DataFrame(records)\nresults_df\n"
  },
  {
   "cell_type": "markdown",
   "id": "24a5017e",
   "metadata": {
    "id": "24a5017e"
   },
   "source": "## 8. Adaptive closed-loop demonstration\n\nThe optimizer is now exposed to three environments sequentially.\n\nAt each step we compute:\n\n- the optimum state,\n- state changes relative to the previous configuration,\n- the performance of keeping the previous configuration unchanged.\n\nThis is the first numerical demonstration of the paper's central idea:\n\n\\[\n\\epsilon_r(t)\\rightarrow x^*(t)\n\\]\n\nrather than one-time static design.\n"
  },
  {
   "cell_type": "code",
   "execution_count": 9,
   "id": "83b10ff4",
   "metadata": {
    "id": "83b10ff4",
    "executionInfo": {
     "status": "ok",
     "timestamp": 1787860516886,
     "user_tz": -180,
     "elapsed": 65,
     "user": {
      "displayName": "Joseph Volkan ÖZCAN",
      "userId": "11389530967736397480"
     }
    },
    "outputId": "f334a008-cf60-46f1-ae78-6c5dd583784e",
    "colab": {
     "base_uri": "https://localhost:8080/",
     "height": 142
    }
   },
   "outputs": [
    {
     "output_type": "execute_result",
     "data": {
      "text/plain": [
       "  Environment  epsilon_r  Optimal_Energy  Switch_Count_vs_Previous  \\\n",
       "0          E1        2.5      -14.593127                         0   \n",
       "1          E2        4.0      -12.102127                         0   \n",
       "2          E3        6.0       -7.740218                         0   \n",
       "\n",
       "   Retained_Previous_State_Energy  \n",
       "0                             NaN  \n",
       "1                      -12.102127  \n",
       "2                       -7.740218  "
      ],
      "text/html": [
       "\n",
       "  <div id=\"df-d135bcd7-f016-45f3-a043-b07cdeb2d506\" class=\"colab-df-container\">\n",
       "    <div>\n",
       "<style scoped>\n",
       "    .dataframe tbody tr th:only-of-type {\n",
       "        vertical-align: middle;\n",
       "    }\n",
       "\n",
       "    .dataframe tbody tr th {\n",
       "        vertical-align: top;\n",
       "    }\n",
       "\n",
       "    .dataframe thead th {\n",
       "        text-align: right;\n",
       "    }\n",
       "</style>\n",
       "<table border=\"1\" class=\"dataframe\">\n",
       "  <thead>\n",
       "    <tr style=\"text-align: right;\">\n",
       "      <th></th>\n",
       "      <th>Environment</th>\n",
       "      <th>epsilon_r</th>\n",
       "      <th>Optimal_Energy</th>\n",
       "      <th>Switch_Count_vs_Previous</th>\n",
       "      <th>Retained_Previous_State_Energy</th>\n",
       "    </tr>\n",
       "  </thead>\n",
       "  <tbody>\n",
       "    <tr>\n",
       "      <th>0</th>\n",
       "      <td>E1</td>\n",
       "      <td>2.5</td>\n",
       "      <td>-14.593127</td>\n",
       "      <td>0</td>\n",
       "      <td>NaN</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>1</th>\n",
       "      <td>E2</td>\n",
       "      <td>4.0</td>\n",
       "      <td>-12.102127</td>\n",
       "      <td>0</td>\n",
       "      <td>-12.102127</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>2</th>\n",
       "      <td>E3</td>\n",
       "      <td>6.0</td>\n",
       "      <td>-7.740218</td>\n",
       "      <td>0</td>\n",
       "      <td>-7.740218</td>\n",
       "    </tr>\n",
       "  </tbody>\n",
       "</table>\n",
       "</div>\n",
       "    <div class=\"colab-df-buttons\">\n",
       "\n",
       "  <div class=\"colab-df-container\">\n",
       "    <button class=\"colab-df-convert\" onclick=\"convertToInteractive('df-d135bcd7-f016-45f3-a043-b07cdeb2d506')\"\n",
       "            title=\"Convert this dataframe to an interactive table.\"\n",
       "            style=\"display:none;\">\n",
       "\n",
       "  <svg xmlns=\"http://www.w3.org/2000/svg\" height=\"24px\" viewBox=\"0 -960 960 960\">\n",
       "    <path d=\"M120-120v-720h720v720H120Zm60-500h600v-160H180v160Zm220 220h160v-160H400v160Zm0 220h160v-160H400v160ZM180-400h160v-160H180v160Zm440 0h160v-160H620v160ZM180-180h160v-160H180v160Zm440 0h160v-160H620v160Z\"/>\n",
       "  </svg>\n",
       "    </button>\n",
       "\n",
       "  <style>\n",
       "    .colab-df-container {\n",
       "      display:flex;\n",
       "      gap: 12px;\n",
       "    }\n",
       "\n",
       "    .colab-df-convert {\n",
       "      background-color: #E8F0FE;\n",
       "      border: none;\n",
       "      border-radius: 50%;\n",
       "      cursor: pointer;\n",
       "      display: none;\n",
       "      fill: #1967D2;\n",
       "      height: 32px;\n",
       "      padding: 0 0 0 0;\n",
       "      width: 32px;\n",
       "    }\n",
       "\n",
       "    .colab-df-convert:hover {\n",
       "      background-color: #E2EBFA;\n",
       "      box-shadow: 0px 1px 2px rgba(60, 64, 67, 0.3), 0px 1px 3px 1px rgba(60, 64, 67, 0.15);\n",
       "      fill: #174EA6;\n",
       "    }\n",
       "\n",
       "    .colab-df-buttons div {\n",
       "      margin-bottom: 4px;\n",
       "    }\n",
       "\n",
       "    [theme=dark] .colab-df-convert {\n",
       "      background-color: #3B4455;\n",
       "      fill: #D2E3FC;\n",
       "    }\n",
       "\n",
       "    [theme=dark] .colab-df-convert:hover {\n",
       "      background-color: #434B5C;\n",
       "      box-shadow: 0px 1px 3px 1px rgba(0, 0, 0, 0.15);\n",
       "      filter: drop-shadow(0px 1px 2px rgba(0, 0, 0, 0.3));\n",
       "      fill: #FFFFFF;\n",
       "    }\n",
       "  </style>\n",
       "\n",
       "    <script>\n",
       "      const buttonEl =\n",
       "        document.querySelector('#df-d135bcd7-f016-45f3-a043-b07cdeb2d506 button.colab-df-convert');\n",
       "      buttonEl.style.display =\n",
       "        google.colab.kernel.accessAllowed ? 'block' : 'none';\n",
       "\n",
       "      async function convertToInteractive(key) {\n",
       "        const element = document.querySelector('#df-d135bcd7-f016-45f3-a043-b07cdeb2d506');\n",
       "        const dataTable =\n",
       "          await google.colab.kernel.invokeFunction('convertToInteractive',\n",
       "                                                    [key], {});\n",
       "        if (!dataTable) return;\n",
       "\n",
       "        const docLinkHtml = 'Like what you see? Visit the ' +\n",
       "          '<a target=\"_blank\" href=https://colab.research.google.com/notebooks/data_table.ipynb>data table notebook</a>'\n",
       "          + ' to learn more about interactive tables.';\n",
       "        element.innerHTML = '';\n",
       "        dataTable['output_type'] = 'display_data';\n",
       "        await google.colab.output.renderOutput(dataTable, element);\n",
       "        const docLink = document.createElement('div');\n",
       "        docLink.innerHTML = docLinkHtml;\n",
       "        element.appendChild(docLink);\n",
       "      }\n",
       "    </script>\n",
       "  </div>\n",
       "\n",
       "\n",
       "  <div id=\"id_28494e19-ef92-4eba-aa02-980c18d4854d\">\n",
       "    <style>\n",
       "      .colab-df-generate {\n",
       "        background-color: #E8F0FE;\n",
       "        border: none;\n",
       "        border-radius: 50%;\n",
       "        cursor: pointer;\n",
       "        display: none;\n",
       "        fill: #1967D2;\n",
       "        height: 32px;\n",
       "        padding: 0 0 0 0;\n",
       "        width: 32px;\n",
       "      }\n",
       "\n",
       "      .colab-df-generate:hover {\n",
       "        background-color: #E2EBFA;\n",
       "        box-shadow: 0px 1px 2px rgba(60, 64, 67, 0.3), 0px 1px 3px 1px rgba(60, 64, 67, 0.15);\n",
       "        fill: #174EA6;\n",
       "      }\n",
       "\n",
       "      [theme=dark] .colab-df-generate {\n",
       "        background-color: #3B4455;\n",
       "        fill: #D2E3FC;\n",
       "      }\n",
       "\n",
       "      [theme=dark] .colab-df-generate:hover {\n",
       "        background-color: #434B5C;\n",
       "        box-shadow: 0px 1px 3px 1px rgba(0, 0, 0, 0.15);\n",
       "        filter: drop-shadow(0px 1px 2px rgba(0, 0, 0, 0.3));\n",
       "        fill: #FFFFFF;\n",
       "      }\n",
       "    </style>\n",
       "    <button class=\"colab-df-generate\" onclick=\"generateWithVariable('adaptive_df')\"\n",
       "            title=\"Generate code using this dataframe.\"\n",
       "            style=\"display:none;\">\n",
       "\n",
       "  <svg xmlns=\"http://www.w3.org/2000/svg\" height=\"24px\"viewBox=\"0 0 24 24\"\n",
       "       width=\"24px\">\n",
       "    <path d=\"M7,19H8.4L18.45,9,17,7.55,7,17.6ZM5,21V16.75L18.45,3.32a2,2,0,0,1,2.83,0l1.4,1.43a1.91,1.91,0,0,1,.58,1.4,1.91,1.91,0,0,1-.58,1.4L9.25,21ZM18.45,9,17,7.55Zm-12,3A5.31,5.31,0,0,0,4.9,8.1,5.31,5.31,0,0,0,1,6.5,5.31,5.31,0,0,0,4.9,4.9,5.31,5.31,0,0,0,6.5,1,5.31,5.31,0,0,0,8.1,4.9,5.31,5.31,0,0,0,12,6.5,5.46,5.46,0,0,0,6.5,12Z\"/>\n",
       "  </svg>\n",
       "    </button>\n",
       "    <script>\n",
       "      (() => {\n",
       "      const buttonEl =\n",
       "        document.querySelector('#id_28494e19-ef92-4eba-aa02-980c18d4854d button.colab-df-generate');\n",
       "      buttonEl.style.display =\n",
       "        google.colab.kernel.accessAllowed ? 'block' : 'none';\n",
       "\n",
       "      buttonEl.onclick = () => {\n",
       "        google.colab.notebook.generateWithVariable('adaptive_df');\n",
       "      }\n",
       "      })();\n",
       "    </script>\n",
       "  </div>\n",
       "\n",
       "    </div>\n",
       "  </div>\n"
      ],
      "application/vnd.google.colaboratory.intrinsic+json": {
       "type": "dataframe",
       "variable_name": "adaptive_df",
       "summary": "{\n  \"name\": \"adaptive_df\",\n  \"rows\": 3,\n  \"fields\": [\n    {\n      \"column\": \"Environment\",\n      \"properties\": {\n        \"dtype\": \"string\",\n        \"num_unique_values\": 3,\n        \"samples\": [\n          \"E1\",\n          \"E2\",\n          \"E3\"\n        ],\n        \"semantic_type\": \"\",\n        \"description\": \"\"\n      }\n    },\n    {\n      \"column\": \"epsilon_r\",\n      \"properties\": {\n        \"dtype\": \"number\",\n        \"std\": 1.755942292142123,\n        \"min\": 2.5,\n        \"max\": 6.0,\n        \"num_unique_values\": 3,\n        \"samples\": [\n          2.5,\n          4.0,\n          6.0\n        ],\n        \"semantic_type\": \"\",\n        \"description\": \"\"\n      }\n    },\n    {\n      \"column\": \"Optimal_Energy\",\n      \"properties\": {\n        \"dtype\": \"number\",\n        \"std\": 3.468757946893677,\n        \"min\": -14.593127238467497,\n        \"max\": -7.740218288322012,\n        \"num_unique_values\": 3,\n        \"samples\": [\n          -14.593127238467497,\n          -12.102126809928329,\n          -7.740218288322012\n        ],\n        \"semantic_type\": \"\",\n        \"description\": \"\"\n      }\n    },\n    {\n      \"column\": \"Switch_Count_vs_Previous\",\n      \"properties\": {\n        \"dtype\": \"number\",\n        \"std\": 0,\n        \"min\": 0,\n        \"max\": 0,\n        \"num_unique_values\": 1,\n        \"samples\": [\n          0\n        ],\n        \"semantic_type\": \"\",\n        \"description\": \"\"\n      }\n    },\n    {\n      \"column\": \"Retained_Previous_State_Energy\",\n      \"properties\": {\n        \"dtype\": \"number\",\n        \"std\": 3.084335094543215,\n        \"min\": -12.102126809928329,\n        \"max\": -7.740218288322012,\n        \"num_unique_values\": 2,\n        \"samples\": [\n          -7.740218288322012\n        ],\n        \"semantic_type\": \"\",\n        \"description\": \"\"\n      }\n    }\n  ]\n}"
      }
     },
     "metadata": {},
     "execution_count": 9
    }
   ],
   "source": "adaptive_rows = []\nprevious_x = None\n\nfor env in ENVIRONMENTS:\n    Q = Q_by_env[env.name]\n    x_star = ground_truth[env.name][\"x\"]\n    e_star = ground_truth[env.name][\"energy\"]\n\n    if previous_x is None:\n        switched = 0\n        retained_energy = np.nan\n    else:\n        switched = int(np.sum(previous_x != x_star))\n        retained_energy = qubo_energy(previous_x, Q)\n\n    adaptive_rows.append({\n        \"Environment\": env.name,\n        \"epsilon_r\": env.eps_r,\n        \"Optimal_Energy\": e_star,\n        \"Switch_Count_vs_Previous\": switched,\n        \"Retained_Previous_State_Energy\": retained_energy\n    })\n    previous_x = x_star.copy()\n\nadaptive_df = pd.DataFrame(adaptive_rows)\nadaptive_df\n"
  },
  {
   "cell_type": "markdown",
   "id": "3535b0f1",
   "metadata": {
    "id": "3535b0f1"
   },
   "source": "## 9. Metrics\n\nWe report three initial metrics:\n\n### Optimization gap\n\n\\[\nGap = \\frac{J_{method}-J^*}{|J^*|}\n\\]\n\n### State distance\n\n\\[\nD(x,y)=\\sum_i |x_i-y_i|\n\\]\n\n### Adaptation efficiency\n\nFor sequential operation:\n\n\\[\nAE =\n\\frac{\nJ(x_{old})-J(x_{new})\n}{\n1+D(x_{old},x_{new})\n}\n\\]\n\nThe denominator includes 1 to avoid division by zero.\n"
  },
  {
   "cell_type": "code",
   "execution_count": 10,
   "id": "bdcefb99",
   "metadata": {
    "id": "bdcefb99",
    "executionInfo": {
     "status": "ok",
     "timestamp": 1787860516953,
     "user_tz": -180,
     "elapsed": 64,
     "user": {
      "displayName": "Joseph Volkan ÖZCAN",
      "userId": "11389530967736397480"
     }
    },
    "outputId": "db23b1c5-f049-4ee7-a1e7-2bfdc5a0a758",
    "colab": {
     "base_uri": "https://localhost:8080/",
     "height": 142
    }
   },
   "outputs": [
    {
     "output_type": "execute_result",
     "data": {
      "text/plain": [
       "  Environment  epsilon_r  Hamming_Distance  Adaptation_Efficiency\n",
       "0          E1        2.5                 0                    NaN\n",
       "1          E2        4.0                 0                    0.0\n",
       "2          E3        6.0                 0                    0.0"
      ],
      "text/html": [
       "\n",
       "  <div id=\"df-e205337e-3d37-46aa-9e90-d1d7554cf5d3\" class=\"colab-df-container\">\n",
       "    <div>\n",
       "<style scoped>\n",
       "    .dataframe tbody tr th:only-of-type {\n",
       "        vertical-align: middle;\n",
       "    }\n",
       "\n",
       "    .dataframe tbody tr th {\n",
       "        vertical-align: top;\n",
       "    }\n",
       "\n",
       "    .dataframe thead th {\n",
       "        text-align: right;\n",
       "    }\n",
       "</style>\n",
       "<table border=\"1\" class=\"dataframe\">\n",
       "  <thead>\n",
       "    <tr style=\"text-align: right;\">\n",
       "      <th></th>\n",
       "      <th>Environment</th>\n",
       "      <th>epsilon_r</th>\n",
       "      <th>Hamming_Distance</th>\n",
       "      <th>Adaptation_Efficiency</th>\n",
       "    </tr>\n",
       "  </thead>\n",
       "  <tbody>\n",
       "    <tr>\n",
       "      <th>0</th>\n",
       "      <td>E1</td>\n",
       "      <td>2.5</td>\n",
       "      <td>0</td>\n",
       "      <td>NaN</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>1</th>\n",
       "      <td>E2</td>\n",
       "      <td>4.0</td>\n",
       "      <td>0</td>\n",
       "      <td>0.0</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>2</th>\n",
       "      <td>E3</td>\n",
       "      <td>6.0</td>\n",
       "      <td>0</td>\n",
       "      <td>0.0</td>\n",
       "    </tr>\n",
       "  </tbody>\n",
       "</table>\n",
       "</div>\n",
       "    <div class=\"colab-df-buttons\">\n",
       "\n",
       "  <div class=\"colab-df-container\">\n",
       "    <button class=\"colab-df-convert\" onclick=\"convertToInteractive('df-e205337e-3d37-46aa-9e90-d1d7554cf5d3')\"\n",
       "            title=\"Convert this dataframe to an interactive table.\"\n",
       "            style=\"display:none;\">\n",
       "\n",
       "  <svg xmlns=\"http://www.w3.org/2000/svg\" height=\"24px\" viewBox=\"0 -960 960 960\">\n",
       "    <path d=\"M120-120v-720h720v720H120Zm60-500h600v-160H180v160Zm220 220h160v-160H400v160Zm0 220h160v-160H400v160ZM180-400h160v-160H180v160Zm440 0h160v-160H620v160ZM180-180h160v-160H180v160Zm440 0h160v-160H620v160Z\"/>\n",
       "  </svg>\n",
       "    </button>\n",
       "\n",
       "  <style>\n",
       "    .colab-df-container {\n",
       "      display:flex;\n",
       "      gap: 12px;\n",
       "    }\n",
       "\n",
       "    .colab-df-convert {\n",
       "      background-color: #E8F0FE;\n",
       "      border: none;\n",
       "      border-radius: 50%;\n",
       "      cursor: pointer;\n",
       "      display: none;\n",
       "      fill: #1967D2;\n",
       "      height: 32px;\n",
       "      padding: 0 0 0 0;\n",
       "      width: 32px;\n",
       "    }\n",
       "\n",
       "    .colab-df-convert:hover {\n",
       "      background-color: #E2EBFA;\n",
       "      box-shadow: 0px 1px 2px rgba(60, 64, 67, 0.3), 0px 1px 3px 1px rgba(60, 64, 67, 0.15);\n",
       "      fill: #174EA6;\n",
       "    }\n",
       "\n",
       "    .colab-df-buttons div {\n",
       "      margin-bottom: 4px;\n",
       "    }\n",
       "\n",
       "    [theme=dark] .colab-df-convert {\n",
       "      background-color: #3B4455;\n",
       "      fill: #D2E3FC;\n",
       "    }\n",
       "\n",
       "    [theme=dark] .colab-df-convert:hover {\n",
       "      background-color: #434B5C;\n",
       "      box-shadow: 0px 1px 3px 1px rgba(0, 0, 0, 0.15);\n",
       "      filter: drop-shadow(0px 1px 2px rgba(0, 0, 0, 0.3));\n",
       "      fill: #FFFFFF;\n",
       "    }\n",
       "  </style>\n",
       "\n",
       "    <script>\n",
       "      const buttonEl =\n",
       "        document.querySelector('#df-e205337e-3d37-46aa-9e90-d1d7554cf5d3 button.colab-df-convert');\n",
       "      buttonEl.style.display =\n",
       "        google.colab.kernel.accessAllowed ? 'block' : 'none';\n",
       "\n",
       "      async function convertToInteractive(key) {\n",
       "        const element = document.querySelector('#df-e205337e-3d37-46aa-9e90-d1d7554cf5d3');\n",
       "        const dataTable =\n",
       "          await google.colab.kernel.invokeFunction('convertToInteractive',\n",
       "                                                    [key], {});\n",
       "        if (!dataTable) return;\n",
       "\n",
       "        const docLinkHtml = 'Like what you see? Visit the ' +\n",
       "          '<a target=\"_blank\" href=https://colab.research.google.com/notebooks/data_table.ipynb>data table notebook</a>'\n",
       "          + ' to learn more about interactive tables.';\n",
       "        element.innerHTML = '';\n",
       "        dataTable['output_type'] = 'display_data';\n",
       "        await google.colab.output.renderOutput(dataTable, element);\n",
       "        const docLink = document.createElement('div');\n",
       "        docLink.innerHTML = docLinkHtml;\n",
       "        element.appendChild(docLink);\n",
       "      }\n",
       "    </script>\n",
       "  </div>\n",
       "\n",
       "\n",
       "  <div id=\"id_f6820df7-b890-4c08-ba18-4042bcdb719e\">\n",
       "    <style>\n",
       "      .colab-df-generate {\n",
       "        background-color: #E8F0FE;\n",
       "        border: none;\n",
       "        border-radius: 50%;\n",
       "        cursor: pointer;\n",
       "        display: none;\n",
       "        fill: #1967D2;\n",
       "        height: 32px;\n",
       "        padding: 0 0 0 0;\n",
       "        width: 32px;\n",
       "      }\n",
       "\n",
       "      .colab-df-generate:hover {\n",
       "        background-color: #E2EBFA;\n",
       "        box-shadow: 0px 1px 2px rgba(60, 64, 67, 0.3), 0px 1px 3px 1px rgba(60, 64, 67, 0.15);\n",
       "        fill: #174EA6;\n",
       "      }\n",
       "\n",
       "      [theme=dark] .colab-df-generate {\n",
       "        background-color: #3B4455;\n",
       "        fill: #D2E3FC;\n",
       "      }\n",
       "\n",
       "      [theme=dark] .colab-df-generate:hover {\n",
       "        background-color: #434B5C;\n",
       "        box-shadow: 0px 1px 3px 1px rgba(0, 0, 0, 0.15);\n",
       "        filter: drop-shadow(0px 1px 2px rgba(0, 0, 0, 0.3));\n",
       "        fill: #FFFFFF;\n",
       "      }\n",
       "    </style>\n",
       "    <button class=\"colab-df-generate\" onclick=\"generateWithVariable('eff_df')\"\n",
       "            title=\"Generate code using this dataframe.\"\n",
       "            style=\"display:none;\">\n",
       "\n",
       "  <svg xmlns=\"http://www.w3.org/2000/svg\" height=\"24px\"viewBox=\"0 0 24 24\"\n",
       "       width=\"24px\">\n",
       "    <path d=\"M7,19H8.4L18.45,9,17,7.55,7,17.6ZM5,21V16.75L18.45,3.32a2,2,0,0,1,2.83,0l1.4,1.43a1.91,1.91,0,0,1,.58,1.4,1.91,1.91,0,0,1-.58,1.4L9.25,21ZM18.45,9,17,7.55Zm-12,3A5.31,5.31,0,0,0,4.9,8.1,5.31,5.31,0,0,0,1,6.5,5.31,5.31,0,0,0,4.9,4.9,5.31,5.31,0,0,0,6.5,1,5.31,5.31,0,0,0,8.1,4.9,5.31,5.31,0,0,0,12,6.5,5.46,5.46,0,0,0,6.5,12Z\"/>\n",
       "  </svg>\n",
       "    </button>\n",
       "    <script>\n",
       "      (() => {\n",
       "      const buttonEl =\n",
       "        document.querySelector('#id_f6820df7-b890-4c08-ba18-4042bcdb719e button.colab-df-generate');\n",
       "      buttonEl.style.display =\n",
       "        google.colab.kernel.accessAllowed ? 'block' : 'none';\n",
       "\n",
       "      buttonEl.onclick = () => {\n",
       "        google.colab.notebook.generateWithVariable('eff_df');\n",
       "      }\n",
       "      })();\n",
       "    </script>\n",
       "  </div>\n",
       "\n",
       "    </div>\n",
       "  </div>\n"
      ],
      "application/vnd.google.colaboratory.intrinsic+json": {
       "type": "dataframe",
       "variable_name": "eff_df",
       "summary": "{\n  \"name\": \"eff_df\",\n  \"rows\": 3,\n  \"fields\": [\n    {\n      \"column\": \"Environment\",\n      \"properties\": {\n        \"dtype\": \"string\",\n        \"num_unique_values\": 3,\n        \"samples\": [\n          \"E1\",\n          \"E2\",\n          \"E3\"\n        ],\n        \"semantic_type\": \"\",\n        \"description\": \"\"\n      }\n    },\n    {\n      \"column\": \"epsilon_r\",\n      \"properties\": {\n        \"dtype\": \"number\",\n        \"std\": 1.755942292142123,\n        \"min\": 2.5,\n        \"max\": 6.0,\n        \"num_unique_values\": 3,\n        \"samples\": [\n          2.5,\n          4.0,\n          6.0\n        ],\n        \"semantic_type\": \"\",\n        \"description\": \"\"\n      }\n    },\n    {\n      \"column\": \"Hamming_Distance\",\n      \"properties\": {\n        \"dtype\": \"number\",\n        \"std\": 0,\n        \"min\": 0,\n        \"max\": 0,\n        \"num_unique_values\": 1,\n        \"samples\": [\n          0\n        ],\n        \"semantic_type\": \"\",\n        \"description\": \"\"\n      }\n    },\n    {\n      \"column\": \"Adaptation_Efficiency\",\n      \"properties\": {\n        \"dtype\": \"number\",\n        \"std\": 0.0,\n        \"min\": 0.0,\n        \"max\": 0.0,\n        \"num_unique_values\": 1,\n        \"samples\": [\n          0.0\n        ],\n        \"semantic_type\": \"\",\n        \"description\": \"\"\n      }\n    }\n  ]\n}"
      }
     },
     "metadata": {},
     "execution_count": 10
    }
   ],
   "source": "def hamming_distance(x, y):\n    return int(np.sum(np.asarray(x) != np.asarray(y)))\n\neff_rows = []\nprevious_x = None\n\nfor env in ENVIRONMENTS:\n    Q = Q_by_env[env.name]\n    x_star = ground_truth[env.name][\"x\"]\n\n    if previous_x is not None:\n        old_e = qubo_energy(previous_x, Q)\n        new_e = qubo_energy(x_star, Q)\n        d = hamming_distance(previous_x, x_star)\n        ae = (old_e - new_e) / (1 + d)\n    else:\n        old_e, d, ae = np.nan, 0, np.nan\n\n    eff_rows.append({\n        \"Environment\": env.name,\n        \"epsilon_r\": env.eps_r,\n        \"Hamming_Distance\": d,\n        \"Adaptation_Efficiency\": ae\n    })\n    previous_x = x_star.copy()\n\neff_df = pd.DataFrame(eff_rows)\neff_df\n"
  },
  {
   "cell_type": "markdown",
   "id": "3fa1d2e4",
   "metadata": {
    "id": "3fa1d2e4"
   },
   "source": "## 10. Visualizations\n\nThese plots are intended to become templates for the eventual paper figures.\n"
  },
  {
   "cell_type": "code",
   "execution_count": 11,
   "id": "daaa339f",
   "metadata": {
    "id": "daaa339f",
    "executionInfo": {
     "status": "error",
     "timestamp": 1787860517426,
     "user_tz": -180,
     "elapsed": 481,
     "user": {
      "displayName": "Joseph Volkan ÖZCAN",
      "userId": "11389530967736397480"
     }
    },
    "outputId": "10f5480d-7923-410c-e93c-6f91d046d1ee",
    "colab": {
     "base_uri": "https://localhost:8080/",
     "height": 1000
    }
   },
   "outputs": [
    {
     "output_type": "display_data",
     "data": {
      "text/plain": [
       "<Figure size 800x400 with 1 Axes>"
      ],
      "image/png": "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iEqGt7qPBQCYm5ujatWquoyFiIiIiIhKKLUSi86dO2PNmjWwtrZG586dC627Y8cOnQRGREREREQlh1qJhY2NDWQyGYCXV4XKfUxERERERASomViEhYVJj9esWVNUsRARERERUQml8eVmmzZtiuTk5DzlqampaNq0qS5iIiIiIiKiEkbjxOLw4cPIysrKU56RkYFjx47pJCgiIiIiIipZ1L4q1MWLF6XHV69eRUJCgvRcoVAgPDwcZcqU0W10RERERERUIqidWPj7+0Mmk0Emk+W75MnMzAxLly7VaXBERERERFQyqJ1YxMbGQggBb29vnDp1Co6OjtI2Y2NjODk5wcDAoEiCJCIiIiKi4k3txMLDwwMAoFQqiywYIiIiIiIqmd76zttXr17F3bt385zI3b59e62DIiIiIiKikkXjxOLWrVvo1KkTLl26BJlMBiEEAEg3zVMoFLqNkIiIiIiIij2NLzc7ZswYeHl5ITExEebm5rhy5QqOHj2KmjVr4vDhw0UQIhERERERFXcaz1hERUXh4MGDcHBwgFwuh1wuR4MGDRAaGorRo0fj3LlzRREnEREREREVYxrPWCgUClhZWQEAHBwcEBcXB+Dlyd0xMTG6jY6IiIiIiEoEjWcsqlSpggsXLsDLywt16tTBN998A2NjY6xYsQLe3t5FESMRERERERVzGicW06ZNw/PnzwEAs2bNQtu2bdGwYUOUKlUKW7du1XmARERERERU/GmcWAQFBUmPy5cvj2vXriEpKQl2dnbSlaGIiIiIiOj9ovE5FuvWrcPVq1dVyuzt7ZGZmYl169bpLDAiIiIiIio5NE4s+vfvjzp16uDXX39VKU9JScGAAQN0FhgREREREZUcGicWABASEoI+ffpg5syZOg6HiIiIiIhKordKLHr37o2DBw/ip59+wkcffYQXL17oOi4iIiIiIipBNE4sck/Qrlu3Lk6ePIkbN26gXr16uH37tq5jIyIiIiKiEkLjxEIIIT12d3dHZGQkPD090aJFC50GRkREREREJYfGicWMGTNgaWkpPTc3N8dvv/2GcePGoVGjRjoNjoiIiIiISgaZeHUKgt5KamoqbGxskJKSAmtr63fat1KpRFJSEuzt7SGXv9UpM0REJQrHPSJ6n+h7zNPke65aN8jbtWsXWrVqBSMjI+zatavAejKZDO3atdMsWiIiIiIi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lVjY2tpCJpMVWkcIAZlMBoVCoZPAiIiIiIio5FArsTh06FBRx0FERERERCWYWolFYGBgUcdBREREREQlmMb3sQCAY8eOoXfv3qhXrx4ePHgAAFi/fj3+/vtvnQZHREREREQlg8aJxa+//oqgoCCYmZnh7NmzyMzMBACkpKRgzpw5Og+QiIiIiIiKP40Ti6+//hrLly/HypUrYWRkJJXXr18fZ8+e1WlwRERERERUMmicWMTExKBRo0Z5ym1sbJCcnKyLmIiIiIiIqITROLFwcXHBjRs38pT//fff8Pb21klQRERERERUsmicWAwZMgRjxozByZMnIZPJEBcXh40bN2LixIkYNmxYUcRIRERERETFnFqXm33VlClToFQq0axZM6Snp6NRo0YwMTHBxIkTMWrUqKKIkYiIiIiIijmNEwuZTIYvvvgCkyZNwo0bN/Ds2TP4+vrC0tISL168gJmZWVHESURERERExdhb3ccCAIyNjeHr64vatWvDyMgICxYsgJeXly5jIyIiIiKiEkLtxCIzMxNTp05FzZo1Ua9ePezcuRMAEBYWBi8vLyxcuBDjxo0rqjiJiIiIiKgYU3sp1PTp0/HTTz+hefPmiIyMxMcff4wBAwbgxIkTWLBgAT7++GMYGBgUZaxERERERFRMqZ1YbNu2DevWrUP79u1x+fJlVKtWDTk5Obhw4QJkMllRxkhERERERMWc2kuh7t+/jxo1agAAqlSpAhMTE4wbN45JBRERERERqZ9YKBQKGBsbS88NDQ1haWlZJEEREREREVHJovZSKCEE+vfvDxMTEwBARkYGPv30U1hYWKjU27Fjh24jJCIiIiKiYk/txKJfv34qz3v37q3zYIiIiIiIqGRSO7EICwsryjiIiIiIiKgEe+sb5BEREREREeViYkFERERERFpjYkFERERERFpjYkFERERERFpjYkFERERERFpjYkFERERERFpjYkFERERERFpjYkFERERERFpjYkFERERERFpjYkFERERERFpjYkFERERERFpjYkFERERERFpjYkFERERERFpjYkFERERERFpjYkFERERERFpjYkFERERERForMYlFUlISevXqBWtra9ja2mLQoEF49uxZoftkZGRgxIgRKFWqFCwtLdGlSxc8fPgw37pPnjxB2bJlIZPJkJycXARHQERERET031ViEotevXrh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Z86cOfoOi4ioSKg75j1+/BhfffWVyl/ziIhKojeNez/++KNU/tdff2H//v0wNjbWY8Sq+KedEqRJkyZYtmyZSpm9vb2eoiEiKlrqjHmpqalo06YNfH19MXPmzHcYHRGR7r1p3OvVqxdatGiB+Ph4fPfdd+jatSuOHz8OU1PTdx1qvphYlCAWFhYoX768vsMgInon3jTmpaWlITg4GFZWVvjtt99gZGT0DqMjItK9N417NjY2sLGxQYUKFVC3bl3Y2dnht99+Q48ePd5hlAXjUigiIipxUlNT0bJlSxgbG2PXrl3F5q91RETvihACQghkZmbqOxQJZyxKkMzMTCQkJKiUGRoawsHBAQkJCUhISMCNGzcAAJcuXYKVlRXc3d25XIqISqSCxjxjY2O0bNkS6enp2LBhA1JTU5GamgoAcHR0LDaXXSQi0lRB415qaiq2bt2Kli1bwtHREffv38fcuXNhZmaG1q1b6ynavJhYlCDh4eEoXbq0SlmlSpVw7do1LF++HCEhIVJ5o0aNAABhYWHo37//uwyTiEgnChrzli9fjpMnTwJAniUDsbGx8PT0fFchEhHpVEHj3sGDB3Hs2DEsWrQIT58+hbOzMxo1aoTIyEg4OTnpKdq8ZEIIoe8giIiIiIioZOM5FkREREREpDUmFkREREREpDUmFkREREREpDUmFkREREREpDUmFkREREREpDUmFkREREREpDUmFkREREREpDUmFkREREREpDUmFkREJYBMJsPOnTvVrt+/f3907NixyOIpzJo1a2Bra6uXvjWh6WtKRESFY2JBRKQn/fv3h0wmg0wmg5GREZydndGiRQusXr0aSqVSpW58fDxatWqlp0g1S1S6deuGf//9t2gD0gF9v6bvgj4TTCJ6/zCxICLSo+DgYMTHx+P27dv466+/0KRJE4wZMwZt27ZFTk6OVM/FxQUmJiZ6jFQ92dnZMDMzg5OTk75DeaM3vabZ2dnvMBoiopKPiQURkR6ZmJjAxcUFZcqUQfXq1fH555/j999/x19//YU1a9ZI9V5ftnPv3j107doVtra2sLe3R4cOHXD79u0C+1EqlQgNDYWXlxfMzMzg5+eH7du3q9S5cuUK2rZtC2tra1hZWaFhw4a4efMmZs6cibVr1+L333+XZlgOHz6M27dvQyaTYevWrQgMDISpqSk2btyY71KoP/74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\n"
     },
     "metadata": {}
    },
    {
     "output_type": "display_data",
     "data": {
      "text/plain": [
       "<Figure size 800x400 with 1 Axes>"
      ],
      "image/png": "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Vj/nF8noO/w8fb9TzwoODiYqKgoXF5cM658/njz/uULqZ/vs97FChQr4+PiwcuVK+vTpA6Qet/Lnz//C/fas1/ndvijOjH43kPHvwd7eniJFiqQre3b5hw8fEhkZyfz585k/f36G7+Nl++5FMWUkK8cj8e6RxELkafb29hQsWFDnBCUjZ86coVChQto/wC+Slat6Go2GRo0aMXz48Azrnz35zm6tWrXCysqKVatWUaNGDVatWoWRkRGdOnXSiU9RFP79998MZz959kptRszNzWnbti1//vknP/30E/fv3+fAgQNMmTJFp13nzp05ePAgw4YNo2LFitjY2KDRaGjatOkLr7y+zPMDf7O6r11cXAgKCmLLli38+++//PvvvyxatIju3btnOKAzzb59+2jdujV16tThp59+omDBgpiamrJo0aJXHqD4OjPJlCpVisuXL7Nx40Y2b97M2rVr+emnnxg3bhwTJkwAUvd77dq1+fPPP9m6dSvffPMN06dPZ926ddrxCq/rRbPmpN0pi4yMJCAgADs7OyZOnIiXlxcWFhacPHmSESNGpPv8X7a+7PKmtvMq0vbJN998Q8WKFTNs86LfZtqyv/32G66urunqTUyy9099Ts+GpNFocHFxYdmyZRnWP38hIaufa5cuXQgMDOTRo0fY2tqyYcMG3n///Sztn+x4z1mN80XtXrZ82vfggw8+eGGCWr58+VeKKSNZOR6Jd48kFiLPa9myJf/73//Yv3+/zi3rNPv27SM0NJR+/fqlqwsODta5UnX16lU0Gk2ms8N4eXkRGxtLw4YNM43Ly8uLLVu2EB4enuldC326KFhbW9OyZUtWr17Nt99+y8qVK6lduzZubm4621VVlWLFir1yktOlSxeWLFnCjh07uHjxIqqq6nQniIiIYMeOHUyYMIFx48Zpy9OurL6Mo6Njujn0ExMTuXv3rk5ZVvc1pHavadWqFa1atUKj0dC/f3/mzZvH2LFjX3jVe+3atVhYWLBlyxadaYUXLVqULg6NRsOFCxdeeFKYGXd39wyfu5DWZejZOfWtra3p0qULXbp0ITExkfbt2xMYGMioUaO0030WLFiQ/v37079/fx48eICvry+BgYEvTCycnZ2xs7PTzuj1unbv3s3jx49Zt26dznMaQkJCXnmd7u7uXLhwAVVVdX4Tz8+q8zrS9nNG68zKdtKW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VCmOHDmiU3b48OFM4//nn3+IiYnh1KlTOgnLuXPn6NWrF5GRkdk29a2vry8rV67ExcUFOzu7DNscOHCAn376iebNmwOpg70fPXqULdtP4+3tzbFjx+jevbu27NixlyfAQgghhMiay8d3krJlLBWTzgEQgS2XS35CpfZDcLPI+CLq2yp3pz16ePToEcHBwYwcOZLy5ctTokQJpk2bRlxcHOfOnTN0eBgbKYxvVRrQeTK7zuvxrUpj/KKnobyix48fU79+fX7//XfOnDlDSEgIq1evZsaMGbRp0yZbt1W/fn02bdrEpk2buHTpEp9++imRkZEvbF+8eHGSkpKYM2cO169f57fffuOXX37RaePh4UFsbCw7duzg0aNHxMXFUbJkSbp160b37t1Zt24dISEhHD16lKlTp7Jp0yYABg4cyObNm5k5cybBwcHMnTv3peMrFixYQIsWLahQoQJly5bV/pc2c1NGdxdeVbdu3cifPz9t2rRh3759hISEsHv3bgYOHMitW6nzV5coUYLffvuNixcvcuTIEbp164alpWW2xQDw+eefs2DBApYsWUJwcDCTJ0/mzJkzOZrUCiGEEO+Cm1fPcnJmK7w3tqN00jniVVMOufXA+IvTVO86BvM8llRAHkos8uXLh7e3N0uXLuXJkyckJyczb948XFxcqFy5sqHDA6Bp2YL8/IEvrvYWOuWu9hb8/IFvjjzHwsbGhmrVqvHdd99Rp04dypYty9ixY+nbty9z587N1m317t2bHj160L17dwICAvD09My0G1qFChX49ttvmT59OmXLlmXZsmVMnTpVp02NGjX45JNP6NKlC87OzsyYMQNIHejcvXt3vvzyS7y9vWnbti3Hjh2jaNGiAFSvXp3//e9/zJ49mwoVKrB161bGjBnzwlju37/Ppk2b6NChQ7o6IyMj2rVrx4IFC15lt2TIysqKvXv3UrRoUdq3b0+pUqXo06cP8fHx2jsYCxYsICIiAl9fXz788EMGDhyIi4tLtsUAqQnOqFGjGDp0KL6+voSEhNCzZ08sLCxevrAQQggh0nl8/xZH5vbC9bcAfGP3kqIqHHVoTlTfI/h//AN2DvkMHWKOUdSszlv6Frh16xZt27bl5MmTGBkZ4eLiwqZNm6hUqdILl0lISNCZhjU6OpoiRYoQERGRrotKfHw8oaGhFCtW7LVOvFI0KsdC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\n"
     },
     "metadata": {}
    },
    {
     "output_type": "error",
     "ename": "KeyError",
     "evalue": "'Hamming_Distance'",
     "traceback": [
      "\u001b[0;31m---------------------------------------------------------------------------\u001b[0m",
      "\u001b[0;31mKeyError\u001b[0m                                  Traceback (most recent call last)",
      "\u001b[0;32m/usr/local/lib/python3.13/dist-packages/pandas/core/indexes/base.py\u001b[0m in \u001b[0;36mget_loc\u001b[0;34m(self, key)\u001b[0m\n\u001b[1;32m   3804\u001b[0m         \u001b[0;32mtry\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m-> 3805\u001b[0;31m             \u001b[0;32mreturn\u001b[0m \u001b[0mself\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0m_engine\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mget_loc\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mcasted_key\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m\u001b[1;32m   3806\u001b[0m         \u001b[0;32mexcept\u001b[0m \u001b[0mKeyError\u001b[0m \u001b[0;32mas\u001b[0m \u001b[0merr\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n",
      "\u001b[0;32mindex.pyx\u001b[0m in \u001b[0;36mpandas._libs.index.IndexEngine.get_loc\u001b[0;34m()\u001b[0m\n",
      "\u001b[0;32mindex.pyx\u001b[0m in \u001b[0;36mpandas._libs.index.IndexEngine.get_loc\u001b[0;34m()\u001b[0m\n",
      "\u001b[0;32mpandas/_libs/hashtable_class_helper.pxi\u001b[0m in \u001b[0;36mpandas._libs.hashtable.PyObjectHashTable.get_item\u001b[0;34m()\u001b[0m\n",
      "\u001b[0;32mpandas/_libs/hashtable_class_helper.pxi\u001b[0m in \u001b[0;36mpandas._libs.hashtable.PyObjectHashTable.get_item\u001b[0;34m()\u001b[0m\n",
      "\u001b[0;31mKeyError\u001b[0m: 'Hamming_Distance'",
      "\nThe above exception was the direct cause of the following exception:\n",
      "\u001b[0;31mKeyError\u001b[0m                                  Traceback (most recent call last)",
      "\u001b[0;32m/tmp/ipykernel_456/1636296284.py\u001b[0m in \u001b[0;36m<cell line: 0>\u001b[0;34m()\u001b[0m\n\u001b[1;32m     26\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m     27\u001b[0m \u001b[0mplt\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mfigure\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mfigsize\u001b[0m\u001b[0;34m=\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;36m8\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0;36m4\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m---> 28\u001b[0;31m \u001b[0mplt\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mbar\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0madaptive_df\u001b[0m\u001b[0;34m[\u001b[0m\u001b[0;34m\"Environment\"\u001b[0m\u001b[0;34m]\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0madaptive_df\u001b[0m\u001b[0;34m[\u001b[0m\u001b[0;34m\"Hamming_Distance\"\u001b[0m\u001b[0;34m]\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m\u001b[1;32m     29\u001b[0m \u001b[0mplt\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mxlabel\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m\"Dielectric environment\"\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m     30\u001b[0m \u001b[0mplt\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mylabel\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m\"Number of changed binary cells\"\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n",
      "\u001b[0;32m/usr/local/lib/python3.13/dist-packages/pandas/core/frame.py\u001b[0m in \u001b[0;36m__getitem__\u001b[0;34m(self, key)\u001b[0m\n\u001b[1;32m   4100\u001b[0m             \u001b[0;32mif\u001b[0m \u001b[0mself\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mcolumns\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mnlevels\u001b[0m \u001b[0;34m>\u001b[0m \u001b[0;36m1\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m   4101\u001b[0m                 \u001b[0;32mreturn\u001b[0m \u001b[0mself\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0m_getitem_multilevel\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mkey\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m-> 4102\u001b[0;31m             \u001b[0mindexer\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0mself\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mcolumns\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mget_loc\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mkey\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m\u001b[1;32m   4103\u001b[0m             \u001b[0;32mif\u001b[0m \u001b[0mis_integer\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mindexer\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m   4104\u001b[0m                 \u001b[0mindexer\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0;34m[\u001b[0m\u001b[0mindexer\u001b[0m\u001b[0;34m]\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n",
      "\u001b[0;32m/usr/local/lib/python3.13/dist-packages/pandas/core/indexes/base.py\u001b[0m in \u001b[0;36mget_loc\u001b[0;34m(self, key)\u001b[0m\n\u001b[1;32m   3810\u001b[0m             ):\n\u001b[1;32m   3811\u001b[0m                 \u001b[0;32mraise\u001b[0m \u001b[0mInvalidIndexError\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mkey\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m-> 3812\u001b[0;31m             \u001b[0;32mraise\u001b[0m \u001b[0mKeyError\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mkey\u001b[0m\u001b[0;34m)\u001b[0m \u001b[0;32mfrom\u001b[0m \u001b[0merr\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m\u001b[1;32m   3813\u001b[0m         \u001b[0;32mexcept\u001b[0m \u001b[0mTypeError\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m   3814\u001b[0m             \u001b[0;31m# If we have a listlike key, _check_indexing_error will raise\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n",
      "\u001b[0;31mKeyError\u001b[0m: 'Hamming_Distance'"
     ]
    },
    {
     "output_type": "display_data",
     "data": {
      "text/plain": [
       "<Figure size 800x400 with 0 Axes>"
      ]
     },
     "metadata": {}
    }
   ],
   "source": "plot_df = results_df[results_df[\"Method\"] != \"Exhaustive\"].copy()\n\nplt.figure(figsize=(8, 4))\nfor method in plot_df[\"Method\"].unique():\n    sub = plot_df[plot_df[\"Method\"] == method]\n    plt.plot(sub[\"Environment\"], sub[\"Gap\"], marker=\"o\", label=method)\nplt.xlabel(\"Dielectric environment\")\nplt.ylabel(\"Relative optimization gap\")\nplt.title(\"Classical vs QAOA optimization gap\")\nplt.legend()\nplt.grid(alpha=0.25)\nplt.tight_layout()\nplt.show()\n\nplt.figure(figsize=(8, 4))\nfor method in plot_df[\"Method\"].unique():\n    sub = plot_df[plot_df[\"Method\"] == method]\n    plt.plot(sub[\"Environment\"], sub[\"Energy\"], marker=\"o\", label=method)\nplt.xlabel(\"Dielectric environment\")\nplt.ylabel(\"Objective energy (lower is better)\")\nplt.title(\"Objective values across changing dielectric environments\")\nplt.legend()\nplt.grid(alpha=0.25)\nplt.tight_layout()\nplt.show()\n\nplt.figure(figsize=(8, 4))\nplt.bar(adaptive_df[\"Environment\"], adaptive_df[\"Hamming_Distance\"])\nplt.xlabel(\"Dielectric environment\")\nplt.ylabel(\"Number of changed binary cells\")\nplt.title(\"Adaptive state transitions relative to previous optimum\")\nplt.grid(axis=\"y\", alpha=0.25)\nplt.tight_layout()\nplt.show()\n"
  },
  {
   "cell_type": "markdown",
   "id": "a76bf931",
   "metadata": {
    "id": "a76bf931"
   },
   "source": "## 11. Transition to the real EM problem\n\nThe synthetic objective should now be replaced by a physics-driven evaluator with the same interface:\n\n```python\ndef objective(x, eps_r, frequency, angle, polarization):\n    # 1. configure unit-cell/array parameters\n    # 2. run or query a full-wave simulation\n    # 3. calculate matching + broadband + robustness terms\n    return scalar_objective\n```\n\nThe QUBO can be estimated from sampled objective evaluations, or constructed directly when the EM objective is well-approximated by a quadratic binary model.\n\n### Recommended production workflow\n\n1. Define one physical 1-bit reconfigurable unit cell.\n2. Generate a high-fidelity dataset using a full-wave solver.\n3. Train and validate a surrogate.\n4. Wrap the surrogate behind the same `objective(...)` interface.\n5. Run exhaustive search for 16 cells.\n6. Scale to 32/64/128 cells.\n7. Add real Qiskit and D-Wave backends.\n8. Perform multi-seed statistics.\n9. Validate selected configurations again with full-wave simulation.\n"
  },
  {
   "cell_type": "markdown",
   "id": "18c24cc7",
   "metadata": {
    "id": "18c24cc7"
   },
   "source": "## 12. Reproducibility checklist for the paper\n\nBefore claiming a quantum advantage, record:\n\n- wall-clock time for every pipeline component,\n- number of objective evaluations,\n- number of quantum shots/samples,\n- QAOA depth,\n- parameter optimizer,\n- simulator vs hardware,\n- embedding/compilation overhead,\n- classical post-processing time,\n- full-wave validation time,\n- statistical variability over multiple seeds.\n\nThe paper should distinguish:\n\n**algorithmic improvement**\n\nfrom\n\n**end-to-end quantum advantage**.\n\nThis notebook establishes only the first computational proof-of-concept.\n"
  },
  {
   "cell_type": "markdown",
   "id": "63c511d4",
   "metadata": {
    "id": "63c511d4"
   },
   "source": "## 13. Next implementation target\n\nThe next notebook version should add:\n\n### A. Real EM geometry\nA parameterized 1-bit programmable unit cell.\n\n### B. Full-wave dataset\nFrequency sweep across selected X/K-band windows.\n\n### C. Surrogate model\nMLP first; operator learning later if warranted.\n\n### D. Real QAOA\nQiskit/PennyLane implementation.\n\n### E. Quantum annealing\nD-Wave Ocean implementation of the same QUBO.\n\n### F. Statistical benchmark\nAt least 20–30 independent seeds per method and configuration size.\n\n### G. Paper outputs\nCSV result files, publication-quality figures, and LaTeX tables.\n"
  },
  {
   "cell_type": "markdown",
   "id": "909902c0",
   "metadata": {
    "id": "909902c0"
   },
   "source": "## Scientific note\n\nThis benchmark is deliberately positioned as **Phase 1**. It demonstrates the computational architecture and benchmarking methodology, not a physical stealth-performance claim.\n\nThe publication-grade novelty must ultimately be demonstrated on a validated electromagnetic model and, ideally, a fabricated/reconfigurable prototype.\n"
  }
 ],
 "metadata": {
  "kernelspec": {
   "display_name": "Python 3",
   "language": "python",
   "name": "python3"
  },
  "language_info": {
   "name": "python",
   "version": "3.x"
  },
  "colab": {
   "provenance": []
  }
 },
 "nbformat": 4,
 "nbformat_minor": 5
}