{ "cells": [ { "cell_type": "markdown", "metadata": {}, "source": [ "# Todo list:\n", "- Figure out a way to determine the MIN_DISTANCE dynamically\n", " - Look that the TARGET_S is covered for at least 80% or so with datapoints? (with a max for when there are no matches)\n", "- Find the best way to plot (for ourselves) the comparison \n", "- Make the code for the data cleanup nice\n", "- Make some more example edits and document the edits\n", "- Investigate logo removal options?\n", "- GOAL: Provide clear decision\n", "\n", "# Ordered TODO list:\n", "1. Make some more example edits and document the edits\n", "\n" ] }, { "cell_type": "code", "execution_count": 1, "metadata": {}, "outputs": [ { "name": "stderr", "output_type": "stream", "text": [ "DEBUG:urllib3.connectionpool:Starting new HTTPS connection (1): api.ipify.org:443\n", "DEBUG:urllib3.connectionpool:Starting new HTTPS connection (1): api.gradio.app:443\n", "DEBUG:urllib3.connectionpool:https://api.gradio.app:443 \"POST /gradio-initiated-analytics/ HTTP/1.1\" 200 31\n", "DEBUG:urllib3.connectionpool:Starting new HTTPS connection (1): api.gradio.app:443\n", "DEBUG:urllib3.connectionpool:https://api.gradio.app:443 \"GET /pkg-version HTTP/1.1\" 200 20\n", "DEBUG:asyncio:Using selector: KqueueSelector\n" ] }, { "name": "stdout", "output_type": "stream", "text": [ "Caching examples at: '/Users/pshouche/videomatch/videomatch/gradio_cached_examples/13/log.csv'\n" ] }, { "name": "stderr", "output_type": "stream", "text": [ "INFO:root:Downloaded video from https://www.dropbox.com/s/8c89a9aba0w8gjg/Ploumen.mp4?dl=1 to /var/folders/w6/9kh8n81x3z9097k63m9r40h40000gp/T/75ae859c16eff3f4d876a8aa4a06533c.\n", "WARNING:py.warnings:/Users/pshouche/opt/anaconda3/lib/python3.9/site-packages/moviepy/video/io/ffmpeg_reader.py:123: UserWarning: Warning: in file /var/folders/w6/9kh8n81x3z9097k63m9r40h40000gp/T/75ae859c16eff3f4d876a8aa4a06533c, 2764800 bytes wanted but 0 bytes read,at frame 750/3751, at time 150.00/150.03 sec. Using the last valid frame instead.\n", " warnings.warn(\"Warning: in file %s, \"%(self.filename)+\n", "\n", "INFO:root:Computed hashes for (751, 32) frames.\n", "INFO:root:Indexed hashes for 751 frames to /var/folders/w6/9kh8n81x3z9097k63m9r40h40000gp/T/75ae859c16eff3f4d876a8aa4a06533c.index.\n", "INFO:root:Downloaded video from https://www.dropbox.com/s/rzmicviu1fe740t/Bram%20van%20Ojik%20krijgt%20reprimande.mp4?dl=1 to /var/folders/w6/9kh8n81x3z9097k63m9r40h40000gp/T/e295c0e13c21aa3e971921627e8c8b1a.\n", "WARNING:py.warnings:/Users/pshouche/opt/anaconda3/lib/python3.9/site-packages/moviepy/video/io/ffmpeg_reader.py:123: UserWarning: Warning: in file /var/folders/w6/9kh8n81x3z9097k63m9r40h40000gp/T/e295c0e13c21aa3e971921627e8c8b1a, 2764800 bytes wanted but 0 bytes read,at frame 181/907, at time 36.20/36.24 sec. Using the last valid frame instead.\n", " warnings.warn(\"Warning: in file %s, \"%(self.filename)+\n", "\n", "INFO:root:Computed hashes for (182, 32) frames.\n", "WARNING clustering 182 points to 16 centroids: please provide at least 624 training points\n", "INFO:root:Indexed hashes for 182 frames to /var/folders/w6/9kh8n81x3z9097k63m9r40h40000gp/T/e295c0e13c21aa3e971921627e8c8b1a.index.\n", "INFO:root:Downloaded video from https://www.dropbox.com/s/wcot34ldmb84071/Baudet%20ontmaskert%20Omtzigt_%20u%20bent%20door%20de%20mand%20gevallen%21.mp4?dl=1 to /var/folders/w6/9kh8n81x3z9097k63m9r40h40000gp/T/a9eba3d8ca5fcfa4797dcf7fd294a682.\n", "WARNING:py.warnings:/Users/pshouche/opt/anaconda3/lib/python3.9/site-packages/moviepy/video/io/ffmpeg_reader.py:123: UserWarning: Warning: in file /var/folders/w6/9kh8n81x3z9097k63m9r40h40000gp/T/a9eba3d8ca5fcfa4797dcf7fd294a682, 2764800 bytes wanted but 0 bytes read,at frame 1684/8573, at time 336.80/336.85 sec. Using the last valid frame instead.\n", " warnings.warn(\"Warning: in file %s, \"%(self.filename)+\n", "\n", "INFO:root:Computed hashes for (1685, 32) frames.\n", "INFO:root:Indexed hashes for 1685 frames to /var/folders/w6/9kh8n81x3z9097k63m9r40h40000gp/T/a9eba3d8ca5fcfa4797dcf7fd294a682.index.\n", "INFO:root:Downloaded video from https://www.dropbox.com/s/4ognq8lshcujk43/Plenaire_zaal_20200923132426_Omtzigt.mp4?dl=1 to /var/folders/w6/9kh8n81x3z9097k63m9r40h40000gp/T/95fc56d68e602bc591942581d1c98114.\n", "WARNING:py.warnings:/Users/pshouche/opt/anaconda3/lib/python3.9/site-packages/moviepy/video/io/ffmpeg_reader.py:123: UserWarning: Warning: in file /var/folders/w6/9kh8n81x3z9097k63m9r40h40000gp/T/95fc56d68e602bc591942581d1c98114, 2764800 bytes wanted but 0 bytes read,at frame 7470/37353, at time 1494.00/1494.11 sec. Using the last valid frame instead.\n", " warnings.warn(\"Warning: in file %s, \"%(self.filename)+\n", "\n", "INFO:root:Computed hashes for (7471, 32) frames.\n", "INFO:root:Indexed hashes for 7471 frames to /var/folders/w6/9kh8n81x3z9097k63m9r40h40000gp/T/95fc56d68e602bc591942581d1c98114.index.\n", "DEBUG:urllib3.connectionpool:Starting new HTTPS connection (1): api.ipify.org:443\n", "DEBUG:urllib3.connectionpool:https://api.ipify.org:443 \"GET / HTTP/1.1\" 200 14\n", "DEBUG:urllib3.connectionpool:Starting new HTTPS connection (1): api.gradio.app:443\n", "DEBUG:urllib3.connectionpool:https://api.gradio.app:443 \"POST /gradio-initiated-analytics/ HTTP/1.1\" 200 31\n", "DEBUG:urllib3.connectionpool:Starting new HTTPS connection (1): api.gradio.app:443\n", "DEBUG:urllib3.connectionpool:https://api.gradio.app:443 \"GET /pkg-version HTTP/1.1\" 200 20\n", "DEBUG:urllib3.connectionpool:Starting new HTTPS connection (1): api.ipify.org:443\n", "DEBUG:urllib3.connectionpool:https://api.ipify.org:443 \"GET / HTTP/1.1\" 200 14\n" ] } ], "source": [ "from app import *" ] }, { "cell_type": "code", "execution_count": 21, "metadata": {}, "outputs": [ { "name": "stderr", "output_type": "stream", "text": [ "INFO:root:Skipping downloading from https://www.dropbox.com/s/8c89a9aba0w8gjg/Ploumen.mp4?dl=1 because /var/folders/w6/9kh8n81x3z9097k63m9r40h40000gp/T/75ae859c16eff3f4d876a8aa4a06533c already exists.\n", "INFO:root:Loading indexed hashes from /var/folders/w6/9kh8n81x3z9097k63m9r40h40000gp/T/75ae859c16eff3f4d876a8aa4a06533c.index\n", "INFO:root:Index /var/folders/w6/9kh8n81x3z9097k63m9r40h40000gp/T/75ae859c16eff3f4d876a8aa4a06533c.index has in total 751 frames\n", "INFO:root:Skipping downloading from https://www.dropbox.com/s/4ognq8lshcujk43/Plenaire_zaal_20200923132426_Omtzigt.mp4?dl=1 because /var/folders/w6/9kh8n81x3z9097k63m9r40h40000gp/T/95fc56d68e602bc591942581d1c98114 already exists.\n", "INFO:root:Loading indexed hashes from /var/folders/w6/9kh8n81x3z9097k63m9r40h40000gp/T/95fc56d68e602bc591942581d1c98114.index\n", "INFO:root:Index /var/folders/w6/9kh8n81x3z9097k63m9r40h40000gp/T/95fc56d68e602bc591942581d1c98114.index has in total 7471 frames\n", "WARNING:py.warnings:/Users/pshouche/opt/anaconda3/lib/python3.9/site-packages/seaborn/relational.py:654: FutureWarning: elementwise comparison failed; returning scalar instead, but in the future will perform elementwise comparison\n", " kws[\"alpha\"] = 1 if self.alpha == \"auto\" else self.alpha\n", "\n" ] }, { "data": { "image/png": "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", "text/plain": [ "
" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "target = video_urls[-1:] # (Plenaire Zaal) Long video\n", "\n", "url = video_urls[0] # (0: Ploumen) (1: Bram) (2: Baudet) Short video which is a (maybe mixed up) subset of the soure video\n", "# url = move_video_to_tempdir(\"videos\", \"removed_part.mp4\") # Set is_file to TRUE if using a file instead of a url\n", "\n", "x = compare_videos(url, target[0], MIN_DISTANCE=3)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "# From here on out code experimentation" ] }, { "cell_type": "code", "execution_count": 22, "metadata": {}, "outputs": [ { "name": "stderr", "output_type": "stream", "text": [ "INFO:root:Skipping copying from videos/Ploumen_CO_5.0s_to_10.0_at_15.0.mp4 because /var/folders/w6/9kh8n81x3z9097k63m9r40h40000gp/T/Ploumen_CO_5.0s_to_10.0_at_15.0.mp4 already exists.\n", "INFO:root:Loading indexed hashes from /var/folders/w6/9kh8n81x3z9097k63m9r40h40000gp/T/Ploumen_CO_5.0s_to_10.0_at_15.0.mp4.index\n", "INFO:root:Index /var/folders/w6/9kh8n81x3z9097k63m9r40h40000gp/T/Ploumen_CO_5.0s_to_10.0_at_15.0.mp4.index has in total 751 frames\n", "INFO:root:Skipping downloading from https://www.dropbox.com/s/4ognq8lshcujk43/Plenaire_zaal_20200923132426_Omtzigt.mp4?dl=1 because /var/folders/w6/9kh8n81x3z9097k63m9r40h40000gp/T/95fc56d68e602bc591942581d1c98114 already exists.\n", "INFO:root:Loading indexed hashes from /var/folders/w6/9kh8n81x3z9097k63m9r40h40000gp/T/95fc56d68e602bc591942581d1c98114.index\n", "INFO:root:Index /var/folders/w6/9kh8n81x3z9097k63m9r40h40000gp/T/95fc56d68e602bc591942581d1c98114.index has in total 7471 frames\n" ] }, { "name": "stdout", "output_type": "stream", "text": [ "https://www.dropbox.com/s/4ognq8lshcujk43/Plenaire_zaal_20200923132426_Omtzigt.mp4?dl=1\n" ] } ], "source": [ "MIN_DISTANCE = 4 # Distance always increases by 2: 0, 2, 4 .. \n", "\n", "# Url (short video) \n", "url = move_video_to_tempdir(\"videos\", \"Ploumen_CO_5.0s_to_10.0_at_15.0.mp4\")\n", "#url = video_urls[2] # (0: Ploumen) (1: Bram) (2: Baudet) Short video which is a (maybe mixed up) subset of the soure video\n", "\n", "if url.endswith('dl=1'):\n", " IS_FILE = False\n", "elif url.endswith('.mp4'):\n", " IS_FILE = True\n", "\n", "#print(IS_FILE)\n", "video_index = index_hashes_for_video(url, is_file = IS_FILE)\n", "video_index.make_direct_map() # Make sure the index is indexable\n", "hash_vectors = np.array([video_index.reconstruct(i) for i in range(video_index.ntotal)]) # Retrieve original indices\n", "\n", "# Target video (long video)\n", "target_indices = [index_hashes_for_video(x) for x in [target][0]]\n", "\n", "# The results are returned as a triplet of 1D arrays \n", "# lims, D, I, where result for query i is in I[lims[i]:lims[i+1]] \n", "# (indices of neighbors), D[lims[i]:lims[i+1]] (distances).\n", "lims, D, I = target_indices[0].range_search(hash_vectors, MIN_DISTANCE)" ] }, { "cell_type": "code", "execution_count": 23, "metadata": {}, "outputs": [ { "name": "stderr", "output_type": "stream", "text": [ "WARNING:py.warnings:/Users/pshouche/opt/anaconda3/lib/python3.9/site-packages/seaborn/relational.py:654: FutureWarning: elementwise comparison failed; returning scalar instead, but in the future will perform elementwise comparison\n", " kws[\"alpha\"] = 1 if self.alpha == \"auto\" else self.alpha\n", "\n" ] }, { "data": { "image/png": "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4Qy/+c1vmDZtGuPGjaszUr9s2bJ67T4vpI4dO/LSSy9x++23k5iYyNixYykvL2fKlCl4PJ42y6VQKHj44YfZvn0706dP5/7772/T/xSnhOPnKD7DlgnHzxAu7c9RDCo3YPXq1XzzzTd1RuqHDx9OVlZWm2VyOp28/fbbDB48uM6x07Vr1zJv3jxyc3PbLNspdrudZ555hi1btoRamLalcPscxWfYcuH2GcKl/TmKgiCcdw6HA71e39YxhF9BfIaXhpZ+juJK5Ub87W9/a9ayC+1iyHXqH2C45TrbsgspHDOdmUF8hk27GHK19HMUBaERp4/Un23ZhSZytUw45grHTI1lELkadynmEoeMGhEIBLBarcjlcqKiotp0jpLTiVyCILQWsYdwhoqKCh555BEGDRrE5MmT+e1vf8vgwYOZNm0aRUVFItdFkku4+B04cIAJEyYwePBgnnzySex2e+i+3/72tyJXK+QSewhnmDp1KpMmTWL8+PGhX7mBQIAVK1bw0UcfsWjRIpHrIsg1c+bMs97fFufYh2MmCN9ct9xyC3/605/o2rUrr732Grt27eKDDz5Ar9czceLEBq/MFbl+XS6xh3CGiooKJkyYUOeQh0KhICcnh5qaGpHrIsnVv39/Vq9eTZ8+fRg0aFC9PyJT+Odyu91cddVVREdH849//IPBgwczffp0fD5fm2W61HOJC9POkJaWxoIFC8jJycFsNgNQVlZGbm4uaWlpItdFkmvy5MkUFBRw4sQJHnvssTbLcbpwzAThm8tgMLBhwwauueYaZDIZf/3rX3n00Ud58MEHcblcIldr5GphU55LXk1NjfTMM89II0aMkHr27Cn16NFDGjFihPTMM89IVVVVItdFkkuSJMnj8UgbN25s0wxnCsdMkhSeuY4cOSLdeuut0hdffBFa5vf7peeee07q3r27yNUKucQYgiAIFx2r1RqaTyicXOy5xCGjM7hcLubPn8/q1aspKSlBLpcTHx9PZmYmf/rTnxpsUSdyhW+uVatWUVpaGha5wjFTuOd68803+fLLLxvM1VYu5VxiD+EMf/zjH+nRowc33HBDnWPiX3zxBdu3b2fBggUi10Wca8mSJWzbtq1NcoVjposxV7j+27okcrXCoayL2tixYxu97/rrr7+ASeoSuVomHHOFYyZJErla6lLOJU47PUNMTAxffvklwWAw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qfPF15jTJw/btGkTM2bMAGq/4JcvXw7AN998w+7du/nss88AGj0ePnnyZJ5++mnuvvtuPv/8c2688Ubk8l9+u23bto0uXbqQkZEBwM0338wrr7wSeo6CggJuueWW0ONramqoqqpiw4YNfPjhh8hkMtRqNbfccgv/93//x3333Vfn+Y8dO0a7du3qvb5///vfdZZNnTr1rO/JhAkTePLJJ7nvvvvIzc1l4sSJZ338nXfeyeTJk9m6dStbt25lwYIFLFiwgM8++wyj0QhAamoqeXl5Z92OcO5EQRDaxOnzszd0WX0wGESSJD766CN0Oh1QO3iq0WjOul2VShX68pTJZA0+JjIyktzcXLZv386WLVv405/+xN13300wGKy3jiRJ+P1+ZDIZp1+y4/P56jzu9GPjSqWyznaOHz9OdHQ0wWCQ1157jU6dOgG1X9QNZRwwYAB+v59du3axfPlyPv7443qPOT3L6b/kg8EgEyZMCBWkYDCIxWLBZDLVe33BYLDBqQ5kMhnBYLDe8pbq3bs3gUCA/fv3s3LlSj744AO++uqrBh+7bds2duzYwT333MO1117Ltddey5///GfGjx/Pd999R1ZWFlD7+SoUil+dTWiYOGQkhCWDwUDfvn1Dh1Rqamq49dZbWbdu3a/e9tdff83vf/97+vXrx4MPPsjEiRPZs2cPQ4YMYePGjRw/fhyAzZs3U1xcTJ8+fYiOjmbv3r1IkoTdbufrr79udPtDhgwJnWFjs9m44447yM/PZ9iwYbz//vtIkoTX62X69On897//bXAbkydP5tlnn6Vr164kJSXVuW/gwIEcOXKEAwcOALB48eLQfcOGDWPFihVYLBYAPvzwQ+64447Qff/9739Dz//JJ58wdOjQes+dnp4eeg9+rQkTJjB79mzS09OJiopq9HExMTG89dZb/Pjjj6FlZWVl2O12unTpElp24sQJ0tPTz0s2oT6xhyCErZdffplnn32W7OxsvF4v48ePJycn51dvNzMzkw0bNjB+/HgiIiIwmUw8++yzpKam8ve//50HHniAQCCAVqvlX//6F0ajkZycHL799ltGjx5NQkICgwYNorGL/J966in+8Y9/kJ2djSRJ3H///fTs2ZMnn3yS559/nuzsbHw+H0OHDuWee+5pcBsTJ07klVdeCR0KOl1MTAwvv/wyjz32GCqVioEDB4buGzZsGPfeey933XUXMpkMg8HAG2+8gUwmY9asWTz33HOh57/mmmsaHKS/7rrr+M9//hMazG2OMweVT8nJyeHVV1/lzTffrLfO6YPK6enpzJ8/n7lz51JSUoJGo8FoNDJ79mw6duwI1J6J9NNPP102Z5W1BTF1hSAI9fztb39jyJAhZx2vudAWL17M4cOHxWmnrUgcMhIEoZ4ZM2bw6aefhs2FYA6Hg+XLl/Pggw+2dZRLmthDEARBEACxhyAIgiD8TBQEQRAEARAFQRAEQfiZKAiCIAgCIAqCIAiC8DNREARBEAQA/j/EyUs5e67o3QAAAABJRU5ErkJggg==", "text/plain": [ "
" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "def plot_comparison(lims, D, I, hash_vectors, MIN_DISTANCE = 3):\n", " sns.set_theme()\n", "\n", " x = [(lims[i+1]-lims[i]) * [i] for i in range(hash_vectors.shape[0])]\n", " x = [i/FPS for j in x for i in j]\n", " y = [i/FPS for i in I]\n", " \n", " # Create figure and dataframe to plot with sns\n", " fig = plt.figure()\n", " # plt.tight_layout()\n", " df = pd.DataFrame(zip(x, y), columns = ['X', 'Y'])\n", " g = sns.scatterplot(data=df, x='X', y='Y', s=20*(1-(D/(MIN_DISTANCE+1))), alpha=1-D/MIN_DISTANCE)\n", "\n", " # Set x-labels to be more readable\n", " x_locs, x_labels = plt.xticks() # Get original locations and labels for x ticks\n", " x_labels = [time.strftime('%H:%M:%S', time.gmtime(x)) for x in x_locs]\n", " plt.xticks(x_locs, x_labels)\n", " plt.xticks(rotation=90)\n", " plt.xlabel('Time in source video (H:M:S)')\n", " plt.xlim(0, None)\n", "\n", " # Set y-labels to be more readable\n", " y_locs, y_labels = plt.yticks() # Get original locations and labels for x ticks\n", " y_labels = [time.strftime('%H:%M:%S', time.gmtime(y)) for y in y_locs]\n", " plt.yticks(y_locs, y_labels)\n", " plt.ylabel('Time in target video (H:M:S)')\n", "\n", " # Adjust padding to fit gradio\n", " plt.subplots_adjust(bottom=0.25, left=0.20)\n", " return fig \n", "\n", "_ = plot_comparison(lims, D, I, hash_vectors, MIN_DISTANCE = MIN_DISTANCE)" ] }, { "cell_type": "code", "execution_count": 6, "metadata": {}, "outputs": [ { "data": { "image/png": "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", "text/plain": [ "
" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "def plot_distances(D, MIN_DISTANCE = 3):\n", " sns.set_theme()\n", "\n", " # Create figure and dataframe to plot with sns\n", " fig = plt.figure()\n", " df = pd.DataFrame(D, columns = ['D'])\n", " df['D'] = df['D'].astype(int)\n", " \n", " # Countplot\n", " g = sns.countplot(data = df, x = 'D')\n", " # g = sns.barplot(x = np.arange(0, MIN_DISTANCE, step = 2), y = df['D'].value_counts())\n", " # g = sns.histplot(data=df, x='D', binwidth=1)\n", " \n", " # Proportion\n", " # g = sns.ecdfplot(data=df, x='D', complementary=False)\n", " # plt.xlim(0, MIN_DISTANCE)\n", " \n", " plt.subplots_adjust(bottom=0.25, left=0.20)\n", " return fig \n", "\n", "_ = plot_distances(D, MIN_DISTANCE = MIN_DISTANCE)" ] }, { "cell_type": "code", "execution_count": 24, "metadata": {}, "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", "
TARGET_SSOURCE_S
00.0487.800000
10.2488.100000
21.8489.800000
33.0491.000000
43.6491.400000
.........
417148.8636.600000
418149.0636.800000
419149.2637.200000
420149.4637.266667
421149.6637.333333
\n", "

422 rows × 2 columns

\n", "
" ], "text/plain": [ " TARGET_S SOURCE_S\n", "0 0.0 487.800000\n", "1 0.2 488.100000\n", "2 1.8 489.800000\n", "3 3.0 491.000000\n", "4 3.6 491.400000\n", ".. ... ...\n", "417 148.8 636.600000\n", "418 149.0 636.800000\n", "419 149.2 637.200000\n", "420 149.4 637.266667\n", "421 149.6 637.333333\n", "\n", "[422 rows x 2 columns]" ] }, "execution_count": 24, "metadata": {}, "output_type": "execute_result" } ], "source": [ "\n", "target = [(lims[i+1]-lims[i]) * [i] for i in range(hash_vectors.shape[0])]\n", "target_s = [i/FPS for j in target for i in j]\n", "source_s = [i/FPS for i in I]\n", "\n", "# Make df\n", "df = pd.DataFrame(zip(target_s, source_s), columns = ['TARGET_S', 'SOURCE_S'])\n", "df['TARGET_WEIGHT'] = 1 - D/MIN_DISTANCE # Higher value means a better match\n", "\n", "# Multiply the weight (which indicates a better match) with the value for Y\n", "# and aggregate to get a less noisy estimate of Y\n", "df['SOURCE_WEIGHTED_VALUE'] = df['SOURCE_S'] * df['TARGET_WEIGHT'] \n", "\n", "# Group by X so for every second/x there will be 1 value of Y in the end\n", "grouped_X = df.groupby('TARGET_S').agg({'SOURCE_WEIGHTED_VALUE' : 'sum', 'TARGET_WEIGHT' : 'sum'})\n", "grouped_X['FINAL_SOURCE_VALUE'] = grouped_X['SOURCE_WEIGHTED_VALUE'] / grouped_X['TARGET_WEIGHT'] \n", "\n", "# Remake the dataframe\n", "df_cleaned = grouped_X.reset_index()\n", "df_cleaned = df_cleaned.drop(columns=['SOURCE_WEIGHTED_VALUE', 'TARGET_WEIGHT'])\n", "df_cleaned = df_cleaned.rename({'FINAL_SOURCE_VALUE' : 'SOURCE_S'}, axis='columns')\n", "df = df_cleaned\n", "df" ] }, { "cell_type": "code", "execution_count": 25, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "" ] }, "execution_count": 25, "metadata": {}, "output_type": "execute_result" }, { "data": { "image/png": "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", "text/plain": [ "
" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "plt.scatter(x=df['TARGET_S'], y = df['SOURCE_S'])" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "# Try CUSUMDetector from KATS 101 on the 'averaged' data" ] }, { "cell_type": "code", "execution_count": 26, "metadata": {}, "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", "
TARGET_SSOURCE_S
00.0487.800000
10.2488.100000
21.8489.800000
33.0491.000000
43.6491.400000
.........
417148.8636.600000
418149.0636.800000
419149.2637.200000
420149.4637.266667
421149.6637.333333
\n", "

422 rows × 2 columns

\n", "
" ], "text/plain": [ " TARGET_S SOURCE_S\n", "0 0.0 487.800000\n", "1 0.2 488.100000\n", "2 1.8 489.800000\n", "3 3.0 491.000000\n", "4 3.6 491.400000\n", ".. ... ...\n", "417 148.8 636.600000\n", "418 149.0 636.800000\n", "419 149.2 637.200000\n", "420 149.4 637.266667\n", "421 149.6 637.333333\n", "\n", "[422 rows x 2 columns]" ] }, "execution_count": 26, "metadata": {}, "output_type": "execute_result" } ], "source": [ "# import packages\n", "from kats.detectors.cusum_detection import CUSUMDetector\n", "from kats.consts import TimeSeriesData\n", "\n", "df" ] }, { "cell_type": "code", "execution_count": 27, "metadata": {}, "outputs": [ { "name": "stderr", "output_type": "stream", "text": [ "DEBUG:root:Detecting increase changepoint.\n", "DEBUG:root:Detecting decrease changepoint.\n", "INFO:root:Max iteration reached and no stable changepoint found.\n", "WARNING:root:No change points detected!\n" ] }, { "data": { "image/png": "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", "text/plain": [ "
" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "df['time'] = pd.to_datetime(df[\"TARGET_S\"], unit='s') # Needs a datetime as input\n", "\n", "tsd = TimeSeriesData(df.loc[:,['time','SOURCE_S']])\n", "detector = CUSUMDetector(tsd)\n", "change_points = detector.detector() # Both directions are allowed\n", "\n", "detector.plot(change_points)\n", "plt.xticks(rotation=45)\n", "plt.show()" ] }, { "cell_type": "code", "execution_count": 28, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "1" ] }, "execution_count": 28, "metadata": {}, "output_type": "execute_result" } ], "source": [ "len(change_points)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "# Try KATS outlier detection :D" ] }, { "cell_type": "code", "execution_count": 29, "metadata": {}, "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", "
timeSOURCE_S
01970-01-01 00:00:00.000487.800000
11970-01-01 00:00:00.200488.100000
21970-01-01 00:00:01.800489.800000
31970-01-01 00:00:03.000491.000000
41970-01-01 00:00:03.600491.400000
.........
4171970-01-01 00:02:28.800636.600000
4181970-01-01 00:02:29.000636.800000
4191970-01-01 00:02:29.200637.200000
4201970-01-01 00:02:29.400637.266667
4211970-01-01 00:02:29.600637.333333
\n", "

422 rows × 2 columns

\n", "
" ], "text/plain": [ " time SOURCE_S\n", "0 1970-01-01 00:00:00.000 487.800000\n", "1 1970-01-01 00:00:00.200 488.100000\n", "2 1970-01-01 00:00:01.800 489.800000\n", "3 1970-01-01 00:00:03.000 491.000000\n", "4 1970-01-01 00:00:03.600 491.400000\n", ".. ... ...\n", "417 1970-01-01 00:02:28.800 636.600000\n", "418 1970-01-01 00:02:29.000 636.800000\n", "419 1970-01-01 00:02:29.200 637.200000\n", "420 1970-01-01 00:02:29.400 637.266667\n", "421 1970-01-01 00:02:29.600 637.333333\n", "\n", "[422 rows x 2 columns]" ] }, "execution_count": 29, "metadata": {}, "output_type": "execute_result" } ], "source": [ "tsd" ] }, { "cell_type": "code", "execution_count": 74, "metadata": {}, "outputs": [ { "name": "stderr", "output_type": "stream", "text": [ "INFO:root:Setting frequency to Daily since it cannot be inferred\n", "ERROR:root:!! Traceback (most recent call last):\n", "!! File \"/usr/local/lib/python3.9/site-packages/kats/detectors/outlier.py\", line 134, in detector\n", " outliers_index, output_scores, time_index = self.__clean_ts__(ts)\n", "!! File \"/usr/local/lib/python3.9/site-packages/kats/detectors/outlier.py\", line 95, in __clean_ts__\n", " result = seasonal_decompose(\n", "!! File \"/usr/local/lib/python3.9/site-packages/pandas/util/_decorators.py\", line 207, in wrapper\n", " return func(*args, **kwargs)\n", "!! File \"/usr/local/lib/python3.9/site-packages/statsmodels/tsa/seasonal.py\", line 143, in seasonal_decompose\n", " raise ValueError(\"You must specify a period or x must be a \"\n", "!! ValueError: You must specify a period or x must be a pandas object with a DatetimeIndex with a freq not set to None\n", "\n", "ERROR:root:Outlier Detection Failed\n" ] } ], "source": [ "from kats.detectors.outlier import OutlierDetector\n", "\n", "outlier_ts = OutlierDetector(tsd, 'additive') # call OutlierDetector\n", "outlier_ts.detector() # apply OutlierDetector" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "# Missing Values (and how to deal with them)" ] }, { "cell_type": "code", "execution_count": 78, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "0.20000000000000284 0.20000000000004547\n" ] }, { "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", "
TARGET_SSOURCE_S
00.0487.800000
10.2488.000000
20.4488.225000
30.6488.450000
40.8488.675000
.........
746149.2637.033333
747149.4637.266667
748149.6637.300000
749149.8633.500000
750150.0633.500000
\n", "

751 rows × 2 columns

\n", "
" ], "text/plain": [ " TARGET_S SOURCE_S\n", "0 0.0 487.800000\n", "1 0.2 488.000000\n", "2 0.4 488.225000\n", "3 0.6 488.450000\n", "4 0.8 488.675000\n", ".. ... ...\n", "746 149.2 637.033333\n", "747 149.4 637.266667\n", "748 149.6 637.300000\n", "749 149.8 633.500000\n", "750 150.0 633.500000\n", "\n", "[751 rows x 2 columns]" ] }, "execution_count": 78, "metadata": {}, "output_type": "execute_result" } ], "source": [ "if 'time' in df.columns:\n", " df = df.drop(columns='time')\n", "\n", "# 1. Identify missing x values (0.0, 0.2, 1.8 as detected, so 0.4 to 1.6 is missing)\n", "median_x_increase = np.median(df['TARGET_S'][1:] - df['TARGET_S'].shift(1)[1:])\n", "median_y_increase = np.median(df['SOURCE_S'][1:] - df['SOURCE_S'].shift(1)[1:])\n", "print(median_x_increase, median_y_increase) # 1/FPS\n", "rounded_x_inc = np.round(median_x_increase, 3)\n", "\n", "# Add NAN to \"missing\" x values\n", "# base it off hash vecotr, not target s\n", "step_size = 1/FPS\n", "x_complete = np.round(np.arange(start=0.0, stop = max(df['TARGET_S'])+step_size, step = step_size), 1)\n", "# x_complete = np.linspace(start = min(df['TARGET_S']), stop = max(df['TARGET_S']), num=int(max(df['TARGET_S']) * FPS))\n", "df['TARGET_S'] = np.round(df['TARGET_S'], 1)\n", "df_complete = pd.DataFrame(x_complete, columns=['TARGET_S'])\n", "\n", "# Merge dataframes to get NAN values \n", "df_merged = df_complete.merge(df, on='TARGET_S', how='left')\n", "df_merged\n" ] }, { "cell_type": "code", "execution_count": 79, "metadata": {}, "outputs": [], "source": [ "df_merged = df_merged.interpolate(method='linear', limit_direction='both', axis=0)\n", "df = df_merged" ] }, { "cell_type": "code", "execution_count": 80, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "" ] }, "execution_count": 80, "metadata": {}, "output_type": "execute_result" }, { "data": { "image/png": "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", "text/plain": [ "
" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "plt.scatter(x=df['TARGET_S'], y = df['SOURCE_S'])" ] }, { "cell_type": "code", "execution_count": 81, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "" ] }, "execution_count": 81, "metadata": {}, "output_type": "execute_result" }, { "data": { "image/png": "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", "text/plain": [ "
" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "df['TIMESHIFT'] = df['SOURCE_S'].shift(1) - df['SOURCE_S']\n", "sns.lineplot(data = df, x='TARGET_S', y='SOURCE_S')\n", "# plt.plot(x=df['X'], y = df['Y'])\n", "# sns.scatterplot()\n", "# df['Y-1'] \n", "# sns.scatterplot(df['Y-1'])" ] }, { "cell_type": "code", "execution_count": 82, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "" ] }, "execution_count": 82, "metadata": {}, "output_type": "execute_result" }, { "data": { "image/png": "iVBORw0KGgoAAAANSUhEUgAAAYcAAAEJCAYAAAB/pOvWAAAAOXRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjUuMiwgaHR0cHM6Ly9tYXRwbG90bGliLm9yZy8qNh9FAAAACXBIWXMAAAsTAAALEwEAmpwYAAA8L0lEQVR4nO3deUBU5f7H8fewg4ACDou4b7kj7qRCaOUWaUCmZFgurdeUNstrqV27mlp6LW9dS62f2U2tcEspyzRcSsWtFFcEEZBVgWEZhpnz+4PblKECOsMM8H39E5w5h/nMIfnMOWee56gURVEQQggh/sTG0gGEEEJYHykHIYQQlUg5CCGEqETKQQghRCVSDkIIISqRchBCCFGJlIMQQohK7Mz5w3ft2sX7779PcXExgwYNYvbs2cbH1q1bR1xcHGvXrgUgPT2dl19+mdzcXNq0acOSJUto1KhRtZ/r6tUiDIbqDdnw8nIlN1dTsxdTyySjaUhG05CMpmFNGW1sVHh43PxvrNnKITU1lTlz5rBx40a8vLyYOHEie/bsISQkhPPnz/Of//yHVq1aGdefN28eUVFRjBo1ihUrVvDvf/+bl19+udrPZzAo1S6H39e3dpLRNCSjaUhG06gLGcGMp5V27tzJyJEj8fX1xd7enqVLlxIQEEBZWRlvvPEG06dPN66r0+k4dOgQw4YNAyA8PJy4uDhzRRNCCFEFs5VDSkoKer2eyZMn8+CDD/L555/TuHFj3nnnHSIiImjevLlx3atXr+Lq6oqdXcWBjFqtJjMz01zRhBBCVMFsp5X0ej2HDx9m7dq1uLi48Oyzz7Jx40YyMjJ47bXX+OWXX4zr3mh6J5VKVaPn8/JyrdH6arVbjda3BMloGpLRNCSjadSFjGDGcmjatClBQUF4enoCMHToUI4ePcq5c+cYPXo0xcXF5OTkMGPGDBYvXoxGo0Gv12Nra0t2djbe3t41er7cXE21z+Wp1W5kZxfW+DXVJsloGpLRNCSjaVhTRhsb1S3fVJvttFJoaCh79+6loKAAvV5PfHw8vXr1YseOHWzevJn58+fTrVs3li1bhr29PX369GH79u0AbNq0ieDgYHNFE0IIUQWzlUNAQABTpkwhKiqKkSNH0qxZMyIiIm66/pw5c9iwYQMjR47k8OHDzJgxw1zRhBCizlMUBYMZ77igqi/3c5DTSrVPMpqGZDSNhpIxI7eIixkF/Hg0jaT0Ap4Z3Y0+nWp2Gh6qPq1k1kFwQgghTOd0ylXe3XCMcr2Cs6Mt9/dtQTv/xmZ5LikHIYSwcmU6PZv3XWTnoVS8GjvzzOiu+Hi64Ghva7bnlHIQQggrdj4tn1XfJJKZV8zAbr48HNoe90YOZn9eKQchhLBCunIDPyRc5uufkmjcyIGXxvWkS2vPWnt+KQchhLAyaTlFfLrjNOfT8mnp48oLj/TE3cX8Rwt/JuUghBBWokRbzjcHUoj75RJODrY8GdaF/l18ajxjhClIOQghhAXlFZRy6HQWx87lcPFKAWU6A4N6+PHwPe1wq+WjhT+TchBCCAvJvFrM7I9+QW9Q8G/aiLu7+RHU1YcOzZtYOpqUgxBCWILeYGDtt2fQGxSmPNCZoK6+Fjl9dDNSDkIIUYsURWHXkTTifkkht0DLA3e34u5ufpaOVYmUgxBC1JIynZ5P487w0/F0OjRvTNS9HQno0NTSsW5IykEIIWpBypVCPv30MMkZBYwKakV4cFurOo30V1IOQghhRuV6A9v2J/PNgRTcGzkw4+Ee9GhnnUcLfyblIIQQZnLiQi7//eEcmXnFBHX1Ydq4XpQWaS0dq1qkHIQQwsR05Xo27r7A94cv4+flYjxacHNxkHIQQoiG6HKWhpVbT3E5W8PQ3s0ZG9oeezuz3VfNbKQchBDCBEq05Wzee5HvD1/G1dmO6ZE9CGhv/dcWbkbKQQgh7tDZ1Gt8tPUkeQVaBgc0IyKkrUWnvjAFs5bDrl27eP/99ykuLmbQoEHMnj2b9evXs3btWlQqFd26dWPevHk4ODiQmJjI7Nmz0Wg09OnTh3nz5mFnJ90lhLBeeoOBbw+m8tWeC6gbOzPrsd5muzNbbTPbibDU1FTmzJnDv//9b7Zu3cqpU6f49NNPWbVqFV988QVbtmzBYDDw+eefA/Dyyy/z+uuv8+2336IoChs2bDBXNCGEuCOKopBwJps3Vh3ky90X6H2XN3Oe6FtvigHMeOSwc+dORo4cia+vLwBLly6lvLycDh064OpacVPrjh07kp6eTlpaGqWlpfTs2ROA8PBwli9fTlRUlLniCSHEbcm5VsLq7YmcvnQNX08XnnuoG706qq16QNvtMFs5pKSkYG9vz+TJk8nOziY0NJQZM2bg7+8PQF5eHuvWrWPBggVkZWWhVquN26rVajIzM80VTQghbktBcRlvrU1Aq9Pz2LC7CA7ww9am7n0SqTrMVg56vZ7Dhw+zdu1aXFxcePbZZ4mNjSU8PJzMzEymTJlCREQE/fv358iRI5W2r2kLe3m51mh9tdqtRutbgmQ0DcloGg05o6IopFwp5Ms9SRQWl7E05h7a3uYppLqwH8GM5dC0aVOCgoLw9Ky45+nQoUM5ceIEAQEBTJ06lQkTJjBp0iQAfHx8yMnJMW6bnZ2Nt7d3jZ4vN1eDwaBUa1212o3s7MIa/fzaJhlNQzKaRkPNmJZTxOb4JC5lasi6VgLA0N7NcXOwua3nsqb9aGOjuuWbarOVQ2hoKDNnzqSgoIBGjRoRHx9PUFAQkydPJiYmhtGjRxvX9ff3x9HRkYSEBHr37s2mTZsIDg42VzQhhKiWj7eeIiOviK6tPRk+oCXtmjWmubqRpWPVCrOVQ0BAAFOmTCEqKgqdTsfAgQPR6/Xk5OSwevVqVq9eDcCQIUOYPn06S5YsYfbs2RQVFdGlSxeio6PNFU0IIapUUFxGSmYh4cFteeDu1paOU+vMOpAgMjKSyMjI65b9firprzp16sSXX35pzjhCCFFtZy9dA6BTKw/LBrEQGWUmhGiwUq4UkpJZSEZuEdoyPVqdAV15xX+T0vNxtLeltW/duIBsalIOQogG6YeEy6zbeRYAezsbnB1scbC3xd7OBkd7W1p4uxIc0Aw72/r5UdWqSDkIIRqcq4VaNsUn0a6ZO1PDutC0iTM29WwQ252SchBCNCiFxWW8uGIfAPf1bYG3h4uFE1mnhnm8JIRosM5dzgfggbtb0bdTzcZTNSRSDkKIBuX85XzsbG0Iu7tNvZsPyZTktJIQol45cSGHY+dyUADFOGmCYvz6t4t5tPZzq5N3Z6tNUg5CiHrjSl4xy7/8FZUKGjnbYzwuUGH8WqVSMbCbr4US1h1SDkKIemPnoVRsbGDxM3fT2NXR0nHqNDmuEkLUCwVFZez7NYMBXX2lGExAykEIUS/s2H+RsnID9/dtYeko9YKcVhJC1GmaEh0fbzvFiQu59GjnRXN1ze7tIm5MykEIUWddLdTy7vpjZF4tJnJIB4K7y4VmU5FyEELUSVfyinnni2NoSnXEPBxAcN9WVnMjnfpAykEIUeckXylg6YbjAMyMCqS1r7uFE9U/Ug5CiDolMeUq7311gkZO9rw4rie+njI3kjlIOQgh6oyEM1n8Z8tJfDxceOGRnni4yUdWzUXKQQhhtRRFIetqCXkFpZy+dI1t+5Np6+/O9MgAXJ3tLR2vXjNrOezatYv333+f4uJiBg0axOzZs9m/fz8LFixAq9UyYsQIYmJiAEhMTGT27NloNBr69OnDvHnzsLOT7hKiocrILeL/4s5wJvWacVnvjmqmhHXB0d7WcsEaCLP99U1NTWXOnDls3LgRLy8vJk6cyJ49e5gzZw5r167Fz8+Pp556ij179hASEsLLL7/M/Pnz6dmzJ7NmzWLDhg1ERUWZK54QwkqV6w3s+DmFrfuTcbCzZdyQ9rTwdkXt4YyXu5PMpFpLzFYOO3fuZOTIkfj6VnzueOnSpaSkpNCqVStatKgYwRgWFkZcXBzt27entLSUnj17AhAeHs7y5culHIRoYC5na1i1LZGUzEL6dfZm/NAOMhWGhZitHFJSUrC3t2fy5MlkZ2cTGhpKhw4dUKvVxnW8vb3JzMwkKyvruuVqtZrMzExzRRNCWBm9wUDcL5fYFH8RFyc7nnuoG73vkhvxWFK1yqGgoAAbGxtcXV1JT0/n22+/pUuXLvTv3/+m2+j1eg4fPszatWtxcXHh2WefxdnZudJ6KpUK5Y9J169bXhNeXjUbMq9Wu9VofUuQjKYhGU3DXBlTMwtZ+t9jnEu9xsCAZjwT3uO2jxYa8n40tSrLISEhgaeffpply5bRrVs3xo4dS8eOHdm0aRNTpkwhLCzshts1bdqUoKAgPD09ARg6dChxcXHY2v5xISkrKwtvb298fHzIyckxLs/Ozsbbu2bvGnJzNRgMlUvmRtRqN6sfSSkZTUMymoY5MpZoy9l15DKb9ybj5GDL06O70q+zD2UlZWSXlFlFRlOzpow2NqpbvqmuclbWZcuW8cEHHzBw4EC2bduGt7c3q1ev5tNPP2XNmjU33S40NJS9e/dSUFCAXq8nPj6e4cOHc/HiRVJSUtDr9Wzbto3g4GD8/f1xdHQkISEBgE2bNhEcHHwbL1cIYe3K9Qa+/imJF1bs46s9SXRv68k/pvSnX2cfS0cTf1LlkUN+fj59+vQB4NChQ4SGhgLQpEkTdDrdTbcLCAhgypQpREVFodPpGDhwIOPHj6dt27ZMmzYNrVZLSEgIw4cPB2DJkiXMnj2boqIiunTpQnR0tClenxDCiuTml/Lhlt+4kFZAv87e3N+3JW2bydQX1qjKcvjzuf8jR47wyCOPGL8vLi6+5baRkZFERkZetywoKIgtW7ZUWrdTp058+eWXVQYWQtRNR89ms3p7InqDYjyFJKxXleXg6+vLDz/8QHFxMaWlpfTu3RuA7777jrZt25o9oBCibsvJL2HrvmTiT2TQyteNp0d3xcdD5kOydlWWw8yZM3n++efJzs5m7ty5ODg48M4777BhwwY+/fTT2sgohKiDDAaF7xMu8/VPFzAYFO7v24KIkHbY28kNKOuCKsuhbdu2bNu27bplDz30EFOnTsXdveJc4cGDB+nXr595Egoh6py0bA1rdpwmKb2AHu28eOz+u/Bq7GTpWKIGbmsQ3F9PJy1YsIDY2FiTBBJC1F3legPfHEhh2/5knB3teDKsC/27+MiUF3WQSUZI32gQmxCiYbmQns8nO06Tll3EgC4+jLu3A+4uDpaOJW6TScpB3hUI0XBpy/TExiex81AqTdwceT6yBz3bN7V0LHGHZE5sIcRtO5Wcxyc7TpOTX0pooD+R97TD2VH+rNQH8lsUQtRYUamO9bvOs/dEBj4ezsyMCuSulh6WjiVMSK45CCFqJOFMFp99d5bCYh0jBrRk9MA2OMjNd+odk5TDrWZnFULUD/kaLZ/tPEvCmWxaersy4+EAWvnWjRlGRc1VORrl3XffNX69b9++6x579tlnAXjttddMHEsIYS0URWHX4UvM/vgXjp/PJSKkLbMn9pFiqOeqLIf4+Hjj10uWLLnusfT0dNMnEkJYjcLiMlZuPcXS/x6lWdNGzJvUl1FBrbGzlVHO9V2Vp5X+fD3hr9cW5COsQtRPiqKw/7crrN91nhJtOROGd+KeHn7Y2Mi/+YaiRtccpAyEqP8y84r5NO40py9do71/Y6KH30VgFz+ruUmNqB01mrJbCFG/nbiQw4ebT2KjUhE9/C6CA5phI38DGqQqy+HKlSvMnz+/0tcAmZmZ5ksmhKg1pWXlbNx9gR+PpNHSx5XnI3rg6S4T5TVkVZbDo48+esOvAaKiokyfSAhRq04l57Fm+2nyCkq5v28LHgpui6OMW2jwqiyHv/3tb7WRQwhRy0q05Wz88Ty7j6Xj4+nCaxN60755Y0vHElaiWhekly9fTt++fQkKCgLglVdeoWXLllUWR3R0NLm5udjZVTzNm2++SXJyMitXrgQgODiYmTNnApCYmMjs2bPRaDT06dOHefPmGbcTQpiWoij8Z8tJfk3KZXi/lowZLKOcxfWq/Ov70UcfsW/fPsaMGWNcNmHCBN566y0aNWrEE088ccPtFEUhKSmJ3bt3G//Il5SUMHXqVOLi4nB3d2f8+PHs37+fu+++m5dffpn58+fTs2dPZs2axYYNG+S0lRAmdv5yPvtPXuHkxVyyr5USdW8H7u3TwtKxhBWqciTL1q1bWblyJS1btjQu69GjBytWrODrr7++6XZJSUmoVCqmTp3Kgw8+yGeffYZer8dgMFBSUkJ5eTnl5eU4OjqSlpZGaWkpPXv2BCA8PJy4uLg7f3VCCKDilp2b4pNY8FkCv5y6go+HC1PDujC0d3NLRxNWqsojB1tbWxo3rnwesmnTptja3vwwtKCggKCgIObOnUtpaSnR0dG0adOG6dOnM2LECJycnOjXrx+9evXi2LFjqNVq47ZqtbrGn4Ty8nKt0fpqtfUP/ZeMptHQM6Zna3jvq+P8diGXIX1a8HR4j9uaVruh70dTqQsZoZrXHMrKynBwcKi0rLy8/KbbBAYGEhgYCICLiwuRkZF8/vnnpKWl8eOPP+Lm5sZLL73EqlWr6NWrV6Xtazq+IjdXg8FQvdlh1Wo3qx/QIxlNoyFnzC8qY/2ucxxKzMLB3pZJIzszqIcfmoISNFaS0ZQkY83Y2Khu+aa6ytNK99xzD4sXL640jcaSJUsYMGDATbc7fPgwBw4cuG6b77//nqCgILy8vHBwcCA8PJyDBw/i4+NDTk6Ocd3s7Gy8vb2rfHFCiMoUReHnU1eY/dHPHD6dzdDezZk/pT+DevhZOpqoQ6o8cnjmmWd49tlnGTp0KAEBARgMBn799Vfatm3Le++9d9PtCgsLWb58OV988QU6nY7Y2FimTZvGzp07KS4uxtnZmV27dtG9e3f8/f1xdHQkISGB3r17s2nTJoKDg036QoVoKLb/nMJXe5Jo18ydSaM64+fVyNKRRB1UZTk4ODjw8ccfc/DgQU6ePIlKpeKJJ54wXjy+mdDQUI4fP86YMWMwGAxERUUxceJE4xGDvb093bt358knnwQqZnydPXs2RUVFdOnShejoaJO8QCEaimPnc9iVcJmTF/Po19mbJ8O6ykR54raplDu4jdv69et55JFHTJnntsk1h9onGU3DFBlTrhQy75NDNG3sRM8OTYkIaWfSUc4NZT+amzVlvONrDvHx8QwaNIiwsDAuX74MwIkTJwgPD2fp0qWmSyqEuG0X0vMBePXRXkTd21GmvxB3rMrTSosWLeL111/n8uXLfPjhh7Rr14533nmHhx56iFWrVtVGRiFEFdKyi3B2tMPDzdHSUUQ9UWU5GAwGhg0bBkBISAgHDx5k7dq1xo+pCiEsL7egFHUTJ5liX5hMtS5I/06lUrFmzRr8/f3NGkoIcXPxx9Mp1xsI7fXH6OaCojLcGzncYishaqZGwyQ9PDykGISwgILiMtZ9d5YjZ7PR/++DF13aeOLj4QJU3OvZv6l8ZFWYTpXlUFpayqlTp1AU5bqvf9e1a1ezBhRCwLe/XOLQ6Sy6t/XCy92R3cfSOZeaj4+HC4qikF+kw02OHIQJVVkOWq32uqm5//y1SqXihx9+ME8yIYTRqeSrtGvmTszYAHTlBnYfSyevsBSAS5kayvUG3F2kHITpVFkOu3btqo0cQoibMCgKaTlF3Pu/GVTt7Wxwd7Enr0DLmUtXefvzowD0aOdlyZiinqmyHNLT06/73tbWFnd3d5ydnc0WSgjxh2uFWsr1BtQef/yb83B3Iq+wlPNpFeMbpoV3p5lccxAmVGU5jBo1CpVKZbzOoCgKZWVl9OnTh3fffZemTZuaPaQQDVlGXjEA3k3+KAcvdycy84q5nF2El7sjgR3VN9tciNtSZTkcPXq00jKNRsOnn37KggULeOedd8wSTAgBvyblsnTDceztbGjbzN243NPNkVPJeaACf3XN7mUiRHXc1k2aXV1dee655xgxYoSp8whR7xUWl3EwMYtTyXm4uTgQMbQjbg43nsnmu4OXAIi8p911N+jxdHeitExPWnaRXGsQZnFb5fA7JycnU+UQokHIvFrMgrUJFBTraNrYicJiHXt/zWDO431p4X39EUBxqY7Tl64xYkBL7vvLfZ5b+bj+6eu6cWcxUbfcdjlkZWVxBxO6CtHgnE/LZ+WWkxgUeH1iH9r4uZNfVMYrH+xn/28ZPDKkw3XrH7+Qi96g0KtD5esJnVt74uRgS2mZnk4tPWrrJYgGpMpyWLNmTaVl165dY8eOHUydOtUsoYSoby5naVj42RHcGtnzwiMBtPatuH7QuJEDHVt6GD919GdHz2bT2NWBNn+61vBnr0/sw/m0fJk2Q5hFleVw9uzZ675XqVR4eHjwj3/8g/79+5stmBD1waXMQg4mZnHg5BWcHGx5c1I/3P4yWK1DiyZ8s+8i5XoDdrYV1x60Oj2/XswjqIsPNjeZTM/Pq5Hc5U2YTZXlsGDBgtrIIUSdZTAo6PQGtu5L5mJGAX5eLtzV0oPc/FK+3H0BBYVmXo0YP7RDpWKAinLQlRtIzymi5f+uH+z4OQVtmZ4BXX1r++UIAVTzmkNmZiYrV64kISEBlUpFYGAgU6dOxc/v1jcsj46OJjc3Fzu7iqd58803yc3N5f3336e4uJhBgwYxe/ZsAPbv38+CBQvQarWMGDGCmJiYO3xpQphPXkEp3x1KpY2fO5v2XiTzf2MRGrs6kJhylV1H0gBo4+fG06O7oW5y80GjHf93zeDY+RxsbW0oLSsn4Ww2HZo3pmOLJmZ/LULcSJXlkJGRwSOPPMKwYcOYPn06ZWVl/PLLLzz88MOsX7/+prO0KopCUlISu3fvNpZDamoqf/vb39i4cSNeXl5MnDiRPXv20L9/f2bNmsXatWvx8/PjqaeeYs+ePYSEhJj21QpRQ+V6Az8eTcPHwxl1E2f2HEvnwYFt2PHzJX44UnFnRAd7G1p4u+Ll7sS0iO5kXSsh+2oJHu5O+Hm6VHkfZx9PF1r5urEp/iKb4i8al0eEtDXraxPiVqosh2XLlvHCCy8wZswY47Jhw4bRtWtXli1bxuLFi2+4XVJSEiqViqlTp5Kbm8vYsWMpKytj5MiR+PpWHCovXboUR0dHTpw4QatWrWjRouLjemFhYcTFxUk5CIv7/Ptz7D5acRTgYG9Dmc6Am4s9B05eoVdHNUFdfWjn35gmrn/cgc3Hw8U4lXZ1qFQqnhndlbOp+TjY2+Bgb4u6iTPNvKr/M4QwtSrL4dSpU7z99tuVlkdERLBy5cqbbldQUEBQUBBz586ltLSU6Oho9Ho9AwcOZPLkyWRnZxMaGsqMGTPIyspCrf7j43re3t5kZmbe5ksSwjQyrxaz+2gaIT2bceJCLlcLtQB8tScJgKG9/Onc2tMkz+Xt4YJ3DQpFCHOrshxuNZbhz3eJ+6vAwEDjrURdXFyIjIzkzJkzHDhwgLVr1+Li4sKzzz5LbGws9vb2lbav6e0OvbxqNoWAWm39A4cko2ncTkZNiY5lK3/GzlbFEw924+yla+w6fIl+XXxZvuEYLXzcGNS7ZZWnjMyZsbZJRtOoCxmhGuVga2tLZmYmPj4+1y3PzMy8ZTkcPnwYnU5HUFAQUFEyTZo0ISgoCE/PindbQ4cO5cSJE4wcOZKcnBzjtllZWXh7e9foheTmajAYqjcoT612Izu7sEY/v7ZJRtO43Yw7D6WSmVfMw/e0w1BWTntfV9o/0AWAD14MwdZGRW6uxqIZa5NkNA1rymhjo7rlm+obT+jyJ+PGjWPWrFloNH/8Q8jNzeWVV14hKirqptsVFhayaNEitFotGo2G2NhYQkND2bt3LwUFBej1euLj4+natSsBAQFcvHiRlJQU9Ho927ZtIzg4uIYvVQjTSUy5iq+nCyMGtKr0mKO9rXE8ghD1VZVHDuPHj+fSpUsMHjyY9u3bU15eTnJyMtHR0URERNx0u9DQUI4fP86YMWMwGAxERUXRr18/pkyZQlRUFDqdjoEDBxIREYGNjQ0LFy5k2rRpaLVaQkJCGD58uElfqBA1kZajMY5iFqIhUinVnCApMzOT48ePAxAQEFDpNJOlyWml2ldfMxaXljNt2U+MHtyGBwe2MVOyP9TX/VjbJGPN3PFpJai4XuDl5cX999/P3XffzfHjx0lOTjZVRiGsyvm0fBSgvX9jS0cRwmKqLIfz588zdOhQ4uPjKS0t5eGHH2bZsmVMmjSJffv21UZGIcwuJ7+Etd+eIedaCd8evISLox3tmkk5iIarymsOixYtYsaMGYSGhvLVV1+hKArffPMNmZmZxMTEMHDgwNrIKYTZGBSFj7ae4tzlfH7834C3Cfd3xNHB1sLJhLCcak2f8eCDDwLwyy+/cO+992JjY4Ofn991n2ASoq7afTSNc5fzGRXUioKiMpo2duKewBtPCyNEQ1FlOdjY/HHm6ejRo8aJ8gC0Wq15UglRS67kFfPf78/h6+nC6EFt5COqQvxPleXQuHFjTp8+jUajITs7m759+wJw5MgRq/vEkhDVZTAoZORVTI9hUBReiQqUYhDiT6oshxdeeIHHH38cjUbDSy+9hIuLC6tWreLDDz9kxYoVtZFRCJMpKC7j+8OpHDqdbZxmu/1fJs4TQlSjHHr27MlPP/1EaWkp7u4Vg4ICAwPZuHEjrVu3BiA5Odn4tRDW7L2vTpCUVkCnVh7c36c57o0cZLCbEDdQrZv9ODg4XDePUq9eva57PCYmhtjYWNMmE8KEdOUGMnKLuJBWwNjQ9gzv39LSkYSwatUqh6pUc5C1ELVKURQ+2vQr8cfSjNNtO9jZ0L+LXCsToiomKYeaTq8tRG24lKlhS3wSXVt7ENKzGXa2NtzVogkebnJ9QYiqmKQchLBGv5zKxNZGxVOju+HqXPmeIUKIm5NyEPWOtkzP+l3n2HMsnf7dfKUYhLgNUg6iXrmSV8y/Y38lLbuI+/q2YPKY7hQVllo6lhB1jknKQT7GKixFURT2HE/nzKVrZF0t4VJmIU4OtsSMDaBbWy9cnOylHIS4DXdUDvfccw+7d+9m6dKlpsojRLXpyg2s2Z7Iz6cy8XR3xM/ThaG9mzOsX0u56CzEHbqjcsjPzzdVDiFqpKhUx/tf/cqZ1GuEB7dlVFAr+dScECZ0R+Ug/xiFJWRfK2HZxuNkXyvhybAuDOjqa+lIQtQ7Zr0gHR0dTW5uLnZ2FU/z5ptvEhAQAMDbb7/N1atXWbhwIQCJiYnMnj0bjUZDnz59mDdvnnE7IX6XlF7A8i+PozcovPhIT+5q6WHpSELUS1X+9X366adv+lhZWdlNH1MUhaSkJHbv3l3pj/yBAweIjY3lnnvuMS57+eWXmT9/Pj179mTWrFls2LCBqKioarwE0RDoDQZ2/HyJzXsv4uHmSMzYAPy8Glk6lhD1VpXlMGzYsNt6LCkpCZVKxdSpU8nNzWXs2LFMmDCBa9eusXTpUp5++mlOnz4NQFpaGqWlpfTs2ROA8PBwli9fLuUgAEjPKeLjbadIvlJI307eTLi/I24uDlVvKIS4bVWWw0MPPXTTx/bs2XPTxwoKCggKCmLu3LmUlpYSHR1NmzZtWL9+PTExMWRkZBjXzcrKQq1WG79Xq9VkZmZW9zWIeqxEW84764+hKzfwzJhu9O3kbelIQjQId3RSPyYmhiNHjtzwscDAQAIDAwFwcXEhMjKSGTNmEB4eTlBQEF9//bVx3RtN3FfTi91eXq41Wl+tdqvR+pbQkDPqyg3sPZ5G7O7zXNNoWfJ8MB1v8/pCQ96PpiQZTaMuZIQ7LIdbzcZ6+PBhdDodQUFBxnW7devGvn37GD16NPn5+RQXF/PPf/6TiRMnkpOTY9w2Ozsbb++avUPMzdVgMFRvdli12o3s7MIa/fza1lAzlusNfHcolZ2HUskvKsPPy4Unw7ri4Wx3W8/VUPejqUlG07CmjDY2qlu+qTbbR1kLCwtZvnw5X3zxBTqdjtjYWObNm2c8mvj66685ePAgs2bNAsDR0ZGEhAR69+7Npk2bCA4OvpNooo65mFHA0XPZHD2XQ1p2Ed3aeDK5bwu6tPHERj4yLUStq7Icrl27dls/ODQ0lOPHjzNmzBgMBgNRUVHGYriRJUuWMHv2bIqKiujSpQvR0dG39byibjEYFN7/+leOnc9BpQJ1Y2eej+xBz/ZNLR1NiAZNpVRxp55OnTqhUqluel0gMTHRbOFqQk4r1T5TZPwh4TLrdp7lgbtbM7xfS1ycTDu2paHsR3OTjKZhTRnv+LTS7x83FcKUdOV6Nu6+wPeHL9Pa142HBreREfdCWJFqvU0zGAzs3LmThIQEVCoVvXr14t5778XW1tbc+UQ9lJ5TxH+2nCQ1S0NoL38eGtxWikEIK1NlOWi1WiZPnoxGoyEoKIiysjJWrFjBJ598wpo1a3BycqqNnKIe+H167S++P4eDvS3TI3sQINcWhLBKVZbDBx98QOfOnfn73/9uXKYoCv/4xz9YsWIFL774olkDivqhsLiM/4s7Q8LZbLq29mDyA11o4irTagthraoshx9//JENGzZct0ylUvHKK68QEREh5SBuSavTs/HH8/x8MhOtTs/Y0Pbc36+FfDxVCCtXZTkoioKjY+V3eE5OTtjY2JgllKgfFEUh9qckdh1Jo19nb8Lubo2/umYj2YUQllFlOZSVlaHVaisVhFarxWAwmC2YqJvK9Qb2nsgg+UohyRkFXMrS0OcuNU+P7mbpaEKIGqjyrX9oaCjLli2rtHzJkiXce++95sgk6iiDQWHN9tP837dnOHI2G5WNinFDO/DEyM6WjiaEqKEqjxyef/55nnjiCR555BH69OlDeXk5hw4dwsXFhdWrV9dGRlEHXM7WsGb7aS5mFDBmUBvCBraWj6cKUYdVWQ7Ozs6sW7eOHTt2cOzYMQCmTJnCsGHDZJyDQFOiY+u+ZHYduYyzox1PPdiVfp29pRiEqOOqNQjO1taWBx54gAceeOC65fv27WPgwIFmCSasm6Io7Nh/kTXbTlFaVs7gHn6Eh7TDXW7CI0S9UGU5/Pbbb8yfP58mTZrwz3/+E09PT9LT03nrrbeIj4/nxIkTtZFTWJESbTmfxp3mYGIWnVt5MP7eDjSXTyEJUa9UWQ7z5s1jxIgRpKen88EHHxAYGMjf//53evXqxebNm2sjo7AiadkaVsT+RubVYqJHdia4u6+MWRCiHqqyHAoLC5k0aRJ6vZ5hw4axY8cO5s+fz6hRo2ojn7AiP5+6wic7TuPkYMfL4wIZ3Kel1cwwKYQwrWpdkIaK6w5arZaPPvqIzp3lo4kNiVan58vdF/gh4TLtmzfmmdHd8HCTqS+EqM+qNUL6d56enlIMDUhxqY6fjmfw7cFL5BeVcV+fFjwc2g47WxkZL0R9V2U5GAwG8vPzURQFRVGMX/+uSZMm5swnLOTkxTxWb0/kaqGWDs0b8/TortzV0sPSsYQQtaTKcjh79iwDBgwwFkL//v2Nj1nTneCEafw+Ud6uI2n4ebkwO7oPbZu5WzqWEKKWmfVOcNHR0eTm5mJnV/E0b775JvHx8ezYsQOAkJAQXnnlFQD279/PggUL0Gq1jBgxgpiYmNt+XnF7TiXnsXLLSQqKddzftwXhwW1xsJeBjkI0RKa9Ye+fKIpCUlISu3fvNpbD/v372bt3L7GxsahUKqZMmcLOnTsZPHgws2bNYu3atfj5+fHUU0+xZ88eQkJCzBVP/ImmRMf2n1PYeSgVH08Xnn2oOx1bNLF0LCGEBZmtHJKSklCpVEydOpXc3FzGjh1L//79efXVV3FwqBhF265dO9LT0zlx4gStWrWiRYsWAISFhREXFyflYGaKovBLYib//f4cmmIdQd18ibq3Iy5OZvvfQghRR5jtr0BBQQFBQUHMnTuX0tJSoqOjadOmjXG6jeTkZLZv384XX3zBb7/9hlqtNm7r7e1NZmamuaIJIDe/lLXfneHEhVza+Lnx4iM9aenjZulYQggrYbZyCAwMJDAwEAAXFxciIyPZs2cPAwcO5Ny5czz11FPMnDmT1q1b8+uvv1bavqYTt3l51Wz6BrXa+v8QmiOj3qDwzd4k1u6o+CDB1NHdGDWoLbY2tzfKuaHuR1OTjKYhGU3HbOVw+PBhdDodQUFBQMUpDDs7OxISEnj++eeZNWuWcZS1j48POTk5xm2zsrLw9vau0fPl5mowGJSqV6Til2PtI3vNkTHrajH/2XKKixkFdG/rxWPDOtK0sTN5uRqryWhqktE0JKNpWFNGGxvVLd9Um200U2FhIYsWLUKr1aLRaIiNjWXIkCE899xzLFmy5LrpNwICArh48SIpKSno9Xq2bdtGcHCwuaI1SL9dzOWttQlkXS3myQe7MOPhHjRt7GzpWEIIK2W2I4fQ0FCOHz/OmDFjMBgMREVFERcXh1arZeHChcb1xo0bx/jx41m4cCHTpk1Dq9USEhLC8OHDzRWtQdGV69m4+wLfH76Mn5cLfwvvjp9XI0vHEkJYOZXy5+HOdZicVqrsYkYBq79JJC2niKG9m/PwPe1MOm6hoexHc5OMpiEZa6aq00rymcV6KPNqMV/+eIGEs9k0buRAzNgAurf1snQsIUQdIuVQj+jKDWzam8R3B1Oxs7Vh9KA2DO3dHFdne0tHE0LUMVIO9URaThErt5wkNUvDwO6+RIS0o4mrTKsthLg9Ug51nKIo7DqSxoYfz+Nob8vzET3o2aGppWMJIeo4KYc67GRyHl/uvkDKlUK6tfVk8sjONJajBSGECUg51EG6cgNf7bnAd4dSUTdxYtLIzgzs7lvjUeVCCHEzUg51zOUsDR9/c4pLmRqG9PJnbGh7mVZbCGFyUg51RF5BKV//lMSB367QyNmeaRHdCeygrnpDIYS4DVIOVk5RFPYcT2fDrvPoDQrD+rdk5IBW8vFUIYRZSTlYsZz8Ej7ZcZpTyVfp3MqDx0d0Qt1E5kMSQpiflIMVUhSFuAPJrNryG4oCj93fkZBAf2zkgrMQopZIOViZX5Ny+fqnJFKuFNK5lQdPjOhEUzlaEELUMikHK1GiLWfDj+fZcywdbw9npj8SSPfWTeRoQQhhEVIOVuBUch5rtp8mr6CU4f1a8lBwG5r5NbGa2RuFEA2PlIMFlZaVs/HHC/x4NA0fTxdem9Cb9s0bWzqWEEJIOVjK6ZSrrN6eSG5+Kff3bUF4cFsZzCaEsBpSDrVMURRi4y/yzf5kvD2ceXVCLzo0b2LpWEIIcR0ph1qWll3Etv3JDOjiw8ThnXB0kKMFIYT1MWs5REdHk5ubi51dxdO8+eabXLp0iQ8++ACdTsfjjz/Oo48+CsD+/ftZsGABWq2WESNGEBMTY85oJpF1rYRPd5zmSl4xTg62PDGic5XXDHLySwG4r28LKQYhhNUyWzkoikJSUhK7d+82lkNmZiYxMTF8/fXXODg4MG7cOPr370/z5s2ZNWsWa9euxc/Pj6eeeoo9e/YQEhJirnh3RFeu56s9SfyQcBkHe1t6d1STcDaL2PgkXh4feMtt8worysHDTabWFkJYL7OVQ1JSEiqViqlTp5Kbm8vYsWNp1KgRAwYMoEmTJgAMGzaMuLg4+vXrR6tWrWjRogUAYWFhxMXFWWU5XM7SsHLrSS5nFxHSsxlhd7fG090JFyc7dh25TJlOf8sLy1cLtdjaqHBv5FCLqYUQombMVg4FBQUEBQUxd+5cSktLiY6OZsSIEajVf8wk6u3tzYkTJ8jKyqq0PDMzs0bP5+XlWqP11Wq3Gq2vKArf/pzCyk2/0sjZnjlTBtCns4/x8T5d/fjuUCqFZQY6NWty059TXKbHq7ETPt7uJs9oCZLRNCSjaUhG0zFbOQQGBhIYWHGKxcXFhcjISBYsWMDTTz993XoqlQpFUSptX9Mb1+TmajAYKv+cG1Gr3Wo0wCz7Wgkrt57kQloB3dp4MiWsC+4uDtf9DK9GFbOkHkm8Yvz6RjKyNbg3cqjy+Wua0RIko2lIRtOQjDVjY6O65Ztqs5XD4cOH0el0BAUFARXvvP39/cnJyTGuk5WVhbe3Nz4+Pjdcbg0Sk/NYEfsbANHD7iI4oBk2NpWLy8PNkcauDlzMKLjlz8sr1NLat268cxBCNFw25vrBhYWFLFq0CK1Wi0ajITY2lsWLF3PgwAHy8vIoKSnhu+++Izg4mICAAC5evEhKSgp6vZ5t27YRHBxsrmjVpigKn357BvdGDrzxRF/uCfS/YTH8ro2vOxczbvyuQFEUDiZmkptfKhejhRBWz2xHDqGhoRw/fpwxY8ZgMBiIioqid+/exMTEEB0djU6nIzIykh49egCwcOFCpk2bhlarJSQkhOHDh5srWrWlZReRdbWEx0d0wrsaM6O2aebOsfM5FJfqcHGqOLWkKAoHTl5h+8+XSM8pooW3K6GB/uaOLoQQd8Ss4xxmzJjBjBkzrlsWFhZGWFhYpXWDgoLYsmWLOePUWNL/ThF1bNGkWuu38XMzbtetjRdFpTrWfnuGg4lZNGvaiMdHdGJQd79bHn0IIYQ1kBHSt3AxowAXRzu8Pap3P4UO/k2ws7Xhm/0ppGcX8d3hVPI1ZYQHt2XkgFZSCkKIOkPK4RYuphfQxs+t2vdUcHSw5Z7AZnx/+DJnUq/h4+HMaxN607ZZ1R9bFUIIayLlcBNanZ7L2UWMDGpVo+2i7u3ImEFt0BsUGjnZy9GCEKJOknK4iUuZhRgUhbZ+NX/X//vFaCGEqKvM9lHWukxvMPDtwVRsbVRy8x0hRIMkRw5/cTlbw2ffnuHs5XxGDGiJq7McBQghGh4ph/8p0Zazee9Fvj98GRcnOyaP6szA7n6WjiWEEBYh5QCcSs5j1TeJXCvUMjigGZH3tJMjBiFEg9agy0FvMLBh1wV2Hk7F19OFWY/1pp2/XGMQQogGXQ5p2UXsPJzK0F7NiQxth+Mt7sMghBANSYMuh5Y+bqyICcbZsUHvBiGEqKTBf5RVikEIISpr8OUghBCiMikHIYQQlUg5CCGEqETKQQghRCVSDkIIISqRchBCCFFJvfkcZ03vm1AX7rMgGU1DMpqGZDQNa8lYVQ6VoihKLWURQghRR8hpJSGEEJVIOQghhKhEykEIIUQlUg5CCCEqkXIQQghRiZSDEEKISqQchBBCVCLlIIQQohIpByGEEJU0qHLYunUrI0eO5L777mPdunWWjmP0/vvvM2rUKEaNGsWiRYsA2L9/P2FhYdx///0sXbrUwgn/8Pbbb/Pqq68CkJiYSEREBMOGDePvf/875eXlFs22a9cuwsPDGT58OPPnzwesbz9u3rzZ+Lt+++23AevZjxqNhgceeIDLly8DN993lsz714zr16/ngQceICwsjNdee42ysjKry/i7devW8dhjjxm/T09P59FHH2X48OE888wzFBUV1VrGalEaiCtXriihoaHK1atXlaKiIiUsLEw5d+6cpWMp+/btUx555BFFq9UqZWVlSnR0tLJ161YlJCREuXTpkqLT6ZRJkyYpu3fvtnRUZf/+/Ur//v2VmTNnKoqiKKNGjVKOHj2qKIqivPbaa8q6desslu3SpUvKoEGDlIyMDKWsrEwZP368snv3bqvaj8XFxUrfvn2V3NxcRafTKZGRkcq+ffusYj8eO3ZMeeCBB5SuXbsqqampSklJyU33naXy/jVjUlKSct999ymFhYWKwWBQXnnlFWXNmjVWlfF3586dUwYPHqxMmDDBuOzJJ59Utm3bpiiKorz//vvKokWLaiVjdTWYI4f9+/czYMAAmjRpgouLC8OGDSMuLs7SsVCr1bz66qs4ODhgb29Pu3btSE5OplWrVrRo0QI7OzvCwsIsnvXatWssXbqUp59+GoC0tDRKS0vp2bMnAOHh4RbNuHPnTkaOHImvry/29vYsXboUZ2dnq9qPer0eg8FASUkJ5eXllJeXY2dnZxX7ccOGDcyZMwdvb28ATpw4ccN9Z8nf+18zOjg4MHfuXFxdXVGpVHTs2JH09HSryghQVlbGG2+8wfTp043LdDodhw4dYtiwYbWesbrqzaysVcnKykKtVhu/9/b25sSJExZMVKFDhw7Gr5OTk9m+fTuPPfZYpayZmZmWiGf0xhtvEBMTQ0ZGBlB5f6rVaotmTElJwd7ensmTJ5OdnU1oaCgdOnSwqv3o6urK9OnTGTFiBE5OTvTr1w97e3ur2I9vvfXWdd/f6N9LZmamRX/vf83o7++Pv78/AHl5eaxbt44FCxZYVUaAd955h4iICJo3b25cdvXqVVxdXbGzs6v1jNXVYI4clBtMPqtSWcfUuQDnzp1j0qRJzJw5k5YtW1Z63JJZN27ciJ+fH0FBQcZl1rY/9Xo9Bw4cYPHixWzYsIFff/210jlfsGzG06dP89VXX/Hjjz+yd+9ebGxs2LdvX6X1rOH/y5v9fq3t9w6QmZnJxIkTiYiIoH///laVcd++fWRkZBAREXHdcmvKeDMN5sjBx8eHw4cPG7/Pysq67tDPkhISEnj++eeZNWsWo0aN4uDBg+Tk5Bgft3TW7du3k52dzejRo8nPz6e4uBiVSnVdxuzsbItmbNq0KUFBQXh6egIwdOhQ4uLisLW1Na5j6f24d+9egoKC8PLyAipOJaxatcqq9uPvfHx8bvj/4F+XWzrvhQsXmDp1KhMmTGDSpElA5eyWzLht2zbOnTvH6NGjKS4uJicnhxkzZrB48WI0Gg16vR5bW1uL78cbaTBHDnfffTcHDhwgLy+PkpISvvvuO4KDgy0di4yMDJ577jmWLFnCqFGjAAgICODixYukpKSg1+vZtm2bRbOuWbOGbdu2sXnzZp5//nmGDBnCggULcHR0JCEhAYBNmzZZNGNoaCh79+6loKAAvV5PfHw8w4cPt6r92KlTJ/bv309xcTGKorBr1y769etnVfvxdzf7f9Df399q8mo0GiZPnsz06dONxQBYVcYFCxawY8cONm/ezPz58+nWrRvLli3D3t6ePn36sH37dotnvJkGdeQQExNDdHQ0Op2OyMhIevToYelYrFq1Cq1Wy8KFC43Lxo0bx8KFC5k2bRparZaQkBCGDx9uwZQ3tmTJEmbPnk1RURFdunQhOjraYlkCAgKYMmUKUVFR6HQ6Bg4cyPjx42nbtq3V7MdBgwZx6tQpwsPDsbe3p3v37jz55JPcd999VrMff+fo6HjT/wet5ff+5ZdfkpOTw+rVq1m9ejUAQ4YMYfr06VaT8VbmzJnDq6++ygcffICfnx/vvvuupSNdR+4EJ4QQopIGc1pJCCFE9Uk5CCGEqETKQQghRCVSDkIIISqRchBCCFGJlIMQQohKGsw4B9GwzZ8/n0OHDgEVo2r9/f1xcnICKqZ9XrZsGZ999hnff/89vr6+xu1effVV9u3bZxx5bTAYKC4uZty4cUydOtW43vfff88nn3xCTk4OBoMBT09PnnnmGUJCQgB47733WLduHT4+PtflGjx4MGPGjOHFF18EID8/n8LCQuM8PA899BCPP/74TV+XRqNh4cKFHD9+HJVKhY2NDY8++igPP/zwHe4x0eBZbD5YISwkNDRUOXHihPH70tJSpX///soLL7ygLF68+Lp1Z86cqXz88cfXLUtLS1MCAgKU8+fPK4qiKF988YUyYsQI5cyZM8Z1EhMTlYEDByrHjx9XFEVRli9frsybN6/KbF999ZXy5JNPVvu1zJ07V3nrrbcUg8GgKErF1PQhISFKfHx8tX+GEDcip5VEg/fNN9/QsmVLHn/8cTZs2EBJSckt179y5QpQMctqWVkZ7777Lm+//TYdO3Y0rtOpUyfmzZuHwWAwa/bs7Gy0Wi06nQ6omAngvffeo1WrVmZ9XlH/yWkl0eD997//ZfTo0XTv3h21Wk1sbCxRUVHGxz/55BO2bNlCUVERhYWF9O7dmw8//BAfHx8SExMB6N69e6WfO3To0Ou+3759u3G+n9+99NJLDB48+Laz/+1vf2P69OkMGDCAwMBAevXqxciRI2nRosVt/0whQMpBNHAnT54kMTGRlStXAjBmzBj+7//+j/HjxxunUH788ceZPHkyxcXFxMTEYGNjQ9++fYEbT70cFRVFUVERpaWl9OjRg8WLFwMwcuRI3njjDZPm79SpE3FxcZw8eZJDhw6xb98+PvzwQ/71r38xZMgQkz6XaFjktJJo0D7//HPs7OyIiIhgyJAhrF27luTkZH766adK67q4uLBo0SKOHj3KmjVrAGjXrh2KonD27NnrfubmzZt56qmnKCgoMFv28vJyXn/9dfLz8+nWrRtPPPEEH3/8Mc888wzr16832/OKhkHKQTRYBQUFfPPNN3z44Yfs2rWLXbt28dNPP/Hggw/yySef3HCbxo0bM3PmTFasWEFmZiaOjo689NJLvPTSS5w/f964Xl5eHvv27cPGxnz/xOzs7EhOTubf//638ZpDeXk5qampdOnSxWzPKxoGOa0kGqzY2FjatWvHgAEDrlv+zDPPMGrUqOuOBv7swQcfZOPGjSxcuJClS5cyduxYfHx8eOutt8jLy8NgMKBSqRgyZAgTJ040bnejaw5+fn58+OGHt/0a/vWvf7F48WKGDRuGs7MziqJw77338txzz932zxQCZMpuIYQQNyBHDkJYsS1btrBq1aobPhYWFsaUKVNqOZFoKOTIQQghRCVyQVoIIUQlUg5CCCEqkXIQQghRiZSDEEKISqQchBBCVPL/M7b7VpU00N4AAAAASUVORK5CYII=", "text/plain": [ "
" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "WINDOW_SIZE = 10\n", "df['ROLL_SOURCE_S'] = df['SOURCE_S'].rolling(WINDOW_SIZE).median()\n", "sns.lineplot(data = df, x = 'TARGET_S', y = 'ROLL_SOURCE_S')" ] }, { "cell_type": "code", "execution_count": 83, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "Text(0.5, 0, 'Time of source video in seconds')" ] }, "execution_count": 83, "metadata": {}, "output_type": "execute_result" }, { "data": { "image/png": "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", "text/plain": [ "
" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "df['ROLLSHIFT_SOURCE_S'] = df['SOURCE_S'].rolling(WINDOW_SIZE).median().shift(1) - df['SOURCE_S'].rolling(WINDOW_SIZE).median()\n", "sns.lineplot(data = df, x='TARGET_S', y='ROLLSHIFT_SOURCE_S')\n", "plt.xlabel('Time of source video in seconds')" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## Detecting multiple change points" ] }, { "cell_type": "code", "execution_count": 46, "metadata": {}, "outputs": [ { "name": "stderr", "output_type": "stream", "text": [ "DEBUG:root:Detecting increase changepoint.\n", "INFO:root:Max iteration reached and no stable changepoint found.\n", "DEBUG:root:Detecting decrease changepoint.\n", "DEBUG:root:Detecting increase changepoint.\n", "DEBUG:root:Detecting decrease changepoint.\n", "INFO:root:Max iteration reached and no stable changepoint found.\n", "DEBUG:root:Detecting increase changepoint.\n", "DEBUG:root:Detecting decrease changepoint.\n", "DEBUG:root:Detecting increase changepoint.\n", "DEBUG:root:Detecting decrease changepoint.\n", "DEBUG:root:Detecting increase changepoint.\n", "DEBUG:root:Detecting decrease changepoint.\n", "INFO:root:Max iteration reached and no stable changepoint found.\n", "DEBUG:root:Detecting increase changepoint.\n", "DEBUG:root:Detecting decrease changepoint.\n", "DEBUG:root:Detecting increase changepoint.\n", "DEBUG:root:Detecting decrease changepoint.\n", "INFO:root:Max iteration reached and no stable changepoint found.\n" ] } ], "source": [ "multi_cp_ts = TimeSeriesData(df.loc[:,['time','SOURCE_S']])\n", "\n", "historical_window = 15\n", "scan_window = 15\n", "step = 60\n", "changepoints = []\n", "n = len(df.loc[:,['time','SOURCE_S']])\n", "for end_idx in range(historical_window + scan_window, n, step):\n", " tsd = multi_cp_ts[end_idx - (historical_window + scan_window) : end_idx]\n", " changepoints += CUSUMDetector(tsd).detector(interest_window=[historical_window, historical_window + scan_window])" ] }, { "cell_type": "code", "execution_count": 47, "metadata": {}, "outputs": [ { "name": "stderr", "output_type": "stream", "text": [ "WARNING:root:No change points detected!\n" ] }, { "data": { "image/png": "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", "text/plain": [ "
" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "detector.plot(changepoints)\n", "plt.xticks(rotation=45)\n", "plt.show()" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## BOCP detector" ] }, { "cell_type": "code", "execution_count": 59, "metadata": {}, "outputs": [ { "ename": "ImportError", "evalue": "cannot import name '_mul_broadcast_shape' from 'gpytorch.utils.broadcasting' (/Users/pshouche/opt/anaconda3/lib/python3.9/site-packages/gpytorch/utils/broadcasting.py)", "output_type": "error", "traceback": [ "\u001b[0;31m---------------------------------------------------------------------------\u001b[0m", "\u001b[0;31mImportError\u001b[0m Traceback (most recent call last)", "\u001b[0;32m/var/folders/w6/9kh8n81x3z9097k63m9r40h40000gp/T/ipykernel_3728/2791472790.py\u001b[0m in \u001b[0;36m\u001b[0;34m\u001b[0m\n\u001b[1;32m 1\u001b[0m \u001b[0;32mfrom\u001b[0m \u001b[0mkats\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mdetectors\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mbocpd\u001b[0m \u001b[0;32mimport\u001b[0m \u001b[0mBOCPDetector\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mBOCPDModelType\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mTrendChangeParameters\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m----> 2\u001b[0;31m \u001b[0;32mimport\u001b[0m \u001b[0max\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m\u001b[1;32m 3\u001b[0m \u001b[0;32mimport\u001b[0m \u001b[0mgpytorch\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 4\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 5\u001b[0m \u001b[0;31m# Initialize the detector\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n", "\u001b[0;32m~/opt/anaconda3/lib/python3.9/site-packages/ax/__init__.py\u001b[0m in \u001b[0;36m\u001b[0;34m\u001b[0m\n\u001b[1;32m 31\u001b[0m \u001b[0mTrial\u001b[0m\u001b[0;34m,\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 32\u001b[0m )\n\u001b[0;32m---> 33\u001b[0;31m \u001b[0;32mfrom\u001b[0m \u001b[0max\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mmodelbridge\u001b[0m \u001b[0;32mimport\u001b[0m \u001b[0mModels\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m\u001b[1;32m 34\u001b[0m \u001b[0;32mfrom\u001b[0m \u001b[0max\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mservice\u001b[0m \u001b[0;32mimport\u001b[0m \u001b[0mOptimizationLoop\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0moptimize\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 35\u001b[0m \u001b[0;32mfrom\u001b[0m \u001b[0max\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mstorage\u001b[0m \u001b[0;32mimport\u001b[0m \u001b[0mjson_load\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mjson_save\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n", "\u001b[0;32m~/opt/anaconda3/lib/python3.9/site-packages/ax/modelbridge/__init__.py\u001b[0m in \u001b[0;36m\u001b[0;34m\u001b[0m\n\u001b[1;32m 7\u001b[0m \u001b[0;31m# flake8: noqa F401\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 8\u001b[0m \u001b[0;32mfrom\u001b[0m \u001b[0max\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mmodelbridge\u001b[0m \u001b[0;32mimport\u001b[0m \u001b[0mtransforms\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m----> 9\u001b[0;31m \u001b[0;32mfrom\u001b[0m \u001b[0max\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mmodelbridge\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mbase\u001b[0m \u001b[0;32mimport\u001b[0m \u001b[0mModelBridge\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m\u001b[1;32m 10\u001b[0m from ax.modelbridge.factory import (\n\u001b[1;32m 11\u001b[0m \u001b[0mModels\u001b[0m\u001b[0;34m,\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n", "\u001b[0;32m~/opt/anaconda3/lib/python3.9/site-packages/ax/modelbridge/base.py\u001b[0m in \u001b[0;36m\u001b[0;34m\u001b[0m\n\u001b[1;32m 36\u001b[0m \u001b[0mTModelPredict\u001b[0m\u001b[0;34m,\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 37\u001b[0m )\n\u001b[0;32m---> 38\u001b[0;31m \u001b[0;32mfrom\u001b[0m \u001b[0max\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mmodelbridge\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mtransforms\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mbase\u001b[0m \u001b[0;32mimport\u001b[0m \u001b[0mTransform\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m\u001b[1;32m 39\u001b[0m \u001b[0;32mfrom\u001b[0m \u001b[0max\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mmodelbridge\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mtransforms\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mcast\u001b[0m \u001b[0;32mimport\u001b[0m \u001b[0mCast\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 40\u001b[0m \u001b[0;32mfrom\u001b[0m \u001b[0max\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mmodels\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mtypes\u001b[0m \u001b[0;32mimport\u001b[0m \u001b[0mTConfig\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n", "\u001b[0;32m~/opt/anaconda3/lib/python3.9/site-packages/ax/modelbridge/transforms/base.py\u001b[0m in \u001b[0;36m\u001b[0;34m\u001b[0m\n\u001b[1;32m 14\u001b[0m \u001b[0;32mfrom\u001b[0m \u001b[0max\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mcore\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0moutcome_constraint\u001b[0m \u001b[0;32mimport\u001b[0m \u001b[0mObjectiveThreshold\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 15\u001b[0m \u001b[0;32mfrom\u001b[0m \u001b[0max\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mcore\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0msearch_space\u001b[0m \u001b[0;32mimport\u001b[0m \u001b[0mSearchSpace\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m---> 16\u001b[0;31m \u001b[0;32mfrom\u001b[0m \u001b[0max\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mmodels\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mtypes\u001b[0m \u001b[0;32mimport\u001b[0m \u001b[0mTConfig\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m\u001b[1;32m 17\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 18\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n", "\u001b[0;32m~/opt/anaconda3/lib/python3.9/site-packages/ax/models/__init__.py\u001b[0m in \u001b[0;36m\u001b[0;34m\u001b[0m\n\u001b[1;32m 6\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 7\u001b[0m \u001b[0;31m# flake8: noqa F401\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m----> 8\u001b[0;31m \u001b[0;32mfrom\u001b[0m \u001b[0max\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mmodels\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mrandom\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0msobol\u001b[0m \u001b[0;32mimport\u001b[0m \u001b[0mSobolGenerator\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m\u001b[1;32m 9\u001b[0m \u001b[0;32mfrom\u001b[0m \u001b[0max\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mmodels\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mtorch\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mbotorch\u001b[0m \u001b[0;32mimport\u001b[0m \u001b[0mBotorchModel\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 10\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n", "\u001b[0;32m~/opt/anaconda3/lib/python3.9/site-packages/ax/models/random/sobol.py\u001b[0m in \u001b[0;36m\u001b[0;34m\u001b[0m\n\u001b[1;32m 10\u001b[0m \u001b[0;32mimport\u001b[0m \u001b[0mtorch\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 11\u001b[0m \u001b[0;32mfrom\u001b[0m \u001b[0max\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mmodels\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mbase\u001b[0m \u001b[0;32mimport\u001b[0m \u001b[0mModel\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m---> 12\u001b[0;31m \u001b[0;32mfrom\u001b[0m \u001b[0max\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mmodels\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mmodel_utils\u001b[0m \u001b[0;32mimport\u001b[0m \u001b[0mtunable_feature_indices\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m\u001b[1;32m 13\u001b[0m \u001b[0;32mfrom\u001b[0m \u001b[0max\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mmodels\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mrandom\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mbase\u001b[0m \u001b[0;32mimport\u001b[0m \u001b[0mRandomModel\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 14\u001b[0m \u001b[0;32mfrom\u001b[0m \u001b[0max\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mmodels\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mtypes\u001b[0m \u001b[0;32mimport\u001b[0m \u001b[0mTConfig\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n", "\u001b[0;32m~/opt/anaconda3/lib/python3.9/site-packages/ax/models/model_utils.py\u001b[0m in \u001b[0;36m\u001b[0;34m\u001b[0m\n\u001b[1;32m 17\u001b[0m \u001b[0;32mfrom\u001b[0m \u001b[0max\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mcore\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mtypes\u001b[0m \u001b[0;32mimport\u001b[0m \u001b[0mTParamCounter\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 18\u001b[0m \u001b[0;32mfrom\u001b[0m \u001b[0max\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mexceptions\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mcore\u001b[0m \u001b[0;32mimport\u001b[0m \u001b[0mSearchSpaceExhausted\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m---> 19\u001b[0;31m \u001b[0;32mfrom\u001b[0m \u001b[0max\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mmodels\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mnumpy_base\u001b[0m \u001b[0;32mimport\u001b[0m \u001b[0mNumpyModel\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m\u001b[1;32m 20\u001b[0m \u001b[0;32mfrom\u001b[0m \u001b[0max\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mmodels\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mtorch_base\u001b[0m \u001b[0;32mimport\u001b[0m \u001b[0mTorchModel\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 21\u001b[0m \u001b[0;32mfrom\u001b[0m \u001b[0max\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mmodels\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mtypes\u001b[0m \u001b[0;32mimport\u001b[0m \u001b[0mTConfig\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n", "\u001b[0;32m~/opt/anaconda3/lib/python3.9/site-packages/ax/models/numpy_base.py\u001b[0m in \u001b[0;36m\u001b[0;34m\u001b[0m\n\u001b[1;32m 11\u001b[0m \u001b[0;32mfrom\u001b[0m \u001b[0max\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mcore\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mtypes\u001b[0m \u001b[0;32mimport\u001b[0m \u001b[0mTCandidateMetadata\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mTGenMetadata\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 12\u001b[0m \u001b[0;32mfrom\u001b[0m \u001b[0max\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mmodels\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mbase\u001b[0m \u001b[0;32mimport\u001b[0m \u001b[0mModel\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m---> 13\u001b[0;31m \u001b[0;32mfrom\u001b[0m \u001b[0max\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mmodels\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mtypes\u001b[0m \u001b[0;32mimport\u001b[0m \u001b[0mTConfig\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m\u001b[1;32m 14\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 15\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n", "\u001b[0;32m~/opt/anaconda3/lib/python3.9/site-packages/ax/models/types.py\u001b[0m in \u001b[0;36m\u001b[0;34m\u001b[0m\n\u001b[1;32m 8\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 9\u001b[0m \u001b[0;32mfrom\u001b[0m \u001b[0max\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mcore\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0moptimization_config\u001b[0m \u001b[0;32mimport\u001b[0m \u001b[0mOptimizationConfig\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m---> 10\u001b[0;31m \u001b[0;32mfrom\u001b[0m \u001b[0mbotorch\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0macquisition\u001b[0m \u001b[0;32mimport\u001b[0m \u001b[0mAcquisitionFunction\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m\u001b[1;32m 11\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 12\u001b[0m TConfig = Dict[\n", "\u001b[0;32m~/opt/anaconda3/lib/python3.9/site-packages/botorch/__init__.py\u001b[0m in \u001b[0;36m\u001b[0;34m\u001b[0m\n\u001b[1;32m 5\u001b[0m \u001b[0;31m# LICENSE file in the root directory of this source tree.\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 6\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m----> 7\u001b[0;31m from botorch import (\n\u001b[0m\u001b[1;32m 8\u001b[0m \u001b[0macquisition\u001b[0m\u001b[0;34m,\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 9\u001b[0m \u001b[0mexceptions\u001b[0m\u001b[0;34m,\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n", "\u001b[0;32m~/opt/anaconda3/lib/python3.9/site-packages/botorch/acquisition/__init__.py\u001b[0m in \u001b[0;36m\u001b[0;34m\u001b[0m\n\u001b[1;32m 5\u001b[0m \u001b[0;31m# LICENSE file in the root directory of this source tree.\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 6\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m----> 7\u001b[0;31m from botorch.acquisition.acquisition import (\n\u001b[0m\u001b[1;32m 8\u001b[0m \u001b[0mAcquisitionFunction\u001b[0m\u001b[0;34m,\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 9\u001b[0m \u001b[0mOneShotAcquisitionFunction\u001b[0m\u001b[0;34m,\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n", "\u001b[0;32m~/opt/anaconda3/lib/python3.9/site-packages/botorch/acquisition/acquisition.py\u001b[0m in \u001b[0;36m\u001b[0;34m\u001b[0m\n\u001b[1;32m 16\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 17\u001b[0m \u001b[0;32mfrom\u001b[0m \u001b[0mbotorch\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mexceptions\u001b[0m \u001b[0;32mimport\u001b[0m \u001b[0mBotorchWarning\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mUnsupportedError\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m---> 18\u001b[0;31m \u001b[0;32mfrom\u001b[0m \u001b[0mbotorch\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mmodels\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mmodel\u001b[0m \u001b[0;32mimport\u001b[0m \u001b[0mModel\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m\u001b[1;32m 19\u001b[0m \u001b[0;32mfrom\u001b[0m \u001b[0mbotorch\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mposteriors\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mposterior\u001b[0m \u001b[0;32mimport\u001b[0m \u001b[0mPosterior\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 20\u001b[0m \u001b[0;32mfrom\u001b[0m \u001b[0mtorch\u001b[0m \u001b[0;32mimport\u001b[0m \u001b[0mTensor\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n", "\u001b[0;32m~/opt/anaconda3/lib/python3.9/site-packages/botorch/models/__init__.py\u001b[0m in \u001b[0;36m\u001b[0;34m\u001b[0m\n\u001b[1;32m 5\u001b[0m \u001b[0;31m# LICENSE file in the root directory of this source tree.\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 6\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m----> 7\u001b[0;31m from botorch.models.approximate_gp import (\n\u001b[0m\u001b[1;32m 8\u001b[0m \u001b[0mApproximateGPyTorchModel\u001b[0m\u001b[0;34m,\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 9\u001b[0m \u001b[0mSingleTaskVariationalGP\u001b[0m\u001b[0;34m,\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n", "\u001b[0;32m~/opt/anaconda3/lib/python3.9/site-packages/botorch/models/approximate_gp.py\u001b[0m in \u001b[0;36m\u001b[0;34m\u001b[0m\n\u001b[1;32m 33\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 34\u001b[0m \u001b[0;32mimport\u001b[0m \u001b[0mtorch\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m---> 35\u001b[0;31m \u001b[0;32mfrom\u001b[0m \u001b[0mbotorch\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mmodels\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mgpytorch\u001b[0m \u001b[0;32mimport\u001b[0m \u001b[0mGPyTorchModel\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m\u001b[1;32m 36\u001b[0m \u001b[0;32mfrom\u001b[0m \u001b[0mbotorch\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mmodels\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mtransforms\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0minput\u001b[0m \u001b[0;32mimport\u001b[0m \u001b[0mInputTransform\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 37\u001b[0m \u001b[0;32mfrom\u001b[0m \u001b[0mbotorch\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mmodels\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mtransforms\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0moutcome\u001b[0m \u001b[0;32mimport\u001b[0m \u001b[0mOutcomeTransform\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n", "\u001b[0;32m~/opt/anaconda3/lib/python3.9/site-packages/botorch/models/gpytorch.py\u001b[0m in \u001b[0;36m\u001b[0;34m\u001b[0m\n\u001b[1;32m 21\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 22\u001b[0m \u001b[0;32mimport\u001b[0m \u001b[0mtorch\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m---> 23\u001b[0;31m \u001b[0;32mfrom\u001b[0m \u001b[0mbotorch\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0macquisition\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mobjective\u001b[0m \u001b[0;32mimport\u001b[0m \u001b[0mPosteriorTransform\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m\u001b[1;32m 24\u001b[0m \u001b[0;32mfrom\u001b[0m \u001b[0mbotorch\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mexceptions\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0merrors\u001b[0m \u001b[0;32mimport\u001b[0m \u001b[0mBotorchTensorDimensionError\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 25\u001b[0m \u001b[0;32mfrom\u001b[0m \u001b[0mbotorch\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mexceptions\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mwarnings\u001b[0m \u001b[0;32mimport\u001b[0m \u001b[0mBotorchTensorDimensionWarning\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n", "\u001b[0;32m~/opt/anaconda3/lib/python3.9/site-packages/botorch/acquisition/objective.py\u001b[0m in \u001b[0;36m\u001b[0;34m\u001b[0m\n\u001b[1;32m 19\u001b[0m \u001b[0;32mfrom\u001b[0m \u001b[0mbotorch\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mposteriors\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mgpytorch\u001b[0m \u001b[0;32mimport\u001b[0m \u001b[0mGPyTorchPosterior\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mscalarize_posterior\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 20\u001b[0m \u001b[0;32mfrom\u001b[0m \u001b[0mbotorch\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mposteriors\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mposterior\u001b[0m \u001b[0;32mimport\u001b[0m \u001b[0mPosterior\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m---> 21\u001b[0;31m \u001b[0;32mfrom\u001b[0m \u001b[0mbotorch\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mutils\u001b[0m \u001b[0;32mimport\u001b[0m \u001b[0mapply_constraints\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m\u001b[1;32m 22\u001b[0m \u001b[0;32mfrom\u001b[0m \u001b[0mtorch\u001b[0m \u001b[0;32mimport\u001b[0m \u001b[0mTensor\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 23\u001b[0m \u001b[0;32mfrom\u001b[0m \u001b[0mtorch\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mnn\u001b[0m \u001b[0;32mimport\u001b[0m \u001b[0mModule\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n", "\u001b[0;32m~/opt/anaconda3/lib/python3.9/site-packages/botorch/utils/__init__.py\u001b[0m in \u001b[0;36m\u001b[0;34m\u001b[0m\n\u001b[1;32m 6\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 7\u001b[0m \u001b[0;32mfrom\u001b[0m \u001b[0mbotorch\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mutils\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mconstraints\u001b[0m \u001b[0;32mimport\u001b[0m \u001b[0mget_outcome_constraint_transforms\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m----> 8\u001b[0;31m \u001b[0;32mfrom\u001b[0m \u001b[0mbotorch\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mutils\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mfeasible_volume\u001b[0m \u001b[0;32mimport\u001b[0m \u001b[0mestimate_feasible_volume\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m\u001b[1;32m 9\u001b[0m \u001b[0;32mfrom\u001b[0m \u001b[0mbotorch\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mutils\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mobjective\u001b[0m \u001b[0;32mimport\u001b[0m \u001b[0mapply_constraints\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mget_objective_weights_transform\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 10\u001b[0m \u001b[0;32mfrom\u001b[0m \u001b[0mbotorch\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mutils\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mrounding\u001b[0m \u001b[0;32mimport\u001b[0m \u001b[0mapproximate_round\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n", "\u001b[0;32m~/opt/anaconda3/lib/python3.9/site-packages/botorch/utils/feasible_volume.py\u001b[0m in \u001b[0;36m\u001b[0;34m\u001b[0m\n\u001b[1;32m 9\u001b[0m \u001b[0;32mfrom\u001b[0m \u001b[0mtyping\u001b[0m \u001b[0;32mimport\u001b[0m \u001b[0mCallable\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mList\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mOptional\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mTuple\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 10\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m---> 11\u001b[0;31m \u001b[0;32mimport\u001b[0m \u001b[0mbotorch\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mmodels\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mmodel\u001b[0m \u001b[0;32mas\u001b[0m \u001b[0mmodel\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m\u001b[1;32m 12\u001b[0m \u001b[0;32mimport\u001b[0m \u001b[0mtorch\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 13\u001b[0m \u001b[0;32mfrom\u001b[0m \u001b[0mbotorch\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mlogging\u001b[0m \u001b[0;32mimport\u001b[0m \u001b[0m_get_logger\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n", "\u001b[0;32m~/opt/anaconda3/lib/python3.9/site-packages/botorch/models/model.py\u001b[0m in \u001b[0;36m\u001b[0;34m\u001b[0m\n\u001b[1;32m 20\u001b[0m \u001b[0;32mimport\u001b[0m \u001b[0mtorch\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 21\u001b[0m \u001b[0;32mfrom\u001b[0m \u001b[0mbotorch\u001b[0m \u001b[0;32mimport\u001b[0m \u001b[0msettings\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m---> 22\u001b[0;31m \u001b[0;32mfrom\u001b[0m \u001b[0mbotorch\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mmodels\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mutils\u001b[0m \u001b[0;32mimport\u001b[0m \u001b[0mfantasize\u001b[0m \u001b[0;32mas\u001b[0m \u001b[0mfantasize_flag\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m\u001b[1;32m 23\u001b[0m \u001b[0;32mfrom\u001b[0m \u001b[0mbotorch\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mposteriors\u001b[0m \u001b[0;32mimport\u001b[0m \u001b[0mPosterior\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mPosteriorList\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 24\u001b[0m \u001b[0;32mfrom\u001b[0m \u001b[0mbotorch\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0msampling\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0msamplers\u001b[0m \u001b[0;32mimport\u001b[0m \u001b[0mMCSampler\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n", "\u001b[0;32m~/opt/anaconda3/lib/python3.9/site-packages/botorch/models/utils.py\u001b[0m in \u001b[0;36m\u001b[0;34m\u001b[0m\n\u001b[1;32m 21\u001b[0m \u001b[0;32mfrom\u001b[0m \u001b[0mgpytorch\u001b[0m \u001b[0;32mimport\u001b[0m \u001b[0msettings\u001b[0m \u001b[0;32mas\u001b[0m \u001b[0mgpt_settings\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 22\u001b[0m \u001b[0;32mfrom\u001b[0m \u001b[0mgpytorch\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mmodule\u001b[0m \u001b[0;32mimport\u001b[0m \u001b[0mModule\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m---> 23\u001b[0;31m \u001b[0;32mfrom\u001b[0m \u001b[0mgpytorch\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mutils\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mbroadcasting\u001b[0m \u001b[0;32mimport\u001b[0m \u001b[0m_mul_broadcast_shape\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m\u001b[1;32m 24\u001b[0m \u001b[0;32mfrom\u001b[0m \u001b[0mtorch\u001b[0m \u001b[0;32mimport\u001b[0m \u001b[0mTensor\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 25\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n", "\u001b[0;31mImportError\u001b[0m: cannot import name '_mul_broadcast_shape' from 'gpytorch.utils.broadcasting' (/Users/pshouche/opt/anaconda3/lib/python3.9/site-packages/gpytorch/utils/broadcasting.py)" ] } ], "source": [ "from kats.detectors.bocpd import BOCPDetector, BOCPDModelType, TrendChangeParameters\n", "import ax\n", "import gpytorch\n", "\n", "# Initialize the detector\n", "detector = BOCPDetector(df.loc[:,['time','SOURCE_S']])\n", "\n", "\n", "changepoints = detector.detector(\n", " model=BOCPDModelType.NORMAL_KNOWN_MODEL # this is the default choice\n", ")\n", "\n", "# Plot the data\n", "detector.plot(changepoints)\n", "plt.xticks(rotation=45)\n", "plt.show()" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## Robust Stat Detector" ] }, { "cell_type": "code", "execution_count": 71, "metadata": {}, "outputs": [ { "name": "stderr", "output_type": "stream", "text": [ "WARNING:root:No change points detected!\n" ] }, { "data": { "image/png": "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", "text/plain": [ "
" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "from kats.detectors.robust_stat_detection import RobustStatDetector\n", "\n", "ts_bocpd = TimeSeriesData(df.loc[:,['time','SOURCE_S']])\n", "detector = RobustStatDetector(ts_bocpd)\n", "changepoints = detector.detector(p_value_cutoff = 5e-5, comparison_window=2)\n", "\n", "# plot the results\n", "detector.plot(changepoints)\n", "plt.xticks(rotation=45)\n", "plt.show()" ] } ], "metadata": { "kernelspec": { "display_name": "Python 3.9.7 ('base')", "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.9.7" }, "orig_nbformat": 4, "vscode": { "interpreter": { "hash": "35ac539f20c4edc7c4b10c8a5969be22a35cbd7bf12b66c83932160e8a573333" } } }, "nbformat": 4, "nbformat_minor": 2 }