{"cells": [{"cell_type": "markdown", "id": "3231ec55", "metadata": {}, "source": ["# Infer operator computation cost\n", "\n", "This notebooks explores a way to predict the cost of operator Transpose based on some features."]}, {"cell_type": "code", "execution_count": 1, "id": "c57ea015", "metadata": {}, "outputs": [{"data": {"text/html": ["
run previous cell, wait for 2 seconds
\n", ""], "text/plain": [""]}, "execution_count": 2, "metadata": {}, "output_type": "execute_result"}], "source": ["from jyquickhelper import add_notebook_menu\n", "add_notebook_menu()"]}, {"cell_type": "code", "execution_count": 2, "id": "346ccb45", "metadata": {}, "outputs": [], "source": ["%matplotlib inline"]}, {"cell_type": "code", "execution_count": 3, "id": "f86d2b4e", "metadata": {}, "outputs": [], "source": ["%load_ext mlprodict"]}, {"cell_type": "markdown", "id": "d632066f", "metadata": {}, "source": ["## ONNX graph and measures"]}, {"cell_type": "code", "execution_count": 4, "id": "db95c3c3", "metadata": {}, "outputs": [{"data": {"text/html": ["
\n", ""], "text/plain": [""]}, "execution_count": 5, "metadata": {}, "output_type": "execute_result"}], "source": ["import numpy\n", "from skl2onnx.common.data_types import FloatTensorType\n", "from skl2onnx.algebra.onnx_ops import OnnxTranspose\n", "\n", "\n", "def create_onnx_graph(perm=(0, 1, 2, 3), target_opset=14):\n", " tr = OnnxTranspose('X', perm=perm, output_names=['Y'], op_version=target_opset)\n", " return tr.to_onnx({'X': FloatTensorType([None] * len(perm))})\n", "\n", "\n", "onx = create_onnx_graph()\n", "\n", "%onnxview onx"]}, {"cell_type": "code", "execution_count": 5, "id": "5c7b91e1", "metadata": {}, "outputs": [{"data": {"text/plain": ["(6, 5, 8, 7)"]}, "execution_count": 6, "metadata": {}, "output_type": "execute_result"}], "source": ["from mlprodict.onnxrt import OnnxInference\n", "\n", "onx = create_onnx_graph(perm=(1, 0, 3, 2))\n", "oinf = OnnxInference(onx)\n", "inputs = {'X': numpy.full((5, 6, 7, 8), 1, dtype=numpy.float32)}\n", "res = oinf.run(inputs)['Y']\n", "res.shape"]}, {"cell_type": "code", "execution_count": 6, "id": "161e6ca6", "metadata": {}, "outputs": [{"data": {"text/plain": ["(6, 5, 8, 7)"]}, "execution_count": 7, "metadata": {}, "output_type": "execute_result"}], "source": ["from onnxruntime import InferenceSession\n", "sess = InferenceSession(onx.SerializeToString())\n", "res = sess.run(None, inputs)[0]\n", "res.shape"]}, {"cell_type": "code", "execution_count": 7, "id": "cd35aa1d", "metadata": {}, "outputs": [{"data": {"text/plain": ["{'average': 0.0024677738666666646,\n", " 'deviation': 0.00022911153911864325,\n", " 'min_exec': 0.0022292380000000023,\n", " 'max_exec': 0.003265080000000005,\n", " 'repeat': 30,\n", " 'number': 50,\n", " 'context_size': 232}"]}, "execution_count": 8, "metadata": {}, "output_type": "execute_result"}], "source": ["from cpyquickhelper.numbers.speed_measure import measure_time\n", "\n", "def measure_time_onnx(sess, X, number=50, repeat=30):\n", " inputs = {'X': X}\n", " return measure_time(lambda: sess.run(None, inputs), context=dict(sess=sess, inputs=inputs),\n", " div_by_number=True, number=number, repeat=repeat)\n", "\n", "X = numpy.random.random((3, 224, 224, 4)).astype(numpy.float32)\n", "measure_time_onnx(sess, X)"]}, {"cell_type": "markdown", "id": "811e19bf", "metadata": {}, "source": ["## Simulation to build a database"]}, {"cell_type": "markdown", "id": "21ab13cf", "metadata": {}, "source": ["### Many dimensions, many permutations"]}, {"cell_type": "code", "execution_count": 8, "id": "c4c1f75a", "metadata": {}, "outputs": [{"name": "stderr", "output_type": "stream", "text": ["100%|\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588| 24/24 [00:04<00:00, 5.73it/s]\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", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
averagedeviationmin_execmax_execrepeatnumbercontext_sizepermshaperatiodim
30.0000440.0000060.0000390.0000573050232(0, 2, 3, 1)(12, 13, 15, 18)0.7503164
10.0000480.0000030.0000450.0000583050232(0, 1, 3, 2)(12, 13, 15, 18)0.8208214
180.0000490.0000030.0000450.0000623050232(3, 0, 1, 2)(12, 13, 15, 18)0.8230704
90.0000490.0000010.0000480.0000533050232(1, 2, 3, 0)(12, 13, 15, 18)0.8306044
120.0000510.0000040.0000390.0000623050232(2, 0, 1, 3)(12, 13, 15, 18)0.8619944
40.0000520.0000050.0000470.0000733050232(0, 3, 1, 2)(12, 13, 15, 18)0.8897534
80.0000540.0000060.0000440.0000673050232(1, 2, 0, 3)(12, 13, 15, 18)0.9094774
20.0000540.0000070.0000490.0000813050232(0, 2, 1, 3)(12, 13, 15, 18)0.9223544
140.0000570.0000060.0000460.0000643050232(2, 1, 0, 3)(12, 13, 15, 18)0.9721984
00.0000590.0000190.0000340.0000933050232(0, 1, 2, 3)(12, 13, 15, 18)1.0000004
60.0000920.0000190.0000530.0001393050232(1, 0, 2, 3)(12, 13, 15, 18)1.5579034
110.0001360.0000200.0001190.0001863050232(1, 3, 2, 0)(12, 13, 15, 18)2.3015564
130.0001380.0000230.0001210.0001813050232(2, 0, 3, 1)(12, 13, 15, 18)2.3368264
100.0001380.0000180.0001180.0001763050232(1, 3, 0, 2)(12, 13, 15, 18)2.3461184
160.0001400.0000150.0001240.0001933050232(2, 3, 0, 1)(12, 13, 15, 18)2.3791684
150.0001440.0000190.0001190.0001963050232(2, 1, 3, 0)(12, 13, 15, 18)2.4433924
170.0001450.0000220.0001230.0001993050232(2, 3, 1, 0)(12, 13, 15, 18)2.4550984
230.0001450.0000170.0001250.0001963050232(3, 2, 1, 0)(12, 13, 15, 18)2.4564314
200.0001460.0000150.0001280.0001843050232(3, 1, 0, 2)(12, 13, 15, 18)2.4732504
220.0001500.0000170.0001270.0001703050232(3, 2, 0, 1)(12, 13, 15, 18)2.5398174
190.0001580.0000210.0001270.0001923050232(3, 0, 2, 1)(12, 13, 15, 18)2.6848764
210.0001640.0000450.0001240.0002313050232(3, 1, 2, 0)(12, 13, 15, 18)2.7781934
70.0002140.0000600.0001360.0002953050232(1, 0, 3, 2)(12, 13, 15, 18)3.6272404
50.0002150.0000710.0001430.0003403050232(0, 3, 2, 1)(12, 13, 15, 18)3.6401324
\n", "
"], "text/plain": [" average deviation min_exec max_exec repeat number context_size \\\n", "3 0.000044 0.000006 0.000039 0.000057 30 50 232 \n", "1 0.000048 0.000003 0.000045 0.000058 30 50 232 \n", "18 0.000049 0.000003 0.000045 0.000062 30 50 232 \n", "9 0.000049 0.000001 0.000048 0.000053 30 50 232 \n", "12 0.000051 0.000004 0.000039 0.000062 30 50 232 \n", "4 0.000052 0.000005 0.000047 0.000073 30 50 232 \n", "8 0.000054 0.000006 0.000044 0.000067 30 50 232 \n", "2 0.000054 0.000007 0.000049 0.000081 30 50 232 \n", "14 0.000057 0.000006 0.000046 0.000064 30 50 232 \n", "0 0.000059 0.000019 0.000034 0.000093 30 50 232 \n", "6 0.000092 0.000019 0.000053 0.000139 30 50 232 \n", "11 0.000136 0.000020 0.000119 0.000186 30 50 232 \n", "13 0.000138 0.000023 0.000121 0.000181 30 50 232 \n", "10 0.000138 0.000018 0.000118 0.000176 30 50 232 \n", "16 0.000140 0.000015 0.000124 0.000193 30 50 232 \n", "15 0.000144 0.000019 0.000119 0.000196 30 50 232 \n", "17 0.000145 0.000022 0.000123 0.000199 30 50 232 \n", "23 0.000145 0.000017 0.000125 0.000196 30 50 232 \n", "20 0.000146 0.000015 0.000128 0.000184 30 50 232 \n", "22 0.000150 0.000017 0.000127 0.000170 30 50 232 \n", "19 0.000158 0.000021 0.000127 0.000192 30 50 232 \n", "21 0.000164 0.000045 0.000124 0.000231 30 50 232 \n", "7 0.000214 0.000060 0.000136 0.000295 30 50 232 \n", "5 0.000215 0.000071 0.000143 0.000340 30 50 232 \n", "\n", " perm shape ratio dim \n", "3 (0, 2, 3, 1) (12, 13, 15, 18) 0.750316 4 \n", "1 (0, 1, 3, 2) (12, 13, 15, 18) 0.820821 4 \n", "18 (3, 0, 1, 2) (12, 13, 15, 18) 0.823070 4 \n", "9 (1, 2, 3, 0) (12, 13, 15, 18) 0.830604 4 \n", "12 (2, 0, 1, 3) (12, 13, 15, 18) 0.861994 4 \n", "4 (0, 3, 1, 2) (12, 13, 15, 18) 0.889753 4 \n", "8 (1, 2, 0, 3) (12, 13, 15, 18) 0.909477 4 \n", "2 (0, 2, 1, 3) (12, 13, 15, 18) 0.922354 4 \n", "14 (2, 1, 0, 3) (12, 13, 15, 18) 0.972198 4 \n", "0 (0, 1, 2, 3) (12, 13, 15, 18) 1.000000 4 \n", "6 (1, 0, 2, 3) (12, 13, 15, 18) 1.557903 4 \n", "11 (1, 3, 2, 0) (12, 13, 15, 18) 2.301556 4 \n", "13 (2, 0, 3, 1) (12, 13, 15, 18) 2.336826 4 \n", "10 (1, 3, 0, 2) (12, 13, 15, 18) 2.346118 4 \n", "16 (2, 3, 0, 1) (12, 13, 15, 18) 2.379168 4 \n", "15 (2, 1, 3, 0) (12, 13, 15, 18) 2.443392 4 \n", "17 (2, 3, 1, 0) (12, 13, 15, 18) 2.455098 4 \n", "23 (3, 2, 1, 0) (12, 13, 15, 18) 2.456431 4 \n", "20 (3, 1, 0, 2) (12, 13, 15, 18) 2.473250 4 \n", "22 (3, 2, 0, 1) (12, 13, 15, 18) 2.539817 4 \n", "19 (3, 0, 2, 1) (12, 13, 15, 18) 2.684876 4 \n", "21 (3, 1, 2, 0) (12, 13, 15, 18) 2.778193 4 \n", "7 (1, 0, 3, 2) (12, 13, 15, 18) 3.627240 4 \n", "5 (0, 3, 2, 1) (12, 13, 15, 18) 3.640132 4 "]}, "execution_count": 9, "metadata": {}, "output_type": "execute_result"}], "source": ["from itertools import permutations\n", "from tqdm import tqdm\n", "from pandas import DataFrame\n", "\n", "\n", "def process_shape(shape, rnd=False, number=50, repeat=30, bar=True):\n", " X = numpy.random.random(shape).astype(numpy.float32)\n", " obs = []\n", " perms = list(permutations(list(range(len(X.shape)))))\n", " baseline = None\n", " itergen = perms if (rnd or not bar) else tqdm(perms)\n", " for perm in itergen:\n", " if baseline is not None and rnd:\n", " if random.randint(0, 4) != 0:\n", " continue\n", " onx = create_onnx_graph(perm=perm)\n", " sess = InferenceSession(onx.SerializeToString())\n", " res = measure_time_onnx(sess, X, number=number, repeat=repeat)\n", " res['perm'] = perm\n", " res['shape'] = shape\n", " if baseline is None:\n", " baseline = res\n", " res[\"ratio\"] = res[\"average\"] / baseline[\"average\"]\n", " res['dim'] = len(shape)\n", " obs.append(res)\n", " return DataFrame(obs).sort_values('average')\n", "\n", "dfs = []\n", "df = process_shape((12, 13, 15, 18))\n", "dfs.append(df)\n", "df"]}, {"cell_type": "code", "execution_count": 9, "id": "daf805ba", "metadata": {"scrolled": false}, "outputs": [{"name": "stderr", "output_type": "stream", "text": ["100%|\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588| 6/6 [00:01<00:00, 4.70it/s]\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", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
averagedeviationmin_execmax_execrepeatnumbercontext_sizepermshaperatiodim
30.0000730.0000090.0000620.0000943050232(1, 2, 0)(43, 44, 45)0.9855133
00.0000740.0000090.0000650.0001093050232(0, 1, 2)(43, 44, 45)1.0000003
10.0000770.0000080.0000690.0001013050232(0, 2, 1)(43, 44, 45)1.0327593
40.0000970.0000040.0000830.0001103050232(2, 0, 1)(43, 44, 45)1.3009153
20.0001130.0000290.0000610.0001413050232(1, 0, 2)(43, 44, 45)1.5157113
50.0003750.0001210.0002920.0007503050232(2, 1, 0)(43, 44, 45)5.0543013
\n", "
"], "text/plain": [" average deviation min_exec max_exec repeat number context_size \\\n", "3 0.000073 0.000009 0.000062 0.000094 30 50 232 \n", "0 0.000074 0.000009 0.000065 0.000109 30 50 232 \n", "1 0.000077 0.000008 0.000069 0.000101 30 50 232 \n", "4 0.000097 0.000004 0.000083 0.000110 30 50 232 \n", "2 0.000113 0.000029 0.000061 0.000141 30 50 232 \n", "5 0.000375 0.000121 0.000292 0.000750 30 50 232 \n", "\n", " perm shape ratio dim \n", "3 (1, 2, 0) (43, 44, 45) 0.985513 3 \n", "0 (0, 1, 2) (43, 44, 45) 1.000000 3 \n", "1 (0, 2, 1) (43, 44, 45) 1.032759 3 \n", "4 (2, 0, 1) (43, 44, 45) 1.300915 3 \n", "2 (1, 0, 2) (43, 44, 45) 1.515711 3 \n", "5 (2, 1, 0) (43, 44, 45) 5.054301 3 "]}, "execution_count": 10, "metadata": {}, "output_type": "execute_result"}], "source": ["df = process_shape((43, 44, 45))\n", "dfs.append(df)\n", "df"]}, {"cell_type": "code", "execution_count": 10, "id": "0abe8e18", "metadata": {}, "outputs": [{"name": "stderr", "output_type": "stream", "text": ["100%|\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588| 6/6 [00:01<00:00, 3.05it/s]\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", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
averagedeviationmin_execmax_execrepeatnumbercontext_sizepermshaperatiodim
20.0001000.0000090.0000900.0001253050232(1, 0, 2)(3, 244, 244)0.9552033
00.0001050.0000160.0000780.0001383050232(0, 1, 2)(3, 244, 244)1.0000003
10.0001230.0000130.0001080.0001613050232(0, 2, 1)(3, 244, 244)1.1788273
40.0001240.0000170.0001080.0001713050232(2, 0, 1)(3, 244, 244)1.1856663
30.0001510.0000160.0001360.0001973050232(1, 2, 0)(3, 244, 244)1.4384463
50.0006720.0000830.0006260.0010303050232(2, 1, 0)(3, 244, 244)6.4181953
\n", "
"], "text/plain": [" average deviation min_exec max_exec repeat number context_size \\\n", "2 0.000100 0.000009 0.000090 0.000125 30 50 232 \n", "0 0.000105 0.000016 0.000078 0.000138 30 50 232 \n", "1 0.000123 0.000013 0.000108 0.000161 30 50 232 \n", "4 0.000124 0.000017 0.000108 0.000171 30 50 232 \n", "3 0.000151 0.000016 0.000136 0.000197 30 50 232 \n", "5 0.000672 0.000083 0.000626 0.001030 30 50 232 \n", "\n", " perm shape ratio dim \n", "2 (1, 0, 2) (3, 244, 244) 0.955203 3 \n", "0 (0, 1, 2) (3, 244, 244) 1.000000 3 \n", "1 (0, 2, 1) (3, 244, 244) 1.178827 3 \n", "4 (2, 0, 1) (3, 244, 244) 1.185666 3 \n", "3 (1, 2, 0) (3, 244, 244) 1.438446 3 \n", "5 (2, 1, 0) (3, 244, 244) 6.418195 3 "]}, "execution_count": 11, "metadata": {}, "output_type": "execute_result"}], "source": ["df = process_shape((3, 244, 244))\n", "dfs.append(df)\n", "df"]}, {"cell_type": "code", "execution_count": 11, "id": "d91a9d22", "metadata": {}, "outputs": [{"name": "stderr", "output_type": "stream", "text": ["100%|\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588| 24/24 [00:19<00:00, 1.26it/s]\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", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
averagedeviationmin_execmax_execrepeatnumbercontext_sizepermshaperatiodim
40.0000920.0000080.0000780.0001073050232(0, 3, 1, 2)(3, 244, 244, 1)0.8599034
00.0001070.0000180.0000840.0001573050232(0, 1, 2, 3)(3, 244, 244, 1)1.0000004
60.0001240.0000680.0000880.0003233050232(1, 0, 2, 3)(3, 244, 244, 1)1.1624564
120.0001260.0000170.0001070.0001853050232(2, 0, 1, 3)(3, 244, 244, 1)1.1809964
30.0001300.0000090.0001200.0001633050232(0, 2, 3, 1)(3, 244, 244, 1)1.2100774
180.0001370.0000470.0000900.0002503050232(3, 0, 1, 2)(3, 244, 244, 1)1.2766424
10.0001470.0000170.0001060.0001753050232(0, 1, 3, 2)(3, 244, 244, 1)1.3699784
80.0001850.0000170.0001640.0002463050232(1, 2, 0, 3)(3, 244, 244, 1)1.7253914
90.0001890.0000440.0001420.0002653050232(1, 2, 3, 0)(3, 244, 244, 1)1.7669054
20.0002010.0000540.0001210.0002893050232(0, 2, 1, 3)(3, 244, 244, 1)1.8788024
70.0005220.0000610.0004570.0007333050232(1, 0, 3, 2)(3, 244, 244, 1)4.8740094
100.0005330.0001570.0004560.0011283050232(1, 3, 0, 2)(3, 244, 244, 1)4.9739164
130.0006400.0001890.0004770.0012893050232(2, 0, 3, 1)(3, 244, 244, 1)5.9807964
160.0006600.0001060.0005030.0008603050232(2, 3, 0, 1)(3, 244, 244, 1)6.1677034
50.0006920.0001360.0005290.0010213050232(0, 3, 2, 1)(3, 244, 244, 1)6.4607594
190.0007490.0002060.0005080.0013243050232(3, 0, 2, 1)(3, 244, 244, 1)6.9963624
140.0007540.0001050.0006330.0009943050232(2, 1, 0, 3)(3, 244, 244, 1)7.0410074
110.0007910.0002640.0005610.0013863050232(1, 3, 2, 0)(3, 244, 244, 1)7.3894314
150.0008180.0002780.0006250.0015223050232(2, 1, 3, 0)(3, 244, 244, 1)7.6346464
170.0008930.0002120.0006460.0014773050232(2, 3, 1, 0)(3, 244, 244, 1)8.3399264
210.0009440.0002930.0005810.0016263050232(3, 1, 2, 0)(3, 244, 244, 1)8.8147854
200.0009760.0003470.0005840.0017423050232(3, 1, 0, 2)(3, 244, 244, 1)9.1122434
220.0010110.0003370.0005440.0018103050232(3, 2, 0, 1)(3, 244, 244, 1)9.4374034
230.0011280.0003220.0006290.0017373050232(3, 2, 1, 0)(3, 244, 244, 1)10.5301824
\n", "
"], "text/plain": [" average deviation min_exec max_exec repeat number context_size \\\n", "4 0.000092 0.000008 0.000078 0.000107 30 50 232 \n", "0 0.000107 0.000018 0.000084 0.000157 30 50 232 \n", "6 0.000124 0.000068 0.000088 0.000323 30 50 232 \n", "12 0.000126 0.000017 0.000107 0.000185 30 50 232 \n", "3 0.000130 0.000009 0.000120 0.000163 30 50 232 \n", "18 0.000137 0.000047 0.000090 0.000250 30 50 232 \n", "1 0.000147 0.000017 0.000106 0.000175 30 50 232 \n", "8 0.000185 0.000017 0.000164 0.000246 30 50 232 \n", "9 0.000189 0.000044 0.000142 0.000265 30 50 232 \n", "2 0.000201 0.000054 0.000121 0.000289 30 50 232 \n", "7 0.000522 0.000061 0.000457 0.000733 30 50 232 \n", "10 0.000533 0.000157 0.000456 0.001128 30 50 232 \n", "13 0.000640 0.000189 0.000477 0.001289 30 50 232 \n", "16 0.000660 0.000106 0.000503 0.000860 30 50 232 \n", "5 0.000692 0.000136 0.000529 0.001021 30 50 232 \n", "19 0.000749 0.000206 0.000508 0.001324 30 50 232 \n", "14 0.000754 0.000105 0.000633 0.000994 30 50 232 \n", "11 0.000791 0.000264 0.000561 0.001386 30 50 232 \n", "15 0.000818 0.000278 0.000625 0.001522 30 50 232 \n", "17 0.000893 0.000212 0.000646 0.001477 30 50 232 \n", "21 0.000944 0.000293 0.000581 0.001626 30 50 232 \n", "20 0.000976 0.000347 0.000584 0.001742 30 50 232 \n", "22 0.001011 0.000337 0.000544 0.001810 30 50 232 \n", "23 0.001128 0.000322 0.000629 0.001737 30 50 232 \n", "\n", " perm shape ratio dim \n", "4 (0, 3, 1, 2) (3, 244, 244, 1) 0.859903 4 \n", "0 (0, 1, 2, 3) (3, 244, 244, 1) 1.000000 4 \n", "6 (1, 0, 2, 3) (3, 244, 244, 1) 1.162456 4 \n", "12 (2, 0, 1, 3) (3, 244, 244, 1) 1.180996 4 \n", "3 (0, 2, 3, 1) (3, 244, 244, 1) 1.210077 4 \n", "18 (3, 0, 1, 2) (3, 244, 244, 1) 1.276642 4 \n", "1 (0, 1, 3, 2) (3, 244, 244, 1) 1.369978 4 \n", "8 (1, 2, 0, 3) (3, 244, 244, 1) 1.725391 4 \n", "9 (1, 2, 3, 0) (3, 244, 244, 1) 1.766905 4 \n", "2 (0, 2, 1, 3) (3, 244, 244, 1) 1.878802 4 \n", "7 (1, 0, 3, 2) (3, 244, 244, 1) 4.874009 4 \n", "10 (1, 3, 0, 2) (3, 244, 244, 1) 4.973916 4 \n", "13 (2, 0, 3, 1) (3, 244, 244, 1) 5.980796 4 \n", "16 (2, 3, 0, 1) (3, 244, 244, 1) 6.167703 4 \n", "5 (0, 3, 2, 1) (3, 244, 244, 1) 6.460759 4 \n", "19 (3, 0, 2, 1) (3, 244, 244, 1) 6.996362 4 \n", "14 (2, 1, 0, 3) (3, 244, 244, 1) 7.041007 4 \n", "11 (1, 3, 2, 0) (3, 244, 244, 1) 7.389431 4 \n", "15 (2, 1, 3, 0) (3, 244, 244, 1) 7.634646 4 \n", "17 (2, 3, 1, 0) (3, 244, 244, 1) 8.339926 4 \n", "21 (3, 1, 2, 0) (3, 244, 244, 1) 8.814785 4 \n", "20 (3, 1, 0, 2) (3, 244, 244, 1) 9.112243 4 \n", "22 (3, 2, 0, 1) (3, 244, 244, 1) 9.437403 4 \n", "23 (3, 2, 1, 0) (3, 244, 244, 1) 10.530182 4 "]}, "execution_count": 12, "metadata": {}, "output_type": "execute_result"}], "source": ["df = process_shape((3, 244, 244, 1))\n", "dfs.append(df)\n", "df"]}, {"cell_type": "code", "execution_count": 12, "id": "2f36031e", "metadata": {}, "outputs": [{"name": "stderr", "output_type": "stream", "text": ["100%|\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588| 24/24 [00:22<00:00, 1.07it/s]\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", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
averagedeviationmin_execmax_execrepeatnumbercontext_sizepermshaperatiodim
80.0000920.0000140.0000780.0001323050232(1, 2, 0, 3)(1, 244, 244, 3)0.7530094
60.0000980.0000130.0000830.0001423050232(1, 0, 2, 3)(1, 244, 244, 3)0.8028084
90.0001070.0000180.0000750.0001373050232(1, 2, 3, 0)(1, 244, 244, 3)0.8739324
30.0001150.0000150.0000920.0001473050232(0, 2, 3, 1)(1, 244, 244, 3)0.9406064
00.0001220.0000280.0000940.0002013050232(0, 1, 2, 3)(1, 244, 244, 3)1.0000004
10.0001940.0000360.0001600.0003113050232(0, 1, 3, 2)(1, 244, 244, 3)1.5854794
40.0001950.0000190.0001630.0002583050232(0, 3, 1, 2)(1, 244, 244, 3)1.5987704
180.0002350.0000580.0001720.0003453050232(3, 0, 1, 2)(1, 244, 244, 3)1.9236544
20.0004080.0001560.0002290.0007183050232(0, 2, 1, 3)(1, 244, 244, 3)3.3454064
120.0005130.0002150.0003000.0014303050232(2, 0, 1, 3)(1, 244, 244, 3)4.2054774
100.0005580.0001310.0004580.0010233050232(1, 3, 0, 2)(1, 244, 244, 3)4.5726584
70.0006040.0001880.0004710.0010653050232(1, 0, 3, 2)(1, 244, 244, 3)4.9479374
140.0006200.0001420.0004100.0011213050232(2, 1, 0, 3)(1, 244, 244, 3)5.0783874
230.0006790.0000970.0005900.0009283050232(3, 2, 1, 0)(1, 244, 244, 3)5.5618884
220.0007100.0001610.0006200.0013903050232(3, 2, 0, 1)(1, 244, 244, 3)5.8180894
170.0007370.0002400.0004930.0011743050232(2, 3, 1, 0)(1, 244, 244, 3)6.0401894
110.0008240.0002880.0005150.0018793050232(1, 3, 2, 0)(1, 244, 244, 3)6.7526634
210.0009130.0002160.0006130.0014103050232(3, 1, 2, 0)(1, 244, 244, 3)7.4763784
200.0009180.0003280.0005720.0020793050232(3, 1, 0, 2)(1, 244, 244, 3)7.5214814
160.0010570.0006090.0005020.0027023050232(2, 3, 0, 1)(1, 244, 244, 3)8.6570764
50.0010610.0006120.0005390.0037903050232(0, 3, 2, 1)(1, 244, 244, 3)8.6938704
190.0012120.0004170.0007190.0025613050232(3, 0, 2, 1)(1, 244, 244, 3)9.9293084
150.0013110.0005050.0008560.0033773050232(2, 1, 3, 0)(1, 244, 244, 3)10.7393984
130.0014330.0005050.0007210.0023353050232(2, 0, 3, 1)(1, 244, 244, 3)11.7407724
\n", "
"], "text/plain": [" average deviation min_exec max_exec repeat number context_size \\\n", "8 0.000092 0.000014 0.000078 0.000132 30 50 232 \n", "6 0.000098 0.000013 0.000083 0.000142 30 50 232 \n", "9 0.000107 0.000018 0.000075 0.000137 30 50 232 \n", "3 0.000115 0.000015 0.000092 0.000147 30 50 232 \n", "0 0.000122 0.000028 0.000094 0.000201 30 50 232 \n", "1 0.000194 0.000036 0.000160 0.000311 30 50 232 \n", "4 0.000195 0.000019 0.000163 0.000258 30 50 232 \n", "18 0.000235 0.000058 0.000172 0.000345 30 50 232 \n", "2 0.000408 0.000156 0.000229 0.000718 30 50 232 \n", "12 0.000513 0.000215 0.000300 0.001430 30 50 232 \n", "10 0.000558 0.000131 0.000458 0.001023 30 50 232 \n", "7 0.000604 0.000188 0.000471 0.001065 30 50 232 \n", "14 0.000620 0.000142 0.000410 0.001121 30 50 232 \n", "23 0.000679 0.000097 0.000590 0.000928 30 50 232 \n", "22 0.000710 0.000161 0.000620 0.001390 30 50 232 \n", "17 0.000737 0.000240 0.000493 0.001174 30 50 232 \n", "11 0.000824 0.000288 0.000515 0.001879 30 50 232 \n", "21 0.000913 0.000216 0.000613 0.001410 30 50 232 \n", "20 0.000918 0.000328 0.000572 0.002079 30 50 232 \n", "16 0.001057 0.000609 0.000502 0.002702 30 50 232 \n", "5 0.001061 0.000612 0.000539 0.003790 30 50 232 \n", "19 0.001212 0.000417 0.000719 0.002561 30 50 232 \n", "15 0.001311 0.000505 0.000856 0.003377 30 50 232 \n", "13 0.001433 0.000505 0.000721 0.002335 30 50 232 \n", "\n", " perm shape ratio dim \n", "8 (1, 2, 0, 3) (1, 244, 244, 3) 0.753009 4 \n", "6 (1, 0, 2, 3) (1, 244, 244, 3) 0.802808 4 \n", "9 (1, 2, 3, 0) (1, 244, 244, 3) 0.873932 4 \n", "3 (0, 2, 3, 1) (1, 244, 244, 3) 0.940606 4 \n", "0 (0, 1, 2, 3) (1, 244, 244, 3) 1.000000 4 \n", "1 (0, 1, 3, 2) (1, 244, 244, 3) 1.585479 4 \n", "4 (0, 3, 1, 2) (1, 244, 244, 3) 1.598770 4 \n", "18 (3, 0, 1, 2) (1, 244, 244, 3) 1.923654 4 \n", "2 (0, 2, 1, 3) (1, 244, 244, 3) 3.345406 4 \n", "12 (2, 0, 1, 3) (1, 244, 244, 3) 4.205477 4 \n", "10 (1, 3, 0, 2) (1, 244, 244, 3) 4.572658 4 \n", "7 (1, 0, 3, 2) (1, 244, 244, 3) 4.947937 4 \n", "14 (2, 1, 0, 3) (1, 244, 244, 3) 5.078387 4 \n", "23 (3, 2, 1, 0) (1, 244, 244, 3) 5.561888 4 \n", "22 (3, 2, 0, 1) (1, 244, 244, 3) 5.818089 4 \n", "17 (2, 3, 1, 0) (1, 244, 244, 3) 6.040189 4 \n", "11 (1, 3, 2, 0) (1, 244, 244, 3) 6.752663 4 \n", "21 (3, 1, 2, 0) (1, 244, 244, 3) 7.476378 4 \n", "20 (3, 1, 0, 2) (1, 244, 244, 3) 7.521481 4 \n", "16 (2, 3, 0, 1) (1, 244, 244, 3) 8.657076 4 \n", "5 (0, 3, 2, 1) (1, 244, 244, 3) 8.693870 4 \n", "19 (3, 0, 2, 1) (1, 244, 244, 3) 9.929308 4 \n", "15 (2, 1, 3, 0) (1, 244, 244, 3) 10.739398 4 \n", "13 (2, 0, 3, 1) (1, 244, 244, 3) 11.740772 4 "]}, "execution_count": 13, "metadata": {}, "output_type": "execute_result"}], "source": ["df = process_shape((1, 244, 244, 3))\n", "dfs.append(df)\n", "df"]}, {"cell_type": "code", "execution_count": 13, "id": "9661a0ae", "metadata": {}, "outputs": [{"name": "stderr", "output_type": "stream", "text": ["100%|\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588| 24/24 [00:14<00:00, 1.62it/s]\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", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
averagedeviationmin_execmax_execrepeatnumbercontext_sizepermshaperatiodim
00.0010880.0000850.0009860.0012911515232(0, 1, 2, 3)(3, 244, 244, 3)1.0000004
40.0012270.0000880.0011520.0014741515232(0, 3, 1, 2)(3, 244, 244, 3)1.1281264
180.0012770.0001180.0010790.0014901515232(3, 0, 1, 2)(3, 244, 244, 3)1.1737214
60.0013110.0003200.0010070.0019251515232(1, 0, 2, 3)(3, 244, 244, 3)1.2051824
10.0014150.0003070.0012000.0024981515232(0, 1, 3, 2)(3, 244, 244, 3)1.3009014
30.0014260.0002210.0011910.0018631515232(0, 2, 3, 1)(3, 244, 244, 3)1.3113614
90.0015100.0004320.0011320.0024171515232(1, 2, 3, 0)(3, 244, 244, 3)1.3880684
80.0015520.0000300.0015000.0016021515232(1, 2, 0, 3)(3, 244, 244, 3)1.4271054
120.0017240.0001930.0014700.0021421515232(2, 0, 1, 3)(3, 244, 244, 3)1.5851554
20.0017900.0001910.0015660.0022381515232(0, 2, 1, 3)(3, 244, 244, 3)1.6457174
70.0025280.0001540.0023270.0029831515232(1, 0, 3, 2)(3, 244, 244, 3)2.3243844
190.0025710.0001860.0023830.0029221515232(3, 0, 2, 1)(3, 244, 244, 3)2.3634434
210.0025910.0002530.0024310.0034031515232(3, 1, 2, 0)(3, 244, 244, 3)2.3818604
220.0026980.0004120.0023460.0036891515232(3, 2, 0, 1)(3, 244, 244, 3)2.4803084
200.0028060.0007830.0021470.0042961515232(3, 1, 0, 2)(3, 244, 244, 3)2.5795174
160.0032120.0003040.0027730.0038511515232(2, 3, 0, 1)(3, 244, 244, 3)2.9530324
140.0032280.0007960.0020710.0047911515232(2, 1, 0, 3)(3, 244, 244, 3)2.9675234
110.0032570.0002870.0029120.0037391515232(1, 3, 2, 0)(3, 244, 244, 3)2.9940434
170.0035740.0004790.0030280.0050421515232(2, 3, 1, 0)(3, 244, 244, 3)3.2858424
100.0039420.0018600.0024460.0082411515232(1, 3, 0, 2)(3, 244, 244, 3)3.6241454
150.0042490.0012170.0031750.0080411515232(2, 1, 3, 0)(3, 244, 244, 3)3.9063614
50.0046850.0013430.0028270.0068681515232(0, 3, 2, 1)(3, 244, 244, 3)4.3070724
130.0055390.0021800.0029910.0096021515232(2, 0, 3, 1)(3, 244, 244, 3)5.0924224
230.0055750.0019300.0028760.0081571515232(3, 2, 1, 0)(3, 244, 244, 3)5.1255974
\n", "
"], "text/plain": [" average deviation min_exec max_exec repeat number context_size \\\n", "0 0.001088 0.000085 0.000986 0.001291 15 15 232 \n", "4 0.001227 0.000088 0.001152 0.001474 15 15 232 \n", "18 0.001277 0.000118 0.001079 0.001490 15 15 232 \n", "6 0.001311 0.000320 0.001007 0.001925 15 15 232 \n", "1 0.001415 0.000307 0.001200 0.002498 15 15 232 \n", "3 0.001426 0.000221 0.001191 0.001863 15 15 232 \n", "9 0.001510 0.000432 0.001132 0.002417 15 15 232 \n", "8 0.001552 0.000030 0.001500 0.001602 15 15 232 \n", "12 0.001724 0.000193 0.001470 0.002142 15 15 232 \n", "2 0.001790 0.000191 0.001566 0.002238 15 15 232 \n", "7 0.002528 0.000154 0.002327 0.002983 15 15 232 \n", "19 0.002571 0.000186 0.002383 0.002922 15 15 232 \n", "21 0.002591 0.000253 0.002431 0.003403 15 15 232 \n", "22 0.002698 0.000412 0.002346 0.003689 15 15 232 \n", "20 0.002806 0.000783 0.002147 0.004296 15 15 232 \n", "16 0.003212 0.000304 0.002773 0.003851 15 15 232 \n", "14 0.003228 0.000796 0.002071 0.004791 15 15 232 \n", "11 0.003257 0.000287 0.002912 0.003739 15 15 232 \n", "17 0.003574 0.000479 0.003028 0.005042 15 15 232 \n", "10 0.003942 0.001860 0.002446 0.008241 15 15 232 \n", "15 0.004249 0.001217 0.003175 0.008041 15 15 232 \n", "5 0.004685 0.001343 0.002827 0.006868 15 15 232 \n", "13 0.005539 0.002180 0.002991 0.009602 15 15 232 \n", "23 0.005575 0.001930 0.002876 0.008157 15 15 232 \n", "\n", " perm shape ratio dim \n", "0 (0, 1, 2, 3) (3, 244, 244, 3) 1.000000 4 \n", "4 (0, 3, 1, 2) (3, 244, 244, 3) 1.128126 4 \n", "18 (3, 0, 1, 2) (3, 244, 244, 3) 1.173721 4 \n", "6 (1, 0, 2, 3) (3, 244, 244, 3) 1.205182 4 \n", "1 (0, 1, 3, 2) (3, 244, 244, 3) 1.300901 4 \n", "3 (0, 2, 3, 1) (3, 244, 244, 3) 1.311361 4 \n", "9 (1, 2, 3, 0) (3, 244, 244, 3) 1.388068 4 \n", "8 (1, 2, 0, 3) (3, 244, 244, 3) 1.427105 4 \n", "12 (2, 0, 1, 3) (3, 244, 244, 3) 1.585155 4 \n", "2 (0, 2, 1, 3) (3, 244, 244, 3) 1.645717 4 \n", "7 (1, 0, 3, 2) (3, 244, 244, 3) 2.324384 4 \n", "19 (3, 0, 2, 1) (3, 244, 244, 3) 2.363443 4 \n", "21 (3, 1, 2, 0) (3, 244, 244, 3) 2.381860 4 \n", "22 (3, 2, 0, 1) (3, 244, 244, 3) 2.480308 4 \n", "20 (3, 1, 0, 2) (3, 244, 244, 3) 2.579517 4 \n", "16 (2, 3, 0, 1) (3, 244, 244, 3) 2.953032 4 \n", "14 (2, 1, 0, 3) (3, 244, 244, 3) 2.967523 4 \n", "11 (1, 3, 2, 0) (3, 244, 244, 3) 2.994043 4 \n", "17 (2, 3, 1, 0) (3, 244, 244, 3) 3.285842 4 \n", "10 (1, 3, 0, 2) (3, 244, 244, 3) 3.624145 4 \n", "15 (2, 1, 3, 0) (3, 244, 244, 3) 3.906361 4 \n", "5 (0, 3, 2, 1) (3, 244, 244, 3) 4.307072 4 \n", "13 (2, 0, 3, 1) (3, 244, 244, 3) 5.092422 4 \n", "23 (3, 2, 1, 0) (3, 244, 244, 3) 5.125597 4 "]}, "execution_count": 14, "metadata": {}, "output_type": "execute_result"}], "source": ["df = process_shape((3, 244, 244, 3), number=15, repeat=15)\n", "dfs.append(df)\n", "df"]}, {"cell_type": "code", "execution_count": 14, "id": "d0427aa3", "metadata": {}, "outputs": [{"name": "stderr", "output_type": "stream", "text": ["100%|\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588| 24/24 [00:34<00:00, 1.43s/it]\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", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
averagedeviationmin_execmax_execrepeatnumbercontext_sizepermshaperatiodim
10.0022490.0001440.0020670.0026271515232(0, 1, 3, 2)(3, 244, 244, 6)0.6069614
30.0027110.0001710.0024580.0029951515232(0, 2, 3, 1)(3, 244, 244, 6)0.7317954
120.0027730.0006830.0022600.0041031515232(2, 0, 1, 3)(3, 244, 244, 6)0.7485784
40.0029530.0006770.0021870.0041321515232(0, 3, 1, 2)(3, 244, 244, 6)0.7970624
20.0032320.0009630.0023030.0050881515232(0, 2, 1, 3)(3, 244, 244, 6)0.8724274
60.0033630.0003720.0028830.0040251515232(1, 0, 2, 3)(3, 244, 244, 6)0.9078344
80.0033970.0002370.0028860.0038461515232(1, 2, 0, 3)(3, 244, 244, 6)0.9170114
90.0036530.0008740.0025670.0052441515232(1, 2, 3, 0)(3, 244, 244, 6)0.9860714
140.0036970.0001860.0034950.0041501515232(2, 1, 0, 3)(3, 244, 244, 6)0.9979014
00.0037050.0007970.0021110.0051641515232(0, 1, 2, 3)(3, 244, 244, 6)1.0000004
180.0037800.0008820.0027010.0054021515232(3, 0, 1, 2)(3, 244, 244, 6)1.0204324
100.0049380.0003670.0045320.0058441515232(1, 3, 0, 2)(3, 244, 244, 6)1.3330614
70.0059180.0010850.0045980.0083121515232(1, 0, 3, 2)(3, 244, 244, 6)1.5973574
130.0061060.0005560.0056190.0073051515232(2, 0, 3, 1)(3, 244, 244, 6)1.6483254
110.0067220.0018070.0050670.0112451515232(1, 3, 2, 0)(3, 244, 244, 6)1.8145524
200.0070710.0009820.0054540.0085591515232(3, 1, 0, 2)(3, 244, 244, 6)1.9086674
210.0074410.0017320.0061990.0121691515232(3, 1, 2, 0)(3, 244, 244, 6)2.0086354
150.0078150.0017570.0059320.0107791515232(2, 1, 3, 0)(3, 244, 244, 6)2.1094894
160.0085460.0013840.0058780.0106141515232(2, 3, 0, 1)(3, 244, 244, 6)2.3069514
50.0103390.0027890.0058780.0183011515232(0, 3, 2, 1)(3, 244, 244, 6)2.7908234
170.0106770.0014570.0085040.0140701515232(2, 3, 1, 0)(3, 244, 244, 6)2.8821914
230.0124210.0030520.0078180.0181061515232(3, 2, 1, 0)(3, 244, 244, 6)3.3527704
220.0134320.0044960.0065360.0212501515232(3, 2, 0, 1)(3, 244, 244, 6)3.6256804
190.0145790.0040260.0071440.0207391515232(3, 0, 2, 1)(3, 244, 244, 6)3.9354834
\n", "
"], "text/plain": [" average deviation min_exec max_exec repeat number context_size \\\n", "1 0.002249 0.000144 0.002067 0.002627 15 15 232 \n", "3 0.002711 0.000171 0.002458 0.002995 15 15 232 \n", "12 0.002773 0.000683 0.002260 0.004103 15 15 232 \n", "4 0.002953 0.000677 0.002187 0.004132 15 15 232 \n", "2 0.003232 0.000963 0.002303 0.005088 15 15 232 \n", "6 0.003363 0.000372 0.002883 0.004025 15 15 232 \n", "8 0.003397 0.000237 0.002886 0.003846 15 15 232 \n", "9 0.003653 0.000874 0.002567 0.005244 15 15 232 \n", "14 0.003697 0.000186 0.003495 0.004150 15 15 232 \n", "0 0.003705 0.000797 0.002111 0.005164 15 15 232 \n", "18 0.003780 0.000882 0.002701 0.005402 15 15 232 \n", "10 0.004938 0.000367 0.004532 0.005844 15 15 232 \n", "7 0.005918 0.001085 0.004598 0.008312 15 15 232 \n", "13 0.006106 0.000556 0.005619 0.007305 15 15 232 \n", "11 0.006722 0.001807 0.005067 0.011245 15 15 232 \n", "20 0.007071 0.000982 0.005454 0.008559 15 15 232 \n", "21 0.007441 0.001732 0.006199 0.012169 15 15 232 \n", "15 0.007815 0.001757 0.005932 0.010779 15 15 232 \n", "16 0.008546 0.001384 0.005878 0.010614 15 15 232 \n", "5 0.010339 0.002789 0.005878 0.018301 15 15 232 \n", "17 0.010677 0.001457 0.008504 0.014070 15 15 232 \n", "23 0.012421 0.003052 0.007818 0.018106 15 15 232 \n", "22 0.013432 0.004496 0.006536 0.021250 15 15 232 \n", "19 0.014579 0.004026 0.007144 0.020739 15 15 232 \n", "\n", " perm shape ratio dim \n", "1 (0, 1, 3, 2) (3, 244, 244, 6) 0.606961 4 \n", "3 (0, 2, 3, 1) (3, 244, 244, 6) 0.731795 4 \n", "12 (2, 0, 1, 3) (3, 244, 244, 6) 0.748578 4 \n", "4 (0, 3, 1, 2) (3, 244, 244, 6) 0.797062 4 \n", "2 (0, 2, 1, 3) (3, 244, 244, 6) 0.872427 4 \n", "6 (1, 0, 2, 3) (3, 244, 244, 6) 0.907834 4 \n", "8 (1, 2, 0, 3) (3, 244, 244, 6) 0.917011 4 \n", "9 (1, 2, 3, 0) (3, 244, 244, 6) 0.986071 4 \n", "14 (2, 1, 0, 3) (3, 244, 244, 6) 0.997901 4 \n", "0 (0, 1, 2, 3) (3, 244, 244, 6) 1.000000 4 \n", "18 (3, 0, 1, 2) (3, 244, 244, 6) 1.020432 4 \n", "10 (1, 3, 0, 2) (3, 244, 244, 6) 1.333061 4 \n", "7 (1, 0, 3, 2) (3, 244, 244, 6) 1.597357 4 \n", "13 (2, 0, 3, 1) (3, 244, 244, 6) 1.648325 4 \n", "11 (1, 3, 2, 0) (3, 244, 244, 6) 1.814552 4 \n", "20 (3, 1, 0, 2) (3, 244, 244, 6) 1.908667 4 \n", "21 (3, 1, 2, 0) (3, 244, 244, 6) 2.008635 4 \n", "15 (2, 1, 3, 0) (3, 244, 244, 6) 2.109489 4 \n", "16 (2, 3, 0, 1) (3, 244, 244, 6) 2.306951 4 \n", "5 (0, 3, 2, 1) (3, 244, 244, 6) 2.790823 4 \n", "17 (2, 3, 1, 0) (3, 244, 244, 6) 2.882191 4 \n", "23 (3, 2, 1, 0) (3, 244, 244, 6) 3.352770 4 \n", "22 (3, 2, 0, 1) (3, 244, 244, 6) 3.625680 4 \n", "19 (3, 0, 2, 1) (3, 244, 244, 6) 3.935483 4 "]}, "execution_count": 15, "metadata": {}, "output_type": "execute_result"}], "source": ["df = process_shape((3, 244, 244, 6), number=15, repeat=15)\n", "dfs.append(df)\n", "df"]}, {"cell_type": "markdown", "id": "308e3d6d", "metadata": {}, "source": ["### Random cases"]}, {"cell_type": "code", "execution_count": 15, "id": "90fdb3be", "metadata": {"scrolled": false}, "outputs": [{"data": {"text/plain": ["7"]}, "execution_count": 16, "metadata": {}, "output_type": "execute_result"}], "source": ["import random\n", "\n", "if False: # comment out for more training data\n", " for i in tqdm(range(0, 30)):\n", " dim = random.randint(3, 5)\n", " total = 1e8\n", " while total > 1e6 or total < 0:\n", " if dim == 3:\n", " shape = [random.randint(3, 64), random.randint(3, 224), random.randint(3, 64)]\n", " elif dim == 4:\n", " shape = (\n", " [random.randint(3, 8)] + \n", " [random.randint(16, 224) for d in range(2)] +\n", " [random.randint(16, 64)])\n", " elif dim == 5:\n", " shape = (\n", " [random.randint(3, 8)] + \n", " [random.randint(16, 32) for d in range(3)] +\n", " [random.randint(16, 64)])\n", " else:\n", " raise NotImplementedError()\n", " ashape = numpy.array(shape, dtype=numpy.float64)\n", " total = numpy.prod(ashape)\n", "\n", " if total > 1000000:\n", " number, repeat = 2, 2\n", " elif total > 800000:\n", " number, repeat = 3, 3\n", " elif total > 500000:\n", " number, repeat = 5, 5\n", " elif total > 200000:\n", " number, repeat = 7, 7\n", " else:\n", " number, repeat = 10, 10\n", "\n", " df = process_shape(tuple(shape), number=number, repeat=repeat, bar=False)\n", " dfs.append(df)\n", "\n", " for i in range(len(shape)):\n", " shape2 = shape.copy()\n", " shape2[i] = 1\n", " df = process_shape(tuple(shape), number=number, repeat=repeat, bar=False)\n", " dfs.append(df)\n", " \n", "len(dfs)"]}, {"cell_type": "code", "execution_count": 16, "id": "771ad869", "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", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
averagedeviationmin_execmax_execrepeatnumbercontext_sizepermshaperatiodim
1270.0103390.0027890.0058780.0183011515232(0, 3, 2, 1)(3, 244, 244, 6)2.7908234
1280.0106770.0014570.0085040.0140701515232(2, 3, 1, 0)(3, 244, 244, 6)2.8821914
1290.0124210.0030520.0078180.0181061515232(3, 2, 1, 0)(3, 244, 244, 6)3.3527704
1300.0134320.0044960.0065360.0212501515232(3, 2, 0, 1)(3, 244, 244, 6)3.6256804
1310.0145790.0040260.0071440.0207391515232(3, 0, 2, 1)(3, 244, 244, 6)3.9354834
\n", "
"], "text/plain": [" average deviation min_exec max_exec repeat number context_size \\\n", "127 0.010339 0.002789 0.005878 0.018301 15 15 232 \n", "128 0.010677 0.001457 0.008504 0.014070 15 15 232 \n", "129 0.012421 0.003052 0.007818 0.018106 15 15 232 \n", "130 0.013432 0.004496 0.006536 0.021250 15 15 232 \n", "131 0.014579 0.004026 0.007144 0.020739 15 15 232 \n", "\n", " perm shape ratio dim \n", "127 (0, 3, 2, 1) (3, 244, 244, 6) 2.790823 4 \n", "128 (2, 3, 1, 0) (3, 244, 244, 6) 2.882191 4 \n", "129 (3, 2, 1, 0) (3, 244, 244, 6) 3.352770 4 \n", "130 (3, 2, 0, 1) (3, 244, 244, 6) 3.625680 4 \n", "131 (3, 0, 2, 1) (3, 244, 244, 6) 3.935483 4 "]}, "execution_count": 17, "metadata": {}, "output_type": "execute_result"}], "source": ["import pandas\n", "\n", "data = pandas.concat(dfs, axis=0).reset_index(drop=True)\n", "data.tail()"]}, {"cell_type": "code", "execution_count": 17, "id": "0290b6d7", "metadata": {}, "outputs": [{"data": {"text/plain": ["(132, 11)"]}, "execution_count": 18, "metadata": {}, "output_type": "execute_result"}], "source": ["data.shape"]}, {"cell_type": "code", "execution_count": 18, "id": "49c7afc2", "metadata": {"scrolled": false}, "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", "
ratio
minmaxmeanmedian
dimshape
3(3, 244, 244)0.9552036.4181952.0293891.182247
(43, 44, 45)0.9855135.0543011.8148671.166837
4(1, 244, 244, 3)0.75300911.7407725.0233015.013162
(3, 244, 244, 1)0.85990310.5301824.8826805.477356
(3, 244, 244, 3)1.0000005.1255972.4812872.372651
(3, 244, 244, 6)0.6069613.9354831.7041691.465209
(12, 13, 15, 18)0.7503163.6401321.8666912.319191
\n", "
"], "text/plain": [" ratio \n", " min max mean median\n", "dim shape \n", "3 (3, 244, 244) 0.955203 6.418195 2.029389 1.182247\n", " (43, 44, 45) 0.985513 5.054301 1.814867 1.166837\n", "4 (1, 244, 244, 3) 0.753009 11.740772 5.023301 5.013162\n", " (3, 244, 244, 1) 0.859903 10.530182 4.882680 5.477356\n", " (3, 244, 244, 3) 1.000000 5.125597 2.481287 2.372651\n", " (3, 244, 244, 6) 0.606961 3.935483 1.704169 1.465209\n", " (12, 13, 15, 18) 0.750316 3.640132 1.866691 2.319191"]}, "execution_count": 19, "metadata": {}, "output_type": "execute_result"}], "source": ["data[['dim', 'shape', 'ratio']].groupby(['dim', 'shape']).agg({'ratio': [min, max, numpy.mean, numpy.median]})"]}, {"cell_type": "markdown", "id": "275762e0", "metadata": {}, "source": ["## features\n", "\n"]}, {"cell_type": "markdown", "id": "44f4c4a0", "metadata": {}, "source": ["### Computing the features"]}, {"cell_type": "code", "execution_count": 19, "id": "8ecad9ae", "metadata": {}, "outputs": [{"data": {"text/plain": ["2"]}, "execution_count": 20, "metadata": {}, "output_type": "execute_result"}], "source": ["def _edit_distance(mot1, mot2):\n", " dist = {(-1, -1): 0}\n", " pred = {(-1, -1): None}\n", " if len(mot1) == 0:\n", " for j, d in enumerate(mot2):\n", " dist[-1, j] = dist[-1, j - 1] + 1\n", " pred[-1, j] = (-1, j - 1)\n", " dist[j, -1] = dist[j - 1, -1] + 1\n", " pred[j, -1] = (j - 1, -1)\n", " for i, c in enumerate(mot1):\n", " dist[i, -1] = dist[i - 1, -1] + 1\n", " pred[i, -1] = (i - 1, -1)\n", " dist[-1, i] = dist[-1, i - 1] + 1\n", " pred[-1, i] = (-1, i - 1)\n", " for j, d in enumerate(mot2):\n", " opt = []\n", " if (i - 1, j) in dist:\n", " x = dist[i - 1, j] + 1\n", " opt.append((x, (i - 1, j)))\n", " if (i, j - 1) in dist:\n", " x = dist[i, j - 1] + 1\n", " opt.append((x, (i, j - 1)))\n", " if (i - 1, j - 1) in dist:\n", " x = dist[i - 1, j - 1] + (1 if c != d else 0)\n", " opt.append((x, (i - 1, j - 1)))\n", " mi = min(opt)\n", " dist[i, j] = mi[0]\n", " pred[i, j] = mi[1]\n", "\n", " return dist[len(mot1) - 1, len(mot2) - 1]\n", "\n", "_edit_distance(\"abdc\", \"cbda\")"]}, {"cell_type": "code", "execution_count": 20, "id": "7c818814", "metadata": {}, "outputs": [{"data": {"text/plain": ["2"]}, "execution_count": 21, "metadata": {}, "output_type": "execute_result"}], "source": ["_edit_distance((0, 1, 2, 3), (0, 2, 1, 3))"]}, {"cell_type": "code", "execution_count": 21, "id": "79e165cf", "metadata": {}, "outputs": [{"data": {"text/plain": ["{'size': 105,\n", " 'begin': -105,\n", " 'end': -105,\n", " 'middle': 1,\n", " 'dim': 3,\n", " 'discont': 0,\n", " 'end16': -105,\n", " 'end32': -105,\n", " 'rbegin': -1.0,\n", " 'rend': -1.0,\n", " 'rmiddle': 0.009523809523809525,\n", " 'rdiscont': -0.0,\n", " 'rend16': -1.0,\n", " 'rend32': -1.0,\n", " 'iend2': -1.0,\n", " 'ibegin2': -1.0,\n", " 'iend4': -1.0,\n", " 'ibegin4': -1.0,\n", " 'iend8': -1.0,\n", " 'ibegin8': -1.0,\n", " 'iend16': -1.0,\n", " 'ibegin16': -1.0,\n", " 'iend32': -1.0,\n", " 'ibegin32': -1.0,\n", " 'iend64': -1.0,\n", " 'ibegin64': -1.0,\n", " 'CST_': -1,\n", " 'dbegin': -3,\n", " 'dend': -3,\n", " 'rot': -1,\n", " 'rev': 0,\n", " 'edit': 0,\n", " 'redit': 0.0}"]}, "execution_count": 22, "metadata": {}, "output_type": "execute_result"}], "source": ["from math import log\n", "\n", "\n", "def _is_rotation(perm):\n", " t = tuple(perm)\n", " c = list(range(len(perm)))\n", " for i in range(len(c)):\n", " for k in range(len(c)):\n", " c[k] = (k + i) % len(c)\n", " if t == tuple(c):\n", " return True\n", " return False\n", "\n", "\n", "def _relu(x, origin=0):\n", " return origin if x < origin else x\n", "\n", "\n", "def compute_features(shape, perm): \n", " total = numpy.prod(numpy.array(shape, dtype=numpy.int64))\n", " \n", " begin = 1\n", " dbegin = 0\n", " for i, p in enumerate(perm):\n", " if p != i:\n", " break\n", " dbegin += 1\n", " begin *= shape[i]\n", " \n", " end = 1\n", " dend = 0\n", " for i in range(len(perm)-1, -1, -1):\n", " if perm[i] != i:\n", " break\n", " dend += 1\n", " end *= shape[i]\n", " \n", " dis_cont = 0\n", " for i in range(1, len(shape)):\n", " if perm[i] != perm[i-1] + 1:\n", " dis_cont += 1\n", " \n", " middle = max(1, int(total / (end * begin)))\n", " feat = dict(size=total, begin=begin, end=end, middle=middle,\n", " dim=len(shape), discont=dis_cont)\n", "\n", " for c in [16, 32]:\n", " feat[\"end%d\" % c] = _relu(end, c)\n", " \n", " keys = list(feat)\n", " for k in keys:\n", " if k in {'dim', 'cpu', 'size'}:\n", " continue\n", " feat['r%s' % k] = float(feat[k] / total)\n", " \n", " for c in [2, 4, 8, 16, 32, 64]:\n", " feat[\"iend%d\" % c] = float(end >= c)\n", " feat[\"ibegin%d\" % c] = float(begin >= c)\n", " \n", " # feat['CST'] = 1\n", " feat['CST_'] = -1\n", " feat['dbegin'] = - dbegin\n", " feat['dend'] = - dend\n", " \n", " keys = list(feat)\n", " for k in keys:\n", " if k.startswith('end') or k.startswith('begin'):\n", " feat[k] = - feat[k]\n", " elif k.startswith('rend') or k.startswith('rbegin'):\n", " feat[k] = - feat[k]\n", " elif k.startswith('iend') or k.startswith('ibegin'):\n", " feat[k] = - feat[k]\n", " elif k == \"rdiscont\":\n", " feat[k] = - feat[k]\n", "\n", " idp = list(range(len(perm)))\n", " feat[\"rot\"] = -1 if _is_rotation(perm) else 0\n", " feat[\"rev\"] = 1 if perm == tuple(idp[::-1]) else 0\n", " feat[\"edit\"] = _edit_distance(idp, perm)\n", " feat[\"redit\"] = feat[\"edit\"] / len(idp)\n", " return feat\n", "\n", "\n", "compute_features((3, 5, 7), (0, 1, 2))"]}, {"cell_type": "code", "execution_count": 22, "id": "75610130", "metadata": {}, "outputs": [{"data": {"text/plain": ["{'size': 105,\n", " 'begin': -1,\n", " 'end': -1,\n", " 'middle': 105,\n", " 'dim': 3,\n", " 'discont': 2,\n", " 'end16': -16,\n", " 'end32': -32,\n", " 'rbegin': -0.009523809523809525,\n", " 'rend': -0.009523809523809525,\n", " 'rmiddle': 1.0,\n", " 'rdiscont': -0.01904761904761905,\n", " 'rend16': -0.1523809523809524,\n", " 'rend32': -0.3047619047619048,\n", " 'iend2': -0.0,\n", " 'ibegin2': -0.0,\n", " 'iend4': -0.0,\n", " 'ibegin4': -0.0,\n", " 'iend8': -0.0,\n", " 'ibegin8': -0.0,\n", " 'iend16': -0.0,\n", " 'ibegin16': -0.0,\n", " 'iend32': -0.0,\n", " 'ibegin32': -0.0,\n", " 'iend64': -0.0,\n", " 'ibegin64': -0.0,\n", " 'CST_': -1,\n", " 'dbegin': 0,\n", " 'dend': 0,\n", " 'rot': 0,\n", " 'rev': 1,\n", " 'edit': 2,\n", " 'redit': 0.6666666666666666}"]}, "execution_count": 23, "metadata": {}, "output_type": "execute_result"}], "source": ["compute_features((3, 5, 7), (2, 1, 0))"]}, {"cell_type": "code", "execution_count": 23, "id": "f6e81bd5", "metadata": {}, "outputs": [{"data": {"text/plain": ["{'size': 105,\n", " 'begin': -1,\n", " 'end': -1,\n", " 'middle': 105,\n", " 'dim': 3,\n", " 'discont': 1,\n", " 'end16': -16,\n", " 'end32': -32,\n", " 'rbegin': -0.009523809523809525,\n", " 'rend': -0.009523809523809525,\n", " 'rmiddle': 1.0,\n", " 'rdiscont': -0.009523809523809525,\n", " 'rend16': -0.1523809523809524,\n", " 'rend32': -0.3047619047619048,\n", " 'iend2': -0.0,\n", " 'ibegin2': -0.0,\n", " 'iend4': -0.0,\n", " 'ibegin4': -0.0,\n", " 'iend8': -0.0,\n", " 'ibegin8': -0.0,\n", " 'iend16': -0.0,\n", " 'ibegin16': -0.0,\n", " 'iend32': -0.0,\n", " 'ibegin32': -0.0,\n", " 'iend64': -0.0,\n", " 'ibegin64': -0.0,\n", " 'CST_': -1,\n", " 'dbegin': 0,\n", " 'dend': 0,\n", " 'rot': -1,\n", " 'rev': 0,\n", " 'edit': 2,\n", " 'redit': 0.6666666666666666}"]}, "execution_count": 24, "metadata": {}, "output_type": "execute_result"}], "source": ["compute_features((3, 5, 7), (1, 2, 0))"]}, {"cell_type": "markdown", "id": "bd16d08b", "metadata": {}, "source": ["### Computing the features for all simulations"]}, {"cell_type": "code", "execution_count": 24, "id": "230d8ca9", "metadata": {"scrolled": false}, "outputs": [{"name": "stderr", "output_type": "stream", "text": ["100%|\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588| 132/132 [00:00<00:00, 9459.22it/s]\n", "100%|\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588| 132/132 [00:00<00:00, 3601.95it/s]\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", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
CST_begindbegindenddimdisconteditendend16end32...reditrendrend16rend32revrmiddlerotsizeyryt
127-1-3-10432-1-16-32...0.50-9.331422e-07-0.000015-0.0000300.333333010716482.7908230.010339
128-1-100424-1-16-32...1.00-9.331422e-07-0.000015-0.0000301.000000010716482.8821910.010677
129-1-100434-1-16-32...1.00-9.331422e-07-0.000015-0.0000311.000000010716483.3527700.012421
130-1-100424-1-16-32...1.00-9.331422e-07-0.000015-0.0000301.000000010716483.6256800.013432
131-1-100433-1-16-32...0.75-9.331422e-07-0.000015-0.0000301.000000010716483.9354830.014579
\n", "

5 rows \u00d7 35 columns

\n", "
"], "text/plain": [" CST_ begin dbegin dend dim discont edit end end16 end32 ... \\\n", "127 -1 -3 -1 0 4 3 2 -1 -16 -32 ... \n", "128 -1 -1 0 0 4 2 4 -1 -16 -32 ... \n", "129 -1 -1 0 0 4 3 4 -1 -16 -32 ... \n", "130 -1 -1 0 0 4 2 4 -1 -16 -32 ... \n", "131 -1 -1 0 0 4 3 3 -1 -16 -32 ... \n", "\n", " redit rend rend16 rend32 rev rmiddle rot size \\\n", "127 0.50 -9.331422e-07 -0.000015 -0.00003 0 0.333333 0 1071648 \n", "128 1.00 -9.331422e-07 -0.000015 -0.00003 0 1.000000 0 1071648 \n", "129 1.00 -9.331422e-07 -0.000015 -0.00003 1 1.000000 0 1071648 \n", "130 1.00 -9.331422e-07 -0.000015 -0.00003 0 1.000000 0 1071648 \n", "131 0.75 -9.331422e-07 -0.000015 -0.00003 0 1.000000 0 1071648 \n", "\n", " yr yt \n", "127 2.790823 0.010339 \n", "128 2.882191 0.010677 \n", "129 3.352770 0.012421 \n", "130 3.625680 0.013432 \n", "131 3.935483 0.014579 \n", "\n", "[5 rows x 35 columns]"]}, "execution_count": 25, "metadata": {}, "output_type": "execute_result"}], "source": ["def compute_features_dataframe(df):\n", " \n", " def merge(row):\n", " feat = compute_features(row['shape'], row['perm'])\n", " feat['yt'] = row['average']\n", " feat['yr'] = row['ratio']\n", " return feat\n", " \n", " rows = []\n", " for i in tqdm(range(df.shape[0])):\n", " rows.append(dict(shape=df.loc[i, \"shape\"], perm=df.loc[i, \"perm\"],\n", " average=df.loc[i, \"average\"], ratio=df.loc[i, \"ratio\"]))\n", " obs = []\n", " for row in tqdm(rows):\n", " obs.append(merge(row))\n", " return DataFrame(obs)\n", "\n", "fdata = compute_features_dataframe(data)\n", "col_sort = list(sorted(fdata.columns))\n", "fdata = fdata[col_sort]\n", "fdata.tail()"]}, {"cell_type": "markdown", "id": "fae10b08", "metadata": {}, "source": ["### correlations"]}, {"cell_type": "code", "execution_count": 25, "id": "7f58d17c", "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", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
CST_begindbegindenddimdisconteditendend16end32...reditrendrend16rend32revrmiddlerotsizeyryt
CST_NaNNaNNaNNaNNaNNaNNaNNaNNaNNaN...NaNNaNNaNNaNNaNNaNNaNNaNNaNNaN
beginNaN1.0000000.5968160.5964140.0141180.4049520.4051750.9999980.9999980.999998...0.4180220.6815730.6815730.6815730.0382160.2563490.325594-0.1335810.127658-0.008816
dbeginNaN0.5968161.0000000.6768990.0771620.4868870.6695980.5963840.5963740.596363...0.6903330.8318870.8318950.8319030.1116360.6059900.2980900.0164110.2913180.139951
dendNaN0.5964140.6768991.0000000.0771620.4868870.6695980.5969360.5969070.596881...0.6903330.8330590.8329750.8329240.1116360.6235820.2980900.0164110.3054890.155098
dimNaN0.0141180.0771620.0771621.0000000.3053200.2726140.0141530.0141450.014135...0.1159020.1604070.1604170.160414-0.1603570.1066930.2409460.2126850.1389610.192305
discontNaN0.4049520.4868870.4868870.3053201.0000000.5312540.4049710.4049610.404948...0.5042060.5942190.5942260.5942230.1501440.2258540.8239370.0649370.3881400.203342
editNaN0.4051750.6695980.6695980.2726140.5312541.0000000.4052230.4052040.405189...0.9846550.5946880.5946390.5946190.2085680.6525320.3389940.0579810.4642250.283262
endNaN0.9999980.5963840.5969360.0141530.4049710.4052231.0000001.0000001.000000...0.4180620.6815650.6815650.6815650.0382360.2564790.325559-0.1336650.127730-0.008844
end16NaN0.9999980.5963740.5969070.0141450.4049610.4052041.0000001.0000001.000000...0.4180440.6815500.6815500.6815500.0382310.2564510.325557-0.1336710.127716-0.008852
end32NaN0.9999980.5963630.5968810.0141350.4049480.4051891.0000001.0000001.000000...0.4180290.6815330.6815330.6815330.0382280.2564300.325552-0.1336770.127707-0.008859
ibegin16NaN0.4885860.8540560.5537920.1608000.4762250.5281320.4879380.4879300.487919...0.5339810.7158700.7158890.7159010.0782150.5223990.2838000.0374620.2543520.136416
ibegin2NaN0.2977790.7922250.3264180.0800330.2303930.5390820.2972850.2972810.297277...0.5486050.4361110.4361260.4361480.1283380.6856050.049586-0.0271980.3248510.109929
ibegin32NaN0.4885860.8540560.5537920.1608000.4762250.5281320.4879380.4879300.487919...0.5339810.7158700.7158890.7159010.0782150.5223990.2838000.0374620.2543520.136416
ibegin4NaN0.4200230.8141780.4742320.1144320.3886890.5179510.4194330.4194240.419415...0.5282840.6153850.6154710.6155840.0909850.5947740.2076510.1164600.2788100.179014
ibegin64NaN0.5106590.8693570.5864300.0833330.4885120.5333760.5099990.5099900.509979...0.5555290.7482430.7482530.7482570.0748330.5010690.3072070.0177240.2431280.124459
ibegin8NaN0.4200230.8141780.4742320.1144320.3886890.5179510.4194330.4194240.419415...0.5282840.6153850.6154710.6155840.0909850.5947740.2076510.1164600.2788100.179014
iend16NaN0.4058580.4524740.8079890.1815030.3836540.5173110.4066140.4065750.406542...0.5139170.5971650.5970610.5970690.0940320.6199280.1917510.1256890.3076330.182267
iend2NaN0.2973230.3264180.7922250.0800330.2303930.5390820.2979300.2978950.297872...0.5486050.4375410.4373980.4373380.1283380.7245620.049586-0.0271980.3370710.146321
iend32NaN0.4682240.5242980.8412770.2334080.4655930.5241670.4690610.4690290.468993...0.5148050.6887140.6886400.6885530.0815110.5445990.2624480.0496430.2619300.139099
iend4NaN0.3605970.4001190.7929630.1414210.3218780.5196340.3612900.3612510.361222...0.5211200.5305940.5304670.5304390.1058300.6733840.136300-0.0393550.3511510.127468
iend64NaN0.4879590.5537920.8540560.1608000.4762250.5281320.4888160.4887860.488752...0.5339810.7176770.7176120.7175340.0782150.5237460.2838000.0309380.2555670.127728
iend8NaN0.4058580.4524740.8079890.1815030.3836540.5173110.4066140.4065750.406542...0.5139170.5971650.5970610.5970690.0940320.6199280.1917510.1256890.3076330.182267
middleNaN0.1268960.3038680.3190570.1783170.1520950.3778740.1269600.1269470.126937...0.3559800.1864720.1866690.1869180.0529910.4679810.0009030.728990-0.0081200.821357
rbeginNaN0.6815760.8327940.8319330.1602960.5941710.5945680.6815640.6815490.681532...0.6134170.9999920.9999930.9999930.0561080.3763570.4776490.0343280.1874110.095471
rdiscontNaN-0.132163-0.158903-0.158903-0.077379-0.320270-0.168278-0.132191-0.132195-0.132192...-0.163660-0.193464-0.193106-0.192632-0.054527-0.001602-0.2656720.5518800.0045170.386893
reditNaN0.4180220.6903330.6903330.1159020.5042060.9846550.4180620.4180440.418029...1.0000000.6135170.6134660.6134460.2441340.6556580.3171060.0246510.4509280.256097
rendNaN0.6815730.8318870.8330590.1604070.5942190.5946880.6815650.6815500.681533...0.6135171.0000001.0000000.9999990.0561530.3766580.4775790.0344120.1875510.095557
rend16NaN0.6815730.8318950.8329750.1604170.5942260.5946390.6815650.6815500.681533...0.6134661.0000001.0000001.0000000.0561290.3765740.4776130.0346790.1875590.095755
rend32NaN0.6815730.8319030.8329240.1604140.5942230.5946190.6815650.6815500.681533...0.6134460.9999991.0000001.0000000.0561160.3765570.4776300.0350050.1876070.095996
revNaN0.0382160.1116360.111636-0.1603570.1501440.2085680.0382360.0382310.038228...0.2441340.0561530.0561290.0561161.0000000.1804700.117200-0.0341060.2183870.094260
rmiddleNaN0.2563490.6059900.6235820.1066930.2258540.6525320.2564790.2564510.256430...0.6556580.3766580.3765740.3765570.1804701.000000-0.064351-0.0137710.4689250.195497
rotNaN0.3255940.2980900.2980900.2409460.8239370.3389940.3255590.3255570.325552...0.3171060.4775790.4776130.4776300.117200-0.0643511.0000000.0512460.2432940.126195
sizeNaN-0.1335810.0164110.0164110.2126850.0649370.057981-0.133665-0.133671-0.133677...0.0246510.0344120.0346790.035005-0.034106-0.0137710.0512461.000000-0.2362890.805926
yrNaN0.1276580.2913180.3054890.1389610.3881400.4642250.1277300.1277160.127707...0.4509280.1875510.1875590.1876070.2183870.4689250.243294-0.2362891.000000-0.013907
ytNaN-0.0088160.1399510.1550980.1923050.2033420.283262-0.008844-0.008852-0.008859...0.2560970.0955570.0957550.0959960.0942600.1954970.1261950.805926-0.0139071.000000
\n", "

35 rows \u00d7 35 columns

\n", "
"], "text/plain": [" CST_ begin dbegin dend dim discont edit \\\n", "CST_ NaN NaN NaN NaN NaN NaN NaN \n", "begin NaN 1.000000 0.596816 0.596414 0.014118 0.404952 0.405175 \n", "dbegin NaN 0.596816 1.000000 0.676899 0.077162 0.486887 0.669598 \n", "dend NaN 0.596414 0.676899 1.000000 0.077162 0.486887 0.669598 \n", "dim NaN 0.014118 0.077162 0.077162 1.000000 0.305320 0.272614 \n", "discont NaN 0.404952 0.486887 0.486887 0.305320 1.000000 0.531254 \n", "edit NaN 0.405175 0.669598 0.669598 0.272614 0.531254 1.000000 \n", "end NaN 0.999998 0.596384 0.596936 0.014153 0.404971 0.405223 \n", "end16 NaN 0.999998 0.596374 0.596907 0.014145 0.404961 0.405204 \n", "end32 NaN 0.999998 0.596363 0.596881 0.014135 0.404948 0.405189 \n", "ibegin16 NaN 0.488586 0.854056 0.553792 0.160800 0.476225 0.528132 \n", "ibegin2 NaN 0.297779 0.792225 0.326418 0.080033 0.230393 0.539082 \n", "ibegin32 NaN 0.488586 0.854056 0.553792 0.160800 0.476225 0.528132 \n", "ibegin4 NaN 0.420023 0.814178 0.474232 0.114432 0.388689 0.517951 \n", "ibegin64 NaN 0.510659 0.869357 0.586430 0.083333 0.488512 0.533376 \n", "ibegin8 NaN 0.420023 0.814178 0.474232 0.114432 0.388689 0.517951 \n", "iend16 NaN 0.405858 0.452474 0.807989 0.181503 0.383654 0.517311 \n", "iend2 NaN 0.297323 0.326418 0.792225 0.080033 0.230393 0.539082 \n", "iend32 NaN 0.468224 0.524298 0.841277 0.233408 0.465593 0.524167 \n", "iend4 NaN 0.360597 0.400119 0.792963 0.141421 0.321878 0.519634 \n", "iend64 NaN 0.487959 0.553792 0.854056 0.160800 0.476225 0.528132 \n", "iend8 NaN 0.405858 0.452474 0.807989 0.181503 0.383654 0.517311 \n", "middle NaN 0.126896 0.303868 0.319057 0.178317 0.152095 0.377874 \n", "rbegin NaN 0.681576 0.832794 0.831933 0.160296 0.594171 0.594568 \n", "rdiscont NaN -0.132163 -0.158903 -0.158903 -0.077379 -0.320270 -0.168278 \n", "redit NaN 0.418022 0.690333 0.690333 0.115902 0.504206 0.984655 \n", "rend NaN 0.681573 0.831887 0.833059 0.160407 0.594219 0.594688 \n", "rend16 NaN 0.681573 0.831895 0.832975 0.160417 0.594226 0.594639 \n", "rend32 NaN 0.681573 0.831903 0.832924 0.160414 0.594223 0.594619 \n", "rev NaN 0.038216 0.111636 0.111636 -0.160357 0.150144 0.208568 \n", "rmiddle NaN 0.256349 0.605990 0.623582 0.106693 0.225854 0.652532 \n", "rot NaN 0.325594 0.298090 0.298090 0.240946 0.823937 0.338994 \n", "size NaN -0.133581 0.016411 0.016411 0.212685 0.064937 0.057981 \n", "yr NaN 0.127658 0.291318 0.305489 0.138961 0.388140 0.464225 \n", "yt NaN -0.008816 0.139951 0.155098 0.192305 0.203342 0.283262 \n", "\n", " end end16 end32 ... redit rend rend16 \\\n", "CST_ NaN NaN NaN ... NaN NaN NaN \n", "begin 0.999998 0.999998 0.999998 ... 0.418022 0.681573 0.681573 \n", "dbegin 0.596384 0.596374 0.596363 ... 0.690333 0.831887 0.831895 \n", "dend 0.596936 0.596907 0.596881 ... 0.690333 0.833059 0.832975 \n", "dim 0.014153 0.014145 0.014135 ... 0.115902 0.160407 0.160417 \n", "discont 0.404971 0.404961 0.404948 ... 0.504206 0.594219 0.594226 \n", "edit 0.405223 0.405204 0.405189 ... 0.984655 0.594688 0.594639 \n", "end 1.000000 1.000000 1.000000 ... 0.418062 0.681565 0.681565 \n", "end16 1.000000 1.000000 1.000000 ... 0.418044 0.681550 0.681550 \n", "end32 1.000000 1.000000 1.000000 ... 0.418029 0.681533 0.681533 \n", "ibegin16 0.487938 0.487930 0.487919 ... 0.533981 0.715870 0.715889 \n", "ibegin2 0.297285 0.297281 0.297277 ... 0.548605 0.436111 0.436126 \n", "ibegin32 0.487938 0.487930 0.487919 ... 0.533981 0.715870 0.715889 \n", "ibegin4 0.419433 0.419424 0.419415 ... 0.528284 0.615385 0.615471 \n", "ibegin64 0.509999 0.509990 0.509979 ... 0.555529 0.748243 0.748253 \n", "ibegin8 0.419433 0.419424 0.419415 ... 0.528284 0.615385 0.615471 \n", "iend16 0.406614 0.406575 0.406542 ... 0.513917 0.597165 0.597061 \n", "iend2 0.297930 0.297895 0.297872 ... 0.548605 0.437541 0.437398 \n", "iend32 0.469061 0.469029 0.468993 ... 0.514805 0.688714 0.688640 \n", "iend4 0.361290 0.361251 0.361222 ... 0.521120 0.530594 0.530467 \n", "iend64 0.488816 0.488786 0.488752 ... 0.533981 0.717677 0.717612 \n", "iend8 0.406614 0.406575 0.406542 ... 0.513917 0.597165 0.597061 \n", "middle 0.126960 0.126947 0.126937 ... 0.355980 0.186472 0.186669 \n", "rbegin 0.681564 0.681549 0.681532 ... 0.613417 0.999992 0.999993 \n", "rdiscont -0.132191 -0.132195 -0.132192 ... -0.163660 -0.193464 -0.193106 \n", "redit 0.418062 0.418044 0.418029 ... 1.000000 0.613517 0.613466 \n", "rend 0.681565 0.681550 0.681533 ... 0.613517 1.000000 1.000000 \n", "rend16 0.681565 0.681550 0.681533 ... 0.613466 1.000000 1.000000 \n", "rend32 0.681565 0.681550 0.681533 ... 0.613446 0.999999 1.000000 \n", "rev 0.038236 0.038231 0.038228 ... 0.244134 0.056153 0.056129 \n", "rmiddle 0.256479 0.256451 0.256430 ... 0.655658 0.376658 0.376574 \n", "rot 0.325559 0.325557 0.325552 ... 0.317106 0.477579 0.477613 \n", "size -0.133665 -0.133671 -0.133677 ... 0.024651 0.034412 0.034679 \n", "yr 0.127730 0.127716 0.127707 ... 0.450928 0.187551 0.187559 \n", "yt -0.008844 -0.008852 -0.008859 ... 0.256097 0.095557 0.095755 \n", "\n", " rend32 rev rmiddle rot size yr yt \n", "CST_ NaN NaN NaN NaN NaN NaN NaN \n", "begin 0.681573 0.038216 0.256349 0.325594 -0.133581 0.127658 -0.008816 \n", "dbegin 0.831903 0.111636 0.605990 0.298090 0.016411 0.291318 0.139951 \n", "dend 0.832924 0.111636 0.623582 0.298090 0.016411 0.305489 0.155098 \n", "dim 0.160414 -0.160357 0.106693 0.240946 0.212685 0.138961 0.192305 \n", "discont 0.594223 0.150144 0.225854 0.823937 0.064937 0.388140 0.203342 \n", "edit 0.594619 0.208568 0.652532 0.338994 0.057981 0.464225 0.283262 \n", "end 0.681565 0.038236 0.256479 0.325559 -0.133665 0.127730 -0.008844 \n", "end16 0.681550 0.038231 0.256451 0.325557 -0.133671 0.127716 -0.008852 \n", "end32 0.681533 0.038228 0.256430 0.325552 -0.133677 0.127707 -0.008859 \n", "ibegin16 0.715901 0.078215 0.522399 0.283800 0.037462 0.254352 0.136416 \n", "ibegin2 0.436148 0.128338 0.685605 0.049586 -0.027198 0.324851 0.109929 \n", "ibegin32 0.715901 0.078215 0.522399 0.283800 0.037462 0.254352 0.136416 \n", "ibegin4 0.615584 0.090985 0.594774 0.207651 0.116460 0.278810 0.179014 \n", "ibegin64 0.748257 0.074833 0.501069 0.307207 0.017724 0.243128 0.124459 \n", "ibegin8 0.615584 0.090985 0.594774 0.207651 0.116460 0.278810 0.179014 \n", "iend16 0.597069 0.094032 0.619928 0.191751 0.125689 0.307633 0.182267 \n", "iend2 0.437338 0.128338 0.724562 0.049586 -0.027198 0.337071 0.146321 \n", "iend32 0.688553 0.081511 0.544599 0.262448 0.049643 0.261930 0.139099 \n", "iend4 0.530439 0.105830 0.673384 0.136300 -0.039355 0.351151 0.127468 \n", "iend64 0.717534 0.078215 0.523746 0.283800 0.030938 0.255567 0.127728 \n", "iend8 0.597069 0.094032 0.619928 0.191751 0.125689 0.307633 0.182267 \n", "middle 0.186918 0.052991 0.467981 0.000903 0.728990 -0.008120 0.821357 \n", "rbegin 0.999993 0.056108 0.376357 0.477649 0.034328 0.187411 0.095471 \n", "rdiscont -0.192632 -0.054527 -0.001602 -0.265672 0.551880 0.004517 0.386893 \n", "redit 0.613446 0.244134 0.655658 0.317106 0.024651 0.450928 0.256097 \n", "rend 0.999999 0.056153 0.376658 0.477579 0.034412 0.187551 0.095557 \n", "rend16 1.000000 0.056129 0.376574 0.477613 0.034679 0.187559 0.095755 \n", "rend32 1.000000 0.056116 0.376557 0.477630 0.035005 0.187607 0.095996 \n", "rev 0.056116 1.000000 0.180470 0.117200 -0.034106 0.218387 0.094260 \n", "rmiddle 0.376557 0.180470 1.000000 -0.064351 -0.013771 0.468925 0.195497 \n", "rot 0.477630 0.117200 -0.064351 1.000000 0.051246 0.243294 0.126195 \n", "size 0.035005 -0.034106 -0.013771 0.051246 1.000000 -0.236289 0.805926 \n", "yr 0.187607 0.218387 0.468925 0.243294 -0.236289 1.000000 -0.013907 \n", "yt 0.095996 0.094260 0.195497 0.126195 0.805926 -0.013907 1.000000 \n", "\n", "[35 rows x 35 columns]"]}, "execution_count": 26, "metadata": {}, "output_type": "execute_result"}], "source": ["fdata.corr()"]}, {"cell_type": "code", "execution_count": 26, "id": "de885ceb", "metadata": {}, "outputs": [{"data": {"text/plain": ["CST_ NaN\n", "begin -0.008816\n", "dbegin 0.139951\n", "dend 0.155098\n", "dim 0.192305\n", "discont 0.203342\n", "edit 0.283262\n", "end -0.008844\n", "end16 -0.008852\n", "end32 -0.008859\n", "ibegin16 0.136416\n", "ibegin2 0.109929\n", "ibegin32 0.136416\n", "ibegin4 0.179014\n", "ibegin64 0.124459\n", "ibegin8 0.179014\n", "iend16 0.182267\n", "iend2 0.146321\n", "iend32 0.139099\n", "iend4 0.127468\n", "iend64 0.127728\n", "iend8 0.182267\n", "middle 0.821357\n", "rbegin 0.095471\n", "rdiscont 0.386893\n", "redit 0.256097\n", "rend 0.095557\n", "rend16 0.095755\n", "rend32 0.095996\n", "rev 0.094260\n", "rmiddle 0.195497\n", "rot 0.126195\n", "size 0.805926\n", "yr -0.013907\n", "yt 1.000000\n", "Name: yt, dtype: float64"]}, "execution_count": 27, "metadata": {}, "output_type": "execute_result"}], "source": ["fdata.corr()['yt']"]}, {"cell_type": "markdown", "id": "8ada5292", "metadata": {}, "source": ["We check the sign of the correlations of all features with *yt*. If it is positive, increasing the feature increases the processing time. We try to get only positive correlations. *end* is the flattened last dimensions left unchanged by the permutation. The bigger it is, the faster the transposition is. That's why the function computing all features multiplies this number by `-1` to get a feature positively correlated to the processing time. *end16* is equal to *end* when `end<-16` and `-16` when `end>=-16`. This is a simplification of the cost of moving data from memory to cache L1. This cost is linear when the data to move is big enough, but almost constant for small chunks."]}, {"cell_type": "markdown", "id": "040ed07d", "metadata": {}, "source": ["## Linear regression\n", "\n", "We choose a linear regression because the prediction are not limited. The training set does not include all configuration and surely does not include all possible high value the model may have to predict.\n", "\n", "The goal is not necessarily to predict the fastest permutation but to predict the processing time as the goal is to find the best combination of transpositions in a ONNX graph (einsum). The final goal is to predict which graphs optimizes a series of transpositions.\n", "\n", "The target could be the processing time or the logarithm of this time. However, making mistakes on small times is not an issue but errors on high processing time is not a good thing.\n", "\n", "We could also try to predict a ratio *transposition time /copy time* but it still gives more important to small matrix size. \n", "\n", "Many variables are correlated. Variables should be selected."]}, {"cell_type": "markdown", "id": "af7f29f9", "metadata": {}, "source": ["### Dataset"]}, {"cell_type": "code", "execution_count": 27, "id": "249b9319", "metadata": {}, "outputs": [], "source": ["X = fdata.drop([\"yt\", \"yr\"], axis=1)\n", "x_names = list(X.columns)\n", "yt = fdata['yt'] * 1000"]}, {"cell_type": "code", "execution_count": 28, "id": "1a9f6cde", "metadata": {}, "outputs": [{"data": {"text/plain": ["1.8809171132996723"]}, "execution_count": 29, "metadata": {}, "output_type": "execute_result"}], "source": ["numpy.mean(yt)"]}, {"cell_type": "markdown", "id": "3dde6140", "metadata": {}, "source": ["### Simple model "]}, {"cell_type": "code", "execution_count": 29, "id": "66638541", "metadata": {}, "outputs": [{"data": {"text/plain": ["(0.8157414076410756, 0.6368865305095469)"]}, "execution_count": 30, "metadata": {}, "output_type": "execute_result"}], "source": ["from sklearn.linear_model import LinearRegression\n", "from sklearn.preprocessing import StandardScaler\n", "from sklearn.pipeline import make_pipeline\n", "from sklearn.metrics import r2_score, mean_absolute_error\n", "\n", "pipe = make_pipeline(StandardScaler(with_mean=False), LinearRegression(fit_intercept=False))\n", "pipe.fit(X, yt)\n", "model = pipe.steps[1][1]\n", "coef = {k: v for k, v in zip(X.columns, model.coef_)}\n", "coef['name'] = 'reg'\n", "coef['intercept_'] = model.intercept_\n", "pred = numpy.maximum(pipe.predict(X), 0)\n", "coef['r2'] = r2_score(yt, pred)\n", "coef['mae'] = mean_absolute_error(yt, pred)\n", "coef['model'] = pipe\n", "coefs = [coef]\n", "coef[\"r2\"], coef['mae']"]}, {"cell_type": "code", "execution_count": 30, "id": "bb8d7cbb", "metadata": {}, "outputs": [{"data": {"image/png": "iVBORw0KGgoAAAANSUhEUgAAAzoAAADMCAYAAAC7ktYtAAAAOXRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjQuMiwgaHR0cHM6Ly9tYXRwbG90bGliLm9yZy8rg+JYAAAACXBIWXMAAAsTAAALEwEAmpwYAAAyq0lEQVR4nO3debwcVZn/8c8XCAQEBCFAZEtEZBMFjIDgCIIMbiwqEBUcQAUXFnGbAVFB3Jf5uYELKtuIA4jDEBEFZVUQJAlrAhkBQcIaUCKi7M/vj3M66XTuTXKr6tx7q/N9v173dburu596bt/qrjpV5zxHEYGZmZmZmVk/WWakEzAzMzMzM2uaGzpmZmZmZtZ33NAxMzMzM7O+44aOmZmZmZn1HTd0zMzMzMys77ihY2ZmZmZmfWfUN3QknSLpIUm3LMFzXyNpuqRnJO3TtXwrSb+XNEPSTZIml83azMzMzMxG0qhv6ACnAa9fwuf+GTgI+EnP8n8A/xYRW+RY35C0WkP5mZmZmZnZKLPcSCewOBFxpaQJ3cskbQScBIwjNWIOiYjbIuKu/PhzPTH+r+v2fZIeyq99tGjyZmZmZmY2IkZ9Q2cQJwPvj4g/StoO+A6wy5K8UNK2wPLAHQXzMzMzMzOzEdS6ho6klYEdgJ9K6ixeYQlfOx74L+DAiHhucc83MzMzM7N2al1DhzSu6NGI2GooL5K0KvAL4NiIuKZEYmZmZmZmNjq0oRjBAiLib8CfJO0LoOTli3qNpOWB84AzIuLcYUjTzMzMzMxGkCJipHNYJEn/DewMrAk8CBwHXAp8FxgPjAHOiogTJL2S1KBZHXgCeCAitpB0AHAqMKMr9EERccNw/R1mZmZmZjZ8Rn1Dx8zMzMzMbKha13XNzMzMzMxscUZtMYI111wzJkyYMNJpmJmZmZnZKDZt2rSHI2Jc7/JR29CZMGECU6dOHek0zMzMzMxsFJN090DL3XXNzMzMzMz6jhs6ZmZmZmbWd9zQMTMzMzOzvtPIGB1JpwBvBh6KiJcO8LiAbwJvBP5BmsNmehPrNltaTTj6F0v83Lu+9KaCmZiZmdlwefrpp5k9ezZPPPHESKcy7MaOHct6663HmDFjluj5TRUjOA04EThjkMffAGycf7YjTfa5XUPrNjMzMzNbKsyePZtVVlmFCRMmkK4lLB0igkceeYTZs2czceLEJXpNI13XIuJK4C+LeMpewBmRXAOsJml8E+s2MzMzM1taPPHEE6yxxhpLVSMHQBJrrLHGkK5kDdcYnXWBe7ruz87LFiDpUElTJU2dM2fOMKVmZmZmZtYeS1sjp2Oof/eoKkYQESdHxKSImDRu3EJz/piZmZmZmS2R4Zow9F5g/a776+VlZmZmZmZW0VCKEy2JEgWMVl55Zf7+9783HndxhuuKzhTg35RsD8yNiPuHad1mZmZmZraUaaShI+m/gd8Dm0iaLek9kt4v6f35KRcCdwK3Az8APtjEes3MzMzMbHgdffTRnHTSSfPuH3/88Xzuc59j1113ZZtttmHLLbfk/PPPX+h1l19+OW9+85vn3T/88MM57bTTAJg2bRo77bQTr3jFK9h99925//7610Qa6boWEe9YzOMBHNbEuszMzMzMbORMnjyZo446isMOS4f355xzDhdddBFHHnkkq666Kg8//DDbb789e+655xIVEHj66ac54ogjOP/88xk3bhxnn302xx57LKecckqtPIdrjI6ZmZmZmfWBrbfemoceeoj77ruPOXPmsPrqq7POOuvw4Q9/mCuvvJJlllmGe++9lwcffJB11llnsfFmzZrFLbfcwm677QbAs88+y/jx9WeicUPHzMzMzMyGZN999+Xcc8/lgQceYPLkyZx55pnMmTOHadOmMWbMGCZMmLDQnDfLLbcczz333Lz7nccjgi222ILf//73jeY4qspLm5mZmZnZ6Dd58mTOOusszj33XPbdd1/mzp3LWmutxZgxY7jsssu4++67F3rNhhtuyMyZM3nyySd59NFHueSSSwDYZJNNmDNnzryGztNPP82MGTNq5+grOmZmZmZmLVWiHPSS2GKLLXjsscdYd911GT9+PPvvvz977LEHW265JZMmTWLTTTdd6DXrr78+++23Hy996UuZOHEiW2+9NQDLL7885557LkceeSRz587lmWee4aijjmKLLbaolaNSnYDRZ9KkSTF16tSRTsNs1BpK3fyR+hI0MzOzZt16661sttlmI53GiBno75c0LSIm9T7XXdfMzMzMzKzvuKFjZmZmZmZ9xw0dMzMzM7MWGa1DT0ob6t/tho6ZmZmZWUuMHTuWRx55ZKlr7EQEjzzyCGPHjl3i17jqmpmZmZlZS6y33nrMnj2bOXPmjHQqw27s2LGst956S/x8N3TM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\n", "text/plain": ["
"]}, "metadata": {"needs_background": "light"}, "output_type": "display_data"}], "source": ["df = DataFrame([(k, v) for k, v in coef.items() if k not in {'name', 'model'}],\n", " columns=[\"feature\", \"value\"]).set_index(\"feature\")\n", "df.plot(kind=\"bar\", figsize=(14, 2));"]}, {"cell_type": "code", "execution_count": 31, "id": "7b0117ba", "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", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
value
feature
CST_-3.076618e+08
begin-2.941725e+01
dbegin-1.854147e-01
dend-9.638954e-02
dim-1.037599e-01
discont5.204404e-01
edit3.582481e-01
end-1.046584e+12
end16-2.278042e+10
end321.069321e+12
ibegin16-3.713466e+00
ibegin21.439716e-02
ibegin323.784367e+00
ibegin4-6.813416e+00
ibegin64-7.576102e-02
ibegin86.927856e+00
iend162.028144e+07
iend28.225773e+06
iend324.322857e+07
iend41.097274e+07
iend641.996315e-01
iend82.028143e+07
middle1.541218e+00
rbegin4.940619e+01
rdiscont7.614642e-01
redit8.622710e-02
rend6.615750e+02
rend163.459172e+02
rend32-1.057057e+03
rev1.537206e-01
rmiddle-4.563712e-01
rot7.771901e-02
size1.295707e+00
intercept_0.000000e+00
r28.157414e-01
mae6.368865e-01
\n", "
"], "text/plain": [" value\n", "feature \n", "CST_ -3.076618e+08\n", "begin -2.941725e+01\n", "dbegin -1.854147e-01\n", "dend -9.638954e-02\n", "dim -1.037599e-01\n", "discont 5.204404e-01\n", "edit 3.582481e-01\n", "end -1.046584e+12\n", "end16 -2.278042e+10\n", "end32 1.069321e+12\n", "ibegin16 -3.713466e+00\n", "ibegin2 1.439716e-02\n", "ibegin32 3.784367e+00\n", "ibegin4 -6.813416e+00\n", "ibegin64 -7.576102e-02\n", "ibegin8 6.927856e+00\n", "iend16 2.028144e+07\n", "iend2 8.225773e+06\n", "iend32 4.322857e+07\n", "iend4 1.097274e+07\n", "iend64 1.996315e-01\n", "iend8 2.028143e+07\n", "middle 1.541218e+00\n", "rbegin 4.940619e+01\n", "rdiscont 7.614642e-01\n", "redit 8.622710e-02\n", "rend 6.615750e+02\n", "rend16 3.459172e+02\n", "rend32 -1.057057e+03\n", "rev 1.537206e-01\n", "rmiddle -4.563712e-01\n", "rot 7.771901e-02\n", "size 1.295707e+00\n", "intercept_ 0.000000e+00\n", "r2 8.157414e-01\n", "mae 6.368865e-01"]}, "execution_count": 32, "metadata": {}, "output_type": "execute_result"}], "source": ["df"]}, {"cell_type": "markdown", "id": "50593ad2", "metadata": {}, "source": ["Coefficients associated to features *end*, *end16* are almost opposed and it would better to get a model which keeps only one."]}, {"cell_type": "markdown", "id": "4934670e", "metadata": {}, "source": ["### Quantile Regression"]}, {"cell_type": "code", "execution_count": 32, "id": "92fcd452", "metadata": {}, "outputs": [{"data": {"text/plain": ["(0.7924498414927943, 0.5679387557069854)"]}, "execution_count": 33, "metadata": {}, "output_type": "execute_result"}], "source": ["from mlinsights.mlmodel import QuantileLinearRegression\n", "pipe = make_pipeline(StandardScaler(with_mean=False), QuantileLinearRegression(fit_intercept=False))\n", "pipe.fit(X, yt)\n", "model = pipe.steps[1][1]\n", "coef = {k: v for k, v in zip(X.columns, model.coef_)}\n", "coef['name'] = 'med'\n", "coef['intercept_'] = model.intercept_\n", "pred = numpy.maximum(pipe.predict(X), 0)\n", "coef['r2'] = r2_score(yt, pred)\n", "coef['mae'] = mean_absolute_error(yt, pred)\n", "coef['model'] = pipe\n", "coefs.append(coef)\n", "coef[\"r2\"], coef['mae']"]}, {"cell_type": "code", "execution_count": 33, "id": "bc74043c", "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", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
value
feature
CST_1433409.249051
begin27.13405
dbegin0.07931
dend0.087576
dim0.006919
discont0.413378
edit0.186032
end4876069525.422424
end16106134745.367844
end32-4982003112.711292
ibegin160.129918
ibegin2-0.069604
ibegin32-0.221099
ibegin4-0.045585
ibegin64-0.1085
ibegin80.073031
iend16-94492.918693
iend2-38324.37475
iend32-201401.795017
iend4-51122.392443
iend640.15928
iend8-94492.881923
middle1.588707
rbegin36.958438
rdiscont0.375421
redit0.071189
rend4424.263222
rend16-7664.018684
rend323202.681647
rev0.08288
rmiddle-0.207068
rot-0.095643
size0.938597
namemed
intercept_0
r20.79245
mae0.567939
model(StandardScaler(with_mean=False), QuantileLine...
\n", "
"], "text/plain": [" value\n", "feature \n", "CST_ 1433409.249051\n", "begin 27.13405\n", "dbegin 0.07931\n", "dend 0.087576\n", "dim 0.006919\n", "discont 0.413378\n", "edit 0.186032\n", "end 4876069525.422424\n", "end16 106134745.367844\n", "end32 -4982003112.711292\n", "ibegin16 0.129918\n", "ibegin2 -0.069604\n", "ibegin32 -0.221099\n", "ibegin4 -0.045585\n", "ibegin64 -0.1085\n", "ibegin8 0.073031\n", "iend16 -94492.918693\n", "iend2 -38324.37475\n", "iend32 -201401.795017\n", "iend4 -51122.392443\n", "iend64 0.15928\n", "iend8 -94492.881923\n", "middle 1.588707\n", "rbegin 36.958438\n", "rdiscont 0.375421\n", "redit 0.071189\n", "rend 4424.263222\n", "rend16 -7664.018684\n", "rend32 3202.681647\n", "rev 0.08288\n", "rmiddle -0.207068\n", "rot -0.095643\n", "size 0.938597\n", "name med\n", "intercept_ 0\n", "r2 0.79245\n", "mae 0.567939\n", "model (StandardScaler(with_mean=False), QuantileLine..."]}, "execution_count": 34, "metadata": {}, "output_type": "execute_result"}], "source": ["DataFrame(coef.items(), columns=[\"feature\", \"value\"]).set_index(\"feature\")"]}, {"cell_type": "markdown", "id": "c051acc4", "metadata": {}, "source": ["### Lasso\n", "\n", "To select features."]}, {"cell_type": "code", "execution_count": 34, "id": "cf893b4f", "metadata": {"scrolled": false}, "outputs": [{"name": "stderr", "output_type": "stream", "text": ["100%|\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588| 13/13 [00:00<00:00, 69.97it/s]\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", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
r2maealphanulln
00.8097040.6294800.001433
10.8075460.6298860.0101033
20.7825410.6764990.1002333
30.7669110.6803440.2002833
40.7515460.7036840.3002933
50.7382230.7429620.4003033
60.7309370.7359580.5003133
70.7184370.7581430.6003033
80.7013290.8005030.7003033
90.6815900.8485490.8003033
100.6592180.8987700.9003033
110.6342180.9494931.0003033
120.2394131.6005422.0003033
\n", "
"], "text/plain": [" r2 mae alpha null n\n", "0 0.809704 0.629480 0.001 4 33\n", "1 0.807546 0.629886 0.010 10 33\n", "2 0.782541 0.676499 0.100 23 33\n", "3 0.766911 0.680344 0.200 28 33\n", "4 0.751546 0.703684 0.300 29 33\n", "5 0.738223 0.742962 0.400 30 33\n", "6 0.730937 0.735958 0.500 31 33\n", "7 0.718437 0.758143 0.600 30 33\n", "8 0.701329 0.800503 0.700 30 33\n", "9 0.681590 0.848549 0.800 30 33\n", "10 0.659218 0.898770 0.900 30 33\n", "11 0.634218 0.949493 1.000 30 33\n", "12 0.239413 1.600542 2.000 30 33"]}, "execution_count": 35, "metadata": {}, "output_type": "execute_result"}], "source": ["from sklearn.linear_model import Lasso\n", "\n", "scores = []\n", "models = []\n", "for a in tqdm([0.001, 0.01, 0.1, 0.2, 0.3, 0.4, 0.5, 0.6, 0.7, 0.8, 0.9, 1., 2.]):\n", " alpha = a * 1.\n", " pipe = make_pipeline(\n", " StandardScaler(with_mean=False),\n", " Lasso(alpha=alpha, fit_intercept=False, max_iter=5000))\n", " pipe.fit(X, yt)\n", " pred = numpy.maximum(pipe.predict(X), 0)\n", " model = pipe.steps[1][1]\n", " scores.append(dict(r2=r2_score(yt, pred), mae=mean_absolute_error(yt, pred),\n", " alpha=alpha, null=(numpy.abs(model.coef_) < 1e-6).sum(),\n", " n=len(model.coef_)))\n", " models.append(pipe)\n", " if alpha >= 0.01 and alpha <= 0.2:\n", " coef = {k: v for k, v in zip(X.columns, pipe.steps[1][1].coef_)}\n", " coef['name'] = \"Lasso-%f\" % alpha\n", " coef['model'] = pipe\n", " coef['r2'] = r2_score(yt, pred)\n", " coef['mae'] = mean_absolute_error(yt, pred)\n", " coefs.append(coef)\n", " \n", "DataFrame(scores)"]}, {"cell_type": "code", "execution_count": 35, "id": "b2a2e3b6", "metadata": {}, "outputs": [{"data": {"image/png": "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\n", "text/plain": ["
"]}, "metadata": {"needs_background": "light"}, "output_type": "display_data"}], "source": ["coef = {k: v for k, v in zip(X.columns, models[1].steps[1][1].coef_)}\n", "df = DataFrame(coef.items(), columns=[\"feature\", \"value\"]).set_index(\"feature\")\n", "df.plot(kind=\"bar\", figsize=(14, 2), title=\"alpha=%f\" % scores[1][\"alpha\"]);"]}, {"cell_type": "code", "execution_count": 36, "id": "62f9c62b", "metadata": {}, "outputs": [{"data": {"image/png": "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\n", "text/plain": ["
"]}, "metadata": {"needs_background": "light"}, "output_type": "display_data"}], "source": ["coef = {k: v for k, v in zip(X.columns, models[2].steps[1][1].coef_)}\n", "df = DataFrame(coef.items(), columns=[\"feature\", \"value\"]).set_index(\"feature\")\n", "df.plot(kind=\"bar\", figsize=(14, 2), title=\"alpha=%f\" % scores[2][\"alpha\"]);"]}, {"cell_type": "markdown", "id": "e2ca7fc5", "metadata": {}, "source": ["### Linear regression with positive weights"]}, {"cell_type": "code", "execution_count": 37, "id": "d73428ae", "metadata": {}, "outputs": [{"data": {"text/plain": ["(0.7905447080626958, 0.6768663007518693)"]}, "execution_count": 38, "metadata": {}, "output_type": "execute_result"}], "source": ["pipe = make_pipeline(StandardScaler(with_mean=False), LinearRegression(positive=True, fit_intercept=False))\n", "pipe.fit(X, yt)\n", "model = pipe.steps[1][1]\n", "coef = {k: v for k, v in zip(X.columns, model.coef_)}\n", "coef['name'] = 'pos'\n", "coef['intercept_'] = model.intercept_\n", "pred = numpy.maximum(pipe.predict(X), 0)\n", "coef['r2'] = r2_score(yt, pred)\n", "coef['mae'] = mean_absolute_error(yt, pred)\n", "coef['model'] = pipe\n", "coefs.append(coef)\n", "coef[\"r2\"], coef['mae']"]}, {"cell_type": "code", "execution_count": 38, "id": "f5690715", "metadata": {}, "outputs": [{"data": {"image/png": "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\n", "text/plain": ["
"]}, "metadata": {"needs_background": "light"}, "output_type": "display_data"}], "source": ["coef = {k: v for k, v in zip(X.columns, pipe.steps[1][1].coef_)}\n", "df = DataFrame(coef.items(), columns=[\"feature\", \"value\"]).set_index(\"feature\")\n", "df.plot(kind=\"bar\", figsize=(14, 2), title=\"positive\");"]}, {"cell_type": "markdown", "id": "bd2436d5", "metadata": {}, "source": ["### Quantile regression with positive weights"]}, {"cell_type": "code", "execution_count": 39, "id": "497f7a66", "metadata": {}, "outputs": [{"data": {"text/plain": ["(0.752689515971656, 0.6468340444504788)"]}, "execution_count": 40, "metadata": {}, "output_type": "execute_result"}], "source": ["pipe = make_pipeline(StandardScaler(with_mean=False), QuantileLinearRegression(positive=True, fit_intercept=False))\n", "pipe.fit(X, yt)\n", "model = pipe.steps[1][1]\n", "coef = {k: v for k, v in zip(X.columns, model.coef_)}\n", "coef['name'] = 'medpos'\n", "coef['intercept_'] = model.intercept_\n", "pred = numpy.maximum(pipe.predict(X), 0)\n", "coef['r2'] = r2_score(yt, pred)\n", "coef['mae'] = mean_absolute_error(yt, pred)\n", "coef['model'] = pipe\n", "coefs.append(coef)\n", "coef[\"r2\"], coef['mae']"]}, {"cell_type": "code", "execution_count": 40, "id": "893554e3", "metadata": {}, "outputs": [{"data": {"image/png": "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\n", "text/plain": ["
"]}, "metadata": {"needs_background": "light"}, "output_type": "display_data"}], "source": ["coef = {k: v for k, v in zip(X.columns, pipe.steps[1][1].coef_)}\n", "df = DataFrame(coef.items(), columns=[\"feature\", \"value\"]).set_index(\"feature\")\n", "df.plot(kind=\"bar\", figsize=(14, 2), title=\"positive\");"]}, {"cell_type": "markdown", "id": "b9229d31", "metadata": {}, "source": ["### Summary"]}, {"cell_type": "code", "execution_count": 41, "id": "ee71336c", "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", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
6543210
CST_0.8294820.8210480.00.00.01433409.249051-307661768.128088
begin0.00.0-0.0-0.0-0.0344327.13405-29.417247
dbegin0.00.0-0.0-0.0-0.0447050.07931-0.185415
dend0.00.0-0.0-0.0-0.00.087576-0.09639
dim0.0238460.0-0.014763-0.030446-0.1209490.006919-0.10376
discont0.0606360.0562970.00.00.2104210.4133780.52044
edit0.038230.0948560.00.04180.3960520.1860320.358248
end0.00.0-0.0-0.0-0.0070534876069525.422424-1046583604803.358887
end160.00.0-0.0-0.0-0.000036106134745.367844-22780416305.902706
end320.00.0-0.0-0.0-0.00004-4982003112.7112921069320839370.567505
ibegin160.00.0-0.0-0.00.0666690.129918-3.713466
ibegin20.00.0-0.0-0.0-0.02181-0.0696040.014397
ibegin320.00.0-0.0-0.00.0-0.2210993.784367
ibegin40.00.0-0.0-0.00.0-0.045585-6.813416
ibegin640.00.0-0.0-0.00.0-0.1085-0.075761
ibegin80.00.0-0.0-0.00.00.0730316.927856
iend160.00.0-0.0-0.0-0.022416-94492.91869320281439.108194
iend20.00.00.0-0.00.0-38324.374758225773.255917
iend320.00.0-0.0-0.0-0.0-201401.79501743228573.054944
iend40.00.0-0.0-0.00.151081-51122.39244310972737.091606
iend640.00.0-0.0-0.0-0.00.159280.199631
iend80.00.0-0.0-0.0-0.08907-94492.88192320281426.580972
middle1.1015431.303471.2906991.3259161.4667331.5887071.541218
rbegin0.00.0-0.0-0.020369-0.2829536.95843849.406192
rdiscont0.00.00.0-0.0-0.0663850.3754210.761464
redit0.00.00.00.00.00.0711890.086227
rend0.00.0-0.0-0.007655-0.0075934424.263222661.575013
rend160.00.0-0.0-0.003393-0.010514-7664.018684345.917179
rend320.00.0-0.0-0.005349-0.0131723202.681647-1057.05651
rev0.0267570.1899090.0139920.0975850.1427910.082880.153721
rmiddle0.00.0-0.0-0.0-0.324716-0.207068-0.456371
rot0.0092220.1856870.1084680.1970210.108146-0.0956430.077719
size1.1005321.3002221.0994631.1835531.223290.9385971.295707
namemedposposLasso-0.200000Lasso-0.100000Lasso-0.010000medreg
intercept_0.00.0NaNNaNNaN0.00.0
r20.752690.7905450.7669110.7825410.8075460.792450.815741
mae0.6468340.6768660.6803440.6764990.6298860.5679390.636887
model(StandardScaler(with_mean=False), QuantileLine...(StandardScaler(with_mean=False), LinearRegres...(StandardScaler(with_mean=False), Lasso(alpha=...(StandardScaler(with_mean=False), Lasso(alpha=...(StandardScaler(with_mean=False), Lasso(alpha=...(StandardScaler(with_mean=False), QuantileLine...(StandardScaler(with_mean=False), LinearRegres...
\n", "
"], "text/plain": [" 6 \\\n", "CST_ 0.829482 \n", "begin 0.0 \n", "dbegin 0.0 \n", "dend 0.0 \n", "dim 0.023846 \n", "discont 0.060636 \n", "edit 0.03823 \n", "end 0.0 \n", "end16 0.0 \n", "end32 0.0 \n", "ibegin16 0.0 \n", "ibegin2 0.0 \n", "ibegin32 0.0 \n", "ibegin4 0.0 \n", "ibegin64 0.0 \n", "ibegin8 0.0 \n", "iend16 0.0 \n", "iend2 0.0 \n", "iend32 0.0 \n", "iend4 0.0 \n", "iend64 0.0 \n", "iend8 0.0 \n", "middle 1.101543 \n", "rbegin 0.0 \n", "rdiscont 0.0 \n", "redit 0.0 \n", "rend 0.0 \n", "rend16 0.0 \n", "rend32 0.0 \n", "rev 0.026757 \n", "rmiddle 0.0 \n", "rot 0.009222 \n", "size 1.100532 \n", "name medpos \n", "intercept_ 0.0 \n", "r2 0.75269 \n", "mae 0.646834 \n", "model (StandardScaler(with_mean=False), QuantileLine... \n", "\n", " 5 \\\n", "CST_ 0.821048 \n", "begin 0.0 \n", "dbegin 0.0 \n", "dend 0.0 \n", "dim 0.0 \n", "discont 0.056297 \n", "edit 0.094856 \n", "end 0.0 \n", "end16 0.0 \n", "end32 0.0 \n", "ibegin16 0.0 \n", "ibegin2 0.0 \n", "ibegin32 0.0 \n", "ibegin4 0.0 \n", "ibegin64 0.0 \n", "ibegin8 0.0 \n", "iend16 0.0 \n", "iend2 0.0 \n", "iend32 0.0 \n", "iend4 0.0 \n", "iend64 0.0 \n", "iend8 0.0 \n", "middle 1.30347 \n", "rbegin 0.0 \n", "rdiscont 0.0 \n", "redit 0.0 \n", "rend 0.0 \n", "rend16 0.0 \n", "rend32 0.0 \n", "rev 0.189909 \n", "rmiddle 0.0 \n", "rot 0.185687 \n", "size 1.300222 \n", "name pos \n", "intercept_ 0.0 \n", "r2 0.790545 \n", "mae 0.676866 \n", "model (StandardScaler(with_mean=False), LinearRegres... \n", "\n", " 4 \\\n", "CST_ 0.0 \n", "begin -0.0 \n", "dbegin -0.0 \n", "dend -0.0 \n", "dim -0.014763 \n", "discont 0.0 \n", "edit 0.0 \n", "end -0.0 \n", "end16 -0.0 \n", "end32 -0.0 \n", "ibegin16 -0.0 \n", "ibegin2 -0.0 \n", "ibegin32 -0.0 \n", "ibegin4 -0.0 \n", "ibegin64 -0.0 \n", "ibegin8 -0.0 \n", "iend16 -0.0 \n", "iend2 0.0 \n", "iend32 -0.0 \n", "iend4 -0.0 \n", "iend64 -0.0 \n", "iend8 -0.0 \n", "middle 1.290699 \n", "rbegin -0.0 \n", "rdiscont 0.0 \n", "redit 0.0 \n", "rend -0.0 \n", "rend16 -0.0 \n", "rend32 -0.0 \n", "rev 0.013992 \n", "rmiddle -0.0 \n", "rot 0.108468 \n", "size 1.099463 \n", "name Lasso-0.200000 \n", "intercept_ NaN \n", "r2 0.766911 \n", "mae 0.680344 \n", "model (StandardScaler(with_mean=False), Lasso(alpha=... \n", "\n", " 3 \\\n", "CST_ 0.0 \n", "begin -0.0 \n", "dbegin -0.0 \n", "dend -0.0 \n", "dim -0.030446 \n", "discont 0.0 \n", "edit 0.0418 \n", "end -0.0 \n", "end16 -0.0 \n", "end32 -0.0 \n", "ibegin16 -0.0 \n", "ibegin2 -0.0 \n", "ibegin32 -0.0 \n", "ibegin4 -0.0 \n", "ibegin64 -0.0 \n", "ibegin8 -0.0 \n", "iend16 -0.0 \n", "iend2 -0.0 \n", "iend32 -0.0 \n", "iend4 -0.0 \n", "iend64 -0.0 \n", "iend8 -0.0 \n", "middle 1.325916 \n", "rbegin -0.020369 \n", "rdiscont -0.0 \n", "redit 0.0 \n", "rend -0.007655 \n", "rend16 -0.003393 \n", "rend32 -0.005349 \n", "rev 0.097585 \n", "rmiddle -0.0 \n", "rot 0.197021 \n", "size 1.183553 \n", "name Lasso-0.100000 \n", "intercept_ NaN \n", "r2 0.782541 \n", "mae 0.676499 \n", "model (StandardScaler(with_mean=False), Lasso(alpha=... \n", "\n", " 2 \\\n", "CST_ 0.0 \n", "begin -0.03443 \n", "dbegin -0.044705 \n", "dend -0.0 \n", "dim -0.120949 \n", "discont 0.210421 \n", "edit 0.396052 \n", "end -0.007053 \n", "end16 -0.000036 \n", "end32 -0.00004 \n", "ibegin16 0.066669 \n", "ibegin2 -0.02181 \n", "ibegin32 0.0 \n", "ibegin4 0.0 \n", "ibegin64 0.0 \n", "ibegin8 0.0 \n", "iend16 -0.022416 \n", "iend2 0.0 \n", "iend32 -0.0 \n", "iend4 0.151081 \n", "iend64 -0.0 \n", "iend8 -0.08907 \n", "middle 1.466733 \n", "rbegin -0.28295 \n", "rdiscont -0.066385 \n", "redit 0.0 \n", "rend -0.007593 \n", "rend16 -0.010514 \n", "rend32 -0.013172 \n", "rev 0.142791 \n", "rmiddle -0.324716 \n", "rot 0.108146 \n", "size 1.22329 \n", "name Lasso-0.010000 \n", "intercept_ NaN \n", "r2 0.807546 \n", "mae 0.629886 \n", "model (StandardScaler(with_mean=False), Lasso(alpha=... \n", "\n", " 1 \\\n", "CST_ 1433409.249051 \n", "begin 27.13405 \n", "dbegin 0.07931 \n", "dend 0.087576 \n", "dim 0.006919 \n", "discont 0.413378 \n", "edit 0.186032 \n", "end 4876069525.422424 \n", "end16 106134745.367844 \n", "end32 -4982003112.711292 \n", "ibegin16 0.129918 \n", "ibegin2 -0.069604 \n", "ibegin32 -0.221099 \n", "ibegin4 -0.045585 \n", "ibegin64 -0.1085 \n", "ibegin8 0.073031 \n", "iend16 -94492.918693 \n", "iend2 -38324.37475 \n", "iend32 -201401.795017 \n", "iend4 -51122.392443 \n", "iend64 0.15928 \n", "iend8 -94492.881923 \n", "middle 1.588707 \n", "rbegin 36.958438 \n", "rdiscont 0.375421 \n", "redit 0.071189 \n", "rend 4424.263222 \n", "rend16 -7664.018684 \n", "rend32 3202.681647 \n", "rev 0.08288 \n", "rmiddle -0.207068 \n", "rot -0.095643 \n", "size 0.938597 \n", "name med \n", "intercept_ 0.0 \n", "r2 0.79245 \n", "mae 0.567939 \n", "model (StandardScaler(with_mean=False), QuantileLine... \n", "\n", " 0 \n", "CST_ -307661768.128088 \n", "begin -29.417247 \n", "dbegin -0.185415 \n", "dend -0.09639 \n", "dim -0.10376 \n", "discont 0.52044 \n", "edit 0.358248 \n", "end -1046583604803.358887 \n", "end16 -22780416305.902706 \n", "end32 1069320839370.567505 \n", "ibegin16 -3.713466 \n", "ibegin2 0.014397 \n", "ibegin32 3.784367 \n", "ibegin4 -6.813416 \n", "ibegin64 -0.075761 \n", "ibegin8 6.927856 \n", "iend16 20281439.108194 \n", "iend2 8225773.255917 \n", "iend32 43228573.054944 \n", "iend4 10972737.091606 \n", "iend64 0.199631 \n", "iend8 20281426.580972 \n", "middle 1.541218 \n", "rbegin 49.406192 \n", "rdiscont 0.761464 \n", "redit 0.086227 \n", "rend 661.575013 \n", "rend16 345.917179 \n", "rend32 -1057.05651 \n", "rev 0.153721 \n", "rmiddle -0.456371 \n", "rot 0.077719 \n", "size 1.295707 \n", "name reg \n", "intercept_ 0.0 \n", "r2 0.815741 \n", "mae 0.636887 \n", "model (StandardScaler(with_mean=False), LinearRegres... "]}, "execution_count": 42, "metadata": {}, "output_type": "execute_result"}], "source": ["dfcoef = DataFrame(coefs)\n", "dfcoef[::-1].T"]}, {"cell_type": "code", "execution_count": 42, "id": "31ce6479", "metadata": {}, "outputs": [{"data": {"image/png": "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\n", "text/plain": ["
"]}, "metadata": {"needs_background": "light"}, "output_type": "display_data"}], "source": ["dfcoef[[\"name\", \"r2\", \"mae\"]].set_index('name').plot(kind=\"bar\", title=\"performance accross models\");"]}, {"cell_type": "code", "execution_count": 43, "id": "ab8eb8cd", "metadata": {}, "outputs": [{"data": {"image/png": "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\n", "text/plain": ["
"]}, "metadata": {"needs_background": "light"}, "output_type": "display_data"}], "source": ["import matplotlib.pyplot as plt\n", "\n", "dfp = dfcoef.drop(['name', 'model'], axis=1).T.drop([0, 1], axis=1).copy()\n", "dfp.columns = dfcoef['name'][2:]\n", "ax = dfp.plot(figsize=(14, 4), kind=\"line\")\n", "ax.set_xticks(numpy.arange(0, dfp.shape[0]))\n", "ax.set_xticklabels(dfp.index)\n", "plt.setp(ax.get_xticklabels(), rotation=45, horizontalalignment='right');"]}, {"cell_type": "markdown", "id": "512edd9d", "metadata": {}, "source": ["## Investigation"]}, {"cell_type": "code", "execution_count": 44, "id": "d38e14a6", "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", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
averagedeviationmin_execmax_execnumberpermshaperatiodimpredicterrabserrrel
280.0001130.0000290.0000610.00014150(1, 0, 2)(43, 44, 45)1.51571130.0001131.251063e-071.251063e-070.001111
550.0008930.0002120.0006460.00147750(2, 3, 1, 0)(3, 244, 244, 1)8.33992640.000893-2.410649e-072.410649e-07-0.000270
260.0000770.0000080.0000690.00010150(0, 2, 1)(43, 44, 45)1.03275930.0000774.172780e-074.172780e-070.005440
390.0001260.0000170.0001070.00018550(2, 0, 1, 3)(3, 244, 244, 1)1.18099640.000115-1.179187e-051.179187e-05-0.093246
660.0001950.0000190.0001630.00025850(0, 3, 1, 2)(1, 244, 244, 3)1.59877040.0002101.510728e-051.510728e-050.077417
500.0006920.0001360.0005290.00102150(0, 3, 2, 1)(3, 244, 244, 1)6.46075940.0007091.714180e-051.714180e-050.024778
760.0008240.0002880.0005150.00187950(1, 3, 2, 0)(1, 244, 244, 3)6.75266340.0008431.902846e-051.902846e-050.023087
540.0008180.0002780.0006250.00152250(2, 1, 3, 0)(3, 244, 244, 1)7.63464640.0008432.572773e-052.572773e-050.031471
10.0000480.0000030.0000450.00005850(0, 1, 3, 2)(12, 13, 15, 18)0.82082140.000000-4.837787e-054.837787e-05-1.000000
20.0000490.0000030.0000450.00006250(3, 0, 1, 2)(12, 13, 15, 18)0.82307040.000000-4.851040e-054.851040e-05-1.000000
1200.0059180.0010850.0045980.00831215(1, 0, 3, 2)(3, 244, 244, 6)1.59735740.0082592.341673e-032.341673e-030.395716
1280.0106770.0014570.0085040.01407015(2, 3, 1, 0)(3, 244, 244, 6)2.88219140.008132-2.545011e-032.545011e-03-0.238356
1210.0061060.0005560.0056190.00730515(2, 0, 3, 1)(3, 244, 244, 6)1.64832540.0087002.593662e-032.593662e-030.424746
1180.0037800.0008820.0027010.00540215(3, 0, 1, 2)(3, 244, 244, 6)1.02043240.0064882.707333e-032.707333e-030.716171
1150.0036530.0008740.0025670.00524415(1, 2, 3, 0)(3, 244, 244, 6)0.98607140.0064882.834624e-032.834624e-030.775972
1290.0124210.0030520.0078180.01810615(3, 2, 1, 0)(3, 244, 244, 6)3.35277040.009386-3.034652e-033.034652e-03-0.244323
1190.0049380.0003670.0045320.00584415(1, 3, 0, 2)(3, 244, 244, 6)1.33306140.0087003.761588e-033.761588e-030.761694
1270.0103390.0027890.0058780.01830115(0, 3, 2, 1)(3, 244, 244, 6)2.79082340.005271-5.068171e-035.068171e-03-0.490205
1300.0134320.0044960.0065360.02125015(3, 2, 0, 1)(3, 244, 244, 6)3.62568040.008132-5.299336e-035.299336e-03-0.394540
1310.0145790.0040260.0071440.02073915(3, 0, 2, 1)(3, 244, 244, 6)3.93548340.008259-6.320138e-036.320138e-03-0.433499
\n", "
"], "text/plain": [" average deviation min_exec max_exec number perm \\\n", "28 0.000113 0.000029 0.000061 0.000141 50 (1, 0, 2) \n", "55 0.000893 0.000212 0.000646 0.001477 50 (2, 3, 1, 0) \n", "26 0.000077 0.000008 0.000069 0.000101 50 (0, 2, 1) \n", "39 0.000126 0.000017 0.000107 0.000185 50 (2, 0, 1, 3) \n", "66 0.000195 0.000019 0.000163 0.000258 50 (0, 3, 1, 2) \n", "50 0.000692 0.000136 0.000529 0.001021 50 (0, 3, 2, 1) \n", "76 0.000824 0.000288 0.000515 0.001879 50 (1, 3, 2, 0) \n", "54 0.000818 0.000278 0.000625 0.001522 50 (2, 1, 3, 0) \n", "1 0.000048 0.000003 0.000045 0.000058 50 (0, 1, 3, 2) \n", "2 0.000049 0.000003 0.000045 0.000062 50 (3, 0, 1, 2) \n", "120 0.005918 0.001085 0.004598 0.008312 15 (1, 0, 3, 2) \n", "128 0.010677 0.001457 0.008504 0.014070 15 (2, 3, 1, 0) \n", "121 0.006106 0.000556 0.005619 0.007305 15 (2, 0, 3, 1) \n", "118 0.003780 0.000882 0.002701 0.005402 15 (3, 0, 1, 2) \n", "115 0.003653 0.000874 0.002567 0.005244 15 (1, 2, 3, 0) \n", "129 0.012421 0.003052 0.007818 0.018106 15 (3, 2, 1, 0) \n", "119 0.004938 0.000367 0.004532 0.005844 15 (1, 3, 0, 2) \n", "127 0.010339 0.002789 0.005878 0.018301 15 (0, 3, 2, 1) \n", "130 0.013432 0.004496 0.006536 0.021250 15 (3, 2, 0, 1) \n", "131 0.014579 0.004026 0.007144 0.020739 15 (3, 0, 2, 1) \n", "\n", " shape ratio dim predict err abserr \\\n", "28 (43, 44, 45) 1.515711 3 0.000113 1.251063e-07 1.251063e-07 \n", "55 (3, 244, 244, 1) 8.339926 4 0.000893 -2.410649e-07 2.410649e-07 \n", "26 (43, 44, 45) 1.032759 3 0.000077 4.172780e-07 4.172780e-07 \n", "39 (3, 244, 244, 1) 1.180996 4 0.000115 -1.179187e-05 1.179187e-05 \n", "66 (1, 244, 244, 3) 1.598770 4 0.000210 1.510728e-05 1.510728e-05 \n", "50 (3, 244, 244, 1) 6.460759 4 0.000709 1.714180e-05 1.714180e-05 \n", "76 (1, 244, 244, 3) 6.752663 4 0.000843 1.902846e-05 1.902846e-05 \n", "54 (3, 244, 244, 1) 7.634646 4 0.000843 2.572773e-05 2.572773e-05 \n", "1 (12, 13, 15, 18) 0.820821 4 0.000000 -4.837787e-05 4.837787e-05 \n", "2 (12, 13, 15, 18) 0.823070 4 0.000000 -4.851040e-05 4.851040e-05 \n", "120 (3, 244, 244, 6) 1.597357 4 0.008259 2.341673e-03 2.341673e-03 \n", "128 (3, 244, 244, 6) 2.882191 4 0.008132 -2.545011e-03 2.545011e-03 \n", "121 (3, 244, 244, 6) 1.648325 4 0.008700 2.593662e-03 2.593662e-03 \n", "118 (3, 244, 244, 6) 1.020432 4 0.006488 2.707333e-03 2.707333e-03 \n", "115 (3, 244, 244, 6) 0.986071 4 0.006488 2.834624e-03 2.834624e-03 \n", "129 (3, 244, 244, 6) 3.352770 4 0.009386 -3.034652e-03 3.034652e-03 \n", "119 (3, 244, 244, 6) 1.333061 4 0.008700 3.761588e-03 3.761588e-03 \n", "127 (3, 244, 244, 6) 2.790823 4 0.005271 -5.068171e-03 5.068171e-03 \n", "130 (3, 244, 244, 6) 3.625680 4 0.008132 -5.299336e-03 5.299336e-03 \n", "131 (3, 244, 244, 6) 3.935483 4 0.008259 -6.320138e-03 6.320138e-03 \n", "\n", " rel \n", "28 0.001111 \n", "55 -0.000270 \n", "26 0.005440 \n", "39 -0.093246 \n", "66 0.077417 \n", "50 0.024778 \n", "76 0.023087 \n", "54 0.031471 \n", "1 -1.000000 \n", "2 -1.000000 \n", "120 0.395716 \n", "128 -0.238356 \n", "121 0.424746 \n", "118 0.716171 \n", "115 0.775972 \n", "129 -0.244323 \n", "119 0.761694 \n", "127 -0.490205 \n", "130 -0.394540 \n", "131 -0.433499 "]}, "execution_count": 45, "metadata": {}, "output_type": "execute_result"}], "source": ["data_err = data.drop([\"context_size\", \"repeat\"], axis=1).copy()\n", "data_err['predict'] = numpy.maximum(coefs[0]['model'].predict(X), 0) / 1000\n", "data_err['err'] = (data_err['predict'] - data_err['average'])\n", "data_err['abserr'] = numpy.abs(data_err['predict'] - data_err['average'])\n", "data_err['rel'] = (data_err['predict'] - data_err['average']) / data_err['average']\n", "s = data_err.sort_values('abserr')\n", "pandas.concat([s.head(n=10), s.tail(n=10)])"]}, {"cell_type": "markdown", "id": "0e6ccfdb", "metadata": {}, "source": ["All big errors are negative. The model seems to give a lower value for all big errors. These errors may be outliers, the processor was busy doing something else at that time."]}, {"cell_type": "code", "execution_count": 45, "id": "2c384543", "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", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
averagedeviationmin_execmax_execnumberpermshaperatiodimpredicterrabserrrel
200.0001580.0000210.0001270.00019250(3, 0, 2, 1)(12, 13, 15, 18)2.68487640.000000-0.0001580.000158-1.000000
420.0001470.0000170.0001060.00017550(0, 1, 3, 2)(3, 244, 244, 1)1.36997840.000000-0.0001470.000147-1.000000
340.0001510.0000160.0001360.00019750(1, 2, 0)(3, 244, 244)1.43844630.000000-0.0001510.000151-1.000000
330.0001240.0000170.0001080.00017150(2, 0, 1)(3, 244, 244)1.18566630.000000-0.0001240.000124-1.000000
440.0001890.0000440.0001420.00026550(1, 2, 3, 0)(3, 244, 244, 1)1.76690540.000000-0.0001890.000189-1.000000
270.0000970.0000040.0000830.00011050(2, 0, 1)(43, 44, 45)1.30091530.000000-0.0000970.000097-1.000000
250.0000740.0000090.0000650.00010950(0, 1, 2)(43, 44, 45)1.00000030.000000-0.0000740.000074-1.000000
240.0000730.0000090.0000620.00009450(1, 2, 0)(43, 44, 45)0.98551330.000000-0.0000730.000073-1.000000
220.0002140.0000600.0001360.00029550(1, 0, 3, 2)(12, 13, 15, 18)3.62724040.000000-0.0002140.000214-1.000000
210.0001640.0000450.0001240.00023150(3, 1, 2, 0)(12, 13, 15, 18)2.77819340.000000-0.0001640.000164-1.000000
1280.0106770.0014570.0085040.01407015(2, 3, 1, 0)(3, 244, 244, 6)2.88219140.008132-0.0025450.002545-0.238356
1300.0134320.0044960.0065360.02125015(3, 2, 0, 1)(3, 244, 244, 6)3.62568040.008132-0.0052990.005299-0.394540
1220.0067220.0018070.0050670.01124515(1, 3, 2, 0)(3, 244, 244, 6)1.81455240.0082590.0015370.0015370.228654
1250.0078150.0017570.0059320.01077915(2, 1, 3, 0)(3, 244, 244, 6)2.10948940.0082590.0004440.0004440.056871
1200.0059180.0010850.0045980.00831215(1, 0, 3, 2)(3, 244, 244, 6)1.59735740.0082590.0023420.0023420.395716
1230.0070710.0009820.0054540.00855915(3, 1, 0, 2)(3, 244, 244, 6)1.90866740.0082590.0011880.0011880.168070
1310.0145790.0040260.0071440.02073915(3, 0, 2, 1)(3, 244, 244, 6)3.93548340.008259-0.0063200.006320-0.433499
1210.0061060.0005560.0056190.00730515(2, 0, 3, 1)(3, 244, 244, 6)1.64832540.0087000.0025940.0025940.424746
1190.0049380.0003670.0045320.00584415(1, 3, 0, 2)(3, 244, 244, 6)1.33306140.0087000.0037620.0037620.761694
1290.0124210.0030520.0078180.01810615(3, 2, 1, 0)(3, 244, 244, 6)3.35277040.009386-0.0030350.003035-0.244323
\n", "
"], "text/plain": [" average deviation min_exec max_exec number perm \\\n", "20 0.000158 0.000021 0.000127 0.000192 50 (3, 0, 2, 1) \n", "42 0.000147 0.000017 0.000106 0.000175 50 (0, 1, 3, 2) \n", "34 0.000151 0.000016 0.000136 0.000197 50 (1, 2, 0) \n", "33 0.000124 0.000017 0.000108 0.000171 50 (2, 0, 1) \n", "44 0.000189 0.000044 0.000142 0.000265 50 (1, 2, 3, 0) \n", "27 0.000097 0.000004 0.000083 0.000110 50 (2, 0, 1) \n", "25 0.000074 0.000009 0.000065 0.000109 50 (0, 1, 2) \n", "24 0.000073 0.000009 0.000062 0.000094 50 (1, 2, 0) \n", "22 0.000214 0.000060 0.000136 0.000295 50 (1, 0, 3, 2) \n", "21 0.000164 0.000045 0.000124 0.000231 50 (3, 1, 2, 0) \n", "128 0.010677 0.001457 0.008504 0.014070 15 (2, 3, 1, 0) \n", "130 0.013432 0.004496 0.006536 0.021250 15 (3, 2, 0, 1) \n", "122 0.006722 0.001807 0.005067 0.011245 15 (1, 3, 2, 0) \n", "125 0.007815 0.001757 0.005932 0.010779 15 (2, 1, 3, 0) \n", "120 0.005918 0.001085 0.004598 0.008312 15 (1, 0, 3, 2) \n", "123 0.007071 0.000982 0.005454 0.008559 15 (3, 1, 0, 2) \n", "131 0.014579 0.004026 0.007144 0.020739 15 (3, 0, 2, 1) \n", "121 0.006106 0.000556 0.005619 0.007305 15 (2, 0, 3, 1) \n", "119 0.004938 0.000367 0.004532 0.005844 15 (1, 3, 0, 2) \n", "129 0.012421 0.003052 0.007818 0.018106 15 (3, 2, 1, 0) \n", "\n", " shape ratio dim predict err abserr rel \n", "20 (12, 13, 15, 18) 2.684876 4 0.000000 -0.000158 0.000158 -1.000000 \n", "42 (3, 244, 244, 1) 1.369978 4 0.000000 -0.000147 0.000147 -1.000000 \n", "34 (3, 244, 244) 1.438446 3 0.000000 -0.000151 0.000151 -1.000000 \n", "33 (3, 244, 244) 1.185666 3 0.000000 -0.000124 0.000124 -1.000000 \n", "44 (3, 244, 244, 1) 1.766905 4 0.000000 -0.000189 0.000189 -1.000000 \n", "27 (43, 44, 45) 1.300915 3 0.000000 -0.000097 0.000097 -1.000000 \n", "25 (43, 44, 45) 1.000000 3 0.000000 -0.000074 0.000074 -1.000000 \n", "24 (43, 44, 45) 0.985513 3 0.000000 -0.000073 0.000073 -1.000000 \n", "22 (12, 13, 15, 18) 3.627240 4 0.000000 -0.000214 0.000214 -1.000000 \n", "21 (12, 13, 15, 18) 2.778193 4 0.000000 -0.000164 0.000164 -1.000000 \n", "128 (3, 244, 244, 6) 2.882191 4 0.008132 -0.002545 0.002545 -0.238356 \n", "130 (3, 244, 244, 6) 3.625680 4 0.008132 -0.005299 0.005299 -0.394540 \n", "122 (3, 244, 244, 6) 1.814552 4 0.008259 0.001537 0.001537 0.228654 \n", "125 (3, 244, 244, 6) 2.109489 4 0.008259 0.000444 0.000444 0.056871 \n", "120 (3, 244, 244, 6) 1.597357 4 0.008259 0.002342 0.002342 0.395716 \n", "123 (3, 244, 244, 6) 1.908667 4 0.008259 0.001188 0.001188 0.168070 \n", "131 (3, 244, 244, 6) 3.935483 4 0.008259 -0.006320 0.006320 -0.433499 \n", "121 (3, 244, 244, 6) 1.648325 4 0.008700 0.002594 0.002594 0.424746 \n", "119 (3, 244, 244, 6) 1.333061 4 0.008700 0.003762 0.003762 0.761694 \n", "129 (3, 244, 244, 6) 3.352770 4 0.009386 -0.003035 0.003035 -0.244323 "]}, "execution_count": 46, "metadata": {}, "output_type": "execute_result"}], "source": ["s = data_err.sort_values('predict')\n", "pandas.concat([s.head(n=10), s.tail(n=10)])"]}, {"cell_type": "markdown", "id": "9ea9188b", "metadata": {}, "source": ["### Correlation between predictors"]}, {"cell_type": "code", "execution_count": 46, "id": "46c6e86e", "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", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
regmedLasso-0.010000Lasso-0.100000Lasso-0.200000posmedposyt
00.2987890.0524360.0000000.0000000.0000000.0000000.0000000.044222
10.0000000.0715750.0000000.0000000.0000000.0000000.0000000.048378
20.0000000.0483930.0000000.0000000.0000000.0000000.0000000.048510
30.0000000.0483930.0000000.0000000.0000000.0000000.0000000.048954
40.2480890.0507810.0000000.0000000.0000000.0000000.0000000.050805
...........................
1275.2707004.1770124.9171054.6154904.4644294.8370324.25138110.338870
1288.1323427.3547998.1071917.6469667.3348617.8583636.70654810.677354
1299.3860058.1861908.9912568.0824317.3973008.7710406.89620412.420657
1308.1323427.3547998.1071917.6469667.3348617.8583636.70654813.431679
1318.2592367.5610047.9621607.6056057.3348617.8297286.73897214.579374
\n", "

132 rows \u00d7 8 columns

\n", "
"], "text/plain": [" reg med Lasso-0.010000 Lasso-0.100000 Lasso-0.200000 \\\n", "0 0.298789 0.052436 0.000000 0.000000 0.000000 \n", "1 0.000000 0.071575 0.000000 0.000000 0.000000 \n", "2 0.000000 0.048393 0.000000 0.000000 0.000000 \n", "3 0.000000 0.048393 0.000000 0.000000 0.000000 \n", "4 0.248089 0.050781 0.000000 0.000000 0.000000 \n", ".. ... ... ... ... ... \n", "127 5.270700 4.177012 4.917105 4.615490 4.464429 \n", "128 8.132342 7.354799 8.107191 7.646966 7.334861 \n", "129 9.386005 8.186190 8.991256 8.082431 7.397300 \n", "130 8.132342 7.354799 8.107191 7.646966 7.334861 \n", "131 8.259236 7.561004 7.962160 7.605605 7.334861 \n", "\n", " pos medpos yt \n", "0 0.000000 0.000000 0.044222 \n", "1 0.000000 0.000000 0.048378 \n", "2 0.000000 0.000000 0.048510 \n", "3 0.000000 0.000000 0.048954 \n", "4 0.000000 0.000000 0.050805 \n", ".. ... ... ... \n", "127 4.837032 4.251381 10.338870 \n", "128 7.858363 6.706548 10.677354 \n", "129 8.771040 6.896204 12.420657 \n", "130 7.858363 6.706548 13.431679 \n", "131 7.829728 6.738972 14.579374 \n", "\n", "[132 rows x 8 columns]"]}, "execution_count": 47, "metadata": {}, "output_type": "execute_result"}], "source": ["cc = DataFrame(dict([(c['name'], numpy.maximum(c['model'].predict(X), 0)) for c in coefs]))\n", "cc['yt'] = yt\n", "cc"]}, {"cell_type": "code", "execution_count": 47, "id": "f751d4d4", "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", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
regmedLasso-0.010000Lasso-0.100000Lasso-0.200000posmedposyt
reg1.0000000.9941240.9969220.9857150.9798260.9883230.9804330.903528
med0.9941241.0000000.9958630.9899900.9873740.9903410.9884010.894833
Lasso-0.0100000.9969220.9958631.0000000.9926890.9879300.9944200.9883580.899384
Lasso-0.1000000.9857150.9899900.9926891.0000000.9985640.9987560.9979850.886902
Lasso-0.2000000.9798260.9873740.9879300.9985641.0000000.9950920.9993850.880614
pos0.9883230.9903410.9944200.9987560.9950921.0000000.9951690.890093
medpos0.9804330.9884010.9883580.9979850.9993850.9951691.0000000.881208
yt0.9035280.8948330.8993840.8869020.8806140.8900930.8812081.000000
\n", "
"], "text/plain": [" reg med Lasso-0.010000 Lasso-0.100000 \\\n", "reg 1.000000 0.994124 0.996922 0.985715 \n", "med 0.994124 1.000000 0.995863 0.989990 \n", "Lasso-0.010000 0.996922 0.995863 1.000000 0.992689 \n", "Lasso-0.100000 0.985715 0.989990 0.992689 1.000000 \n", "Lasso-0.200000 0.979826 0.987374 0.987930 0.998564 \n", "pos 0.988323 0.990341 0.994420 0.998756 \n", "medpos 0.980433 0.988401 0.988358 0.997985 \n", "yt 0.903528 0.894833 0.899384 0.886902 \n", "\n", " Lasso-0.200000 pos medpos yt \n", "reg 0.979826 0.988323 0.980433 0.903528 \n", "med 0.987374 0.990341 0.988401 0.894833 \n", "Lasso-0.010000 0.987930 0.994420 0.988358 0.899384 \n", "Lasso-0.100000 0.998564 0.998756 0.997985 0.886902 \n", "Lasso-0.200000 1.000000 0.995092 0.999385 0.880614 \n", "pos 0.995092 1.000000 0.995169 0.890093 \n", "medpos 0.999385 0.995169 1.000000 0.881208 \n", "yt 0.880614 0.890093 0.881208 1.000000 "]}, "execution_count": 48, "metadata": {}, "output_type": "execute_result"}], "source": ["cc.corr()"]}, {"cell_type": "markdown", "id": "ab74c8b9", "metadata": {}, "source": ["## Standalone predictions"]}, {"cell_type": "code", "execution_count": 48, "id": "4ff3905a", "metadata": {}, "outputs": [{"data": {"text/plain": ["{'CST_': 0.829481835464256,\n", " 'begin': 0.0,\n", " 'dbegin': 0.0,\n", " 'dend': 0.0,\n", " 'dim': 0.08294721851224843,\n", " 'discont': 0.07025394222472751,\n", " 'edit': 0.03782977428195987,\n", " 'end': 0.0,\n", " 'end16': 0.0,\n", " 'end32': 0.0,\n", " 'ibegin16': 0.0,\n", " 'ibegin2': 0.0,\n", " 'ibegin32': 0.0,\n", " 'ibegin4': 0.0,\n", " 'ibegin64': 0.0,\n", " 'ibegin8': 0.0,\n", " 'iend16': 0.0,\n", " 'iend2': 0.0,\n", " 'iend32': 0.0,\n", " 'iend4': 0.0,\n", " 'iend64': 0.0,\n", " 'iend8': 0.0,\n", " 'middle': 3.42896339670081e-06,\n", " 'rbegin': 0.0,\n", " 'rdiscont': 0.0,\n", " 'redit': 0.0,\n", " 'rend': 0.0,\n", " 'rend16': 0.0,\n", " 'rend32': 0.0,\n", " 'rev': 0.11940214295823245,\n", " 'rmiddle': 0.0,\n", " 'rot': 0.023189032947793925,\n", " 'size': 3.021302183272755e-06}"]}, "execution_count": 49, "metadata": {}, "output_type": "execute_result"}], "source": ["def get_coef(pipe, names):\n", " c1 = pipe.steps[0][-1].scale_\n", " c2 = pipe.steps[1][-1].coef_\n", " return dict(zip(names, c2 / c1))\n", "\n", "\n", "get_coef(coefs[-1][\"model\"], X.columns)"]}, {"cell_type": "code", "execution_count": 49, "id": "b52b1aab", "metadata": {}, "outputs": [{"data": {"text/plain": ["(0.005450704959759156, array([0.0054507]))"]}, "execution_count": 50, "metadata": {}, "output_type": "execute_result"}], "source": ["def predict(coefs, shape, perm):\n", " feat = compute_features(shape, perm)\n", " res = 0\n", " for k, v in feat.items():\n", " res += v * coefs[k]\n", " return res / 1000\n", "\n", "\n", "def predict_model(model, shape, perm, names):\n", " feat = compute_features(shape, perm)\n", " a = numpy.zeros((1, len(names)), dtype=numpy.float64)\n", " for i, n in enumerate(names):\n", " a[0, i] = feat[n]\n", " return model.predict(a) / 1000\n", " \n", "\n", "coef = get_coef(coefs[-1][\"model\"], X.columns)\n", "(predict(coef, (3, 224, 224, 6), (3, 0, 1, 2)), \n", " predict_model(coefs[-1][\"model\"], (3, 224, 224, 6), (3, 0, 1, 2), X.columns))"]}, {"cell_type": "code", "execution_count": 50, "id": "7f770721", "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.9.5"}}, "nbformat": 4, "nbformat_minor": 5}