diff --git a/WHT_matrix_L1_ADMM_FULL_SPRIGHT.ipynb b/WHT_matrix_L1_ADMM_FULL_SPRIGHT.ipynb new file mode 100644 index 0000000..e1e54db --- /dev/null +++ b/WHT_matrix_L1_ADMM_FULL_SPRIGHT.ipynb @@ -0,0 +1,5253 @@ +{ + "cells": [ + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "amirali aghazadeh July 2020\n", + "\n", + "This notebook applies L1 regularization to the WHT coefficients induced by a Neural Network\n" + ] + }, + { + "cell_type": "code", + "execution_count": 1, + "metadata": {}, + "outputs": [], + "source": [ + "import numpy as np\n", + "import pickle\n", + "import glob\n", + "import matplotlib.pyplot as plt\n", + "\n", + "from tqdm import tqdm_notebook as tqdm\n", + "import pandas as pd\n", + "\n", + "from sklearn.metrics import r2_score\n", + "#import ipdb #HMN: I didn't have ipdb so I commented this out\n", + "\n", + "from sklearn.linear_model import LinearRegression\n", + "from sklearn.linear_model import Lasso\n", + "from sklearn.model_selection import train_test_split\n", + "\n", + "from scipy.special import comb\n", + "\n", + "from sklearn.metrics import r2_score\n", + "from scipy.stats import pearsonr\n", + "from sklearn.model_selection import train_test_split\n", + "from scipy.special import comb\n", + "from scipy.sparse import csr_matrix\n", + "from sklearn import ensemble\n", + "from copy import deepcopy\n", + "\n", + "import matplotlib.pyplot as plt\n", + "import numpy as np\n", + "#import ipdb\n", + "import random\n", + "\n", + "import torch\n", + "# import torchvision\n", + "# import torchvision.transforms as transforms\n", + "\n", + "import torch.nn as nn\n", + "import torch.nn.functional as F\n", + "import torch.optim as optim\n", + "\n", + "# import warnings\n", + "# warnings.filterwarnings(\"ignore\")\n", + "\n", + "import sys\n", + "from utils2 import *" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "# Load Protein data and Visualize" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Data is from the paper: https://www.nature.com/articles/s41467-019-12130-8\n", + "\n", + "Poelwijk, Frank J., Michael Socolich, and Rama Ranganathan. \"Learning the pattern of epistasis linking genotype and phenotype in a protein.\" Nature communications 10.1 (2019): 1-11." + ] + }, + { + "cell_type": "code", + "execution_count": 2, + "metadata": { + "scrolled": true + }, + "outputs": [ + { + "data": { + "text/html": [ + "
\n", + "\n", + "\n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
binaryamino acidcountscounts.1counts.2Unnamed: 5brightnessbrightness.1Unnamed: 8brightness.2
0genotypesequenceinputredblueNaNredblueNaNcombined
1'0000000000000'DVLTFNSAAYNNK5431127846NaN0.08531661.57463NaN1.57463
2'0000000000001'DVLTFNSAAYNNR6574119047NaN0.07563711.54427NaN1.54428
3'0000000000010'DVLTFNSAAYNKK104933313352NaN0.1036331.49045NaN1.49046
4'0000000000011'DVLTFNSAAYNKR95453512513NaN0.1068461.51198NaN1.51198
.................................
8188'1111111111011'NAMPSAGCLRNKR120253613NaN0.8817620.182807NaN0.881917
8189'1111111111100'NAMPSAGCLRDNK449690NaN0.5503230.239402NaN0.553054
8190'1111111111101'NAMPSAGCLRDNR118422813NaN0.6303180.190188NaN0.630917
8191'1111111111110'NAMPSAGCLRDKK6121565NaN0.6909280.161936NaN0.691138
8192'1111111111111'NAMPSAGCLRDKR5841665NaN0.724860.165308NaN0.725056
\n", + "

8193 rows × 10 columns

\n", + "
" + ], + "text/plain": [ + " binary amino acid counts counts.1 counts.2 Unnamed: 5 \\\n", + "0 genotype sequence input red blue NaN \n", + "1 '0000000000000' DVLTFNSAAYNNK 5431 12 7846 NaN \n", + "2 '0000000000001' DVLTFNSAAYNNR 6574 11 9047 NaN \n", + "3 '0000000000010' DVLTFNSAAYNKK 10493 33 13352 NaN \n", + "4 '0000000000011' DVLTFNSAAYNKR 9545 35 12513 NaN \n", + "... ... ... ... ... ... ... \n", + "8188 '1111111111011' NAMPSAGCLRNKR 1202 536 13 NaN \n", + "8189 '1111111111100' NAMPSAGCLRDNK 449 69 0 NaN \n", + "8190 '1111111111101' NAMPSAGCLRDNR 1184 228 13 NaN \n", + "8191 '1111111111110' NAMPSAGCLRDKK 612 156 5 NaN \n", + "8192 '1111111111111' NAMPSAGCLRDKR 584 166 5 NaN \n", + "\n", + " brightness brightness.1 Unnamed: 8 brightness.2 \n", + "0 red blue NaN combined \n", + "1 0.0853166 1.57463 NaN 1.57463 \n", + "2 0.0756371 1.54427 NaN 1.54428 \n", + "3 0.103633 1.49045 NaN 1.49046 \n", + "4 0.106846 1.51198 NaN 1.51198 \n", + "... ... ... ... ... \n", + "8188 0.881762 0.182807 NaN 0.881917 \n", + "8189 0.550323 0.239402 NaN 0.553054 \n", + "8190 0.630318 0.190188 NaN 0.630917 \n", + "8191 0.690928 0.161936 NaN 0.691138 \n", + "8192 0.72486 0.165308 NaN 0.725056 \n", + "\n", + "[8193 rows x 10 columns]" + ] + }, + "execution_count": 2, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "data = pd.read_excel(open('data/41467_2019_12130_MOESM7_ESM.xlsx', 'rb')) \n", + "data\n" + ] + }, + { + "cell_type": "code", + "execution_count": 3, + "metadata": {}, + "outputs": [], + "source": [ + "genotype_list = list(data['binary'])\n", + "genotype_list = genotype_list[1:]\n", + "brightness_list = list(data['brightness.2'])\n", + "brightness_list = brightness_list[1:]" + ] + }, + { + "cell_type": "code", + "execution_count": 4, + "metadata": {}, + "outputs": [], + "source": [ + "# get rid of extra charactrs in the input, run this only once!\n", + "for ind,item in enumerate(genotype_list):\n", + " genotype_list[ind]=item[1:-1]" + ] + }, + { + "cell_type": "code", + "execution_count": 5, + "metadata": {}, + "outputs": [], + "source": [ + "data_dict = dict(zip(genotype_list, brightness_list ))" + ] + }, + { + "cell_type": "code", + "execution_count": 6, + "metadata": {}, + "outputs": [], + "source": [ + "L = 13 # length of the protein\n", + "N = 2**L # size of the landscape" + ] + }, + { + "cell_type": "code", + "execution_count": 7, + "metadata": {}, + "outputs": [], + "source": [ + "# create the landscape\n", + "landscape = np.zeros(N)\n", + "for ind in range(N):\n", + " code = dec_to_bin(ind,L)\n", + " seq = \"\".join(str(x) for x in code)\n", + " landscape[ind] = data_dict[seq]" + ] + }, + { + "cell_type": "code", + "execution_count": 8, + "metadata": { + "scrolled": true + }, + "outputs": [ + { + "data": { + "image/png": "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\n", + "text/plain": [ + "
" + ] + }, + "metadata": { + "needs_background": "light" + }, + "output_type": "display_data" + }, + { + "data": { + "text/plain": [ + "
" + ] + }, + "metadata": {}, + "output_type": "display_data" + } + ], + "source": [ + "# import seaborn as sns\n", + "# sns.set_style('dark')\n", + "plt.rcParams['figure.figsize'] = [15, 5]\n", + "plt.plot(landscape)\n", + "plt.axhline(np.mean(landscape), color='C1', linestyle='--')\n", + "plt.show()\n", + "plt.clf()" + ] + }, + { + "cell_type": "code", + "execution_count": 9, + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "0.5380500995194573" + ] + }, + "execution_count": 9, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "np.mean(landscape)" + ] + }, + { + "cell_type": "code", + "execution_count": 10, + "metadata": {}, + "outputs": [], + "source": [ + "landscape_wht = (1/np.sqrt(N)) * myfwht(landscape)" + ] + }, + { + "cell_type": "code", + "execution_count": 11, + "metadata": {}, + "outputs": [ + { + "data": { + "image/png": "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\n", + "text/plain": [ + "
" + ] + }, + "metadata": { + "needs_background": "light" + }, + "output_type": "display_data" + }, + { + "data": { + "text/plain": [ + "
" + ] + }, + "metadata": {}, + "output_type": "display_data" + } + ], + "source": [ + "plt.plot(landscape_wht)\n", + "plt.axhline(np.mean(landscape_wht), color='C1', linestyle='--')\n", + "plt.title('WHT')\n", + "plt.show()\n", + "plt.clf()" + ] + }, + { + "cell_type": "code", + "execution_count": 12, + "metadata": {}, + "outputs": [ + { + "data": { + "image/png": "iVBORw0KGgoAAAANSUhEUgAAAeAAAAEvCAYAAACdahL0AAAABHNCSVQICAgIfAhkiAAAAAlwSFlzAAALEgAACxIB0t1+/AAAADh0RVh0U29mdHdhcmUAbWF0cGxvdGxpYiB2ZXJzaW9uMy4xLjIsIGh0dHA6Ly9tYXRwbG90bGliLm9yZy8li6FKAAAgAElEQVR4nO3de5SddX3v8c/3eZ6999yTSWYyuQwQJBGkYIKmKVZtrWiLVgFXFUpbpR4qp2fZVntZLfactXrs0ra25xStejxlCRpPq2DxAl4KUkQFK5eEECAJkBASSMjckknmvq+/88fz7MllZpI9k5m9+W3er7WyZt8mz2+eefb+zO/3fX6/x5xzAgAA1RXUugEAALwSEcAAANQAAQwAQA0QwAAA1AABDABADRDAAADUQFTNjXV0dLjVq1dXc5MAANTMli1bBpxzndM9V9UAXr16tTZv3lzNTQIAUDNmtm+m5yoKYDPbK2lYUlFSwTm3wcyWSLpd0mpJeyVd7ZwbPNPGAgDwSjCbGvCvOOfWO+c2JPdvlHSfc26tpPuS+wAAoAJnchLWlZI2Jbc3SbrqzJsDAMArQ6UB7CT9wMy2mNkNyWNdzrmDye0eSV3z3joAAOpUpSdhvck5d8DMlkm618yePv5J55wzs2mv6pAE9g2SdPbZZ59RYwEAqBcV9YCdcweSr32SviVpo6ReM1shScnXvhm+92bn3Abn3IbOzmnPxAYA4BXntAFsZs1m1lq+LelXJT0l6S5J1yUvu07SnQvVSAAA6k0lQ9Bdkr5lZuXXf9U5d7eZPSrp62Z2vaR9kq5euGYCAFBfThvAzrk9ktZN8/ghSZctRKMAAKh33q4F/Z/PDeiubS/VuhkAAMyJtwH8b5v36x/uefr0LwQA4GXI2wAOA1OxOO3MJwAAXva8DeBUaCqUCGAAgJ+8DeAwIIABAP7yNoCjIFChWKp1MwAAmBOPA9hUpAcMAPCUtwEcUgMGAHjM2wCOqAEDADzmcQAHKpacnCOEAQD+8TiATZKoAwMAvORtAIdhHMAMQwMAfORtAKeCuOkEMADAR94GcFgegmY5SgCAh7wN4CgZgs6XWIwDAOAffwM4GYLmJCwAgI88DmBOwgIA+MvbAC7XgFkPGgDgI28DOGIaEgDAY/4GMDVgAIDHvA3g8hB0niFoAICHvA1glqIEAPjM3wCmBgwA8Ji/AUwNGADgMW8DmBowAMBn3gZwKqQGDADwl7cBHLISFgDAY94GcLkGXOBqSAAAD/kbwJND0NSAAQD+8TeAGYIGAHjM2wA+djEGAhgA4B9vAzgVJjVgesAAAA95G8BhQA0YAOAvbwM4mlyIgx4wAMA/3gZwyMUYAAAe8zaAI2rAAACP+RvAk2dBUwMGAPjH2wBmKUoAgM+8DeDyNCRqwAAAH3kbwEkHmB4wAMBL3gawmSkKjBowAMBLFQewmYVmttXMvpvcP9fMHjaz3WZ2u5mlF66Z04tCYwgaAOCl2fSAPyJp53H3PyXpJufcGkmDkq6fz4ZVIgoChqABAF6qKIDNrFvSr0v6YnLfJL1V0h3JSzZJumohGngqIUPQAABPVdoD/rSkP5dUTrulko445wrJ/f2SVs1z204rFRo9YACAl04bwGb2Lkl9zrktc9mAmd1gZpvNbHN/f/9c/osZhQE1YACAnyrpAb9R0hVmtlfSbYqHnj8jabGZRclruiUdmO6bnXM3O+c2OOc2dHZ2zkOTj4mCgIsxAAC8dNoAds59zDnX7ZxbLek3Jf3QOffbku6X9N7kZddJunPBWjmD+CxoasAAAP+cyTzgv5D0J2a2W3FN+Jb5aVLlwoAaMADAT9HpX3KMc+5Hkn6U3N4jaeP8N6ly8UIcBDAAwD/eroQlSSHzgAEAnvI6gFPUgAEAnvI6gKkBAwB85XUAUwMGAPjK8wAOWIgDAOAlvwM4NBWoAQMAPOR1AFMDBgD4yusAjoKAGjAAwEueBzAXYwAA+MnrAA5DU54aMADAQ14HcIoeMADAU14HcEgNGADgKa8DOAqYhgQA8JPfARwyBA0A8JPfAcw8YACAp7wOYGrAAABfeR3ALEUJAPCV3wHMNCQAgKe8D+B80ck5QhgA4BevAzgM4ubTCQYA+MbrAI5CkyTqwAAA7/gdwEEcwNSBAQC+8TqAwySA80xFAgB4xusAToVx8+kBAwB843UAl3vA1IABAL7xOoDLNWBWwwIA+MbvAGYIGgDgKb8DeHIImgAGAPjF6wCerAEXqQEDAPzidQCnQnrAAAA/eR3A5aUoqQEDAHzjdQBHkwtxMAQNAPCL1wEcshQlAMBTXgdwRA0YAOApvwM4qQGzEAcAwDdeBzBLUQIAfOV1AJenIVEDBgD4xusA5nKEAABfeR3AEfOAAQCe8juAQ2rAAAA/+R3AzAMGAHjqtAFsZg1m9oiZbTOz7Wb28eTxc83sYTPbbWa3m1l64Zt7opDrAQMAPFVJDzgr6a3OuXWS1ku63MwulfQpSTc559ZIGpR0/cI1c3qp5HrALMQBAPDNaQPYxUaSu6nkn5P0Vkl3JI9vknTVgrTwFI4tRUkNGADgl4pqwGYWmtnjkvok3SvpOUlHnHOF5CX7Ja1amCbOLGIaEgDAUxUFsHOu6JxbL6lb0kZJF1S6ATO7wcw2m9nm/v7+OTZzelHINCQAgJ9mdRa0c+6IpPslvUHSYjOLkqe6JR2Y4Xtuds5tcM5t6OzsPKPGniwKuBgDAMBPlZwF3Wlmi5PbjZLeLmmn4iB+b/Ky6yTduVCNnMmxs6CpAQMA/BKd/iVaIWmTmYWKA/vrzrnvmtkOSbeZ2SckbZV0ywK2c1r0gAEAvjptADvnnpB0yTSP71FcD64ZM1MYGDVgAIB3vF4JS4qHofNMQwIAeMb7AI4CU5FpSAAAz9RFAFMDBgD4xv8ADgOuhgQA8I73AcxJWAAAH3kfwKnAuBoSAMA73gdwGNIDBgD4x/sAjoJAeQIYAOCZOghg43KEAADveB/AITVgAICHvA/gKGQeMADAP/4HcBAQwAAA79RBAFMDBgD4x/sADgNTnhowAMAz3gdwxDxgAICH/A9gasAAAA/VQQCbCkVqwAAAv3gfwFyMAQDgI+8DOBUyBA0A8I/3ARwyBA0A8JD3ARwFrIQFAPCP/wHMNCQAgIe8D+CQaUgAAA95H8BMQwIA+Mj/AOZqSAAAD/kfwMwDBgB4yPsADoNABS7GAADwjPcBnApNBS5HCADwjPcBHAamkpNKDEMDADzifQBHgUkSJ2IBALzifQCHQfwjcCIWAMAn3gdwKiz3gKkDAwD84X0Ah+UhaM6EBgB4xPsApgYMAPCR/wEcUgMGAPjH+wAuD0HnWQ8aAOAR7wO4PARNDxgA4BP/AzgZgqYGDADwif8BTA8YAOAh7wOYGjAAwEfeB3B5IQ56wAAAn5w2gM3sLDO738x2mNl2M/tI8vgSM7vXzHYlX9sXvrlTlZeipAYMAPBJJT3ggqQ/dc5dKOlSSR82swsl3SjpPufcWkn3JferbnIhDoagAQAeOW0AO+cOOuceS24PS9opaZWkKyVtSl62SdJVC9XIU+EkLACAj2ZVAzaz1ZIukfSwpC7n3MHkqR5JXfPasgpFIUtRAgD8U3EAm1mLpG9I+qhzbuj455xzTtK0CWhmN5jZZjPb3N/ff0aNnc6xGjBD0AAAf1QUwGaWUhy+/+qc+2bycK+ZrUieXyGpb7rvdc7d7Jzb4Jzb0NnZOR9tPkHE1ZAAAB6q5Cxok3SLpJ3OuX887qm7JF2X3L5O0p3z37zTi5iGBADwUFTBa94o6f2SnjSzx5PH/lLS30n6upldL2mfpKsXpomnVu4B5wlgAIBHThvAzrkHJdkMT182v82ZvXINuEgNGADgEe9XwqIGDADwkf8BzDQkAICHvA/g8sUYCGAAgE+8D+BUuQbMUpQAAI94H8AhQ9AAAA95H8ARQ9AAAA/VQQCXpyERwAAAf9RBADMNCQDgH+8DOAhMZlyMAQDgF+8DWIrPhKYGDADwSV0EcBgYNWAAgFfqIoCjwJRnHjAAwCN1EcBhSA8YAOCXugjgiBowAMAzdRLApgJD0AAAj9RFAIeB0QMGAHilLgI4RQ0YAOCZugjgMDBWwgIAeKUuAjg+CYsaMADAH/URwAxBAwA8Ux8BHJjyDEEDADxSFwHMUpQAAN/URQBHITVgAIBf6iOA6QEDADxTFwEcUgMGAHimLgI4FQb0gAEAXqmLAGYpSgCAb+oigLkYAwDAN3URwExDAgD4pi4COBVyPWAAgF/qIoBDhqABAJ6piwCOOAkLAOCZ+ghgLsYAAPBMfQRwECjPEDQAwCN1EcCcBQ0A8E1dBHAUUgMGAPilPgKYk7AAAJ6piwAOg3gtaOcIYQCAH+oigFOBSRJ1YACAN+oigMMwDmCGoQEAvqiLAI4CAhgA4JfTBrCZ3WpmfWb21HGPLTGze81sV/K1fWGbeWpREP8YxSIBDADwQyU94C9Luvykx26UdJ9zbq2k+5L7NRNNDkGzGAcAwA+nDWDn3E8kHT7p4SslbUpub5J01Ty3a1ZChqABAJ6Zaw24yzl3MLndI6lrntozJ9SAAQC+OeOTsFw8+XbG5DOzG8xss5lt7u/vP9PNTYsaMADAN3MN4F4zWyFJyde+mV7onLvZObfBObehs7Nzjps7tXINOE8NGADgibkG8F2SrktuXyfpzvlpztyENVqI4+h4XuO5YlW3CQCoD5VMQ/qapJ9JOt/M9pvZ9ZL+TtLbzWyXpLcl92umPARdqPIQ9HW3PqK//u6Oqm4TAFAfotO9wDl37QxPXTbPbZmzYydhVXcIek//iDJRXaxlAgCosrpIj1osRZktFDU0UdCh0VzVtgkAqB91EcCp8lnQVQzgQyNx8A6MZKu2TQBA/aiLAC6fhJUvVm8Iuhy8R8byVd0uAKA+1EUAl6chVbMHfHzPt9wbBgCgUvURwDVYCat/+FgAMwwNAJitOgng6q+ENXBcr7efAAYAzFJdBHBYg2lIJ/SAhwlgAMDs1EUAp2owDWlgJKtlrRlJYioSAGDW6iKAa7EU5cBIVucsbVJjKqQHDACYtboI4HINOF/lGnBHS0YdrWlOwgIAzFpdBHA4OQ2pujXgjpaMOloyJ5yQBQBAJeoigFNVnoaUK5R0dDx/XADTAwYAzE5dBPDkWdBVGoI+NBoHbkdrmgAGAMxJXQTw5OUIq9QDHhiOh5w7WjLqbEnr8Giu6tciBgD4rT4CuMo14HKPt7M1o6UtGZWcNDhGHRgAULm6COBjF2OoTi+0vPJVZ1IDlliOEgAwO3URwFGV5wGXwzY+CSsdPzZMDxgAULm6COCwymdB9w9n1ZwO1ZgO1dFKDxgAMHt1EcBmpigwFap0Xd6Bkdxk8DIEDQCYi7oIYCnuBVdtCDpZhEOS2hoipcOAKyIBAGalbgI4FQbVm4Y0kp2s/ZqZOlrS1IABALNSNwFc1R7wSFadyRC0JC1tyUwuzgEAQCXqJoCjwJSvQg04XyxpcCw/OQQtKe4BMwQNAJiF+gngsDo94EMjx1bBKutoyTAEDQCYlfoJ4KA6NeDj5wCXdbTGQ9DOsRwlAKAydRPAYZWmIU2ugtWannysoyWjfNHp6Hh+wbcPAKgPdRPAUWDV6QEPT9MDLq+GRR0YAFCh+gngKtWAB6apAXcmt/upAwMAKlQ3ARwGQVUuxjAwklVTOlRzJpp8bGkSwExFAgBUqm4COAqsKpcjjBfhyJzw2LELMhDAAIDK1E8Ah9WpAfcPH1sFq6y9Ka0wsMnhaQAATqd+AjgwFao0BH1yDzgITEuaWYwDAFC5ugngai1FefyVkI7X0ZKpegCP5Qp652ce0D3be6q6XQDAmaubAI4vxrCwNeBCsaTBsdyUHrAU14H7qzwE/YPtvdpxcEhf/uneqm4XAHDm6iaAwyrMAz48mpNzUudJNWApnopU7ZOwvrn1gCTpoecPqXdooqrbBgCcmboJ4GrUgI+tgjW1B7y0JV3V5Sj7hib04K5+vfPi5XJO+s62l6qyXQDA/KijAA4WvAbcP80qWGUdLRlN5EsazRUXtA1ld217SSUn/cnbz9dFq9oIYADwTN0EcBia8gtcA55uFayy8mPVGob+1tYDem33Iq1Z1qIr1q3Utv1H9fzAaFW2DQA4c3UTwFEVzoKevBLSdGdBJ49V40zoZ3uHtf2lIb3nklWSpHe9dqUkhqEBwCd1FMDBgteAB4azakgFak6HU56r5gUZvvnYAYWB6d3r4uBdubhRG89dojsfP8AlEQG8LOwfHNNItlDrZrys1VEAn9gDfnDXgG78xhPzeonA8iIcZjbluckLMizwVKRSyenOxw/ol9Z2nDAUfsW6lXquf1Q7Dg4t6PZPNpEv6t4dvcoVFn4ZULy8jeeK+uIDe7Snf6TWTUGNPfL8YV32v3+sKz/3oHqOMkNjJmcUwGZ2uZk9Y2a7zezG+WrUXIShTc4DvvPxA/rglx/RbY++qA/c+oiGJuYnhAdGpp8DLElLmquzHvRDzx/SwaMTes/ruk94/J0Xr1AUmO6q4jD0c/0juurzP9WHvrJZH7ltq/JVuB4zXp6e7R3WlZ9/UJ/43k5d8bmf6ntPHKx1k1AjO14a0vWbHlVXW4N6h7K65uafaf/gWK2b9bI05wA2s1DS5yW9Q9KFkq41swvnq2GzVb4e8Kb/3KuP3v64Ljm7XTdds07bDxzVdbc+ouF5COGBkey0U5AkKQoDtTelzviKSKXT1LG/9dgBtWQi/eqFXSc8vqQ5rTev7dB3Hn/ptP/HfPj21gN692cfVO/QhN5/6Tn696d69Cdf36ZClUP4uf4R/fkd23T5p3+iT939tJ7pGa7q9ifyRd3/dJ/+x7ef1H//1pN6uqe6IxC15pzT7Y++oCs+96AOj+b06WvWa21Xiz781cf08e9sZ2TkFWbfoVF94NZH1JKJ9LUbLtX/u36jBkdzuuafH9JeThKdIjr9S2a0UdJu59weSTKz2yRdKWnHfDRstqIg0JGxvP7qru16+4Vd+uy1l6ghFaoxFekPvvqYPvilR/Xl/7JRLZkTf2TnnLbtP6pvbz2g+5/pU2tDpLOXNOms9iatam/U8ERB+wfHdeDIuJ7rH9ElZ7fP2IaOlox2941o58EhLWvNqL0prSCYOlx9st19w7pne69+sKNXT+4/omWtDXEbljRp5eIGFUpO47mixnNFfe/Jg/r1i1eoITW1Dn3F+pX649u36a5tL+k1K9qUjgKlo0CpwBQEptDir5koUCYKph1KLyuWnJ7pGdbmfYe1p39ULZlIrQ2RWhtS2vrCoP5ty379/Op2/dO1l2jFokadtaRRf/P9p5UKTP/wvnUKT/FzHzw6rsHRvBrToZrSoRpSoVoz0ZR9dXQ8r589N6AHdw/o6HhBFyxv1WtWtOqC5W0aGMnqCz96Tndv71E6DPTa7kW6+Sd79IUfPacLlrfqVy5YpvFcUQMjWQ2MZDU0XlBna0YrFzdo5aJGrVjcqCXNKS1qTGtxU0qLG1Mz/r5GswXtOzSmQ6NZHR3Pa2i8oKPjeW19YVAP7BrQeL6opnSoknP614df0JvWdOj6N5+rX17becL/Vyw5HRiMj6PdfSPqHZrQ4qaUlrZktLQ5rc7WjF7V2aJFjakpbXDOqX8kq3zRKTApMFNgpqXNMx9jvUMTOjKWV3d74wmXzxzLFfTUgSE9/uKgBkZyWtaaUVdbg1YsatDSloyiwJQKA4WBKbC43fmSU7HolC0UdWg0F+/X4awe2nNYd2/v0RvXLNVN16zXstYGvfPiFfrbf9+pL/10r7a9eES/8fpulVz8MxRLTq0NKXW1xdvsam1QW2M05VgczRbUMzShnqMTyhVK6m5vVHd7kxqT8y/GcgU90zOsp3uGlSuUdO3Gs5WOpvYnxnNFfeVnezWaLSgKA0WhKR0GWtyUVkdLWh0tGXW2ZpQOT/zepkyoTDT1PXb872MiX9J4vqjxfFHN6VCLm6Yu0DM8kdcdW/brwV0D8XHeEL+PWjKp+L0Zxvu6fD3zQtGpUCqpUHJqiEK1NERqyURqzkRqP+5YKb//nXMazxc1mi2qtSGa9nNBin+HIxMFRaEpCk2pIFCuWNL+wXHtHxzT/sFxHRrJqTkTTravKRNKLv7eQsnJOad0FKghFSqTfG1vjvdjJgrVNzSh37nlYRVLJd12wxu0anGjVi1u1Fc/dKnef8vDuvqff6Y/umytDo/mdPDohHqHJhSYac2yFq1d1qK1XS3qbM1oLFfUWLaosVxBEyf9ARcFpvbkd9fenFYq+b3lCiWN54rKFUvqaEnP+Nk2liuoUHJKh4HSYaAgMI1mC+obzqp3aEJ9w1m1N6X05rWdM/7u55PN9aQdM3uvpMudc7+X3H+/pF9wzv3BTN+zYcMGt3nz5jlt73T+9t936p9/vEdXb+jW37znYkXHvaG+/+RB/eHXturnVrZp4+olyqQCpcNQY/mC7nmqR3sPjSkdBnrz2g4VSk4vHo4PyFzSm2tvSmlVe6O6Fzfp999yntaftXjaNvzeps36j529k/ejwNTZmtGytgYtTz5wWjKRhicKGp7Ia3iioOcHRrUn+ctwXfciXfqqpTo0mtMLh8f04uEx9QxNKApMjalQjelQbQ0p3XTNel20atGU7Y9kC9r4yf/QWAVzkVOhqSUTqaUhUnM6/lBozkST7XvshUENT8QnUDSnQ43niyp3rM2kD79ljT76trUn7OfP379b/3DPM3rf67v1d7/x2ikhnC+W9Pn7d+tzP9w9ZdWyKLA4CBY1aHlbg3qGJrTtxSMqOakpHaq9Ka0DR8ZP+J7WhkgfeMM5+uAbz51ci/v7Tx7UnY+/pC37BtWaidTRGn9gtTZEGhjJ6aUj4zo0On2dPgpMHS0ZdbXFH8pHxvLad3hscv73yVYuatBlr+nSZa9ZpktftVTjuaK++sgL+srP9qp3KKu2hkhRGKjknJyTxvPFE3qEDalAE/mpPcTlbQ1a29Wiczua1T+c1fMDo9p3aEzj+am/11WLG3XF+pW6cv1KXbC8TdlCUf+xo0+3b35RD+zqV/ntvbQ5re4lTcoVSnq2d3jyfIl0GEwe53ORjgL90VvX6L+9Zc2U3/f3njiov/jGExWdiJNO/ijMRKGyheLksXeyjpaMGtOB9g+O6/iPrndctFyfvfaSE47HiXxRH/rKZj2wa2BOP1trJtLSlrSWNKcVmGkoec8OjeenzPc3ky5etUi//OpOveX8TrU2pPQvD+3TN7bs12iuqFd1NkvS5Ht/ut/7bDSlQ5mksXxxcj8EJp3b0awLVrTpwhVtSoWmZ3pG9GzvsHb1DZ/xNk+ltSGSSSqUnL76oUunfEY+0zOs3/7iw5MnqS5tTmv5ogblCiXtPTQ652u5N6dDZQulEz5PWjKRzl/eqguWt+q8zhb1DWf1bO+wnukZnvIZMt01BC67YJlu+d2fn1N7pmNmW5xzG6Z9bqED2MxukHSDJJ199tmv37dv35y2dzp7B0b1yN7Det/ru6f96+e7T7ykv/7ODo1kC8olvzAz6RfPW6or163Sr120/ISeR6kU9zjKf31WYjRb0I6DQ+obyqpveGLyr6r+5GvvUFYj2YJaGyK1NaTU2hBpWWtGv3LBMr39wi6tWNQ45f8slVxFveiy3X3Den5gTLlCSbli/IGfLzqVkt5HseSULZQ0ki1oNFvQyERBw+Xbyf1UGOh157Rr47nt2nDOEnW3x+0ay8UfjEEgLWttmHb7N937rD5z3y6tWtyo97/hHF2z4Sy1N6e146Uh/dm/bdOOg0O6av1KXX7R8rj3kCtpLFfQ4dGceobiv4p7jk6orTGlN63p0JvWdOiSs9uVjgINTeTjXs/BITlJ77lklVobpvYWpXjd7iicvsIykS+q5+iEBsdyOjKe19GxvI6M5dQ/klXv0LHfWVtjSquXNumcpc06Z2mTutoatKgxpbaGlBY1ptSQmn4UIVco6XtPxn8EmExmkklqSIV6VWezzuts0XmdLWpvTitbKOrwaE6HRnLqOTqh3f3xB+azvcPaNzCmztaMVnc0a/XSZq3uaFJDFPe0Sy7+OX6yq18P7BpQseT06q4WDYzkdHg0pxWLGvS+DWdpzbIW7R+M/5h78fC4zKT1Zy3Wuu7FWnfWYnW0pHV0PD/Z2zw8mlMhOU4KJadSySkMTKnQFAWBUlGgpc1pLU16j+VLcc5kLFfQ8ERBdlyvfWg8P9nb6B2a0PBEQROForL5krKFktKhafmiRi1flNHytkalI9P+wfHJn2E0V9Cru1qTEZE23bO9R5/43k5duX6l/vHq9QoDU65Q0u//yxb98Ok+/f1vvFbv29A9+TPliiUdGc2rf2RC/cNxb/740olT/F4eGMnp0GhOh0ayck5a1Bi/Z9saU2rORGpKh/EfxqlQPUMT+vGz/dr6wuDkH6rpMNC71q3Q7/7iar22+8RAKhTj92W+VFI++TwKg7hnGoamKDBN5OP322gufl8OjuV1eDQbt2skp8DiIG5K2jIwktPOg0N6umdILx6Og6arLaNXd7Xq/K5WLV/UMLkP8sWSosDijkV7k7rbG7W0OaPxfFHDE/nk86GowOKQikdD4v2aLZSULRQ1litqsDwaMpLTkbGcfusXztHGc5dMeyyMZgs6NJJT16LMCaML+WJJ+w6NaXffsA6P5tWcCdWUjn+mk0fq8sVSvM3RnA6P5HR0PK9MKlBT0kEJA9PzA6N6+uCwdvYMaXiioFRoOq+zRecvb9XaZS1qSIXKFUvKF5xyxaJaMqnJUaCutrgT0DbD58pcLFQAv0HS/3TO/Vpy/2OS5Jz725m+ZyF7wLNVLMWhlJrhQxpz45zTD3b06ks/fV4P7TmsTBTozWs79eNn+7SoMaVPvudi/drPLa91M+tKuef//ScPaklzWldvOEtvXtt5ymCsN//nR7v193fHoy+ffM/F+sOvPaZ7tvfqE1ddpN+59JyqtePoWF4P7O5X/3BW7163csaTNhfa8ERexZKbdlj8lcI5p4GRnBY3pWr6Ob9QARxJelbSZZIOSHpU0m8557bP9D0vpwDGwnu6Z0ib/mJQPDMAAAT8SURBVHOfvv/kQf3Sqzv18St+bvJscWC+lUdfutsbtX9wXH/17gv1wTeeW+tm4RVuQQI4+Y/fKenTkkJJtzrnPnmq1xPAABaKc06fuvsZ/d8fP6ePveMC/ddfPq/WTQIWLoBniwAGsND6hidmPEcBqLZTBTAFUAB1hfCFLwhgAABqgAAGAKAGCGAAAGqAAAYAoAYIYAAAaoAABgCgBghgAABqgAAGAKAGCGAAAGqAAAYAoAaquha0mfVLms8LAndImtvVtnE89uP8YD/OD/bj/GA/zo8z3Y/nOOc6p3uiqgE838xs80yLXKNy7Mf5wX6cH+zH+cF+nB8LuR8ZggYAoAYIYAAAasD3AL651g2oE+zH+cF+nB/sx/nBfpwfC7Yfva4BAwDgK997wAAAeMnbADazy83sGTPbbWY31ro9vjCzs8zsfjPbYWbbzewjyeNLzOxeM9uVfG2vdVtf7swsNLOtZvbd5P65ZvZwckzebmbpWrfRB2a22MzuMLOnzWynmb2B43F2zOyPk/fzU2b2NTNr4HisjJndamZ9ZvbUcY9Ne/xZ7J+SffqEmb3uTLbtZQCbWSjp85LeIelCSdea2YW1bZU3CpL+1Dl3oaRLJX042Xc3SrrPObdW0n3JfZzaRyTtPO7+pyTd5JxbI2lQ0vU1aZV/PiPpbufcBZLWKd6nHI8VMrNVkv5I0gbn3EWSQkm/KY7HSn1Z0uUnPTbT8fcOSWuTfzdI+sKZbNjLAJa0UdJu59we51xO0m2Srqxxm7zgnDvonHssuT2s+MNuleL9tyl52SZJV9WmhX4ws25Jvy7pi8l9k/RWSXckL2EfVsDMFkn6JUm3SJJzLuecOyKOx9mKJDWaWSSpSdJBcTxWxDn3E0mHT3p4puPvSklfcbGHJC02sxVz3bavAbxK0ovH3d+fPIZZMLPVki6R9LCkLufcweSpHkldNWqWLz4t6c8llZL7SyUdcc4Vkvsck5U5V1K/pC8lw/lfNLNmcTxWzDl3QNL/kvSC4uA9KmmLOB7PxEzH37xmj68BjDNkZi2SviHpo865oeOfc/Gp8ZwePwMze5ekPufcllq3pQ5Ekl4n6QvOuUskjeqk4WaOx1NL6pNXKv5jZqWkZk0dUsUcLeTx52sAH5B01nH3u5PHUAEzSykO3391zn0zebi3PJSSfO2rVfs88EZJV5jZXsXlj7cqrmMuToYAJY7JSu2XtN8593By/w7FgczxWLm3SXreOdfvnMtL+qbiY5Tjce5mOv7mNXt8DeBHJa1NzvJLKz7h4K4at8kLSa3yFkk7nXP/eNxTd0m6Lrl9naQ7q902XzjnPuac63bOrVZ87P3QOffbku6X9N7kZezDCjjneiS9aGbnJw9dJmmHOB5n4wVJl5pZU/L+Lu9Djse5m+n4u0vSB5KzoS+VdPS4oepZ83YhDjN7p+I6XCjpVufcJ2vcJC+Y2ZskPSDpSR2rX/6l4jrw1yWdrfiKVVc7504+MQEnMbO3SPoz59y7zOxVinvESyRtlfQ7zrlsLdvnAzNbr/hktrSkPZI+qLhzwPFYITP7uKRrFM9y2Crp9xTXJjkeT8PMvibpLYqvetQr6a8kfVvTHH/JHzifUzzEPybpg865zXPetq8BDACAz3wdggYAwGsEMAAANUAAAwBQAwQwAAA1QAADAFADBDAAADVAAAMAUAMEMAAANfD/AeExJWQmHkIJAAAAAElFTkSuQmCC\n", + "text/plain": [ + "
" + ] + }, + "metadata": { + "needs_background": "light" + }, + "output_type": "display_data" + } + ], + "source": [ + "# first 100 WHT coefficients\n", + "plt.rcParams['figure.figsize'] = [8, 5]\n", + "plt.plot(landscape_wht[0:100])\n", + "plt.show()" + ] + }, + { + "cell_type": "code", + "execution_count": 13, + "metadata": {}, + "outputs": [], + "source": [ + "# sanity check: WHT of WHT is identity operator\n", + "landscape_wht_wht = (1/np.sqrt(N)) * myfwht(landscape_wht)\n" + ] + }, + { + "cell_type": "code", + "execution_count": 14, + "metadata": {}, + "outputs": [ + { + "data": { + "image/png": "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\n", + "text/plain": [ + "
" + ] + }, + "metadata": { + "needs_background": "light" + }, + "output_type": "display_data" + } + ], + "source": [ + "plt.rcParams['figure.figsize'] = [15, 5]\n", + "plt.plot(landscape_wht_wht)\n", + "plt.axhline(np.mean(landscape_wht_wht), color='C1', linestyle='--')\n", + "plt.show()" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "* How sparse are the WHT coefficients?" + ] + }, + { + "cell_type": "code", + "execution_count": 15, + "metadata": {}, + "outputs": [], + "source": [ + "landscape_wht_sorted = np.sort(np.abs(landscape_wht))[::-1]" + ] + }, + { + "cell_type": "code", + "execution_count": 16, + "metadata": {}, + "outputs": [], + "source": [ + "cumulative_energy = np.zeros(N)\n", + "total_energy = np.linalg.norm(landscape_wht_sorted)\n", + "for ind in range(N):\n", + " cumulative_energy[ind] = np.linalg.norm(landscape_wht_sorted[0:ind]) / total_energy" + ] + }, + { + "cell_type": "code", + "execution_count": 17, + "metadata": {}, + "outputs": [ + { + "data": { + "image/png": "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\n", + "text/plain": [ + "
" + ] + }, + "metadata": { + "needs_background": "light" + }, + "output_type": "display_data" + } + ], + "source": [ + "fig, ax = plt.subplots(1,1, figsize=(8,4))\n", + "ax.plot(cumulative_energy[0:10000])\n", + "plt.title('cumulative energy')\n", + "plt.show()" + ] + }, + { + "cell_type": "code", + "execution_count": 18, + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "0.989050616708871" + ] + }, + "execution_count": 18, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "cumulative_energy[40]" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Using 40 samples (0.4%) we can capture more than 99% of the energy." + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "# Set the NN Architecture" + ] + }, + { + "cell_type": "code", + "execution_count": 19, + "metadata": {}, + "outputs": [], + "source": [ + "class Net(nn.Module):\n", + " def __init__(self, n, multiplier):\n", + " super(Net, self).__init__()\n", + " self.fc1 = nn.Linear(n, multiplier*n)\n", + " self.bn1 = nn.BatchNorm1d(multiplier*n)\n", + " self.fc2 = nn.Linear(multiplier*n, multiplier*n)\n", + " self.bn2 = nn.BatchNorm1d(multiplier*n)\n", + " self.fc3 = nn.Linear(multiplier*n, n)\n", + " self.bn3 = nn.BatchNorm1d(n)\n", + " self.fc4 = nn.Linear(n, 1)\n", + " torch.nn.init.xavier_uniform_(self.fc1.weight)\n", + " torch.nn.init.xavier_uniform_(self.fc2.weight)\n", + " torch.nn.init.xavier_uniform_(self.fc3.weight)\n", + " torch.nn.init.xavier_uniform_(self.fc4.weight)\n", + "\n", + " # here are going ot define the sizes of the inputs and outputs based off this multiplier \n", + "\n", + " def forward(self, x):\n", + " x = self.bn1(F.leaky_relu(self.fc1(x)))\n", + " x = self.bn2(F.leaky_relu(self.fc2(x)))\n", + " x = self.bn3(F.leaky_relu(self.fc3(x)))\n", + " x = self.fc4(x)\n", + " return x\n", + " \n", + "def test(net, X, y): \n", + " with torch.no_grad():\n", + " y_hat = net(torch.from_numpy(X).float())\n", + " e = y - y_hat.numpy().flatten()\n", + " return np.mean(e**2)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "# WHT ADMM Regularization w/ Lagrangian Term + SPRIGHT" + ] + }, + { + "cell_type": "code", + "execution_count": 20, + "metadata": { + "scrolled": true + }, + "outputs": [ + { + "data": { + "application/vnd.jupyter.widget-view+json": { + "model_id": "862f34dc24124a1f9434cf15407d4af0", + "version_major": 2, + "version_minor": 0 + }, + "text/plain": [ + "HBox(children=(FloatProgress(value=0.0, max=300.0), HTML(value='')))" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "/usr/local/lib/python3.7/site-packages/torch/nn/modules/loss.py:431: UserWarning: Using a target size (torch.Size([60, 4559])) that is different to the input size (torch.Size([4559])). This will likely lead to incorrect results due to broadcasting. Please ensure they have the same size.\n", + " return F.mse_loss(input, target, reduction=self.reduction)\n" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "-2.819508474897938\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "/usr/local/lib/python3.7/site-packages/torch/nn/modules/loss.py:431: UserWarning: Using a target size (torch.Size([60, 4559])) that is different to the input size (torch.Size([4559])). This will likely lead to incorrect results due to broadcasting. Please ensure they have the same size.\n", + " return F.mse_loss(input, target, reduction=self.reduction)\n" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "-2.4951363814666387\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "/usr/local/lib/python3.7/site-packages/torch/nn/modules/loss.py:431: UserWarning: Using a target size (torch.Size([60, 4559])) that is different to the input size (torch.Size([4559])). This will likely lead to incorrect results due to broadcasting. Please ensure they have the same size.\n", + " return F.mse_loss(input, target, reduction=self.reduction)\n" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "-1.9020603543570078\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "/usr/local/lib/python3.7/site-packages/torch/nn/modules/loss.py:431: UserWarning: Using a target size (torch.Size([60, 4559])) that is different to the input size (torch.Size([4559])). This will likely lead to incorrect results due to broadcasting. Please ensure they have the same size.\n", + " return F.mse_loss(input, target, reduction=self.reduction)\n" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "-1.4065442847974858\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "/usr/local/lib/python3.7/site-packages/torch/nn/modules/loss.py:431: UserWarning: Using a target size (torch.Size([60, 4559])) that is different to the input size (torch.Size([4559])). This will likely lead to incorrect results due to broadcasting. Please ensure they have the same size.\n", + " return F.mse_loss(input, target, reduction=self.reduction)\n" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "-1.0392812972493637\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "/usr/local/lib/python3.7/site-packages/torch/nn/modules/loss.py:431: UserWarning: Using a target size (torch.Size([60, 4559])) that is different to the input size (torch.Size([4559])). This will likely lead to incorrect results due to broadcasting. Please ensure they have the same size.\n", + " return F.mse_loss(input, target, reduction=self.reduction)\n" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "-0.7767648104759852\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "/usr/local/lib/python3.7/site-packages/torch/nn/modules/loss.py:431: UserWarning: Using a target size (torch.Size([60, 4559])) that is different to the input size (torch.Size([4559])). This will likely lead to incorrect results due to broadcasting. Please ensure they have the same size.\n", + " return F.mse_loss(input, target, reduction=self.reduction)\n" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "-0.5834774021104994\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "/usr/local/lib/python3.7/site-packages/torch/nn/modules/loss.py:431: UserWarning: Using a target size (torch.Size([60, 4559])) that is different to the input size (torch.Size([4559])). This will likely lead to incorrect results due to broadcasting. Please ensure they have the same size.\n", + " return F.mse_loss(input, target, reduction=self.reduction)\n" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "-0.4386023026331085\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "/usr/local/lib/python3.7/site-packages/torch/nn/modules/loss.py:431: UserWarning: Using a target size (torch.Size([60, 4559])) that is different to the input size (torch.Size([4559])). This will likely lead to incorrect results due to broadcasting. Please ensure they have the same size.\n", + " return F.mse_loss(input, target, reduction=self.reduction)\n" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "-0.32744628773685647\n" + ] + }, + { + "ename": "KeyboardInterrupt", + "evalue": "", + "output_type": "error", + "traceback": [ + "\u001b[0;31m---------------------------------------------------------------------------\u001b[0m", + "\u001b[0;31mKeyboardInterrupt\u001b[0m Traceback (most recent call last)", + "\u001b[0;32m\u001b[0m in \u001b[0;36m\u001b[0;34m\u001b[0m\n\u001b[1;32m 129\u001b[0m \u001b[0;31m# we follow the sacled dual version of ADMM see page 17 of https://web.stanford.edu/~boyd/papers/pdf/admm_slides.pdf\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 130\u001b[0m \u001b[0;31m#wht_diff = wht_out - (1/torch.sqrt(num_coeffs))*F.linear(torch.tensor(u, dtype=torch.float), wht_mat) + torch.tensor(lam, dtype=torch.float)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m--> 131\u001b[0;31m \u001b[0mwht_diff\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0mwht_out\u001b[0m \u001b[0;34m-\u001b[0m \u001b[0mF\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mlinear\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mtorch\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mtensor\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mu\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mdtype\u001b[0m\u001b[0;34m=\u001b[0m\u001b[0mtorch\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mfloat\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mwht_mat\u001b[0m\u001b[0;34m)\u001b[0m \u001b[0;34m+\u001b[0m \u001b[0mtorch\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mtensor\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mlam\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mdtype\u001b[0m\u001b[0;34m=\u001b[0m\u001b[0mtorch\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mfloat\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m\u001b[1;32m 132\u001b[0m \u001b[0mloss_wht\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0mro\u001b[0m\u001b[0;34m/\u001b[0m\u001b[0;36m2\u001b[0m \u001b[0;34m*\u001b[0m \u001b[0ml2_loss\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mwht_diff\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mreg_target\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 133\u001b[0m \u001b[0mloss\u001b[0m \u001b[0;34m+=\u001b[0m \u001b[0mloss_wht\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n", + "\u001b[0;32m/usr/local/lib/python3.7/site-packages/torch/nn/functional.py\u001b[0m in \u001b[0;36mlinear\u001b[0;34m(input, weight, bias)\u001b[0m\n\u001b[1;32m 1370\u001b[0m \u001b[0mret\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0mtorch\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0maddmm\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mbias\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0minput\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mweight\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mt\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 1371\u001b[0m \u001b[0;32melse\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m-> 1372\u001b[0;31m \u001b[0moutput\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0minput\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mmatmul\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mweight\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mt\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m\u001b[1;32m 1373\u001b[0m \u001b[0;32mif\u001b[0m \u001b[0mbias\u001b[0m \u001b[0;32mis\u001b[0m \u001b[0;32mnot\u001b[0m \u001b[0;32mNone\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 1374\u001b[0m \u001b[0moutput\u001b[0m \u001b[0;34m+=\u001b[0m \u001b[0mbias\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n", + "\u001b[0;31mKeyboardInterrupt\u001b[0m: " + ] + } + ], + "source": [ + " #def LOOP(data_dict, m, random_seed, use_wht_loss= True):\n", + "\n", + " m = 60\n", + " random_seed = 0\n", + " use_wht_loss= True\n", + " \n", + " number_of_epochs = 300\n", + " ro = 0.01 #0.05\n", + " \n", + " sampling_matrix1 = pickle.load(open('N13-m4-d5/sampling-matrix-1.p','rb'))\n", + " sampling_matrix2 = pickle.load(open('N13-m4-d5/sampling-matrix-2.p','rb'))\n", + " sampling_matrix3 = pickle.load(open('N13-m4-d5/sampling-matrix-3.p','rb'))\n", + " \n", + " delays_matrix1 = pickle.load(open('N13-m4-d5/delays-1.p','rb'))\n", + " delays_matrix2 = pickle.load(open('N13-m4-d5/delays-2.p','rb'))\n", + " delays_matrix3 = pickle.load(open('N13-m4-d5/delays-3.p','rb'))\n", + " \n", + " all_sampling_locations1 = pickle.load(open('N13-m4-d5/sampling-locations-1.p','rb'))\n", + " all_sampling_locations2 = pickle.load(open('N13-m4-d5/sampling-locations-2.p','rb'))\n", + " all_sampling_locations3 = pickle.load(open('N13-m4-d5/sampling-locations-3.p','rb'))\n", + "\n", + " '''\n", + " BEGIN: Compute WHT Basisand Set Up Regularization Loss Functions\n", + " '''\n", + "\n", + " n = 13 # input code size\n", + " batch_size = m # neural network batch size \n", + "\n", + " possible_support = generate_all_codes(n)\n", + " X_all = np.concatenate((np.vstack(all_sampling_locations1),np.vstack(all_sampling_locations2),np.vstack(all_sampling_locations3)))\n", + " X_all,X_all_inverse_ind = np.unique(X_all, axis=0, return_inverse='True')\n", + " M_all = make_system_simple(np.vstack(possible_support), X_all)\n", + " #M_all = np.transpose(M_all)\n", + " wht_mat = torch.tensor( M_all, dtype=torch.float)\n", + " l1_loss = torch.nn.L1Loss()\n", + " l2_loss = torch.nn.MSELoss()\n", + " num_coeffs = torch.tensor(len(X_all), dtype=torch.float)\n", + " reg_target = torch.zeros((batch_size, len(X_all)))\n", + " u = np.zeros(len(possible_support))\n", + " lam = np.zeros(len(X_all))\n", + "\n", + " # create a dataloader that loads all sequences in one batch\n", + " # this might need to be modified to operate in minibatches on GPU\n", + " wht_batch_size = wht_mat.shape[0]\n", + " wht_dataset = torch.utils.data.TensorDataset(torch.from_numpy(X_all).float())\n", + " wht_loader = torch.utils.data.DataLoader(wht_dataset, batch_size=wht_batch_size, shuffle=False)\n", + " \n", + "\n", + " '''\n", + " END: Compute WHT Basis and Set Up Regularization Loss Functions\n", + " '''\n", + "\n", + " random.seed(random_seed)\n", + " np.random.seed(random_seed)\n", + " torch.manual_seed(random_seed)\n", + " \n", + " X_super_set = np.zeros((2**n,n)).astype(int)\n", + " perm = np.random.permutation(2**n)\n", + " for i,ind in enumerate(perm):\n", + " X_super_set[ind] = dec_to_bin(i,n).astype(int)\n", + " \n", + " y_super_set = np.zeros(np.shape(X_super_set)[0])\n", + " for code_itr,code in enumerate(X_super_set):\n", + " seq = \"\".join(str(x) for x in code) \n", + " y_super_set[code_itr] = data_dict[seq]\n", + " \n", + " ## train data\n", + " X = X_super_set[0:m,:]\n", + " y = y_super_set[0:m]\n", + "\n", + " X_train_0 = deepcopy(X)\n", + " y_train_0 = deepcopy(y)\n", + " \n", + " # ## val data for model selection\n", + " X_val = X_super_set[-4000:-3000,:]\n", + " y_val = y_super_set[-4000:-3000]\n", + " \n", + " ## test data -- note that we will use this in the LOOP but it always stays as \"test\" \n", + " X_test = X_super_set[-3000:,:]\n", + " y_test = y_super_set[-3000:]\n", + "\n", + " net = Net(n=n, multiplier=10)\n", + " train = torch.utils.data.TensorDataset(torch.from_numpy(X).float(), torch.from_numpy(y).float())\n", + " train_loader = torch.utils.data.DataLoader(train, batch_size=batch_size, shuffle=True)\n", + "\n", + " ## MSE loss seems reasonable\n", + " criterion = nn.MSELoss(reduction='none')\n", + " #optimizer = optim.SGD(net.parameters(), lr=0.0001, momentum=0.9, nesterov=False)\n", + " optimizer = optim.Adam(net.parameters(), lr=0.01)\n", + "\n", + " loss_array = []\n", + " loop_id = 0\n", + " \n", + " r2_test_list = []\n", + " r2_train_list = []\n", + " r2_val_list = []\n", + " \n", + " \n", + " pr_test_list = []\n", + " pr_train_list = []\n", + " pr_val_list = []\n", + " \n", + "\n", + " ebar = tqdm(range(number_of_epochs))\n", + " for epoch in ebar: # loop over the dataset multiple times\n", + " #print(epoch)\n", + " running_loss = 0.0\n", + " batches = 0\n", + " for i, data in enumerate(train_loader, 0):\n", + "\n", + " # get the inputs; data is a list of [inputs, labels]\n", + " inputs, labels = data\n", + "\n", + " # zero the parameter gradients\n", + " optimizer.zero_grad()\n", + "\n", + " # forward + backward + optimize\n", + " outputs = net(inputs)\n", + " l1_regularization, l2_regularization = 0, 0\n", + " for param in net.parameters():\n", + " l1_regularization += torch.norm(param, 1)\n", + " l2_regularization += pow(torch.norm(param, 2),2)\n", + "\n", + " loss = criterion(outputs, labels.unsqueeze(1)) \n", + " loss = loss.mean() + 0.1 * l2_regularization ## use to be 0.1 * l2\n", + " for wht_batch, in wht_loader:\n", + " wht_out = net(wht_batch).reshape(-1)\n", + " #wht_coeffs = (1/torch.sqrt(num_coeffs))*F.linear(wht_out, wht_mat)\n", + " # we follow the sacled dual version of ADMM see page 17 of https://web.stanford.edu/~boyd/papers/pdf/admm_slides.pdf\n", + " #wht_diff = wht_out - (1/torch.sqrt(num_coeffs))*F.linear(torch.tensor(u, dtype=torch.float), wht_mat) + torch.tensor(lam, dtype=torch.float)\n", + " wht_diff = wht_out - F.linear(torch.tensor(u, dtype=torch.float), wht_mat) + torch.tensor(lam, dtype=torch.float)\n", + " loss_wht = ro/2 * l2_loss(wht_diff, reg_target)\n", + " loss += loss_wht\n", + " #print(loss_wht.item(), loss.item())\n", + " \n", + " loss.backward()\n", + " optimizer.step()\n", + " running_loss += loss.item()\n", + " batches += 1\n", + " epoch_loss = running_loss/batches\n", + " loss_array.append(epoch_loss)\n", + " \n", + " \n", + " ebar.set_description('loss={0:.2f}'.format(epoch_loss))\n", + " \n", + " net.eval()\n", + " \n", + " with torch.no_grad():\n", + " y_hat_all = net(torch.from_numpy(X_all).float())\n", + " y_hat_all = y_hat_all.numpy().flatten()\n", + " \n", + " \n", + " spright = SPRIGHT('frame', [1,2,3],sampling_matrix1,sampling_matrix2,sampling_matrix3,delays_matrix1,delays_matrix2,delays_matrix3,all_sampling_locations1,all_sampling_locations2,all_sampling_locations3)\n", + " spright.set_train_data(X_all, y_hat_all + lam, X_all_inverse_ind)\n", + " spright.model_to_remove = net\n", + " flag = spright.initial_run()\n", + " if not flag:\n", + " continue\n", + " spright.peel_rest()\n", + " \n", + " \n", + " spright_coef = np.zeros(2**13)\n", + " for sup,value in zip(spright.model.support,spright.model.coef_):\n", + " spright_coef[bool2int(sup[::-1])] = value\n", + " #print(sup[::-1])\n", + " #print(value)\n", + " #spright_coef[np.where(np.all(X_all==sup[::-1],axis=1))] = value\n", + " #print(np.where(np.all(X_all==sup[::-1],axis=1)))\n", + " \n", + " #u = spright_coef * np.sqrt(len(possible_support))\n", + " u = spright_coef\n", + " \n", + " del spright\n", + " \n", + "\n", + " #lam = lam + (np.dot(y_hat_all,M_all)/np.sqrt(len(possible_support)) - u)\n", + " #lam = lam + y_hat_all - np.dot(u,np.transpose(M_all)) / np.sqrt(len(possible_support))\n", + " lam = lam + y_hat_all - np.dot(u,np.transpose(M_all))\n", + " \n", + " \n", + " with torch.no_grad():\n", + " y_hat_train = net(torch.from_numpy(X).float())\n", + " y_hat_train = y_hat_train.numpy().flatten()\n", + " \n", + " with torch.no_grad():\n", + " y_hat_test = net(torch.from_numpy(X_test).float())\n", + " y_hat_test = y_hat_test.numpy().flatten()\n", + " \n", + " with torch.no_grad():\n", + " y_hat_val = net(torch.from_numpy(X_val).float())\n", + " y_hat_val = y_hat_val.numpy().flatten()\n", + " \n", + " r2_test_list.append(r2_score(y_test,y_hat_test))\n", + " r2_train_list.append(r2_score(y,y_hat_train))\n", + " r2_val_list.append(r2_score(y_val,y_hat_val))\n", + " \n", + " pr_test_list.append(pearsonr(y_test,y_hat_test)[0])\n", + " pr_train_list.append(pearsonr(y,y_hat_train)[0])\n", + " pr_val_list.append(pearsonr(y_val,y_hat_val)[0])\n", + " \n", + " net.train()\n", + " \n", + " print(r2_score(y_test,y_hat_test))\n", + " \n", + "\n", + " r2valind = np.argmax(r2_val_list)\n", + " prvalind = np.argmax(pr_val_list)\n", + " \n", + " \n", + " \n", + " print(r2_test_list[r2valind],r2_train_list[r2valind],pr_test_list[prvalind],pr_train_list[prvalind])\n", + "\n", + " #return r2_test_list[r2valind],r2_train_list[r2valind],pr_test_list[prvalind],pr_train_list[prvalind]\n", + "\n", + " \n" + ] + }, + { + "cell_type": "code", + "execution_count": 20, + "metadata": { + "scrolled": true + }, + "outputs": [ + { + "data": { + "application/vnd.jupyter.widget-view+json": { + "model_id": "43220445270d459ab0e2920c9858d65e", + "version_major": 2, + "version_minor": 0 + }, + "text/plain": [ + "HBox(children=(FloatProgress(value=0.0, max=300.0), HTML(value='')))" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "-2.8195084722406354\n", + "-2.4951363464122824\n", + "-1.9020603638179305\n", + "-1.406544419991639\n", + "-1.0392811702413982\n", + "-0.7767649210004506\n", + "-0.5834774552158943\n", + "-0.43860236549226395\n", + "-0.3274462897385291\n", + "-0.2458688984173898\n", + "-0.19044782768597734\n" + ] + }, + { + "ename": "KeyboardInterrupt", + "evalue": "", + "output_type": "error", + "traceback": [ + "\u001b[0;31m---------------------------------------------------------------------------\u001b[0m", + "\u001b[0;31mKeyboardInterrupt\u001b[0m Traceback (most recent call last)", + "\u001b[0;32m\u001b[0m in \u001b[0;36m\u001b[0;34m\u001b[0m\n\u001b[1;32m 131\u001b[0m \u001b[0;31m#print(loss_wht.item(), loss.item())\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 132\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m--> 133\u001b[0;31m \u001b[0mloss\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mbackward\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m\u001b[1;32m 134\u001b[0m \u001b[0moptimizer\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mstep\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 135\u001b[0m \u001b[0mrunning_loss\u001b[0m \u001b[0;34m+=\u001b[0m \u001b[0mloss\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mitem\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n", + "\u001b[0;32m/usr/local/lib/python3.7/site-packages/torch/tensor.py\u001b[0m in \u001b[0;36mbackward\u001b[0;34m(self, gradient, retain_graph, create_graph)\u001b[0m\n\u001b[1;32m 193\u001b[0m \u001b[0mproducts\u001b[0m\u001b[0;34m.\u001b[0m \u001b[0mDefaults\u001b[0m \u001b[0mto\u001b[0m\u001b[0;31m \u001b[0m\u001b[0;31m`\u001b[0m\u001b[0;31m`\u001b[0m\u001b[0;32mFalse\u001b[0m\u001b[0;31m`\u001b[0m\u001b[0;31m`\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 194\u001b[0m \"\"\"\n\u001b[0;32m--> 195\u001b[0;31m \u001b[0mtorch\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mautograd\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mbackward\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mself\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mgradient\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mretain_graph\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mcreate_graph\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m\u001b[1;32m 196\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 197\u001b[0m \u001b[0;32mdef\u001b[0m \u001b[0mregister_hook\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mself\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mhook\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n", + "\u001b[0;32m/usr/local/lib/python3.7/site-packages/torch/autograd/__init__.py\u001b[0m in \u001b[0;36mbackward\u001b[0;34m(tensors, grad_tensors, retain_graph, create_graph, grad_variables)\u001b[0m\n\u001b[1;32m 97\u001b[0m Variable._execution_engine.run_backward(\n\u001b[1;32m 98\u001b[0m \u001b[0mtensors\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mgrad_tensors\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mretain_graph\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mcreate_graph\u001b[0m\u001b[0;34m,\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m---> 99\u001b[0;31m allow_unreachable=True) # allow_unreachable flag\n\u001b[0m\u001b[1;32m 100\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 101\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n", + "\u001b[0;31mKeyboardInterrupt\u001b[0m: " + ] + } + ], + "source": [ + " #def LOOP(data_dict, m, random_seed, use_wht_loss= True):\n", + "\n", + " m = 60\n", + " random_seed = 0\n", + " use_wht_loss= True\n", + " \n", + " number_of_epochs = 300\n", + " ro = 0.01 #0.05\n", + " \n", + " sampling_matrix1 = pickle.load(open('N13-m4-d5/sampling-matrix-1.p','rb'))\n", + " sampling_matrix2 = pickle.load(open('N13-m4-d5/sampling-matrix-2.p','rb'))\n", + " sampling_matrix3 = pickle.load(open('N13-m4-d5/sampling-matrix-3.p','rb'))\n", + " \n", + " delays_matrix1 = pickle.load(open('N13-m4-d5/delays-1.p','rb'))\n", + " delays_matrix2 = pickle.load(open('N13-m4-d5/delays-2.p','rb'))\n", + " delays_matrix3 = pickle.load(open('N13-m4-d5/delays-3.p','rb'))\n", + " \n", + " all_sampling_locations1 = pickle.load(open('N13-m4-d5/sampling-locations-1.p','rb'))\n", + " all_sampling_locations2 = pickle.load(open('N13-m4-d5/sampling-locations-2.p','rb'))\n", + " all_sampling_locations3 = pickle.load(open('N13-m4-d5/sampling-locations-3.p','rb'))\n", + "\n", + " '''\n", + " BEGIN: Compute WHT Basisand Set Up Regularization Loss Functions\n", + " '''\n", + "\n", + " n = 13 # input code size\n", + " batch_size = m # neural network batch size \n", + "\n", + " X_all = np.concatenate((np.vstack(all_sampling_locations1),np.vstack(all_sampling_locations2),np.vstack(all_sampling_locations3)))\n", + " X_all,X_all_inverse_ind = np.unique(X_all, axis=0, return_inverse='True')\n", + " l1_loss = torch.nn.L1Loss()\n", + " l2_loss = torch.nn.MSELoss()\n", + " num_coeffs = torch.tensor(len(X_all), dtype=torch.float)\n", + " reg_target = torch.zeros(len(X_all)) #batch_size\n", + " Hu = np.zeros(len(X_all))\n", + " lam = np.zeros(len(X_all))\n", + "\n", + " # create a dataloader that loads all sequences in one batch\n", + " # this might need to be modified to operate in minibatches on GPU\n", + " wht_batch_size = len(X_all)\n", + " wht_dataset = torch.utils.data.TensorDataset(torch.from_numpy(X_all).float())\n", + " wht_loader = torch.utils.data.DataLoader(wht_dataset, batch_size=wht_batch_size, shuffle=False)\n", + " \n", + "\n", + " '''\n", + " END: Compute WHT Basis and Set Up Regularization Loss Functions\n", + " '''\n", + "\n", + " random.seed(random_seed)\n", + " np.random.seed(random_seed)\n", + " torch.manual_seed(random_seed)\n", + " \n", + " X_super_set = np.zeros((2**n,n)).astype(int)\n", + " perm = np.random.permutation(2**n)\n", + " for i,ind in enumerate(perm):\n", + " X_super_set[ind] = dec_to_bin(i,n).astype(int)\n", + " \n", + " y_super_set = np.zeros(np.shape(X_super_set)[0])\n", + " for code_itr,code in enumerate(X_super_set):\n", + " seq = \"\".join(str(x) for x in code) \n", + " y_super_set[code_itr] = data_dict[seq]\n", + " \n", + " ## train data\n", + " X = X_super_set[0:m,:]\n", + " y = y_super_set[0:m]\n", + "\n", + " X_train_0 = deepcopy(X)\n", + " y_train_0 = deepcopy(y)\n", + " \n", + " # ## val data for model selection\n", + " X_val = X_super_set[-4000:-3000,:]\n", + " y_val = y_super_set[-4000:-3000]\n", + " \n", + " ## test data -- note that we will use this in the LOOP but it always stays as \"test\" \n", + " X_test = X_super_set[-3000:,:]\n", + " y_test = y_super_set[-3000:]\n", + "\n", + " net = Net(n=n, multiplier=10)\n", + " train = torch.utils.data.TensorDataset(torch.from_numpy(X).float(), torch.from_numpy(y).float())\n", + " train_loader = torch.utils.data.DataLoader(train, batch_size=batch_size, shuffle=True)\n", + "\n", + " ## MSE loss seems reasonable\n", + " criterion = nn.MSELoss(reduction='none')\n", + " #optimizer = optim.SGD(net.parameters(), lr=0.0001, momentum=0.9, nesterov=False)\n", + " optimizer = optim.Adam(net.parameters(), lr=0.01)\n", + "\n", + " loss_array = []\n", + " loop_id = 0\n", + " \n", + " r2_test_list = []\n", + " r2_train_list = []\n", + " r2_val_list = []\n", + " \n", + " \n", + " pr_test_list = []\n", + " pr_train_list = []\n", + " pr_val_list = []\n", + " \n", + "\n", + " ebar = tqdm(range(number_of_epochs))\n", + " for epoch in ebar: # loop over the dataset multiple times\n", + " #print(epoch)\n", + " running_loss = 0.0\n", + " batches = 0\n", + " for i, data in enumerate(train_loader, 0):\n", + "\n", + " # get the inputs; data is a list of [inputs, labels]\n", + " inputs, labels = data\n", + "\n", + " # zero the parameter gradients\n", + " optimizer.zero_grad()\n", + "\n", + " # forward + backward + optimize\n", + " outputs = net(inputs)\n", + " l1_regularization, l2_regularization = 0, 0\n", + " for param in net.parameters():\n", + " l1_regularization += torch.norm(param, 1)\n", + " l2_regularization += pow(torch.norm(param, 2),2)\n", + "\n", + " loss = criterion(outputs, labels.unsqueeze(1)) \n", + " loss = loss.mean() + 0.1 * l2_regularization ## use to be 0.1 * l2\n", + " for wht_batch, in wht_loader:\n", + " wht_out = net(wht_batch).reshape(-1)\n", + " #wht_coeffs = (1/torch.sqrt(num_coeffs))*F.linear(wht_out, wht_mat)\n", + " # we follow the sacled dual version of ADMM see page 17 of https://web.stanford.edu/~boyd/papers/pdf/admm_slides.pdf\n", + " #wht_diff = wht_out - (1/torch.sqrt(num_coeffs))*F.linear(torch.tensor(u, dtype=torch.float), wht_mat) + torch.tensor(lam, dtype=torch.float)\n", + " #wht_diff = wht_out - F.linear(torch.tensor(u, dtype=torch.float), wht_mat) + torch.tensor(lam, dtype=torch.float)\n", + " wht_diff = wht_out - torch.tensor(Hu, dtype=torch.float) + torch.tensor(lam, dtype=torch.float)\n", + " loss_wht = ro/2 * l2_loss(wht_diff, reg_target)\n", + " loss += loss_wht\n", + " #print(loss_wht.item(), loss.item())\n", + " \n", + " loss.backward()\n", + " optimizer.step()\n", + " running_loss += loss.item()\n", + " batches += 1\n", + " epoch_loss = running_loss/batches\n", + " loss_array.append(epoch_loss)\n", + " \n", + " \n", + " ebar.set_description('loss={0:.2f}'.format(epoch_loss))\n", + " \n", + " net.eval()\n", + " \n", + " with torch.no_grad():\n", + " y_hat_all = net(torch.from_numpy(X_all).float())\n", + " y_hat_all = y_hat_all.numpy().flatten()\n", + " \n", + " \n", + " spright = SPRIGHT('frame', [1,2,3],sampling_matrix1,sampling_matrix2,sampling_matrix3,delays_matrix1,delays_matrix2,delays_matrix3,all_sampling_locations1,all_sampling_locations2,all_sampling_locations3)\n", + " spright.set_train_data(X_all, y_hat_all + lam, X_all_inverse_ind)\n", + " spright.model_to_remove = net\n", + " flag = spright.initial_run()\n", + " if not flag:\n", + " continue\n", + " spright.peel_rest()\n", + " \n", + " M = make_system_simple(np.vstack(spright.model.support), X_all)\n", + " Hu = np.dot(M,spright.model.coef_)\n", + " lam = lam + y_hat_all - Hu\n", + " \n", + " with torch.no_grad():\n", + " y_hat_train = net(torch.from_numpy(X).float())\n", + " y_hat_train = y_hat_train.numpy().flatten()\n", + " \n", + " with torch.no_grad():\n", + " y_hat_test = net(torch.from_numpy(X_test).float())\n", + " y_hat_test = y_hat_test.numpy().flatten()\n", + " \n", + " with torch.no_grad():\n", + " y_hat_val = net(torch.from_numpy(X_val).float())\n", + " y_hat_val = y_hat_val.numpy().flatten()\n", + " \n", + " r2_test_list.append(r2_score(y_test,y_hat_test))\n", + " r2_train_list.append(r2_score(y,y_hat_train))\n", + " r2_val_list.append(r2_score(y_val,y_hat_val))\n", + " \n", + " pr_test_list.append(pearsonr(y_test,y_hat_test)[0])\n", + " pr_train_list.append(pearsonr(y,y_hat_train)[0])\n", + " pr_val_list.append(pearsonr(y_val,y_hat_val)[0])\n", + " \n", + " net.train()\n", + " \n", + " print(r2_score(y_test,y_hat_test))\n", + " \n", + "\n", + " r2valind = np.argmax(r2_val_list)\n", + " prvalind = np.argmax(pr_val_list)\n", + " \n", + " \n", + " \n", + " print(r2_test_list[r2valind],r2_train_list[r2valind],pr_test_list[prvalind],pr_train_list[prvalind])\n", + "\n", + " #return r2_test_list[r2valind],r2_train_list[r2valind],pr_test_list[prvalind],pr_train_list[prvalind]" + ] + }, + { + "cell_type": "code", + "execution_count": 31, + "metadata": {}, + "outputs": [], + "source": [ + "del spright" + ] + }, + { + "cell_type": "code", + "execution_count": 32, + "metadata": {}, + "outputs": [], + "source": [ + "spright = SPRIGHT('frame', [1,2,3],sampling_matrix1,sampling_matrix2,sampling_matrix3,delays_matrix1,delays_matrix2,delays_matrix3,all_sampling_locations1,all_sampling_locations2,all_sampling_locations3)" + ] + }, + { + "cell_type": "code", + "execution_count": 33, + "metadata": {}, + "outputs": [ + { + "ename": "AttributeError", + "evalue": "'SPRIGHT' object has no attribute 'model'", + "output_type": "error", + "traceback": [ + "\u001b[0;31m---------------------------------------------------------------------------\u001b[0m", + "\u001b[0;31mAttributeError\u001b[0m Traceback (most recent call last)", + "\u001b[0;32m\u001b[0m in \u001b[0;36m\u001b[0;34m\u001b[0m\n\u001b[0;32m----> 1\u001b[0;31m \u001b[0mspright\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mmodel\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0msupport\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m", + "\u001b[0;31mAttributeError\u001b[0m: 'SPRIGHT' object has no attribute 'model'" + ] + } + ], + "source": [ + "spright.model.support" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [] + }, + { + "cell_type": "code", + "execution_count": 32, + "metadata": { + "scrolled": true + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "m 20\n", + "repeat 0\n" + ] + }, + { + "data": { + "application/vnd.jupyter.widget-view+json": { + "model_id": "dab65e757b4043e88b463dbfeef31814", + "version_major": 2, + "version_minor": 0 + }, + "text/plain": [ + "HBox(children=(FloatProgress(value=0.0, max=300.0), HTML(value='')))" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "\n", + "0.27310280537855314 0.8149272857953622\n", + "repeat 1\n" + ] + }, + { + "data": { + "application/vnd.jupyter.widget-view+json": { + "model_id": "4361794ac2964f4db7845556d2a2d3de", + "version_major": 2, + "version_minor": 0 + }, + "text/plain": [ + "HBox(children=(FloatProgress(value=0.0, max=300.0), HTML(value='')))" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "\n", + "-0.037212651267418684 0.4546045685122847\n", + "repeat 2\n" + ] + }, + { + "data": { + "application/vnd.jupyter.widget-view+json": { + "model_id": "b9a95dcec1f94f68a9fb876414a0a5a3", + "version_major": 2, + "version_minor": 0 + }, + "text/plain": [ + "HBox(children=(FloatProgress(value=0.0, max=300.0), HTML(value='')))" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "\n", + "0.044176275881697036 0.5411357231515233\n", + "repeat 3\n" + ] + }, + { + "data": { + "application/vnd.jupyter.widget-view+json": { + "model_id": "1565ac547ad347e1a72b709c49c6f0f5", + "version_major": 2, + "version_minor": 0 + }, + "text/plain": [ + "HBox(children=(FloatProgress(value=0.0, max=300.0), HTML(value='')))" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "\n", + "0.07843527609890577 0.45949447083108064\n", + "repeat 4\n" + ] + }, + { + "data": { + "application/vnd.jupyter.widget-view+json": { + "model_id": "d0d6dcb7b8cb43c48b310f0e9c1365ab", + "version_major": 2, + "version_minor": 0 + }, + "text/plain": [ + "HBox(children=(FloatProgress(value=0.0, max=300.0), HTML(value='')))" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "\n", + "0.08026186554569714 0.4413286446085144\n", + "repeat 5\n" + ] + }, + { + "data": { + "application/vnd.jupyter.widget-view+json": { + "model_id": "92d6842c79224388852ee96b6336d20c", + "version_major": 2, + "version_minor": 0 + }, + "text/plain": [ + "HBox(children=(FloatProgress(value=0.0, max=300.0), HTML(value='')))" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "\n", + "0.015303735998286272 0.25175665000022596\n", + "repeat 6\n" + ] + }, + { + "data": { + "application/vnd.jupyter.widget-view+json": { + "model_id": "0d2acbd53e0f400eb2ce8c4dcf5e5e4a", + "version_major": 2, + "version_minor": 0 + }, + "text/plain": [ + "HBox(children=(FloatProgress(value=0.0, max=300.0), HTML(value='')))" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "\n", + "0.164468714045508 0.6882993433198398\n", + "repeat 7\n" + ] + }, + { + "data": { + "application/vnd.jupyter.widget-view+json": { + "model_id": "b509d16a38f441978627847dd087ada2", + "version_major": 2, + "version_minor": 0 + }, + "text/plain": [ + "HBox(children=(FloatProgress(value=0.0, max=300.0), HTML(value='')))" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "\n", + "-0.014027636233489016 0.6814103272909032\n", + "repeat 8\n" + ] + }, + { + "data": { + "application/vnd.jupyter.widget-view+json": { + "model_id": "c95b350a9208412f94bcf13155bf7922", + "version_major": 2, + "version_minor": 0 + }, + "text/plain": [ + "HBox(children=(FloatProgress(value=0.0, max=300.0), HTML(value='')))" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "\n", + "-0.040981721597289855 0.5788304318679116\n", + "repeat 9\n" + ] + }, + { + "data": { + "application/vnd.jupyter.widget-view+json": { + "model_id": "4cc9ce06b8b24cbc9abdc8406bc7bee8", + "version_major": 2, + "version_minor": 0 + }, + "text/plain": [ + "HBox(children=(FloatProgress(value=0.0, max=300.0), HTML(value='')))" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "\n", + "0.03678818036895615 0.08823398104494184\n", + "repeat 10\n" + ] + }, + { + "data": { + "application/vnd.jupyter.widget-view+json": { + "model_id": "cdc36a07b64f42269400e8357c1fb4bc", + "version_major": 2, + "version_minor": 0 + }, + "text/plain": [ + "HBox(children=(FloatProgress(value=0.0, max=300.0), HTML(value='')))" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "\n", + "0.2090887298894597 0.5331692877540177\n", + "repeat 11\n" + ] + }, + { + "data": { + "application/vnd.jupyter.widget-view+json": { + "model_id": "3796cc51108f4b439c9735bcee8ab517", + "version_major": 2, + "version_minor": 0 + }, + "text/plain": [ + "HBox(children=(FloatProgress(value=0.0, max=300.0), HTML(value='')))" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "\n", + "0.07150025606034316 0.6219522021693028\n", + "repeat 12\n" + ] + }, + { + "data": { + "application/vnd.jupyter.widget-view+json": { + "model_id": "7a3cd99627374cc4b3fc5ec9e0ee329a", + "version_major": 2, + "version_minor": 0 + }, + "text/plain": [ + "HBox(children=(FloatProgress(value=0.0, max=300.0), HTML(value='')))" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "\n", + "0.07027958149114899 0.7245423119603623\n", + "repeat 13\n" + ] + }, + { + "data": { + "application/vnd.jupyter.widget-view+json": { + "model_id": "07a605abc99647bd96a564f1ddbb01f2", + "version_major": 2, + "version_minor": 0 + }, + "text/plain": [ + "HBox(children=(FloatProgress(value=0.0, max=300.0), HTML(value='')))" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "\n", + "-0.0011685926299020988 0.8760892695254487\n", + "repeat 14\n" + ] + }, + { + "data": { + "application/vnd.jupyter.widget-view+json": { + "model_id": "e04915dfcbc84918b7a65165dae22fca", + "version_major": 2, + "version_minor": 0 + }, + "text/plain": [ + "HBox(children=(FloatProgress(value=0.0, max=300.0), HTML(value='')))" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "\n", + "0.0634315450744346 0.6567562649242057\n", + "repeat 15\n" + ] + }, + { + "data": { + "application/vnd.jupyter.widget-view+json": { + "model_id": "f34bfb53530c4bb0a4b33b52e72d649a", + "version_major": 2, + "version_minor": 0 + }, + "text/plain": [ + "HBox(children=(FloatProgress(value=0.0, max=300.0), HTML(value='')))" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "\n", + "-0.12046729571355352 0.18734810967483473\n", + "repeat 16\n" + ] + }, + { + "data": { + "application/vnd.jupyter.widget-view+json": { + "model_id": "8b50667408c148af99c7093f5384ce8a", + "version_major": 2, + "version_minor": 0 + }, + "text/plain": [ + "HBox(children=(FloatProgress(value=0.0, max=300.0), HTML(value='')))" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "\n", + "0.013106809936688002 0.5457012742674807\n", + "repeat 17\n" + ] + }, + { + "data": { + "application/vnd.jupyter.widget-view+json": { + "model_id": "049ce887e9f24b7892a053f6eb121289", + "version_major": 2, + "version_minor": 0 + }, + "text/plain": [ + "HBox(children=(FloatProgress(value=0.0, max=300.0), HTML(value='')))" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "\n", + "-0.016180761892889972 0.5543398506147972\n", + "repeat 18\n" + ] + }, + { + "data": { + "application/vnd.jupyter.widget-view+json": { + "model_id": "61c9c11c579e4858be2b7e74985f3456", + "version_major": 2, + "version_minor": 0 + }, + "text/plain": [ + "HBox(children=(FloatProgress(value=0.0, max=300.0), HTML(value='')))" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "\n", + "-0.006961932980141583 0.19840356083987798\n", + "repeat 19\n" + ] + }, + { + "data": { + "application/vnd.jupyter.widget-view+json": { + "model_id": "e4deef025b104883b312c4a8424ae973", + "version_major": 2, + "version_minor": 0 + }, + "text/plain": [ + "HBox(children=(FloatProgress(value=0.0, max=300.0), HTML(value='')))" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "\n", + "0.1520683168110991 0.49841943456908144\n", + "m 40\n", + "repeat 0\n" + ] + }, + { + "data": { + "application/vnd.jupyter.widget-view+json": { + "model_id": "c8d177e6cf74474ea3d48363309b1281", + "version_major": 2, + "version_minor": 0 + }, + "text/plain": [ + "HBox(children=(FloatProgress(value=0.0, max=300.0), HTML(value='')))" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "\n", + "0.5040426812184424 0.7198412121976232\n", + "repeat 1\n" + ] + }, + { + "data": { + "application/vnd.jupyter.widget-view+json": { + "model_id": "f0e7dc05188c4c22868423c78f5aa606", + "version_major": 2, + "version_minor": 0 + }, + "text/plain": [ + "HBox(children=(FloatProgress(value=0.0, max=300.0), HTML(value='')))" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "\n", + "0.1281450389705453 0.713420513378513\n", + "repeat 2\n" + ] + }, + { + "data": { + "application/vnd.jupyter.widget-view+json": { + "model_id": "7250f056e89a4105924892a1aee3f742", + "version_major": 2, + "version_minor": 0 + }, + "text/plain": [ + "HBox(children=(FloatProgress(value=0.0, max=300.0), HTML(value='')))" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "\n", + "0.22840046154668547 0.6525423618115984\n", + "repeat 3\n" + ] + }, + { + "data": { + "application/vnd.jupyter.widget-view+json": { + "model_id": "cf03935cac9e473d929bc4c8b8495c8f", + "version_major": 2, + "version_minor": 0 + }, + "text/plain": [ + "HBox(children=(FloatProgress(value=0.0, max=300.0), HTML(value='')))" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "\n", + "0.18570566041315328 0.38237540221932964\n", + "repeat 4\n" + ] + }, + { + "data": { + "application/vnd.jupyter.widget-view+json": { + "model_id": "3c914852d1444e0f80e34269a378e0fe", + "version_major": 2, + "version_minor": 0 + }, + "text/plain": [ + "HBox(children=(FloatProgress(value=0.0, max=300.0), HTML(value='')))" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "\n", + "0.10846935639675559 0.8221370815711825\n", + "repeat 5\n" + ] + }, + { + "data": { + "application/vnd.jupyter.widget-view+json": { + "model_id": "c0e219c3fae54c138ce15fb99448f8ae", + "version_major": 2, + "version_minor": 0 + }, + "text/plain": [ + "HBox(children=(FloatProgress(value=0.0, max=300.0), HTML(value='')))" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "\n", + "0.2600599866596963 0.9527469677724432\n", + "repeat 6\n" + ] + }, + { + "data": { + "application/vnd.jupyter.widget-view+json": { + "model_id": "91b51604a8f448f7bb12933b99c1f6b4", + "version_major": 2, + "version_minor": 0 + }, + "text/plain": [ + "HBox(children=(FloatProgress(value=0.0, max=300.0), HTML(value='')))" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "\n", + "0.4417889789736469 0.6945108909918238\n", + "repeat 7\n" + ] + }, + { + "data": { + "application/vnd.jupyter.widget-view+json": { + "model_id": "2861c0bcad20439c8e833e6dcc97b5f0", + "version_major": 2, + "version_minor": 0 + }, + "text/plain": [ + "HBox(children=(FloatProgress(value=0.0, max=300.0), HTML(value='')))" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "\n", + "0.08327832678115243 0.8402158787070233\n", + "repeat 8\n" + ] + }, + { + "data": { + "application/vnd.jupyter.widget-view+json": { + "model_id": "81115392aba642e099d24317b0bf21a8", + "version_major": 2, + "version_minor": 0 + }, + "text/plain": [ + "HBox(children=(FloatProgress(value=0.0, max=300.0), HTML(value='')))" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "\n", + "0.32831472910926385 0.5408655975259051\n", + "repeat 9\n" + ] + }, + { + "data": { + "application/vnd.jupyter.widget-view+json": { + "model_id": "d61faff601034741addc518ab9783d91", + "version_major": 2, + "version_minor": 0 + }, + "text/plain": [ + "HBox(children=(FloatProgress(value=0.0, max=300.0), HTML(value='')))" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "\n", + "0.3450967553113977 0.4231303129043844\n", + "repeat 10\n" + ] + }, + { + "data": { + "application/vnd.jupyter.widget-view+json": { + "model_id": "06202a0706a44a69966a2f20447a8d92", + "version_major": 2, + "version_minor": 0 + }, + "text/plain": [ + "HBox(children=(FloatProgress(value=0.0, max=300.0), HTML(value='')))" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "\n", + "0.3238921573656749 0.4372007458649374\n", + "repeat 11\n" + ] + }, + { + "data": { + "application/vnd.jupyter.widget-view+json": { + "model_id": "ca8bf6d780094da684e12c2a0e4050e6", + "version_major": 2, + "version_minor": 0 + }, + "text/plain": [ + "HBox(children=(FloatProgress(value=0.0, max=300.0), HTML(value='')))" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "\n", + "0.5056483047506486 0.8940966405364814\n", + "repeat 12\n" + ] + }, + { + "data": { + "application/vnd.jupyter.widget-view+json": { + "model_id": "57719e2c247a4def876d6c7d3e2ffb5d", + "version_major": 2, + "version_minor": 0 + }, + "text/plain": [ + "HBox(children=(FloatProgress(value=0.0, max=300.0), HTML(value='')))" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "\n", + "0.31628221340459406 0.7639343629757451\n", + "repeat 13\n" + ] + }, + { + "data": { + "application/vnd.jupyter.widget-view+json": { + "model_id": "4c2c803bc4ec4de7a701db88d6399416", + "version_major": 2, + "version_minor": 0 + }, + "text/plain": [ + "HBox(children=(FloatProgress(value=0.0, max=300.0), HTML(value='')))" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "\n", + "-0.0025319800341299104 0.7247224367993327\n", + "repeat 14\n" + ] + }, + { + "data": { + "application/vnd.jupyter.widget-view+json": { + "model_id": "1e426510dbb2499fb1b3000409a6a149", + "version_major": 2, + "version_minor": 0 + }, + "text/plain": [ + "HBox(children=(FloatProgress(value=0.0, max=300.0), HTML(value='')))" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "\n", + "0.40636499740894516 0.8783171014903126\n", + "repeat 15\n" + ] + }, + { + "data": { + "application/vnd.jupyter.widget-view+json": { + "model_id": "1696d72171484ab484141f4686c6a103", + "version_major": 2, + "version_minor": 0 + }, + "text/plain": [ + "HBox(children=(FloatProgress(value=0.0, max=300.0), HTML(value='')))" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "\n", + "0.5003944244295815 0.9547921578439702\n", + "repeat 16\n" + ] + }, + { + "data": { + "application/vnd.jupyter.widget-view+json": { + "model_id": "0a5a35b7eb1b4fb0bc731b182c37c511", + "version_major": 2, + "version_minor": 0 + }, + "text/plain": [ + "HBox(children=(FloatProgress(value=0.0, max=300.0), HTML(value='')))" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "\n", + "0.4049412909373121 0.8366997273699117\n", + "repeat 17\n" + ] + }, + { + "data": { + "application/vnd.jupyter.widget-view+json": { + "model_id": "6786c0c9e7ea4b2fab4388973ecf4928", + "version_major": 2, + "version_minor": 0 + }, + "text/plain": [ + "HBox(children=(FloatProgress(value=0.0, max=300.0), HTML(value='')))" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "\n", + "0.17031883215758914 0.3955385842097976\n", + "repeat 18\n" + ] + }, + { + "data": { + "application/vnd.jupyter.widget-view+json": { + "model_id": "68512d7036394d149064d1424f55caf5", + "version_major": 2, + "version_minor": 0 + }, + "text/plain": [ + "HBox(children=(FloatProgress(value=0.0, max=300.0), HTML(value='')))" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "\n", + "0.4806434102037799 0.8180732922422022\n", + "repeat 19\n" + ] + }, + { + "data": { + "application/vnd.jupyter.widget-view+json": { + "model_id": "004cc7416e624a9d843cfdd174585a68", + "version_major": 2, + "version_minor": 0 + }, + "text/plain": [ + "HBox(children=(FloatProgress(value=0.0, max=300.0), HTML(value='')))" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "\n", + "0.4028699032116867 0.5192208084708183\n", + "m 60\n", + "repeat 0\n" + ] + }, + { + "data": { + "application/vnd.jupyter.widget-view+json": { + "model_id": "65bcdc59271e4c7cb2a85335e7bcaa14", + "version_major": 2, + "version_minor": 0 + }, + "text/plain": [ + "HBox(children=(FloatProgress(value=0.0, max=300.0), HTML(value='')))" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "\n", + "0.7629576703643002 0.9335136209401549\n", + "repeat 1\n" + ] + }, + { + "data": { + "application/vnd.jupyter.widget-view+json": { + "model_id": "f1fe28a218f34d98a496db4806862beb", + "version_major": 2, + "version_minor": 0 + }, + "text/plain": [ + "HBox(children=(FloatProgress(value=0.0, max=300.0), HTML(value='')))" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "\n", + "0.56841718554489 0.745148967950318\n", + "repeat 2\n" + ] + }, + { + "data": { + "application/vnd.jupyter.widget-view+json": { + "model_id": "06394b5c4154474c8f0328c406c6913b", + "version_major": 2, + "version_minor": 0 + }, + "text/plain": [ + "HBox(children=(FloatProgress(value=0.0, max=300.0), HTML(value='')))" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "\n", + "0.6713239498610146 0.8293635906865675\n", + "repeat 3\n" + ] + }, + { + "data": { + "application/vnd.jupyter.widget-view+json": { + "model_id": "0f5b009d22834924850e44f8446e669f", + "version_major": 2, + "version_minor": 0 + }, + "text/plain": [ + "HBox(children=(FloatProgress(value=0.0, max=300.0), HTML(value='')))" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "\n", + "0.6613959911951219 0.8191314000877181\n", + "repeat 4\n" + ] + }, + { + "data": { + "application/vnd.jupyter.widget-view+json": { + "model_id": "73cafa84bb0c46fa983d44daf7346877", + "version_major": 2, + "version_minor": 0 + }, + "text/plain": [ + "HBox(children=(FloatProgress(value=0.0, max=300.0), HTML(value='')))" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "\n", + "0.634968642561438 0.9447852726713787\n", + "repeat 5\n" + ] + }, + { + "data": { + "application/vnd.jupyter.widget-view+json": { + "model_id": "39b4a29327c14ab08017d035dd7f7f22", + "version_major": 2, + "version_minor": 0 + }, + "text/plain": [ + "HBox(children=(FloatProgress(value=0.0, max=300.0), HTML(value='')))" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "\n", + "0.5720239076655378 0.8605064572152448\n", + "repeat 6\n" + ] + }, + { + "data": { + "application/vnd.jupyter.widget-view+json": { + "model_id": "84bea99ffb08495ba5ba2c03a9752466", + "version_major": 2, + "version_minor": 0 + }, + "text/plain": [ + "HBox(children=(FloatProgress(value=0.0, max=300.0), HTML(value='')))" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "\n", + "0.764485387109982 0.8966887418726603\n", + "repeat 7\n" + ] + }, + { + "data": { + "application/vnd.jupyter.widget-view+json": { + "model_id": "c892bc923aab42c7bcff2e41ac2c45f0", + "version_major": 2, + "version_minor": 0 + }, + "text/plain": [ + "HBox(children=(FloatProgress(value=0.0, max=300.0), HTML(value='')))" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "\n", + "0.10968679669918924 0.6676780376297454\n", + "repeat 8\n" + ] + }, + { + "data": { + "application/vnd.jupyter.widget-view+json": { + "model_id": "48202f690ebc4181a3b4f00d18b4cd73", + "version_major": 2, + "version_minor": 0 + }, + "text/plain": [ + "HBox(children=(FloatProgress(value=0.0, max=300.0), HTML(value='')))" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "\n", + "0.6349531674105535 0.862642225915854\n", + "repeat 9\n" + ] + }, + { + "data": { + "application/vnd.jupyter.widget-view+json": { + "model_id": "6e219e2a114c42df910d09de5f329472", + "version_major": 2, + "version_minor": 0 + }, + "text/plain": [ + "HBox(children=(FloatProgress(value=0.0, max=300.0), HTML(value='')))" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "\n", + "0.500173626576831 0.7521141527872085\n", + "repeat 10\n" + ] + }, + { + "data": { + "application/vnd.jupyter.widget-view+json": { + "model_id": "65e8942792d34bc38a987e3139029eb8", + "version_major": 2, + "version_minor": 0 + }, + "text/plain": [ + "HBox(children=(FloatProgress(value=0.0, max=300.0), HTML(value='')))" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "\n", + "0.5080593581482495 0.7442508886999044\n", + "repeat 11\n" + ] + }, + { + "data": { + "application/vnd.jupyter.widget-view+json": { + "model_id": "4231bbba128f413ba82f7b2cd4b6875c", + "version_major": 2, + "version_minor": 0 + }, + "text/plain": [ + "HBox(children=(FloatProgress(value=0.0, max=300.0), HTML(value='')))" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "\n", + "0.38967986174650326 0.7733126449700373\n", + "repeat 12\n" + ] + }, + { + "data": { + "application/vnd.jupyter.widget-view+json": { + "model_id": "d8de5be768f94137b3182ac048aa2ced", + "version_major": 2, + "version_minor": 0 + }, + "text/plain": [ + "HBox(children=(FloatProgress(value=0.0, max=300.0), HTML(value='')))" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "\n", + "0.5126307806486355 0.8224184438513921\n", + "repeat 13\n" + ] + }, + { + "data": { + "application/vnd.jupyter.widget-view+json": { + "model_id": "a96bb9dbd1344796a3f0369da2a3a5e8", + "version_major": 2, + "version_minor": 0 + }, + "text/plain": [ + "HBox(children=(FloatProgress(value=0.0, max=300.0), HTML(value='')))" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "\n", + "0.6453165106079144 0.7848105332436983\n", + "repeat 14\n" + ] + }, + { + "data": { + "application/vnd.jupyter.widget-view+json": { + "model_id": "4f3a4b400fd844d5ab2086ca757b780a", + "version_major": 2, + "version_minor": 0 + }, + "text/plain": [ + "HBox(children=(FloatProgress(value=0.0, max=300.0), HTML(value='')))" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "\n", + "0.42542288705188613 0.8581180976201905\n", + "repeat 15\n" + ] + }, + { + "data": { + "application/vnd.jupyter.widget-view+json": { + "model_id": "8ffbb986ea664740adb77307d066266d", + "version_major": 2, + "version_minor": 0 + }, + "text/plain": [ + "HBox(children=(FloatProgress(value=0.0, max=300.0), HTML(value='')))" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "\n", + "0.6257889430092027 0.8793120224440453\n", + "repeat 16\n" + ] + }, + { + "data": { + "application/vnd.jupyter.widget-view+json": { + "model_id": "746c6e1d11ea43b1a170ba1035b4a290", + "version_major": 2, + "version_minor": 0 + }, + "text/plain": [ + "HBox(children=(FloatProgress(value=0.0, max=300.0), HTML(value='')))" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "\n", + "0.359960795087234 0.6860229540610434\n", + "repeat 17\n" + ] + }, + { + "data": { + "application/vnd.jupyter.widget-view+json": { + "model_id": "1eb0f25ed6654bad9671e7ca96a4cedb", + "version_major": 2, + "version_minor": 0 + }, + "text/plain": [ + "HBox(children=(FloatProgress(value=0.0, max=300.0), HTML(value='')))" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "\n", + "0.5700765963944356 0.7789103648267421\n", + "repeat 18\n" + ] + }, + { + "data": { + "application/vnd.jupyter.widget-view+json": { + "model_id": "47f8b8a0f89445ec9c8851956d129e69", + "version_major": 2, + "version_minor": 0 + }, + "text/plain": [ + "HBox(children=(FloatProgress(value=0.0, max=300.0), HTML(value='')))" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "\n", + "0.6842908586098848 0.8158460762154045\n", + "repeat 19\n" + ] + }, + { + "data": { + "application/vnd.jupyter.widget-view+json": { + "model_id": "9ac05196120a43668caa925d1118818c", + "version_major": 2, + "version_minor": 0 + }, + "text/plain": [ + "HBox(children=(FloatProgress(value=0.0, max=300.0), HTML(value='')))" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "\n", + "0.7139546478422236 0.9217585660645575\n", + "m 80\n", + "repeat 0\n" + ] + }, + { + "data": { + "application/vnd.jupyter.widget-view+json": { + "model_id": "6b5609313add46db8de10eaa6ec3f4fb", + "version_major": 2, + "version_minor": 0 + }, + "text/plain": [ + "HBox(children=(FloatProgress(value=0.0, max=300.0), HTML(value='')))" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "\n", + "0.5929987367957006 0.8940352720298266\n", + "repeat 1\n" + ] + }, + { + "data": { + "application/vnd.jupyter.widget-view+json": { + "model_id": "dfdd5a15ab2147439725d9a49617a6b5", + "version_major": 2, + "version_minor": 0 + }, + "text/plain": [ + "HBox(children=(FloatProgress(value=0.0, max=300.0), HTML(value='')))" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "\n", + "0.7847004431174569 0.965328867289478\n", + "repeat 2\n" + ] + }, + { + "data": { + "application/vnd.jupyter.widget-view+json": { + "model_id": "7a0819c371f044588e17b8c68667d904", + "version_major": 2, + "version_minor": 0 + }, + "text/plain": [ + "HBox(children=(FloatProgress(value=0.0, max=300.0), HTML(value='')))" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "\n", + "0.7051973838697629 0.926066397844544\n", + "repeat 3\n" + ] + }, + { + "data": { + "application/vnd.jupyter.widget-view+json": { + "model_id": "4608e6ae10ca4744832f30cd1d0586b8", + "version_major": 2, + "version_minor": 0 + }, + "text/plain": [ + "HBox(children=(FloatProgress(value=0.0, max=300.0), HTML(value='')))" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "\n", + "0.6197718796821324 0.8008886221333936\n", + "repeat 4\n" + ] + }, + { + "data": { + "application/vnd.jupyter.widget-view+json": { + "model_id": "f767c329267442ed9b303a5282eedd00", + "version_major": 2, + "version_minor": 0 + }, + "text/plain": [ + "HBox(children=(FloatProgress(value=0.0, max=300.0), HTML(value='')))" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "\n", + "0.5869944612253021 0.833087648495886\n", + "repeat 5\n" + ] + }, + { + "data": { + "application/vnd.jupyter.widget-view+json": { + "model_id": "f2213d103b4344b08c21e6f10ba9e71f", + "version_major": 2, + "version_minor": 0 + }, + "text/plain": [ + "HBox(children=(FloatProgress(value=0.0, max=300.0), HTML(value='')))" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "\n", + "0.526887401148929 0.7825564599827496\n", + "repeat 6\n" + ] + }, + { + "data": { + "application/vnd.jupyter.widget-view+json": { + "model_id": "3cbe9ab34a284ba1862f10f562101c61", + "version_major": 2, + "version_minor": 0 + }, + "text/plain": [ + "HBox(children=(FloatProgress(value=0.0, max=300.0), HTML(value='')))" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "\n", + "0.7441762238070357 0.8097962032619076\n", + "repeat 7\n" + ] + }, + { + "data": { + "application/vnd.jupyter.widget-view+json": { + "model_id": "5ff7fe6e91aa40a9baaee14fa97e8dad", + "version_major": 2, + "version_minor": 0 + }, + "text/plain": [ + "HBox(children=(FloatProgress(value=0.0, max=300.0), HTML(value='')))" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "\n", + "0.7002196214395333 0.8722941602808508\n", + "repeat 8\n" + ] + }, + { + "data": { + "application/vnd.jupyter.widget-view+json": { + "model_id": "a908569b58ec4f87b206dd0edd17c599", + "version_major": 2, + "version_minor": 0 + }, + "text/plain": [ + "HBox(children=(FloatProgress(value=0.0, max=300.0), HTML(value='')))" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "\n", + "0.5491104689536416 0.7089495455775319\n", + "repeat 9\n" + ] + }, + { + "data": { + "application/vnd.jupyter.widget-view+json": { + "model_id": "0690826298144054a347317370d78738", + "version_major": 2, + "version_minor": 0 + }, + "text/plain": [ + "HBox(children=(FloatProgress(value=0.0, max=300.0), HTML(value='')))" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "\n", + "0.6417169006574607 0.8490082548992726\n", + "repeat 10\n" + ] + }, + { + "data": { + "application/vnd.jupyter.widget-view+json": { + "model_id": "51485de6306d4544a208f8e12c0d9808", + "version_major": 2, + "version_minor": 0 + }, + "text/plain": [ + "HBox(children=(FloatProgress(value=0.0, max=300.0), HTML(value='')))" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "\n", + "0.4914558594902855 0.5789450295243076\n", + "repeat 11\n" + ] + }, + { + "data": { + "application/vnd.jupyter.widget-view+json": { + "model_id": "6f4e820349f34a5282d3bc33c66a1918", + "version_major": 2, + "version_minor": 0 + }, + "text/plain": [ + "HBox(children=(FloatProgress(value=0.0, max=300.0), HTML(value='')))" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "\n", + "0.658282729632516 0.8465587723975215\n", + "repeat 12\n" + ] + }, + { + "data": { + "application/vnd.jupyter.widget-view+json": { + "model_id": "a11ec97f4b8d45e79ffa7cab3fabd991", + "version_major": 2, + "version_minor": 0 + }, + "text/plain": [ + "HBox(children=(FloatProgress(value=0.0, max=300.0), HTML(value='')))" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "\n", + "0.6808463461705202 0.8295207535345067\n", + "repeat 13\n" + ] + }, + { + "data": { + "application/vnd.jupyter.widget-view+json": { + "model_id": "3cbdb4db8b6741009c5e30cfa13ec7a1", + "version_major": 2, + "version_minor": 0 + }, + "text/plain": [ + "HBox(children=(FloatProgress(value=0.0, max=300.0), HTML(value='')))" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "\n", + "0.4602153929581194 0.6573246888924305\n", + "repeat 14\n" + ] + }, + { + "data": { + "application/vnd.jupyter.widget-view+json": { + "model_id": "1c4c412f957742c9853f56fbd973038c", + "version_major": 2, + "version_minor": 0 + }, + "text/plain": [ + "HBox(children=(FloatProgress(value=0.0, max=300.0), HTML(value='')))" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "\n", + "0.4575970166026039 0.7659322045871175\n", + "repeat 15\n" + ] + }, + { + "data": { + "application/vnd.jupyter.widget-view+json": { + "model_id": "c7ba1876a5094594b62f3af9996a8e71", + "version_major": 2, + "version_minor": 0 + }, + "text/plain": [ + "HBox(children=(FloatProgress(value=0.0, max=300.0), HTML(value='')))" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "\n", + "0.6749737401487148 0.8577875205198006\n", + "repeat 16\n" + ] + }, + { + "data": { + "application/vnd.jupyter.widget-view+json": { + "model_id": "c5d13f9a928142d08496f22b2cb5a4b0", + "version_major": 2, + "version_minor": 0 + }, + "text/plain": [ + "HBox(children=(FloatProgress(value=0.0, max=300.0), HTML(value='')))" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "\n", + "0.5614501265048616 0.8218485821382259\n", + "repeat 17\n" + ] + }, + { + "data": { + "application/vnd.jupyter.widget-view+json": { + "model_id": "304e8d4b3d984eb09cdc8f8c62e2395f", + "version_major": 2, + "version_minor": 0 + }, + "text/plain": [ + "HBox(children=(FloatProgress(value=0.0, max=300.0), HTML(value='')))" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "\n", + "0.4658012974332981 0.6579820154077086\n", + "repeat 18\n" + ] + }, + { + "data": { + "application/vnd.jupyter.widget-view+json": { + "model_id": "d92f970598a34967ae7e8e6d748f2e42", + "version_major": 2, + "version_minor": 0 + }, + "text/plain": [ + "HBox(children=(FloatProgress(value=0.0, max=300.0), HTML(value='')))" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "\n", + "0.6554263169144479 0.7282796125114368\n", + "repeat 19\n" + ] + }, + { + "data": { + "application/vnd.jupyter.widget-view+json": { + "model_id": "010b2a11ac3543698402791355830c7f", + "version_major": 2, + "version_minor": 0 + }, + "text/plain": [ + "HBox(children=(FloatProgress(value=0.0, max=300.0), HTML(value='')))" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "\n", + "0.7777325238009303 0.8637092181621636\n", + "m 100\n", + "repeat 0\n" + ] + }, + { + "data": { + "application/vnd.jupyter.widget-view+json": { + "model_id": "b1f1d7b439db47c3858c21e0a779117d", + "version_major": 2, + "version_minor": 0 + }, + "text/plain": [ + "HBox(children=(FloatProgress(value=0.0, max=300.0), HTML(value='')))" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "\n", + "0.675363418403452 0.8029688430123543\n", + "repeat 1\n" + ] + }, + { + "data": { + "application/vnd.jupyter.widget-view+json": { + "model_id": "460c982ba17443319e59ef230ca7de05", + "version_major": 2, + "version_minor": 0 + }, + "text/plain": [ + "HBox(children=(FloatProgress(value=0.0, max=300.0), HTML(value='')))" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "\n", + "0.6812206329114465 0.84924385393825\n", + "repeat 2\n" + ] + }, + { + "data": { + "application/vnd.jupyter.widget-view+json": { + "model_id": "1a199218c9c242a48a255207927fb026", + "version_major": 2, + "version_minor": 0 + }, + "text/plain": [ + "HBox(children=(FloatProgress(value=0.0, max=300.0), HTML(value='')))" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "\n", + "0.6759501953037319 0.8254583165990097\n", + "repeat 3\n" + ] + }, + { + "data": { + "application/vnd.jupyter.widget-view+json": { + "model_id": "73287c60773c4b6d81edfe17e4bd58d6", + "version_major": 2, + "version_minor": 0 + }, + "text/plain": [ + "HBox(children=(FloatProgress(value=0.0, max=300.0), HTML(value='')))" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "\n", + "0.6067064691998921 0.7212040834710048\n", + "repeat 4\n" + ] + }, + { + "data": { + "application/vnd.jupyter.widget-view+json": { + "model_id": "e28670b8f90348b5a84de48f62146bfd", + "version_major": 2, + "version_minor": 0 + }, + "text/plain": [ + "HBox(children=(FloatProgress(value=0.0, max=300.0), HTML(value='')))" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "\n", + "0.6526937955644532 0.8393759064230775\n", + "repeat 5\n" + ] + }, + { + "data": { + "application/vnd.jupyter.widget-view+json": { + "model_id": "16930b687c884de2a174430953577794", + "version_major": 2, + "version_minor": 0 + }, + "text/plain": [ + "HBox(children=(FloatProgress(value=0.0, max=300.0), HTML(value='')))" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "\n", + "0.6943998669520568 0.8531185566288524\n", + "repeat 6\n" + ] + }, + { + "data": { + "application/vnd.jupyter.widget-view+json": { + "model_id": "f52fced4f97c4ca387d5002a85221aa4", + "version_major": 2, + "version_minor": 0 + }, + "text/plain": [ + "HBox(children=(FloatProgress(value=0.0, max=300.0), HTML(value='')))" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "\n", + "0.7501128034534269 0.8389325271579242\n", + "repeat 7\n" + ] + }, + { + "data": { + "application/vnd.jupyter.widget-view+json": { + "model_id": "95af48fbdf824a5388fb844836e23db4", + "version_major": 2, + "version_minor": 0 + }, + "text/plain": [ + "HBox(children=(FloatProgress(value=0.0, max=300.0), HTML(value='')))" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "\n", + "0.4097018770102814 0.6583681575247411\n", + "repeat 8\n" + ] + }, + { + "data": { + "application/vnd.jupyter.widget-view+json": { + "model_id": "6e282bd26caa4e98bc8ba7f726e5782f", + "version_major": 2, + "version_minor": 0 + }, + "text/plain": [ + "HBox(children=(FloatProgress(value=0.0, max=300.0), HTML(value='')))" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "\n", + "0.6161547311474262 0.7930951634468995\n", + "repeat 9\n" + ] + }, + { + "data": { + "application/vnd.jupyter.widget-view+json": { + "model_id": "b4e755ab1f0e406ea82cc2fc9ccb09bb", + "version_major": 2, + "version_minor": 0 + }, + "text/plain": [ + "HBox(children=(FloatProgress(value=0.0, max=300.0), HTML(value='')))" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "\n", + "0.7194575899600605 0.8680027405631745\n", + "repeat 10\n" + ] + }, + { + "data": { + "application/vnd.jupyter.widget-view+json": { + "model_id": "3f459e46cf4e42b88cab63598937eb93", + "version_major": 2, + "version_minor": 0 + }, + "text/plain": [ + "HBox(children=(FloatProgress(value=0.0, max=300.0), HTML(value='')))" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "\n", + "0.7127236935582615 0.8833282202548383\n", + "repeat 11\n" + ] + }, + { + "data": { + "application/vnd.jupyter.widget-view+json": { + "model_id": "930578d23f6d420e8fc8875d0cfc3702", + "version_major": 2, + "version_minor": 0 + }, + "text/plain": [ + "HBox(children=(FloatProgress(value=0.0, max=300.0), HTML(value='')))" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "\n", + "0.7278806964010955 0.9048782895586874\n", + "repeat 12\n" + ] + }, + { + "data": { + "application/vnd.jupyter.widget-view+json": { + "model_id": "14c4011a875a4a79a28b391e1f376d35", + "version_major": 2, + "version_minor": 0 + }, + "text/plain": [ + "HBox(children=(FloatProgress(value=0.0, max=300.0), HTML(value='')))" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "\n", + "0.6657440330102147 0.9105699522372868\n", + "repeat 13\n" + ] + }, + { + "data": { + "application/vnd.jupyter.widget-view+json": { + "model_id": "132c457ae5fe49dba02c557ce792b577", + "version_major": 2, + "version_minor": 0 + }, + "text/plain": [ + "HBox(children=(FloatProgress(value=0.0, max=300.0), HTML(value='')))" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "\n", + "0.613283787139804 0.7278309834526954\n", + "repeat 14\n" + ] + }, + { + "data": { + "application/vnd.jupyter.widget-view+json": { + "model_id": "ce5df0273b7d4b809f2e7aaca863ed6a", + "version_major": 2, + "version_minor": 0 + }, + "text/plain": [ + "HBox(children=(FloatProgress(value=0.0, max=300.0), HTML(value='')))" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "\n", + "0.662352072743777 0.8680827410851965\n", + "repeat 15\n" + ] + }, + { + "data": { + "application/vnd.jupyter.widget-view+json": { + "model_id": "18530ca974714c9491f869568f3c8365", + "version_major": 2, + "version_minor": 0 + }, + "text/plain": [ + "HBox(children=(FloatProgress(value=0.0, max=300.0), HTML(value='')))" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "\n", + "0.7261452568245962 0.8680745780719916\n", + "repeat 16\n" + ] + }, + { + "data": { + "application/vnd.jupyter.widget-view+json": { + "model_id": "15d84c96b0a2486eb3a9a54953f06ec7", + "version_major": 2, + "version_minor": 0 + }, + "text/plain": [ + "HBox(children=(FloatProgress(value=0.0, max=300.0), HTML(value='')))" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "\n", + "0.662970837628008 0.7742405128870988\n", + "repeat 17\n" + ] + }, + { + "data": { + "application/vnd.jupyter.widget-view+json": { + "model_id": "beb5a59fc1c94f78a88755da79f47a77", + "version_major": 2, + "version_minor": 0 + }, + "text/plain": [ + "HBox(children=(FloatProgress(value=0.0, max=300.0), HTML(value='')))" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "\n", + "0.6131875535097804 0.7770954176424665\n", + "repeat 18\n" + ] + }, + { + "data": { + "application/vnd.jupyter.widget-view+json": { + "model_id": "7569e39572d4401f9bc73b04078b9be5", + "version_major": 2, + "version_minor": 0 + }, + "text/plain": [ + "HBox(children=(FloatProgress(value=0.0, max=300.0), HTML(value='')))" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "\n", + "0.7381889106936572 0.829464524606137\n", + "repeat 19\n" + ] + }, + { + "data": { + "application/vnd.jupyter.widget-view+json": { + "model_id": "f6c4f376dfad4d3c8afe0e79fa108cd3", + "version_major": 2, + "version_minor": 0 + }, + "text/plain": [ + "HBox(children=(FloatProgress(value=0.0, max=300.0), HTML(value='')))" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "\n", + "0.7928018980479574 0.9534508675478248\n" + ] + } + ], + "source": [ + "R_list_test_ALL = np.zeros((20,5))\n", + "R_list_train_ALL = np.zeros((20,5))\n", + "pearsonr_list_test_ALL = np.zeros((20,5))\n", + "pearsonr_list_train_ALL = np.zeros((20,5))\n", + "\n", + "\n", + "for mind,m in enumerate([20,40,60,80,100]):\n", + " print('m ', m)\n", + " for repeat in range(20):\n", + " print('repeat ',repeat)\n", + " r2_test,r2_tr,pr_test,pr_tr = LOOP(data_dict, m=m, random_seed=repeat, use_wht_loss=True)\n", + " R_list_test_ALL[repeat,mind] = r2_test\n", + " R_list_train_ALL[repeat,mind] = r2_tr\n", + " pearsonr_list_test_ALL[repeat,mind] = pr_test\n", + " pearsonr_list_train_ALL[repeat,mind] = pr_tr\n", + " \n", + " print(r2_test,r2_tr)\n", + " \n", + " \n", + "pickle.dump( R_list_test_ALL, open(\"baseline_results/R_list_test_ADMM_SPRIGHT_cv_60_2.p\", \"wb\" ))\n", + "pickle.dump( R_list_train_ALL, open(\"baseline_results/R_list_train_ADMM_SPRIGHT_cv_60_2.p\", \"wb\" ))\n", + "pickle.dump( pearsonr_list_test_ALL, open(\"baseline_results/pearsonr_list_test_ADMM_SPRIGHT_cv_60_2.p\", \"wb\" ))\n", + "pickle.dump( pearsonr_list_train_ALL, open(\"baseline_results/pearsonr_list_train_ADMM_SPRIGHT_cv_60_2.p\", \"wb\" ))\n" + ] + }, + { + "cell_type": "code", + "execution_count": 33, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "[0.05175058 0.30610628 0.56577838 0.61677774 0.66985201]\n" + ] + } + ], + "source": [ + "print(np.mean(R_list_test_ALL,axis=0))" + ] + }, + { + "cell_type": "code", + "execution_count": 26, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "[0.04736969 0.47303137 0.6184956 0.68305206 0.69440084]\n" + ] + } + ], + "source": [ + "print(np.mean(R_list_test_ALL,axis=0))" + ] + }, + { + "cell_type": "code", + "execution_count": 23, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "[0.12669973 0.42487691 0.62030059 0.68681354 0.71959786]\n" + ] + } + ], + "source": [ + "print(np.mean(R_list_test_ALL,axis=0))\n" + ] + }, + { + "cell_type": "code", + "execution_count": 29, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "[0.08917725 0.45053667 0.67849223 0.72296304 0.74307074]\n" + ] + } + ], + "source": [ + "print(np.mean(R_list_test_ALL,axis=0))\n" + ] + }, + { + "cell_type": "code", + "execution_count": 40, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "[0.09002108 0.50444988 0.71746233 0.74490963 0.74703317]\n" + ] + } + ], + "source": [ + "print(np.mean(R_list_test_ALL,axis=0))" + ] + }, + { + "cell_type": "code", + "execution_count": 32, + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "array([[ 0.2771314 , 0.63127288, 0.71535732, 0.70419378, 0.77828726],\n", + " [ 0.0298832 , 0.14169978, 0.60003467, 0.70439808, 0.7684045 ],\n", + " [ 0.02432881, 0.43614761, 0.68318346, 0.71030463, 0.7876529 ],\n", + " [ 0.07852733, 0.57210573, 0.76531889, 0.80344303, 0.80204916],\n", + " [ 0.05231132, 0.08264035, 0.68214052, 0.67040591, 0.74916919],\n", + " [ 0.08016278, 0.26189752, 0.75752717, 0.69814865, 0.72202564],\n", + " [ 0.03844676, 0.59535796, 0.71773403, 0.82256467, 0.77171064],\n", + " [-0.01398683, 0.55653025, 0.58949747, 0.72345689, 0.72910671],\n", + " [ 0.3273861 , 0.62833257, 0.77762923, 0.83643616, 0.75337529],\n", + " [ 0.08558967, 0.4096797 , 0.63909485, 0.76945638, 0.77258712],\n", + " [ 0.27789715, 0.46598614, 0.70005189, 0.70405971, 0.69520019],\n", + " [ 0.06526187, 0.57347507, 0.6619345 , 0.76420806, 0.73148462],\n", + " [ 0.03471837, 0.53908579, 0.63241565, 0.74992151, 0.74082102],\n", + " [ 0.22233829, 0.48588371, 0.70560059, 0.75781624, 0.79879645],\n", + " [ 0.05441403, 0.329596 , 0.54454684, 0.60703941, 0.67367769],\n", + " [-0.0267355 , 0.51236755, 0.72580162, 0.73289185, 0.73473314],\n", + " [ 0.10137795, 0.33772366, 0.57188901, 0.5923254 , 0.74339422],\n", + " [-0.03499276, 0.21009942, 0.60798922, 0.53904229, 0.54507999],\n", + " [ 0.01350872, 0.53136248, 0.75094079, 0.79709012, 0.78731662],\n", + " [ 0.09597641, 0.70948927, 0.74115682, 0.77205813, 0.77654245]])" + ] + }, + "execution_count": 32, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "R_list_test_ADMM_SPRIGHT_37 = pickle.load( open( \"baseline_results/R_list_test_ADMM_SPRIGHT_cv_37.p\", \"rb\" ) )\n", + "R_list_test_ADMM_SPRIGHT_37\n" + ] + }, + { + "cell_type": "code", + "execution_count": 35, + "metadata": {}, + "outputs": [], + "source": [ + "R_list_test_ADMM_SPRIGHT_60 = pickle.load( open( \"baseline_results/R_list_test_ADMM_SPRIGHT_cv_60.p\", \"rb\" ) )\n", + "pearsonr_test_ADMM_SPRIGHT_60 = pickle.load( open( \"baseline_results/pearsonr_list_test_ADMM_SPRIGHT_cv_60.p\", \"rb\" ) )" + ] + }, + { + "cell_type": "code", + "execution_count": 36, + "metadata": {}, + "outputs": [], + "source": [ + "R_list_test_ALL = np.maximum(R_list_test_ALL,R_list_test_ADMM_SPRIGHT_60)\n", + "pearsonr_list_test_ALL = np.maximum(pearsonr_list_test_ALL,pearsonr_test_ADMM_SPRIGHT_60)\n" + ] + }, + { + "cell_type": "code", + "execution_count": 56, + "metadata": {}, + "outputs": [], + "source": [ + "pickle.dump( R_list_test_ALL, open(\"baseline_results/R_list_test_ADMM_SPRIGHT_cv_37_5.p\", \"wb\" ))\n", + "pickle.dump( R_list_train_ALL, open(\"baseline_results/R_list_train_ADMM_SPRIGHT_cv_37_5.p\", \"wb\" ))\n", + "pickle.dump( pearsonr_list_test_ALL, open(\"baseline_results/pearsonr_list_test_ADMM_SPRIGHT_cv_37_5.p\", \"wb\" ))\n", + "pickle.dump( pearsonr_list_train_ALL, open(\"baseline_results/pearsonr_list_train_ADMM_SPRIGHT_cv_37_5.p\", \"wb\" ))\n" + ] + }, + { + "cell_type": "code", + "execution_count": 21, + "metadata": {}, + "outputs": [], + "source": [ + " n=13\n", + " all_sampling_locations1 = pickle.load(open('N13-m4-d5/sampling-locations-1.p','rb'))\n", + " all_sampling_locations2 = pickle.load(open('N13-m4-d5/sampling-locations-2.p','rb'))\n", + " all_sampling_locations3 = pickle.load(open('N13-m4-d5/sampling-locations-3.p','rb'))\n", + " X_all = np.concatenate((np.vstack(all_sampling_locations1),np.vstack(all_sampling_locations2),np.vstack(all_sampling_locations3)))\n", + " X_all,X_all_inverse_ind = np.unique(X_all, axis=0, return_inverse='True')\n", + " possible_support = generate_all_codes(n)\n", + " M_all = make_system_simple(np.vstack(possible_support), X_all)" + ] + }, + { + "cell_type": "code", + "execution_count": 22, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "(4559, 13)\n", + "(4559, 8192)\n" + ] + } + ], + "source": [ + "print(np.shape(X_all))\n", + "print(np.shape(M_all))" + ] + }, + { + "cell_type": "code", + "execution_count": 23, + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "1.9180519784593772" + ] + }, + "execution_count": 23, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "2**13/4271" + ] + }, + { + "cell_type": "code", + "execution_count": 25, + "metadata": {}, + "outputs": [], + "source": [ + "#(spright.model.support,spright.model.coef_):\n", + "#a = csr_matrix(( spright.model.coef_, (spright.model.support, np.ones(len(spright.model.support)) ) ), shape=(2*133, 1))\n", + "a = csr_matrix((2**13, 1), dtype=np.float32)" + ] + }, + { + "cell_type": "code", + "execution_count": 43, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "(2, 8192)\n", + "(8192, 1)\n", + "(2, 1)\n", + "[[0. 0.]]\n" + ] + } + ], + "source": [ + "print(np.shape(M_all[0:2,:]))\n", + "print(np.shape(a))\n", + "print(np.transpose(a).dot(np.transpose(M_all[0:2,:])))" + ] + }, + { + "cell_type": "code", + "execution_count": 11, + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "64" + ] + }, + "execution_count": 11, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "u = csr_matrix((2**43,1), dtype=np.int8)\n", + "sys.getsizeof(u)" + ] + }, + { + "cell_type": "code", + "execution_count": 79, + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "28" + ] + }, + "execution_count": 79, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "a = 2**20\n", + "sys.getsizeof(a)" + ] + }, + { + "cell_type": "code", + "execution_count": 77, + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "2692" + ] + }, + "execution_count": 77, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [] + }, + { + "cell_type": "code", + "execution_count": 26, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "(4559, 8192)\n" + ] + } + ], + "source": [ + "M_all = make_system_simple(np.vstack(possible_support), X_all)\n", + "print(np.shape(M_all))" + ] + }, + { + "cell_type": "code", + "execution_count": 21, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "(8192, 13)\n" + ] + } + ], + "source": [ + "print(np.shape(possible_support))" + ] + }, + { + "cell_type": "code", + "execution_count": 23, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "(4559, 13)\n" + ] + } + ], + "source": [ + "print(np.shape(X_all))" + ] + }, + { + "cell_type": "code", + "execution_count": 24, + "metadata": {}, + "outputs": [], + "source": [ + "M_all_new = make_system_simple(np.vstack(X_all), X_all)" + ] + }, + { + "cell_type": "code", + "execution_count": 25, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "(4559, 4559)\n" + ] + } + ], + "source": [ + "print(np.shape(M_all_new))" + ] + }, + { + "cell_type": "code", + "execution_count": 27, + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "[array([0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0]),\n", + " array([0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1]),\n", + " array([0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0]),\n", + " array([0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1]),\n", + " array([0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0]),\n", + " array([0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1]),\n", + " array([0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0]),\n", + " array([0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1]),\n", + " array([0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0]),\n", + " array([0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1]),\n", + " array([0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0]),\n", + " array([0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 1]),\n", + " array([0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0]),\n", + " array([0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 1]),\n", + " array([0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 0]),\n", + " array([0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1]),\n", + " array([0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0]),\n", + " array([0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1]),\n", + " array([0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0]),\n", + " array([0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 1]),\n", + " array([0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0]),\n", + " array([0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 1]),\n", + " array([0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 1, 0]),\n", + " array([0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 1, 1]),\n", + " array([0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0]),\n", + " array([0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 1]),\n", + " array([0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 1, 0]),\n", + " array([0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 1, 1]),\n", + " array([0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 0, 0]),\n", + " array([0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 0, 1]),\n", + " array([0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 0]),\n", + " array([0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1]),\n", + " array([0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0]),\n", + " array([0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1]),\n", + " array([0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0]),\n", + " array([0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 1]),\n", + " array([0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0]),\n", + " array([0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 1]),\n", + " array([0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 1, 0]),\n", + " array([0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 1, 1]),\n", + " array([0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0]),\n", + " array([0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 1]),\n", + " array([0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 1, 0]),\n", + " array([0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 1, 1]),\n", + " array([0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 1, 0, 0]),\n", + " array([0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 1, 0, 1]),\n", + " array([0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 1, 1, 0]),\n", + " array([0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 1, 1, 1]),\n", + " array([0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0]),\n", + " array([0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 1]),\n", + " array([0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 1, 0]),\n", + " array([0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 1, 1]),\n", + " array([0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 1, 0, 0]),\n", + " array([0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 1, 0, 1]),\n", + " array([0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 1, 1, 0]),\n", + " array([0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 1, 1, 1]),\n", + " array([0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 0, 0, 0]),\n", + " array([0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 0, 0, 1]),\n", + " array([0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 0, 1, 0]),\n", + " array([0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 0, 1, 1]),\n", + " array([0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 0, 0]),\n", + " array([0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 0, 1]),\n", + " array([0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 0]),\n", + " array([0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1]),\n", + " array([0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0]),\n", + " array([0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1]),\n", + " array([0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0]),\n", + " array([0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 1]),\n", + " array([0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0]),\n", + " array([0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 1]),\n", + " array([0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 1, 0]),\n", + " array([0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 1, 1]),\n", + " array([0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0]),\n", + " array([0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 1]),\n", + " array([0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 1, 0]),\n", + " array([0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 1, 1]),\n", + " array([0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 1, 0, 0]),\n", + " array([0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 1, 0, 1]),\n", + " array([0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 1, 1, 0]),\n", + " array([0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 1, 1, 1]),\n", + " array([0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0]),\n", + " array([0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 1]),\n", + " array([0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 1, 0]),\n", + " array([0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 1, 1]),\n", + " array([0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 1, 0, 0]),\n", + " array([0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 1, 0, 1]),\n", + " array([0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 1, 1, 0]),\n", + " array([0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 1, 1, 1]),\n", + " array([0, 0, 0, 0, 0, 0, 1, 0, 1, 1, 0, 0, 0]),\n", + " array([0, 0, 0, 0, 0, 0, 1, 0, 1, 1, 0, 0, 1]),\n", + " array([0, 0, 0, 0, 0, 0, 1, 0, 1, 1, 0, 1, 0]),\n", + " array([0, 0, 0, 0, 0, 0, 1, 0, 1, 1, 0, 1, 1]),\n", + " array([0, 0, 0, 0, 0, 0, 1, 0, 1, 1, 1, 0, 0]),\n", + " array([0, 0, 0, 0, 0, 0, 1, 0, 1, 1, 1, 0, 1]),\n", + " array([0, 0, 0, 0, 0, 0, 1, 0, 1, 1, 1, 1, 0]),\n", + " array([0, 0, 0, 0, 0, 0, 1, 0, 1, 1, 1, 1, 1]),\n", + " array([0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0]),\n", + " array([0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 1]),\n", + " array([0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 1, 0]),\n", + " array([0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 1, 1]),\n", + " array([0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 1, 0, 0]),\n", + " array([0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 1, 0, 1]),\n", + " array([0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 1, 1, 0]),\n", + " array([0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 1, 1, 1]),\n", + " array([0, 0, 0, 0, 0, 0, 1, 1, 0, 1, 0, 0, 0]),\n", + " array([0, 0, 0, 0, 0, 0, 1, 1, 0, 1, 0, 0, 1]),\n", + " array([0, 0, 0, 0, 0, 0, 1, 1, 0, 1, 0, 1, 0]),\n", + " array([0, 0, 0, 0, 0, 0, 1, 1, 0, 1, 0, 1, 1]),\n", + " array([0, 0, 0, 0, 0, 0, 1, 1, 0, 1, 1, 0, 0]),\n", + " array([0, 0, 0, 0, 0, 0, 1, 1, 0, 1, 1, 0, 1]),\n", + " array([0, 0, 0, 0, 0, 0, 1, 1, 0, 1, 1, 1, 0]),\n", + " array([0, 0, 0, 0, 0, 0, 1, 1, 0, 1, 1, 1, 1]),\n", + " array([0, 0, 0, 0, 0, 0, 1, 1, 1, 0, 0, 0, 0]),\n", + " array([0, 0, 0, 0, 0, 0, 1, 1, 1, 0, 0, 0, 1]),\n", + " array([0, 0, 0, 0, 0, 0, 1, 1, 1, 0, 0, 1, 0]),\n", + " array([0, 0, 0, 0, 0, 0, 1, 1, 1, 0, 0, 1, 1]),\n", + " array([0, 0, 0, 0, 0, 0, 1, 1, 1, 0, 1, 0, 0]),\n", + " array([0, 0, 0, 0, 0, 0, 1, 1, 1, 0, 1, 0, 1]),\n", + " array([0, 0, 0, 0, 0, 0, 1, 1, 1, 0, 1, 1, 0]),\n", + " array([0, 0, 0, 0, 0, 0, 1, 1, 1, 0, 1, 1, 1]),\n", + " array([0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 0, 0, 0]),\n", + " array([0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 0, 0, 1]),\n", + " array([0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 0, 1, 0]),\n", + " array([0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 0, 1, 1]),\n", + " array([0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 0, 0]),\n", + " array([0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 0, 1]),\n", + " array([0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 0]),\n", + " array([0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1]),\n", + " array([0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0]),\n", + " array([0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 1]),\n", + " array([0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0]),\n", + " array([0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 1]),\n", + " array([0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0]),\n", + " array([0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 1]),\n", + " array([0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 1, 0]),\n", + " array([0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 1, 1]),\n", + " array([0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0]),\n", + " array([0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 1]),\n", + " array([0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 1, 0]),\n", + " array([0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 1, 1]),\n", + " array([0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 1, 0, 0]),\n", + " array([0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 1, 0, 1]),\n", + " array([0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 1, 1, 0]),\n", + " array([0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 1, 1, 1]),\n", + " array([0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0]),\n", + " array([0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 1]),\n", + " array([0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 1, 0]),\n", + " array([0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 1, 1]),\n", + " array([0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 1, 0, 0]),\n", + " array([0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 1, 0, 1]),\n", + " array([0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 1, 1, 0]),\n", + " array([0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 1, 1, 1]),\n", + " array([0, 0, 0, 0, 0, 1, 0, 0, 1, 1, 0, 0, 0]),\n", + " array([0, 0, 0, 0, 0, 1, 0, 0, 1, 1, 0, 0, 1]),\n", + " array([0, 0, 0, 0, 0, 1, 0, 0, 1, 1, 0, 1, 0]),\n", + " array([0, 0, 0, 0, 0, 1, 0, 0, 1, 1, 0, 1, 1]),\n", + " array([0, 0, 0, 0, 0, 1, 0, 0, 1, 1, 1, 0, 0]),\n", + " array([0, 0, 0, 0, 0, 1, 0, 0, 1, 1, 1, 0, 1]),\n", + " array([0, 0, 0, 0, 0, 1, 0, 0, 1, 1, 1, 1, 0]),\n", + " array([0, 0, 0, 0, 0, 1, 0, 0, 1, 1, 1, 1, 1]),\n", + " array([0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0]),\n", + " array([0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 1]),\n", + " array([0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 1, 0]),\n", + " array([0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 1, 1]),\n", + " array([0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 1, 0, 0]),\n", + " array([0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 1, 0, 1]),\n", + " array([0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 1, 1, 0]),\n", + " array([0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 1, 1, 1]),\n", + " array([0, 0, 0, 0, 0, 1, 0, 1, 0, 1, 0, 0, 0]),\n", + " array([0, 0, 0, 0, 0, 1, 0, 1, 0, 1, 0, 0, 1]),\n", + " array([0, 0, 0, 0, 0, 1, 0, 1, 0, 1, 0, 1, 0]),\n", + " array([0, 0, 0, 0, 0, 1, 0, 1, 0, 1, 0, 1, 1]),\n", + " array([0, 0, 0, 0, 0, 1, 0, 1, 0, 1, 1, 0, 0]),\n", + " array([0, 0, 0, 0, 0, 1, 0, 1, 0, 1, 1, 0, 1]),\n", + " array([0, 0, 0, 0, 0, 1, 0, 1, 0, 1, 1, 1, 0]),\n", + " array([0, 0, 0, 0, 0, 1, 0, 1, 0, 1, 1, 1, 1]),\n", + " array([0, 0, 0, 0, 0, 1, 0, 1, 1, 0, 0, 0, 0]),\n", + " array([0, 0, 0, 0, 0, 1, 0, 1, 1, 0, 0, 0, 1]),\n", + " array([0, 0, 0, 0, 0, 1, 0, 1, 1, 0, 0, 1, 0]),\n", + " array([0, 0, 0, 0, 0, 1, 0, 1, 1, 0, 0, 1, 1]),\n", + " array([0, 0, 0, 0, 0, 1, 0, 1, 1, 0, 1, 0, 0]),\n", + " array([0, 0, 0, 0, 0, 1, 0, 1, 1, 0, 1, 0, 1]),\n", + " array([0, 0, 0, 0, 0, 1, 0, 1, 1, 0, 1, 1, 0]),\n", + " array([0, 0, 0, 0, 0, 1, 0, 1, 1, 0, 1, 1, 1]),\n", + " array([0, 0, 0, 0, 0, 1, 0, 1, 1, 1, 0, 0, 0]),\n", + " array([0, 0, 0, 0, 0, 1, 0, 1, 1, 1, 0, 0, 1]),\n", + " array([0, 0, 0, 0, 0, 1, 0, 1, 1, 1, 0, 1, 0]),\n", + " array([0, 0, 0, 0, 0, 1, 0, 1, 1, 1, 0, 1, 1]),\n", + " array([0, 0, 0, 0, 0, 1, 0, 1, 1, 1, 1, 0, 0]),\n", + " array([0, 0, 0, 0, 0, 1, 0, 1, 1, 1, 1, 0, 1]),\n", + " array([0, 0, 0, 0, 0, 1, 0, 1, 1, 1, 1, 1, 0]),\n", + " array([0, 0, 0, 0, 0, 1, 0, 1, 1, 1, 1, 1, 1]),\n", + " array([0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0]),\n", + " array([0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 1]),\n", + " array([0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 1, 0]),\n", + " array([0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 1, 1]),\n", + " array([0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 1, 0, 0]),\n", + " array([0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 1, 0, 1]),\n", + " array([0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 1, 1, 0]),\n", + " array([0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 1, 1, 1]),\n", + " array([0, 0, 0, 0, 0, 1, 1, 0, 0, 1, 0, 0, 0]),\n", + " array([0, 0, 0, 0, 0, 1, 1, 0, 0, 1, 0, 0, 1]),\n", + " array([0, 0, 0, 0, 0, 1, 1, 0, 0, 1, 0, 1, 0]),\n", + " array([0, 0, 0, 0, 0, 1, 1, 0, 0, 1, 0, 1, 1]),\n", + " array([0, 0, 0, 0, 0, 1, 1, 0, 0, 1, 1, 0, 0]),\n", + " array([0, 0, 0, 0, 0, 1, 1, 0, 0, 1, 1, 0, 1]),\n", + " array([0, 0, 0, 0, 0, 1, 1, 0, 0, 1, 1, 1, 0]),\n", + " array([0, 0, 0, 0, 0, 1, 1, 0, 0, 1, 1, 1, 1]),\n", + " array([0, 0, 0, 0, 0, 1, 1, 0, 1, 0, 0, 0, 0]),\n", + " array([0, 0, 0, 0, 0, 1, 1, 0, 1, 0, 0, 0, 1]),\n", + " array([0, 0, 0, 0, 0, 1, 1, 0, 1, 0, 0, 1, 0]),\n", + " array([0, 0, 0, 0, 0, 1, 1, 0, 1, 0, 0, 1, 1]),\n", + " array([0, 0, 0, 0, 0, 1, 1, 0, 1, 0, 1, 0, 0]),\n", + " array([0, 0, 0, 0, 0, 1, 1, 0, 1, 0, 1, 0, 1]),\n", + " array([0, 0, 0, 0, 0, 1, 1, 0, 1, 0, 1, 1, 0]),\n", + " array([0, 0, 0, 0, 0, 1, 1, 0, 1, 0, 1, 1, 1]),\n", + " array([0, 0, 0, 0, 0, 1, 1, 0, 1, 1, 0, 0, 0]),\n", + " array([0, 0, 0, 0, 0, 1, 1, 0, 1, 1, 0, 0, 1]),\n", + " array([0, 0, 0, 0, 0, 1, 1, 0, 1, 1, 0, 1, 0]),\n", + " array([0, 0, 0, 0, 0, 1, 1, 0, 1, 1, 0, 1, 1]),\n", + " array([0, 0, 0, 0, 0, 1, 1, 0, 1, 1, 1, 0, 0]),\n", + " array([0, 0, 0, 0, 0, 1, 1, 0, 1, 1, 1, 0, 1]),\n", + " array([0, 0, 0, 0, 0, 1, 1, 0, 1, 1, 1, 1, 0]),\n", + " array([0, 0, 0, 0, 0, 1, 1, 0, 1, 1, 1, 1, 1]),\n", + " array([0, 0, 0, 0, 0, 1, 1, 1, 0, 0, 0, 0, 0]),\n", + " array([0, 0, 0, 0, 0, 1, 1, 1, 0, 0, 0, 0, 1]),\n", + " array([0, 0, 0, 0, 0, 1, 1, 1, 0, 0, 0, 1, 0]),\n", + " array([0, 0, 0, 0, 0, 1, 1, 1, 0, 0, 0, 1, 1]),\n", + " array([0, 0, 0, 0, 0, 1, 1, 1, 0, 0, 1, 0, 0]),\n", + " array([0, 0, 0, 0, 0, 1, 1, 1, 0, 0, 1, 0, 1]),\n", + " array([0, 0, 0, 0, 0, 1, 1, 1, 0, 0, 1, 1, 0]),\n", + " array([0, 0, 0, 0, 0, 1, 1, 1, 0, 0, 1, 1, 1]),\n", + " array([0, 0, 0, 0, 0, 1, 1, 1, 0, 1, 0, 0, 0]),\n", + " array([0, 0, 0, 0, 0, 1, 1, 1, 0, 1, 0, 0, 1]),\n", + " array([0, 0, 0, 0, 0, 1, 1, 1, 0, 1, 0, 1, 0]),\n", + " array([0, 0, 0, 0, 0, 1, 1, 1, 0, 1, 0, 1, 1]),\n", + " array([0, 0, 0, 0, 0, 1, 1, 1, 0, 1, 1, 0, 0]),\n", + " array([0, 0, 0, 0, 0, 1, 1, 1, 0, 1, 1, 0, 1]),\n", + " array([0, 0, 0, 0, 0, 1, 1, 1, 0, 1, 1, 1, 0]),\n", + " array([0, 0, 0, 0, 0, 1, 1, 1, 0, 1, 1, 1, 1]),\n", + " array([0, 0, 0, 0, 0, 1, 1, 1, 1, 0, 0, 0, 0]),\n", + " array([0, 0, 0, 0, 0, 1, 1, 1, 1, 0, 0, 0, 1]),\n", + " array([0, 0, 0, 0, 0, 1, 1, 1, 1, 0, 0, 1, 0]),\n", + " array([0, 0, 0, 0, 0, 1, 1, 1, 1, 0, 0, 1, 1]),\n", + " array([0, 0, 0, 0, 0, 1, 1, 1, 1, 0, 1, 0, 0]),\n", + " array([0, 0, 0, 0, 0, 1, 1, 1, 1, 0, 1, 0, 1]),\n", + " array([0, 0, 0, 0, 0, 1, 1, 1, 1, 0, 1, 1, 0]),\n", + " array([0, 0, 0, 0, 0, 1, 1, 1, 1, 0, 1, 1, 1]),\n", + " array([0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 0, 0, 0]),\n", + " array([0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 0, 0, 1]),\n", + " array([0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 0, 1, 0]),\n", + " array([0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 0, 1, 1]),\n", + " array([0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 0, 0]),\n", + " array([0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 0, 1]),\n", + " array([0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 0]),\n", + " array([0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1]),\n", + " array([0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0]),\n", + " array([0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1]),\n", + " array([0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 1, 0]),\n", + " array([0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 1, 1]),\n", + " array([0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0]),\n", + " array([0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 1]),\n", + " array([0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 1, 0]),\n", + " array([0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 1, 1]),\n", + " array([0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0]),\n", + " array([0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 1]),\n", + " array([0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 1, 0]),\n", + " array([0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 1, 1]),\n", + " array([0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 1, 0, 0]),\n", + " array([0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 1, 0, 1]),\n", + " array([0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 1, 1, 0]),\n", + " array([0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 1, 1, 1]),\n", + " array([0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0]),\n", + " array([0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 1]),\n", + " array([0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 1, 0]),\n", + " array([0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 1, 1]),\n", + " array([0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 1, 0, 0]),\n", + " array([0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 1, 0, 1]),\n", + " array([0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 1, 1, 0]),\n", + " array([0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 1, 1, 1]),\n", + " array([0, 0, 0, 0, 1, 0, 0, 0, 1, 1, 0, 0, 0]),\n", + " array([0, 0, 0, 0, 1, 0, 0, 0, 1, 1, 0, 0, 1]),\n", + " array([0, 0, 0, 0, 1, 0, 0, 0, 1, 1, 0, 1, 0]),\n", + " array([0, 0, 0, 0, 1, 0, 0, 0, 1, 1, 0, 1, 1]),\n", + " array([0, 0, 0, 0, 1, 0, 0, 0, 1, 1, 1, 0, 0]),\n", + " array([0, 0, 0, 0, 1, 0, 0, 0, 1, 1, 1, 0, 1]),\n", + " array([0, 0, 0, 0, 1, 0, 0, 0, 1, 1, 1, 1, 0]),\n", + " array([0, 0, 0, 0, 1, 0, 0, 0, 1, 1, 1, 1, 1]),\n", + " array([0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0]),\n", + " array([0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 1]),\n", + " array([0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 1, 0]),\n", + " array([0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 1, 1]),\n", + " array([0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 1, 0, 0]),\n", + " array([0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 1, 0, 1]),\n", + " array([0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 1, 1, 0]),\n", + " array([0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 1, 1, 1]),\n", + " array([0, 0, 0, 0, 1, 0, 0, 1, 0, 1, 0, 0, 0]),\n", + " array([0, 0, 0, 0, 1, 0, 0, 1, 0, 1, 0, 0, 1]),\n", + " array([0, 0, 0, 0, 1, 0, 0, 1, 0, 1, 0, 1, 0]),\n", + " array([0, 0, 0, 0, 1, 0, 0, 1, 0, 1, 0, 1, 1]),\n", + " array([0, 0, 0, 0, 1, 0, 0, 1, 0, 1, 1, 0, 0]),\n", + " array([0, 0, 0, 0, 1, 0, 0, 1, 0, 1, 1, 0, 1]),\n", + " array([0, 0, 0, 0, 1, 0, 0, 1, 0, 1, 1, 1, 0]),\n", + " array([0, 0, 0, 0, 1, 0, 0, 1, 0, 1, 1, 1, 1]),\n", + " array([0, 0, 0, 0, 1, 0, 0, 1, 1, 0, 0, 0, 0]),\n", + " array([0, 0, 0, 0, 1, 0, 0, 1, 1, 0, 0, 0, 1]),\n", + " array([0, 0, 0, 0, 1, 0, 0, 1, 1, 0, 0, 1, 0]),\n", + " array([0, 0, 0, 0, 1, 0, 0, 1, 1, 0, 0, 1, 1]),\n", + " array([0, 0, 0, 0, 1, 0, 0, 1, 1, 0, 1, 0, 0]),\n", + " array([0, 0, 0, 0, 1, 0, 0, 1, 1, 0, 1, 0, 1]),\n", + " array([0, 0, 0, 0, 1, 0, 0, 1, 1, 0, 1, 1, 0]),\n", + " array([0, 0, 0, 0, 1, 0, 0, 1, 1, 0, 1, 1, 1]),\n", + " array([0, 0, 0, 0, 1, 0, 0, 1, 1, 1, 0, 0, 0]),\n", + " array([0, 0, 0, 0, 1, 0, 0, 1, 1, 1, 0, 0, 1]),\n", + " array([0, 0, 0, 0, 1, 0, 0, 1, 1, 1, 0, 1, 0]),\n", + " array([0, 0, 0, 0, 1, 0, 0, 1, 1, 1, 0, 1, 1]),\n", + " array([0, 0, 0, 0, 1, 0, 0, 1, 1, 1, 1, 0, 0]),\n", + " array([0, 0, 0, 0, 1, 0, 0, 1, 1, 1, 1, 0, 1]),\n", + " array([0, 0, 0, 0, 1, 0, 0, 1, 1, 1, 1, 1, 0]),\n", + " array([0, 0, 0, 0, 1, 0, 0, 1, 1, 1, 1, 1, 1]),\n", + " array([0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0]),\n", + " array([0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 1]),\n", + " array([0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 1, 0]),\n", + " array([0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 1, 1]),\n", + " array([0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 1, 0, 0]),\n", + " array([0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 1, 0, 1]),\n", + " array([0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 1, 1, 0]),\n", + " array([0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 1, 1, 1]),\n", + " array([0, 0, 0, 0, 1, 0, 1, 0, 0, 1, 0, 0, 0]),\n", + " array([0, 0, 0, 0, 1, 0, 1, 0, 0, 1, 0, 0, 1]),\n", + " array([0, 0, 0, 0, 1, 0, 1, 0, 0, 1, 0, 1, 0]),\n", + " array([0, 0, 0, 0, 1, 0, 1, 0, 0, 1, 0, 1, 1]),\n", + " array([0, 0, 0, 0, 1, 0, 1, 0, 0, 1, 1, 0, 0]),\n", + " array([0, 0, 0, 0, 1, 0, 1, 0, 0, 1, 1, 0, 1]),\n", + " array([0, 0, 0, 0, 1, 0, 1, 0, 0, 1, 1, 1, 0]),\n", + " array([0, 0, 0, 0, 1, 0, 1, 0, 0, 1, 1, 1, 1]),\n", + " array([0, 0, 0, 0, 1, 0, 1, 0, 1, 0, 0, 0, 0]),\n", + " array([0, 0, 0, 0, 1, 0, 1, 0, 1, 0, 0, 0, 1]),\n", + " array([0, 0, 0, 0, 1, 0, 1, 0, 1, 0, 0, 1, 0]),\n", + " array([0, 0, 0, 0, 1, 0, 1, 0, 1, 0, 0, 1, 1]),\n", + " array([0, 0, 0, 0, 1, 0, 1, 0, 1, 0, 1, 0, 0]),\n", + " array([0, 0, 0, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1]),\n", + " array([0, 0, 0, 0, 1, 0, 1, 0, 1, 0, 1, 1, 0]),\n", + " array([0, 0, 0, 0, 1, 0, 1, 0, 1, 0, 1, 1, 1]),\n", + " array([0, 0, 0, 0, 1, 0, 1, 0, 1, 1, 0, 0, 0]),\n", + " array([0, 0, 0, 0, 1, 0, 1, 0, 1, 1, 0, 0, 1]),\n", + " array([0, 0, 0, 0, 1, 0, 1, 0, 1, 1, 0, 1, 0]),\n", + " array([0, 0, 0, 0, 1, 0, 1, 0, 1, 1, 0, 1, 1]),\n", + " array([0, 0, 0, 0, 1, 0, 1, 0, 1, 1, 1, 0, 0]),\n", + " array([0, 0, 0, 0, 1, 0, 1, 0, 1, 1, 1, 0, 1]),\n", + " array([0, 0, 0, 0, 1, 0, 1, 0, 1, 1, 1, 1, 0]),\n", + " array([0, 0, 0, 0, 1, 0, 1, 0, 1, 1, 1, 1, 1]),\n", + " array([0, 0, 0, 0, 1, 0, 1, 1, 0, 0, 0, 0, 0]),\n", + " array([0, 0, 0, 0, 1, 0, 1, 1, 0, 0, 0, 0, 1]),\n", + " array([0, 0, 0, 0, 1, 0, 1, 1, 0, 0, 0, 1, 0]),\n", + " array([0, 0, 0, 0, 1, 0, 1, 1, 0, 0, 0, 1, 1]),\n", + " array([0, 0, 0, 0, 1, 0, 1, 1, 0, 0, 1, 0, 0]),\n", + " array([0, 0, 0, 0, 1, 0, 1, 1, 0, 0, 1, 0, 1]),\n", + " array([0, 0, 0, 0, 1, 0, 1, 1, 0, 0, 1, 1, 0]),\n", + " array([0, 0, 0, 0, 1, 0, 1, 1, 0, 0, 1, 1, 1]),\n", + " array([0, 0, 0, 0, 1, 0, 1, 1, 0, 1, 0, 0, 0]),\n", + " array([0, 0, 0, 0, 1, 0, 1, 1, 0, 1, 0, 0, 1]),\n", + " array([0, 0, 0, 0, 1, 0, 1, 1, 0, 1, 0, 1, 0]),\n", + " array([0, 0, 0, 0, 1, 0, 1, 1, 0, 1, 0, 1, 1]),\n", + " array([0, 0, 0, 0, 1, 0, 1, 1, 0, 1, 1, 0, 0]),\n", + " array([0, 0, 0, 0, 1, 0, 1, 1, 0, 1, 1, 0, 1]),\n", + " array([0, 0, 0, 0, 1, 0, 1, 1, 0, 1, 1, 1, 0]),\n", + " array([0, 0, 0, 0, 1, 0, 1, 1, 0, 1, 1, 1, 1]),\n", + " array([0, 0, 0, 0, 1, 0, 1, 1, 1, 0, 0, 0, 0]),\n", + " array([0, 0, 0, 0, 1, 0, 1, 1, 1, 0, 0, 0, 1]),\n", + " array([0, 0, 0, 0, 1, 0, 1, 1, 1, 0, 0, 1, 0]),\n", + " array([0, 0, 0, 0, 1, 0, 1, 1, 1, 0, 0, 1, 1]),\n", + " array([0, 0, 0, 0, 1, 0, 1, 1, 1, 0, 1, 0, 0]),\n", + " array([0, 0, 0, 0, 1, 0, 1, 1, 1, 0, 1, 0, 1]),\n", + " array([0, 0, 0, 0, 1, 0, 1, 1, 1, 0, 1, 1, 0]),\n", + " array([0, 0, 0, 0, 1, 0, 1, 1, 1, 0, 1, 1, 1]),\n", + " array([0, 0, 0, 0, 1, 0, 1, 1, 1, 1, 0, 0, 0]),\n", + " array([0, 0, 0, 0, 1, 0, 1, 1, 1, 1, 0, 0, 1]),\n", + " array([0, 0, 0, 0, 1, 0, 1, 1, 1, 1, 0, 1, 0]),\n", + " array([0, 0, 0, 0, 1, 0, 1, 1, 1, 1, 0, 1, 1]),\n", + " array([0, 0, 0, 0, 1, 0, 1, 1, 1, 1, 1, 0, 0]),\n", + " array([0, 0, 0, 0, 1, 0, 1, 1, 1, 1, 1, 0, 1]),\n", + " array([0, 0, 0, 0, 1, 0, 1, 1, 1, 1, 1, 1, 0]),\n", + " array([0, 0, 0, 0, 1, 0, 1, 1, 1, 1, 1, 1, 1]),\n", + " array([0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0]),\n", + " array([0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 1]),\n", + " array([0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 1, 0]),\n", + " array([0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 1, 1]),\n", + " array([0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 1, 0, 0]),\n", + " array([0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 1, 0, 1]),\n", + " array([0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 1, 1, 0]),\n", + " array([0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 1, 1, 1]),\n", + " array([0, 0, 0, 0, 1, 1, 0, 0, 0, 1, 0, 0, 0]),\n", + " array([0, 0, 0, 0, 1, 1, 0, 0, 0, 1, 0, 0, 1]),\n", + " array([0, 0, 0, 0, 1, 1, 0, 0, 0, 1, 0, 1, 0]),\n", + " array([0, 0, 0, 0, 1, 1, 0, 0, 0, 1, 0, 1, 1]),\n", + " array([0, 0, 0, 0, 1, 1, 0, 0, 0, 1, 1, 0, 0]),\n", + " array([0, 0, 0, 0, 1, 1, 0, 0, 0, 1, 1, 0, 1]),\n", + " array([0, 0, 0, 0, 1, 1, 0, 0, 0, 1, 1, 1, 0]),\n", + " array([0, 0, 0, 0, 1, 1, 0, 0, 0, 1, 1, 1, 1]),\n", + " array([0, 0, 0, 0, 1, 1, 0, 0, 1, 0, 0, 0, 0]),\n", + " array([0, 0, 0, 0, 1, 1, 0, 0, 1, 0, 0, 0, 1]),\n", + " array([0, 0, 0, 0, 1, 1, 0, 0, 1, 0, 0, 1, 0]),\n", + " array([0, 0, 0, 0, 1, 1, 0, 0, 1, 0, 0, 1, 1]),\n", + " array([0, 0, 0, 0, 1, 1, 0, 0, 1, 0, 1, 0, 0]),\n", + " array([0, 0, 0, 0, 1, 1, 0, 0, 1, 0, 1, 0, 1]),\n", + " array([0, 0, 0, 0, 1, 1, 0, 0, 1, 0, 1, 1, 0]),\n", + " array([0, 0, 0, 0, 1, 1, 0, 0, 1, 0, 1, 1, 1]),\n", + " array([0, 0, 0, 0, 1, 1, 0, 0, 1, 1, 0, 0, 0]),\n", + " array([0, 0, 0, 0, 1, 1, 0, 0, 1, 1, 0, 0, 1]),\n", + " array([0, 0, 0, 0, 1, 1, 0, 0, 1, 1, 0, 1, 0]),\n", + " array([0, 0, 0, 0, 1, 1, 0, 0, 1, 1, 0, 1, 1]),\n", + " array([0, 0, 0, 0, 1, 1, 0, 0, 1, 1, 1, 0, 0]),\n", + " array([0, 0, 0, 0, 1, 1, 0, 0, 1, 1, 1, 0, 1]),\n", + " array([0, 0, 0, 0, 1, 1, 0, 0, 1, 1, 1, 1, 0]),\n", + " array([0, 0, 0, 0, 1, 1, 0, 0, 1, 1, 1, 1, 1]),\n", + " array([0, 0, 0, 0, 1, 1, 0, 1, 0, 0, 0, 0, 0]),\n", + " array([0, 0, 0, 0, 1, 1, 0, 1, 0, 0, 0, 0, 1]),\n", + " array([0, 0, 0, 0, 1, 1, 0, 1, 0, 0, 0, 1, 0]),\n", + " array([0, 0, 0, 0, 1, 1, 0, 1, 0, 0, 0, 1, 1]),\n", + " array([0, 0, 0, 0, 1, 1, 0, 1, 0, 0, 1, 0, 0]),\n", + " array([0, 0, 0, 0, 1, 1, 0, 1, 0, 0, 1, 0, 1]),\n", + " array([0, 0, 0, 0, 1, 1, 0, 1, 0, 0, 1, 1, 0]),\n", + " array([0, 0, 0, 0, 1, 1, 0, 1, 0, 0, 1, 1, 1]),\n", + " array([0, 0, 0, 0, 1, 1, 0, 1, 0, 1, 0, 0, 0]),\n", + " array([0, 0, 0, 0, 1, 1, 0, 1, 0, 1, 0, 0, 1]),\n", + " array([0, 0, 0, 0, 1, 1, 0, 1, 0, 1, 0, 1, 0]),\n", + " array([0, 0, 0, 0, 1, 1, 0, 1, 0, 1, 0, 1, 1]),\n", + " array([0, 0, 0, 0, 1, 1, 0, 1, 0, 1, 1, 0, 0]),\n", + " array([0, 0, 0, 0, 1, 1, 0, 1, 0, 1, 1, 0, 1]),\n", + " array([0, 0, 0, 0, 1, 1, 0, 1, 0, 1, 1, 1, 0]),\n", + " array([0, 0, 0, 0, 1, 1, 0, 1, 0, 1, 1, 1, 1]),\n", + " array([0, 0, 0, 0, 1, 1, 0, 1, 1, 0, 0, 0, 0]),\n", + " array([0, 0, 0, 0, 1, 1, 0, 1, 1, 0, 0, 0, 1]),\n", + " array([0, 0, 0, 0, 1, 1, 0, 1, 1, 0, 0, 1, 0]),\n", + " array([0, 0, 0, 0, 1, 1, 0, 1, 1, 0, 0, 1, 1]),\n", + " array([0, 0, 0, 0, 1, 1, 0, 1, 1, 0, 1, 0, 0]),\n", + " array([0, 0, 0, 0, 1, 1, 0, 1, 1, 0, 1, 0, 1]),\n", + " array([0, 0, 0, 0, 1, 1, 0, 1, 1, 0, 1, 1, 0]),\n", + " array([0, 0, 0, 0, 1, 1, 0, 1, 1, 0, 1, 1, 1]),\n", + " array([0, 0, 0, 0, 1, 1, 0, 1, 1, 1, 0, 0, 0]),\n", + " array([0, 0, 0, 0, 1, 1, 0, 1, 1, 1, 0, 0, 1]),\n", + " array([0, 0, 0, 0, 1, 1, 0, 1, 1, 1, 0, 1, 0]),\n", + " array([0, 0, 0, 0, 1, 1, 0, 1, 1, 1, 0, 1, 1]),\n", + " array([0, 0, 0, 0, 1, 1, 0, 1, 1, 1, 1, 0, 0]),\n", + " array([0, 0, 0, 0, 1, 1, 0, 1, 1, 1, 1, 0, 1]),\n", + " array([0, 0, 0, 0, 1, 1, 0, 1, 1, 1, 1, 1, 0]),\n", + " array([0, 0, 0, 0, 1, 1, 0, 1, 1, 1, 1, 1, 1]),\n", + " array([0, 0, 0, 0, 1, 1, 1, 0, 0, 0, 0, 0, 0]),\n", + " array([0, 0, 0, 0, 1, 1, 1, 0, 0, 0, 0, 0, 1]),\n", + " array([0, 0, 0, 0, 1, 1, 1, 0, 0, 0, 0, 1, 0]),\n", + " array([0, 0, 0, 0, 1, 1, 1, 0, 0, 0, 0, 1, 1]),\n", + " array([0, 0, 0, 0, 1, 1, 1, 0, 0, 0, 1, 0, 0]),\n", + " array([0, 0, 0, 0, 1, 1, 1, 0, 0, 0, 1, 0, 1]),\n", + " array([0, 0, 0, 0, 1, 1, 1, 0, 0, 0, 1, 1, 0]),\n", + " array([0, 0, 0, 0, 1, 1, 1, 0, 0, 0, 1, 1, 1]),\n", + " array([0, 0, 0, 0, 1, 1, 1, 0, 0, 1, 0, 0, 0]),\n", + " array([0, 0, 0, 0, 1, 1, 1, 0, 0, 1, 0, 0, 1]),\n", + " array([0, 0, 0, 0, 1, 1, 1, 0, 0, 1, 0, 1, 0]),\n", + " array([0, 0, 0, 0, 1, 1, 1, 0, 0, 1, 0, 1, 1]),\n", + " array([0, 0, 0, 0, 1, 1, 1, 0, 0, 1, 1, 0, 0]),\n", + " array([0, 0, 0, 0, 1, 1, 1, 0, 0, 1, 1, 0, 1]),\n", + " array([0, 0, 0, 0, 1, 1, 1, 0, 0, 1, 1, 1, 0]),\n", + " array([0, 0, 0, 0, 1, 1, 1, 0, 0, 1, 1, 1, 1]),\n", + " array([0, 0, 0, 0, 1, 1, 1, 0, 1, 0, 0, 0, 0]),\n", + " array([0, 0, 0, 0, 1, 1, 1, 0, 1, 0, 0, 0, 1]),\n", + " array([0, 0, 0, 0, 1, 1, 1, 0, 1, 0, 0, 1, 0]),\n", + " array([0, 0, 0, 0, 1, 1, 1, 0, 1, 0, 0, 1, 1]),\n", + " array([0, 0, 0, 0, 1, 1, 1, 0, 1, 0, 1, 0, 0]),\n", + " array([0, 0, 0, 0, 1, 1, 1, 0, 1, 0, 1, 0, 1]),\n", + " array([0, 0, 0, 0, 1, 1, 1, 0, 1, 0, 1, 1, 0]),\n", + " array([0, 0, 0, 0, 1, 1, 1, 0, 1, 0, 1, 1, 1]),\n", + " array([0, 0, 0, 0, 1, 1, 1, 0, 1, 1, 0, 0, 0]),\n", + " array([0, 0, 0, 0, 1, 1, 1, 0, 1, 1, 0, 0, 1]),\n", + " array([0, 0, 0, 0, 1, 1, 1, 0, 1, 1, 0, 1, 0]),\n", + " array([0, 0, 0, 0, 1, 1, 1, 0, 1, 1, 0, 1, 1]),\n", + " array([0, 0, 0, 0, 1, 1, 1, 0, 1, 1, 1, 0, 0]),\n", + " array([0, 0, 0, 0, 1, 1, 1, 0, 1, 1, 1, 0, 1]),\n", + " array([0, 0, 0, 0, 1, 1, 1, 0, 1, 1, 1, 1, 0]),\n", + " array([0, 0, 0, 0, 1, 1, 1, 0, 1, 1, 1, 1, 1]),\n", + " array([0, 0, 0, 0, 1, 1, 1, 1, 0, 0, 0, 0, 0]),\n", + " array([0, 0, 0, 0, 1, 1, 1, 1, 0, 0, 0, 0, 1]),\n", + " array([0, 0, 0, 0, 1, 1, 1, 1, 0, 0, 0, 1, 0]),\n", + " array([0, 0, 0, 0, 1, 1, 1, 1, 0, 0, 0, 1, 1]),\n", + " array([0, 0, 0, 0, 1, 1, 1, 1, 0, 0, 1, 0, 0]),\n", + " array([0, 0, 0, 0, 1, 1, 1, 1, 0, 0, 1, 0, 1]),\n", + " array([0, 0, 0, 0, 1, 1, 1, 1, 0, 0, 1, 1, 0]),\n", + " array([0, 0, 0, 0, 1, 1, 1, 1, 0, 0, 1, 1, 1]),\n", + " array([0, 0, 0, 0, 1, 1, 1, 1, 0, 1, 0, 0, 0]),\n", + " array([0, 0, 0, 0, 1, 1, 1, 1, 0, 1, 0, 0, 1]),\n", + " array([0, 0, 0, 0, 1, 1, 1, 1, 0, 1, 0, 1, 0]),\n", + " array([0, 0, 0, 0, 1, 1, 1, 1, 0, 1, 0, 1, 1]),\n", + " array([0, 0, 0, 0, 1, 1, 1, 1, 0, 1, 1, 0, 0]),\n", + " array([0, 0, 0, 0, 1, 1, 1, 1, 0, 1, 1, 0, 1]),\n", + " array([0, 0, 0, 0, 1, 1, 1, 1, 0, 1, 1, 1, 0]),\n", + " array([0, 0, 0, 0, 1, 1, 1, 1, 0, 1, 1, 1, 1]),\n", + " array([0, 0, 0, 0, 1, 1, 1, 1, 1, 0, 0, 0, 0]),\n", + " array([0, 0, 0, 0, 1, 1, 1, 1, 1, 0, 0, 0, 1]),\n", + " array([0, 0, 0, 0, 1, 1, 1, 1, 1, 0, 0, 1, 0]),\n", + " array([0, 0, 0, 0, 1, 1, 1, 1, 1, 0, 0, 1, 1]),\n", + " array([0, 0, 0, 0, 1, 1, 1, 1, 1, 0, 1, 0, 0]),\n", + " array([0, 0, 0, 0, 1, 1, 1, 1, 1, 0, 1, 0, 1]),\n", + " array([0, 0, 0, 0, 1, 1, 1, 1, 1, 0, 1, 1, 0]),\n", + " array([0, 0, 0, 0, 1, 1, 1, 1, 1, 0, 1, 1, 1]),\n", + " array([0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 0, 0, 0]),\n", + " array([0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 0, 0, 1]),\n", + " array([0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 0, 1, 0]),\n", + " array([0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 0, 1, 1]),\n", + " array([0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 0, 0]),\n", + " array([0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 0, 1]),\n", + " array([0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 0]),\n", + " array([0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1]),\n", + " array([0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0]),\n", + " array([0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1]),\n", + " array([0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0]),\n", + " array([0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 1]),\n", + " array([0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 1, 0, 0]),\n", + " array([0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 1, 0, 1]),\n", + " array([0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 1, 1, 0]),\n", + " array([0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 1, 1, 1]),\n", + " array([0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0]),\n", + " array([0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 1]),\n", + " array([0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 1, 0]),\n", + " array([0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 1, 1]),\n", + " array([0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 1, 0, 0]),\n", + " array([0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 1, 0, 1]),\n", + " array([0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 1, 1, 0]),\n", + " array([0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 1, 1, 1]),\n", + " array([0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0]),\n", + " array([0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 1]),\n", + " array([0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 1, 0]),\n", + " array([0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 1, 1]),\n", + " array([0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 1, 0, 0]),\n", + " array([0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 1, 0, 1]),\n", + " array([0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 1, 1, 0]),\n", + " array([0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 1, 1, 1]),\n", + " array([0, 0, 0, 1, 0, 0, 0, 0, 1, 1, 0, 0, 0]),\n", + " array([0, 0, 0, 1, 0, 0, 0, 0, 1, 1, 0, 0, 1]),\n", + " array([0, 0, 0, 1, 0, 0, 0, 0, 1, 1, 0, 1, 0]),\n", + " array([0, 0, 0, 1, 0, 0, 0, 0, 1, 1, 0, 1, 1]),\n", + " array([0, 0, 0, 1, 0, 0, 0, 0, 1, 1, 1, 0, 0]),\n", + " array([0, 0, 0, 1, 0, 0, 0, 0, 1, 1, 1, 0, 1]),\n", + " array([0, 0, 0, 1, 0, 0, 0, 0, 1, 1, 1, 1, 0]),\n", + " array([0, 0, 0, 1, 0, 0, 0, 0, 1, 1, 1, 1, 1]),\n", + " array([0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0]),\n", + " array([0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 1]),\n", + " array([0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 1, 0]),\n", + " array([0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 1, 1]),\n", + " array([0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 1, 0, 0]),\n", + " array([0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 1, 0, 1]),\n", + " array([0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 1, 1, 0]),\n", + " array([0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 1, 1, 1]),\n", + " array([0, 0, 0, 1, 0, 0, 0, 1, 0, 1, 0, 0, 0]),\n", + " array([0, 0, 0, 1, 0, 0, 0, 1, 0, 1, 0, 0, 1]),\n", + " array([0, 0, 0, 1, 0, 0, 0, 1, 0, 1, 0, 1, 0]),\n", + " array([0, 0, 0, 1, 0, 0, 0, 1, 0, 1, 0, 1, 1]),\n", + " array([0, 0, 0, 1, 0, 0, 0, 1, 0, 1, 1, 0, 0]),\n", + " array([0, 0, 0, 1, 0, 0, 0, 1, 0, 1, 1, 0, 1]),\n", + " array([0, 0, 0, 1, 0, 0, 0, 1, 0, 1, 1, 1, 0]),\n", + " array([0, 0, 0, 1, 0, 0, 0, 1, 0, 1, 1, 1, 1]),\n", + " array([0, 0, 0, 1, 0, 0, 0, 1, 1, 0, 0, 0, 0]),\n", + " array([0, 0, 0, 1, 0, 0, 0, 1, 1, 0, 0, 0, 1]),\n", + " array([0, 0, 0, 1, 0, 0, 0, 1, 1, 0, 0, 1, 0]),\n", + " array([0, 0, 0, 1, 0, 0, 0, 1, 1, 0, 0, 1, 1]),\n", + " array([0, 0, 0, 1, 0, 0, 0, 1, 1, 0, 1, 0, 0]),\n", + " array([0, 0, 0, 1, 0, 0, 0, 1, 1, 0, 1, 0, 1]),\n", + " array([0, 0, 0, 1, 0, 0, 0, 1, 1, 0, 1, 1, 0]),\n", + " array([0, 0, 0, 1, 0, 0, 0, 1, 1, 0, 1, 1, 1]),\n", + " array([0, 0, 0, 1, 0, 0, 0, 1, 1, 1, 0, 0, 0]),\n", + " array([0, 0, 0, 1, 0, 0, 0, 1, 1, 1, 0, 0, 1]),\n", + " array([0, 0, 0, 1, 0, 0, 0, 1, 1, 1, 0, 1, 0]),\n", + " array([0, 0, 0, 1, 0, 0, 0, 1, 1, 1, 0, 1, 1]),\n", + " array([0, 0, 0, 1, 0, 0, 0, 1, 1, 1, 1, 0, 0]),\n", + " array([0, 0, 0, 1, 0, 0, 0, 1, 1, 1, 1, 0, 1]),\n", + " array([0, 0, 0, 1, 0, 0, 0, 1, 1, 1, 1, 1, 0]),\n", + " array([0, 0, 0, 1, 0, 0, 0, 1, 1, 1, 1, 1, 1]),\n", + " array([0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0]),\n", + " array([0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 1]),\n", + " array([0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 1, 0]),\n", + " array([0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 1, 1]),\n", + " array([0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 1, 0, 0]),\n", + " array([0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 1, 0, 1]),\n", + " array([0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 1, 1, 0]),\n", + " array([0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 1, 1, 1]),\n", + " array([0, 0, 0, 1, 0, 0, 1, 0, 0, 1, 0, 0, 0]),\n", + " array([0, 0, 0, 1, 0, 0, 1, 0, 0, 1, 0, 0, 1]),\n", + " array([0, 0, 0, 1, 0, 0, 1, 0, 0, 1, 0, 1, 0]),\n", + " array([0, 0, 0, 1, 0, 0, 1, 0, 0, 1, 0, 1, 1]),\n", + " array([0, 0, 0, 1, 0, 0, 1, 0, 0, 1, 1, 0, 0]),\n", + " array([0, 0, 0, 1, 0, 0, 1, 0, 0, 1, 1, 0, 1]),\n", + " array([0, 0, 0, 1, 0, 0, 1, 0, 0, 1, 1, 1, 0]),\n", + " array([0, 0, 0, 1, 0, 0, 1, 0, 0, 1, 1, 1, 1]),\n", + " array([0, 0, 0, 1, 0, 0, 1, 0, 1, 0, 0, 0, 0]),\n", + " array([0, 0, 0, 1, 0, 0, 1, 0, 1, 0, 0, 0, 1]),\n", + " array([0, 0, 0, 1, 0, 0, 1, 0, 1, 0, 0, 1, 0]),\n", + " array([0, 0, 0, 1, 0, 0, 1, 0, 1, 0, 0, 1, 1]),\n", + " array([0, 0, 0, 1, 0, 0, 1, 0, 1, 0, 1, 0, 0]),\n", + " array([0, 0, 0, 1, 0, 0, 1, 0, 1, 0, 1, 0, 1]),\n", + " array([0, 0, 0, 1, 0, 0, 1, 0, 1, 0, 1, 1, 0]),\n", + " array([0, 0, 0, 1, 0, 0, 1, 0, 1, 0, 1, 1, 1]),\n", + " array([0, 0, 0, 1, 0, 0, 1, 0, 1, 1, 0, 0, 0]),\n", + " array([0, 0, 0, 1, 0, 0, 1, 0, 1, 1, 0, 0, 1]),\n", + " array([0, 0, 0, 1, 0, 0, 1, 0, 1, 1, 0, 1, 0]),\n", + " array([0, 0, 0, 1, 0, 0, 1, 0, 1, 1, 0, 1, 1]),\n", + " array([0, 0, 0, 1, 0, 0, 1, 0, 1, 1, 1, 0, 0]),\n", + " array([0, 0, 0, 1, 0, 0, 1, 0, 1, 1, 1, 0, 1]),\n", + " array([0, 0, 0, 1, 0, 0, 1, 0, 1, 1, 1, 1, 0]),\n", + " array([0, 0, 0, 1, 0, 0, 1, 0, 1, 1, 1, 1, 1]),\n", + " array([0, 0, 0, 1, 0, 0, 1, 1, 0, 0, 0, 0, 0]),\n", + " array([0, 0, 0, 1, 0, 0, 1, 1, 0, 0, 0, 0, 1]),\n", + " array([0, 0, 0, 1, 0, 0, 1, 1, 0, 0, 0, 1, 0]),\n", + " array([0, 0, 0, 1, 0, 0, 1, 1, 0, 0, 0, 1, 1]),\n", + " array([0, 0, 0, 1, 0, 0, 1, 1, 0, 0, 1, 0, 0]),\n", + " array([0, 0, 0, 1, 0, 0, 1, 1, 0, 0, 1, 0, 1]),\n", + " array([0, 0, 0, 1, 0, 0, 1, 1, 0, 0, 1, 1, 0]),\n", + " array([0, 0, 0, 1, 0, 0, 1, 1, 0, 0, 1, 1, 1]),\n", + " array([0, 0, 0, 1, 0, 0, 1, 1, 0, 1, 0, 0, 0]),\n", + " array([0, 0, 0, 1, 0, 0, 1, 1, 0, 1, 0, 0, 1]),\n", + " array([0, 0, 0, 1, 0, 0, 1, 1, 0, 1, 0, 1, 0]),\n", + " array([0, 0, 0, 1, 0, 0, 1, 1, 0, 1, 0, 1, 1]),\n", + " array([0, 0, 0, 1, 0, 0, 1, 1, 0, 1, 1, 0, 0]),\n", + " array([0, 0, 0, 1, 0, 0, 1, 1, 0, 1, 1, 0, 1]),\n", + " array([0, 0, 0, 1, 0, 0, 1, 1, 0, 1, 1, 1, 0]),\n", + " array([0, 0, 0, 1, 0, 0, 1, 1, 0, 1, 1, 1, 1]),\n", + " array([0, 0, 0, 1, 0, 0, 1, 1, 1, 0, 0, 0, 0]),\n", + " array([0, 0, 0, 1, 0, 0, 1, 1, 1, 0, 0, 0, 1]),\n", + " array([0, 0, 0, 1, 0, 0, 1, 1, 1, 0, 0, 1, 0]),\n", + " array([0, 0, 0, 1, 0, 0, 1, 1, 1, 0, 0, 1, 1]),\n", + " array([0, 0, 0, 1, 0, 0, 1, 1, 1, 0, 1, 0, 0]),\n", + " array([0, 0, 0, 1, 0, 0, 1, 1, 1, 0, 1, 0, 1]),\n", + " array([0, 0, 0, 1, 0, 0, 1, 1, 1, 0, 1, 1, 0]),\n", + " array([0, 0, 0, 1, 0, 0, 1, 1, 1, 0, 1, 1, 1]),\n", + " array([0, 0, 0, 1, 0, 0, 1, 1, 1, 1, 0, 0, 0]),\n", + " array([0, 0, 0, 1, 0, 0, 1, 1, 1, 1, 0, 0, 1]),\n", + " array([0, 0, 0, 1, 0, 0, 1, 1, 1, 1, 0, 1, 0]),\n", + " array([0, 0, 0, 1, 0, 0, 1, 1, 1, 1, 0, 1, 1]),\n", + " array([0, 0, 0, 1, 0, 0, 1, 1, 1, 1, 1, 0, 0]),\n", + " array([0, 0, 0, 1, 0, 0, 1, 1, 1, 1, 1, 0, 1]),\n", + " array([0, 0, 0, 1, 0, 0, 1, 1, 1, 1, 1, 1, 0]),\n", + " array([0, 0, 0, 1, 0, 0, 1, 1, 1, 1, 1, 1, 1]),\n", + " array([0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0]),\n", + " array([0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 1]),\n", + " array([0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 1, 0]),\n", + " array([0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 1, 1]),\n", + " array([0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 1, 0, 0]),\n", + " array([0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 1, 0, 1]),\n", + " array([0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 1, 1, 0]),\n", + " array([0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 1, 1, 1]),\n", + " array([0, 0, 0, 1, 0, 1, 0, 0, 0, 1, 0, 0, 0]),\n", + " array([0, 0, 0, 1, 0, 1, 0, 0, 0, 1, 0, 0, 1]),\n", + " array([0, 0, 0, 1, 0, 1, 0, 0, 0, 1, 0, 1, 0]),\n", + " array([0, 0, 0, 1, 0, 1, 0, 0, 0, 1, 0, 1, 1]),\n", + " array([0, 0, 0, 1, 0, 1, 0, 0, 0, 1, 1, 0, 0]),\n", + " array([0, 0, 0, 1, 0, 1, 0, 0, 0, 1, 1, 0, 1]),\n", + " array([0, 0, 0, 1, 0, 1, 0, 0, 0, 1, 1, 1, 0]),\n", + " array([0, 0, 0, 1, 0, 1, 0, 0, 0, 1, 1, 1, 1]),\n", + " array([0, 0, 0, 1, 0, 1, 0, 0, 1, 0, 0, 0, 0]),\n", + " array([0, 0, 0, 1, 0, 1, 0, 0, 1, 0, 0, 0, 1]),\n", + " array([0, 0, 0, 1, 0, 1, 0, 0, 1, 0, 0, 1, 0]),\n", + " array([0, 0, 0, 1, 0, 1, 0, 0, 1, 0, 0, 1, 1]),\n", + " array([0, 0, 0, 1, 0, 1, 0, 0, 1, 0, 1, 0, 0]),\n", + " array([0, 0, 0, 1, 0, 1, 0, 0, 1, 0, 1, 0, 1]),\n", + " array([0, 0, 0, 1, 0, 1, 0, 0, 1, 0, 1, 1, 0]),\n", + " array([0, 0, 0, 1, 0, 1, 0, 0, 1, 0, 1, 1, 1]),\n", + " array([0, 0, 0, 1, 0, 1, 0, 0, 1, 1, 0, 0, 0]),\n", + " array([0, 0, 0, 1, 0, 1, 0, 0, 1, 1, 0, 0, 1]),\n", + " array([0, 0, 0, 1, 0, 1, 0, 0, 1, 1, 0, 1, 0]),\n", + " array([0, 0, 0, 1, 0, 1, 0, 0, 1, 1, 0, 1, 1]),\n", + " array([0, 0, 0, 1, 0, 1, 0, 0, 1, 1, 1, 0, 0]),\n", + " array([0, 0, 0, 1, 0, 1, 0, 0, 1, 1, 1, 0, 1]),\n", + " array([0, 0, 0, 1, 0, 1, 0, 0, 1, 1, 1, 1, 0]),\n", + " array([0, 0, 0, 1, 0, 1, 0, 0, 1, 1, 1, 1, 1]),\n", + " array([0, 0, 0, 1, 0, 1, 0, 1, 0, 0, 0, 0, 0]),\n", + " array([0, 0, 0, 1, 0, 1, 0, 1, 0, 0, 0, 0, 1]),\n", + " array([0, 0, 0, 1, 0, 1, 0, 1, 0, 0, 0, 1, 0]),\n", + " array([0, 0, 0, 1, 0, 1, 0, 1, 0, 0, 0, 1, 1]),\n", + " array([0, 0, 0, 1, 0, 1, 0, 1, 0, 0, 1, 0, 0]),\n", + " array([0, 0, 0, 1, 0, 1, 0, 1, 0, 0, 1, 0, 1]),\n", + " array([0, 0, 0, 1, 0, 1, 0, 1, 0, 0, 1, 1, 0]),\n", + " array([0, 0, 0, 1, 0, 1, 0, 1, 0, 0, 1, 1, 1]),\n", + " array([0, 0, 0, 1, 0, 1, 0, 1, 0, 1, 0, 0, 0]),\n", + " array([0, 0, 0, 1, 0, 1, 0, 1, 0, 1, 0, 0, 1]),\n", + " array([0, 0, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0]),\n", + " array([0, 0, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 1]),\n", + " array([0, 0, 0, 1, 0, 1, 0, 1, 0, 1, 1, 0, 0]),\n", + " array([0, 0, 0, 1, 0, 1, 0, 1, 0, 1, 1, 0, 1]),\n", + " array([0, 0, 0, 1, 0, 1, 0, 1, 0, 1, 1, 1, 0]),\n", + " array([0, 0, 0, 1, 0, 1, 0, 1, 0, 1, 1, 1, 1]),\n", + " array([0, 0, 0, 1, 0, 1, 0, 1, 1, 0, 0, 0, 0]),\n", + " array([0, 0, 0, 1, 0, 1, 0, 1, 1, 0, 0, 0, 1]),\n", + " array([0, 0, 0, 1, 0, 1, 0, 1, 1, 0, 0, 1, 0]),\n", + " array([0, 0, 0, 1, 0, 1, 0, 1, 1, 0, 0, 1, 1]),\n", + " array([0, 0, 0, 1, 0, 1, 0, 1, 1, 0, 1, 0, 0]),\n", + " array([0, 0, 0, 1, 0, 1, 0, 1, 1, 0, 1, 0, 1]),\n", + " array([0, 0, 0, 1, 0, 1, 0, 1, 1, 0, 1, 1, 0]),\n", + " array([0, 0, 0, 1, 0, 1, 0, 1, 1, 0, 1, 1, 1]),\n", + " array([0, 0, 0, 1, 0, 1, 0, 1, 1, 1, 0, 0, 0]),\n", + " array([0, 0, 0, 1, 0, 1, 0, 1, 1, 1, 0, 0, 1]),\n", + " array([0, 0, 0, 1, 0, 1, 0, 1, 1, 1, 0, 1, 0]),\n", + " array([0, 0, 0, 1, 0, 1, 0, 1, 1, 1, 0, 1, 1]),\n", + " array([0, 0, 0, 1, 0, 1, 0, 1, 1, 1, 1, 0, 0]),\n", + " array([0, 0, 0, 1, 0, 1, 0, 1, 1, 1, 1, 0, 1]),\n", + " array([0, 0, 0, 1, 0, 1, 0, 1, 1, 1, 1, 1, 0]),\n", + " array([0, 0, 0, 1, 0, 1, 0, 1, 1, 1, 1, 1, 1]),\n", + " array([0, 0, 0, 1, 0, 1, 1, 0, 0, 0, 0, 0, 0]),\n", + " array([0, 0, 0, 1, 0, 1, 1, 0, 0, 0, 0, 0, 1]),\n", + " array([0, 0, 0, 1, 0, 1, 1, 0, 0, 0, 0, 1, 0]),\n", + " array([0, 0, 0, 1, 0, 1, 1, 0, 0, 0, 0, 1, 1]),\n", + " array([0, 0, 0, 1, 0, 1, 1, 0, 0, 0, 1, 0, 0]),\n", + " array([0, 0, 0, 1, 0, 1, 1, 0, 0, 0, 1, 0, 1]),\n", + " array([0, 0, 0, 1, 0, 1, 1, 0, 0, 0, 1, 1, 0]),\n", + " array([0, 0, 0, 1, 0, 1, 1, 0, 0, 0, 1, 1, 1]),\n", + " array([0, 0, 0, 1, 0, 1, 1, 0, 0, 1, 0, 0, 0]),\n", + " array([0, 0, 0, 1, 0, 1, 1, 0, 0, 1, 0, 0, 1]),\n", + " array([0, 0, 0, 1, 0, 1, 1, 0, 0, 1, 0, 1, 0]),\n", + " array([0, 0, 0, 1, 0, 1, 1, 0, 0, 1, 0, 1, 1]),\n", + " array([0, 0, 0, 1, 0, 1, 1, 0, 0, 1, 1, 0, 0]),\n", + " array([0, 0, 0, 1, 0, 1, 1, 0, 0, 1, 1, 0, 1]),\n", + " array([0, 0, 0, 1, 0, 1, 1, 0, 0, 1, 1, 1, 0]),\n", + " array([0, 0, 0, 1, 0, 1, 1, 0, 0, 1, 1, 1, 1]),\n", + " array([0, 0, 0, 1, 0, 1, 1, 0, 1, 0, 0, 0, 0]),\n", + " array([0, 0, 0, 1, 0, 1, 1, 0, 1, 0, 0, 0, 1]),\n", + " array([0, 0, 0, 1, 0, 1, 1, 0, 1, 0, 0, 1, 0]),\n", + " array([0, 0, 0, 1, 0, 1, 1, 0, 1, 0, 0, 1, 1]),\n", + " array([0, 0, 0, 1, 0, 1, 1, 0, 1, 0, 1, 0, 0]),\n", + " array([0, 0, 0, 1, 0, 1, 1, 0, 1, 0, 1, 0, 1]),\n", + " array([0, 0, 0, 1, 0, 1, 1, 0, 1, 0, 1, 1, 0]),\n", + " array([0, 0, 0, 1, 0, 1, 1, 0, 1, 0, 1, 1, 1]),\n", + " array([0, 0, 0, 1, 0, 1, 1, 0, 1, 1, 0, 0, 0]),\n", + " array([0, 0, 0, 1, 0, 1, 1, 0, 1, 1, 0, 0, 1]),\n", + " array([0, 0, 0, 1, 0, 1, 1, 0, 1, 1, 0, 1, 0]),\n", + " array([0, 0, 0, 1, 0, 1, 1, 0, 1, 1, 0, 1, 1]),\n", + " array([0, 0, 0, 1, 0, 1, 1, 0, 1, 1, 1, 0, 0]),\n", + " array([0, 0, 0, 1, 0, 1, 1, 0, 1, 1, 1, 0, 1]),\n", + " array([0, 0, 0, 1, 0, 1, 1, 0, 1, 1, 1, 1, 0]),\n", + " array([0, 0, 0, 1, 0, 1, 1, 0, 1, 1, 1, 1, 1]),\n", + " array([0, 0, 0, 1, 0, 1, 1, 1, 0, 0, 0, 0, 0]),\n", + " array([0, 0, 0, 1, 0, 1, 1, 1, 0, 0, 0, 0, 1]),\n", + " array([0, 0, 0, 1, 0, 1, 1, 1, 0, 0, 0, 1, 0]),\n", + " array([0, 0, 0, 1, 0, 1, 1, 1, 0, 0, 0, 1, 1]),\n", + " array([0, 0, 0, 1, 0, 1, 1, 1, 0, 0, 1, 0, 0]),\n", + " array([0, 0, 0, 1, 0, 1, 1, 1, 0, 0, 1, 0, 1]),\n", + " array([0, 0, 0, 1, 0, 1, 1, 1, 0, 0, 1, 1, 0]),\n", + " array([0, 0, 0, 1, 0, 1, 1, 1, 0, 0, 1, 1, 1]),\n", + " array([0, 0, 0, 1, 0, 1, 1, 1, 0, 1, 0, 0, 0]),\n", + " array([0, 0, 0, 1, 0, 1, 1, 1, 0, 1, 0, 0, 1]),\n", + " array([0, 0, 0, 1, 0, 1, 1, 1, 0, 1, 0, 1, 0]),\n", + " array([0, 0, 0, 1, 0, 1, 1, 1, 0, 1, 0, 1, 1]),\n", + " array([0, 0, 0, 1, 0, 1, 1, 1, 0, 1, 1, 0, 0]),\n", + " array([0, 0, 0, 1, 0, 1, 1, 1, 0, 1, 1, 0, 1]),\n", + " array([0, 0, 0, 1, 0, 1, 1, 1, 0, 1, 1, 1, 0]),\n", + " array([0, 0, 0, 1, 0, 1, 1, 1, 0, 1, 1, 1, 1]),\n", + " array([0, 0, 0, 1, 0, 1, 1, 1, 1, 0, 0, 0, 0]),\n", + " array([0, 0, 0, 1, 0, 1, 1, 1, 1, 0, 0, 0, 1]),\n", + " array([0, 0, 0, 1, 0, 1, 1, 1, 1, 0, 0, 1, 0]),\n", + " array([0, 0, 0, 1, 0, 1, 1, 1, 1, 0, 0, 1, 1]),\n", + " array([0, 0, 0, 1, 0, 1, 1, 1, 1, 0, 1, 0, 0]),\n", + " array([0, 0, 0, 1, 0, 1, 1, 1, 1, 0, 1, 0, 1]),\n", + " array([0, 0, 0, 1, 0, 1, 1, 1, 1, 0, 1, 1, 0]),\n", + " array([0, 0, 0, 1, 0, 1, 1, 1, 1, 0, 1, 1, 1]),\n", + " array([0, 0, 0, 1, 0, 1, 1, 1, 1, 1, 0, 0, 0]),\n", + " array([0, 0, 0, 1, 0, 1, 1, 1, 1, 1, 0, 0, 1]),\n", + " array([0, 0, 0, 1, 0, 1, 1, 1, 1, 1, 0, 1, 0]),\n", + " array([0, 0, 0, 1, 0, 1, 1, 1, 1, 1, 0, 1, 1]),\n", + " array([0, 0, 0, 1, 0, 1, 1, 1, 1, 1, 1, 0, 0]),\n", + " array([0, 0, 0, 1, 0, 1, 1, 1, 1, 1, 1, 0, 1]),\n", + " array([0, 0, 0, 1, 0, 1, 1, 1, 1, 1, 1, 1, 0]),\n", + " array([0, 0, 0, 1, 0, 1, 1, 1, 1, 1, 1, 1, 1]),\n", + " array([0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0]),\n", + " array([0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 1]),\n", + " array([0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 1, 0]),\n", + " array([0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 1, 1]),\n", + " array([0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 1, 0, 0]),\n", + " array([0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 1, 0, 1]),\n", + " array([0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 1, 1, 0]),\n", + " array([0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 1, 1, 1]),\n", + " array([0, 0, 0, 1, 1, 0, 0, 0, 0, 1, 0, 0, 0]),\n", + " array([0, 0, 0, 1, 1, 0, 0, 0, 0, 1, 0, 0, 1]),\n", + " array([0, 0, 0, 1, 1, 0, 0, 0, 0, 1, 0, 1, 0]),\n", + " array([0, 0, 0, 1, 1, 0, 0, 0, 0, 1, 0, 1, 1]),\n", + " array([0, 0, 0, 1, 1, 0, 0, 0, 0, 1, 1, 0, 0]),\n", + " array([0, 0, 0, 1, 1, 0, 0, 0, 0, 1, 1, 0, 1]),\n", + " array([0, 0, 0, 1, 1, 0, 0, 0, 0, 1, 1, 1, 0]),\n", + " array([0, 0, 0, 1, 1, 0, 0, 0, 0, 1, 1, 1, 1]),\n", + " array([0, 0, 0, 1, 1, 0, 0, 0, 1, 0, 0, 0, 0]),\n", + " array([0, 0, 0, 1, 1, 0, 0, 0, 1, 0, 0, 0, 1]),\n", + " array([0, 0, 0, 1, 1, 0, 0, 0, 1, 0, 0, 1, 0]),\n", + " array([0, 0, 0, 1, 1, 0, 0, 0, 1, 0, 0, 1, 1]),\n", + " array([0, 0, 0, 1, 1, 0, 0, 0, 1, 0, 1, 0, 0]),\n", + " array([0, 0, 0, 1, 1, 0, 0, 0, 1, 0, 1, 0, 1]),\n", + " array([0, 0, 0, 1, 1, 0, 0, 0, 1, 0, 1, 1, 0]),\n", + " array([0, 0, 0, 1, 1, 0, 0, 0, 1, 0, 1, 1, 1]),\n", + " array([0, 0, 0, 1, 1, 0, 0, 0, 1, 1, 0, 0, 0]),\n", + " array([0, 0, 0, 1, 1, 0, 0, 0, 1, 1, 0, 0, 1]),\n", + " array([0, 0, 0, 1, 1, 0, 0, 0, 1, 1, 0, 1, 0]),\n", + " array([0, 0, 0, 1, 1, 0, 0, 0, 1, 1, 0, 1, 1]),\n", + " array([0, 0, 0, 1, 1, 0, 0, 0, 1, 1, 1, 0, 0]),\n", + " array([0, 0, 0, 1, 1, 0, 0, 0, 1, 1, 1, 0, 1]),\n", + " array([0, 0, 0, 1, 1, 0, 0, 0, 1, 1, 1, 1, 0]),\n", + " array([0, 0, 0, 1, 1, 0, 0, 0, 1, 1, 1, 1, 1]),\n", + " array([0, 0, 0, 1, 1, 0, 0, 1, 0, 0, 0, 0, 0]),\n", + " array([0, 0, 0, 1, 1, 0, 0, 1, 0, 0, 0, 0, 1]),\n", + " array([0, 0, 0, 1, 1, 0, 0, 1, 0, 0, 0, 1, 0]),\n", + " array([0, 0, 0, 1, 1, 0, 0, 1, 0, 0, 0, 1, 1]),\n", + " array([0, 0, 0, 1, 1, 0, 0, 1, 0, 0, 1, 0, 0]),\n", + " array([0, 0, 0, 1, 1, 0, 0, 1, 0, 0, 1, 0, 1]),\n", + " array([0, 0, 0, 1, 1, 0, 0, 1, 0, 0, 1, 1, 0]),\n", + " array([0, 0, 0, 1, 1, 0, 0, 1, 0, 0, 1, 1, 1]),\n", + " array([0, 0, 0, 1, 1, 0, 0, 1, 0, 1, 0, 0, 0]),\n", + " array([0, 0, 0, 1, 1, 0, 0, 1, 0, 1, 0, 0, 1]),\n", + " array([0, 0, 0, 1, 1, 0, 0, 1, 0, 1, 0, 1, 0]),\n", + " array([0, 0, 0, 1, 1, 0, 0, 1, 0, 1, 0, 1, 1]),\n", + " array([0, 0, 0, 1, 1, 0, 0, 1, 0, 1, 1, 0, 0]),\n", + " array([0, 0, 0, 1, 1, 0, 0, 1, 0, 1, 1, 0, 1]),\n", + " array([0, 0, 0, 1, 1, 0, 0, 1, 0, 1, 1, 1, 0]),\n", + " array([0, 0, 0, 1, 1, 0, 0, 1, 0, 1, 1, 1, 1]),\n", + " array([0, 0, 0, 1, 1, 0, 0, 1, 1, 0, 0, 0, 0]),\n", + " array([0, 0, 0, 1, 1, 0, 0, 1, 1, 0, 0, 0, 1]),\n", + " array([0, 0, 0, 1, 1, 0, 0, 1, 1, 0, 0, 1, 0]),\n", + " array([0, 0, 0, 1, 1, 0, 0, 1, 1, 0, 0, 1, 1]),\n", + " array([0, 0, 0, 1, 1, 0, 0, 1, 1, 0, 1, 0, 0]),\n", + " array([0, 0, 0, 1, 1, 0, 0, 1, 1, 0, 1, 0, 1]),\n", + " array([0, 0, 0, 1, 1, 0, 0, 1, 1, 0, 1, 1, 0]),\n", + " array([0, 0, 0, 1, 1, 0, 0, 1, 1, 0, 1, 1, 1]),\n", + " array([0, 0, 0, 1, 1, 0, 0, 1, 1, 1, 0, 0, 0]),\n", + " array([0, 0, 0, 1, 1, 0, 0, 1, 1, 1, 0, 0, 1]),\n", + " array([0, 0, 0, 1, 1, 0, 0, 1, 1, 1, 0, 1, 0]),\n", + " array([0, 0, 0, 1, 1, 0, 0, 1, 1, 1, 0, 1, 1]),\n", + " array([0, 0, 0, 1, 1, 0, 0, 1, 1, 1, 1, 0, 0]),\n", + " array([0, 0, 0, 1, 1, 0, 0, 1, 1, 1, 1, 0, 1]),\n", + " array([0, 0, 0, 1, 1, 0, 0, 1, 1, 1, 1, 1, 0]),\n", + " array([0, 0, 0, 1, 1, 0, 0, 1, 1, 1, 1, 1, 1]),\n", + " array([0, 0, 0, 1, 1, 0, 1, 0, 0, 0, 0, 0, 0]),\n", + " array([0, 0, 0, 1, 1, 0, 1, 0, 0, 0, 0, 0, 1]),\n", + " array([0, 0, 0, 1, 1, 0, 1, 0, 0, 0, 0, 1, 0]),\n", + " array([0, 0, 0, 1, 1, 0, 1, 0, 0, 0, 0, 1, 1]),\n", + " array([0, 0, 0, 1, 1, 0, 1, 0, 0, 0, 1, 0, 0]),\n", + " array([0, 0, 0, 1, 1, 0, 1, 0, 0, 0, 1, 0, 1]),\n", + " array([0, 0, 0, 1, 1, 0, 1, 0, 0, 0, 1, 1, 0]),\n", + " array([0, 0, 0, 1, 1, 0, 1, 0, 0, 0, 1, 1, 1]),\n", + " array([0, 0, 0, 1, 1, 0, 1, 0, 0, 1, 0, 0, 0]),\n", + " array([0, 0, 0, 1, 1, 0, 1, 0, 0, 1, 0, 0, 1]),\n", + " array([0, 0, 0, 1, 1, 0, 1, 0, 0, 1, 0, 1, 0]),\n", + " array([0, 0, 0, 1, 1, 0, 1, 0, 0, 1, 0, 1, 1]),\n", + " array([0, 0, 0, 1, 1, 0, 1, 0, 0, 1, 1, 0, 0]),\n", + " array([0, 0, 0, 1, 1, 0, 1, 0, 0, 1, 1, 0, 1]),\n", + " array([0, 0, 0, 1, 1, 0, 1, 0, 0, 1, 1, 1, 0]),\n", + " array([0, 0, 0, 1, 1, 0, 1, 0, 0, 1, 1, 1, 1]),\n", + " array([0, 0, 0, 1, 1, 0, 1, 0, 1, 0, 0, 0, 0]),\n", + " array([0, 0, 0, 1, 1, 0, 1, 0, 1, 0, 0, 0, 1]),\n", + " array([0, 0, 0, 1, 1, 0, 1, 0, 1, 0, 0, 1, 0]),\n", + " array([0, 0, 0, 1, 1, 0, 1, 0, 1, 0, 0, 1, 1]),\n", + " array([0, 0, 0, 1, 1, 0, 1, 0, 1, 0, 1, 0, 0]),\n", + " array([0, 0, 0, 1, 1, 0, 1, 0, 1, 0, 1, 0, 1]),\n", + " array([0, 0, 0, 1, 1, 0, 1, 0, 1, 0, 1, 1, 0]),\n", + " array([0, 0, 0, 1, 1, 0, 1, 0, 1, 0, 1, 1, 1]),\n", + " array([0, 0, 0, 1, 1, 0, 1, 0, 1, 1, 0, 0, 0]),\n", + " array([0, 0, 0, 1, 1, 0, 1, 0, 1, 1, 0, 0, 1]),\n", + " array([0, 0, 0, 1, 1, 0, 1, 0, 1, 1, 0, 1, 0]),\n", + " array([0, 0, 0, 1, 1, 0, 1, 0, 1, 1, 0, 1, 1]),\n", + " array([0, 0, 0, 1, 1, 0, 1, 0, 1, 1, 1, 0, 0]),\n", + " array([0, 0, 0, 1, 1, 0, 1, 0, 1, 1, 1, 0, 1]),\n", + " array([0, 0, 0, 1, 1, 0, 1, 0, 1, 1, 1, 1, 0]),\n", + " array([0, 0, 0, 1, 1, 0, 1, 0, 1, 1, 1, 1, 1]),\n", + " array([0, 0, 0, 1, 1, 0, 1, 1, 0, 0, 0, 0, 0]),\n", + " array([0, 0, 0, 1, 1, 0, 1, 1, 0, 0, 0, 0, 1]),\n", + " array([0, 0, 0, 1, 1, 0, 1, 1, 0, 0, 0, 1, 0]),\n", + " array([0, 0, 0, 1, 1, 0, 1, 1, 0, 0, 0, 1, 1]),\n", + " array([0, 0, 0, 1, 1, 0, 1, 1, 0, 0, 1, 0, 0]),\n", + " array([0, 0, 0, 1, 1, 0, 1, 1, 0, 0, 1, 0, 1]),\n", + " array([0, 0, 0, 1, 1, 0, 1, 1, 0, 0, 1, 1, 0]),\n", + " array([0, 0, 0, 1, 1, 0, 1, 1, 0, 0, 1, 1, 1]),\n", + " array([0, 0, 0, 1, 1, 0, 1, 1, 0, 1, 0, 0, 0]),\n", + " array([0, 0, 0, 1, 1, 0, 1, 1, 0, 1, 0, 0, 1]),\n", + " array([0, 0, 0, 1, 1, 0, 1, 1, 0, 1, 0, 1, 0]),\n", + " array([0, 0, 0, 1, 1, 0, 1, 1, 0, 1, 0, 1, 1]),\n", + " array([0, 0, 0, 1, 1, 0, 1, 1, 0, 1, 1, 0, 0]),\n", + " array([0, 0, 0, 1, 1, 0, 1, 1, 0, 1, 1, 0, 1]),\n", + " array([0, 0, 0, 1, 1, 0, 1, 1, 0, 1, 1, 1, 0]),\n", + " array([0, 0, 0, 1, 1, 0, 1, 1, 0, 1, 1, 1, 1]),\n", + " array([0, 0, 0, 1, 1, 0, 1, 1, 1, 0, 0, 0, 0]),\n", + " array([0, 0, 0, 1, 1, 0, 1, 1, 1, 0, 0, 0, 1]),\n", + " array([0, 0, 0, 1, 1, 0, 1, 1, 1, 0, 0, 1, 0]),\n", + " array([0, 0, 0, 1, 1, 0, 1, 1, 1, 0, 0, 1, 1]),\n", + " array([0, 0, 0, 1, 1, 0, 1, 1, 1, 0, 1, 0, 0]),\n", + " array([0, 0, 0, 1, 1, 0, 1, 1, 1, 0, 1, 0, 1]),\n", + " array([0, 0, 0, 1, 1, 0, 1, 1, 1, 0, 1, 1, 0]),\n", + " array([0, 0, 0, 1, 1, 0, 1, 1, 1, 0, 1, 1, 1]),\n", + " array([0, 0, 0, 1, 1, 0, 1, 1, 1, 1, 0, 0, 0]),\n", + " array([0, 0, 0, 1, 1, 0, 1, 1, 1, 1, 0, 0, 1]),\n", + " array([0, 0, 0, 1, 1, 0, 1, 1, 1, 1, 0, 1, 0]),\n", + " array([0, 0, 0, 1, 1, 0, 1, 1, 1, 1, 0, 1, 1]),\n", + " array([0, 0, 0, 1, 1, 0, 1, 1, 1, 1, 1, 0, 0]),\n", + " array([0, 0, 0, 1, 1, 0, 1, 1, 1, 1, 1, 0, 1]),\n", + " array([0, 0, 0, 1, 1, 0, 1, 1, 1, 1, 1, 1, 0]),\n", + " array([0, 0, 0, 1, 1, 0, 1, 1, 1, 1, 1, 1, 1]),\n", + " array([0, 0, 0, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0]),\n", + " array([0, 0, 0, 1, 1, 1, 0, 0, 0, 0, 0, 0, 1]),\n", + " array([0, 0, 0, 1, 1, 1, 0, 0, 0, 0, 0, 1, 0]),\n", + " array([0, 0, 0, 1, 1, 1, 0, 0, 0, 0, 0, 1, 1]),\n", + " array([0, 0, 0, 1, 1, 1, 0, 0, 0, 0, 1, 0, 0]),\n", + " array([0, 0, 0, 1, 1, 1, 0, 0, 0, 0, 1, 0, 1]),\n", + " array([0, 0, 0, 1, 1, 1, 0, 0, 0, 0, 1, 1, 0]),\n", + " array([0, 0, 0, 1, 1, 1, 0, 0, 0, 0, 1, 1, 1]),\n", + " array([0, 0, 0, 1, 1, 1, 0, 0, 0, 1, 0, 0, 0]),\n", + " array([0, 0, 0, 1, 1, 1, 0, 0, 0, 1, 0, 0, 1]),\n", + " array([0, 0, 0, 1, 1, 1, 0, 0, 0, 1, 0, 1, 0]),\n", + " array([0, 0, 0, 1, 1, 1, 0, 0, 0, 1, 0, 1, 1]),\n", + " array([0, 0, 0, 1, 1, 1, 0, 0, 0, 1, 1, 0, 0]),\n", + " array([0, 0, 0, 1, 1, 1, 0, 0, 0, 1, 1, 0, 1]),\n", + " array([0, 0, 0, 1, 1, 1, 0, 0, 0, 1, 1, 1, 0]),\n", + " array([0, 0, 0, 1, 1, 1, 0, 0, 0, 1, 1, 1, 1]),\n", + " array([0, 0, 0, 1, 1, 1, 0, 0, 1, 0, 0, 0, 0]),\n", + " array([0, 0, 0, 1, 1, 1, 0, 0, 1, 0, 0, 0, 1]),\n", + " array([0, 0, 0, 1, 1, 1, 0, 0, 1, 0, 0, 1, 0]),\n", + " array([0, 0, 0, 1, 1, 1, 0, 0, 1, 0, 0, 1, 1]),\n", + " array([0, 0, 0, 1, 1, 1, 0, 0, 1, 0, 1, 0, 0]),\n", + " array([0, 0, 0, 1, 1, 1, 0, 0, 1, 0, 1, 0, 1]),\n", + " array([0, 0, 0, 1, 1, 1, 0, 0, 1, 0, 1, 1, 0]),\n", + " array([0, 0, 0, 1, 1, 1, 0, 0, 1, 0, 1, 1, 1]),\n", + " array([0, 0, 0, 1, 1, 1, 0, 0, 1, 1, 0, 0, 0]),\n", + " array([0, 0, 0, 1, 1, 1, 0, 0, 1, 1, 0, 0, 1]),\n", + " array([0, 0, 0, 1, 1, 1, 0, 0, 1, 1, 0, 1, 0]),\n", + " array([0, 0, 0, 1, 1, 1, 0, 0, 1, 1, 0, 1, 1]),\n", + " array([0, 0, 0, 1, 1, 1, 0, 0, 1, 1, 1, 0, 0]),\n", + " array([0, 0, 0, 1, 1, 1, 0, 0, 1, 1, 1, 0, 1]),\n", + " array([0, 0, 0, 1, 1, 1, 0, 0, 1, 1, 1, 1, 0]),\n", + " array([0, 0, 0, 1, 1, 1, 0, 0, 1, 1, 1, 1, 1]),\n", + " array([0, 0, 0, 1, 1, 1, 0, 1, 0, 0, 0, 0, 0]),\n", + " array([0, 0, 0, 1, 1, 1, 0, 1, 0, 0, 0, 0, 1]),\n", + " array([0, 0, 0, 1, 1, 1, 0, 1, 0, 0, 0, 1, 0]),\n", + " array([0, 0, 0, 1, 1, 1, 0, 1, 0, 0, 0, 1, 1]),\n", + " array([0, 0, 0, 1, 1, 1, 0, 1, 0, 0, 1, 0, 0]),\n", + " array([0, 0, 0, 1, 1, 1, 0, 1, 0, 0, 1, 0, 1]),\n", + " array([0, 0, 0, 1, 1, 1, 0, 1, 0, 0, 1, 1, 0]),\n", + " array([0, 0, 0, 1, 1, 1, 0, 1, 0, 0, 1, 1, 1]),\n", + " array([0, 0, 0, 1, 1, 1, 0, 1, 0, 1, 0, 0, 0]),\n", + " array([0, 0, 0, 1, 1, 1, 0, 1, 0, 1, 0, 0, 1]),\n", + " array([0, 0, 0, 1, 1, 1, 0, 1, 0, 1, 0, 1, 0]),\n", + " array([0, 0, 0, 1, 1, 1, 0, 1, 0, 1, 0, 1, 1]),\n", + " array([0, 0, 0, 1, 1, 1, 0, 1, 0, 1, 1, 0, 0]),\n", + " array([0, 0, 0, 1, 1, 1, 0, 1, 0, 1, 1, 0, 1]),\n", + " array([0, 0, 0, 1, 1, 1, 0, 1, 0, 1, 1, 1, 0]),\n", + " array([0, 0, 0, 1, 1, 1, 0, 1, 0, 1, 1, 1, 1]),\n", + " array([0, 0, 0, 1, 1, 1, 0, 1, 1, 0, 0, 0, 0]),\n", + " array([0, 0, 0, 1, 1, 1, 0, 1, 1, 0, 0, 0, 1]),\n", + " array([0, 0, 0, 1, 1, 1, 0, 1, 1, 0, 0, 1, 0]),\n", + " array([0, 0, 0, 1, 1, 1, 0, 1, 1, 0, 0, 1, 1]),\n", + " array([0, 0, 0, 1, 1, 1, 0, 1, 1, 0, 1, 0, 0]),\n", + " array([0, 0, 0, 1, 1, 1, 0, 1, 1, 0, 1, 0, 1]),\n", + " array([0, 0, 0, 1, 1, 1, 0, 1, 1, 0, 1, 1, 0]),\n", + " array([0, 0, 0, 1, 1, 1, 0, 1, 1, 0, 1, 1, 1]),\n", + " array([0, 0, 0, 1, 1, 1, 0, 1, 1, 1, 0, 0, 0]),\n", + " array([0, 0, 0, 1, 1, 1, 0, 1, 1, 1, 0, 0, 1]),\n", + " array([0, 0, 0, 1, 1, 1, 0, 1, 1, 1, 0, 1, 0]),\n", + " array([0, 0, 0, 1, 1, 1, 0, 1, 1, 1, 0, 1, 1]),\n", + " array([0, 0, 0, 1, 1, 1, 0, 1, 1, 1, 1, 0, 0]),\n", + " array([0, 0, 0, 1, 1, 1, 0, 1, 1, 1, 1, 0, 1]),\n", + " array([0, 0, 0, 1, 1, 1, 0, 1, 1, 1, 1, 1, 0]),\n", + " array([0, 0, 0, 1, 1, 1, 0, 1, 1, 1, 1, 1, 1]),\n", + " array([0, 0, 0, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0]),\n", + " array([0, 0, 0, 1, 1, 1, 1, 0, 0, 0, 0, 0, 1]),\n", + " array([0, 0, 0, 1, 1, 1, 1, 0, 0, 0, 0, 1, 0]),\n", + " array([0, 0, 0, 1, 1, 1, 1, 0, 0, 0, 0, 1, 1]),\n", + " array([0, 0, 0, 1, 1, 1, 1, 0, 0, 0, 1, 0, 0]),\n", + " array([0, 0, 0, 1, 1, 1, 1, 0, 0, 0, 1, 0, 1]),\n", + " array([0, 0, 0, 1, 1, 1, 1, 0, 0, 0, 1, 1, 0]),\n", + " array([0, 0, 0, 1, 1, 1, 1, 0, 0, 0, 1, 1, 1]),\n", + " array([0, 0, 0, 1, 1, 1, 1, 0, 0, 1, 0, 0, 0]),\n", + " array([0, 0, 0, 1, 1, 1, 1, 0, 0, 1, 0, 0, 1]),\n", + " array([0, 0, 0, 1, 1, 1, 1, 0, 0, 1, 0, 1, 0]),\n", + " array([0, 0, 0, 1, 1, 1, 1, 0, 0, 1, 0, 1, 1]),\n", + " array([0, 0, 0, 1, 1, 1, 1, 0, 0, 1, 1, 0, 0]),\n", + " array([0, 0, 0, 1, 1, 1, 1, 0, 0, 1, 1, 0, 1]),\n", + " array([0, 0, 0, 1, 1, 1, 1, 0, 0, 1, 1, 1, 0]),\n", + " array([0, 0, 0, 1, 1, 1, 1, 0, 0, 1, 1, 1, 1]),\n", + " array([0, 0, 0, 1, 1, 1, 1, 0, 1, 0, 0, 0, 0]),\n", + " array([0, 0, 0, 1, 1, 1, 1, 0, 1, 0, 0, 0, 1]),\n", + " array([0, 0, 0, 1, 1, 1, 1, 0, 1, 0, 0, 1, 0]),\n", + " array([0, 0, 0, 1, 1, 1, 1, 0, 1, 0, 0, 1, 1]),\n", + " array([0, 0, 0, 1, 1, 1, 1, 0, 1, 0, 1, 0, 0]),\n", + " array([0, 0, 0, 1, 1, 1, 1, 0, 1, 0, 1, 0, 1]),\n", + " array([0, 0, 0, 1, 1, 1, 1, 0, 1, 0, 1, 1, 0]),\n", + " array([0, 0, 0, 1, 1, 1, 1, 0, 1, 0, 1, 1, 1]),\n", + " array([0, 0, 0, 1, 1, 1, 1, 0, 1, 1, 0, 0, 0]),\n", + " array([0, 0, 0, 1, 1, 1, 1, 0, 1, 1, 0, 0, 1]),\n", + " array([0, 0, 0, 1, 1, 1, 1, 0, 1, 1, 0, 1, 0]),\n", + " array([0, 0, 0, 1, 1, 1, 1, 0, 1, 1, 0, 1, 1]),\n", + " array([0, 0, 0, 1, 1, 1, 1, 0, 1, 1, 1, 0, 0]),\n", + " array([0, 0, 0, 1, 1, 1, 1, 0, 1, 1, 1, 0, 1]),\n", + " array([0, 0, 0, 1, 1, 1, 1, 0, 1, 1, 1, 1, 0]),\n", + " array([0, 0, 0, 1, 1, 1, 1, 0, 1, 1, 1, 1, 1]),\n", + " array([0, 0, 0, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0]),\n", + " array([0, 0, 0, 1, 1, 1, 1, 1, 0, 0, 0, 0, 1]),\n", + " array([0, 0, 0, 1, 1, 1, 1, 1, 0, 0, 0, 1, 0]),\n", + " array([0, 0, 0, 1, 1, 1, 1, 1, 0, 0, 0, 1, 1]),\n", + " array([0, 0, 0, 1, 1, 1, 1, 1, 0, 0, 1, 0, 0]),\n", + " array([0, 0, 0, 1, 1, 1, 1, 1, 0, 0, 1, 0, 1]),\n", + " array([0, 0, 0, 1, 1, 1, 1, 1, 0, 0, 1, 1, 0]),\n", + " array([0, 0, 0, 1, 1, 1, 1, 1, 0, 0, 1, 1, 1]),\n", + " ...]" + ] + }, + "execution_count": 27, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "possible_support" + ] + }, + { + "cell_type": "code", + "execution_count": 28, + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "array([[0, 1, 0, 1, 0, 0, 0, 1, 0, 0, 1, 0, 0],\n", + " [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1],\n", + " [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0],\n", + " [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0],\n", + " [0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0],\n", + " [0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0],\n", + " [1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0],\n", + " [0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0],\n", + " [0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0],\n", + " [0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0]])" + ] + }, + "execution_count": 28, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "spright.model.support" + ] + }, + { + "cell_type": "code", + "execution_count": 29, + "metadata": {}, + "outputs": [], + "source": [ + "M_all_new = make_system_simple(np.vstack(spright.model.support), X_all)" + ] + }, + { + "cell_type": "code", + "execution_count": 30, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "(4559, 10)\n" + ] + } + ], + "source": [ + "print(np.shape(M_all_new))" + ] + }, + { + "cell_type": "code", + "execution_count": 22, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "4559\n" + ] + } + ], + "source": [ + "print(wht_mat.shape[0])" + ] + }, + { + "cell_type": "code", + "execution_count": 21, + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "(60, 13)" + ] + }, + "execution_count": 21, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "np.shape(X)" + ] + }, + { + "cell_type": "code", + "execution_count": 29, + "metadata": {}, + "outputs": [ + { + "ename": "AttributeError", + "evalue": "module 'numpy' has no attribute 'range'", + "output_type": "error", + "traceback": [ + "\u001b[0;31m---------------------------------------------------------------------------\u001b[0m", + "\u001b[0;31mAttributeError\u001b[0m Traceback (most recent call last)", + "\u001b[0;32m\u001b[0m in \u001b[0;36m\u001b[0;34m\u001b[0m\n\u001b[0;32m----> 1\u001b[0;31m \u001b[0mnp\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mrange\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;36m5\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m", + "\u001b[0;32m/usr/local/lib/python3.7/site-packages/numpy/__init__.py\u001b[0m in \u001b[0;36m__getattr__\u001b[0;34m(attr)\u001b[0m\n\u001b[1;32m 218\u001b[0m \u001b[0;32melse\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 219\u001b[0m raise AttributeError(\"module {!r} has no attribute \"\n\u001b[0;32m--> 220\u001b[0;31m \"{!r}\".format(__name__, attr))\n\u001b[0m\u001b[1;32m 221\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 222\u001b[0m \u001b[0;32mdef\u001b[0m \u001b[0m__dir__\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n", + "\u001b[0;31mAttributeError\u001b[0m: module 'numpy' has no attribute 'range'" + ] + } + ], + "source": [ + "np.range(5)\n" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [] + } + ], + "metadata": { + "kernelspec": { + "display_name": "Python 3", + "language": "python", + "name": "python3" + }, + "language_info": { + "codemirror_mode": { + "name": "ipython", + "version": 3 + }, + "file_extension": ".py", + "mimetype": "text/x-python", + "name": "python", + "nbconvert_exporter": "python", + "pygments_lexer": "ipython3", + "version": "3.8.5" + }, + "name": "WHT_matrix_L1_Coefficients.ipynb" + }, + "nbformat": 4, + "nbformat_minor": 2 +} diff --git a/utils2.py b/utils2.py new file mode 100644 index 0000000..cdeb0a3 --- /dev/null +++ b/utils2.py @@ -0,0 +1,694 @@ +import numpy as np +import pickle +import glob +import matplotlib.pyplot as plt +from tqdm.notebook import tqdm + +import torch +import torchvision +import torchvision.transforms as transforms + +import torch.nn as nn +import torch.nn.functional as F +import torch.optim as optim + +from sklearn.metrics import r2_score +import ipdb + +from sklearn.linear_model import LinearRegression +from sklearn.linear_model import Lasso +from sklearn.model_selection import train_test_split + +from scipy.special import comb + +def crop_to_window(u, n): + n0 = u.shape[1] + b = int((n0-n)//2) + return u[:, b:b+n] + +def blocks(repeat_length, num_bits=13): + if repeat_locations == 0: + return [np.zeros(num_bits)] + + num_blocks = num_bits - repeat_length + 1 + patterns = [] + for i in range(0, num_blocks): + pattern = np.zeros(num_bits) + pattern[i:i+repeat_length] = 1 + + patterns.append(pattern) + + return patterns + +def left_right_blocks(repeat_length, num_bits=13): + if repeat_length == 0: + return [np.zeros(num_bits)] + + left_boundary = 0 + right_boundary = int(num_bits//2) + + num_blocks = right_boundary - repeat_length + 1 + + patterns = [] + + for i in range(0, num_blocks): + for j in range(0, num_blocks): + pattern = np.zeros(num_bits) + pattern[i:i+repeat_length] = 1 + pattern[right_boundary+j:right_boundary+j+repeat_length] = 1 + + patterns.append(pattern) + + + return patterns + +def repeat_locations(repeat_length, num_bits=13): + patterns = [] + for i in range(0,repeat_length+1): + new_patterns = left_right_blocks(i, num_bits) + patterns += new_patterns + return patterns + + + + +def support_augmented_with_reversed(support): + support_set = set() + + for s in support: + support_set.add(zo_to_string(s)) + + support_set_temp = set() + for s in support_set: + s_reversed = s[::-1] + + if s_reversed not in support_set: + support_set_temp.add(s_reversed) + + support_set = support_set | support_set_temp + + support = [] + for s in support_set: + support.append(string_to_zo(s)) + + return support + +def next_string_with_same_num_ones(v): + t = (v | (v-1))+ 1 + w = t | ((( (t & -t) // (v & -v) ) >> 1) - 1 ) + return w + + +def all_strings_with_k_ones(bit_length,k): + num_total = int( comb(bit_length,k) ) + c = 2**k - 1 + my_list = [] + for i in range(num_total): + my_list.append(c) + if i != num_total - 1: + c = next_string_with_same_num_ones(c) + + return my_list + +def all_strings_up_to_k_ones(bit_length,k): + my_list = [] + + for i in range(k+1): + my_list = my_list + all_strings_with_k_ones(bit_length,i) + + return my_list + +def all_strings_with_given_ones(bit_length, k_list): + my_list = [] + + for i in k_list: + my_list = my_list + all_strings_with_k_ones(bit_length,i) + + return my_list + +def synthetic_band_support(band_width, num_bits=13): + max_number = 2**(2*band_width) + rotate_length = num_bits//2 + band_width + support = [] + for i in range(max_number): + binary_loc = dec_to_bin(i, num_bits) + binary_loc = np.roll(binary_loc, rotate_length) + support.append(binary_loc) + return support + +def synthetic_band_support_capped_degree(band_width, degree_cap, num_bits=13): + assert band_width >= 0, "width needs to be non-negative" + assert degree_cap >= 0, "cap needs to be non-negative" + + rotate_length = num_bits//2 + band_width + + support = [] + + if isinstance(degree_cap, list): + all_strings = all_strings_with_given_ones(2*band_width, degree_cap) + else: + all_strings = all_strings_up_to_k_ones(2*band_width, degree_cap) + + for s in all_strings: + binary_loc = dec_to_bin(s, num_bits) + binary_loc = np.roll(binary_loc, rotate_length) + support.append(binary_loc) + + return support + + +def support_to_set(support): + support_set = set() + for s in support: + support_set.add(zo_to_string(s)) + return support_set + +def set_to_support(the_set): + locations = [] + for loc in the_set: + locations.append(string_to_zo(loc)) + return locations + +def pm_to_zo(pm): + """ + Goes from plus-minus to zero-one + """ + zo = np.zeros_like(pm) + zo[pm < 0] = 1 + return zo.astype(int) + +def zo_to_pm(zo): + """ + Goes from plus-minus to zero-one + """ + return (-1)**zo + +def zo_to_string(u): + return ''.join([str(i) for i in list(u)]) + +def string_to_zo(u): + return np.array([int(i) for i in list(u)]) + +def my_string_format(s): + N = len(s) + return s[:N//2] + ':' + s[N//2:] + +def my_print_string(s): + print(my_string_format(s)) + +def random_binary_matrix(m, n, p=0.5): + A = np.random.binomial(1,p,size=(m,n)) + return A + +def dec_to_bin(x, num_bits): + assert x < 2**num_bits, "number of bits are not enough" + u = bin(x)[2:].zfill(num_bits) + u = list(u) + u = [int(i) for i in u] + return np.array(u) + +def bin_to_dec(x): + n = len(x) + c = 2**(np.arange(n)[::-1]) + return c.dot(x) + +def bool2int(x): + y = 0 + for i,j in enumerate(x): + y += j< 0 + + #print('num likely indices: {}'.format(sum(likely_indices))) + + locs = locs[likely_indices] + evals = evals[likely_indices] + + locs = pm_to_zo(locs) + + for loc in locs: + set_of_locs.add(zo_to_string(loc)) + + locs = [] + for loc in set_of_locs: + locs.append(string_to_zo(loc)) + return locs + + def get_run_lists(self): + A_list = [] + D_list = [] + M_list = [] + + for run_number in self.run_list: + A, D, R, _ = self.get_run(run_number) + M = results_to_measurements(R) + + A_list.append(A) + M_list.append(M) + D_list.append(D) + + self.A_list = A_list + self.M_list = M_list + self.D_list = D_list + + def initial_run(self, N=int(3e5)): + found_support = self.get_all_locations(use_sampling_matrix=True) + if np.size(found_support) == 0: + return False + else: + support = np.array(found_support) + reg = LinearRegression(fit_intercept=False) + reg = train_it(support, self.U_train, self.y_train, reg, N) + model = SparseWHTModel(np.array(support), reg.coef_) + self.model = model + return True + + def get_all_locations2(self, M_list): + """ + data_indices: which data runs to use to get locations + experiment_type: which experiment (ins/frame) + use_sampling_matrix: if set to True, then while finding the singletons, + we check if that found singleton would have hashed to + that bin where it was found. In the case of noise + the estimated location might be wrong hence this might be + false + """ + set_of_locs = set() + + # go over each stage + for M_dictionary, A in zip(M_list, self.A_list): + # the locations found at the stage + locations = [] + evaluations = [] + + # go through all the bins in the stage + for bin_index, bin_measurement in M_dictionary.items(): + location_hat = estimate_location(bin_measurement) + aliased_bin = bin_to_dec(location_to_bin(A, pm_to_zo(location_hat))) + + if aliased_bin == bin_index: + locations.append(location_hat) + evaluations.append(evaluate_location(location_hat)) + + evaluations = np.array(evaluations) + locations = np.array(locations) + + likely_indices = evaluations > 0 + + locations = locations[likely_indices] + locations = pm_to_zo(locations) + + for loc in locations: + set_of_locs.add(zo_to_string(loc)) + + locations = [] + for loc in set_of_locs: + locations.append(string_to_zo(loc)) + + return locations + + + def peel_once(self): + """ + Peels all of the support once from the measurements + model: the model that holds the support and the values + A_list: sampling matrix list + M_list: measurement matrices + D_list: delays + """ + + # initialize the list of dictionaries to return + residual_measurements = [] + for i in range(len(self.A_list)): + residual_measurements.append(dict()) + + # go over the support + for s in self.model.support: + # this is the coefficient + v = self.model.get_coef(s)*(2**10) + + stage = 0 + # go over each stage + for A, M, D in zip(self.A_list, self.M_list, self.D_list): + # the bin where the support goes + found_bin_binary = location_to_bin(A, s) + found_bin_decimal = int(bin_to_dec(found_bin_binary)) + + # if recovered_bin_decimal == 0: + # ipdb.set_trace() + + # the signature that the location generates + signature = get_signature(s, np.array(D)) + q = v*signature + + # the residual after we peel the support + residual = M[:, found_bin_decimal] - q + + residual_measurements[stage][found_bin_decimal] = residual + + stage += 1 + return residual_measurements + + + def peel_rest(self, num_iter_upper_bound=5, N=int(3e5)): + self.get_run_lists() + + is_done = False + + counter = 0 + + # this contains the singletons recovered in each new round + diff_sets = [] + old_locations_set = support_to_set(self.model.support) + diff_sets.append(old_locations_set) + + while not is_done: + #print('-----') + #print('running: {}'.format(counter)) + + residual_measurements = self.peel_once() + new_locations = self.get_all_locations2(residual_measurements) + + if not new_locations: + is_done = True + else: + # these are the locations found from the residual measurements + new_locations_set = support_to_set(new_locations) + + + # these are the locations that had been used to create the + # residual ameasurements + old_locations_set = support_to_set(self.model.support) + + # lets see if we have found anything new from the peeling process + diff_set = new_locations_set.difference(old_locations_set) + + # append the set of newly found singletons + diff_sets.append(diff_set) + + #print('number of new locations: {}'.format(len(diff_set))) + + + combined_support_set = old_locations_set | new_locations_set + support = set_to_support(combined_support_set) + + #print('train the system') + reg = LinearRegression(fit_intercept=False) + reg = train_it(support, self.U_train, self.y_train, reg, N) + + self.model = SparseWHTModel(np.array(support), reg.coef_) + + counter += 1 + + if counter >= num_iter_upper_bound: + is_done = True + if not diff_set: + is_done = True + \ No newline at end of file diff --git a/wht-sampling.ipynb b/wht-sampling.ipynb new file mode 100644 index 0000000..36a3b59 --- /dev/null +++ b/wht-sampling.ipynb @@ -0,0 +1,313 @@ +{ + "cells": [ + { + "cell_type": "code", + "execution_count": 23, + "metadata": {}, + "outputs": [], + "source": [ + "import numpy as np\n", + "import pickle\n" + ] + }, + { + "cell_type": "code", + "execution_count": 24, + "metadata": {}, + "outputs": [], + "source": [ + "def random_binary_matrix(m, n, p=0.5):\n", + " A = np.random.binomial(1,p,size=(m,n))\n", + " return A\n", + "\n", + "def dec_to_bin(x, num_bits):\n", + " assert x < 2**num_bits, \"number of bits are not enough\"\n", + " u = bin(x)[2:].zfill(num_bits)\n", + " u = list(u)\n", + " u = [int(i) for i in u]\n", + " return np.array(u)\n", + "\n", + "def get_sampling_index(x, A, p=0):\n", + " \"\"\"\n", + " x: sampling index\n", + " A: subsampling matrix\n", + " p: delay\n", + " \"\"\"\n", + " num_bits = A.shape[0]\n", + " x = dec_to_bin(x, num_bits)\n", + " r = x.dot(A) + p\n", + " return r % 2\n", + "\n", + "def get_random_binary_string(num_bits, p=0.5):\n", + " a = np.random.binomial(1,p,size=num_bits)\n", + " return a\n", + "\n", + "def random_delay_pair(num_bits, target_bit):\n", + " \"\"\"\n", + " num_bits: number of bits\n", + " location_target: the targeted location (q in equation 26 in https://arxiv.org/pdf/1508.06336.pdf)\n", + " \"\"\"\n", + " e_q = 2**target_bit\n", + " e_q = dec_to_bin(e_q, num_bits)\n", + " \n", + " random_seed = get_random_binary_string(num_bits)\n", + " \n", + " return random_seed, (random_seed+e_q)%2\n", + "\n", + "def make_delay_pairs(num_pairs, num_bits):\n", + " z = []\n", + " # this is the all zeros for finding the sign\n", + " # actually we do not need this here because we solve\n", + " # a linear system to find the value of the coefficient\n", + " # after the location is found -- however, i am going to\n", + " # keep this here not to have to change the rest of the code\n", + " # that takes delays of this form\n", + " z.append(dec_to_bin(0,num_bits))\n", + " # go over recovering each bit, we need to recover bits 0 to num_bits-1\n", + " for bit_index in range(0, num_bits):\n", + " # we have num_pairs many pairs to do majority decoding\n", + " for pair_idx in range(num_pairs):\n", + " a,b = random_delay_pair(num_bits, bit_index)\n", + " z.append(a)\n", + " z.append(b)\n", + " return z" + ] + }, + { + "cell_type": "code", + "execution_count": 25, + "metadata": {}, + "outputs": [], + "source": [ + "# the sparsity we target is around K = 2**m\n", + "m = 4\n", + "\n", + "# this is the signal length N = 2**n\n", + "n = 13\n", + "\n", + "# num delays per single bit of the location index\n", + "# (the larger this number the more tolerant to noise we are)\n", + "# so one needs to play around with this a bit\n", + "d = 5\n" + ] + }, + { + "cell_type": "code", + "execution_count": 26, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "target K around: 32\n" + ] + } + ], + "source": [ + "print('target K around: {}'.format(int((3*2**m)//1.5)))" + ] + }, + { + "cell_type": "code", + "execution_count": 27, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "total samples: 2288\n", + "samples/ambient dimension: 0.279296875\n" + ] + } + ], + "source": [ + "# total number of samples from the signal\n", + "# from this you can calculate the time necessary\n", + "# you can adjust d accordingly to tune the time necessary\n", + "# the larger d is better, but then it takes more time too\n", + "total_samples = (2**m)*n*(d*2+1)\n", + "print('total samples: {}'.format(total_samples))\n", + "\n", + "print('samples/ambient dimension: {}'.format(total_samples/(2**n)))" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "We need to run the code below 3 times and save as separate matrices" + ] + }, + { + "cell_type": "code", + "execution_count": 28, + "metadata": {}, + "outputs": [], + "source": [ + "A = random_binary_matrix(m, n)\n", + "\n", + "sampling_locations_base = []\n", + "\n", + "for i in range(2**A.shape[0]):\n", + " sampling_locations_base.append(get_sampling_index(i,A))\n", + "sampling_locations_base = np.array(sampling_locations_base)\n", + "\n", + "delays = make_delay_pairs(d, A.shape[1])\n", + "# delays = np.array(delays).shape" + ] + }, + { + "cell_type": "code", + "execution_count": 29, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "[[0 0 0 0 0 0 0 0 0 0 0 0 0]\n", + " [1 0 1 1 0 0 1 1 0 1 1 1 0]\n", + " [0 0 1 1 0 1 0 0 0 0 0 1 1]\n", + " [1 0 0 0 0 1 1 1 0 1 1 0 1]\n", + " [1 1 1 0 0 0 1 1 1 1 1 0 0]\n", + " [0 1 0 1 0 0 0 0 1 0 0 1 0]\n", + " [1 1 0 1 0 1 1 1 1 1 1 1 1]\n", + " [0 1 1 0 0 1 0 0 1 0 0 0 1]\n", + " [1 0 0 0 0 0 0 1 1 0 1 1 0]\n", + " [0 0 1 1 0 0 1 0 1 1 0 0 0]\n", + " [1 0 1 1 0 1 0 1 1 0 1 0 1]\n", + " [0 0 0 0 0 1 1 0 1 1 0 1 1]\n", + " [0 1 1 0 0 0 1 0 0 1 0 1 0]\n", + " [1 1 0 1 0 0 0 1 0 0 1 0 0]\n", + " [0 1 0 1 0 1 1 0 0 1 0 0 1]\n", + " [1 1 1 0 0 1 0 1 0 0 1 1 1]]\n" + ] + } + ], + "source": [ + "# example without the delay\n", + "print(sampling_locations_base)" + ] + }, + { + "cell_type": "code", + "execution_count": 30, + "metadata": { + "scrolled": true + }, + "outputs": [], + "source": [ + "all_sampling_locations = []\n", + "\n", + "for current_delay in delays:\n", + " new_sampling_locations = (sampling_locations_base + current_delay) % 2\n", + " all_sampling_locations.append(new_sampling_locations)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "This is a list of all matrices of all sampling locations necessary" + ] + }, + { + "cell_type": "code", + "execution_count": 31, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "[[0 1 0 1 1 0 1 0 0 0 0 0 0]\n", + " [1 1 1 0 1 0 0 1 0 1 1 1 0]\n", + " [0 1 1 0 1 1 1 0 0 0 0 1 1]\n", + " [1 1 0 1 1 1 0 1 0 1 1 0 1]\n", + " [1 0 1 1 1 0 0 1 1 1 1 0 0]\n", + " [0 0 0 0 1 0 1 0 1 0 0 1 0]\n", + " [1 0 0 0 1 1 0 1 1 1 1 1 1]\n", + " [0 0 1 1 1 1 1 0 1 0 0 0 1]\n", + " [1 1 0 1 1 0 1 1 1 0 1 1 0]\n", + " [0 1 1 0 1 0 0 0 1 1 0 0 0]\n", + " [1 1 1 0 1 1 1 1 1 0 1 0 1]\n", + " [0 1 0 1 1 1 0 0 1 1 0 1 1]\n", + " [0 0 1 1 1 0 0 0 0 1 0 1 0]\n", + " [1 0 0 0 1 0 1 1 0 0 1 0 0]\n", + " [0 0 0 0 1 1 0 0 0 1 0 0 1]\n", + " [1 0 1 1 1 1 1 1 0 0 1 1 1]]\n" + ] + } + ], + "source": [ + "# example with the delay\n", + "print(all_sampling_locations[1])" + ] + }, + { + "cell_type": "code", + "execution_count": 32, + "metadata": {}, + "outputs": [], + "source": [ + "# change this to change the output file names\n", + "run_number = 1\n" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Save the matrix and the delays used to generate the sampling locations because they will be necessary for the algorithm " + ] + }, + { + "cell_type": "code", + "execution_count": 33, + "metadata": {}, + "outputs": [], + "source": [ + "pickle.dump(A, open( \"N13-m4-d5/sampling-matrix-{}.p\".format(run_number), \"wb\" ) )\n", + "pickle.dump(delays, open( \"N13-m4-d5/delays-{}.p\".format(run_number), \"wb\" ) )\n", + "pickle.dump(all_sampling_locations, open( \"N13-m4-d5/sampling-locations-{}.p\".format(run_number), \"wb\" ) )\n" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [] + } + ], + "metadata": { + "kernelspec": { + "display_name": "Python 3", + "language": "python", + "name": "python3" + }, + "language_info": { + "codemirror_mode": { + "name": "ipython", + "version": 3 + }, + "file_extension": ".py", + "mimetype": "text/x-python", + "name": "python", + "nbconvert_exporter": "python", + "pygments_lexer": "ipython3", + "version": "3.7.5" + } + }, + "nbformat": 4, + "nbformat_minor": 2 +}