{
  "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": 2,
      "metadata": {
        "colab": {
          "base_uri": "https://localhost:8080/",
          "height": 1000
        },
        "id": "Jxxnia0MJpXV",
        "outputId": "1d2c2a77-80fe-447b-8c72-b5aaf6720bcb"
      },
      "outputs": [
        {
          "output_type": "stream",
          "name": "stdout",
          "text": [
            "Requirement already satisfied: pyod in /usr/local/lib/python3.12/dist-packages (3.5.2)\n",
            "Requirement already satisfied: openpyxl in /usr/local/lib/python3.12/dist-packages (3.1.5)\n",
            "Requirement already satisfied: joblib>=1.5 in /usr/local/lib/python3.12/dist-packages (from pyod) (1.5.3)\n",
            "Requirement already satisfied: matplotlib in /usr/local/lib/python3.12/dist-packages (from pyod) (3.10.0)\n",
            "Requirement already satisfied: numpy>=1.19 in /usr/local/lib/python3.12/dist-packages (from pyod) (2.0.2)\n",
            "Requirement already satisfied: numba>=0.51 in /usr/local/lib/python3.12/dist-packages (from pyod) (0.60.0)\n",
            "Requirement already satisfied: scipy>=1.5.1 in /usr/local/lib/python3.12/dist-packages (from pyod) (1.16.3)\n",
            "Requirement already satisfied: scikit-learn>=0.22.0 in /usr/local/lib/python3.12/dist-packages (from pyod) (1.6.1)\n",
            "Requirement already satisfied: et-xmlfile in /usr/local/lib/python3.12/dist-packages (from openpyxl) (2.0.0)\n",
            "Requirement already satisfied: llvmlite<0.44,>=0.43.0dev0 in /usr/local/lib/python3.12/dist-packages (from numba>=0.51->pyod) (0.43.0)\n",
            "Requirement already satisfied: threadpoolctl>=3.1.0 in /usr/local/lib/python3.12/dist-packages (from scikit-learn>=0.22.0->pyod) (3.6.0)\n",
            "Requirement already satisfied: contourpy>=1.0.1 in /usr/local/lib/python3.12/dist-packages (from matplotlib->pyod) (1.3.3)\n",
            "Requirement already satisfied: cycler>=0.10 in /usr/local/lib/python3.12/dist-packages (from matplotlib->pyod) (0.12.1)\n",
            "Requirement already satisfied: fonttools>=4.22.0 in /usr/local/lib/python3.12/dist-packages (from matplotlib->pyod) (4.63.0)\n",
            "Requirement already satisfied: kiwisolver>=1.3.1 in /usr/local/lib/python3.12/dist-packages (from matplotlib->pyod) (1.5.0)\n",
            "Requirement already satisfied: packaging>=20.0 in /usr/local/lib/python3.12/dist-packages (from matplotlib->pyod) (26.2)\n",
            "Requirement already satisfied: pillow>=8 in /usr/local/lib/python3.12/dist-packages (from matplotlib->pyod) (11.3.0)\n",
            "Requirement already satisfied: pyparsing>=2.3.1 in /usr/local/lib/python3.12/dist-packages (from matplotlib->pyod) (3.3.2)\n",
            "Requirement already satisfied: python-dateutil>=2.7 in /usr/local/lib/python3.12/dist-packages (from matplotlib->pyod) (2.9.0.post0)\n",
            "Requirement already satisfied: six>=1.5 in /usr/local/lib/python3.12/dist-packages (from python-dateutil>=2.7->matplotlib->pyod) (1.17.0)\n",
            "Experiment: 30 runs, 4 ksi values (original NNFA, 500 epochs)\n",
            "Now using 1 outlier (highest strength replaced by mean).\n",
            "\n",
            "--- Run 1/30, seed = 0 ---\n",
            "  NNFA (ξ=0) F1 = 1.000, AUC = 1.000\n",
            "  NNFA (ξ=0.01) F1 = 1.000, AUC = 1.000\n",
            "  NNFA (ξ=0.5) F1 = 1.000, AUC = 1.000\n",
            "  NNFA (ξ=1) F1 = 1.000, AUC = 1.000\n",
            "\n",
            "--- Run 2/30, seed = 1 ---\n",
            "  NNFA (ξ=0) F1 = 1.000, AUC = 1.000\n",
            "  NNFA (ξ=0.01) F1 = 1.000, AUC = 1.000\n",
            "  NNFA (ξ=0.5) F1 = 1.000, AUC = 1.000\n",
            "  NNFA (ξ=1) F1 = 1.000, AUC = 1.000\n",
            "\n",
            "--- Run 3/30, seed = 2 ---\n",
            "  NNFA (ξ=0) F1 = 1.000, AUC = 1.000\n",
            "  NNFA (ξ=0.01) F1 = 1.000, AUC = 1.000\n",
            "  NNFA (ξ=0.5) F1 = 1.000, AUC = 1.000\n",
            "  NNFA (ξ=1) F1 = 1.000, AUC = 1.000\n",
            "\n",
            "--- Run 4/30, seed = 3 ---\n",
            "  NNFA (ξ=0) F1 = 1.000, AUC = 1.000\n",
            "  NNFA (ξ=0.01) F1 = 1.000, AUC = 1.000\n",
            "  NNFA (ξ=0.5) F1 = 1.000, AUC = 1.000\n",
            "  NNFA (ξ=1) F1 = 1.000, AUC = 1.000\n",
            "\n",
            "--- Run 5/30, seed = 4 ---\n",
            "  NNFA (ξ=0) F1 = 1.000, AUC = 1.000\n",
            "  NNFA (ξ=0.01) F1 = 1.000, AUC = 1.000\n",
            "  NNFA (ξ=0.5) F1 = 1.000, AUC = 1.000\n",
            "  NNFA (ξ=1) F1 = 1.000, AUC = 1.000\n",
            "\n",
            "--- Run 6/30, seed = 5 ---\n",
            "  NNFA (ξ=0) F1 = 1.000, AUC = 1.000\n",
            "  NNFA (ξ=0.01) F1 = 1.000, AUC = 1.000\n",
            "  NNFA (ξ=0.5) F1 = 1.000, AUC = 1.000\n",
            "  NNFA (ξ=1) F1 = 1.000, AUC = 1.000\n",
            "\n",
            "--- Run 7/30, seed = 6 ---\n",
            "  NNFA (ξ=0) F1 = 1.000, AUC = 1.000\n",
            "  NNFA (ξ=0.01) F1 = 1.000, AUC = 1.000\n",
            "  NNFA (ξ=0.5) F1 = 1.000, AUC = 1.000\n",
            "  NNFA (ξ=1) F1 = 1.000, AUC = 1.000\n",
            "\n",
            "--- Run 8/30, seed = 7 ---\n",
            "  NNFA (ξ=0) F1 = 1.000, AUC = 1.000\n",
            "  NNFA (ξ=0.01) F1 = 1.000, AUC = 1.000\n",
            "  NNFA (ξ=0.5) F1 = 1.000, AUC = 1.000\n",
            "  NNFA (ξ=1) F1 = 1.000, AUC = 1.000\n",
            "\n",
            "--- Run 9/30, seed = 8 ---\n",
            "  NNFA (ξ=0) F1 = 1.000, AUC = 1.000\n",
            "  NNFA (ξ=0.01) F1 = 1.000, AUC = 1.000\n",
            "  NNFA (ξ=0.5) F1 = 1.000, AUC = 1.000\n",
            "  NNFA (ξ=1) F1 = 1.000, AUC = 1.000\n",
            "\n",
            "--- Run 10/30, seed = 9 ---\n",
            "  NNFA (ξ=0) F1 = 1.000, AUC = 1.000\n",
            "  NNFA (ξ=0.01) F1 = 1.000, AUC = 1.000\n",
            "  NNFA (ξ=0.5) F1 = 1.000, AUC = 1.000\n",
            "  NNFA (ξ=1) F1 = 1.000, AUC = 1.000\n",
            "\n",
            "--- Run 11/30, seed = 10 ---\n",
            "  NNFA (ξ=0) F1 = 1.000, AUC = 1.000\n",
            "  NNFA (ξ=0.01) F1 = 1.000, AUC = 1.000\n",
            "  NNFA (ξ=0.5) F1 = 1.000, AUC = 1.000\n",
            "  NNFA (ξ=1) F1 = 1.000, AUC = 1.000\n",
            "\n",
            "--- Run 12/30, seed = 11 ---\n",
            "  NNFA (ξ=0) F1 = 1.000, AUC = 1.000\n",
            "  NNFA (ξ=0.01) F1 = 1.000, AUC = 1.000\n",
            "  NNFA (ξ=0.5) F1 = 1.000, AUC = 1.000\n",
            "  NNFA (ξ=1) F1 = 1.000, AUC = 1.000\n",
            "\n",
            "--- Run 13/30, seed = 12 ---\n",
            "  NNFA (ξ=0) F1 = 1.000, AUC = 1.000\n",
            "  NNFA (ξ=0.01) F1 = 1.000, AUC = 1.000\n",
            "  NNFA (ξ=0.5) F1 = 1.000, AUC = 1.000\n",
            "  NNFA (ξ=1) F1 = 1.000, AUC = 1.000\n",
            "\n",
            "--- Run 14/30, seed = 13 ---\n",
            "  NNFA (ξ=0) F1 = 1.000, AUC = 1.000\n",
            "  NNFA (ξ=0.01) F1 = 1.000, AUC = 1.000\n",
            "  NNFA (ξ=0.5) F1 = 1.000, AUC = 1.000\n",
            "  NNFA (ξ=1) F1 = 1.000, AUC = 1.000\n",
            "\n",
            "--- Run 15/30, seed = 14 ---\n",
            "  NNFA (ξ=0) F1 = 1.000, AUC = 1.000\n",
            "  NNFA (ξ=0.01) F1 = 1.000, AUC = 1.000\n",
            "  NNFA (ξ=0.5) F1 = 1.000, AUC = 1.000\n",
            "  NNFA (ξ=1) F1 = 1.000, AUC = 1.000\n",
            "\n",
            "--- Run 16/30, seed = 15 ---\n",
            "  NNFA (ξ=0) F1 = 1.000, AUC = 1.000\n",
            "  NNFA (ξ=0.01) F1 = 1.000, AUC = 1.000\n",
            "  NNFA (ξ=0.5) F1 = 1.000, AUC = 1.000\n",
            "  NNFA (ξ=1) F1 = 1.000, AUC = 1.000\n",
            "\n",
            "--- Run 17/30, seed = 16 ---\n",
            "  NNFA (ξ=0) F1 = 1.000, AUC = 1.000\n",
            "  NNFA (ξ=0.01) F1 = 1.000, AUC = 1.000\n",
            "  NNFA (ξ=0.5) F1 = 1.000, AUC = 1.000\n",
            "  NNFA (ξ=1) F1 = 1.000, AUC = 1.000\n",
            "\n",
            "--- Run 18/30, seed = 17 ---\n",
            "  NNFA (ξ=0) F1 = 1.000, AUC = 1.000\n",
            "  NNFA (ξ=0.01) F1 = 1.000, AUC = 1.000\n",
            "  NNFA (ξ=0.5) F1 = 1.000, AUC = 1.000\n",
            "  NNFA (ξ=1) F1 = 1.000, AUC = 1.000\n",
            "\n",
            "--- Run 19/30, seed = 18 ---\n",
            "  NNFA (ξ=0) F1 = 1.000, AUC = 1.000\n",
            "  NNFA (ξ=0.01) F1 = 1.000, AUC = 1.000\n",
            "  NNFA (ξ=0.5) F1 = 1.000, AUC = 1.000\n",
            "  NNFA (ξ=1) F1 = 1.000, AUC = 1.000\n",
            "\n",
            "--- Run 20/30, seed = 19 ---\n",
            "  NNFA (ξ=0) F1 = 1.000, AUC = 1.000\n",
            "  NNFA (ξ=0.01) F1 = 1.000, AUC = 1.000\n",
            "  NNFA (ξ=0.5) F1 = 1.000, AUC = 1.000\n",
            "  NNFA (ξ=1) F1 = 1.000, AUC = 1.000\n",
            "\n",
            "--- Run 21/30, seed = 20 ---\n",
            "  NNFA (ξ=0) F1 = 1.000, AUC = 1.000\n",
            "  NNFA (ξ=0.01) F1 = 1.000, AUC = 1.000\n",
            "  NNFA (ξ=0.5) F1 = 1.000, AUC = 1.000\n",
            "  NNFA (ξ=1) F1 = 1.000, AUC = 1.000\n",
            "\n",
            "--- Run 22/30, seed = 21 ---\n",
            "  NNFA (ξ=0) F1 = 1.000, AUC = 1.000\n",
            "  NNFA (ξ=0.01) F1 = 1.000, AUC = 1.000\n",
            "  NNFA (ξ=0.5) F1 = 1.000, AUC = 1.000\n",
            "  NNFA (ξ=1) F1 = 1.000, AUC = 1.000\n",
            "\n",
            "--- Run 23/30, seed = 22 ---\n",
            "  NNFA (ξ=0) F1 = 1.000, AUC = 1.000\n",
            "  NNFA (ξ=0.01) F1 = 1.000, AUC = 1.000\n",
            "  NNFA (ξ=0.5) F1 = 1.000, AUC = 1.000\n",
            "  NNFA (ξ=1) F1 = 1.000, AUC = 1.000\n",
            "\n",
            "--- Run 24/30, seed = 23 ---\n",
            "  NNFA (ξ=0) F1 = 1.000, AUC = 1.000\n",
            "  NNFA (ξ=0.01) F1 = 1.000, AUC = 1.000\n",
            "  NNFA (ξ=0.5) F1 = 1.000, AUC = 1.000\n",
            "  NNFA (ξ=1) F1 = 1.000, AUC = 1.000\n",
            "\n",
            "--- Run 25/30, seed = 24 ---\n",
            "  NNFA (ξ=0) F1 = 1.000, AUC = 1.000\n",
            "  NNFA (ξ=0.01) F1 = 1.000, AUC = 1.000\n",
            "  NNFA (ξ=0.5) F1 = 1.000, AUC = 1.000\n",
            "  NNFA (ξ=1) F1 = 1.000, AUC = 1.000\n",
            "\n",
            "--- Run 26/30, seed = 25 ---\n",
            "  NNFA (ξ=0) F1 = 1.000, AUC = 1.000\n",
            "  NNFA (ξ=0.01) F1 = 1.000, AUC = 1.000\n",
            "  NNFA (ξ=0.5) F1 = 1.000, AUC = 1.000\n",
            "  NNFA (ξ=1) F1 = 1.000, AUC = 1.000\n",
            "\n",
            "--- Run 27/30, seed = 26 ---\n",
            "  NNFA (ξ=0) F1 = 1.000, AUC = 1.000\n",
            "  NNFA (ξ=0.01) F1 = 1.000, AUC = 1.000\n",
            "  NNFA (ξ=0.5) F1 = 1.000, AUC = 1.000\n",
            "  NNFA (ξ=1) F1 = 1.000, AUC = 1.000\n",
            "\n",
            "--- Run 28/30, seed = 27 ---\n",
            "  NNFA (ξ=0) F1 = 1.000, AUC = 1.000\n",
            "  NNFA (ξ=0.01) F1 = 1.000, AUC = 1.000\n",
            "  NNFA (ξ=0.5) F1 = 1.000, AUC = 1.000\n",
            "  NNFA (ξ=1) F1 = 1.000, AUC = 1.000\n",
            "\n",
            "--- Run 29/30, seed = 28 ---\n",
            "  NNFA (ξ=0) F1 = 1.000, AUC = 1.000\n",
            "  NNFA (ξ=0.01) F1 = 1.000, AUC = 1.000\n",
            "  NNFA (ξ=0.5) F1 = 1.000, AUC = 1.000\n",
            "  NNFA (ξ=1) F1 = 1.000, AUC = 1.000\n",
            "\n",
            "--- Run 30/30, seed = 29 ---\n",
            "  NNFA (ξ=0) F1 = 1.000, AUC = 1.000\n",
            "  NNFA (ξ=0.01) F1 = 1.000, AUC = 1.000\n",
            "  NNFA (ξ=0.5) F1 = 1.000, AUC = 1.000\n",
            "  NNFA (ξ=1) F1 = 1.000, AUC = 1.000\n",
            "\n",
            "================================================================================\n",
            "SUMMARY TABLE (mean ± std) over 30 runs\n",
            "================================================================================\n",
            "                      Method F1 (mean ± std) ROC-AUC (mean ± std)\n",
            "      Neural Network (error)   0.800 ± 0.400        1.000 ± 0.001\n",
            "                  NNFA (ξ=0)   1.000 ± 0.000        1.000 ± 0.000\n",
            "                NNFA (ξ=0.5)   1.000 ± 0.000        1.000 ± 0.000\n",
            "               NNFA (ξ=0.01)   1.000 ± 0.000        1.000 ± 0.000\n",
            "                  NNFA (ξ=1)   1.000 ± 0.000        1.000 ± 0.000\n",
            "       Random Forest (error)   0.000 ± 0.000        0.999 ± 0.000\n",
            "            Combined (RF+AE)   0.000 ± 0.000        0.986 ± 0.010\n",
            "                  LOF (pyod)   0.000 ± 0.000        0.986 ± 0.000\n",
            "                COPOD (pyod)   0.000 ± 0.000        0.927 ± 0.000\n",
            "   Isolation Forest (with y)   0.000 ± 0.000        0.922 ± 0.036\n",
            "      IsolationForest (pyod)   0.000 ± 0.000        0.919 ± 0.028\n",
            "                OCSVM (pyod)   0.000 ± 0.000        0.911 ± 0.000\n",
            "                LOF (with y)   0.000 ± 0.000        0.904 ± 0.000\n",
            "                  PCA (pyod)   0.000 ± 0.000        0.892 ± 0.000\n",
            "                 HBOS (pyod)   0.000 ± 0.000        0.887 ± 0.000\n",
            "                  kNN (pyod)   0.000 ± 0.000        0.871 ± 0.000\n",
            "                 ABOD (pyod)   0.000 ± 0.000        0.845 ± 0.000\n",
            "Autoencoder (reconstruction)   0.000 ± 0.000        0.806 ± 0.087\n",
            "      One-Class SVM (with y)   0.000 ± 0.000        0.402 ± 0.295\n",
            "\n",
            "================================================================================\n",
            "PAIRWISE WILCOXON P-VALUES (upper triangle, rounded to 4 decimals)\n",
            "================================================================================\n",
            "                             ABOD (pyod) HBOS (pyod) IsolationForest (pyod) kNN (pyod) LOF (pyod) OCSVM (pyod) PCA (pyod) COPOD (pyod) Random Forest (error) Neural Network (error) Autoencoder (reconstruction) Combined (RF+AE) One-Class SVM (with y) Isolation Forest (with y) LOF (with y) NNFA (ξ=0) NNFA (ξ=0.01) NNFA (ξ=0.5) NNFA (ξ=1)\n",
            "ABOD (pyod)                          1.0         1.0                    1.0        1.0        1.0          1.0        1.0          1.0                   1.0                    0.0                          1.0              1.0                    1.0                       1.0          1.0        0.0           0.0          0.0        0.0\n",
            "HBOS (pyod)                          1.0         1.0                    1.0        1.0        1.0          1.0        1.0          1.0                   1.0                    0.0                          1.0              1.0                    1.0                       1.0          1.0        0.0           0.0          0.0        0.0\n",
            "IsolationForest (pyod)               1.0         1.0                    1.0        1.0        1.0          1.0        1.0          1.0                   1.0                    0.0                          1.0              1.0                    1.0                       1.0          1.0        0.0           0.0          0.0        0.0\n",
            "kNN (pyod)                           1.0         1.0                    1.0        1.0        1.0          1.0        1.0          1.0                   1.0                    0.0                          1.0              1.0                    1.0                       1.0          1.0        0.0           0.0          0.0        0.0\n",
            "LOF (pyod)                           1.0         1.0                    1.0        1.0        1.0          1.0        1.0          1.0                   1.0                    0.0                          1.0              1.0                    1.0                       1.0          1.0        0.0           0.0          0.0        0.0\n",
            "OCSVM (pyod)                         1.0         1.0                    1.0        1.0        1.0          1.0        1.0          1.0                   1.0                    0.0                          1.0              1.0                    1.0                       1.0          1.0        0.0           0.0          0.0        0.0\n",
            "PCA (pyod)                           1.0         1.0                    1.0        1.0        1.0          1.0        1.0          1.0                   1.0                    0.0                          1.0              1.0                    1.0                       1.0          1.0        0.0           0.0          0.0        0.0\n",
            "COPOD (pyod)                         1.0         1.0                    1.0        1.0        1.0          1.0        1.0          1.0                   1.0                    0.0                          1.0              1.0                    1.0                       1.0          1.0        0.0           0.0          0.0        0.0\n",
            "Random Forest (error)                1.0         1.0                    1.0        1.0        1.0          1.0        1.0          1.0                   1.0                    0.0                          1.0              1.0                    1.0                       1.0          1.0        0.0           0.0          0.0        0.0\n",
            "Neural Network (error)               0.0         0.0                    0.0        0.0        0.0          0.0        0.0          0.0                   0.0                    1.0                          0.0              0.0                    0.0                       0.0          0.0     0.0143        0.0143       0.0143     0.0143\n",
            "Autoencoder (reconstruction)         1.0         1.0                    1.0        1.0        1.0          1.0        1.0          1.0                   1.0                    0.0                          1.0              1.0                    1.0                       1.0          1.0        0.0           0.0          0.0        0.0\n",
            "Combined (RF+AE)                     1.0         1.0                    1.0        1.0        1.0          1.0        1.0          1.0                   1.0                    0.0                          1.0              1.0                    1.0                       1.0          1.0        0.0           0.0          0.0        0.0\n",
            "One-Class SVM (with y)               1.0         1.0                    1.0        1.0        1.0          1.0        1.0          1.0                   1.0                    0.0                          1.0              1.0                    1.0                       1.0          1.0        0.0           0.0          0.0        0.0\n",
            "Isolation Forest (with y)            1.0         1.0                    1.0        1.0        1.0          1.0        1.0          1.0                   1.0                    0.0                          1.0              1.0                    1.0                       1.0          1.0        0.0           0.0          0.0        0.0\n",
            "LOF (with y)                         1.0         1.0                    1.0        1.0        1.0          1.0        1.0          1.0                   1.0                    0.0                          1.0              1.0                    1.0                       1.0          1.0        0.0           0.0          0.0        0.0\n",
            "NNFA (ξ=0)                           0.0         0.0                    0.0        0.0        0.0          0.0        0.0          0.0                   0.0                 0.0143                          0.0              0.0                    0.0                       0.0          0.0        1.0           1.0          1.0        1.0\n",
            "NNFA (ξ=0.01)                        0.0         0.0                    0.0        0.0        0.0          0.0        0.0          0.0                   0.0                 0.0143                          0.0              0.0                    0.0                       0.0          0.0        1.0           1.0          1.0        1.0\n",
            "NNFA (ξ=0.5)                         0.0         0.0                    0.0        0.0        0.0          0.0        0.0          0.0                   0.0                 0.0143                          0.0              0.0                    0.0                       0.0          0.0        1.0           1.0          1.0        1.0\n",
            "NNFA (ξ=1)                           0.0         0.0                    0.0        0.0        0.0          0.0        0.0          0.0                   0.0                 0.0143                          0.0              0.0                    0.0                       0.0          0.0        1.0           1.0          1.0        1.0\n",
            "\n",
            "Full pairwise p-value matrix saved to 'pairwise_wilcoxon_matrix.csv'\n",
            "\n",
            "================================================================================\n",
            "DETAILED SIGNIFICANT DIFFERENCES (p < 0.05)\n",
            "================================================================================\n",
            "ABOD (pyod) vs Neural Network (error): p = 0.000001\n",
            "ABOD (pyod) vs NNFA (ξ=0): p = 0.000000\n",
            "ABOD (pyod) vs NNFA (ξ=0.01): p = 0.000000\n",
            "ABOD (pyod) vs NNFA (ξ=0.5): p = 0.000000\n",
            "ABOD (pyod) vs NNFA (ξ=1): p = 0.000000\n",
            "HBOS (pyod) vs Neural Network (error): p = 0.000001\n",
            "HBOS (pyod) vs NNFA (ξ=0): p = 0.000000\n",
            "HBOS (pyod) vs NNFA (ξ=0.01): p = 0.000000\n",
            "HBOS (pyod) vs NNFA (ξ=0.5): p = 0.000000\n",
            "HBOS (pyod) vs NNFA (ξ=1): p = 0.000000\n",
            "IsolationForest (pyod) vs Neural Network (error): p = 0.000001\n",
            "IsolationForest (pyod) vs NNFA (ξ=0): p = 0.000000\n",
            "IsolationForest (pyod) vs NNFA (ξ=0.01): p = 0.000000\n",
            "IsolationForest (pyod) vs NNFA (ξ=0.5): p = 0.000000\n",
            "IsolationForest (pyod) vs NNFA (ξ=1): p = 0.000000\n",
            "kNN (pyod) vs Neural Network (error): p = 0.000001\n",
            "kNN (pyod) vs NNFA (ξ=0): p = 0.000000\n",
            "kNN (pyod) vs NNFA (ξ=0.01): p = 0.000000\n",
            "kNN (pyod) vs NNFA (ξ=0.5): p = 0.000000\n",
            "kNN (pyod) vs NNFA (ξ=1): p = 0.000000\n",
            "LOF (pyod) vs Neural Network (error): p = 0.000001\n",
            "LOF (pyod) vs NNFA (ξ=0): p = 0.000000\n",
            "LOF (pyod) vs NNFA (ξ=0.01): p = 0.000000\n",
            "LOF (pyod) vs NNFA (ξ=0.5): p = 0.000000\n",
            "LOF (pyod) vs NNFA (ξ=1): p = 0.000000\n",
            "OCSVM (pyod) vs Neural Network (error): p = 0.000001\n",
            "OCSVM (pyod) vs NNFA (ξ=0): p = 0.000000\n",
            "OCSVM (pyod) vs NNFA (ξ=0.01): p = 0.000000\n",
            "OCSVM (pyod) vs NNFA (ξ=0.5): p = 0.000000\n",
            "OCSVM (pyod) vs NNFA (ξ=1): p = 0.000000\n",
            "PCA (pyod) vs Neural Network (error): p = 0.000001\n",
            "PCA (pyod) vs NNFA (ξ=0): p = 0.000000\n",
            "PCA (pyod) vs NNFA (ξ=0.01): p = 0.000000\n",
            "PCA (pyod) vs NNFA (ξ=0.5): p = 0.000000\n",
            "PCA (pyod) vs NNFA (ξ=1): p = 0.000000\n",
            "COPOD (pyod) vs Neural Network (error): p = 0.000001\n",
            "COPOD (pyod) vs NNFA (ξ=0): p = 0.000000\n",
            "COPOD (pyod) vs NNFA (ξ=0.01): p = 0.000000\n",
            "COPOD (pyod) vs NNFA (ξ=0.5): p = 0.000000\n",
            "COPOD (pyod) vs NNFA (ξ=1): p = 0.000000\n",
            "Random Forest (error) vs Neural Network (error): p = 0.000001\n",
            "Random Forest (error) vs NNFA (ξ=0): p = 0.000000\n",
            "Random Forest (error) vs NNFA (ξ=0.01): p = 0.000000\n",
            "Random Forest (error) vs NNFA (ξ=0.5): p = 0.000000\n",
            "Random Forest (error) vs NNFA (ξ=1): p = 0.000000\n",
            "Neural Network (error) vs Autoencoder (reconstruction): p = 0.000001\n",
            "Neural Network (error) vs Combined (RF+AE): p = 0.000001\n",
            "Neural Network (error) vs One-Class SVM (with y): p = 0.000001\n",
            "Neural Network (error) vs Isolation Forest (with y): p = 0.000001\n",
            "Neural Network (error) vs LOF (with y): p = 0.000001\n",
            "Neural Network (error) vs NNFA (ξ=0): p = 0.014306\n",
            "Neural Network (error) vs NNFA (ξ=0.01): p = 0.014306\n",
            "Neural Network (error) vs NNFA (ξ=0.5): p = 0.014306\n",
            "Neural Network (error) vs NNFA (ξ=1): p = 0.014306\n",
            "Autoencoder (reconstruction) vs NNFA (ξ=0): p = 0.000000\n",
            "Autoencoder (reconstruction) vs NNFA (ξ=0.01): p = 0.000000\n",
            "Autoencoder (reconstruction) vs NNFA (ξ=0.5): p = 0.000000\n",
            "Autoencoder (reconstruction) vs NNFA (ξ=1): p = 0.000000\n",
            "Combined (RF+AE) vs NNFA (ξ=0): p = 0.000000\n",
            "Combined (RF+AE) vs NNFA (ξ=0.01): p = 0.000000\n",
            "Combined (RF+AE) vs NNFA (ξ=0.5): p = 0.000000\n",
            "Combined (RF+AE) vs NNFA (ξ=1): p = 0.000000\n",
            "One-Class SVM (with y) vs NNFA (ξ=0): p = 0.000000\n",
            "One-Class SVM (with y) vs NNFA (ξ=0.01): p = 0.000000\n",
            "One-Class SVM (with y) vs NNFA (ξ=0.5): p = 0.000000\n",
            "One-Class SVM (with y) vs NNFA (ξ=1): p = 0.000000\n",
            "Isolation Forest (with y) vs NNFA (ξ=0): p = 0.000000\n",
            "Isolation Forest (with y) vs NNFA (ξ=0.01): p = 0.000000\n",
            "Isolation Forest (with y) vs NNFA (ξ=0.5): p = 0.000000\n",
            "Isolation Forest (with y) vs NNFA (ξ=1): p = 0.000000\n",
            "LOF (with y) vs NNFA (ξ=0): p = 0.000000\n",
            "LOF (with y) vs NNFA (ξ=0.01): p = 0.000000\n",
            "LOF (with y) vs NNFA (ξ=0.5): p = 0.000000\n",
            "LOF (with y) vs NNFA (ξ=1): p = 0.000000\n",
            "\n",
            "Results saved to 'table5_all_ksi_results.xlsx'\n",
            "\n",
            "================================================================================\n",
            "STATISTICAL SIGNIFICANCE (Wilcoxon test, two-sided, for F1)\n",
            "================================================================================\n",
            "NNFA (ξ=0) vs Neural Network (error): p = 0.014306 -> significant (p<0.05)\n",
            "NNFA (ξ=0.01) vs Neural Network (error): p = 0.014306 -> significant (p<0.05)\n",
            "NNFA (ξ=0.5) vs Neural Network (error): p = 0.014306 -> significant (p<0.05)\n",
            "NNFA (ξ=1) vs Neural Network (error): p = 0.014306 -> significant (p<0.05)\n",
            "\n",
            "NNFA (ξ=0) vs NNFA (ξ=1): p = 1.000000 -> NOT significant\n"
          ]
        },
        {
          "output_type": "display_data",
          "data": {
            "text/plain": [
              "<IPython.core.display.Javascript object>"
            ],
            "application/javascript": [
              "\n",
              "    async function download(id, filename, size) {\n",
              "      if (!google.colab.kernel.accessAllowed) {\n",
              "        return;\n",
              "      }\n",
              "      const div = document.createElement('div');\n",
              "      const label = document.createElement('label');\n",
              "      label.textContent = `Downloading \"${filename}\": `;\n",
              "      div.appendChild(label);\n",
              "      const progress = document.createElement('progress');\n",
              "      progress.max = size;\n",
              "      div.appendChild(progress);\n",
              "      document.body.appendChild(div);\n",
              "\n",
              "      const buffers = [];\n",
              "      let downloaded = 0;\n",
              "\n",
              "      const channel = await google.colab.kernel.comms.open(id);\n",
              "      // Send a message to notify the kernel that we're ready.\n",
              "      channel.send({})\n",
              "\n",
              "      for await (const message of channel.messages) {\n",
              "        // Send a message to notify the kernel that we're ready.\n",
              "        channel.send({})\n",
              "        if (message.buffers) {\n",
              "          for (const buffer of message.buffers) {\n",
              "            buffers.push(buffer);\n",
              "            downloaded += buffer.byteLength;\n",
              "            progress.value = downloaded;\n",
              "          }\n",
              "        }\n",
              "      }\n",
              "      const blob = new Blob(buffers, {type: 'application/binary'});\n",
              "      const a = document.createElement('a');\n",
              "      a.href = window.URL.createObjectURL(blob);\n",
              "      a.download = filename;\n",
              "      div.appendChild(a);\n",
              "      a.click();\n",
              "      div.remove();\n",
              "    }\n",
              "  "
            ]
          },
          "metadata": {}
        },
        {
          "output_type": "display_data",
          "data": {
            "text/plain": [
              "<IPython.core.display.Javascript object>"
            ],
            "application/javascript": [
              "download(\"download_b32059ae-5c12-4c53-9c21-7e15ac56eec2\", \"table5_all_ksi_results.xlsx\", 7367)"
            ]
          },
          "metadata": {}
        },
        {
          "output_type": "display_data",
          "data": {
            "text/plain": [
              "<IPython.core.display.Javascript object>"
            ],
            "application/javascript": [
              "\n",
              "    async function download(id, filename, size) {\n",
              "      if (!google.colab.kernel.accessAllowed) {\n",
              "        return;\n",
              "      }\n",
              "      const div = document.createElement('div');\n",
              "      const label = document.createElement('label');\n",
              "      label.textContent = `Downloading \"${filename}\": `;\n",
              "      div.appendChild(label);\n",
              "      const progress = document.createElement('progress');\n",
              "      progress.max = size;\n",
              "      div.appendChild(progress);\n",
              "      document.body.appendChild(div);\n",
              "\n",
              "      const buffers = [];\n",
              "      let downloaded = 0;\n",
              "\n",
              "      const channel = await google.colab.kernel.comms.open(id);\n",
              "      // Send a message to notify the kernel that we're ready.\n",
              "      channel.send({})\n",
              "\n",
              "      for await (const message of channel.messages) {\n",
              "        // Send a message to notify the kernel that we're ready.\n",
              "        channel.send({})\n",
              "        if (message.buffers) {\n",
              "          for (const buffer of message.buffers) {\n",
              "            buffers.push(buffer);\n",
              "            downloaded += buffer.byteLength;\n",
              "            progress.value = downloaded;\n",
              "          }\n",
              "        }\n",
              "      }\n",
              "      const blob = new Blob(buffers, {type: 'application/binary'});\n",
              "      const a = document.createElement('a');\n",
              "      a.href = window.URL.createObjectURL(blob);\n",
              "      a.download = filename;\n",
              "      div.appendChild(a);\n",
              "      a.click();\n",
              "      div.remove();\n",
              "    }\n",
              "  "
            ]
          },
          "metadata": {}
        },
        {
          "output_type": "display_data",
          "data": {
            "text/plain": [
              "<IPython.core.display.Javascript object>"
            ],
            "application/javascript": [
              "download(\"download_b5ac76a2-6091-43d8-9812-7154050a5027\", \"pairwise_wilcoxon_matrix.csv\", 4725)"
            ]
          },
          "metadata": {}
        },
        {
          "output_type": "stream",
          "name": "stdout",
          "text": [
            "Files downloaded automatically.\n"
          ]
        },
        {
          "output_type": "display_data",
          "data": {
            "text/plain": [
              "<Figure size 1400x700 with 1 Axes>"
            ],
            "image/png": "iVBORw0KGgoAAAANSUhEUgAABW0AAAKyCAYAAACuWPzHAAAAOnRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjEwLjAsIGh0dHBzOi8vbWF0cGxvdGxpYi5vcmcvlHJYcgAAAAlwSFlzAAAPYQAAD2EBqD+naQAA7NFJREFUeJzs3Xd8FNX6x/HvJoE0SAAh1JDQVEAgCFKUpkajIIrKpVhosReaBbEh4oXLVRGliIVmQVAuggpSBVRAkapRamiRkNBCQgIkZHN+f/DLyrIbCBgyg/t5v155ZfbM7O7znD0zu3kye8ZhjDECAAAAAAAAANiCn9UBAAAAAAAAAAD+QtEWAAAAAAAAAGyEoi0AAAAAAAAA2AhFWwAAAAAAAACwEYq2AAAAAAAAAGAjFG0BAAAAAAAAwEYo2gIAAAAAAACAjVC0BQAAAAAAAAAboWgLAAAAAAAAADZC0RYAAIu98sorcjgcxfJc7dq1U7t27Vy3ly1bJofDoZkzZxbL8/fq1UvR0dHF8lwXKjMzUw888IAqVaokh8Oh/v37Wx0SLmGZmZmKiIjQp59+anUouIRNmTJFDodDa9assToUS+zatUsOh0NTpkxxtV2s984WLVro2WefLfLHBQDgfFG0BQCgCOX/YZ3/ExQUpCpVqiguLk7vvPOOjh49WiTPk5ycrFdeeUUbNmwokscrSnaOrTCGDx+uKVOm6NFHH9XHH3+s+++/v8Bto6Oj3V7v039OnDgh6VTRbsiQIbrllltUrlw5j8LDP8Xx48cVHx+vq666SuHh4SpVqpQaNWqkt99+WydPnvTY/siRI3rooYdUoUIFhYaG6vrrr9e6dessiPzievvtt1W6dGl169bNY92GDRt03333KTIyUoGBgSpXrpxiY2M1efJkOZ1OC6ItWvPmzdMrr7xyUR77xx9/1K233qqqVasqKChI1atXV8eOHTVt2jTXNseOHdMrr7yiZcuWXZQYLobx48cX6/Hh3Xff1b/+9S9Vr15dDodDvXr1Krbn9mbatGkaPXq0pTEMGjRI48aNU0pKiqVxAAAQYHUAAAD8E7366quqUaOGTp48qZSUFC1btkz9+/fXqFGj9NVXX6lhw4aubV988UU999xz5/X4ycnJGjp0qKKjoxUTE1Po+y1cuPC8nudCnC22Dz74QHl5eRc9hr/ju+++U4sWLTRkyJBCbR8TE6OnnnrKo71kyZKSpIMHD+rVV19V9erV1ahRo0uqgHQ+jh8/rt9//13t27dXdHS0/Pz8tHLlSg0YMEA///yzWzEtLy9PHTp00MaNG/XMM8+ofPnyGj9+vNq1a6e1a9eqTp06FmZSdE6ePKm3335bAwYMkL+/v9u6Dz/8UI888ogqVqyo+++/X3Xq1NHRo0e1ZMkSxcfHa9++fXr++ectirxozJs3T+PGjSvywu0XX3yhrl27KiYmRv369VPZsmW1c+dOff/99/rggw90zz33SDpVtB06dKgkuX3DwM7Gjx+v8uXLF1vxdOTIkTp69KiaNWumffv2Fctzns20adOUkJBQqG84XMh7Z2HccccdCgsL0/jx4/Xqq68W+eMDAFBYFG0BALgIbr31VjVt2tR1e/Dgwfruu+9022236fbbb9emTZsUHBwsSQoICFBAwMV9Sz527JhCQkJchUSrlChRwtLnL4z9+/erXr16hd6+atWquu+++wpcX7lyZe3bt0+VKlXSmjVrdM011xRFmJbIyspSaGio13XlypXTTz/95Nb2yCOPKDw8XGPHjtWoUaNUqVIlSdLMmTO1cuVKffHFF+rcubMkqUuXLrr88ss1ZMgQtwJvYRhjdOLECdc+ZRfffPONDhw4oC5duri1//TTT3rkkUfUsmVLzZs3T6VLl3at69+/v9asWaOEhITiDveczvb6F6dXXnlF9erV008//eRxTNu/f/8FP65d8itOy5cvd51lW6pUKavDOS9F/d6Z/z7p5+enzp0766OPPtLQoUOLbfoiAADOxPQIAAAUkxtuuEEvvfSSdu/erU8++cTV7m1evkWLFqlVq1YqU6aMSpUqpSuuuMJ11t2yZctchb/evXu7vo6f/5Xadu3a6aqrrtLatWvVpk0bhYSEuO575py2+ZxOp55//nlVqlRJoaGhuv3225WUlOS2TXR0tNezv05/zHPF5m1O26ysLD311FOur4hfccUVeuONN2SMcdvO4XDoiSee0OzZs3XVVVcpMDBQ9evX1/z58713+Bn279+v+Ph4VaxYUUFBQWrUqJGmTp3qWp8/v+/OnTs1d+5cV+y7du0q1OMXJDAw0FWsvFDfffedWrdurdDQUJUpU0Z33HGHNm3a5Fo/c+ZMORwOLV++3OO+7733nhwOh1sRcPPmzercubPKlSunoKAgNW3aVF999ZXb/fKn+li+fLkee+wxRUREqFq1aucde/7rfeTIEbd4K1asqLvuusvVVqFCBXXp0kVz5sxRdnb2OR/ztttu04IFC9S0aVMFBwfrvffe8zrvZT6Hw+F2xmf+frd9+3b16tVLZcqUUXh4uHr37q1jx4653fds++PZzJ49W9HR0apVq5Zbe34h6NNPP3Ur2OZr2rSp2752MfaRvXv3Kj4+XlWqVFFgYKBq1KihRx99VDk5OZLO/fp/++23rjFZunRpdejQQb///rtrfa9evTRu3DhXXPk/+fLy8jR69GjVr19fQUFBqlixoh5++GGlpaWds18TExN1zTXXeP0nVEREhKRTc6BWqFDBrb9PHwO9evVSqVKllJiYqPbt26t06dK69957zyu2/HH4448/qlmzZgoKClLNmjX10UcfecT166+/qm3btgoODla1atX02muvafLkyW7HmOjoaP3+++9avny5K94zj9fZ2dkaOHCga1qRO++8UwcOHDhnnxUkKirqbxUld+zYoX/9618qV66cQkJC1KJFC82dO9dtm/yxdOaxNP+Ym//tg3bt2mnu3LnavXu3K/+zzYFe0Jy2n3zyiZo0aaLg4GCVK1dO3bp183g/O9v7pCTddNNN2r179yU7zQ8A4J+BM20BAChG999/v55//nktXLhQDz74oNdtfv/9d912221q2LChXn31VQUGBmr79u1asWKFJKlu3bp69dVX9fLLL+uhhx5S69atJUnXXnut6zEOHTqkW2+9Vd26ddN9992nihUrnjWuf//733I4HBo0aJD279+v0aNHKzY2Vhs2bDivsxcLE9vpjDG6/fbbtXTpUsXHxysmJkYLFizQM888o7179+qtt95y2/7HH3/UrFmz9Nhjj6l06dJ65513dPfdd2vPnj267LLLCozr+PHjateunbZv364nnnhCNWrU0BdffKFevXrpyJEj6tevn+rWrauPP/5YAwYMULVq1VxTHuQXfgpy8uRJHTx40K0tJCREISEh5+yvwli8eLFuvfVW1axZU6+88oqOHz+uMWPG6LrrrtO6desUHR2tDh06qFSpUvr888/Vtm1bt/vPmDFD9evX11VXXSXp1Pi67rrrVLVqVT333HMKDQ3V559/rk6dOul///uf7rzzTrf7P/bYY6pQoYJefvllZWVlnTPenJwcZWRk6Pjx41qzZo3eeOMNRUVFqXbt2q5t1q9fr6uvvlp+fu7nDzRr1kzvv/++tm7dqgYNGpz1ebZs2aLu3bvr4Ycf1oMPPqgrrrjinLF506VLF9WoUUMjRozQunXr9OGHHyoiIkIjR46UdO798WxWrlypq6++2q3t2LFjWrJkidq0aaPq1auf8zEuxj6SnJysZs2aueYVvvLKK7V3717NnDlTx44dcyuGenv9P/74Y/Xs2VNxcXEaOXKkjh07pnfffVetWrXS+vXrFR0drYcffljJyclatGiRPv74Y4+8Hn74YU2ZMkW9e/dW3759tXPnTo0dO1br16/XihUrznpWflRUlJYsWaI///yzwH8kVKhQQe+++64effRR3Xnnna5/EJw+NU1ubq7i4uLUqlUrvfHGG6599nxi2759uzp37qz4+Hj17NlTkyZNUq9evdSkSRPVr19f0qkC+fXXXy+Hw6HBgwcrNDRUH374oQIDA91iHj16tJ588kmVKlVKL7zwgiR5HLuffPJJlS1bVkOGDNGuXbs0evRoPfHEE5oxY0aB/XWxpKam6tprr9WxY8fUt29fXXbZZZo6dapuv/12zZw50+NYci4vvPCC0tPT9eeff7rG9fme/fvvf/9bL730krp06aIHHnhABw4c0JgxY9SmTRutX79eZcqUcW17tvfJJk2aSJJWrFihxo0bn1cMAAAUGQMAAIrM5MmTjSTzyy+/FLhNeHi4ady4sev2kCFDzOlvyW+99ZaRZA4cOFDgY/zyyy9Gkpk8ebLHurZt2xpJZsKECV7XtW3b1nV76dKlRpKpWrWqycjIcLV//vnnRpJ5++23XW1RUVGmZ8+e53zMs8XWs2dPExUV5bo9e/ZsI8m89tprbtt17tzZOBwOs337dlebJFOyZEm3to0bNxpJZsyYMR7PdbrRo0cbSeaTTz5xteXk5JiWLVuaUqVKueUeFRVlOnTocNbHO31bSR4/Q4YM8br92fqmIDExMSYiIsIcOnTI1bZx40bj5+dnevTo4Wrr3r27iYiIMLm5ua62ffv2GT8/P/Pqq6+62m688UbToEEDc+LECVdbXl6eufbaa02dOnVcbfljuVWrVm6PeS6fffaZW180bdrU/Prrr27bhIaGmj59+njcd+7cuUaSmT9//lmfI7/fz9xu586dBfbvma9L/n53Zhx33nmnueyyy1y3C7M/enPy5EnjcDjMU0895daeP2b79etXqMe5GPtIjx49jJ+fn9fjVF5enjGm4Nf/6NGjpkyZMubBBx90u19KSooJDw93a3/88cfdjm35fvjhByPJfPrpp27t8+fP99p+pokTJ7pyvf76681LL71kfvjhB+N0Ot22O3DgQIH7Y8+ePY0k89xzz11wbPnj8Pvvv3e17d+/3wQGBrq97k8++aRxOBxm/fr1rrZDhw6ZcuXKGUlm586drvb69eu7HU/z5b8esbGxrtfIGGMGDBhg/P39zZEjR7z21fkIDQ31eowvSP/+/Y0k88MPP7jajh49amrUqGGio6Ndr0d+7Kfnacxf7z9Lly51tXXo0MHtPSKft337zPfOXbt2GX9/f/Pvf//b7b6//fabCQgIcGs/2/tkvpIlS5pHH330bF0AAMBFxfQIAAAUs1KlSuno0aMFrs8/E2jOnDkXfNGuwMBA9e7du9Db9+jRw+1r2p07d1blypU1b968C3r+wpo3b578/f3Vt29ft/annnpKxhh9++23bu2xsbFuXzVv2LChwsLCtGPHjnM+T6VKldS9e3dXW4kSJdS3b19lZmZ6nVagsJo3b65Fixa5/fTo0eOCH+90+/bt04YNG9SrVy+VK1fO1d6wYUPddNNNbq9P165dtX//frcLnc2cOVN5eXnq2rWrJOnw4cP67rvv1KVLFx09elQHDx7UwYMHdejQIcXFxWnbtm3au3evWwwPPvigx0W0zub666/XokWL9MUXX+iRRx5RiRIlPM7QPX78uMdZhpIUFBTkWn8uNWrUUFxcXKHjKsgjjzzidrt169Y6dOiQMjIyJF34/nj48GEZY1S2bFm39vzH9TYtgjdFvY/k5eVp9uzZ6tixo9u82/nO/Lr5ma//okWLdOTIEXXv3t01fg4ePCh/f381b95cS5cuPWdOX3zxhcLDw3XTTTe5PUaTJk1UqlSpcz5Gnz59NH/+fLVr104//vijhg0bptatW6tOnTpauXLlOZ//dI8++ujfiq1evXqubxRIp87wveKKK9yOSfPnz1fLli3dLsxYrlw513QM5+Ohhx5ye41at24tp9Op3bt3n/dj/V3z5s1Ts2bN1KpVK1dbqVKl9NBDD2nXrl36448/ijWeWbNmKS8vT126dHF77SpVqqQ6dep4vHbnep8sW7asx7coAAAoTkyPAABAMcvMzHTNu+hN165d9eGHH+qBBx7Qc889pxtvvFF33XWXOnfu7PF18oJUrVr1vC46VqdOHbfbDodDtWvX/tvzuZ7L7t27VaVKFY8CVt26dV3rT+ft6+Rly5Y95zyYu3fvVp06dTz6r6DnOR/ly5dXbGzsBd//bPLj8vbV/7p162rBggWuiyfdcsstCg8P14wZM3TjjTdKOjU1QkxMjC6//HJJp77KbYzRSy+9pJdeesnrc+7fv19Vq1Z13a5Ro8Z5xVyxYkXX14w7d+6s4cOH66abbtK2bdtcc/sGBwd7nbf2xIkTrvXncr5xFeTMMZVfZE1LS1NYWNjf3h/NGfPOhoWFSdJZ/3FzuqLeRw4cOKCMjAzXdBnncmY/b9u2TdKpObq9yc/vbLZt26b09PQCj4OFuZhYXFyc4uLidOzYMa1du1YzZszQhAkTdNttt2nz5s1nPcbmCwgI8Jhe4XxjK8wxaffu3WrZsqXHdqdPGVJYZxuvxW337t1q3ry5R/vpY7Ow46wobNu2TcYYj/ezfGdOuXGu90ljDBchAwBYiqItAADF6M8//1R6evpZ/1gPDg7W999/r6VLl2ru3LmaP3++ZsyYoRtuuEELFy4s1FmP5zMPbWEV9Mer0+k8rzMx/46CnufMwpgvCgwMVKdOnfTll19q/PjxSk1N1YoVKzR8+HDXNvlnij799NMFnqV65tj8u2Opc+fOeuGFFzRnzhw9/PDDkqTKlStr3759Htvmt1WpUuWcj+strrON0YKca0xd6P5Yrlw5ORwOj2Ja7dq1FRAQoN9++63AmP6Oot5Hzuzn/DH08ccfe73AXkDAuf+8yMvLU0REhD799FOv6881j/TpQkJC1Lp1a7Vu3Vrly5fX0KFD9e2336pnz57nvG9gYKBH4f18YyvuY9KleAy8kP3yQuTl5cnhcOjbb7/12k9nzo97rmPbkSNHVL58+SKNEQCA80HRFgCAYpR/QZ5zfa3bz89PN954o2688UaNGjVKw4cP1wsvvKClS5cqNja2yM/+yT97Lp8xRtu3b3e7aE/ZsmV15MgRj/vu3r1bNWvWdN0+n9iioqK0ePFiHT161O1Mws2bN7vWF4WoqCj9+uuvysvLcyvSFPXzFLX8uLZs2eKxbvPmzSpfvrxCQ0NdbV27dtXUqVO1ZMkSbdq0ScYY19QIklyvU4kSJS7a2cFnyp/qID093dUWExOjH374weP1+PnnnxUSEuI6M/h85Z91eOY4/btfHT/X/uhNQECAatWqpZ07d7q1h4SE6IYbbtB3332npKQkRUZGnvW5i3ofqVChgsLCwpSQkHBe98uXP/VCRETEOcdQQceCWrVqafHixbruuuuK9B9M+dM95Bf/L+Q4eTFii4qK0vbt2z3avbVdSmd2RkVFFXhsyl8vnd9++Xfyr1WrlowxqlGjxgUfQ/Lt3btXOTk5rrOGAQCwAnPaAgBQTL777jsNGzZMNWrUOOtchocPH/Zoy58LMf8r5fmFOm9F1Avx0UcfuX1de+bMmdq3b59uvfVWV1utWrX0008/KScnx9X2zTffKCkpye2xzie29u3by+l0auzYsW7tb731lhwOh9vz/x3t27dXSkqK2xXWc3NzNWbMGJUqVUpt27YtkucpapUrV1ZMTIymTp3q1p8JCQlauHCh2rdv77Z9bGysypUrpxkzZmjGjBlq1qyZ29fbIyIi1K5dO7333ntez3Q9cODABcd68OBBr2f7ffjhh5LkNn9q586dlZqaqlmzZrnd/4svvlDHjh29zndbGGFhYSpfvry+//57t/bx48df0ONJhdsfC9KyZUutWbPGo33IkCEyxuj+++9XZmamx/q1a9dq6tSpkop+H/Hz81OnTp309ddfe43tXGdsxsXFKSwsTMOHD9fJkyc91p8+hgo6FnTp0kVOp1PDhg3zuH9ubu45jx1Llizx2p4/x3P+dCIhISFen/9s/m5s3sTFxWnVqlXasGGDq+3w4cNez+YNDQ0tsuP6xda+fXutXr1aq1atcrVlZWXp/fffV3R0tOrVqyfpr0L/6ful0+nU+++/7/GYoaGhbv/gOR933XWX/P39NXToUI9xbIzRoUOHCv1Ya9eulSRde+21FxQLAABFgTNtAQC4CL799ltt3rxZubm5Sk1N1XfffadFixYpKipKX331leuCS968+uqr+v7779WhQwdFRUVp//79Gj9+vKpVq+a64EutWrVUpkwZTZgwQaVLl1ZoaKiaN29+wfN8litXTq1atVLv3r2Vmpqq0aNHq3bt2nrwwQdd2zzwwAOaOXOmbrnlFnXp0kWJiYn65JNP3C56dL6xdezYUddff71eeOEF7dq1S40aNdLChQs1Z84c9e/f3+OxL9RDDz2k9957T7169dLatWsVHR2tmTNnasWKFRo9enShLwp1ocaOHasjR44oOTlZkvT111/rzz//lCQ9+eSTCg8PL/C+r7/+um699Va1bNlS8fHxOn78uMaMGaPw8HC98sorbtuWKFFCd911l6ZPn66srCy98cYbHo83btw4tWrVSg0aNNCDDz6omjVrKjU1VatWrdKff/6pjRs3XlCOn3zyiSZMmKBOnTqpZs2aOnr0qBYsWKBFixapY8eObnOgdu7cWS1atFDv3r31xx9/qHz58ho/frycTqeGDh16Qc+f74EHHtB//vMfPfDAA2ratKm+//57bd269YIfrzD7Y0HuuOMOffzxx9q6davbmX/XXnutxo0bp8cee0xXXnml7r//ftWpU0dHjx7VsmXL9NVXX+m1116TdHH2keHDh2vhwoVq27atHnroIdWtW1f79u3TF198oR9//NF18TVvwsLC9O677+r+++/X1VdfrW7duqlChQras2eP5s6dq+uuu85VYG7SpIkkqW/fvoqLi5O/v7+6deumtm3b6uGHH9aIESO0YcMG3XzzzSpRooS2bdumL774Qm+//bY6d+581n6tUaOGOnbsqFq1aikrK0uLFy/W119/rWuuuUYdO3aUdOrr7/Xq1dOMGTN0+eWXq1y5crrqqqvOOs/q343Nm2effVaffPKJbrrpJj355JMKDQ3Vhx9+qOrVq+vw4cNuZ5c2adJE7777rl577TXVrl1bERERBc4fXJApU6aod+/emjx5snr16nXWbb/++mvXPn/y5En9+uuvrrF3++23u33b4kzPPfecPvvsM916663q27evypUrp6lTp2rnzp363//+5zqLvn79+mrRooUGDx6sw4cPq1y5cpo+fbpyc3M9HrNJkyaaMWOGBg4cqGuuuUalSpVyvZ7nUqtWLb322msaPHiwdu3apU6dOql06dLauXOnvvzySz300EN6+umnC/VYixYtUvXq1dW4ceNCbQ8AwEVhAABAkZk8ebKR5PopWbKkqVSpkrnpppvM22+/bTIyMjzuM2TIEHP6W/KSJUvMHXfcYapUqWJKlixpqlSpYrp37262bt3qdr85c+aYevXqmYCAACPJTJ482RhjTNu2bU39+vW9xte2bVvTtm1b1+2lS5caSeazzz4zgwcPNhERESY4ONh06NDB7N692+P+b775pqlataoJDAw01113nVmzZo3H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VaVKFfn5FTxzrc+daevn56dq1apZHYabsLAwyweM3dAn3tEvnugT7+gXT/SJJ/rEO/rFE33iHf3iiT7xRJ94R794ok+8o1880See6BPv6BdPdumTs51hm48LkQEAAAAAAACAjVC0BQAAAAAAAAAboWhrocDAQA0ZMkSBgYFWh2Ib9Il39Isn+sQ7+sUTfeKJPvGOfvFEn3hHv3iiTzzRJ97RL57oE+/oF0/0iSf6xDv6xdOl2Cc+dyEyAAAAAAAAALAzzrQFAAAAAAAAABuhaAsAAAAAAAAANkLRFgAAAAAAAABshKItAAAAAAAAANhIgNUB+Krs7OxL6op1gNWys7P1888/a/fu3Tp27JgqVKigxo0bq0aNGlaHBpthrHh38uRJpaSkuPqkXLlyVodkC/SLJ/Yh7xgrZ8dn278wVjzt2bPH7ZhSv359xgu8Yqx44pjiiT7xjv3H06XeJxRti8m3336r6dOn64cfflBSUpLy8vIUGhqqxo0b6+abb1bv3r1VpUoVq8MsVps2bXL1yZl/GMbFxenuu+++pHamokK/uFuxYoXefvttff311zp58qTCw8MVHBysw4cPKzs7WzVr1tRDDz2kRx55RKVLl7Y63GKVl5en5cuXex0rsbGxioyMtDrEYsVY8XT06FF98sknmj59ulavXq2cnBwZY+RwOFStWjXdfPPNeuihh3TNNddYHWqxol+8Yx/yxFgpGJ9t3TFWPO3atUvvvvuupk+frj///FPGGNe6kiVLqnXr1nrooYd09913y8/Pd74Aymd9T4wVTxxTPNEn3rH/ePon9YnDnB49ityXX36pQYMG6ejRo2rfvr2aNWumKlWquP4ISkhI0A8//KBVq1apV69eGjZsmCpUqGB12BfVunXr9Oyzz+rHH3/UddddV2CfZGRk6Nlnn1X//v194oML/eLp9ttv17p163TPPfeoY8eOatq0qYKDg13rd+zYoR9++EGfffaZNm7cqI8++kg33XSThREXj+PHj+vNN9/Uu+++q8OHDysmJsZjrCQnJ+vmm2/Wyy+/rBYtWlgd8kXHWPE0atQo/fvf/1atWrXUsWPHAo8ps2fPVvPmzTVmzBjVqVPH6rAvOvrFO/YhT4wV7/hs64mx4qlv376aOnWq4uLizton06dPl7+/vyZPnvyPL7TwWd87xoonjime6BPv2H88/eP6xOCiatGihfnmm2+M0+k863Z//vmnGTRokBk1alQxRWad6OhoM27cOJOWlnbW7VauXGm6du1q/v3vfxdPYBajXzxNmDDB5OTkFGrb33//3SxevPgiR2QP1apVM//617/M3LlzC+yfXbt2meHDh5uoqCjz/vvvF3OExY+x4qlbt24mISHhnNudOHHCvPvuu2bixInFEJX16Bfv2Ic8MVa847OtJ8aKp+eee84cPHiwUNt+++235n//+99Fjsh6fNb3jrHiiWOKJ/rEO/YfT/+0PuFMWxS7kydPqkSJEhdt+0sV/YLC2rRpk+rWrVuobU+ePKk9e/aoVq1aFzkqAP8ETqdTK1asUMOGDVWmTBmrwwGAfww+6wMAzpe9J2/AP9L5fvjwlQ8r9AsKq7AFW+nUOKFgC6Cw/P39dfPNNystLc3qUGzj5MmTCggIUEJCgtWh4BJmjNH+/futDsMSQ4YM0e7du60Ow3Knf3bfsWPHeW3vKxgrBcvOzlZ2drbVYQAoZpxpe5ENHDiw0NuOGjXqIkZiH++8806ht+3bt+9FjMRe6BdPZcuWlcPhKNS2hw8fvsjR2Mevv/5a6G0bNmx4ESOxD8aKp7vuuqvQ286aNesiRmIv9Mu5NW3aVCNHjtSNN95odSi2UbNmTX355Zdq1KiR1aHYitPp1JQpU7RkyRLt379feXl5buu/++47iyIrfiEhIdq9e7dr/t4OHTroww8/VOXKlSVJqampqlKlipxOp5VhWiImJkYJCQlq27at4uPjffJCW2fy8/Nz9Ufnzp0VFBRkdUi2wFhxt2jRIr311ltatWqVMjIyJElhYWFq2bKlBg4cqNjYWIsjtJfExEQ9+OCDPvXeI0mrV69WkyZN5O/vL0n65ptv9Prrr2v79u2qXLmy+vbtqx49elgcpb1s2rRJHTp0KNQ/0KxG0fYiu/76691ur1u3Trm5ubriiiskSVu3bpW/v7+aNGniMweXGjVquN0+cOCAjh075voa5pEjRxQSEqKIiIhLYicqKvSLp6lTp7qWDx06pNdee01xcXFq2bKlJGnVqlVasGCBXnrpJQ0YMMCqMIudn5+fHA6H62qpZ+MrfxwyVjz17t3btWyM0Zdffqnw8HA1bdpUkrR27VodOXJEd911lyZPnmxVmMWOfjm3+fPna/DgwRo2bJiaNGmi0NBQt/VhYWEWRWadiRMnatasWfr4449Vrlw5q8OxjSeeeEJTpkxRhw4dVLlyZY/3pLfeesuiyIqfn5+fUlJSFBERIUkqXbq0Nm7cqJo1a0o6VbStXLmyR2HbV6xfv16TJ0/WZ599ptzcXHXr1k19+vSx98VfLqINGza4+iMnJ0ddu3ZVfHy8mjVrZnVolmOsnDJ16lQ98MAD6ty5s+Li4lSxYkVJp44lCxcu1MyZMzVx4kTdf//9FkdqHxs3btTVV1/tM3//5PP399e+ffsUERGhr7/+Wp06ddJ9992n5s2ba/369ZoyZYo+//xz3XnnnVaHahuX0lihaFuMRo0apWXLlmnq1KkqW7asJCktLU29e/dW69at9dRTT1kcYfGbNm2axo8fr4kTJ7oK2Vu2bNGDDz6ohx9+WPfee6/FEVqDfvF099136/rrr9cTTzzh1j527FgtXrxYs2fPtiYwC5z+tbH169fr6aef1jPPPONWoHzzzTf13//+V506dbIoSuswVjwNGjRIhw8f1oQJE1z/hXc6nXrssccUFham119/3eIIrUG/eOfn99fsWacX4fL/UXQpfMAtao0bN9b27dt18uRJRUVFeRSy161bZ1Fk1ipfvrw++ugjtW/f3upQLFeYoq2vnml7upMnT+rrr7/W5MmTtWDBAl155ZWKj49Xr169FB4ebnV4xS43N1dfffWVpkyZovnz5+vyyy9Xnz59dP/997vO2vZVvj5WLr/8cvXr10+PP/641/Xjx4/XW2+9pW3bthVzZNY51zdT9+7dqzfeeMPnjrOnv/+0bt1arVq10ogRI1zrhw8frq+//lqrVq2yMMrida5vvB84cEDTpk27JMYKRdtiVLVqVS1cuFD169d3a09ISNDNN9+s5ORkiyKzTq1atTRz5kw1btzYrX3t2rXq3Lmzdu7caVFk1qJfPJUqVUobNmxQ7dq13dq3b9+umJgYZWZmWhSZtZo1a6ZXXnnF4w/mefPm6aWXXtLatWstisw6jBVPFSpU0I8//uj6J1C+LVu26Nprr9WhQ4csisxa9It3y5cvP+v6tm3bFlMk9jF06NCzrh8yZEgxRWIvVapU0bJly3T55ZdbHYrlKNoWTk5Ojr788ktNmjRJ3333na699lolJycrNTVVH3zwgbp27Wp1iJbIzs7W+PHjNXjwYOXk5KhkyZLq0qWLRo4c6Zpiw9f4+lgJCgrSxo0bPT6j5NuyZYtiYmJ0/PjxYo7MOn5+fqpcubJKlizpdX1OTo5SUlJ87jh7+vtPxYoVNW/ePDVp0sS1fsuWLWrRooVPXa/A399fMTExBX47LDMzU+vWrbskxkqA1QH4koyMDB04cMCj/cCBAzp69KgFEVlv3759ys3N9Wh3Op1KTU21ICJ7oF88XXbZZZozZ47HGelz5szRZZddZlFU1vvtt988ptaQTk238ccff1gQkfUYK55yc3O1efNmjw/+mzdv9tmv6kr0S0F8sSh7Lr5alD2Xp556Sm+//bbGjh1b6HnF/6kcDodbH5x529etXbvW9ZX3wMBA9ejRQ+PGjXP9g3XMmDHq27fvP74Qd6Y1a9Zo0qRJmj59ukJDQ/X0008rPj5ef/75p4YOHao77rhDq1evtjrMYsVYOaV+/fqaOHGi/vvf/3pdP2nSJNWrV6+Yo7JWVFSURo4cqS5dunhdv2HDBrdipS/5448/lJKSouDgYK+fYb3VFv7JateurQEDBui+++7zuv5SGisUbYvRnXfeqd69e+vNN990zVf0888/65lnnjmvC6P8k9x44416+OGH9eGHH+rqq6+WdOqN+tFHH/XpidXpF09Dhw7VAw88oGXLlql58+aSTu0/8+fP1wcffGBxdNapW7euRowYoQ8//ND1X+ecnByNGDFCdevWtTg6azBWPPXu3Vvx8fFKTEx0e//5z3/+4zbHq6+hXwp25MgRTZw4UZs2bZJ06o/HPn36+MRXUs9m7dq1bn1y5jdifM2PP/6opUuX6ttvv1X9+vU9rnbvSxfzM8bo8ssvdxVqMzMz1bhxY9d0I7785cYGDRpo8+bNuvnmmzVx4kR17NjRNSVNvu7du6tfv34WRVj8Ro0apcmTJ2vLli1q3769a5qR/PFSo0YNTZkyRdHR0dYGWswYK3958803ddttt2n+/PmKjY11m9N2yZIl2rFjh+bOnWtxlMWrSZMmWrt2bYFF2/xrfviiG2+80ZX7ihUr3OaAXr9+vapXr25VaJZo2rSp1q5dW2DR9lIaK0yPUIyOHTump59+WpMmTdLJkyclSQEBAYqPj9frr7/uMT+aLzhw4IB69uyp+fPnuz7o5+bmKi4uTlOmTHF9xczX0C/e/fzzz3rnnXdcfzDXrVtXffv2dRXmfNHq1avVsWNHGWPUsGFDSdKvv/4qh8Ohr7/+2mcvaMFYcZeXl6c33nhDb7/9tvbt2ydJqly5svr166ennnrK4w8iX0G/eLdmzRrFxcUpODjYdQz55ZdfdPz4cS1cuND1z0Rfsn//fnXr1k3Lli1zu0Do9ddfr+nTp/vs3JPn+ueGL13M7/QLYp5Nz549L3Ik9jNs2DD16dNHVatWtToU26hTp4769OmjXr16FTj9QU5Ojj777DOfGjOMFXe7du3Su+++q59++kkpKSmSpEqVKqlly5Z65JFHfK6o/8cff+jYsWOui8ee6eTJk0pOTlZUVFQxR2at0693Ip2aKu70bxd+9NFHkqQePXoUa1xWSklJUXZ29j9iLFC0tUBWVpYSExMlnZq71BeLtWfaunWrNm3aJIfDoSuvvJK50f4f/YLCyMrK0qeffqrNmzdLOlWgvOeeezi2wKuMjAxJKnCOJ19Fv/yldevWql27tj744AMFBJz6UlZubq4eeOAB7dixQ99//73FERa/rl27aseOHfroo49c32L4448/1LNnT9WuXVufffaZxRHiUuB0On32n0EAAOD8UbS1yJ9//ilJqlatmsWR2Ef+UGT+L3f0y1+cTqdmz57t9tXU22+/nT+A4IGx4t2BAwe0ZcsWSdKVV16p8uXLWxyRPdAv7oKDg7V+/XpdeeWVbu1//PGHmjZtqmPHjlkUmXXCw8O1ePFit68bSqe+7XDzzTfryJEj1gRmE6fvQ1dccYXPnnlckK1bt2rixIn66KOPXGf1AwAuXHp6utvZx74+fRP+ufysDsCX5OXl6dVXX1V4eLiioqIUFRWlMmXKaNiwYT59wZOPPvpIDRo0UHBwsIKDg9WwYUN9/PHHVodlOfrF3fbt21WvXj316NFDs2bN0qxZs3Tfffepfv36rjPXfVViYqKefPJJxcbGKjY2Vv369fPpPmGseMrKylKfPn1UuXJltWnTRm3atFHlypUVHx/vkwW4fPSLd2FhYdqzZ49He1JSkkqXLm1BRNbLy8vzmK9VkkqUKOHTn+G87UNVqlTx+X1IOjUt2uTJk9W6dWvVq1dPy5cv18CBA60OC8AlqEOHDq5/+Jy+7Is+/PBD1atXT+XKlVO9evXclidOnGh1eLYUGxurmjVrWh2GZS71/YeibTF64YUXNHbsWP3nP//R+vXrtX79eg0fPlxjxozRSy+9ZHV4lhg1apQeffRRtW/fXp9//rk+//xz3XLLLXrkkUf01ltvWR2eZegXT3379lXNmjWVlJSkdevWad26ddqzZ49q1Kihvn37Wh2eZRYsWKB69epp9erVatiwoRo2bKiffvpJ9evX16JFi6wOzxKMFU8DBw7U8uXL9fXXX+vIkSM6cuSI5syZo+XLl+upp56yOjzL0C/ede3aVfHx8ZoxY4aSkpKUlJSk6dOn64EHHlD37t2tDs8SN9xwg/r166fk5GRX2969ezVgwADdeOONFkZmLfYhTz/99JMeeOABVa5cWaNGjdKqVau0dOlS/fTTT3rmmWesDg/AJej777/X8ePHPZZ9zeuvv65+/frpjjvu0JIlS5SQkKCEhAQtWbJEnTp1Ur9+/fTGG29YHabt3HnnnT41N/aZLvn9x6DYVK5c2cyZM8ejffbs2aZKlSoWRGS96OhoM3XqVI/2KVOmmOjoaAsisgf6xVNISIj59ddfPdo3bNhgQkNDLYjIHmJiYsygQYM82gcNGmQaN25sQUTWY6x4uuyyy8zSpUs92r/77jtTvnz54g/IJugX77Kzs03fvn1NyZIljZ+fn/Hz8zOBgYGmf//+5sSJE1aHZ4k9e/aYmJgYU6JECVOzZk1Ts2ZNU6JECdO4cWOTlJRkdXiWYR/6yxtvvGHq1atnqlatap5++mmzYcMGY4wxAQEB5vfff7c4OgCXslKlSpnExESPZV9TvXp1M2PGjALXT58+3URGRhZjRLgUXOr7T4DVRWNfcvjwYY/54aRT8+cdPnzYgoist2/fPl177bUe7ddee+0ld9p6UaJfPAUGBuro0aMe7ZmZmSpZsqQFEdnDpk2b9Pnnn3u09+nTR6NHjy7+gGyAseLp2LFjqlixokd7RESET3+FmX7x5HQ69dNPP+mVV17RiBEj3C6cGhISYnF01omMjNS6deu0ePFit4s+xsbGWhyZtdiH/jJo0CANGjRIr776qs/Pn+7NkSNHtHr1au3fv99jShFfuqI5zo2xgoLs379fDRo0KHB9gwYNdPDgwWKMyJ6ys7MlnfqbCJc+pkcoRo0aNdLYsWM92seOHatGjRpZEJH1ateu7bXgNGPGDNWpU8eCiOyBfvF022236aGHHtLPP/8sY4yMMfrpp5/0yCOP6Pbbb7c6PMtUqFBBGzZs8GjfsGGDIiIiij8gG2CseGrZsqWGDBmiEydOuNqOHz+uoUOHqmXLlhZGZi36xZO/v7/rwlohISFq0KCBGjRo4NMF25MnTyogIEC///67brrpJj355JOuecR9HfvQX4YNG6YvvvhCNWrU0KBBg5SQkGB1SLbx9ddfq3r16rrlllv0xBNPqF+/fq6f/v37Wx2eJVJTU3X//ferSpUqCggIkL+/v9uPr2Ks4GyuueYa/ec//1Fubq7HOqfTqZEjR3pcMNRXLFq0SO3bt1fZsmUVEhKikJAQlS1bVu3bt9fixYutDg9/A2faFqP//ve/6tChgxYvXuz6ILtq1SolJSVp3rx5FkdnjaFDh6pr1676/vvvdd1110mSVqxYoSVLlngtWvoK+sXTO++8o549e6ply5aui8Hk5ubq9ttv19tvv21xdNZ58MEH9dBDD2nHjh2us7NXrFihkSNH+uwFTxgrnt5++23FxcWpWrVqrn8Sbty4UUFBQVqwYIHF0VmHfvHuqquu0o4dO1SjRg2rQ7GFEiVKqHr16nI6nVaHYjvsQ38ZPHiwBg8erOXLl2vSpElq3ry5ateuLWOM0tLSrA7PUk899ZT69Omj4cOH+/Q/gE7Xq1cv7dmzRy+99JIqV64sh8NhdUi2wFjB2YwdO1ZxcXGqVKmS2rRp4/qmR2pqqr7//nuVLFlSCxcutDjK4jd16lQ98MAD6ty5s9566y23flm4cKHat2+viRMn6v7777c4UlwIhzHGWB2EL9m7d6/Gjx/v9tW6xx57TFWqVLE4MuusXbtWb731ljZt2iTpVJ889dRTaty4scWRWYt+8W7btm1u+0/t2rUtjshaxhiNHj1ab775pusCOVWqVNEzzzyjvn37+vQfAYwVd8eOHdOnn37q1if33nuvgoODLY7MWvSLp/nz52vw4MEaNmyYmjRpotDQULf1YWFhFkVmnYkTJ2rWrFn6+OOPVa5cOavDsRX2Ie+OHj2qadOmadKkSVq7dq2aNWumzp07++Q/VENDQ/Xbb7/59NXLz1S6dGn98MMPiomJsToUW2GseFe6dGlt3LhRNWvWdFv2RUePHtUnn3yin376SSkpKZKkSpUqqWXLlrrnnnt88jPK5Zdfrn79+unxxx/3un78+PF66623tG3btmKOzB4u9f2Hoi2AS8LSpUt1/fXXWx2GreXP41q6dGmLI7EWY8VTVlaWR+EN9EtB/Pz+mj3r9H/8GGPkcDh88ozTxo0ba/v27Tp58qSioqI8xs26dessigyXgt9++00TJ07UtGnTtH//fqvDKXZ33XWXunXrpi5dulgdim3Uq1dPn376qc+fjHEmxop3l3rRCRdXUFCQNm7cqCuuuMLr+i1btigmJkbHjx8v5sjs4VLff5geoRhFR0erT58+6t27tyIjI60Oxxbatm2r+Ph4/etf//L5MzJOR794uuWWW1StWjX17t1bPXv2ZB/6f0OGDFGfPn0UFRXl88XafIwVTxUrVlSXLl3Up08ftWrVyupwbIN+8W7p0qVWh2A7nTp1sjoE2/jqq6906623qkSJEvrqq6/Ouq2vziN+pgYNGmj06NF6/fXXrQ6l2Jw+Njp06KBnnnlGf/zxhxo0aOCauiifL46T0aNH67nnntN7772n6Ohoq8OxFGPl3KKiolx9cfoyIEn169fXxIkT9d///tfr+kmTJqlevXrFHJV9XOr7D2faFqPRo0drypQpSkhI0PXXX6/4+HjdeeedPn1Vv/79+2vatGnKzs5Wly5dFB8frxYtWlgdluXoF08HDx7Uxx9/rKlTp+r333/XDTfcoPj4eHXq1EklS5a0OjzLxMTEKCEhwVXov/vuu336mCIxVryZPXu2pkyZonnz5rn+gdijRw+fnppHol+8OXnypG655RZNmDDBZy98eabc3FwNHz5cffr0UbVq1awOx3J+fn5KSUlRRESE21nZZ/LVs7JPt2LFCjVt2tQn35fPNjZO50vjpGzZsm7fXsjKylJubq5CQkI8igiHDx8u7vAsw1hBUYmNjdWOHTu0Y8cOq0MpVsuWLdNtt92mmjVrKjY21m1O2yVLlmjHjh2aO3eu2rRpY3GkuBAUbS2wbt06TZkyRZ999pmcTqfuuece9enTR1dffbXVoVkiNzdXX331laZOnapvv/1WtWvXVp8+fXT//fe7Dji+iH4p2Lp16zR58mR99tlnkqR77rlH8fHxroug+Jr169e7+iM3N1fdunVTnz59fPbqqadjrLg7cOCAPv74Y02ZMkWbNm1SXFyc+vTpo9tvv10BAb775Rv6xV2FChW0cuVKiranKV26tH777TefPyMO5ycsLEwbNmy4pL6GiYtn6tSphd62Z8+eFzES4J9p3LhxOnjwoIYMGWJ1KMVu165devfdd73O9fvII4/w+eVSZmCZnJwcM3r0aBMYGGj8/PxMo0aNzMSJE01eXp7VoVkmNTXVDBs2zAQFBZkSJUqYO+64wyxZssTqsCxHv3jau3evGTJkiAkMDDShoaHG39/ftGrVyiQkJFgdmmVycnLM//73P3PbbbeZEiVKmAYNGpjRo0ebI0eOWB2apRgr3r3zzjsmMDDQOBwOU6FCBfPSSy+ZrKwsq8OyHP1iTP/+/c2gQYOsDsNWbr/9djNlyhSrw7CdqVOnmhMnTni0Z2dnm6lTp1oQkb2UKlXKJCYmWh2G5RgnKCzGyikF9cOZ5s6da6655hrTtm1bs2bNmmKIDLC/f9r+w5m2Fjh58qS+/PJLTZ48WYsWLVKLFi0UHx+vP//8U+PGjdMNN9ygadOmWR1msVu9erUmT56s6dOnKywsTL169dLevXs1bdo0PfbYY3rjjTesDtES9MtfTp48qTlz5mjSpElatGiRmjZtqvj4eHXv3l0HDhzQiy++qHXr1umPP/6wOlRL5OTk6Msvv9SkSZP03Xff6dprr1VycrJSU1P1wQcfqGvXrlaHWGwYK96lpqZq6tSpmjJlinbv3q0777zT9f4zcuRIValSRQsXLrQ6zGJHv7h78skn9dFHH6lOnTpq0qSJx0W3Ro0aZVFk1pkwYYKGDh2qe++912uf+Oo8i/7+/tq3b58iIiLc2g8dOqSIiAif/yrzpXjBk4uBceKJPvGOfjnF399fiYmJbmdHdu3aVaNGjVLVqlUlSU6nU+XKlVOvXr2UmZmp1atX67fffrMoYmtkZ2dLkk9OQYOC/eP2H6urxr5k7dq15oknnjCXXXaZqVChgnnqqafMpk2b3Lb57bffTFBQkEURFr/U1FTzxhtvmPr165uSJUuau+++23z77bduZxv/8MMPJjQ01MIoix/94il/3ylXrpzp16+f+e233zy22bdvn3E4HBZEZ601a9aYxx9/3JQrV85UrlzZDBo0yGzbts21/p133jEREREWRli8GCueTj8Du1GjRmbMmDEmLS3NbZvt27ebEiVKWBOgRegX79q1a1fgz/XXX291eJZwOBwF/vj5+VkdnmUcDofZv3+/R/uGDRtM2bJlLYjIWkOHDnX7KVmypOnXr59bmy9inHhyOBwmNTXVo33v3r0+9bfgmRgrpzgcDvPdd9+5bmdnZxuHw2FWrFjhatu9e7fr80lWVpb58ssviztMSyxcuNDceuutpkyZMsbPz8/4+fmZMmXKmFtvvdUsWrTI6vAs1759e5OcnOyx7Ev+afuP703UZqFrrrlGN910k95991116tTJ61XratSooW7dulkQnTWqVaumWrVqqU+fPurVq5cqVKjgsU3Dhg19bm5O+sXTH3/8oTFjxuiuu+4q8L+p5cuX97mrnjdo0ECbN2/WzTffrIkTJ6pjx47y9/d326Z79+7q16+fRREWP8aKp969e6tbt25asWJFgceNKlWq6IUXXijmyKxFv3jnS/tGYeXl5Vkdgq00btxYDodDDodDN954o9vcz06nUzt37tQtt9xiYYTW2Llzp9ttY4z+/PNPpaenS5LbRah8AePE0zvvvCPp1Fj48MMPVapUKdc6p9Op77//XldeeaVV4VmGseLpm2++0fXXXy9J2rBhg6RT38C89tprJUk7duxw/Y0YEhKiTp06WRFmsZo6daoeeOABde7cWW+99ZbbBbcWLlyo9u3ba+LEibr//vstjtQ633//vY4fP+6x7Gv+SfsP0yMUo927dysqKsrqMGzlhx9+UOvWra0Ow3boFxTWsGHD1KdPH9dXPQBvjh07ppCQEKvDsB365ey2b9+uxMREtWnTRsHBwTLG+FzRyZsTJ04oKCjI6jAsNXToUNfvp556yq3wVLJkSUVHR+vuu+9WyZIlrQrRFnx9egTGiacaNWpIOvV3YbVq1dz+0Z7fJ6+++qqaN29uVYiWYKy48/PzU0REhF577TW1aNFCTz/9tHJycpSYmKglS5YoMjJSnTt3VkhIiGbMmGF1uMXm8ssvV79+/fT44497XT9+/Hi99dZb2rZtWzFHZh+nv+/46nvQP23/oWhrgTVr1mjTpk2SpLp166pp06YWR2S9/fv3a8uWLZKkK664wmMeI19Fv7jbsmWLxowZ47b/PPnkk7riiissjswe8g/nFFUYK944nU59+eWXbn3SqVMnt7NZfBH94unQoUPq0qWLli5dKofDoW3btqlmzZrq06ePypYtqzfffNPqEIud0+nU8OHDNWHCBKWmpmrr1q2qWbOmXnrpJUVHRys+Pt7qEC0xdepUdevWjfkEC+CrfzCfaerUqeratavP/7PjdNdff71mzZqlsmXLWh2KrTBWTvHz89P//vc/Pf/889q9e7datWqlzz77TA8//LBmzZqlgIAAlS5dWj/88IPq1atn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lUoYGhqiY8eOqu3/+ZF7n1+i/FhaWmLLli1wdnbOd/7EiRMYP3487t+/r9lgWqBcuXIICgqCjY0Ntm3bhvXr1+P69es4ePAg3N3dERUVJToiERFpAV3RAYiIiIiItNGwYcN4INA/SElJQWhoKJ48eYLc3Fy1uWHDhglKRdogISEBNjY2Bc7b2toiMTFRg4m0R1pamqqH7alTp+Di4gKlUgknJyfExcUJTkdERNqCRVsiIiIionzs2LFDdAStduzYMbi6uuL169coXbq0WoFboVCwaCtz5cqVw/3791GlSpV852NjY2XbRqNWrVr47bff0KdPH5w8eRLTp08HADx58gSlS5cWnI6IiLSFUnQAIiIiIiIqembOnIlRo0bh9evXSElJwYsXL1Q/z58/Fx2PBHN2dsaCBQuQlZWVZy4zMxOLFi1Cly5dBCQTz93dHbNmzYKlpSWaNm2KZs2aAXi36tbe3l5wOiIi0hbsaUtERERERP9ayZIl8ffff6NGjRqio5AWevjwIRwdHaGvr49Jkyahbt26kCQJUVFR+Omnn5CZmYkrV67AwsJCdFQhEhMTkZCQgAYNGkCpfLeWKjQ0FKVLl0bdunUFpyMiIm3Aoi0REREREf1rLi4uGDRoEAYMGCA6Cmmp2NhYTJw4EadOncL7r50KhQKdOnXChg0bUKtWLcEJiYiItBeLtkRERERE9K95e3vD09MTI0eORP369VGiRAm1+V69eglKRtrmxYsXiImJAfCun6tce9m6uLgU6rpDhw595iRERFQUsGhLRERERET/2vst3flRKBTIycnRYBoi7Tdy5MhCXbd9+/bPnISIiIoCFm2JiIiIiIiIiIiItEjBt8eJiIiIiIgKISMjQ3QEIiIiomKFRVsiIiIiIvrXcnJy8O2336Jy5cooVaoU7t27BwBYtGgRvL29BacjIiIiKtpYtCUiIiIion9t2bJl2LFjB1auXAk9PT3VuK2tLbZt2yYwGREREVHRx6ItERERERH9a76+vti6dStcXV2ho6OjGm/QoAFu3bolMBkRERFR0ceiLRERERER/WuPHj1CrVq18ozn5ubi7du3AhIRERERFR8s2hIRERER0b9mbW2N4ODgPOMHDhyAvb29gERERERExYeu6ABERERERFT0uLu7Y/jw4Xj06BFyc3Nx6NAh3L59G76+vvj9999FxyMiIiIq0hSSJEmiQxARERERUdETHBwMT09PhIWF4fXr13BwcIC7uzs6d+4sOhoRERFRkcaiLREREREREREREZEWYXsEIiIiIiL6P7t69SqioqIAADY2NuxnS0RERPQ/wKItERERERH9a0+ePMGgQYMQGBiIsmXLAgBSUlLQrl077NmzB2ZmZmIDEhERERVhStEBiIiIiIio6HFzc8OrV68QERGB58+f4/nz57h58yZevnyJKVOmiI5HREREVKSxpy0REREREf1rZcqUgb+/Pxo3bqw2Hhoais6dOyMlJUVMMCIiIqJigCttiYiIiIjoX8vNzUWJEiXyjJcoUQK5ubkCEhEREREVHyzaEhERERHRv9a+fXtMnToVjx8/Vo09evQI06dPR4cOHQQmIyIiIir62B6BiIiIiIj+tQcPHqBXr16IiIiAhYWFaszW1hZHjx5FlSpVBCckIiIiKrpYtCUiIiIiov8TSZLg7++PW7duAQDq1auHjh07Ck5FREREVPSxaEtERERERP+ar68vBg4cCH19fbXxrKws7NmzB8OGDROUjIiIiKjoY9GWiIiIiIj+NR0dHSQkJMDc3FxtPDk5Gebm5sjJyRGUjIiIiKjo40FkRERERET0r0mSBIVCkWf84cOHKFOmjIBERERERMWHrugARERERERUdNjb20OhUEChUKBDhw7Q1f3PV4qcnBzExsaiS5cuAhMSERERFX0s2hIRERERUaH17t0bAHDjxg04OzujVKlSqjk9PT1YWlqib9++gtIRERERFQ/saUtERERERP/azp07MXDgQBgYGIiOQkRERFTssGhLREREREREREREpEXYHoGIiIiIiP41pVKZ70Fk7+Xk5GgwDREREVHxwqItERERERH9a4cOHVIr2r59+xbXr1/Hzp074eHhITAZERERUdHH9ghERERERPQ/8+uvv2Lv3r04cuSI6ChERERERRaLtkRERERE9D9z79492NnZ4fXr16KjEBERERVZStEBiIiIiIioeEhPT8e6detQuXJl0VGIiIiIijT2tCUiIiIion/NxMREraetJEl49eoVjIyM8MsvvwhMRkRERFT0sT0CERERERH9azt37lT7XalUwszMDE2bNoWJiYmgVERERETFA4u2RERERET0P3Xz5k3Y2tqKjkFERERUZLGnLRERERER/ddevXqFrVu3okmTJmjQoIHoOERERERFGou2RERERET0f3bu3DkMHz4cFStWxA8//ID27dvj0qVLomMRERERFWk8iIyIiIiIiP6VxMRE7NixA97e3nj58iUGDBiAzMxM/Pbbb7C2thYdj4iIiKjI40pbIiIiIiIqtJ49e6JOnToIDw/H2rVr8fjxY6xfv150LCIiIqJihSttiYiIiIio0I4fP44pU6ZgwoQJsLKyEh2HiIiIqFjiSlsiIiIiIiq0kJAQvHr1Co0aNULTpk2xYcMGPHv2THQsIiIiomJFIUmSJDoEEREREREVLW/evMHevXvh4+OD0NBQ5OTkYPXq1Rg1ahSMjY1FxyMiIiIq0li0JSIiIiKi/8rt27fh7e2NXbt2ISUlBZ06dcLRo0dFxyIiIiIqsli0JSIiIiKi/4mcnBwcO3YMPj4+LNoSERER/RdYtCUiIiIiIiIiIiLSIjyIjIiIiIiIiIiIiEiLsGhLREREREREREREpEVYtCUiIiIiIiIiIiLSIizaEhEREREREREREWkRFm2JiIiIiIiIiIiItAiLtkRERERERERERERahEVbIiIiIiIiIiIiIi3Coi0RERERERERERGRFvl/Nxuatop2Lu8AAAAASUVORK5CYII=\n"
          },
          "metadata": {}
        }
      ],
      "source": [
        "import sys\n",
        "!{sys.executable} -m pip install pyod openpyxl\n",
        "\n",
        "import numpy as np\n",
        "import pandas as pd\n",
        "import math\n",
        "import torch\n",
        "import torch.nn as nn\n",
        "import torch.optim as optim\n",
        "import random\n",
        "import matplotlib.pyplot as plt\n",
        "from sklearn.preprocessing import StandardScaler\n",
        "from scipy.stats import wilcoxon\n",
        "from sklearn.metrics import roc_auc_score\n",
        "import warnings\n",
        "warnings.filterwarnings('ignore')\n",
        "\n",
        "from pyod.models import abod, hbos, iforest, knn, lof, ocsvm, pca, copod\n",
        "from sklearn.ensemble import IsolationForest as SklearnIForest\n",
        "from sklearn.svm import OneClassSVM\n",
        "from sklearn.neighbors import LocalOutlierFactor\n",
        "from sklearn.ensemble import RandomForestRegressor\n",
        "from sklearn.neural_network import MLPRegressor\n",
        "\n",
        "# ------------------------------------------------------------\n",
        "# 1. Dataset creation (Concrete Strength with 1 outlier)\n",
        "# ------------------------------------------------------------\n",
        "def create_concrete_dataset(seed_shuffle):\n",
        "    url = \"https://archive.ics.uci.edu/ml/machine-learning-databases/concrete/compressive/Concrete_Data.xls\"\n",
        "    df = pd.read_excel(url)\n",
        "    df.columns = [\n",
        "        'Cement', 'BlastFurnaceSlag', 'FlyAsh', 'Water',\n",
        "        'Superplasticizer', 'CoarseAggregate', 'FineAggregate',\n",
        "        'Age', 'CompressiveStrength'\n",
        "    ]\n",
        "    # Среднее значение прочности по всей выборке\n",
        "    Savg = df['CompressiveStrength'].mean()\n",
        "    # Индекс строки с максимальной прочностью\n",
        "    max_idx = df['CompressiveStrength'].idxmax()\n",
        "    # Создаём копию датафрейма\n",
        "    df_labeled = df.copy()\n",
        "    # Заменяем значение в найденной строке на среднее\n",
        "    df_labeled.loc[max_idx, 'CompressiveStrength'] = Savg\n",
        "    # Создаём столбец is_outlier (по умолчанию 0)\n",
        "    df_labeled['is_outlier'] = 0\n",
        "    # Помечаем выброс\n",
        "    df_labeled.loc[max_idx, 'is_outlier'] = 1\n",
        "    # Перемешиваем данные\n",
        "    df_shuffled = df_labeled.sample(frac=1, random_state=seed_shuffle).reset_index(drop=True)\n",
        "    X = df_shuffled.drop(['CompressiveStrength', 'is_outlier'], axis=1).values.astype(np.float32)\n",
        "    y = df_shuffled['CompressiveStrength'].values.astype(np.float32).reshape(-1, 1)\n",
        "    true_outliers = df_shuffled['is_outlier'].values.astype(int)\n",
        "    return X, y, true_outliers\n",
        "\n",
        "# ------------------------------------------------------------\n",
        "# 2. Helper: top‑K outliers\n",
        "# ------------------------------------------------------------\n",
        "def get_top_k_outliers(scores, k):\n",
        "    idx = np.argsort(scores)[-k:]\n",
        "    pred = np.zeros(len(scores), dtype=int)\n",
        "    pred[idx] = 1\n",
        "    return pred\n",
        "\n",
        "# ------------------------------------------------------------\n",
        "# 3. NNFA algorithm – возвращает (pred, scores)\n",
        "# ------------------------------------------------------------\n",
        "def run_nnfa_original(X, y, n_outliers_desired, ksi, random_state):\n",
        "    torch.manual_seed(random_state)\n",
        "    np.random.seed(random_state)\n",
        "    random.seed(random_state)\n",
        "\n",
        "    Q, N_x = X.shape[0], X.shape[1]\n",
        "    N_y = 1\n",
        "\n",
        "    def scale_to_minus1_1(data):\n",
        "        min_val = data.min(axis=0)\n",
        "        max_val = data.max(axis=0)\n",
        "        range_val = max_val - min_val\n",
        "        range_val[range_val == 0] = 1.0\n",
        "        scaled = 2.0 * (data - min_val) / range_val - 1.0\n",
        "        return scaled, min_val, range_val\n",
        "\n",
        "    X_scaled, _, _ = scale_to_minus1_1(X)\n",
        "    y_scaled, _, _ = scale_to_minus1_1(y)\n",
        "    X_tensor = torch.tensor(X_scaled, dtype=torch.float32)\n",
        "    y_tensor = torch.tensor(y_scaled, dtype=torch.float32)\n",
        "\n",
        "    log2q = math.log2(Q)\n",
        "    N_min = (N_y * Q) / ((1 + log2q) * (N_x + N_y)) + 1\n",
        "    N_max = (N_y / (N_x + N_y)) * ((Q / N_x + 1) * (N_x + N_y + 1) + 1) - 1\n",
        "    if N_max > Q:\n",
        "        N_max = min(Q // 2, 20)\n",
        "    N_lim = N_min + ksi * (N_max - N_min)\n",
        "    N_start = max(1, int(np.ceil(N_min)))\n",
        "    N_end = max(N_start, int(np.ceil(N_lim)))\n",
        "\n",
        "    error_matrix = []\n",
        "    for N in range(N_start, N_end + 1):\n",
        "        model = nn.Sequential(\n",
        "            nn.Linear(N_x, N),\n",
        "            nn.Tanh(),\n",
        "            nn.Linear(N, N_y),\n",
        "        )\n",
        "        criterion = nn.MSELoss()\n",
        "        optimizer = optim.Adam(model.parameters(), lr=0.01)\n",
        "        model.train()\n",
        "        for epoch in range(500):\n",
        "            optimizer.zero_grad()\n",
        "            outputs = model(X_tensor)\n",
        "            loss = criterion(outputs, y_tensor)\n",
        "            loss.backward()\n",
        "            optimizer.step()\n",
        "        model.eval()\n",
        "        with torch.no_grad():\n",
        "            predictions = model(X_tensor).numpy().flatten()\n",
        "            errors = (predictions - y_scaled.flatten()) ** 2\n",
        "        error_matrix.append(errors)\n",
        "\n",
        "    error_matrix = np.array(error_matrix)\n",
        "    scores = np.mean(error_matrix, axis=0)   # это и есть оценка аномальности\n",
        "    pred = get_top_k_outliers(scores, n_outliers_desired)\n",
        "    return pred, scores\n",
        "\n",
        "# ------------------------------------------------------------\n",
        "# 4. Wrappers for standard methods – возвращают (pred, scores)\n",
        "# ------------------------------------------------------------\n",
        "def run_pyod_detector(model, X_scaled, n_outliers):\n",
        "    model.fit(X_scaled)\n",
        "    scores = model.decision_scores_\n",
        "    pred = get_top_k_outliers(scores, n_outliers)\n",
        "    return pred, scores\n",
        "\n",
        "def run_random_forest(X, y, n_outliers, rs):\n",
        "    rf = RandomForestRegressor(n_estimators=100, random_state=rs)\n",
        "    rf.fit(X, y.ravel())\n",
        "    scores = (rf.predict(X) - y.ravel()) ** 2\n",
        "    pred = get_top_k_outliers(scores, n_outliers)\n",
        "    return pred, scores\n",
        "\n",
        "def run_neural_network(X, y, n_outliers, rs):\n",
        "    mlp = MLPRegressor(hidden_layer_sizes=(20, 10), random_state=rs, max_iter=500)\n",
        "    mlp.fit(X, y.ravel())\n",
        "    scores = (mlp.predict(X) - y.ravel()) ** 2\n",
        "    pred = get_top_k_outliers(scores, n_outliers)\n",
        "    return pred, scores\n",
        "\n",
        "def run_autoencoder(X_scaled, n_outliers, rs):\n",
        "    torch.manual_seed(rs)\n",
        "    np.random.seed(rs)\n",
        "    random.seed(rs)\n",
        "    input_dim = X_scaled.shape[1]\n",
        "    class AE(nn.Module):\n",
        "        def __init__(self):\n",
        "            super().__init__()\n",
        "            self.encoder = nn.Sequential(nn.Linear(input_dim, 16), nn.ReLU(), nn.Linear(16, 4))\n",
        "            self.decoder = nn.Sequential(nn.Linear(4, 16), nn.ReLU(), nn.Linear(16, input_dim))\n",
        "        def forward(self, x):\n",
        "            return self.decoder(self.encoder(x))\n",
        "    ae = AE()\n",
        "    optimizer = optim.Adam(ae.parameters(), lr=0.01)\n",
        "    criterion = nn.MSELoss()\n",
        "    X_tensor = torch.tensor(X_scaled, dtype=torch.float32)\n",
        "    ae.train()\n",
        "    for _ in range(300):\n",
        "        optimizer.zero_grad()\n",
        "        loss = criterion(ae(X_tensor), X_tensor)\n",
        "        loss.backward()\n",
        "        optimizer.step()\n",
        "    ae.eval()\n",
        "    with torch.no_grad():\n",
        "        recon = ae(X_tensor).numpy()\n",
        "        scores = np.mean((recon - X_scaled) ** 2, axis=1)\n",
        "    pred = get_top_k_outliers(scores, n_outliers)\n",
        "    return pred, scores\n",
        "\n",
        "def run_combined_rf_ae(X, y, X_scaled, n_outliers, rs):\n",
        "    rf = RandomForestRegressor(n_estimators=100, random_state=rs)\n",
        "    rf.fit(X, y.ravel())\n",
        "    rf_err = (rf.predict(X) - y.ravel()) ** 2\n",
        "    torch.manual_seed(rs)\n",
        "    np.random.seed(rs)\n",
        "    random.seed(rs)\n",
        "    input_dim = X_scaled.shape[1]\n",
        "    class AE(nn.Module):\n",
        "        def __init__(self):\n",
        "            super().__init__()\n",
        "            self.encoder = nn.Sequential(nn.Linear(input_dim, 16), nn.ReLU(), nn.Linear(16, 4))\n",
        "            self.decoder = nn.Sequential(nn.Linear(4, 16), nn.ReLU(), nn.Linear(16, input_dim))\n",
        "        def forward(self, x):\n",
        "            return self.decoder(self.encoder(x))\n",
        "    ae = AE()\n",
        "    optimizer = optim.Adam(ae.parameters(), lr=0.01)\n",
        "    criterion = nn.MSELoss()\n",
        "    X_tensor = torch.tensor(X_scaled, dtype=torch.float32)\n",
        "    for _ in range(300):\n",
        "        optimizer.zero_grad()\n",
        "        loss = criterion(ae(X_tensor), X_tensor)\n",
        "        loss.backward()\n",
        "        optimizer.step()\n",
        "    ae.eval()\n",
        "    with torch.no_grad():\n",
        "        ae_err = np.mean((ae(X_tensor).numpy() - X_scaled) ** 2, axis=1)\n",
        "    scores = (rf_err / np.max(rf_err) + ae_err / np.max(ae_err)) / 2\n",
        "    pred = get_top_k_outliers(scores, n_outliers)\n",
        "    return pred, scores\n",
        "\n",
        "def run_oneclass_svm_with_y(X, y, n_outliers):\n",
        "    Xy = np.column_stack((X, y.ravel()))\n",
        "    model = OneClassSVM(kernel='rbf', gamma='auto')\n",
        "    model.fit(Xy)\n",
        "    scores = -model.decision_function(Xy)\n",
        "    scores = np.nan_to_num(scores, nan=0.0, posinf=1.0, neginf=0.0)\n",
        "    pred = get_top_k_outliers(scores, n_outliers)\n",
        "    return pred, scores\n",
        "\n",
        "def run_iforest_with_y(X, y, n_outliers, rs):\n",
        "    Xy = np.column_stack((X, y.ravel()))\n",
        "    model = SklearnIForest(random_state=rs)\n",
        "    model.fit(Xy)\n",
        "    scores = -model.decision_function(Xy)\n",
        "    scores = np.nan_to_num(scores, nan=0.0, posinf=1.0, neginf=0.0)\n",
        "    pred = get_top_k_outliers(scores, n_outliers)\n",
        "    return pred, scores\n",
        "\n",
        "def run_lof_with_y(X, y, n_outliers):\n",
        "    Xy = np.column_stack((X, y.ravel()))\n",
        "    model = LocalOutlierFactor(novelty=True)\n",
        "    model.fit(Xy)\n",
        "    scores = -model.score_samples(Xy)\n",
        "    scores = np.nan_to_num(scores, nan=0.0, posinf=1.0, neginf=0.0)\n",
        "    pred = get_top_k_outliers(scores, n_outliers)\n",
        "    return pred, scores\n",
        "\n",
        "# ------------------------------------------------------------\n",
        "# 5. Main experiment\n",
        "# ------------------------------------------------------------\n",
        "n_runs = 30               # количество прогонов\n",
        "n_outliers = 1             # теперь ищем ровно один выброс (top-1)\n",
        "ksi_values = [0, 0.01, 0.5, 1]\n",
        "\n",
        "standard_methods = [\n",
        "    'ABOD (pyod)', 'HBOS (pyod)', 'IsolationForest (pyod)', 'kNN (pyod)',\n",
        "    'LOF (pyod)', 'OCSVM (pyod)', 'PCA (pyod)', 'COPOD (pyod)',\n",
        "    'Random Forest (error)', 'Neural Network (error)', 'Autoencoder (reconstruction)',\n",
        "    'Combined (RF+AE)', 'One-Class SVM (with y)', 'Isolation Forest (with y)',\n",
        "    'LOF (with y)'\n",
        "]\n",
        "nnfa_methods = [f'NNFA (ξ={ksi})' for ksi in ksi_values]\n",
        "all_methods = standard_methods + nnfa_methods\n",
        "\n",
        "# Храним метрики для каждого метода\n",
        "metrics = {method: {'f1': [], 'auc': []} for method in all_methods}\n",
        "\n",
        "print(f\"Experiment: {n_runs} runs, 4 ksi values (original NNFA, 500 epochs)\")\n",
        "print(f\"Now using 1 outlier (highest strength replaced by mean).\")\n",
        "for run_idx in range(n_runs):\n",
        "    seed = run_idx\n",
        "    print(f\"\\n--- Run {run_idx+1}/{n_runs}, seed = {seed} ---\")\n",
        "\n",
        "    X, y, true_outliers = create_concrete_dataset(seed_shuffle=seed)\n",
        "    scaler = StandardScaler()\n",
        "    X_scaled = scaler.fit_transform(X)\n",
        "\n",
        "    # ---- Стандартные методы ----\n",
        "    pred_abod, scores_abod = run_pyod_detector(abod.ABOD(), X_scaled, n_outliers)\n",
        "    pred_hbos, scores_hbos = run_pyod_detector(hbos.HBOS(), X_scaled, n_outliers)\n",
        "    pred_knn, scores_knn = run_pyod_detector(knn.KNN(), X_scaled, n_outliers)\n",
        "    pred_lof, scores_lof = run_pyod_detector(lof.LOF(), X_scaled, n_outliers)\n",
        "    pred_ocsvm, scores_ocsvm = run_pyod_detector(ocsvm.OCSVM(), X_scaled, n_outliers)\n",
        "    pred_pca, scores_pca = run_pyod_detector(pca.PCA(), X_scaled, n_outliers)\n",
        "    pred_copod, scores_copod = run_pyod_detector(copod.COPOD(), X_scaled, n_outliers)\n",
        "    iforest_model = iforest.IForest(random_state=seed)\n",
        "    pred_iforest, scores_iforest = run_pyod_detector(iforest_model, X_scaled, n_outliers)\n",
        "\n",
        "    pred_rf, scores_rf = run_random_forest(X, y, n_outliers, rs=seed)\n",
        "    pred_nn, scores_nn = run_neural_network(X, y, n_outliers, rs=seed)\n",
        "    pred_ae, scores_ae = run_autoencoder(X_scaled, n_outliers, rs=seed)\n",
        "    pred_combined, scores_combined = run_combined_rf_ae(X, y, X_scaled, n_outliers, rs=seed)\n",
        "    pred_ocsvm_y, scores_ocsvm_y = run_oneclass_svm_with_y(X, y, n_outliers)\n",
        "    pred_iforest_y, scores_iforest_y = run_iforest_with_y(X, y, n_outliers, rs=seed)\n",
        "    pred_lof_y, scores_lof_y = run_lof_with_y(X, y, n_outliers)\n",
        "\n",
        "    # ---- NNFA для разных ksi ----\n",
        "    nnfa_results = {}\n",
        "    for ksi in ksi_values:\n",
        "        pred, scores = run_nnfa_original(X, y, n_outliers, ksi=ksi, random_state=seed)\n",
        "        nnfa_results[f'NNFA (ξ={ksi})'] = (pred, scores)\n",
        "\n",
        "    # ---- Собираем всё в один словарь ----\n",
        "    all_data = {\n",
        "        'ABOD (pyod)': (pred_abod, scores_abod),\n",
        "        'HBOS (pyod)': (pred_hbos, scores_hbos),\n",
        "        'IsolationForest (pyod)': (pred_iforest, scores_iforest),\n",
        "        'kNN (pyod)': (pred_knn, scores_knn),\n",
        "        'LOF (pyod)': (pred_lof, scores_lof),\n",
        "        'OCSVM (pyod)': (pred_ocsvm, scores_ocsvm),\n",
        "        'PCA (pyod)': (pred_pca, scores_pca),\n",
        "        'COPOD (pyod)': (pred_copod, scores_copod),\n",
        "        'Random Forest (error)': (pred_rf, scores_rf),\n",
        "        'Neural Network (error)': (pred_nn, scores_nn),\n",
        "        'Autoencoder (reconstruction)': (pred_ae, scores_ae),\n",
        "        'Combined (RF+AE)': (pred_combined, scores_combined),\n",
        "        'One-Class SVM (with y)': (pred_ocsvm_y, scores_ocsvm_y),\n",
        "        'Isolation Forest (with y)': (pred_iforest_y, scores_iforest_y),\n",
        "        'LOF (with y)': (pred_lof_y, scores_lof_y),\n",
        "        **nnfa_results\n",
        "    }\n",
        "\n",
        "    # ---- Вычисляем F1 и AUC для каждого метода в этом запуске ----\n",
        "    for method, (pred, scores) in all_data.items():\n",
        "        scores = np.nan_to_num(scores, nan=0.0, posinf=1.0, neginf=0.0)\n",
        "        if len(np.unique(scores)) == 1:\n",
        "            auc = 0.5\n",
        "        else:\n",
        "            auc = roc_auc_score(true_outliers, scores)\n",
        "        tp = np.sum((pred == 1) & (true_outliers == 1))\n",
        "        fp = np.sum((pred == 1) & (true_outliers == 0))\n",
        "        fn = np.sum((pred == 0) & (true_outliers == 1))\n",
        "        precision = tp / (tp + fp) if (tp + fp) > 0 else 0.0\n",
        "        recall = tp / (tp + fn) if (tp + fn) > 0 else 0.0\n",
        "        f1 = 2 * precision * recall / (precision + recall) if (precision + recall) > 0 else 0.0\n",
        "        metrics[method]['f1'].append(f1)\n",
        "        metrics[method]['auc'].append(auc)\n",
        "\n",
        "    # Печатаем F1 и AUC для каждого варианта NNFA\n",
        "    for ksi in ksi_values:\n",
        "        name = f'NNFA (ξ={ksi})'\n",
        "        print(f\"  {name} F1 = {metrics[name]['f1'][-1]:.3f}, AUC = {metrics[name]['auc'][-1]:.3f}\")\n",
        "\n",
        "# ------------------------------------------------------------\n",
        "# 6. Формирование итоговой таблицы (mean ± std) для F1 и AUC\n",
        "# ------------------------------------------------------------\n",
        "summary_rows = []\n",
        "for method in all_methods:\n",
        "    f1_mean = np.mean(metrics[method]['f1'])\n",
        "    f1_std  = np.std(metrics[method]['f1'])\n",
        "    auc_mean = np.mean(metrics[method]['auc'])\n",
        "    auc_std  = np.std(metrics[method]['auc'])\n",
        "    summary_rows.append({\n",
        "        'Method': method,\n",
        "        'F1 (mean ± std)': f\"{f1_mean:.3f} ± {f1_std:.3f}\",\n",
        "        'ROC-AUC (mean ± std)': f\"{auc_mean:.3f} ± {auc_std:.3f}\"\n",
        "    })\n",
        "df_summary = pd.DataFrame(summary_rows)\n",
        "df_summary = df_summary.sort_values('ROC-AUC (mean ± std)', ascending=False).reset_index(drop=True)\n",
        "\n",
        "print(\"\\n\" + \"=\"*80)\n",
        "print(f\"SUMMARY TABLE (mean ± std) over {n_runs} runs\")\n",
        "print(\"=\"*80)\n",
        "print(df_summary.to_string(index=False))\n",
        "\n",
        "# ------------------------------------------------------------\n",
        "# 7. Pairwise Wilcoxon test for F1 (сохраняем матрицу p-значений)\n",
        "# ------------------------------------------------------------\n",
        "p_matrix = pd.DataFrame(index=all_methods, columns=all_methods, dtype=float)\n",
        "for i, m1 in enumerate(all_methods):\n",
        "    for j, m2 in enumerate(all_methods):\n",
        "        if i == j:\n",
        "            p_matrix.loc[m1, m2] = 1.0\n",
        "        else:\n",
        "            if np.all(np.array(metrics[m1]['f1']) == np.array(metrics[m2]['f1'])):\n",
        "                p = 1.0\n",
        "            else:\n",
        "                _, p = wilcoxon(metrics[m1]['f1'], metrics[m2]['f1'])\n",
        "            p_matrix.loc[m1, m2] = p\n",
        "\n",
        "# ------------------------------------------------------------\n",
        "# 7.1 Вывод на экран и сохранение матрицы p-значений в читаемом виде\n",
        "# ------------------------------------------------------------\n",
        "print(\"\\n\" + \"=\"*80)\n",
        "print(\"PAIRWISE WILCOXON P-VALUES (upper triangle, rounded to 4 decimals)\")\n",
        "print(\"=\"*80)\n",
        "p_display = p_matrix.round(4).astype(str)\n",
        "print(p_display.to_string())\n",
        "\n",
        "# Сохраняем полную матрицу в CSV\n",
        "p_matrix.to_csv(\"pairwise_wilcoxon_matrix.csv\")\n",
        "print(\"\\nFull pairwise p-value matrix saved to 'pairwise_wilcoxon_matrix.csv'\")\n",
        "\n",
        "# ------------------------------------------------------------\n",
        "# 7.2 Детализированный вывод значимых различий (для статьи)\n",
        "# ------------------------------------------------------------\n",
        "print(\"\\n\" + \"=\"*80)\n",
        "print(\"DETAILED SIGNIFICANT DIFFERENCES (p < 0.05)\")\n",
        "print(\"=\"*80)\n",
        "significant_pairs = []\n",
        "for i, m1 in enumerate(all_methods):\n",
        "    for j, m2 in enumerate(all_methods):\n",
        "        if i < j:  # верхний треугольник\n",
        "            p_val = p_matrix.loc[m1, m2]\n",
        "            if p_val < 0.05:\n",
        "                significant_pairs.append((m1, m2, p_val))\n",
        "                print(f\"{m1} vs {m2}: p = {p_val:.6f}\")\n",
        "if not significant_pairs:\n",
        "    print(\"No significant differences found (p >= 0.05 for all pairs).\")\n",
        "\n",
        "# ------------------------------------------------------------\n",
        "# 8. Сохранение в Excel и скачивание\n",
        "# ------------------------------------------------------------\n",
        "output_file = \"table5_all_ksi_results.xlsx\"\n",
        "with pd.ExcelWriter(output_file, engine='openpyxl') as writer:\n",
        "    df_summary.to_excel(writer, sheet_name='summary', index=False)\n",
        "    p_matrix.to_excel(writer, sheet_name='pairwise_wilcoxon')\n",
        "print(f\"\\nResults saved to '{output_file}'\")\n",
        "\n",
        "# Вывод важных p-значений\n",
        "std_methods_only = [m for m in all_methods if m not in nnfa_methods]\n",
        "best_std = max(std_methods_only, key=lambda m: np.mean(metrics[m]['f1']))\n",
        "print(\"\\n\" + \"=\"*80)\n",
        "print(\"STATISTICAL SIGNIFICANCE (Wilcoxon test, two-sided, for F1)\")\n",
        "print(\"=\"*80)\n",
        "for nnfa_m in nnfa_methods:\n",
        "    p_val = p_matrix.loc[nnfa_m, best_std]\n",
        "    print(f\"{nnfa_m} vs {best_std}: p = {p_val:.6f} -> {'significant (p<0.05)' if p_val < 0.05 else 'NOT significant'}\")\n",
        "p_0_vs_1 = p_matrix.loc['NNFA (ξ=0)', 'NNFA (ξ=1)']\n",
        "print(f\"\\nNNFA (ξ=0) vs NNFA (ξ=1): p = {p_0_vs_1:.6f} -> {'significant' if p_0_vs_1 < 0.05 else 'NOT significant'}\")\n",
        "\n",
        "# ------------------------------------------------------------\n",
        "# 9. Скачивание файла в Colab (автоматически)\n",
        "# ------------------------------------------------------------\n",
        "try:\n",
        "    from google.colab import files\n",
        "    files.download(output_file)\n",
        "    files.download(\"pairwise_wilcoxon_matrix.csv\")\n",
        "    print(\"Files downloaded automatically.\")\n",
        "except ImportError:\n",
        "    print(f\"\\nFiles saved locally: '{output_file}', 'pairwise_wilcoxon_matrix.csv'\")\n",
        "\n",
        "# ------------------------------------------------------------\n",
        "# 10. Боксплот для F1 (опционально)\n",
        "# ------------------------------------------------------------\n",
        "plt.figure(figsize=(14, 7))\n",
        "f1_data = [metrics[m]['f1'] for m in all_methods]\n",
        "plt.boxplot(f1_data, labels=all_methods)\n",
        "plt.xticks(rotation=90)\n",
        "plt.ylabel('F1 Score')\n",
        "plt.title(f'Distribution of F1 over {n_runs} runs (Concrete Strength, 1 outlier)')\n",
        "plt.grid(axis='y', linestyle=':', alpha=0.7)\n",
        "plt.tight_layout()\n",
        "plt.show()"
      ]
    }
  ]
}