{
  "nbformat": 4,
  "nbformat_minor": 0,
  "metadata": {
    "colab": {
      "provenance": []
    },
    "kernelspec": {
      "name": "python3",
      "display_name": "Python 3"
    },
    "language_info": {
      "name": "python"
    }
  },
  "cells": [
    {
      "cell_type": "code",
      "execution_count": 1,
      "metadata": {
        "colab": {
          "base_uri": "https://localhost:8080/",
          "height": 696
        },
        "id": "1FcHK9RDVryw",
        "outputId": "3c44b742-ec8f-4655-978f-e8bce76dbd63"
      },
      "outputs": [
        {
          "output_type": "stream",
          "name": "stderr",
          "text": [
            "<>:131: SyntaxWarning: invalid escape sequence '\\g'\n",
            "<>:131: SyntaxWarning: invalid escape sequence '\\g'\n",
            "/tmp/ipython-input-513418180.py:131: SyntaxWarning: invalid escape sequence '\\g'\n",
            "  plt.boxplot(results, labels=[f\"$\\gamma$={g}\" for g in gammas])\n",
            "/tmp/ipython-input-513418180.py:131: MatplotlibDeprecationWarning: The 'labels' parameter of boxplot() has been renamed 'tick_labels' since Matplotlib 3.9; support for the old name will be dropped in 3.11.\n",
            "  plt.boxplot(results, labels=[f\"$\\gamma$={g}\" for g in gammas])\n"
          ]
        },
        {
          "output_type": "display_data",
          "data": {
            "text/plain": [
              "<Figure size 1000x600 with 1 Axes>"
            ],
            "image/png": "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DVLJkiX17LPP6r777lPnzp319ttvq1evXmrQoEGuHsJBgwYpJCREL7zwgnbt2qXp06dr37591g8QcmIKCAjQ0KFDFRAQoJUrV2rUqFFKS0uzJs+OnFOXysrK0h133KFbbrlF48eP15IlSzR69GidP39eL774Yr7LHTp0SLfccov1n+ywsDB9++236tevn9LS0q7o9tuAgAB16tRJ7733nnbu3Kk6derkWzc1NVX//PNPgefSpTIyMvIcCCckJEQlSpTQ4cOH1apVK4WFhWnEiBEKCQlRcnKyFixYIEkKCwvT9OnT9cgjj6hTp07q3LmzJKlevXoFrnft2rX68ssvredXQkKC7rzzTj311FN666239Oijj+qff/7R+PHj1bdvX61cudK67Lx585SRkaFHHnlEpUuX1k8//aQ333xT//vf/zRv3jxJUv/+/fX3339r2bJl+vjjj23WbYzRXXfdpVWrVqlfv3667rrrtHTpUj355JM6cOCA9XjJsXLlSn322WcaNGiQypQp49Lbbx977DGFhoZq9OjRSk5O1uTJkzVo0CB9+umn1jqjRo3Syy+/rLZt26pt27basmWLWrVqpczMTJu2MjIy1KRJEx04cED9+/dX5cqV9cMPP2jkyJFKSUnJ9bzfBx98oDNnzujhhx+Wj4+PSpUqdVnbkN8x2r9/f+v14/HHH9fevXs1depUbd26VevXr7feKjtr1iz17dtXderU0ciRIxUSEqKtW7dqyZIl6tGjh7WOM9eh1q1b6+abb9Zrr72m5cuXa+LEiapevbpNj5ij8UnSrl271L17d/Xv318PPfSQatWq5fT+njNnjtLT09W/f39ZLBaNHz9enTt31p9//mld16+//qrGjRvLy8tLDz/8sCIjI/XHH3/oq6++sn6gVZjXG1xFBnCDDz74wEgyy5cvN0eOHDF//fWXmT9/vgkLCzM+Pj7mr7/+sta97rrrTHh4uDl27Ji17JdffjEeHh6mV69e1rLRo0cbSeauu+6yWdejjz5qJJlffvnFGGPM3r17jSTzwQcf5IpLkhk9erR1Ojg42AwcOLDAbWnXrp2pUqVKrvJVq1YZSSYmJsacPXvWWj5lyhQjyWzfvt0YY0x2draJiooyrVu3NtnZ2dZ6GRkZpmrVqqZly5YOx7N161YjycybN6/AmC+VmZlpwsPDTd26dc3p06et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cxTmgDP2rus5sVx6XoSFhdn8Ey5d+Bvw66+/5psMXXocunK7Lj1G9+zZo9TUVIWHhxcYS87zeHXr1s23bVdchy69RjsaX4689pWz+9vee51zXS5oX1yN6w2uDhInuNVNN91kHVWvY8eOuvXWW9WjRw/t2rXLZV+Gl9cDznm59AFU6cLzUo0bN9bChQv13XffacKECRo3bpwWLFigNm3aOLR+T0/PPMvN/z2Mm9ObNGHCBF133XV51s3ZF47EM3HiRPXp00eLFi3Sd999p8cff9z6vFdOT97VEBwcrAoVKujXX38tsN6vv/6qSpUqWXvlHH1//vjjDzVv3lzR0dF6/fXXFRERIW9vb33zzTeaNGmSzUO+kv334XLlddwUtL68yi+O4cYbb7T5B3D06NF64YUXFB0dra1bt+qvv/7K9U/qlXIm1kvjddSJEyfUpEkTBQUF6cUXX1T16tXl6+urLVu26Omnn871fhW2nPX17Nkz3w8t7D3vY8+OHTskSTVq1LApr1SpkjXpadu2rcqUKaNBgwapWbNm1meNrpTFYtH8+fP1448/6quvvtLSpUvVt29fTZw4UT/++ONlX18v91jJyspSy5Ytdfz4cT399NOKjo5WyZIldeDAAfXp06dQ3n9XjJ7m7Pl9OedGdna2WrZsqaeeeirP+TkfAuRw5ahwlx6j2dnZCg8P1yeffJJnfVf1dOUlv316MWfjy2tfObu/XfFeX43rDa4OEicUGZ6enkpISFCzZs00depUjRgxQlWqVJF04QHPSyUlJalMmTK5vnx1z549Np8y/f7778rOzrbeXpLzadGJEydslrv008oc5cuX16OPPqpHH31Uhw8fVlxcnMaOHWtNVPL7R99ROQ+EBwUFOfS9SPbikaTY2FjFxsbqueee0w8//KBGjRrp7bff1ssvv5xnmxfv59tvv91m3q5du6zzndW+fXvNmDFD69aty3MkuLVr1yo5OdnmFqXQ0NBc742U+/356quvdPbsWX355Zc2nwheequGMwp6L/OKKzMzUykpKZe9vrx88sknNqOM5fSktG/fXv/v//0/zZ49WyNHjiywjcJ6PwuyZ88eNWvWzDp98uRJpaSkWL9raPXq1Tp27JgWLFig2267zVpv7969udpy9pzKzs7Wn3/+afMPT873WeU3IEBYWJgCAwOVlZXl0HnnrJMnT2rhwoWKiIiwO8BI//79NWnSJD333HPq1KnTFV9TLnbLLbfolltu0dixYzVnzhzdd999mjt3rh588EGXrsee7du3a/fu3frwww9tBkJZtmxZrrr5xVWlShUtX75c6enpNr1OObd5Xslx7erzOyeWPXv22PSGHjlyJFdvW/Xq1XXy5MlCOQ4LktcxWr16dS1fvlyNGjUqMEHL+bu1Y8eOXB8M5CiM65Cj8dlrw5X7O+f9zUlC81LY1xtcPTzjhCKladOmuummmzR58mSdOXNG5cuX13XXXacPP/zQ5o/ajh079N133+X5BZA5Q9nmePPNNyXJmlgEBQWpTJkyue5jvnRUt6ysrFy3j4SHh6tChQo6e/astaxkyZJXdJtRfHy8qlevrtdee81628TFcoa4dSSetLQ0nT9/3qZObGysPDw8bGK+1A033KDw8HC9/fbbNvW+/fZbJSYmql27dpe1bcOHD5e/v7/69++vY8eO2cw7fvy4BgwYoKCgIJvnU6pXr67U1FSbnqqUlBQtXLjQZvmcTwEv/tQvNTVVH3zwwWXFKsmahOeVuFWvXj3XMTNz5sx8P5G+XI0aNVKLFi2sr5w/yl26dFFsbKzGjh2rDRs25FouPT3dOvRtYb2fBZk5c6bNszTTp0/X+fPnreddXu9XZmZmnqMpXs45NXXqVOvvxhhNnTpVXl5eat68eZ71PT09dffdd+vzzz/P8x+eS4eWdsbp06d1//336/jx43r22WftJiglSpTQsGHDlJiYqEWLFl32ei/2zz//5PpEPKdHO+eY8Pf3l5T38e5qeb3/xhhNmTIlV938zsO2bdsqKyvL5r2WpEmTJslisTh8F0BeXH1+t2jRQl5eXnrzzTdttvnSEdukC3cSbNiwQUuXLs0178SJE7mu6a6Q3zHarVs3ZWVl6aWXXsq1zPnz563vSatWrRQYGKiEhASbr/uQ/n2PC+M65Gh89tpw5f4OCwvTbbfdpvfff1/79++3mZezLwrzeoOrix4nFDlPPvmkunbtqlmzZmnAgAGaMGGC2rRpowYNGqhfv37W4ciDg4Pz/N6NvXv36q677tIdd9yhDRs2aPbs2erRo4fq169vrfPggw/q1Vdf1YMPPqgbbrhBa9assX5CnSM9PV2VKlVSly5dVL9+fQUEBGj58uXatGmTJk6caK0XHx+vTz/9VEOHDtWNN96ogIAAtW/f3uHt9fDw0Lvvvqs2bdqoTp06euCBB1SxYkUdOHBAq1atUlBQkL766iuH4lm5cqUGDRqkrl27qmbNmjp//rw+/vhj60U7P15eXho3bpweeOABNWnSRN27d7cOGxsZGakhQ4Y4vD0Xq1Gjhj766CN1795dsbGx6tevn6pWrark5GS99957+ueffzR37lybHsJ7771XTz/9tDp16qTHH39cGRkZmj59umrWrGnz8GyrVq3k7e2t9u3bq3///jp58qTeeecdhYeHX/anxNddd508PT01btw4paamysfHx/o9UQ8++KAGDBigu+++Wy1bttQvv/yipUuXXtazWZfDy8tLCxYsUIsWLXTbbbepW7duatSokby8vPTbb79pzpw5Cg0N1dixYwvt/SxIZmammjdvrm7dumnXrl166623dOutt+quu+6SJDVs2FChoaHq3bu3Hn/8cVksFn388cd53u7i7Dnl6+urJUuWqHfv3rr55pv17bff6uuvv9YzzzxT4K1Fr776qlatWqWbb75ZDz30kGrXrq3jx49ry5YtWr58uY4fP253uw8cOKDZs2dLuvAJ/s6dOzVv3jwdPHhQw4YNU//+/e22IV34/qJRo0Zp3Lhx6tixo936W7Zssa73YtWrV1eDBg304Ycf6q233lKnTp1UvXp1paen65133lFQUJD1Ayc/Pz/Vrl1bn376qWrWrKlSpUqpbt26BT6rcbmio6NVvXp1DR8+XAcOHFBQUJA+//zzPJ+Xi4+PlyQ9/vjjat26tTw9PXXvvfeqffv2atasmZ599lklJyerfv36+u6777Ro0SINHjzYqeHcL+Xq8zvnO4hyhmtv27attm7dqm+//TZXm08++aS+/PJL3XnnndavSDh16pS2b9+u+fPnKzk5+YquM84co02aNFH//v2VkJCgbdu2qVWrVvLy8tKePXs0b948TZkyRV26dFFQUJAmTZqkBx98UDfeeKN69Oih0NBQ/fLLL8rIyNCHH35YKNchR+MrSGHs7zfeeEO33nqr4uLi9PDDD1v/zn399dfatm2bJNdcb1AEXL0B/IB/FTSkdVZWlqlevbqpXr26OX/+vDHGmOXLl5tGjRoZPz8/ExQUZNq3b2927txps1zO8Lk7d+40Xbp0MYGBgSY0NNQMGjQo13CpGRkZpl+/fiY4ONgEBgaabt26mcOH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FStWNO+//751mb179xpJZuvWrcYYY1atWmUkmeXLl5v4+Hjj5+dnGjRoYJKSkqzL/P777+auu+4y4eHhpmTJkuaGG24wy5Yts85v0qRJrm0wxpgPPvjABAcH28T81ltvmWrVqhkvLy9Ts2ZN89FHH9nMl2Teeecd07FjR+Pn52dq1KhhFi1aVOB71aRJE/PEE0/YlMXFxZlOnTq5ZRsutWnTJuPh4WF9z425cNx4eXmZIUOG5LlMdna29fejR4+ae++911SoUMH4+fmZunXrmjlz5uTaB4MGDTJPPPGECQkJMeHh4WbmzJnm5MmTpk+fPiYgIMBUr17dfPPNN9Zlct77JUuWmOuuu874+vqaZs2amUOHDplvvvnGREdHm8DAQNO9e3dz6tQp63LffvutadSokQkODjalSpUy7dq1M7///nuubahatap59913C9w3AHA10eMEAC52/PhxLVmyRAMHDlTJkiVzzc955iU7O1sdOnTQ8ePH9f3332vZsmX6888/dc8999jU/+OPP/TFF19o8eLFWrx4sb7//nu9+uqrkqQpU6aoQYMG1h6TlJQURUREKDs7W5UqVdK8efO0c+dOjRo1Ss8884w+++wzm7ZXrlypv//+W2vWrNHrr7+u0aNH684771RoaKg2btyoAQMGqH///nafN3n22Wc1ceJE/fzzzypRooT69u1rnXfy5Em1bdtWK1as0NatW3XHHXeoffv22r9/vyRpwYIFqlSpkl588UXrNuRl4cKFeuKJJzRs2DDt2LFD/fv31wMPPKBVq1bZ1BszZoy6deumX3/9VW3bttV9993ncM+FMUZr165VUlKSvL293bYNF1u7dq1q1qypwMBAa9nnn3+uc+fO6amnnspzGYvFYv39zJkzio+P19dff60dO3bo4Ycf1v3336+ffvrJZpkPP/xQZcqU0U8//aTHHntMjzzyiLp27aqGDRtqy5YtatWqle6//35lZGTYLPfCCy9o6tSp+uGHH/TXX3+pW7dumjx5subMmaOvv/5a3333nd58801r/VOnTmno0KH6+eeftWLFCnl4eKhTp07Kzs62afemm27S2rVr890vAHDVuTtzA4BrzcaNG40ks2DBggLrfffdd8bT09Ps37/fWvbbb78ZSeann34yxlzocfL397fpbXjyySfNzTffbJ3Oq8ckLwMHDjR33323dbp3796mSpUqJisry1pWq1Yt07hxY+v0+fPnTcmSJc3/+3//zxhTcI9Tjq+//tpIMqdPn843ljp16pg333zTOl2lShUzadIkmzqX9tY0bNjQPPTQQzZ1unbtatq2bWudlmSee+456/TJkyeNJPPtt9/mG0uTJk2Ml5eXKVmypPHy8jKSjK+vr1m/fn2+yxTmNlzqiSeeMLfffrtN2YABA0xQUJBN2fz5803JkiWtr19//TXfNtu1a2eGDRtmnW7SpIm59dZbrdM57/v9999vLUtJSTGSzIYNG4wxeb/3CQkJRpL5448/rGX9+/c3rVu3zjeWI0eOGElm+/btNuVDhgwxTZs2zXc5ALja6HECABczDg4qkJiYqIiICEVERFjLateurZCQECUmJlrLIiMjbXobypcvr8OHD9ttf9q0aYqPj1dYWJgCAgI0c+ZMaw9Jjjp16sjD498/BWXLllVsbKx12tPTU6VLl7a7vnr16tnEJ8m6zMmTJzV8+HDFxMQoJCREAQEBSkxMzBWLPYmJiWrUqJFNWaNGjWz21aWxlCxZUkFBQXbjv++++7Rt2zatX79ebdq00bPPPmszEMPV3oaLnT59Wr6+vrnKL+5VkqTWrVtr27Zt+vrrr3Xq1CllZWVJkrKysvTSSy8pNjZWpUqVUkBAgJYuXZor9ov3W877fvGxULZsWUnKtS8vXq5s2bLy9/dXtWrVbMouXmbPnj3q3r27qlWrpqCgIEVGRkpSrnj8/Pxy9W4BgDsV/tO9AFDMREVFyWKxKCkpySXteXl52UxbLJZctzVdau7cuRo+fLgmTpyoBg0aKDAwUBMmTNDGjRvttn0567t4mZx/6HOWGT58uJYtW6bXXntNNWrUkJ+fn7p06aLMzMwC27xclxN/cHCwatSoIUn67LPPVKNGDd1yyy1q0aKFW7bhYmXKlNH27dttyqKiopSamqqDBw+qXLlykqSAgADVqFEj18AdEyZM0JQpUzR58mTFxsaqZMmSGjx4cK7Y7R0Ll76veS3nyPHTvn17ValSRe+8844qVKig7Oxs1a1bN1c8x48fV1hYWP47BgCuMnqcAMDFSpUqpdatW2vatGk6depUrvknTpyQJMXExOivv/7SX3/9ZZ23c+dOnThxQrVr13Z4fd7e3tbehRzr169Xw4YN9eijj+r6669XjRo19Mcff1zeBl2h9evXq0+fPurUqZNiY2NVrlw5JScn29TJaxsuFRMTo/Xr1+dq25l95YiAgAA98cQTGj58uLX30J3bcP311yspKcmmJ7NLly7y8vLSuHHj7G7P+vXr1aFDB/Xs2VP169dXtWrVrsow73k5duyYdu3apeeee07NmzdXTEyM/vnnnzzr7tixQ9dff/1VjhAA8kfiBACFYNq0acrKytJNN92kzz//XHv27FFiYqLeeOMNNWjQQJLUokULxcbG6r777tOWLVv0008/qVevXmrSpIluuOEGh9cVGRmpjRs3Kjk5WUePHlV2draioqL0888/a+nSpdq9e7eef/55bdq0qbA2t0BRUVFasGCBtm3bpl9++UU9evTI1WsRGRmpNWvW6MCBAzp69Gie7Tz55JOaNWuWpk+frj179uj111/XggULNHz4cJfH3L9/f+3evVuff/6527ehWbNmOnnypH777TdrWeXKlTVx4kRNmTJFvXv31qpVq5ScnKwtW7bojTfekHThdruc2JctW6YffvhBiYmJ6t+/vw4dOnRF++dyhYaGqnTp0po5c6Z+//13rVy5UkOHDs1VLyMjQ5s3b1arVq3cECUA5I3ECQAKQbVq1bRlyxY1a9ZMw4YNU926ddWyZUutWLFC06dPl3ThFqZFixYpNDRUt912m1q0aKFq1arp008/dWpdw4cPl6enp2rXrq2wsDDt379f/fv3V+fOnXXPPffo5ptv1rFjx/Too48Wxqba9frrrys0NFQNGzZU+/bt1bp1a8XFxdnUefHFF5WcnKzq1avne3tWx44dNWXKFL322muqU6eOZsyYoQ8++EBNmzZ1ecylSpVSr1699MILLyg7O9ut21C6dGl16tRJn3zyiU35Y489pu+++05HjhxRly5dFBUVpbZt22rv3r1asmSJ9fmk5557TnFxcWrdurWaNm2qcuXKqWPHjle0fy6Xh4eH5s6dq82bN6tu3boaMmSIJkyYkKveokWLVLlyZTVu3NgNUQJA3izG0aeYAQCAW/z6669q2bKl/vjjDwUEBLg7nEJ3yy236PHHH1ePHj3cHQoAWNHjBABAEVevXj2NGzdOe/fudXcohe7o0aPq3Lmzunfv7u5QAMAGPU4AAAAAYAc9TgAAAABgB4kTAAAAANhB4gQAAAAAdpA4AQAAAIAdJE4AAAAAYAeJEwAAAADYQeIEAAAAAHaQOAEAAACAHSROAAAAAGDH/wd+idfDlM3xcwAAAABJRU5ErkJggg==\n"
          },
          "metadata": {}
        }
      ],
      "source": [
        "# 필요한 라이브러리 설치 (필요시 주석 해제)\n",
        "# !pip install numpy pandas scipy scikit-learn torch matplotlib\n",
        "import numpy as np\n",
        "import pandas as pd\n",
        "import torch\n",
        "import torch.nn as nn\n",
        "import torch.optim as optim\n",
        "from scipy.stats import norm\n",
        "from sklearn.preprocessing import StandardScaler\n",
        "from sklearn.linear_model import ElasticNet, LogisticRegression\n",
        "import matplotlib.pyplot as plt\n",
        "\n",
        "# ---------------------------------------------------------\n",
        "# 1. Data Generation (Quantum-Inspired Synthetic Data)\n",
        "# ---------------------------------------------------------\n",
        "def generate_quantum_data(n=100, p=100, gamma=0.2, tau_true=2.0):\n",
        "    \"\"\"\n",
        "    n: Sample size (replicates HDLSS regime)\n",
        "    p: Covariate dimension (p > n)\n",
        "    gamma: Outlier (decoherence) ratio\n",
        "    tau_true: Ground truth causal effect\n",
        "    \"\"\"\n",
        "    # High-dimensional basis states (X)\n",
        "    X = np.random.normal(0, 1, (n, p))\n",
        "\n",
        "    # Latent space extraction (Simplified VAE mapping)\n",
        "    # In the paper, a VAE performs this state tomography\n",
        "    latent_c = np.tanh(X[:, :5] @ np.random.uniform(0.5, 2.0, (5, 1))).flatten()\n",
        "\n",
        "    # Treatment Assignment: Propensity Score\n",
        "    pi_true = 1 / (1 + np.exp(-latent_c))\n",
        "    D = np.random.binomial(1, pi_true)\n",
        "\n",
        "    # Generate Counterfactual Outcomes\n",
        "    epsilon = np.random.normal(0, 1, n)\n",
        "    Y0 = latent_c * 1.5 + epsilon\n",
        "    Y1 = Y0 + tau_true\n",
        "    Y = D * Y1 + (1 - D) * Y0\n",
        "\n",
        "    # Environmental Decoherence (Outlier Contamination)\n",
        "    n_outliers = int(n * gamma)\n",
        "    if n_outliers > 0:\n",
        "        outlier_idx = np.random.choice(n, n_outliers, replace=False)\n",
        "        # Injection of heavy-tail noise\n",
        "        Y[outlier_idx] += np.random.uniform(10, 20, n_outliers)\n",
        "\n",
        "    # Non-Unitary Selection Mechanism (MNAR)\n",
        "    # Probability of observation depends on the outcome Y (Measurement Back-action)\n",
        "    prob_m = 1 / (1 + np.exp(0.5 * (Y - np.mean(Y))))\n",
        "    M = np.random.binomial(1, prob_m)\n",
        "\n",
        "    return X, D, Y, M, latent_c, tau_true\n",
        "\n",
        "# ---------------------------------------------------------\n",
        "# 2. Latent State Tomography (Simplified VAE)\n",
        "# ---------------------------------------------------------\n",
        "class StateTomographyVAE(nn.Module):\n",
        "    def __init__(self, input_dim, latent_dim=1):\n",
        "        super(StateTomographyVAE, self).__init__()\n",
        "        self.encoder = nn.Sequential(\n",
        "            nn.Linear(input_dim, 32),\n",
        "            nn.ReLU(),\n",
        "            nn.Linear(32, latent_dim)\n",
        "        )\n",
        "    def forward(self, x):\n",
        "        return self.encoder(x)\n",
        "\n",
        "# ---------------------------------------------------------\n",
        "# 3. Selection-Aware Doubly Robust Estimator\n",
        "# ---------------------------------------------------------\n",
        "def run_simulation(n=100, p=100, gamma=0.1):\n",
        "    X, D, Y, M, latent_c, tau_true = generate_quantum_data(n, p, gamma)\n",
        "\n",
        "    # Standardization\n",
        "    scaler = StandardScaler()\n",
        "    X_scaled = scaler.fit_transform(X)\n",
        "\n",
        "    # [Step 1] State Tomography via VAE\n",
        "    X_tensor = torch.FloatTensor(X_scaled)\n",
        "    vae = StateTomographyVAE(input_dim=p, latent_dim=1)\n",
        "    with torch.no_grad():\n",
        "        c_hat = vae(X_tensor).numpy().flatten()\n",
        "\n",
        "    # [Step 2] Selection Weighting (w_i) - MNAR Correction\n",
        "    # Modeling the measurement back-action (selection bias)\n",
        "    selector = LogisticRegression()\n",
        "    selector.fit(c_hat.reshape(-1, 1), M)\n",
        "    pi_M = selector.predict_proba(c_hat.reshape(-1, 1))[:, 1]\n",
        "    weights = 1.0 / (pi_M + 1e-6) # Inverse Selection Probability Weighting\n",
        "\n",
        "    # [Step 3] Outcome Projection & Propensity Instrument (DR)\n",
        "    obs = (M == 1)\n",
        "    # Propensity Instrument model\n",
        "    prop_model = LogisticRegression()\n",
        "    prop_model.fit(c_hat[obs].reshape(-1, 1), D[obs])\n",
        "    e_hat = prop_model.predict_proba(c_hat[obs].reshape(-1, 1))[:, 1]\n",
        "\n",
        "    # Outcome Regression (Regularized for HDLSS robustness)\n",
        "    m1_model = ElasticNet(alpha=0.1)\n",
        "    m0_model = ElasticNet(alpha=0.1)\n",
        "\n",
        "    m1_model.fit(c_hat[obs & (D == 1)].reshape(-1, 1), Y[obs & (D == 1)])\n",
        "    m0_model.fit(c_hat[obs & (D == 0)].reshape(-1, 1), Y[obs & (D == 0)])\n",
        "\n",
        "    mu1_hat = m1_model.predict(c_hat[obs].reshape(-1, 1))\n",
        "    mu0_hat = m0_model.predict(c_hat[obs].reshape(-1, 1))\n",
        "\n",
        "    # [Step 4] Doubly Robust Estimator with Selection-Aware Re-normalization\n",
        "    Y_obs = Y[obs]\n",
        "    D_obs = D[obs]\n",
        "    W_obs = weights[obs]\n",
        "\n",
        "    dr_term1 = (D_obs * (Y_obs - mu1_hat) / (e_hat + 1e-6)) + mu1_hat\n",
        "    dr_term0 = ((1 - D_obs) * (Y_obs - mu0_hat) / (1 - e_hat + 1e-6)) + mu0_hat\n",
        "\n",
        "    # Weighted average of the Influence Function\n",
        "    tau_dr = np.mean(W_obs * (dr_term1 - dr_term0)) / np.mean(W_obs)\n",
        "\n",
        "    return tau_dr, tau_true\n",
        "\n",
        "# ---------------------------------------------------------\n",
        "# 4. Results Analysis and Visualization\n",
        "# ---------------------------------------------------------\n",
        "results = []\n",
        "gammas = [0.0, 0.1, 0.2, 0.3] # Contamination levels\n",
        "for g in gammas:\n",
        "    estimates = [run_simulation(n=80, p=150, gamma=g)[0] for _ in range(20)]\n",
        "    results.append(estimates)\n",
        "\n",
        "plt.figure(figsize=(10, 6))\n",
        "plt.boxplot(results, labels=[f\"$\\gamma$={g}\" for g in gammas])\n",
        "plt.axhline(y=2.0, color='r', linestyle='--', label='True Causal Effect (${\\\\tau}$)')\n",
        "plt.title(\"Robustness of Quantum-Compatible DR Estimator under Decoherence\")\n",
        "plt.ylabel(\"Estimated Causal Effect\")\n",
        "plt.xlabel(\"Contamination Ratio (Gamma)\")\n",
        "plt.legend()\n",
        "plt.show()"
      ]
    }
  ]
}