{ "cells": [ { "cell_type": "markdown", "metadata": {}, "source": [ "## Code examples " ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### Base case" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "#### Description" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "This module helps to create energy efficient solutions for a context recognition problem. It assumes that the problem can be solved using different system's settings (e.g. different frequencies, different feature sets, different sensor subsets etc.) Each of these settings has a different energy cost, but also different classification quality (e.g. accuracy). Settings can be switched in runtime (e.g. using low acceleromter frequency when user is resting, but high when they are running), and this module is tasked with finding good rules for switching between them. It does so in a domain independent way by analyzing the statistical properties of the dataset" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "First part of the required input is a sequence of contexts (contexts are the classes of the classification system: e.g walking, standing, running in an activity recognition system). This sequence should be representative in both context proportions and their ordering to the sequences expected in the target domain." ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "In this toy example the contexts are simply numbers 1-3 (they could be strings instead). They represent a domain when each context appears 4 times and then transitions to the one represented by the next number." ] }, { "cell_type": "code", "execution_count": 3, "metadata": {}, "outputs": [], "source": [ "sequence = [0,0,0,0, 1,1,1,1, 2,2,2,2, 0]" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "In this hypothetical case, we have 6 different settings named \"a\"-\"f\". Their meaning is irrelevant to this module (perhaps they each represent a different sensor that could be used) and they can be presented by any hashable type. With each setting we classify the data from which the previous sequence was taken and store the results in a dictionary. We also supply the energy cost for using that setting for a one time unit." ] }, { "cell_type": "code", "execution_count": 4, "metadata": {}, "outputs": [], "source": [ "classified = {}\n", "classified[\"a\"] = [0,0,0,0, 1,1,1,1, 2,2,2,2, 0]\n", "classified[\"b\"] = [1,1,1,1, 1,1,1,1, 1,1,1,1, 1]\n", "classified[\"c\"] = [0,0,0,0, 2,1,2,1, 2,2,2,0, 0]\n", "classified[\"d\"] = [0,0,0,0, 1,1,1,2, 0,1,2,2, 0]\n", "classified[\"e\"] = [0,0,0,0, 0,0,0,0, 2,2,2,2, 0]\n", "classified[\"f\"] = [1,1,1,1, 1,1,1,1, 2,2,2,2, 1]\n", "\n", "energy = {\"a\":3, \"b\":1, \"c\":2, \"d\":2, \"e\":1, \"f\":1}" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "A brief commentary on the classified sequences:
\n", "Using setting \"a\" generated the same sequence to the original one, representing perfect classification. Its energy cost, however, its higher than all others.
\n", "Using setting \"b\" every instance was classified as \"1\", but its energy cost was the low.
\n", "Using setting \"c\" contexts \"0\" and \"2\" are accurately classified, while the context \"1\" is not.
\n", "Using setting \"d\" contexts \"0\" and \"1\" are accurately classified, while the context \"2\" is not.
\n", "Similarly for settings \"e\" and \"f\"." ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "All three input paramters are entered into the EnergyOptimizer object." ] }, { "cell_type": "code", "execution_count": 5, "metadata": {}, "outputs": [], "source": [ "from eecr import EnergyOptimizer\n", "from eecr import eeutility as util" ] }, { "cell_type": "code", "execution_count": 6, "metadata": {}, "outputs": [], "source": [ "optimizer = EnergyOptimizer(sequence=sequence, \n", " setting_to_sequence=classified, \n", " setting_to_energy=energy)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "#### Data summary" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "The EnergyOptimizer assumes that the context sequence has the Markov property and in transforms the sequences into the mathematical description of corresponding Markov chains. Some basic properties can be shown." ] }, { "cell_type": "code", "execution_count": 7, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ " Proportions Average lengths\n", "0 0.333333 4.0\n", "1 0.333333 4.0\n", "2 0.333333 4.0\n" ] } ], "source": [ "optimizer.summary()" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "For each setting, we can check its accuracy and energy consumption (they are shown in a tuple in this order). Accuracy can be substituted with any other quality metric (e.g. f-score) if needed." ] }, { "cell_type": "code", "execution_count": 7, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "{'a': (1.0, 3),\n", " 'b': (0.3333333333333333, 1),\n", " 'c': (0.75, 2),\n", " 'd': (0.75, 2),\n", " 'e': (0.6666666666666667, 1),\n", " 'f': (0.6666666666666667, 1)}" ] }, "execution_count": 7, "metadata": {}, "output_type": "execute_result" } ], "source": [ "optimizer.energy_quality()" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "If the desired context recognition system would always use one setting, only three out of six would come into consideration (printed below). Others are pareto dominated (they are worse in both accuracy and energy than one of the other solutions)." ] }, { "cell_type": "code", "execution_count": 8, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "a (1.0, 3)\n", "c (0.7692307692307693, 2)\n", "e (0.6923076923076923, 1)\n" ] } ], "source": [ "solutions, values = optimizer.find_sca_static()\n", "for (s,v) in zip(solutions, values):\n", " print (s, v)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "#### SCA method" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Suppose now, that we wish to change the setting based on the current context. E.g. if context 0 is detected, use setting \"a\", but for contexts \"1\" and \"2\" use settings \"d\" and \"e\" respectively. The expected performance of such assignment can be mathematically modeled using the \"sca_model\" method." ] }, { "cell_type": "code", "execution_count": 9, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "[(0.9535747446610956, 1.3514391829155061)]" ] }, "execution_count": 9, "metadata": {}, "output_type": "execute_result" } ], "source": [ "optimizer.sca_model([\"d\",\"f\",\"e\"])" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Using this context switching scheme we could achieve 95% accuracy and on average consume 1.35 units of energy." ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Note we assigned to use setting \"d\" when context 0 was detected. Since using this setting both \"0\" and \"1\" context are well classified (\"1\" always succeeds \"0\"), the assignment yield good results. If we used setting \"d\" that is good for recognizing contexts \"0\" and \"2\" instead, the results worsen." ] }, { "cell_type": "code", "execution_count": 10, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "[(0.8952062430323299, 1.3801560758082498)]" ] }, "execution_count": 10, "metadata": {}, "output_type": "execute_result" } ], "source": [ "optimizer.sca_model([\"c\",\"f\",\"e\"])" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "The mathematical model (beside being much faster then a simulation on a large dataset) can capture some performance anomalies that would otherwise go undetected. For example, if setting \"b\" is assigned to context \"1\", all classifications from this point on wozld be \"1\". This is easy to miss when simulating on this short sequence (sca_real) but is detected by the mathematical model and assigned an appropriate low accuracy." ] }, { "cell_type": "code", "execution_count": 11, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "[(0.6153846153846154, 1.6153846153846154)]" ] }, "execution_count": 11, "metadata": {}, "output_type": "execute_result" } ], "source": [ "optimizer.sca_real([\"a\",\"b\",\"a\"])" ] }, { "cell_type": "code", "execution_count": 12, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "[(0.3333333333333332, 1.0)]" ] }, "execution_count": 12, "metadata": {}, "output_type": "execute_result" } ], "source": [ "optimizer.sca_model([\"a\",\"b\",\"a\"])" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Good assignments can be found automatically using the \"find_sca_tradeoffs\" function." ] }, { "cell_type": "code", "execution_count": 13, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "['a', 'f', 'e'] (1.0, 1.6666666666666667)\n", "['d', 'f', 'e'] (0.9535747446610956, 1.3514391829155061)\n", "['f', 'f', 'e'] (0.7500000000000002, 1.0)\n", "['b', 'f', 'e'] (0.7500000000000002, 1.0)\n" ] } ], "source": [ "solutions_sca, values_sca = optimizer.find_sca_tradeoffs()\n", "for (s,v) in zip(solutions_sca, values_sca):\n", " print (s, v)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Performance can be easily visulized. Lower left corner presents the best solutions. It is immediately appearent that the solutions that use setting switching (SCA solutions) are better than those where the same one is always used (Static)." ] }, { "cell_type": "code", "execution_count": 14, "metadata": {}, "outputs": [ { "data": { "image/png": "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LVu2zB06v3r1ajZu3Fhm4FUTS5cuBaBjx461Oq7yX50+UF6SJEmSJNWOtm3bMmDAAGbOnJl7W+Fdd91VpTFmzZrFVVddRUqJyy67jFmzZvHxxx+zYsWK3OHwffr0AciFX7WltsfT3sNwS5IkSZKkfUibNm04++yzAXjrrbeq1Pehhx5i27ZtnH766dx2220cddRRFBQUbNemeIVVbWvXrh0A8+fP3yXjK38ZbkmSJEmStI9p2rQpQG4rIZA7e6uiFVILFy4E4Nhjjy2zft26dbmzsUorebZXdVZhde/eHYDHHnusyn21dzPckiRJkiRpLzFv3jzeeeedCtusX7+eCRMmAHDMMcfkyvfbbz8AVq1aVW7foqIiAN54440y62+66SY++uijMuuKx9/ZPcrzzW9+k4hgzpw53HHHHVXur72X4ZYkSZIkSXuJWbNmcfjhh3PeeefxwAMPsHjx4lzdunXrmDRpEieeeCLz5s0D2O4w+S5dMof0v/nmm/z9738vc/zTTjsNgP/7v//j5ptvZv369QAsW7aMH//4x4wYMYLWrVuX2bdFixYccMABANx9991VfrYuXbrkDscfPHgww4YN44MPPgBg69atvP322wwbNoxRo0ZVeWzlN8MtSZIkSZL2EoWFhWzdupVHHnmEvn37csABB9CkSRNatGhBs2bNOOuss5g5cyYFBQXcdNNNnHfeebm+nTt35qSTTmLLli10796d1q1bc/DBB3PwwQfnthp++ctfzvW55ppraNasGa1ataJt27bceuutXHrppZx55pnlzm/AgAEAXHnllTRr1iw3/siRIyv1fCNHjuSCCy5g69atDB8+nLZt29KyZUsaNWrEYYcdxvDhw1myZEl1vz7lKcMtSZIkSZL2Eqeffjpz587l1ltv5ZxzzuFTn/oUAGvXrqVFixZ87nOf44c//CGvv/46V1999Q79H374Yb7//e9zyCGHsHbtWubPn8/8+fPZuHFjrs24ceP4+c9/zpFHHklhYSEpJXr27Mk999zDH/7whwrnd91113HLLbfwmc98hpRSbvzKblNs2LAh48aNY+LEiXz1q1+lbdu2rFu3jjZt2tC9e3duuukmvvOd71ThG9PeIHyVZu3q2rVrmjFjxp6ehiRJkiRtp+8dLwIwbtDn9/BMdm727NkceeSRe3oaknahqv45j4hXUkpdy6pz5ZYkSZIkSZLyluGWJEmSJEmS8pbhliRJkiRJkvKW4ZYkSZIkSZLyluGWJEmSJEmS8pbhliRJkiRJkvKW4ZYkSZIkSZLyluGWJEmSJEmS8pbhliRJkiRJkvKW4ZYkSZIkSZLyluGWJEmSJEmS8pbhliRJkiRJkvKW4ZYkSZIkSZLyluGWJEmSJEmS8pbhliRJkiRJkvKW4ZYkSZIkSZLyluGWJEmSJElSKWPGjCEiOOWUU3b7vd99910igojY7ffOR4ZbkiRJkiTtRbZs2cKYMWM444wzaN++PQ0aNKBly5YceeSRfOUrX+GWW27h5Zdf3uk4f/vb3xg0aBBHHXUULVu2pEGDBnziE5/g5JNPZvjw4cybN2+nY7z++uu5kOawww6rjcfLexMmTGDYsGFMmzZtT09lr1F/T09AkiRJkiTVjmXLltG7d29mzJiRK2vUqBEpJebOncucOXN49NFHKSoqYtWqVWWOsWTJEvr168fUqVNzZfXr16d58+YsX76cZ555hmeeeYYbbriBK664gl/+8pflzmfMmDG5z2+//TYvvvgin//852v+oHlswoQJ3HPPPQDlrgorLCzk8MMP342zym+u3JIkSZIkaS/Rr18/ZsyYQfPmzfnFL37B4sWL2bBhA6tWrWL16tVMnjyZ73//+7Ro0aLM/gsXLuSEE05g6tSpNG7cmJ/+9Kf885//ZNOmTaxYsYJNmzbx0ksvMWTIEAoLCxk/fny5c9myZQv33XcfAAMGDADIhTqq2IEHHsicOXOYM2fOnp5KXjDckiRJkiRpLzBnzhyefPJJAO666y5+/OMf065du1x98+bN6dWrF7/73e+YPXv2Dv23bdtG3759ee+992jdujXPP/88N998M126dMmd/VRQUMAJJ5zAyJEjmTNnDscff3y583nsscf44IMP+PznP8+1115LRDBu3Dg2btxYy0+ufZ3hliRJkiRJe4E33ngj9/nMM8+ssG3jxo13KHvkkUd44YUXALjjjjs49thjKxyjU6dOjBs3rtz64lVaF110EZ06daJnz56sWrWKv/zlLxWOW5Ft27YxZswYTj31VFq3bk1hYSH7778/Xbp04dJLL+Xxxx8vs9+aNWsYNmwYn/3sZ2nWrBnNmjXjM5/5DEOHDmX16tVVnkfxOWLvvvtumfVlHQg/bdo0IiL3vQwfPjzXpnTbyhwo/+qrr9KvXz8OOuggGjZsSJs2bTj99NN56KGHyu1z8MEHExFMmzaNFStW8N///d8ccsghNGzYkAMPPJDvfOc7LF68uMy+1f3udwfP3JIkSZIkaS/z/vvv88lPfrJKfe644w4AjjzySM4///xK9SkvfFmxYgWTJk2ifv36XHDBBUAm5Hruuee45557cmVV9c1vfjO31RGgqKiINWvW8OGHH/Lmm2/y5ptvcsYZZ2zX51//+he9evVi/vz5ADRp0gTIhIFvvPEGY8aMYcqUKXTu3Llac6qsBg0a0LZtW1avXs3GjRtp2rQpzZo1q9ZYd955J9/73vfYtm0bAC1atGDVqlU8+eSTPPnkk/Tr148xY8ZQUFBQZv+FCxfSv39/5s+fT5MmTYgIFi1axP/+7/8yZcoUZs6cScuWLbfrU53vfndx5ZYkSZIkSXuB4447Lvd58ODBLFu2rNJ9N2/ezPPPPw/AWWedVeO53H///WzatInTTjuN/fffH4Cvfe1rFBYW8sQTT7BkyZIqj/nMM89w3333Ua9ePX7zm9+wZs0aVq1axcaNG1m0aBFjxozhC1/4wnZ9Nm3axPnnn8/8+fM56KCDePLJJ1m7di1r165lypQpdOzYkffee49zzz2Xjz/+uMbPXZEePXqwZMkS+vbtC8CPfvQjlixZst1PZbzwwgu5YKtPnz4sWLCAlStXsmrVKm666SYigrFjxzJixIhyx7j88stp2bIlL7zwAuvWrWPt2rVMnDiRFi1a8O677+7Qtzrf/e5kuCVJkiRJ0l7g0EMP5Vvf+hYATzzxBB06dKBXr15ce+21TJw4scKwa/78+axfvx6Az372szWeS/HWuwsvvDBX1rp1a8444wy2bt3Kn/70pyqP+dJLLwHw5S9/mR/+8Ic0b94cyKwea9++PRdffDG33nrrdn3GjRvHP/7xD+rXr8+jjz7Kaaedltvu96UvfYlHH32UwsJCZs2aVa057Qk/+9nP2LZtGz179uT++++nQ4cOADRr1oyrr76an/zkJwDccsstrFmzpswxGjZsyJQpU3Jvrqxfvz5nnXUW1157LQAPPvjgdu2r893vTm5LlCRJkiTln8d+Akve2Hm7uqzdp+G/fl6rQ44ePZo2bdrw29/+lk2bNjF16lSmTp2aq+/WrRtDhgzhwgsv3G5L4fLly3OfW7VqVaM5zJ49m+nTp9OkSRPOOeec7eouuugiJk2axD333MOVV15ZpXH3228/AD744AO2bdtGvXo7X69THNKcc845HH300TvUd+nShT59+vDnP/+ZBx54gEsvvbRKc9rdVqxYwVNPPQXAT3/60zK3HV511VX85je/Ye3atTz66KN8/etf36HNwIEDad269Q7l55xzDj/60Y+YN28e69ato2nTpkD1vvvdqW7NRpIkSZIkVVuDBg341a9+xYIFCxg1ahTf+MY36Ny5cy7Ievnll+nXrx99+/bNnddU24pXbZ111lk7nCl11lln0bx5c9544w1ee+21Ko3bq1cvGjRowMyZMznllFMYO3YsixYtqrDPzJkzATj11FPLbfPFL35xu7Z12auvvkpKiYjg5JNPLrNNUVFRbotqec/UrVu3MssPPPDA3OdVq1blPlfnu9+dXLklSZIkSco/tbziaW/ziU98gkGDBjFo0CAAli5dyqRJk7j++utZsGAB48ePp2fPngwZMgRgu1U8K1asqPZ9t23bxtixY4HttyQWa9y4Meeeey733nsv99xzD8ccc0ylx/7Upz7F7bffzmWXXcazzz7Ls88+C2TeAHjGGWcwcODAHd7wWLwVs2RoU1rxtr7ly5fngqO6qvh5ioqKKjyMvviZytuKWrytsLRGjRrlPm/evDn3uTrf/e7kyi1JkiRJkvZybdu2ZcCAAcycOZO2bdsCcNddd+XqO3XqlHuL4Ouvv17t+0yZMoX3338fyKzSKj7fquTPvffeC8B9993Hli1bqjT+pZdeyrx58xg5ciRnn302rVu35t1332XUqFEcd9xx3HzzzWX229WHxe9ue+J5qvvd7w6GW5IkSZIk7SPatGnD2WefDcBbb72VKy8sLKRnz54ATJo0qdrjF29JrIwPPviAxx57rMr3aNu2LUOGDGHChAksW7aM6dOnc+6555JS4mc/+xn/+Mc/cm2L39Q4f/78csdbuHAhkFm9VtlVW8VnXW3cuLHM+tWrV1dqnKoqfp4NGzZU+IKA4mcqbl9bqvLd706GW5IkSZIk7UOKDwlv0KDBduUDBw4E4M033+Thhx+u1FgppdznNWvW8MgjjwCZgGzlypXl/gwePBioWhhWloigW7dujB8/ng4dOrBt2zaee+65XP3nPvc5gNwh7GX529/+tl3bymjRogXwnxCptJdffrncvsWHsZf87irr2GOPzQVw5T3T6tWreeWVV4CqPVNV7ey7350MtyRJkiRJ2gvMmzePd955p8I269evZ8KECQA7nHd13nnn0b17dyATdL366qsVjjV//nz69u2b+338+PFs2LCB1q1bc8YZZ9CiRYtyf4r7TZo0qdJnfG3atKncuoKCAgoLC4Htt+z16dMHgMcee6zM55k1a1bujYoXXHBBpeYB8OlPfxqAiRMn7lD38ccfM3LkyHL7Fr95sOSB7ZXVqlWr3OH4t9xyS5kvBbjlllvYuHEjzZo1o3fv3lW+R1mq893vToZbkiRJkiTtBWbNmsXhhx/OeeedxwMPPMDixYtzdevWrWPSpEmceOKJzJs3DyB3mHyxevXq8cADD9ChQweWL1/OF77wBa655hpmz56da7N161amT5/OFVdcwRFHHMH06dNzdSXfkli/fsXvr+vZsydt27Zl06ZN3H///ZV6vquvvpo+ffowYcKE7QKxpUuX8oMf/IB58+YREZx22mm5ur59+/KZz3wGgHPOOYcpU6bkVkxNnTqV3r17s3nzZrp06cJFF11UqXnAf4Kw0aNHc/fdd+dCnVmzZtG7d+8K3yTYpUsXAB5//PHt/jeqrBtuuIF69eoxc+ZMvv71r+dWj61du5abb76Zn/8887KFn/zkJ7kgraaq893vViklf2rx57jjjkuSJEmSVNdcMOqFdMGoF/b0NCrlzTff3NNTyEuPP/54Arb7ady4cSoqKtqurKCgIN10003ljrNo0aJ0yimnbNensLAwtWrVKtWrV2+7smuuuSallNI777yTIiIB6a9//Wul5jto0KAEpOOPP75S7YcMGbLdnPbbb7/UvHnz7crKeq633347derUKdemSZMmqUmTJrnfO3bsmObOnbtDv7vvvjsB6eSTT96hbtOmTemEE07IjVG/fv203377JSC1atUqTZgwIVdX2rJly1KrVq0SkOrVq5fatWuXOnXqlDp16pRrM2/evHL7p5TSqFGjcv9bRERq2bJlKigoyPW56KKL0pYtW3boV/w9PPXUU+V+z8VjzJs3L1dW3e++IlX9cw7MSOVkMRVHqZIkSZIkKS+cfvrpzJ07l0mTJvHcc8/xz3/+k/fff5+1a9fSokULDj30UE466SQGDBiQWz1Ulvbt2/PUU08xZcoUxo0bx3PPPcfixYtZs2YNrVu35qijjqJXr15cfPHFHHTQQQDce++9pJRo3rw5vXr1qtR8zz//fO644w6mT5/OnDlzOOKIIypsf8UVV/DJT36SqVOnMnv2bBYvXszHH3/MQQcdRI8ePRg8eDAnnnjiDv0+9alP8frrr/PrX/+ahx9+mH//+98AHH300Zx77rlceeWVFBUVVWrOxQoLC5k8eTI33HAD48ePZ9GiRTRt2pTzzjuPoUOHVti3TZs2PPXUUwwfPpznn3+eZcuWsXXr1irdf9CgQXTr1o1f/epXTJs2jWXLllFUVMRxxx3HwIEDc9sxa0t1v/vdJVI1DjBT+bp27ZpmzJixp6chSZIkSdvpe8eLAIwb9Pk9PJOdmz17NkceeeSenoakXaiqf84j4pWUUtey6jxzS5IkSZIkSXnLcEuSJEmSJEl5y3BLkiRJkiRJeatOh1sRcVhEXB8RL0XEsoj4KCJei4hrIqJpJfqfEhFpJz89K9n+r7v2aSVJkiRJklRVdf1tiZcCg4G/AH8CNgOnAjcCF0RE95TShgr6zwa+WUZ5Q+BO4ENgehn1dwLPlipbWLWpS5IkSZIkaVer6+HWg8CIlNLqEmWjIuJt4Brg28Bvy+ucUloKjC1dHhHfILNq7d6U0uYyur6YUtqhnyRJkiRJkuqWOr0tMaU0o1SwVWxc9np0NYcekL3+b3kNIqJpRDSq5viSJEmSJEnaDep0uFWBDtnr0qp2jIhDyGxtfC6lNLecZv8DrAU2RMRbETEkIqJ6U5UkSZIkSdKuUte3Je4gIgqA64AtwH3VGOJSICh71dZmMud7PQosAg4gs/VxJHAMcEk17idJkiRJkqRdJO/CLTJBU3fg6gpWXpUpG4z1B9YA40vXp5SeB84u1Wc0mbCrf0T8IaX0XBnjDgQGAnTs2LEqU5IkSZIklSGlhBtopL1TSqlWx8urbYkRcQNwGXBnSmlENYY4ncyWxj+nlNZXpkNKaRtQfK/e5bS5M6XUNaXUdf/996/GtCRJkiRJxerXr8+mTZv29DQk7SKbN2+moKCg1sbLm3ArIoYB1wJ3A9+t5jDfzl7LPUi+HO9mr22qeV9JkiRJUiUVFRWxfPnyWl/dIaluWLNmDc2bN6+18fIi3IqIocBQ4F5gQKrGf+Ei4hPAV4F/pJRmVLF75+y1ygfYS5IkSZKqplWrVnz88ccsXLiQjz76iK1btxp0SXkupcSmTZv48MMPWblyJa1ataq1sev8mVsRcR0wDPgjcEl2m2BZ7doDRcB75Ww5/BZQSAWrtiKidUppeamyhtn7A0yq6vwlSZIkSVVTv359OnXqxMqVK1m5ciWLFi1i27Yy/yooKY8UFBTQvHlzOnbsSMOGDWtt3DodbkXEYGA48B4wBbiw1IGCS1NKk7OfRwAXA6cC08oY7lJgIzC2gls+HhGLgFf4z9sS+5FZuXVbSml6tR9GkiRJklRp9erVo3Xr1rRu3XpPT0VSHVenwy2gW/baEbinjPqngclllG8nInoARwL3pZRWVtD0QeAc4HKgBdiaZlEAACAASURBVLAOeBUYmlL6cxXmLUmSJEmSpN2gTodbKaX+QP+atk0pvQDs9B2yKaVbgFsqOz9JkiRJkiTtWXlxoLwkSZIkSZJUFsMtSZIkSZIk5S3DLUmSJEmSJOUtwy1JkiRJkiTlLcMtSZIkSZIk5S3DLUmSJEmSJOUtwy1JkiRJkiTlLcMtSZIkSZIk5S3DLUmSJEmSJOUtwy1JkiRJkiTlLcMtSZIkSZIk5S3DLUmSJEmSJOUtwy1JkiRJkiTlLcMtSZIkSZIk5S3DLUmSJEmSJOUtwy1JkiRJkiTlLcMtSZIkSZIk5S3DLUmSJEmSJOUtwy1JkiRJkiTlLcMtSZIkSZIk5S3DLUmSJEmSJOUtwy1JkiRJkiTlLcMtSZIkSZIk5S3DLUmSJEmSJOUtwy1JkiRJkiTlLcMtSZIkSZIk5S3DLUmSJEmSJOUtwy1JkiRJkiTlLcMtSZIkSZIk5S3DLUmSJEmSJOUtwy1JkiRJkiTlLcMtSZIkSZIk5S3DLUmSJEmSJOUtwy1JkiRJkiTlLcMtSZIkSZIk5S3DLUmSJEmSJOUtwy1JkiRJkiTlLcMtSZIkSZIk5S3DLUmSJEmSJOUtwy1JkiRJkiTlLcMtSZIkSZIk5S3DLUmSJEmSJOUtwy1JkiRJkiTlLcMtSZIkSZIk5S3DLUmSJEmSJOUtwy1JkiRJkiTlLcMtSZIkSZIk5a06HW5FxGERcX1EvBQRyyLio4h4LSKuiYimlRxjWkSkcn66ltG+KCJui4j3I2JjRMyKiO9FRNT+E0qSJEmSJKkm6u/pCezEpcBg4C/An4DNwKnAjcAFEdE9pbShEuN8CFxRRvm/S/4SEQ2AycCxwG3AbOC/gN8DbYFh1XoKSZIkSZIk7RJ1Pdx6EBiRUlpdomxURLwNXAN8G/htJcZZl1IaW4l2A4BuwA9SSrdly0ZHxEPA1RFxd0ppfhXmL0mSJEmSpF2oTm9LTCnNKBVsFRuXvR5d2bEiol5E7LeT7YUXAuuB0aXKRwKFQN/K3k+SJEmSJEm7Xp0OtyrQIXtdWsn2BwJrgdXA2oh4OCKOKNkgIuoBnwNeTSltLNV/OrCNzKouSZIkSZIk1RF1fVviDiKiALgO2ALcV4ku84DngX8AW4ETgMuAL0XEF1JKb2TbtQQaA++XHiCl9HFELCcTkkmSJEmSJKmOyLtwi8wWwe7A1SmluTtrnFK6pFTRgxHxF2Aa8GvgtGx5k+z143KG2liizXYiYiAwEKBjx447m5IkSZIkSZJqSV5tS4yIG8isurozpTSiuuOklJ4FngFOjYjG2eL12WvDcro1KtGm9Hh3ppS6ppS67r///tWdliRJkiRJkqoob8KtiBgGXAvcDXy3FoZ8Fyggsx0RYCWwgTK2HkZEQ6A1ZWxZlCRJkiRJ0p6TF+FWRAwFhgL3AgNSSqkWhu1M5tyuFQAppW3ATODYbJhV0vFkvqsZtXBfSZIkSZIk1ZI6H25FxHXAMOCPwCXZEKqsdu0j4oiIaFKirCh7AH3ptl8BegKTS70Z8c9kztUaWKrLD8kEYQ/U5FkkSZIkSZJUu+r0gfIRMRgYDrwHTAEujIiSTZamlCZnP48ALgZOJXNYPNnPv46IScC/yQRUxwP9gA/JhFYljQYuyfY5GJgN9AbOBW5MKc2rvaeTJEmSJElSTdXpcAvolr12BO4po/5pYHIZ5cXmAq8AZwJtgUJgITAKuDmltN0ZWimlTRHRC7gR+AaZc7beAS4Hflf9x5AkSZIkSdKuUKfDrZRSf6B/ddumlGYDX6viPVeReSPjZVXpJ0mSJEmSpN2vzp+5JUmSJEmSJJXHcEuSJEmSJEl5y3BLkiRJkiRJectwS5IkSZIkSXnLcEuSJEmSJEl5y3BLkiRJkiRJectwS5IkSZIkSXnLcEuSJEmSJEl5y3BLkiRJkiRJectwS5IkSZIkSXnLcEuSJEmSJEl5y3BLkiRJkiRJectwS5IkSZIkSXnLcEuSJEmSJEl5y3BLkiRJkiRJectwS5IkSZIkSXnLcEuSJEmSJEl5y3BLkiRJkiRJectwS5IkSZIkSXnLcEuSJEmSJEl5y3BLkiRJkiRJectwS5IkSZIkSXnLcEuSJEmSJEl5y3BLkiRJkiRJectwS5IkSZIkSXnLcEuSJEmSJEl5y3BLkiRJkiRJectwS5IkSZIkSXnLcEuSJEmSJEl5y3BLkiRJkiRJectwS5IkSZIkSXnLcEuSJEmSJEl5y3BLkiRJkiRJectwS5IkSZIkSXnLcEuSJEmSJEl5y3BLkiRJkiRJectwS5IkSZIkSXnLcEuSJEmSJEl5y3BLkiRJkiRJectwS5IkSZIkSXnLcEuSJEmSJEl5y3BLkiRJkiRJectwS5IkSZIkSXnLcEuSJEmSJEl5y3BLkiRJkiRJectwS5IkSZIkSXnLcEuSJEmSJEl5y3BLkiRJkiRJeatOh1sRcVhEXB8RL0XEsoj4KCJei4hrIqJpJfq3jIghEfFkRCyIiA0RMTci7oyIg8pof0pEpHJ+/rprnlKSJEmSJEnVVX9PT2AnLgUGA38B/gRsBk4FbgQuiIjuKaUNFfQ/AfgVMBX4LfAhcDQwKNu/R0rpzTL63Qk8W6psYU0eRJIkSZIkSbWvrodbDwIjUkqrS5SNioi3gWuAb5MJrcozBzg8pfROycKI+D9gMnA90KeMfi+mlMbWaOaSJEmSJEna5er0tsSU0oxSwVaxcdnr0Tvp/27pYCtbPgVYUVH/iGgaEY2qMl9JkiRJkiTtXnU63KpAh+x1aXU6R0QR0LyC/v8DrAU2RMRb2XO7ojr3kiRJkiRJ0q5T17cl7iAiCoDrgC3AfdUc5lqgELinVPlmMud7PQosAg4gs/VxJHAMcEk17ydJkiRJkqRdIO/CLTJBU3fg6pTS3Kp2jog+wJXAE8DdJetSSs8DZ5dqP5pM2NU/Iv6QUnqujDEHAgMBOnbsWNUpSZIkSZIkqZryaltiRNwAXAbcmVIaUY3+vcm8dfEV4IKUUtpZn5TSNqD4Xr3LaXNnSqlrSqnr/vvvX9VpSZIkSZIkqZryJtyKiGFkthPeDXy3Gv3PAB4GZgFfTimtqUL3d7PXNlW9ryRJkiRJknadvAi3ImIoMBS4FxhQmRVXpfqfDjwCzAF6pZRWVnEKnbPXah1gL0mSJEmSpF2jzodbEXEdMAz4I3BJdptgWe3aR8QREdGkVPmXgQnAW8CXUkorKrhX6zLKGmbvDzCpOs8gSZIkSZKkXaNOHygfEYOB4cB7wBTgwogo2WRpSmly9vMI4GLgVGBatn9XYCIQZLYz/lep/qSUxpb49fGIWETmTK7ityX2I7Ny67aU0vRafDxJkiRJkiTVUJ0Ot4Bu2WtH4J4y6p8GJpdRXuxooFH282/KaVMy3HoQOAe4HGgBrANeBYamlP5cyTlLkiRJkiRpN6nT4VZKqT/Qv7ptU0pjgDFVuN8twC2VbS9JkiRJkqQ9q86fuSVJkiRJkiSVx3BLkiRJkiRJectwS5IkSZIkSXnLcEuSJEmSJEl5y3BLkiRJkiRJectwS5IkSZIkSXnLcEuSJEmSJEl5y3BLkiRJkiRJectwS5IkSZIkSXnLcEuSJEmSJEl5y3BLkiRJkiRJectwS5IkSZIkSXnLcEuSJEmSJEl5q9rhVkT8LCI61uZkJEmSJEmSpKqoycqt4cC/I2JqRPSLiMa1NSlJkiRJkiSpMmoSbn2U7X8qcA+wJCJGR8QXamVmkiRJkiRJ0k7UJNxqC/QDJgMJaA5cCjwdEW9HxNURcVAtzFGSJEmSJEkqU7XDrZTSxpTSfSml04GOwNXAHCCATwI3APMi4smIuDAiGtXKjCVJkiRJkqSsWnlbYkppUUrp5ymlLsAJwO3Ayuz4vYA/ktm2eEdE9KiNe0qSJEmSJEm1Em6VlFJ6OaU0GGgPfA2YBGwF9gMGAM9GxNyI+ElEtKvt+0uSJEmSJGnfUevhVrGU0uaU0kPACDIBV7EAOgM3AfMj4u6IOGBXzUOSJEmSJEl7r/q7YtCIOBD4JnAxcFiJqnXAA8AG4BtAK+BbwJkRcVJKafaumI8kSZIkSZL2TrW2cisiGmUPjn8CeJfMyqzDyazUeg64BGiXUhqQUrocOAD4NvAB0Br4eW3NRZIkSZIkSfuGGq/ciogvkFmh9TWgOZkwC+B94F7grpTSO6X7pZQ2AXdHxL+BpwAPmpckSZIkSVKVVDvcioifkdlSeGhxEbCJzPladwFPpJS2VWKol7LXVtWdiyRJkiRJkvZNNVm5NbzE538AdwNjU0rLqzjOZuA9oDJBmCRJkiRJkpRTk3BrNXAfmW2Hr1R3kOzqroNrMA9JkiRJkiTto2oSbrVLKX1cazORJEmSJEmSqqjab0s02JIkSZIkSdKeVu1wS5IkSZIkSdrTavK2xL9Vo9sW4CNgIfAK8JeU0qrqzkGSJEmSJEn7tpqcuXVKic+pxOeoQvmmiPgNMDSltLkGc5EkSZIkSdI+qCbh1r1kQqqTgEOyZbOBucBaoBlwGHBUtu7fwHPZ8k8CnwYaAlcBnwIuqMFcJEmSJEmStA+qyYHy/YEFZIKtScBhKaUuKaXzUkrfyl6PBjoDE7PtFqSU+qSUjgUOBf5CZkXX+RFxVg2fRZIkSZIkSfuYaodbEfFV4BpgQkrp7JTSv8pql1J6J6V0Lpkg6+riECul9B5wHvAsmYCrf3XnIkmSJEmSpH1TTd6W+IPsdUQl299MJsS6vLggpbQN+EX21241mIskSZIkSZL2QTUJtz6bvb5dyfbFK7uOKVX+SvbapgZzkSRJkiRJ0j6oJuFW0+z1gEq2b5+9NilVvrHUVZIkSZIkSaqUmoRbxSuxvlvJ9sXt3ilV3jF7XVqDuUiSJEmSJGkfVJNw6z4yZ2gNjogbI6JhWY0iokFEXA9cBiTgT6Wa9MpeZ9dgLpIkSZIkSdoH1a9B398AfYDjgJ8C34+IKcBbwDoy2xYPA74EtMj2mQn8uniAiCjgPyu6nqjBXCRJkiRJkrQPqna4lVLaFBFfAsYA55AJsM4vo2lkrxOBS1JKm0vUNQa+k/38anXnIkmSJEmSpH1TTVZukVJaA5wXEZ8HvgX0ADqRWbW1DpgPvACMTSk9X0b/tcDTNZmDJEmSJEmS9l01CreKpZReBF6sjbEkSZIkSZKkyqp2uBURxWdnPZBSeqmW5iNJkiRJkiRVWk1Wbv2AzHlao2ppLpIkSZIkSVKV1KtB32WlrpIkSZIkSdJuVZNw6/Xs9bDamIgkSZIkSZJUVTUJt24nsy3xilqayw4i4rCIuD4iXoqIZRHxUUS8FhHXRETTKozTOyJeiIh1EbEiIsZHxCHltC2KiNsi4v2I2BgRsyLiexERtfdkkiRJkiRJqg3VDrdSShOBW4ELIuKuiNi/9qaVcymZ8Owd4Hrgx8Bc4EbghYhovLMBIuI84K9A42z/XwInAc9HxAGl2jYAJgPfBcYBl2fv93tgaO08kiRJkiRJkmpLTd6WeFf24/vAxcBFEfEqMA/YUEHXlFL6diVv8yAwIqW0ukTZqIh4G7gG+Dbw2wrmWAjcBiwATkwprc2WPwa8AgwDBpboMgDoBvwgpXRbtmx0RDwEXB0Rd6eU5ldy7pIkSZIkSdrFavK2xP5Ayn4OoBA4nkw4VJ7I9qlUuJVSmlFO1Tgy4dbROxniZOAA4LriYCs77msRMQ3oGxGDU0qbs1UXAuuB0aXGGQmcB/QFflGZuUuSJEmSJGnXq0m49Qz/Cbd2tw7Z69KdtCsO2l4so+4l4ItkDsSfFRH1gM8BM1NKG0u1nQ5so+LgTpIkSZIkSbtZtcOtlNIptTiPSouIAuA6YAtw306aF5+p9X4ZdcVlBwKzgJZkzuXaoW1K6eOIWJ5tK0mSJEl56c3Fa+h7R1n/9i9pb3X2MQdy4Qkd9/Q0dqmarNzaU0YC3YGrU0pzd9K2Sfb6cRl1G0u1qahtcfsmZVVExECyZ3d17Lh3/x9GkiRJUn46+xj/rV7a17y5eA2A4VZdEhE3AJcBd6aURlSiy/rstWEZdY1KtamobXH79WVVpJTuBO4E6Nq1657aqilJkiRJ5brwhI57/V9wJW1vX1mpWWvhVkR8FjgO2B9omFK6vrbGzo4/DLgWuBv4biW7LcpeDwRml6or/meL4m2IK8m85XGHf86IiIZAa+Dpys9YkiRJkiRJu1qNw62I+C/gl8CRpaquL9HmMOBlMlv+DkkpraviPYYCQ4F7gQEppcqujno5e/08MKVUXXdgDfAWQEppW0TMBI6NiIYppZLbE48H6gHlvb1RkiRJkiRJe0C9mnSOiMuAvwJHAQF8mL1uJ6X0FpmgqTVwZhXvcR0wDPgjcElKaVs57dpHxBERUfJcrKeBxcCAiGhWou1ngVOA8SmlzSXa/5nMuVoDSw3/QzIH2D9QlblLkiRJkiRp16r2yq1sQDSSTJh1D5ktg6vJrIYqy3jgi8A5wLhK3mMwMBx4j8zKqwsjtsvOlqaUJmc/jwAuBk4FpgGklDZHxJDs/Z6NiNHAfsAVwDIyq8FKGg1cAvw6Ig4ms5WxN3AucGNKaV5l5i1JkiRJkqTdoybbEv+bzMqvB1NKlwBERNMK2k/PXj9XhXt0y147kgnQSnsamFxGeU5KaXxEbCATvt1KZmvkVOCqlNL7pdpuiohewI3AN8isNHsHuBz4XRXmLUmSJEmSpN2gJuHWyUAiExhVxsLs9YDK3iCl1B/oX9O2KaW/ktk+WZlxVpF5I+NllWkvSZIkSZKkPacmZ261y17fqmT7LdlrYQ3uKUmSJEmSJOXUJNwqfuNhRVsRSzooe11Zg3tKkiRJkiRJOTUJt/6VvfaoZPuzstd/1OCekiRJkiRJUk5Nwq2/knlT4tUR0bCihhHRGbiSzBldE2twT0mSJEmSJCmnJuHW/wcsBz4DvBgR3UqPFxENI+Ji4DmgiMyh8n+owT0lSZIkSZKknGq/LTGltDoizgMeB44BXgLWFNdHxEzgcKARmRVea4HzU0of12jGkiRJkiRJUlZNVm6RUnoWOB54kUyAVZStCjKBV+Ps578D3VNKM2pyP0mSJEmSJKmkaq/cKpZSmgX0jIjPAV8ks1qriMzbFP8NTE4pvVTT+0iSJEmSJEml1TjcKpZSmgnMrK3xJEmSJEmSpJ2p0bZESZIkSZIkaU8y3JIkSZIkSVLeqvG2xIgoAE4DugFt+c8h8uVJKaVv1/S+kiRJkiRJUo3CrYg4AxgNHFDZLkACDLckSZIkSZJUY9UOtyLiBGBidowA/v/27jzMkrK+F/j3p2wiIijjioghRoxLJI4bSS7gFsX9SowLhMGF6FVcbnKvwahgVNyikqCJghEUlyugqKhRUQPiFoO4h5goDC4oiuDCJijv/aOqM4fD6Z7u6dNLzXw+z1NPnVP1Vp3fqamu6fnOW29dkuQ7Sa6YTmkAAAAAMLfF9Nz66yRbJ/lJkicn+UhrrU2lKgAAAACYh8WEW3unu8XwWa21D0+pHgAAAACYt8U8LXH7fv6paRQCAAAAAAu1mHDru/1822kUAgAAAAALtZhw6739/EHTKAQAAAAAFmox4dYrk5yX5OVVtftUqgEAAACABVjMgPI7Jzk4yYlJvlxVf5fk40l+mOQ3c23YWvvuXOsBAAAAYD4WE26dP/K6kryonzamLfJzAQAAACDJ4kKm2sh7AAAAAFhSiwm39ptaFQAAAACwCTY53GqtnTnNQgAAAABgoRbztEQAAAAAWFHz6rlVVS/uXx7VWvv1LG12TJLW2i9mWb9tknd3TdpjN6FWAAAAALiO+d6WeGS6pxz+bZLrhVtVdeMkP0ty7Rz73CrJo/v9AAAAAMCiTfu2RE9MBAAAAGDZGHMLAAAAgMESbgEAAAAwWMItAAAAAAZLuAUAAADAYAm3AAAAABgs4RYAAAAAg7XVAtvfrqqunLB8+5kXVXW7JDVXGwAAAACYhoWGW/8+x7rWz9dvWikAAAAAsDALCbcm9cYCAAAAgBUz33DrJUtaBQAAAABsgnmFW6014RYAAAAAq46nJQIAAAAwWMItAAAAAAZLuAUAAADAYAm3AAAAABgs4RYAAAAAgyXcAgAAAGCwhFsAAAAADJZwCwAAAIDBWtXhVlUdXlUnV9V5VdWqav0Ct9+3326u6Q/m2f5DU/+CAAAAACzKVitdwEYcleSSJOck2WkTtj83yUETlm+b5NgkFyf54oT1xyY5a2zZ9zfh8wEAAABYQqs93NqjtXZeklTVN5LssJCNW2sXJXnH+PKqekK6Xmtvb61dM2HTz7fWrrcdAAAAAKvLqr4tcSbYWgJP7edvma1BVd24qrZbos8HAAAAYApWdbi1FKrqDkn2S/KZ1tq3Zmn2d0kuS3JlVf1nVT2nqmrZigQAAABgXlb7bYlL4clJKpN7bV2T5INJPpLkwiS3SfKUJEcnuUeSQ5apRgAAAADmYYsKt6rqhknWJflFkpPH17fWPpvkUWPbHJcu7FpXVf/UWvvMhP0emuTQJNltt92mXzgAAAAAE21ptyX+cZJdk7y7tXbFfDZorV2b5BX92/1naXNsa21ta23tmjVrplMpAAAAABu1pYVbT+nnsw4kP4v1/XyX6ZUCAAAAwGJtMeFWVd0iySOSfK21dvYCN79jP79oulUBAAAAsBibTbhVVbeuqj2ravtZmvxZkq0zR6+tqrr5hGXbJjmyf3vaYusEAAAAYHpW9YDyVXVQktv3b9ck2aaqXti/v6C1duJI81ckOTjJfknOmLC7Jye5Ksk75vjIj1bVhUm+lA1PSzwwXc+tY1prX9zErwIAAADAEljV4Va6MbL2GVv20n5+ZpITMw9VtXeSOyd5V2vt0jmanpLk0UkOS7JTksuTfDnJEa21dy+gbgAAAACWwaoOt1pr+y6g7bok62ZZ97kkNY99vCrJq+b7mQAAAACsrM1mzC0AAAAAtjzCLQAAAAAGS7gFAAAAwGAJtwAAAAAYLOEWAAAAAIMl3AIAAABgsIRbAAAAAAyWcAsAAACAwRJuAQAAADBYwi0AAAAABku4BQAAAMBgbbXSBbBK/fNfJT/6+kpXwebubgckaw9Z6SoAAAAYMD23gJXxo68nXz9lpasAAABg4PTcYrKHvnKlK2Bzd/zDVroCAAAANgN6bgEAAAAwWMItAAAAAAZLuAUAAADAYAm3AAAAABgs4RYAAAAAgyXcAgAAAGCwhFsAAAAADJZwCwAAAIDBEm4BAAAAMFjCLQAAAAAGS7gFAAAAwGAJtwAAAAAYLOEWAAAAAIMl3AIAAABgsIRbAAAAAAyWcAsAAACAwRJuAQAAADBYwi0AAAAABku4BQAAAMBgCbcAAAAAGCzhFgAAAACDJdwCAAAAYLCEWwAAAAAMlnALAAAAgMESbgEAAAAwWMItAAAAAAZLuAUAAADAYAm3AAAAABgs4RYAAAAAgyXcAgAAAGCwhFsAAAAADJZwCwAAAIDBEm4BAAAAMFjCLQAAAAAGa1WHW1V1eFWdXFXnVVWrqvWbsI8z+m0nTWsntL9pVR1TVT+oqquq6ptV9Yyqqql8KQAAAACmZquVLmAjjkpySZJzkuy0iP1cnOR5E5afN/qmqrZJcnqSvZIck+TcJA9N8g9JbpnkyEXUAAAAAMCUrfZwa4/W2nlJUlXfSLLDJu7n8tbaO+bR7qlJ7pXk2a21Y/plx1XVe5O8oKqOb61dsIk1AAAAADBlq/q2xJlgaxqq6gZVteNGbi98YpIrkhw3tvzoJFsn+dNp1QMAAADA4q3qcGuKbpvksiQ/T3JZVb2vqvYcbVBVN0jy+0m+3Fq7amz7Lya5Nl2vLgAAAABWidV+W+I0nJ/ks0m+luQ3Se6T5FlJHlBVf9ha+3rfbuckN0ryg/EdtNZ+VVU/TReSAQAAALBKbPbhVmvtkLFFp1TVB5OckeR1SR7UL9++n/9qll1dNdLmOqrq0CSHJsluu+22mHIBAAAAWIAt5bbE62itnZXk00n2q6ob9Yuv6OfbzrLZdiNtxvd3bGttbWtt7Zo1a6ZbLAAAAACz2iLDrd76JDdMdztiklya5MpMuPWwqrZNcvNMuGURAAAAgJWzJYdbd0zy6ySXJElr7dok5yTZqw+zRt073bE6e1krBAAAAGBOm024VVW3rqo9q2r7kWU3raobTmj7sCR/kOT0sScjvjvduFqHjm3y3HRB2EnTrxwAAACATbWqB5SvqoOS3L5/uybJNlX1wv79Ba21E0eavyLJwUn2SzdYfPrXr6uq05Kcly6guneSA5NcnC60GnVckkP6bXZPcm6S/ZM8JsnLWmvnT+u7AQAAALB4qzrcSvKUJPuMLXtpPz8zyYmZ27eSfCnJw5PcMsnWSb6f5E1JjmqtXWcMrdba1VX1wCQvS/KEdONsfSfJYUneuOlfAwAAAIClsKrDrdbavgtouy7JurFl5yb5kwV+5s+SPKufAAAAAFjFNpsxtwAAAADY8gi3AAAAABgs4RYAAAAAgyXcAgAAAGCwhFsAAAAADJZwCwAAAIDBEm4BAAAAMFjCLQAAAAAGS7gFAAAAwGAJtwAAAAAYLOEWAAAAAIMl3AIAAABgsIRbAAAAAAyWcAsAAACAwRJuAQAAADBYwi0AAAAABku4BQAAAMBgCbcAAAAAGCzhFgAAAACDJdwCAAAAYLCEWwAAAAAMlnALAAAAgMESbgEAAAAwWMItAAAAAAZLuAUAAADAYAm3AAAAABgs4RYAAAAAg7XVShcAbMF+9PXk+IetdBUAAGwJ7nZAsvaQla4CWALCLWBl3O2Ala4AAIAtxY++3s2FW7BZEm4BK2PtIX65AABgebhbADZrxtwCAAAAYLCEWwAAAAAMlnALAAAAgMESbgEAAAAwWMItAAAAAAZLuAUAAADAYAm3AAAAABgs4RYAAAAAgJUkiwAAIABJREFUgyXcAgAAAGCwhFsAAAAADJZwCwAAAIDBEm4BAAAAMFjCLQAAAAAGS7gFAAAAwGAJtwAAAAAYLOEWAAAAAIMl3AIAAABgsFZ1uFVVh1fVyVV1XlW1qlq/wO13rqrnVNXHq+p7VXVlVX2rqo6tqttNaL9v/zmTpg9N7YsBAAAAMBVbrXQBG3FUkkuSnJNkp03Y/j5JXpvkk0nekOTiJHdN8udJHldVe7fW/n3CdscmOWts2fc34fMBAAAAWEKrPdzao7V2XpJU1TeS7LDA7f8jyZ1aa98ZXVhVH05yepK/SXLAhO0+31p7xybUCwAAAMAyWtXh1kywtYjt18+y/BNVdUm6XlwTVdWNk/ymtXbVYmoAAAAAYOms6jG3lkpV3TTJTZJcNEuTv0tyWZIrq+o/+3G7atkKBAAAAGBeVnXPrSX0wiRbJ3nb2PJrknwwyUeSXJjkNkmekuToJPdIcsgy1ggAAADARmxx4VZVHZDkL5J8LMnxo+taa59N8qix9selC7vWVdU/tdY+M2GfhyY5NEl22223JaocAAAAgHFb1G2JVbV/kncm+VKSx7XW2sa2aa1dm+QV/dv9Z2lzbGttbWtt7Zo1a6ZWLwAAAABz22LCrap6SJL3Jflmkge31n6xgM3X9/Ndpl0XAAAAAJtuiwi3quqPk5ya5D+SPLC1dukCd3HHfj7bAPQAAAAArIDNJtyqqltX1Z5Vtf3Y8gcneX+S/0zygNbaJXPs4+YTlm2b5Mj+7WnTqxgAAACAxVrVA8pX1UFJbt+/XZNkm6p6Yf/+gtbaiSPNX5Hk4CT7JTmj335tkg8kqXSDxz+0qq7zGa21d4y8/WhVXZhuTK6ZpyUemK7n1jGttS9O7csBAAAAsGirOtxK8pQk+4wte2k/PzPJiZnbXZNs179+/SxtRsOtU5I8OslhSXZKcnmSLyc5orX27nnWDAAAAMAyWdXhVmtt3wW0XZdk3diyE5KcsIB9vCrJq+bbHgAAAICVtdmMuQUAAADAlke4BQAAAMBgCbcAAAAAGCzhFgAAAACDJdwCAAAAYLCEWwAAAAAMlnALAAAAgMESbgEAAAAwWMItAAAAAAZLuAUAAADAYAm3AAAAABgs4RYAAAAAgyXcAgAAAGCwhFsAAAAADJZwCwAAAIDBEm4BAAAAMFjCLQAAAAAGS7gFAAAAwGAJtwAAAAAYLOEWAAAAAIMl3AIAAABgsIRbAAAAAAyWcAsAAACAwRJuAQAAADBYwi0AAAAABku4BQAAAMBgCbcAAAAAGCzhFgAAAACDJdwCAAAAYLCEWwAAAAAMlnALAAAAgMESbgEAAAAwWMItAAAAAAZLuAUAAADAYAm3AAAAABgs4RYAAAAAgyXcAgAAAGCwhFsAAAAADJZwCwAAAIDBEm4BAAAAMFjCLQAAAAAGS7gFAAAAwGAJtwAAAAAYLOEWAAAAAIMl3AIAAABgsIRbAAAAAAyWcAsAAACAwRJuAQAAADBYqzrcqqrDq+rkqjqvqlpVrd/E/exfVZ+rqsur6pJ+n3eYpe1Nq+qYqvpBVV1VVd+sqmdUVS3qywAAAAAwdVutdAEbcVSSS5Kck2SnTdlBVf3PJKck+WqS/5Pkpkmem+SzVbW2tXbhSNttkpyeZK8kxyQ5N8lDk/xDklsmOXJTvwgAAAAA07faw609WmvnJUlVfSPJDgvZuKq2ThdSfS/JH7XWLuuX/3OSL6ULqw4d2eSpSe6V5NmttWP6ZcdV1XuTvKCqjm+tXbCI7wMAAADAFK3q2xJngq1F2CfJbZK8ZSbY6vf7lSRnJPnTPgCb8cQkVyQ5bmw/RyfZOsmfLrIeAAAAAKZoVYdbU3Cvfv75Ceu+kGTHJL+TJFV1gyS/n+TLrbWrxtp+Mcm1I/sDAAAAYBXY3MOt2/TzH0xYN7Pstv185yQ3mtS2tfarJD8daQsAAADAKrDax9xarO37+a8mrLtqrM1cbWfabz9pRVUdmn7srt12223hVQIAALB0bnW3la4AVsTv3mbHlS5hWWzu4dYV/XzbCeu2G2szV9uZ9ldMWtFaOzbJsUmydu3atvAyAQAAWDIPfeVKVwAr4ohH3GWlS1gWm/ttiRf280m3E84sm7kN8dIkV05qW1XbJrl5Jt/eCAAAAMAK2dzDrX/r5/ebsO6+SX6R5D+TpLV2bZJzkuzVh1mj7p3uWJ29RHUCAAAAsAk2m3Crqm5dVXtW1ei4WGcm+WGSp1bVDiNtfy/JvklObq1dM9L+3enG1Tp0bPfPTfLrJCctRe0AAAAAbJpVPeZWVR2U5Pb92zVJtqmqF/bvL2itnTjS/BVJDk6yX5IzkqS1dk1VPSfJe5KcVVXHJdkxyfOS/CTJEWMfeVySQ5K8rqp2T3Jukv2TPCbJy1pr50/z+wEAAACwOKs63ErylCT7jC17aT8/M8mJ2YjW2slVdWWSFyb523RPQ/xkkue31n4w1vbqqnpgkpcleUK6cba+k+SwJG9cxPcAAAAAYAlUax7uN01r165tZ59taC4AAACAaamqL7XW1k5at9mMuQUAAADAlke4BQAAAMBgCbcAAAAAGCzhFgAAAACDJdwCAAAAYLCEWwAAAAAMlnALAAAAgMESbgEAAAAwWMItAAAAAAZLuAUAAADAYAm3AAAAABgs4RYAAAAAgyXcAgAAAGCwhFsAAAAADJZwCwAAAIDBEm4BAAAAMFjCLQAAAAAGq1prK13DZqWqfpLkgpWuY0p2SXLxShcBI5yTrDbOSVYb5ySrjXOS1cT5yGrjnFyY27fW1kxaIdxiVlV1dmtt7UrXATOck6w2zklWG+ckq41zktXE+chq45ycHrclAgAAADBYwi0AAAAABku4xVyOXekCYIxzktXGOclq45xktXFOspo4H1ltnJNTYswtAAAAAAZLzy0AAAAABku4BQAAAMBgCbe4jqq6QVU9r6r+o6quqqrvVdVrq+rGK10bW6aqarNMl610bWy+qurwqjq5qs7rz7f1G2l/p6p6f1VdWlWXV9VZVXX/ZSqXLcBCzsmqOnKOa+dfLmPZbMaq6neq6m+q6gtV9ZOq+mVVfaWq/nrS742ukyylhZyPrpEsh/6a986qOreqfl5VV/T/xn5dVd16lvaukYuw1UoXwKrz+iTPTnJqktcmuXP/fq+qemBr7dqVLI4t1lm5/mCL16xEIWwxjkpySZJzkuw0V8Oq2iPJ55L8Osmrk/w8ydOSfKyqHtpa+8QS18qWYd7n5IjnJbl4bNmXplkUW7QnJ3lmkg8meWe6v5f3S/KyJI+rqvu21q5MXCdZFvM+H0e4RrKUdk1y63T/rv5+uuvf3ZIcmuTxVXWP1tqPE9fIaTGgPP+tqu6S5OtJTm2tPXZk+WFJ/j7Jk1pr71qp+tgyVVVL8rbW2rqVroUtR1X9VmvtvP71N5Ls0FrbfZa2JyV5bJJ7tta+0i/bIck3k1yVZM/mL1sWaYHn5JFJjkhyh9ba+uWqkS1LVa1N8l+ttZ+PLX9Zkr9Oclhr7Q39MtdJltQCz8cj4xrJCqmqP0lyUpLnt9Ze3S9zjZwCtyUy6glJKsnRY8uPS3JFkgOXvSLoVdU2/UUeltxMiLAx/a0Oj0xyxswvI/32lyV5S5LfSXKvJSmSLcp8z8lxVbVjVempz9S11s4eDxJ67+nnd01cJ1ke8z0fx7lGsgIu6Oc7J66R0yTcYtS9klyb5IujC1trVyX5SvxQsXIOSBew/rKqflxVx1TVTVe6KEhy9yTbJvn8hHVf6OeunayUr6W7teGqqvpcVT10pQtii7BrP7+on7tOspLGz8dRrpEsuararqp2qapdq+rBSd7cr/pIP3eNnBIpNaNuk+Ti1tqvJqz7QZK9q2qb1trVy1wXW7YvJjk5ybeT7Jhk/yTPSrJPVe3d/68GrJTb9PMfTFg3s+y2y1QLzPhZunEKP5fk0iR3SvLcJB+uqie31k5YwdrYjFXVDZO8ON24MTNDWbhOsiJmOR8T10iW11OTHDPyfn2SA1trZ/XvXSOnRLjFqO2TTAq2ku5e35k2wi2WTWvtPmOL3l5VX0vy8iTP6eewUrbv55OunVeNtYFl0VobH14gVfXWJN9I8vqqOsV/DLBEjk5y3yQvaK19q1/mOslKmXQ+ukay3N6f5D+S7JBkr3S3IK4ZWe8aOSVuS2TUFem6RE6y3UgbWGmvSReyPmylC2GLN3NNnHTtdN1k1Wit/TTJm9I9aXHvFS6HzVBVvTRdz+pjW2uvGFnlOsmym+N8nMg1kqXSWvt+a+0TrbX3t9aOSHJwkldV1eF9E9fIKRFuMerCJLtU1aQfrNumu2VRry1WXGvtmvTn60rXwhbvwn4+qbv4zLJJ3cxhJazv566dTFX/9LkXJjk+ydPHVrtOsqw2cj7OZX0/d41kybTWvpbky0n+V7/INXJKhFuM+rd058S9RxdW1XZJ7pHk7JUoCsb15+SumTw4KCynr6frRn6/Cevu289dO1kt7tjPXTuZmqo6IskRSd6e5KkTHlfvOsmymcf5OBfXSJbLjZLcrH/tGjklwi1GvSdJSzeg4qinpbvP953LXhFbtKq6+SyrXppuzMDTlrEcuJ5+TI7TkuxbVb83s7yqdkg3gOh/ZewJtLCUqmqrSU+TrarbJXlGkp+mG0QZFq2qXpzkyCQnJjmktXbteBvXSZbLfM5H10iWS1Xdapbl+yW5a/onIbpGTk8tLMxmc1dVx6S7P/3UdI8nvXOSZyf5bJL7T/pLApZKVb0+3f9Y/EuS76YbiHH/JPsl+dck+7XWrly5CtlcVdVBSW7fvz0syTZJXtu/v6C1duJI299O90vHNUlen+QX6f5T4G5JHtZa+9hy1c3ma77nZFXtlOT8dAPYnpsNTwJ7arpr6BNaaycvY+lspqrqmUnekO7v5xclGf8d8aLW2ul9W9dJltR8z0fXSJZLVZ2a5NZJPpXkgnTjZ90zyePTjaG1b2vtK31b18gpEG5xHf0jc5+b5NAkuye5OF2Prhd7agjLraoele5+9LsmuXmS36T734uTkryutXbVHJvDJquqM5LsM8vqM1tr+461v3OSV/bbbJPknCRHttY+sYRlsgWZ7znZj5v5xiT3SXf79g7p/i7/bJJXt9b87y9TUVUnpBsYeTbXuVa6TrKU5ns+ukayXKrqcenOybunezpiSxdynZ7kNa217461d41cJOEWAAAAAINlzC0AAAAABku4BQAAAMBgCbcAAAAAGCzhFgAAAACDJdwCAAAAYLCEWwAAAAAMlnALAAAAgMESbgHAwFXV7lX1wqr6dFV9v6p+VVW/rKpvV9V7quqgqtp+wnb7VlXrp92Xv/Lpqaoz+u9xwhxtHlJVH62qn1TVb/r2X+nX7T5yLPZdrrqnparWzdS/0rUwfWM/q22un9uquklVvb6/FlxVVd+sqqfP4zOe1+/zuI20u8cstey7yV8QABZpq5UuAADYNFW1dZJXJnlWkm3GVm+TZIckeyR5XJLXVdXzW2tvXd4qV4eqenSSU1e6joXqw7qDk5zZWtt3ZathtauqrZJ8LMn9Rhb/bpJ/rKrbttZeNMt2t0xyRJJLkxy+5IUCwJTpuQUAA9T3xPpokv+dLsj6dpLnJblHklskuW2S+6b7B+v6JLskefZK1LpK/FU//2aSeyfZOclNct0QAIbgLunO3ZskuWBs3aHpzulLkjwqye2S/N8kLckLqupOs+zz1UlumuRFrbWLN/L5Xxv5/LtsyhcAgGnTcwsAhumNSe7fv35zksNaa9eMtbkwyb9W1SuT/GWS/7mM9S2refRquls/P6619m8Ttl+fpKZc1rJprZ2Q5IQVLoPlcUVr7bJZ1j2+n7+gtfbB/vVrqureSQ5I8oQkR45uUFX3S3JQkq8medPGPry1dm2Sy/ptr1hw9QCwBPTcAoCBqaoHJFnXvz2ttfb0CcHWf2utXd1aOyrJny1HfavUzJhjP1/RKmBpzYS4Hx5bftrY+iRJVd0gXVBeSZ7VWvvN0pYHAEtDuAUAw/N/+vm1WcCthq21f1/Ih1TVLlV1cFWdUlXn94NTX1FV36mq46tqr41sf5Oq+uuq+teq+llVXVNVP66qb1TViVX1pKq64YTt7lFVb62q/+o/78qq+m5VfaGqXllVaydsc70B5UcH4R5pevykAbnnO6B8Ve1aVa+qqnOq6tK+tm9X1Yf6Qd1vMtZ+q6rar6qO7rf5+chx+Hi/zaRjsK6v++B+0T4TBvA+crz9XAPKV9UNq+rJVfWJflD9q6vqh1V1alU9fI7trvPggarasapeXlXf6r//T6vqtKq672z7mK+RGj9WVRf1NV7UH9/HzLHdkX196/v3v1dVb+/Pm6urf3BAv+4650pVPaq6Bw38qLoHDRw9Yf+P7b/jj6p7YMOP+xoPrKqJPf7Gz6mqunFVvbiqvlpVv+iX32Oxx2zMzPn347HlF/XzHceWPz3JXklObK19Zsq1AMCycVsiAAxIVe2Q5IH920/1t9MtldPTjeE17rf66aCqelZr7Xq3MlXVbZN8um83ak0/3SXJgel6mPxsZLuDkhyfZDzwuV0/3SfJnkkevQnfZ1Gq6pAk/5hk27FVe/TTw/r3J4yse2aS64Ul6Y7Bg/rpwKp6RGvtyqkWPKKqdk7yoSR7j626Vbpj+eiqemeSQ+bqBZhuLLfTk/z2yLLtkjw8yR9X1aNbax/ZxBpvm66H0Xhoeot0x/ZhVfWuJOvmqrGqHpvknbn+n9Oktq9Jd8vubOu3S/LuXP98W5Pkwf20rqoe01r75RwftUuSs9Odu0vpl0l26j/vwrHPn1mfJKmqmyd5aZJfpBuXCwAGS88tABiW+2VD8HPWEn/WD5K8Icn+6W5nWpMurHpYusHsb5jkDVX1+xO2fXXf9ookf5HuiW27pAuB9knyoiTfGt2gD2D+sd/v2ekChTv0290t3QDZJ2T+txaelQ0DX894+siySQNyT1RVf5rkrekCk/OSPKX/fjdLcqckhyT5eLqBu0f9Kl1gsy5dMHe7dIHSvdIdoyuSPCDJy8e2e0df3zv7958Zq/smSY6aZ+2V5OR0wVZLckySu6c7rvdL8v6+6ZOS/O1Gdndikhun+/63Sxc8PT7JxUm2TnJcdU/xXJCqunG60GyvJD9N93CEPdMd399N911/k+SJuf6xGrVzunPk3CSPTHLLJLtl8hMAH5gu2Dol3bHZJcmdk5w00uYfsiHYene6P7dd+jrf0i9/QLrjMpej0x2v5ye5Y7qfpfvnugHUNHyjnz94bPlD+/nXR5a9It3xfUlr7UdTrgMAlldrzWQymUwm00CmdE9Da/30uEXua9+Rfe2+Cdu/q9/2HRPWXdKve/YC9vfIfptfJ7nZAms5o9/2hFnWz3zPdbOs332kzb5j624y8n2+kmSnOerYaoF1P7jf7+VJdpyw/oR+/Rkb2c+6mfonrHvsyHd7wYT1leT/9euvTXLnOc6TnyfZY8I+Hj7SZv9NOJeO6rf9ZZI7beQ7XpNk17F1R458/jeT7DCPc6Uledsc7e450u7YWdq8aqTNQ+Y4p65N8oCFHpdZ/gx2n6PdM/s2P0wXIt80yZ/3P1PXJrnLyHf7TX+sFnTOzvfnxmQymUym5Zz03AKAYdl55PVKD47+jn7+gAnrZnqXLaRnysw2l2fkVsVV4MBsOO5Pa63NWltr7dcL2XFr7eNJfpJuwPv7bXKFc3tyP78gXRgzXkNL8px0oVGNtJ/k71tr35mw/CPpAsCk6900b1W1VboedUny8tbatya1a90TIb+dbliNP5ljly9usz9NcNSvM/fteDPH4YpsGOfuep+VDeNbPWWOfX24tfbJedS0WMcm+WK63oFnpPs5elO6n63Xtta+2ffke2O6OzgOmzlnq+quVXVUVb2tn991GeoFgKkQbgHAsIwOXj3r4OFT+7Cqu1fVG0cGwb52ZODymSey3Wp8IPV0PZyS5OVV9Yfz/LivpftOO6a7ve3Wi/8GU3H/fv6t1tq/LXTjfgD2v6iqfxkZJL2NHMc1fdPfmVrFGz67kvxB//YDbZan4bXWLko3RlqS/NEcu/zYLNtfm2Qm9LrlAsvcKxvCw89U1Q6zTenOkaTreTSxlNlqnODL/feezcx5+4nW2sQgubU2c9tpMvdx++d51rQorRuL7MHpbj39YZKr092ieVg2BHlPTneL7EmttU8lSVU9Ld3P7OHpnqp6eJKvVNVcQScArBoGlAeAYblk5PVOS/lBVfW/040Ldb2n+U1w04wMVp3kr5KcmS6wOauqLuzffzrJ6ZN6/7TWvlNVb0zyrHT/AF9XVV9ON3bWmelChvn0yJm2Pfr5Vxe6YVX9brqwZdd5NL/pQvc/z33O7HdjT8v8ZrpeeLvN0eaHc6y7op/faH6l/bc7jbye7zhya2ZZ/pMFnCPnb2T97fv5fI5bktyyqrZprV29CZ81NX0Q9+xMeJJqVe2Ubqyty9ONhZequnO6nlxXpns65yfTPejgbUn+sao+O1tvOgBYLfTcAoBhGf1H8pI9ea3vbfXadMHWl9P9o/eu6UKFmQHNHzayyXX+w6y19vkk903Xq+WaJLdJ8oR0A8Z/u6o+XVWTbl97drpb1M5N93vKPZM8N8mpSX5cVcdM6CW21GY+b66n4V1Pf7vde9MFW79MNy7UH6R74uBO2XAcv9dvshT/6bjDyOuNhT4z32+u4zux59eY2niT69iUUG+2JyEu5ImTG2s7c+zme9yS2Y/dkj0Jc4Femu5n+OWtte/3y/483cMAXttae19r7eettVPSDYK/Tb8eAFY1PbcAYFg+ny5guGHmvg1qsWbGQDovyd6ttavGG1TVNnPtoLV2TpJH9reT3S/dE+keki70+qMkn66qP+jbzWzTkrw5yZuravd+m/+R5BHpArJnJblXVe3d3wq3HOYT+kyybzYEkI9trZ0+qVFV7biJdc3HaDCzw6ytrrt+QSHeFFw+8nrnucY0W2aXpQve5nvckuU/dvNWVXdP8owk/5UuuJ5xn37+8bFN/jnJC7J0Y8EBwNTouQUAA9LfcvWJ/u39+wBoKdy9n39wUrDVm9eA0621y1prp7fWXtJau1+6YOvKJNslef4c261vrb2rtfb0dLeIvb5fdZ8kfzyfz56Sb/fzu8/Z6vpm2l86R7C1a5bmdsQZP8+GwfnvvJG2d+nnFyxdOROdN/J6r2X+7Lms7+fzPW4/muWWxNXiDelC8eeM1blLP794rP1P+vnNl7owAFgs4RYADM/f9vMbJPn7+W7Uj/80XzO3fU0cb6sfqPzxC9jff2utfSYbeonM69bK/olufzOyaMluyZxg5il3e1bV2gVsN+cx7D1xI/u4Zh77mFXfE+6z/dtHVdVsf563SNdDLkk+symftQhfyIYeT+uW+bPnMnMcHjhb77q+9+IjxtqvOlV1YLpQ+QOttfHB7WdumbzF2PJbjK0HgFVLuAUAA9Na+0SSE/u3j6iqN1XV1rO1r6ptquoFSd6+gI+ZGdvrwbPcfvh/s6HHyvjn3bjvkTRbPTdIcof+7U9Hlt9hI7c67jHy+qeztpq+dya5tH99bFXN2tOqH2drxswx3LGq9pnQ9o7pbvuay8z3XMyTI9/az3dP8peztHl9uvGV2kj7ZdH3IvqH/u1BVXXAXO2r6hZVtfNcbaZk5jjcOMkrZ2nzkmx4OuQ/LXlFm6Afo+7VSa5K8rwJTc7t5/uPLX94P9/YgPoAsOKEWwAwTM9I9wTBpBvw+d+r6jlVdfeq2qWqbl1V96mqFyX5VpKXZ2FjbZ7cz++U5AP9vnbp9//GdP/YP3eWbdckOb+qTq2qg6vqLlV1876mfZK8Lxtu2ft/I9sdnOSCqnp9Ve1fVbevqp2q6req6uB+u6Tr5TPe+2TJ9LeCzoxBtleSs6tqXVXt3td3x6p6UlV9JMmTRjb9WDb0SHp3VT2xqm5bVbtW1dPS9fS5Ktd9Aua4mfHI9qiqP6+qNVW1VT/N9/e4U7Oh99krquro/s/kZlV176p6bzb0IDumtTbbn+tSemmSr6cbjP49VXVsVf2PPsi6WVXtWVWPr6p3prtdcI+5djYN/VhwMwHXM6rqHVV1z76eu1fVm9M9FTTpbt/96FLXtImOSBeOvqq1NumpjSf18+dW1Z9V1W2q6s+y4WmL71mOIgFgMQwoDwAD1Fq7vKoenK5Hxv9K8tvpnm42m4ty3UGkN+aEJH+Sbmyrh/TTqM8lOSrJh2bZfqskj+6nuT7juLFlt0r3dMTnzrLNFUme2Fr7ySzrl0Rr7aT+1rQ3pjvWx8/S9KSRbS6tqmf1bW+drgfYqF8keWSStyW52Sz7Oy1dmLN7kjf104yXpHsC48Zqb1X1uH5feyd5Tj+Ne1dm79m1pPrz+UHpQtU/SvK0fprYPBtu11xqz0z3Z/PodMHlkya0+WSSA5epngWpqjunC6nWJ3nVLM3el+TD6Z5++raxdR9srb1/yQoEgCnRcwsABqq1dnVr7bnpelcdka4n0A+TXJ3uCXTfTtfr4sAku7fWTpxtXxP2/Zt0Ywkdnu62pF+lG5z87CR/ke5JgJfPsvl3k/xhuvDlX9INGH5Fv4/1fU0Paa0d0o8JNePoJI9Lcmy6Hks/TPLrdL2fvpLkNUn2bK3NFqgtqdbaW9Id66OTfDPd0/SuSHecT0vX8+yUsW3enuSB6cYY+0W6Y3B+uidC/n5r7czMobV2Zbqw57h0x/FXm1j7JenG1HpKkk+lu93xmiQ/SvKBJI9orT2ptbZcodGkGi9Ksk+Sx6QLub6X7vteneQH6Y7hc5Ls1lr76jLVdFVr7TFJDkgXAF2U7rj9JMnpSQ5K8qDW2mp9SuLfJ9k6yfP6c+l6+p/BA9L1nluf7vut798/blmqBIBFquv+TgkAAKwmVbVvuqA4Se7QWlu/ctVs0D+tdeZTDaJrAAAAnUlEQVRWx/1aa2esWDEAbNH03AIAAABgsIRbAAAwHOdXVeun3Zf7w6vqHjOfnw29tgBgRQm3AAAAABgsY24BAMAqVlU3THKjCasub8v8y3xV3SDJ9hNWXdk/iAIAlp1wCwAAAIDBclsiAAAAAIMl3AIAAABgsIRbAAAAAAyWcAsAAACAwRJuAQAAADBYwi0AAAAABku4BQAAAMBg/X9ltWAcb/1rvwAAAABJRU5ErkJggg==\n", "text/plain": [ "
" ] }, "metadata": { "needs_background": "light" }, "output_type": "display_data" } ], "source": [ "util.draw_tradeoffs([values, values_sca], [\"Static\", \"SCA solutions\"])" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "#### DCA method" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Aside of using different settings, one can also use duty cycling. Duty-cycling means that sensors work for a given amount of time, than turn off for a given amount of time and repeat. Similar to the SCA setting switching case, the length of the sleeping period can be dynamically adjusted to the last classified context." ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "The functions that model the performance of the duty-cycling are similar, but use dca prefix instead of sca. The call below, for example, models how the system would beheave if duty-cycle length when activity \"0\" is detected would be 1 and so on. Note that duty-cycle length count period in both working and sleeping part of the cycle, thus the minimum for this parameter is 1 (1 period working, 0 periods sleeping)." ] }, { "cell_type": "code", "execution_count": 15, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "[(0.8682170542635659, 1.6976744186046506)]" ] }, "execution_count": 15, "metadata": {}, "output_type": "execute_result" } ], "source": [ "optimizer.dca_model([1,2,3], setting = \"a\")" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Again, the solutions can be automatically found (only a subset is printed)." ] }, { "cell_type": "code", "execution_count": 16, "metadata": {}, "outputs": [], "source": [ "solutions_dca, values_dca = optimizer.find_dca_tradeoffs(setting = \"d\", max_cycle=5)" ] }, { "cell_type": "code", "execution_count": 17, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "[1, 1, 1] (0.7500000000000001, 2.0)\n", "[1, 1, 2] (0.7336523125996811, 1.6299840510366825)\n", "[1, 2, 1] (0.7214035087719299, 1.5564912280701755)\n", "[1, 2, 2] (0.7209523809523811, 1.3447619047619046)\n", "[1, 2, 3] (0.7018874994145473, 1.1944171233197507)\n", "[1, 3, 2] (0.6903486141430177, 1.1702057286498644)\n", "[1, 3, 3] (0.6790176340401228, 1.0633254801170842)\n", "[2, 2, 2] (0.6770833333333334, 1.0)\n" ] } ], "source": [ "for (s,v) in list(zip(solutions_dca, values_dca))[0:8]:\n", " print (s, v)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "#### SCA + DCA method combination" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Both axis of optimizations can be joined togeteher, simultaneously switching between both the length of the duty-cycle and different system's settings." ] }, { "cell_type": "code", "execution_count": 18, "metadata": {}, "outputs": [], "source": [ "solutions_sca_dca, values_sca_dca = optimizer.find_sca_dca_tradeoffs(max_cycle=5)" ] }, { "cell_type": "code", "execution_count": 19, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "['a', 'f', 'e'] (1.0, 1.6666666666666667)\n", "(['d', 'f', 'e'], [1, 1, 1]) (0.9535747446610957, 1.3514391829155064)\n", "['d', 'f', 'e'] (0.9535747446610956, 1.3514391829155061)\n", "(['a', 'f', 'e'], [2, 1, 1]) (0.9523809523809523, 1.1904761904761905)\n", "(['d', 'f', 'e'], [1, 2, 1]) (0.9245284950744742, 1.1644404584582084)\n", "(['a', 'f', 'e'], [2, 1, 2]) (0.9115646258503401, 0.9727891156462587)\n", "(['d', 'f', 'e'], [2, 2, 1]) (0.8793818815385329, 0.8507989372176622)\n", "(['a', 'f', 'e'], [2, 2, 2]) (0.875, 0.8333333333333333)\n" ] } ], "source": [ "for (s,v) in list(zip(solutions_sca_dca, values_sca_dca))[0:8]:\n", " print (s, v)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Solutions from all methods are visualized in the graph below. The method combination (as usual) produced the most energy-efficient solutions." ] }, { "cell_type": "code", "execution_count": 20, "metadata": {}, "outputs": [ { "data": { "image/png": "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k5ND9+7d+fDDD2natCmOjo55ythnWJW1GjVqABAdHX1F2heR0lNyS0RERERERK6KqlWrAlhLCQEcHHL/LC1shtTx48cBaNmyZb7P09PTrb2xLmZv/3LvKEi7du0AWLNmTbHrisjVoeSWiIiIiIiIlEpUVBRHjhR+ZteZM2dYuXIlALfddpt139PTE4CUlJQC63p5eQGwb9++fJ+/9dZbnD59Ot9n9vYv946CPPLIIxiGQWRkJLNmzSp2fRG58pTcEhERERERkVKJiIigUaNG9OvXjyVLlhAbG2s9S09PJzQ0lE6dOhEVFQWQZzP5Zs1yN+g/cOAAP//8c77t33fffQB8++23TJkyhTNnzgCQkJDAiy++yNSpU/Hz88u3rre3NzfccAMA//nPf4rdt2bNmlmb448dO5aJEydy8uRJALKzs/ntt9+YOHEiM2fOLHbbIlI2lNwSERERERGRUrHZbGRnZ7NixQqCgoK44YYbcHNzw9vbG3d3d3r37s2uXbtwdHTkrbfeol+/flbdhg0bctddd3H+/HnatWuHn58f9erVo169etZSw27dull1xo8fj7u7O76+vgQEBDB9+nRGjhzJAw88UGB8o0aNAuD555/H3d3dan/GjBlF6t+MGTMYOHAg2dnZTJo0iYCAAHx8fHBxceHmm29m0qRJxMXFlXT4RKSUlNwSERERERGRUunevTuHDh1i+vTp9OnTh5tuugmAtLQ0vL29uf3223nmmWfYu3cvr7zyyiX1ly9fzhNPPMGNN95IWloa0dHRREdHk5mZaZUJCQnh7bffpkmTJthsNkzTpGPHjsybN49///vfhcb3+uuvM23aNG699VZM07TaL+oyxSpVqhASEsKqVat48MEHCQgIID09HX9/f9q1a8dbb73F6NGjizFiIlKWDB1renmtW7c2w8PDyzsMERGphIJm7QAgJLh9OUciIiJFcfDgQZo0aVLeYYiIVErF/R1qGMYvpmm2Lu17NXNLREREREREREQqLSW3RERERERERESk0lJyS0REREREREREKi0lt0REREREREREpNJScktERERERERERCotJbdERERERERERKTSUnJLREREREREREQqLSW3RERERERERESk0lJyS0REREREREREKi0lt0REREREREREpNJScktERERERERERCotJbdERERERERERKTSUnJLREREREREREQqLSW3RERERERERESk0lJyS0REREREREREKi0lt0REREREREREpNJScktERERERESkApk7dy6GYdClS5er/u6jR49iGAaGYVz1d4uUlJJbIiIiIiIiUibOnz/P3Llz6dGjBzVr1sTZ2RkfHx+aNGlCr169mDZtGjt37rxsO9999x3BwcE0bdoUHx8fnJ2dqV69Op07d2bSpElERUVdto29e/daSZqbb765LLpX6a1cuZKJEyeyZcuW8g5FpEw5lXcAIiIiIiIiUvklJCTQs2dPwsPDrXsuLi6YpsmhQ4eIjIxk9erVeHl5kZKSkm8bcXFxDBs2jE2bNln3nJyc8PDwIDExka1bt7J161beeOMNnn32Wd59990C45k7d671+bfffmPHjh20b9++9B2txFauXMm8efMACpwVZrPZaNSo0VWMSqT0NHNLRERERERESm3YsGGEh4fj4eHBO++8Q2xsLBkZGaSkpHDq1Ck2bNjAE088gbe3d771jx8/Ttu2bdm0aROurq68/PLL7N+/n6ysLJKSksjKyuKnn35i3Lhx2Gw2li5dWmAs58+fZ+HChQCMGjUKwErqSOFq1apFZGQkkZGR5R2KSJEpuSUiIiIiIiKlEhkZyfr16wGYM2cOL774IjVq1LCee3h40LVrVz7++GMOHjx4Sf2cnByCgoL4448/8PPz48cff2TKlCk0a9bM2vvJ0dGRtm3bMmPGDCIjI7njjjsKjGfNmjWcPHmS9u3b8+qrr2IYBiEhIWRmZpZxz0WkIlByS0REREREREpl37591ucHHnig0LKurq6X3FuxYgXbt28HYNasWbRs2bLQNurWrUtISEiBz+2ztIYOHUrdunXp2LEjKSkpfP3114W2W5icnBzmzp3L3XffjZ+fHzabjWrVqtGsWTNGjhzJ2rVr862XmprKxIkTadGiBe7u7ri7u3PrrbcyYcIETp06Vew47PuIHT16NN/n+W0Iv2XLFgzDsMZl0qRJVpmLyxZlQ/ndu3czbNgwateuTZUqVfD396d79+589dVXBdapV68ehmGwZcsWkpKSeO6557jxxhupUqUKtWrVYvTo0cTGxuZbt6RjL9cP7bklIiIiIiIiZSYmJoYGDRoUq86sWbMAaNKkCf379y9SnYKSL0lJSYSGhuLk5MTAgQOB3CTXtm3bmDdvnnWvuB555BFrqSOAl5cXqamp/Pnnnxw4cIADBw7Qo0ePPHV+//13unbtSnR0NABubm5AbjJw3759zJ07l40bN9KwYcMSxVRUzs7OBAQEcOrUKTIzM6latSru7u4lauuzzz7j//7v/8jJyQHA29ublJQU1q9fz/r16xk2bBhz587F0dEx3/rHjx9nxIgRREdH4+bmhmEYnDhxgs8//5yNGzeya9cufHx88tQpydjL9UUzt0RERERERKRUWrVqZX0eO3YsCQkJRa577tw5fvzxRwB69+5d6lgWL15MVlYW9913H9WqVQPg4YcfxmazsW7dOuLi4ord5tatW1m4cCEODg7885//JDU1lZSUFDIzMzlx4gRz587lzjvvzFMnKyuL/v37Ex0dTe3atVm/fj1paWmkpaWxceNG6tSpwx9//EHfvn05e/ZsqftdmA4dOhAXF0dQUBAAL7zwAnFxcXmuoti+fbuV2BowYADHjh0jOTmZlJQU3nrrLQzDYMGCBUydOrXANp566il8fHzYvn076enppKWlsWrVKry9vTl69OgldUsy9nL9UXJLRERERERESqV+/foMHz4cgHXr1hEYGEjXrl159dVXWbVqVaHJrujoaM6cOQNAixYtSh2LfendkCFDrHt+fn706NGD7Oxsvvzyy2K3+dNPPwHQrVs3nnnmGTw8PIDc2WM1a9bk0UcfZfr06XnqhISE8Ouvv+Lk5MTq1au57777rOV+9957L6tXr8ZmsxEREVGimMrDa6+9Rk5ODh07dmTx4sUEBgYC4O7uziuvvMJLL70EwLRp00hNTc23jSpVqrBx40br5EonJyd69+7Nq6++CsCyZcvylC/J2Mv1R8sSRUREREREimPNSxC37/LlKrIazeH+t8u0ydmzZ+Pv789HH31EVlYWmzZtYtOmTdbzNm3aMG7cOIYMGZJnSWFiYqL12dfXt1QxHDx4kLCwMNzc3OjTp0+eZ0OHDiU0NJR58+bx/PPPF6tdT09PAE6ePElOTg4ODpefJ2JP0vTp04dbbrnlkufNmjVjwIABLFq0iCVLljBy5MhixXS1JSUlsXnzZgBefvnlfJcd/uMf/+Cf//wnaWlprF69mkGDBl1SZsyYMfj5+V1yv0+fPrzwwgtERUWRnp5O1apVgZKNvVx/9K9CRERERERESs3Z2Zn33nuPY8eOMXPmTAYPHkzDhg2tRNbOnTsZNmwYQUFB1n5NZc0+a6t3796X7CnVu3dvPDw82LdvH3v27ClWu127dsXZ2Zldu3bRpUsXFixYwIkTJwqts2vXLgDuvvvuAsvcc889ecpWZLt378Y0TQzDoHPnzvmW8fLyspaoFtSnNm3a5Hu/Vq1a1ueUlBTrc0nGXq4/mrklIiIiIiJSHGU84+laU716dYKDgwkODgYgPj6e0NBQJk+ezLFjx1i6dCkdO3Zk3LhxAHlm8SQlJZX4vTk5OSxYsADIuyTRztXVlb59+zJ//nzmzZvHbbfdVuS2b7rpJj799FOefPJJfvjhB3744Qcg9wTAHj16MGbMmEtOeLQvxbwwaXMx+7K+xMREK3FUUdn74+XlVehm9PY+FbQU1b6s8GIuLi7W53PnzlmfSzL2cv3RzC0RERERERG5YgICAhg1ahS7du0iICAAgDlz5ljP69ata50iuHfv3hK/Z+PGjcTExAC5s7Ts+1tdeM2fPx+AhQsXcv78+WK1P3LkSKKiopgxYwYPPfQQfn5+HD16lJkzZ9KqVSumTJmSb70rvVn81VYe/Snp2Mv1Q8ktERERERERueL8/f156KGHADh8+LB132az0bFjRwBCQ0NL3L59SWJRnDx5kjVr1hT7HQEBAYwbN46VK1eSkJBAWFgYffv2xTRNXnvtNX799VerrP2kxujo6ALbO378OJA7e62os7bse11lZmbm+/zUqVNFaqe47P3JyMgo9IAAe5/s5ctKccZerj9KbomIiIiIiMhVYd8k3NnZOc/9MWPGAHDgwAGWL19epLZM07Q+p6amsmLFCiA3QZacnFzgNXbsWKB4ybD8GIZBmzZtWLp0KYGBgeTk5LBt2zbr+e233w5gbcKen++++y5P2aLw9vYG/pdEutjOnTsLrGvfjP3CsSuqli1bWgm4gvp06tQpfvnlF6B4fSquy429XH+U3BIREREREZFSiYqK4siRI4WWOXPmDCtXrgS4ZL+rfv360a5dOyA30bV79+5C24qOjiYoKMj6funSpWRkZODn50ePHj3w9vYu8LLXCw0NLfIeX1lZWQU+c3R0xGazAXmX7A0YMACANWvW5NufiIgI60TFgQMHFikOgObNmwOwatWqS56dPXuWGTNmFFjXfvLghRu2F5Wvr6+1Of60adPyPRRg2rRpZGZm4u7uTs+ePYv9jvyUZOzl+qPkloiIiIiIiJRKREQEjRo1ol+/fixZsoTY2FjrWXp6OqGhoXTq1ImoqCgAazN5OwcHB5YsWUJgYCCJiYnceeedjB8/noMHD1plsrOzCQsL49lnn6Vx48aEhYVZzy48JdHJqfBz0zp27EhAQABZWVksXry4SP175ZVXGDBgACtXrsyTEIuPj+fpp58mKioKwzC47777rGdBQUHceuutAPTp04eNGzdaM6Y2bdpEz549OXfuHM2aNWPo0KFFigP+lwibPXs2//nPf6ykTkREBD179iz0JMFmzZoBsHbt2jw/o6J64403cHBwYNeuXQwaNMiaPZaWlsaUKVN4++3cwxZeeuklK5FWWiUZe7kOmaap6zJXq1atTBERkZIYOHO7OXDm9vIOQ0REiujAgQPlHUKltHbtWhPIc7m6uppeXl557jk6OppvvfVWge2cOHHC7NKlS546NpvN9PX1NR0cHPLcGz9+vGmapnnkyBHTMAwTML/55psixRscHGwC5h133FGk8uPGjcsTk6enp+nh4ZHnXn79+u2338y6detaZdzc3Ew3Nzfr+zp16piHDh26pN5//vMfEzA7d+58ybOsrCyzbdu2VhtOTk6mp6enCZi+vr7mypUrrWcXS0hIMH19fU3AdHBwMGvUqGHWrVvXrFu3rlUmKiqqwPqmaZozZ860fhaGYZg+Pj6mo6OjVWfo0KHm+fPnL6lnH4fNmzcXOM72NqKioqx7JR17KR/F/R0KhJtlkLcpPKUtIiIiIiIichndu3fn0KFDhIaGsm3bNvbv309MTAxpaWl4e3tTv3597rrrLkaNGmXNHspPzZo12bx5Mxs3biQkJIRt27YRGxtLamoqfn5+NG3alK5du/Loo49Su3ZtAObPn49pmnh4eNC1a9cixdu/f39mzZpFWFgYkZGRNG7cuNDyzz77LA0aNGDTpk0cPHiQ2NhYzp49S+3atenQoQNjx46lU6dOl9S76aab2Lt3L++//z7Lly/nv//9LwC33HILffv25fnnn8fLy6tIMdvZbDY2bNjAG2+8wdKlSzlx4gRVq1alX79+TJgwodC6/v7+bN68mUmTJvHjjz+SkJBAdnZ2sd4fHBxMmzZteO+999iyZQsJCQl4eXnRqlUrxowZYy3HLCslHXu5vhhmCTaSu960bt3aDA8PL+8wRESkEgqatQOAkOD25RyJiIgUxcGDB2nSpEl5hyEiUikV93eoYRi/mKbZurTv1Z5bIiIiIiIiIiJSaSm5JSIiIiIiIiIilZaSWyIiIiIiIiIiUmkpuSUiIiIiIiIiIpWWklsiIiIiIiIiIlJpKbklIiIiIiIiIiKVlpJbIiIiIiIiIiJSaSm5JSIiIiIiIiIilZaSWyIiIiIiIiIiUmkpuSUiIiIiIiIiIpWWklsiIiIiIiIiIlJpKbklIiIiIiIiIiKVlpJbIiIiIiIiIiJSaSm5JSIiIiIiIiIilZaSWyIiIiIiIiIiUmkpuSUiIiIiIiIiIpWWklsiIiIiIiIiFdSWLVswDIN69eqVy/sNw8AwDI4ePVou7xcpCiW3REREREREpNRGjBhhJULsl81mw8/Pj5tuuok+ffowZcoUoqKiitVueHg4zzzzDLfddhv+/v5Wm+3atePvf/87+/fvv2wbCQkJODs7YxgGXl5eZGRklLSb14wtW7YwceJEVq5cWd6hiJSaklsiIiIiIiJSZmw2GwEBAQQEBODr68uZM2c4cuQIq1atYvz48TRo0ICHH36YhISEQttJS0tj0KBBtGnThg8++IC9e/eSkpKCp6cnp06d4ueff+bdd9+lefPmDB48uNC2Fi5cyLlz5wBITU1VQofc5NakSZMuOxaNGjWiUaNG2Gy2qxSZSPEpuSUiIiIiIiJlpkOHDsTFxREXF0d8fDwZGRkkJyezZs0agoKCMAyDZcuW0bJlS2JiYvJt4/Tp09x5552EhITg5OTE//3f/7Fz506ysrJITEwkKyuLX3/9lddffx0vLy8WL15caEzz5s0DYPTo0Xm+l8uLjIwkMjKSWrVqlXcoIgVScktERERERESuKG9vb3r06MHixYv59ttvcXFxISYmhv79++dbfsyYMezduxcXFxe+/fZbPvnkE1q3bo2DQ+6fsA4ODjRv3pxJkyZx5MgR7r///gLfvW/fPnbv3k2tWrV4//33cXd3Z8OGDZw4ceKK9FVErj4lt0REREREROSq6dGjB9OnTwfg559/JjQ0NM/zXbt2WTOx3nzzTbp161Zoe35+fnzzzTcFPrfP0ho8eDDu7u706dOHnJwcFixYUJpusGrVKnr27ElAQAA2mw1fX18aNWrE4MGDCQkJybfO2bNnef/992nbti1eXl64urrSqFEjnnvuOeLi4oodQ7169TAMgy1bthRY5uIN4Y8ePYphGEyaNAnIHZ+L90q7cPP4y20of+TIEYKDg6lfvz4uLi74+Phw11138fnnn5OdnZ1vnS5dumAYBnPnziUjI4OJEyfSqFEjXF1dqV69OoMGDeK3334rsE8lGXu5tim5JSIiIiIiIlfV6NGjCQgIAHL3w7rQzJkzAfD19WXs2LFFas8+o+ti2dnZfPnllwAMGTIEgKFDhwKlW5o4fvx4+vTpw5o1azh58iSurq5kZGRw+PBhFi9ezLhx4y6pk5CQQPv27Xn++ecJCwvj7Nmz2Gw2Dh8+zD//+U+aNm3KTz/9VOKYinTZK+YAACAASURBVMrR0ZGAgACqVq0KgIuLi7VHmv1ydHQsUlvffPMNt9xyC5999hlRUVG4uLiQnp7ODz/8wOjRo+nRowfp6ekF1k9NTaVjx45MmjSJ6OhoDMMgISGBkJAQ2rVrx5EjRy6pU5Kxl2ufklsiIiIiIiJyVTk7O3PPPfcA8MMPP+R5tnnzZgDuu+8+XFxcSvWedevWERcXR5MmTWjZsqXVbvXq1Tlw4ADh4eHFbvPo0aO8/fbbALz88sskJCSQmppKRkYG8fHxLFu2jF69el1Sb/jw4ezevRsfHx+WLFlCeno6qamp7Ny5k+bNm5OcnEyfPn34888/S9Xny6lduzZxcXG88MILAAQFBVl7pNmv2rVrX7adI0eOMGjQIDIzM+ncuTORkZGkpKRw+vRpZs2aRZUqVdi4cWOhyaYJEyaQnJzM2rVrSU9PJy0tja1btxIYGEhSUhIvv/xynvIlHXu59im5JSIiIiIiIldd8+bNAYiJibFOMjx37hy///47AC1atCj1O+yzs+yztiB35lJQUFCe58URFhZGTk4OjRs3ZsqUKfj7+1vPqlevTv/+/fn3v/+dp84PP/zA2rVrgdyZag8//LA1O6p169Zs2LABHx8f4uPj+de//lXsmMrDlClTSE9Pp0GDBqxevZpGjRoBUKVKFcaMGWP1Y86cOdbP9GJnz55lw4YNdO/eHUdHRxwcHOjUqRMzZswA4OuvvyYrK8sqX5Kxl+uDU3kHICIiIiIiUplMC5tGZFJkeYdRKo19G/OPO/5RrjH4+PhYn5OSkggICCApKcm65+vrW6r2U1JS+Prrr4G8yS3IXZr44YcfsmjRIt5//31sNluR2/X09ATg1KlTnDlzBjc3t8vWWbZsGZCbyOrRo8clzwMCAvjb3/7G1KlTWbJkCZMnTy5yPOXBNE2++uorAJ599tl8x2DUqFFMnjyZmJgYli1bxksvvXRJmQEDBnDTTTddcr93794YhsHZs2f5/fffadq0KVCysZfrg2ZuiYiIiIiISLkyDKPM21y8eDGZmZm0a9eO+vXr53nWtm1bbrrpJhITE/n222+L1W7btm3x9fUlNjaW9u3bW/tNFWbXrl0A3H333QWWsS/TPHz4cKH7VFUE//3vfzl16hRQcJ8cHBzo0qUL8L/+X6xNmzb53rfZbFSvXh2A5ORk635Jxl6uD5q5JSIiIiIiUgzlPePpWnFh0sI+i+vC2VoXzuIqifyWJF5oyJAhTJ48mXnz5tGnT58it+vj48MXX3zB0KFD+fXXXwkODgagRo0adOvWjZEjR9K5c+c8dRISEgCoVatWge0GBgYCubOi/vzzT2vD94rI3h8oWp8uLH8hDw+PAuva91uzL1mFko29XB80c0tERERERESuun379gG5CRD7skCbzWYtU9u7d2+J2z58+LB18uDTTz+NYRiXXPalf99++22xN3Hv2bMnR48e5bPPPmPgwIHccMMNxMXFMX/+fLp06cKYMWPyrXf27NkS96miutp9KunYy7WtQie3DMO42TCMyYZh/GQYRoJhGKcNw9hjGMZ4wzCKlMY2DGOLYRhmAVfrK90HERERERERySsrK4tNmzYB0KlTpzzP7MvcNmzYQGZmZonaL85G8efOnWPRokXFfoeXlxejR48mJCSEmJgYIiIiGD16NACzZ8/Os9yxWrVqAERHRxfY3vHjx4HcJZoXbpReGCen3MVYBY2TfelgWbP3B4rWpwvLl4XijL1cHyp0cgsYCTwLHAEmAy8Ch4A3ge2GYbgWsZ0/gUfyuf5b1gGLiIiIiIhI4WbPns3JkyeB3M3dL2SfeZOUlMQnn3xSpPZM07Q+5+Tk8MUXXwDw8ccfk5ycXOA1bdo0oGSnJl6sadOmfPbZZ7Rr1w6A77//3np2++23W/cujPVC3333HQA333xzkZckent7A/9LIl1s586dBdZ1cMhNBxQUT2Hq169vvXvz5s35lsnJyWHLli3A//p/pRQ29nJ9qOjJrWVAoGmaQ03T/NA0zZmmaQYBbwG3Ao8XsZ100zQX5HOVbhG3iIiIiIiIFMu6det48cUXAWjfvj29evXK87x169YMHDgQgPHjx7Nhw4ZC20tMTMzTxubNmzl27BiOjo4MHDgQb2/vAq9BgwYB8MsvvxAREVGk+LOysgp97uqaOwfjwuV6AwYMACAiIoJVq1ZdUic+Pp6ZM2cCWH0viubNmwPk26ZpmlbyLj/2kwdTUlKK/D47wzDo168fAB988AFnzpy5pMznn39OTEwMhmFY/S+tkoy9XB8qdHLLNM1w0zTzm0cZ8tfXW4ralmEYDoZheBpX4hgOERERERERKdCpU6dYt24dgwcPpmfPnmRkZFC7dm2WLVuWb/nZs2fTvHlzMjMz6dmzJ2PHjmXXrl3k5OQAuYmb/fv3M2HCBBo0aMCaNWusuvZZWHfddddll/fVqVOH1q1b56l3OZ9++indu3dn4cKFxMbGWvdTUlKYMmWKNVupe/fu1rNOnTrRo0cPAEaOHMmyZcvIzs4GchNr3bp1Izk5mYCAAMaNG1ekOOB/ibBvv/2WadOmWacsHj16lMGDBxMeHl5g3WbNmgGwbds2fvvttyK/0+6VV16hatWqnDhxgl69enHo0CEgN7E0e/Zsnn76aQAef/xxax+10irJ2Mv1obKelhj419f4IpavBaQBrsAZwzDWAa+Yphl5JYITERERERG5Xm3fvp0aNWpY358+fTrPzB7DMBg4cCAff/xxgcknT09Ptm3bxuOPP86yZcv45JNP+OSTT3B0dMTLy4vU1FTOnz9vtTd8+HAA0tLSWL58OQD9+/cvUrz9+/cnPDycBQsWMHXqVBwdHQstb5om69evZ/369QBUrVoVm82WZwbUmDFj6NmzZ5568+fPp1u3buzZs4eHH34YFxcXbDYbp0+fBnJPAlyxYgV+fn5Fihvg/vvvp1+/fixfvpyXXnqJV155BU9PT1JSUnBxcWHVqlUFJnq6dOlCgwYNOHLkCI0aNcLf3x83NzcgN+FlP+mwIA0aNGDRokUMHDiQLVu20LhxY7y9vUlPT7dOOLz33nuZMWNGkftzOSUde7n2VbrklmEYjsDrwHlgYRGqRAE/Ar8C2UBb4EngXsMw7jRNc9+VilVEREREROR6c+7cOeLjc+chODo64unpSY0aNbjlllto27YtgwcP5sYbb7xsO56enixdupSdO3fyxRdfsGXLFo4fP05qaiqenp7cfPPNdOnShREjRtCoUSMAli1bRnp6OoZh0Ldv3yLF279/f15++WViY2PZsGGDNcOqIEOGDMHd3Z2NGzfy66+/EhsbS1paGjVr1qRNmzY8/vjj9O7d+5J61apVY8eOHXzyyScsWrSIQ4cOkZWVRcOGDenVqxd///vfqVmzZpFivtCiRYuYPn068+fPJyoqCpvNRv/+/Xn99de59dZbC6xns9nYtGkTr732Gps3byYuLo6EhAQAK3F4OQ8++CD79u3jnXfeYcOGDZw4cQI3NzeaN2/O8OHDGTly5GWThcVR0rGXa59Rks3jypNhGB+Sm5x6xTTNqSVsoxOwBfjONM37CigzBhgDUKdOnVaFnQAhIiJSkKBZOwAICW5fzpGIiEhRHDx4kCZNmpR3GCIilVJxf4cahvGLaZqtS/veCr3n1sUMw3iD3MTWZyVNbAGYpvkDsBW4u6ATF03T/Mw0zdamabYu62NLRURERERERESkbFSa5JZhGBOBV4H/AH8rgyaPAo6ATxm0JSIiIiIiIiIi5aBSJLcMw5gATADmA6PMsllL2ZDcfbuSyqAtEREREREREREpBxU+uWUYxuvAROAL4DHTNHMKKFfTMIzGhmG4XXDP668N6C8u2wvoCGwwTTPzykQuIiIiIiIiIiJXWoU+LdEwjLHAJOAPYCMwxDCMC4vEm6a54a/PU4FHgbvJ3Syevz6/bxhGKPBfcmdq3QEMA/4EnrnCXRARERERERERkSuoQie3gDZ/fa0DzMvn+ffAhnzu2x0CfgEeAAIAG3AcmAlMMU0zpuxCFRERERERERGRq61CJ7dM0xwBjChpWdM0DwIPl3FYIiIiIiIiIiJSQVT4PbdEREREREREREQKouSWiIiIiIiIiIhUWkpuiYiIiIiIiIhIpaXkloiIiIiIiIiIVFpKbomIiIiIiIiISKWl5JaIiIiIiIiIiFRaSm6JiIiIiIiIiEilpeSWiIiIiIiIiIhUWkpuiYiIiIiIiIhIpaXkloiIiIiIiIhcFyZOnIhhGIwYMeKqv3vLli0YhkG9evWu+ruvdUpuiYiIiIiISJk4f/48c+fOpUePHtSsWRNnZ2d8fHxo0qQJvXr1Ytq0aezcufOy7Xz33XcEBwfTtGlTfHx8cHZ2pnr16nTu3JlJkyYRFRV12Tb27t2LYRgYhsHNN99cFt27qurVq2fFb79cXFwICAjglltu4ZFHHmHmzJmkpKQUuU3TNFm5ciWPPvooN998M15eXlSpUoWaNWvSrVs3pk+fTnx8/GXbWblypRVTt27dStPNa8bcuXOZOHEie/bsKe9QrktO5R2AiIiIiIiIVH4JCQn07NmT8PBw656LiwumaXLo0CEiIyNZvXo1Xl5eBSZk4uLiGDZsGJs2bbLuOTk54eHhQWJiIlu3bmXr1q288cYbPPvss7z77rsFxjN37lzr82+//caOHTto37596Tt6lVWtWhV3d3cAsrOzSU5O5uTJk0RERLBgwQKee+45nn/+eSZMmICTU8F/4h8+fJhBgwaxe/du656zszNVq1YlPj6euLg4NmzYwOuvv86UKVN45plnCmxr3rx51udNmzZx/PhxAgMDy6C3ldfcuXP5/vvvqVevHrfddlu+Zdzc3GjUqBG1atW6ytFd+zRzS0REREREREpt2LBhhIeH4+HhwTvvvENsbCwZGRmkpKRw6tQpNmzYwBNPPIG3t3e+9Y8fP07btm3ZtGkTrq6uvPzyy+zfv5+srCySkpLIysrip59+Yty4cdhsNpYuXVpgLOfPn2fhwoUAjBo1CsibkClr9llWR48eLfO2X3jhBeLi4oiLiyMhIYGsrCyOHTvGggULaN++PRkZGbz55pvcf//9nD9/Pt829u7dS7t27di9ezc+Pj68/fbbHDlyhLNnz5KUlERmZiabN2/mscceIysri5UrVxYYT2JiIt9++y1ubm4MGTKEnJwcFixYUOb9vhbdcccdREZG5kneStlQcktERERERERKJTIykvXr1wMwZ84cXnzxRWrUqGE99/DwoGvXrnz88cccPHjwkvo5OTkEBQXxxx9/4Ofnx48//siUKVNo1qwZhmEA4OjoSNu2bZkxYwaRkZHccccdBcazZs0aTp48Sfv27Xn11VcxDIOQkBAyMzPLuOflIzAwkKFDh/Ljjz8yadIkADZu3Mj48eMvKZuens6AAQNITk6mfv367Nq1i3/84x/Ur1/fKuPs7EyXLl2YM2cOv/zyCw0bNizw3QsXLuTcuXM89NBDBAcHA1c2cShSFEpuiYiIiIiISKns27fP+vzAAw8UWtbV1fWSeytWrGD79u0AzJo1i5YtWxbaRt26dQkJCSnwuT3ZMnToUOrWrUvHjh1JSUnh66+/LrTdysYwDF5//XUefvhhAD788ENOnjyZp8zMmTP5/fffcXBwYPHi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\n", "text/plain": [ "
" ] }, "metadata": { "needs_background": "light" }, "output_type": "display_data" } ], "source": [ "util.draw_tradeoffs([values, values_sca, values_dca, values_sca_dca], \n", " [\"Static\", \"SCA solutions\", \"DCA solutions\", \"SCA + DCA solutions\"])" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### Test on real-life SHL dataset" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Load the relevant parts of the dataset - the sequence of contexts, settings, their energy cost and misclassifications using each of the settings." ] }, { "cell_type": "code", "execution_count": 21, "metadata": {}, "outputs": [], "source": [ "optimizer = EnergyOptimizer()\n", "optimizer.load_data_config(sample_dataset=\"SHL\")" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "There are eight different contexts in this dataset." ] }, { "cell_type": "code", "execution_count": 22, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "['Bike', 'Bus', 'Car', 'Run', 'Still', 'Subway', 'Train', 'Walking']" ] }, "execution_count": 22, "metadata": {}, "output_type": "execute_result" } ], "source": [ "optimizer.contexts" ] }, { "cell_type": "code", "execution_count": 23, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "0 Run\n", "1 Still\n", "2 Still\n", "3 Still\n", "4 Still\n", " ... \n", "4072 Bike\n", "4073 Bike\n", "4074 Bike\n", "4075 Bike\n", "4076 Train\n", "Name: Context, Length: 4077, dtype: object" ] }, "execution_count": 23, "metadata": {}, "output_type": "execute_result" } ], "source": [ "optimizer.sequence" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Settings are sensor subset used. They are encoded in a binary tuple, where each element represents the existance of one sensors.
\n", "Sensor order in tuple: accelerometer, magnetometer, barometer, pressure sensor, orientation sensor.
\n", "The energy cost of a setting is the number of sensors * 10 " ] }, { "cell_type": "code", "execution_count": 24, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "20" ] }, "execution_count": 24, "metadata": {}, "output_type": "execute_result" } ], "source": [ "optimizer.setting_to_energy[(1,1,0,0,0)]" ] }, { "cell_type": "code", "execution_count": 25, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "0 Run\n", "1 Bus\n", "2 Bus\n", "3 Still\n", "4 Still\n", " ... \n", "4072 Bike\n", "4073 Bike\n", "4074 Bike\n", "4075 Bike\n", "4076 Train\n", "Name: 11000, Length: 4077, dtype: object" ] }, "execution_count": 25, "metadata": {}, "output_type": "execute_result" } ], "source": [ "#The context as predicted using only accelerometer and magnetometer\n", "optimizer.setting_to_sequence[(1,1,0,0,0)] " ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Now we can run the exact same methods as in the artifical example case" ] }, { "cell_type": "code", "execution_count": 26, "metadata": {}, "outputs": [], "source": [ "solutions, values = optimizer.find_sca_static()\n", "solutions_sca, values_sca = optimizer.find_sca_tradeoffs()" ] }, { "cell_type": "code", "execution_count": 27, "metadata": {}, "outputs": [ { "data": { "image/png": "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wdKlS0u9jjjiiMLY3r1787Of/Yy5c+eyfv16PvroIzZs2MD06dPp378/b775JiNHjix1/4ceeojnn3++1Odt+7r00kurVOfFF1/M3XffTVFREVdddRVLly5lxYoVrF+/ntdff52f//zn7Lbbbp99IzUpDXbFVP5MqQfKXt/mqXxvppS27b8c+CrweETcDKwCvkduK99JKaUd+vwoSZIkSVLDtvfee/Od73yHu+66i8cee4wePXpw1FFHMWDAAPr3788RRxzBzjvvXKvPGDNmzKeutWjRgqOPPppHH32UAw44gIcffpgFCxaU2r5XW3PnzuWWW24B4H/+538YMWJEoa958+b07t27ygGXmpYGG0xVV0rpHxExELgeuAxoCcwGTkgpTc20OEmSJElSwegpcxv9g5c+t1sHrvpGnzq/7+23307Xrl351a9+xaZNm5g2bRrTpk0r9Pfv35+LLrqIs846i4io08/u3LkzRxxxBJMnT+bZZ5+t02Dqt7/9LSklDjjggFKhlNSQt/KVK6X0VkopUkqfevZkSmleSumUlFJxSqlNSulIQylJkiRJUmPRsmVLfvGLX/DOO+8wbtw4vvWtb9G7d+9CCPX8888zdOhQhgwZwtatW2v0GTNnzuS8887jgAMOoF27dqUOMp88eTIAixcv/oy7VM9zzz0HwIknnlin91Xj12RWTEmSJEmSGoftsdKoqdlll10YOXJk4byn9957jylTpnD11VfzzjvvcP/99zNw4EAuuuiiat33pptu4v/9v/9HyWk3RUVFdOrUqXBA+sqVK9mwYQNr166t0+/z3nvvAdCzZ886va8av0a3YkqSJEmSpB1Nt27dGD58OLNnzy48Fe+OO+6o1j3mzp3Lj370I1JKXHjhhcydO5eNGzfy4YcfFg4yHzx4MAB1fUyzxz6rIgZTkiRJkiQ1El27duWUU04B4PXXX6/W3AcffJCtW7dy/PHH89///d987nOfo6ioqNSYkpVNda179+4ALFy4cLvcX42XwZQkSZIkSY1I27ZtAQrb7wCaNcv9731lK5MWLVoEwCGHHFJu/9q1awtnQZVVcv/P+oyKDBgwAIBHHnmk2nPVtBlMSZIkSZLUACxYsIA333yz0jHr1q1j0qRJABx88MGF6x06dABgxYoVFc7t2LEjAHPmzCm3/9prr2X16tXl9pXc/7M+oyLf/va3iQjmz5/PrbfeWu35aroMpiRJkiRJagDmzp3L/vvvz+mnn859993HkiVLCn1r165lypQpHHXUUSxYsACg1MHnffrkDpR/9dVX+dvf/lbu/Y877jgA/vSnP3Hdddexbt06AJYtW8YPf/hDxowZQ5cuXcqdW1xczG677QbA+PHjq/3d+vTpUzjI/YILLmDUqFG8//77AGzZsoU33niDUaNGMW7cuGrfW42bwZQkSZIkSQ1AixYt2LJlC3/4wx8YMmQIu+22G23atKG4uJh27dpx8sknM3v2bIqKirj22ms5/fTTC3N79+7Nl7/8ZTZv3syAAQPo0qULe+65J3vuuWdhe97Xvva1wpwrr7ySdu3a0blzZ7p168ZNN93Eeeedx9e//vUK6xs+fDgAl1xyCe3atSvcf+zYsVX6fmPHjuXMM89ky5YtjB49mm7dutGpUyd22mkn9ttvP0aPHs3SpUtr+vOpkTKYkiRJkiSpATj++ON57bXXuOmmmzj11FPZd999AVizZg3FxcV88Ytf5Ac/+AEvv/wyV1xxxafmP/TQQ5x//vnstdderFmzhoULF7Jw4UI2bNhQGDNx4kSuv/56DjzwQFq0aEFKiYEDB3LnnXfyv//7v5XW99Of/pQbbriBgw46iJRS4f5V3drXqlUrJk6cyOTJk/nGN75Bt27dWLt2LV27dmXAgAFce+21fO9736vGL6amIHxk4yf69euXZs2alXUZmRpy67MATBx5eMaVSJIkSWqM5s2bx4EHHph1GZK2o+r+O4+IF1JK/crrc8WUJEmSJEmSMmEwJUmSJEmSpEwYTEmSJEmSJCkTBlOSJEmSJEnKhMGUJEmSJEmSMmEwJUmSJEmSpEwYTEmSJEmSJCkTBlOSJEmSJEnKhMGUJEmSJEmSMmEwJUmSJEmSpEwYTEmSJEmSJCkTBlOSJEmSJEnKhMGUJEmSJEmSMmEwJUmSJEmSpEwYTEmSJEmSJCkTBlOSJEmSJEnKhMGUJEmSJElqUiZMmEBEcMwxx9T7Z7/11ltEBBFR75/dGBlMSZIkSZLUQGzevJkJEyZwwgknsOuuu9KyZUs6derEgQceyEknncQNN9zA888//5n3+fOf/8zIkSP53Oc+R6dOnWjZsiW77LILRx99NKNHj2bBggWfeY+XX365ELDst99+dfH1Gr1JkyYxatQopk+fnnUpTUbzrAuQJEmSJEmwbNkyTjzxRGbNmlW4ttNOO5FS4rXXXmP+/Pk8/PDDdOzYkRUrVpR7j6VLlzJ06FCmTZtWuNa8eXPat2/P8uXLeeqpp3jqqae45ppruPjii/n5z39eYT0TJkwovH/jjTd49tlnOfzww2v/RRuxSZMmceeddwJUuBqrRYsW7L///vVYVePmiilJkiRJkhqAoUOHMmvWLNq3b8+NN97IkiVLWL9+PStWrGDlypU88cQTnH/++RQXF5c7f9GiRRx22GFMmzaN1q1bc/nll/P3v/+dTZs28eGHH7Jp0yaee+45LrroIlq0aMH9999fYS2bN2/mnnvuAWD48OEAhUBGldt9992ZP38+8+fPz7qURsFgSpIkSZKkjM2fP5/HH38cgDvuuIMf/vCHdO/evdDfvn17Bg0axK9//WvmzZv3qflbt25lyJAhvP3223Tp0oW//vWvXHfddfTp06dw1lFRURGHHXYYY8eOZf78+XzpS1+qsJ5HHnmE999/n8MPP5wf//jHRAQTJ05kw4YNdfzNtaMzmJIkSZIkKWNz5swpvP/6179e6djWrVt/6tof/vAHnnnmGQBuvfVWDjnkkErv0atXLyZOnFhhf8nqqLPPPptevXoxcOBAVqxYwR//+MdK71uZrVu3MmHCBI499li6dOlCixYt2HnnnenTpw/nnXcejz76aLnzVq1axahRo/jCF75Au3btaNeuHQcddBBXXXUVK1eurHYdJedmvfXWW+X2l3d4+fTp04mIwu8yevTowpiyY6ty+PmLL77I0KFD2WOPPWjVqhVdu3bl+OOP58EHH6xwzp577klEMH36dD788EP+8z//k7322otWrVqx++67873vfY8lS5aUO7emv3198IwpSZIkSZIakHfffZd99tmnWnNuvfVWAA488EDOOOOMKs2pKDj58MMPmTJlCs2bN+fMM88EcgHVjBkzuPPOOwvXquvb3/52YXsgQMeOHVm1ahUffPABr776Kq+++ionnHBCqTn/+Mc/GDRoEAsXLgSgTZs2QC7ImzNnDhMmTGDq1Kn07t27RjVVVcuWLenWrRsrV65kw4YNtG3blnbt2tXoXrfddhv//u//ztatWwEoLi5mxYoVPP744zz++OMMHTqUCRMmUFRUVO78RYsWce6557Jw4ULatGlDRLB48WJ+85vfMHXqVGbPnk2nTp1KzanJb19fXDElSZIkSVLGDj300ML7Cy64gGXLllV57scff8xf//pXAE4++eRa13LvvfeyadMmjjvuOHbeeWcA/vVf/5UWLVrw2GOPsXTp0mrf86mnnuKee+6hWbNm3HzzzaxatYoVK1awYcMGFi9ezIQJEzjyyCNLzdm0aRNnnHEGCxcuZI899uDxxx9nzZo1rFmzhqlTp9KzZ0/efvttTjvtNDZu3Fjr712ZI444gqVLlzJkyBAALr30UpYuXVrqVRXPPPNMIZQaPHgw77zzDh999BErVqzg2muvJSK4++67GTNmTIX3+P73v0+nTp145plnWLt2LWvWrGHy5MkUFxfz1ltvfWpuTX77+mQwJUmSJElSxvbee2++853vAPDYY4/Ro0cPBg0axI9//GMmT55caVC1cOFC1q1bB8AXvvCFWtdSsl3trLPOKlzr0qULJ5xwAlu2bOF3v/tdte/53HPPAfC1r32NH/zgB7Rv3x7IrdraddddOeecc7jppptKzZk4cSKvvPIKzZs35+GHH+a4444rbJH76le/ysMPP0yLFi2YO3dujWrKwk9+8hO2bt3KwIEDuffee+nRowcA7dq144orruCyyy4D4IYbbmDVqlXl3qNVq1ZMnTq18ITE5s2bc/LJJ/PjH/8YgAceeKDU+Jr89vXJrXySJEmSpPr1yGWwdM5nj2vIuveFf7m+Tm95++2307VrV371q1+xadMmpk2bxrRp0wr9/fv356KLLuKss84qtQ1v+fLlhfedO3euVQ3z5s1j5syZtGnThlNPPbVU39lnn82UKVO48847ueSSS6p13w4dOgDw/vvvs3XrVpo1++x1MiUBy6mnnsrnP//5T/X36dOHwYMH8/vf/5777ruP8847r1o11bcPP/yQJ598EoDLL7+83K16P/rRj7j55ptZs2YNDz/8MN/85jc/NWbEiBF06dLlU9dPPfVULr30UhYsWMDatWtp27YtULPfvj41rGokSZIkSdpBtWzZkl/84he88847jBs3jm9961v07t27EEI9//zzDB06lCFDhhTOJ6prJaulTj755E+doXTyySfTvn175syZw0svvVSt+w4aNIiWLVsye/ZsjjnmGO6++24WL15c6ZzZs2cDcOyxx1Y45itf+UqpsQ3Ziy++SEqJiODoo48ud0zHjh0L2zor+k79+/cv9/ruu+9eeL9ixYrC+5r89vXJFVOSJEmSpPpVxyuNmppddtmFkSNHMnLkSADee+89pkyZwtVXX80777zD/fffz8CBA7nooosASq2e+fDDD2v8uVu3buXuu+8GSm/jK9G6dWtOO+007rrrLu68804OPvjgKt9733335ZZbbuHCCy/k6aef5umnnwZyT5o74YQTGDFixKeeJFiyfXHbwKWskq1wy5cvL4Q+DVXJ9+nYsWOlB6eXfKeKtm+WbMUra6eddiq8//jjjwvva/Lb1ydXTEmSJEmS1IB169aN4cOHM3v2bLp16wbAHXfcUejv1atX4Wl1L7/8co0/Z+rUqbz77rtAbnVUyXlO277uuusuAO655x42b95crfufd955LFiwgLFjx3LKKafQpUsX3nrrLcaNG8ehhx7KddddV+687X2weX3L4vvU9LevDwZTkiRJkiQ1Al27duWUU04B4PXXXy9cb9GiBQMHDgRgypQpNb5/yTa+qnj//fd55JFHqv0Z3bp146KLLmLSpEksW7aMmTNnctppp5FS4ic/+QmvvPJKYWzJEwEXLlxY4f0WLVoE5FaNVXW1VMnZThs2bCi3f+XKlVW6T3WVfJ/169dXeph9yXcqGV9XqvPb1yeDKUmSJEmSGomSA61btmxZ6vqIESMAePXVV3nooYeqdK+UUuH9qlWr+MMf/gDkwq2PPvqowtcFF1wAVC/IKk9E0L9/f+6//3569OjB1q1bmTFjRqH/i1/8IkDhwPDy/PnPfy41tiqKi4uBTwKgsp5//vkK55YcHL7tb1dVhxxySCE8q+g7rVy5khdeeAGo3neqrs/67euTwZQkSZIkSRlbsGABb775ZqVj1q1bx6RJkwA+db7T6aefzoABA4BcSPXiiy9Weq+FCxcyZMiQwt/3338/69evp0uXLpxwwgkUFxdX+CqZN2XKlCqfabVp06YK+4qKimjRogVQepvb4MGDAXjkkUfK/T5z584tPLnvzDPPrFIdAH379gVg8uTJn+rbuHEjY8eOrXBuyRPutj1cvKo6d+5cOMj9hhtuKPcA+xtuuIENGzbQrl07TjzxxGp/Rnlq8tvXJ4MpSZIkSZIyNnfuXPbff39OP/107rvvPpYsWVLoW7t2LVOmTOGoo45iwYIFAIWDz0s0a9aM++67jx49erB8+XKOPPJIrrzySubNm1cYs2XL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\n", "text/plain": [ "
" ] }, "metadata": { "needs_background": "light" }, "output_type": "display_data" } ], "source": [ "util.draw_tradeoffs([values, values_sca], \n", " [\"Static\", \"SCA solutions\"])" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Display a SCA assignment is a nice formatted way." ] }, { "cell_type": "code", "execution_count": 47, "metadata": {}, "outputs": [], "source": [ "sensor_list = [\"acc\",\"mag\",\"pressure\",\"gyr\",\"ori\"]\n", "def display_assignment(index, letter=\"\"):\n", " config,acc,energy = solutions_sca[index], values_sca[index][0], values_sca[index][1]\n", " length = len(sensor_list)\n", " print (\" \"*9+\" \".join(sensor_list))\n", " for i,a in enumerate(optimizer.contexts):\n", " cfg = \" \".join([(\"{0:>\"+str(len(s))+\"}\").format(str(config[i][j])) for j,s \n", " in enumerate(sensor_list)])\n", " print (\"%7s: %s\" % (a, cfg))\n", " print (\"Accuracy: %1.3f Energy: %1.1f\"%(acc,energy))\n", " if len(letter)>0:\n", " return (acc,energy, letter)" ] }, { "cell_type": "code", "execution_count": 29, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ " acc mag pressure gyr ori\n", " Bike: 1 0 0 0 0\n", " Bus: 1 1 0 0 0\n", " Car: 1 1 0 0 0\n", " Run: 1 0 0 0 0\n", " Still: 1 0 0 0 0\n", " Subway: 1 0 0 0 0\n", " Train: 1 1 0 0 0\n", "Walking: 1 0 0 0 0\n", "Accuracy: 0.856 Energy: 14.5\n" ] } ], "source": [ "display_assignment(50)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### Cost-sensitive decision trees" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "The examples above showed how to change sensing settings based on the last classified context. An alternative is to change such settings based on the last feature data. This can be accomplished using the cost-sensitive decision trees adapted for the context recognition task. Such trees work by calculating only a subset of features in order to minimize the cost of attaining and calculating them. Based on the current branch used during the classification, different feature subset may be active for next instance." ] }, { "cell_type": "code", "execution_count": 30, "metadata": {}, "outputs": [], "source": [ "from eecr import CostSensitiveTree\n", "import pandas as pd" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "We start by defining a toy dataset for activity recognition. Attribute values are inspired by real sensors, but are modified so most attributes can only distinguish between two different activities. " ] }, { "cell_type": "code", "execution_count": 31, "metadata": {}, "outputs": [], "source": [ "activities = [\"still\", \"walk\", \"walk\",\"run\",\"run\",\"car\",\"car\",\"subway\",\"subway\",\"still\"]\n", "gps_velocity = [1,0,1,0,1,66,68,66,68,0]\n", "acc_motion = [1,4,5,4,5,0,1,0,1,0]\n", "acc_period = [4,5,4,10,11,5,4,5,4,5]\n", "mag_field = [49,48,49,48,49,48,49,102,203,48]\n", "data = pd.DataFrame()\n", "data[\"gps_velocity\"] = gps_velocity\n", "data[\"acc_motion\"] = acc_motion\n", "data[\"acc_period\"] = acc_period\n", "data[\"mag_field\"] = mag_field\n", "data[\"activity\"] = activities\n", "x = data.drop([\"activity\"], axis=1)\n", "y = data[\"activity\"]\n", "contexts = y.unique()" ] }, { "cell_type": "code", "execution_count": 32, "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", "
gps_velocityacc_motionacc_periodmag_fieldactivity
011449still
104548walk
215449walk
3041048run
4151149run
5660548car
6681449car
76605102subway
86814203subway
900548still
\n", "
" ], "text/plain": [ " gps_velocity acc_motion acc_period mag_field activity\n", "0 1 1 4 49 still\n", "1 0 4 5 48 walk\n", "2 1 5 4 49 walk\n", "3 0 4 10 48 run\n", "4 1 5 11 49 run\n", "5 66 0 5 48 car\n", "6 68 1 4 49 car\n", "7 66 0 5 102 subway\n", "8 68 1 4 203 subway\n", "9 0 0 5 48 still" ] }, "execution_count": 32, "metadata": {}, "output_type": "execute_result" } ], "source": [ "data" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Next we define which attributes belong to which sensors and their respective costs. Attributes that belong to the same sensor will have the same cost, regardless of how many of them are active. " ] }, { "cell_type": "code", "execution_count": 33, "metadata": {}, "outputs": [], "source": [ "feature_groups = {\"acc\": [\"acc_motion\", \"acc_period\"], \"gps\": [\"gps_velocity\"], \"mag\":[\"mag_field\"]}\n", "\n", "def sensor_costs(sensor_list):\n", " #print(sensor_list)\n", " cost = 20 #Base cost\n", " if \"acc\" in sensor_list:\n", " cost += 10\n", " if \"gps\" in sensor_list:\n", " cost+=30\n", " if \"mag\" in sensor_list:\n", " cost+=15\n", " #print (cost)\n", " return cost" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "A cost sensitive tree is created and fitted with the data." ] }, { "cell_type": "code", "execution_count": 34, "metadata": {}, "outputs": [], "source": [ "tree = CostSensitiveTree(contexts, sensor_costs, feature_groups=feature_groups, weight = 0.01)\n", "tree.fit(x,y)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "We would expect that classifying the original data will yield the original label sequence and it does. " ] }, { "cell_type": "code", "execution_count": 35, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "['still',\n", " 'walk',\n", " 'walk',\n", " 'run',\n", " 'run',\n", " 'car',\n", " 'car',\n", " 'subway',\n", " 'subway',\n", " 'still']" ] }, "execution_count": 35, "metadata": {}, "output_type": "execute_result" } ], "source": [ "tree.predict(x)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "The resulting tree can be visualized in two different layers of abstraction. " ] }, { "cell_type": "code", "execution_count": 36, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "acc_motion == 1\n", " mag_field == 49\n", " gps_velocity == 1\n", " --> still\n", " gps_velocity == 68\n", " --> car\n", " mag_field == 203\n", " --> subway\n", "acc_motion == 4\n", " acc_period == 5\n", " --> walk\n", " acc_period == 10\n", " --> run\n", "acc_motion == 5\n", " acc_period == 4\n", " --> walk\n", " acc_period == 11\n", " --> run\n", "acc_motion == 0\n", " mag_field == 48\n", " gps_velocity == 66\n", " --> car\n", " gps_velocity == 0\n", " --> still\n", " mag_field == 102\n", " --> subway\n" ] } ], "source": [ "tree.show()" ] }, { "cell_type": "code", "execution_count": 37, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "acc\n", " ---> ['walk', 'run']\n", " mag\n", " ---> ['subway']\n", " gps\n", " ---> ['still', 'car']\n", " mag\n", " ---> ['subway']\n", " gps\n", " ---> ['still', 'car']\n", "\n" ] } ], "source": [ "tree.show_sensors()" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Finally, we show that if we increase the weights, some sensors cease to be used. GPS is the most expensive and is the first one to go. " ] }, { "cell_type": "code", "execution_count": 38, "metadata": {}, "outputs": [], "source": [ "tree = CostSensitiveTree(contexts, sensor_costs, feature_groups=feature_groups, weight = 0.019)\n", "tree.fit(x,y)" ] }, { "cell_type": "code", "execution_count": 39, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "acc\n", " ---> ['walk', 'run']\n", " mag\n", " ---> ['still', 'subway']\n", " mag\n", " ---> ['subway', 'car']\n", "\n" ] } ], "source": [ "tree.show_sensors()" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### Automatic settings generation" ] }, { "cell_type": "code", "execution_count": 40, "metadata": {}, "outputs": [], "source": [ "from sklearn.tree import DecisionTreeClassifier" ] }, { "cell_type": "code", "execution_count": 41, "metadata": {}, "outputs": [], "source": [ "classifier = DecisionTreeClassifier()" ] }, { "cell_type": "code", "execution_count": 42, "metadata": {}, "outputs": [], "source": [ "optimizer = EnergyOptimizer(y)" ] }, { "cell_type": "code", "execution_count": 43, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "['acc', 'gps', 'mag']" ] }, "execution_count": 43, "metadata": {}, "output_type": "execute_result" } ], "source": [ "list(feature_groups)" ] }, { "cell_type": "code", "execution_count": 44, "metadata": {}, "outputs": [], "source": [ "feature_groups =[[\"acc_motion\", \"acc_period\"], [\"gps_velocity\"], [\"mag_field\"]]" ] }, { "cell_type": "code", "execution_count": 45, "metadata": {}, "outputs": [], "source": [ "def sensor_costs(setting):\n", " #print(setting)\n", " cost = 20 \n", " if setting[0] == 1:\n", " cost += 10\n", " if setting[1] == 1:\n", " cost+=30\n", " if setting[2] == 1:\n", " cost+=15\n", " return cost" ] }, { "cell_type": "code", "execution_count": 46, "metadata": {}, "outputs": [], "source": [ "classifiers = optimizer.add_subsets(x,y,x,y,classifier, feature_groups=feature_groups, n = 3, \n", " setting_fn_energy = sensor_costs)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "TO BE CONTINUED..." ] } ], "metadata": { "kernelspec": { "display_name": "Python 3", "language": "python", "name": "python3" }, "language_info": { "codemirror_mode": { "name": "ipython", "version": 3 }, "file_extension": ".py", "mimetype": "text/x-python", "name": "python", "nbconvert_exporter": "python", "pygments_lexer": "ipython3", "version": "3.7.0" } }, "nbformat": 4, "nbformat_minor": 4 }