Home | History | Annotate | Download | only in tutorial
      1 {
      2  "cells": [
      3   {
      4    "cell_type": "code",
      5    "execution_count": 43,
      6    "metadata": {
      7     "collapsed": false,
      8     "init_cell": false,
      9     "run_control": {
     10      "marked": false
     11     }
     12    },
     13    "outputs": [],
     14    "source": [
     15     "# Enable in-notebook generation of plots\n",
     16     "%matplotlib inline"
     17    ]
     18   },
     19   {
     20    "cell_type": "markdown",
     21    "metadata": {},
     22    "source": [
     23     "# Experiments collected data"
     24    ]
     25   },
     26   {
     27    "cell_type": "markdown",
     28    "metadata": {},
     29    "source": [
     30     "Data required to run this notebook are available for download at this link:\n",
     31     "\n",
     32     "https://www.dropbox.com/s/q9ulf3pusu0uzss/SchedTuneAnalysis.tar.xz?dl=0\n",
     33     "\n",
     34     "This archive has to be extracted from within the LISA's results folder."
     35    ]
     36   },
     37   {
     38    "cell_type": "markdown",
     39    "metadata": {},
     40    "source": [
     41     "## Initial set of data"
     42    ]
     43   },
     44   {
     45    "cell_type": "code",
     46    "execution_count": 2,
     47    "metadata": {
     48     "collapsed": false,
     49     "hidden": true,
     50     "hide_input": false
     51    },
     52    "outputs": [
     53     {
     54      "name": "stdout",
     55      "output_type": "stream",
     56      "text": [
     57       "\u001b[01;34m../../results/SchedTuneAnalysis/\u001b[00m\r\n",
     58       " \u001b[01;35mboost15_cluster_freqs.png\u001b[00m\r\n",
     59       " \u001b[01;35mboost15_task_util_task_ramp.png\u001b[00m\r\n",
     60       " energy.json\r\n",
     61       " output.log\r\n",
     62       " platform.json\r\n",
     63       " rt-app-task_ramp-0.log\r\n",
     64       " test_00.json\r\n",
     65       " trace_boost15.dat\r\n",
     66       " trace_boost15.raw.txt\r\n",
     67       " trace_boost15.txt\r\n",
     68       " trace_boost25.dat\r\n",
     69       " trace_noboost.dat\r\n",
     70       "\r\n",
     71       "0 directories, 12 files\r\n"
     72      ]
     73     }
     74    ],
     75    "source": [
     76     "res_dir = '../../results/SchedTuneAnalysis/'\n",
     77     "!tree {res_dir}"
     78    ]
     79   },
     80   {
     81    "cell_type": "code",
     82    "execution_count": 3,
     83    "metadata": {
     84     "collapsed": true,
     85     "hidden": true
     86    },
     87    "outputs": [],
     88    "source": [
     89     "noboost_trace = res_dir + 'trace_noboost.dat'\n",
     90     "boost15_trace = res_dir + 'trace_boost15.dat'\n",
     91     "boost25_trace = res_dir + 'trace_boost25.dat'\n",
     92     "\n",
     93     "# trace_file = noboost_trace\n",
     94     "trace_file = boost15_trace\n",
     95     "# trace_file = boost25_trace"
     96    ]
     97   },
     98   {
     99    "cell_type": "markdown",
    100    "metadata": {},
    101    "source": [
    102     "## Loading support data collected from the target"
    103    ]
    104   },
    105   {
    106    "cell_type": "code",
    107    "execution_count": 5,
    108    "metadata": {
    109     "collapsed": false,
    110     "hidden": true
    111    },
    112    "outputs": [
    113     {
    114      "name": "stdout",
    115      "output_type": "stream",
    116      "text": [
    117       "Platform descriptio collected from the target:\n",
    118       "{\n",
    119       "    \"nrg_model\": {\n",
    120       "        \"big\": {\n",
    121       "            \"cluster\": {\n",
    122       "                \"nrg_max\": 64\n",
    123       "            }, \n",
    124       "            \"cpu\": {\n",
    125       "                \"cap_max\": 1024, \n",
    126       "                \"nrg_max\": 616\n",
    127       "            }\n",
    128       "        }, \n",
    129       "        \"little\": {\n",
    130       "            \"cluster\": {\n",
    131       "                \"nrg_max\": 57\n",
    132       "            }, \n",
    133       "            \"cpu\": {\n",
    134       "                \"cap_max\": 447, \n",
    135       "                \"nrg_max\": 93\n",
    136       "            }\n",
    137       "        }\n",
    138       "    }, \n",
    139       "    \"clusters\": {\n",
    140       "        \"big\": [\n",
    141       "            1, \n",
    142       "            2\n",
    143       "        ], \n",
    144       "        \"little\": [\n",
    145       "            0, \n",
    146       "            3, \n",
    147       "            4, \n",
    148       "            5\n",
    149       "        ]\n",
    150       "    }, \n",
    151       "    \"cpus_count\": 6, \n",
    152       "    \"freqs\": {\n",
    153       "        \"big\": [\n",
    154       "            450000, \n",
    155       "            625000, \n",
    156       "            800000, \n",
    157       "            950000, \n",
    158       "            1100000\n",
    159       "        ], \n",
    160       "        \"little\": [\n",
    161       "            450000, \n",
    162       "            575000, \n",
    163       "            700000, \n",
    164       "            775000, \n",
    165       "            850000\n",
    166       "        ]\n",
    167       "    }, \n",
    168       "    \"topology\": [\n",
    169       "        [\n",
    170       "            0, \n",
    171       "            3, \n",
    172       "            4, \n",
    173       "            5\n",
    174       "        ], \n",
    175       "        [\n",
    176       "            1, \n",
    177       "            2\n",
    178       "        ]\n",
    179       "    ]\n",
    180       "}\n"
    181      ]
    182     }
    183    ],
    184    "source": [
    185     "import json\n",
    186     "\n",
    187     "# Load the platform information\n",
    188     "with open('../../results/SchedTuneAnalysis/platform.json', 'r') as fh:\n",
    189     "    platform = json.load(fh)\n",
    190     "print \"Platform descriptio collected from the target:\"\n",
    191     "print json.dumps(platform, indent=4)"
    192    ]
    193   },
    194   {
    195    "cell_type": "code",
    196    "execution_count": 6,
    197    "metadata": {
    198     "collapsed": false,
    199     "hidden": true
    200    },
    201    "outputs": [],
    202    "source": [
    203     "from trappy.stats.Topology import Topology\n",
    204     "\n",
    205     "# Create a topology descriptor\n",
    206     "topology = Topology(platform['topology'])"
    207    ]
    208   },
    209   {
    210    "cell_type": "markdown",
    211    "metadata": {},
    212    "source": [
    213     "# Trace analysis"
    214    ]
    215   },
    216   {
    217    "cell_type": "markdown",
    218    "metadata": {
    219     "hidden": true
    220    },
    221    "source": [
    222     "We want to ensure that the task has the expected workload:<br>\n",
    223     "- LITTLE CPU bandwidth of **[10, 35 and 60]%** every **2[ms]**\n",
    224     "- activations every **32ms**\n",
    225     "- always **starts on a big** core"
    226    ]
    227   },
    228   {
    229    "cell_type": "markdown",
    230    "metadata": {
    231     "hidden": true
    232    },
    233    "source": [
    234     "## Trace inspection"
    235    ]
    236   },
    237   {
    238    "cell_type": "markdown",
    239    "metadata": {
    240     "hidden": true
    241    },
    242    "source": [
    243     "### Using kernelshark"
    244    ]
    245   },
    246   {
    247    "cell_type": "code",
    248    "execution_count": 7,
    249    "metadata": {
    250     "collapsed": false,
    251     "hidden": true
    252    },
    253    "outputs": [
    254     {
    255      "name": "stdout",
    256      "output_type": "stream",
    257      "text": [
    258       "version = 6\r\n"
    259      ]
    260     }
    261    ],
    262    "source": [
    263     "# Let's look at the trace using kernelshark...\n",
    264     "!kernelshark {trace_file} 2>/dev/null"
    265    ]
    266   },
    267   {
    268    "cell_type": "markdown",
    269    "metadata": {
    270     "hidden": true
    271    },
    272    "source": [
    273     "- Requires a lot of interactions and hand made measurements\n",
    274     "- We cannot easily annotate our findings to produre a sharable notebook"
    275    ]
    276   },
    277   {
    278    "cell_type": "markdown",
    279    "metadata": {
    280     "hidden": true
    281    },
    282    "source": [
    283     "### Using the TRAPpy Trace Plotter"
    284    ]
    285   },
    286   {
    287    "cell_type": "markdown",
    288    "metadata": {
    289     "hidden": true
    290    },
    291    "source": [
    292     "An overall view on the trace is still useful to get a graps on what we are looking at."
    293    ]
    294   },
    295   {
    296    "cell_type": "code",
    297    "execution_count": 10,
    298    "metadata": {
    299     "code_folding": [],
    300     "collapsed": false,
    301     "hidden": true
    302    },
    303    "outputs": [
    304     {
    305      "data": {
    306       "text/html": [
    307        "<style>\n",
    308        "/*\n",
    309        "\n",
    310        " *    Copyright 2015-2016 ARM Limited\n",
    311        "\n",
    312        " *\n",
    313        "\n",
    314        " * Licensed under the Apache License, Version 2.0 (the \"License\");\n",
    315        "\n",
    316        " * you may not use this file except in compliance with the License.\n",
    317        "\n",
    318        " * You may obtain a copy of the License at\n",
    319        "\n",
    320        " *\n",
    321        "\n",
    322        " *     http://www.apache.org/licenses/LICENSE-2.0\n",
    323        "\n",
    324        " *\n",
    325        "\n",
    326        " * Unless required by applicable law or agreed to in writing, software\n",
    327        "\n",
    328        " * distributed under the License is distributed on an \"AS IS\" BASIS,\n",
    329        "\n",
    330        " * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n",
    331        "\n",
    332        " * See the License for the specific language governing permissions and\n",
    333        "\n",
    334        " * limitations under the License.\n",
    335        "\n",
    336        " */\n",
    337        "\n",
    338        "\n",
    339        "\n",
    340        ".d3-tip {\n",
    341        "\n",
    342        "  line-height: 1;\n",
    343        "\n",
    344        "  padding: 12px;\n",
    345        "\n",
    346        "  background: rgba(0, 0, 0, 0.6);\n",
    347        "\n",
    348        "  color: #fff;\n",
    349        "\n",
    350        "  border-radius: 2px;\n",
    351        "\n",
    352        "  position: absolute !important;\n",
    353        "\n",
    354        "  z-index: 99999;\n",
    355        "\n",
    356        "}\n",
    357        "\n",
    358        "\n",
    359        "\n",
    360        ".d3-tip:after {\n",
    361        "\n",
    362        "  box-sizing: border-box;\n",
    363        "\n",
    364        "  pointer-events: none;\n",
    365        "\n",
    366        "  display: inline;\n",
    367        "\n",
    368        "  font-size: 10px;\n",
    369        "\n",
    370        "  width: 100%;\n",
    371        "\n",
    372        "  line-height: 1;\n",
    373        "\n",
    374        "  color: rgba(0, 0, 0, 0.6);\n",
    375        "\n",
    376        "  content: \"\\25BC\";\n",
    377        "\n",
    378        "  position: absolute !important;\n",
    379        "\n",
    380        "  z-index: 99999;\n",
    381        "\n",
    382        "  text-align: center;\n",
    383        "\n",
    384        "}\n",
    385        "\n",
    386        "\n",
    387        "\n",
    388        ".d3-tip.n:after {\n",
    389        "\n",
    390        "  margin: -1px 0 0 0;\n",
    391        "\n",
    392        "  top: 100%;\n",
    393        "\n",
    394        "  left: 0;\n",
    395        "\n",
    396        "}\n",
    397        "\n",
    398        "\n",
    399        "\n",
    400        ".contextRect {\n",
    401        "\n",
    402        "  fill: lightgray;\n",
    403        "\n",
    404        "  fill-opacity: 0.5;\n",
    405        "\n",
    406        "  stroke: black;\n",
    407        "\n",
    408        "  stroke-width: 1;\n",
    409        "\n",
    410        "  stroke-opacity: 1;\n",
    411        "\n",
    412        "  pointer-events: none;\n",
    413        "\n",
    414        "  shape-rendering: crispEdges;\n",
    415        "\n",
    416        "}\n",
    417        "\n",
    418        "\n",
    419        "\n",
    420        ".chart {\n",
    421        "\n",
    422        "  shape-rendering: crispEdges;\n",
    423        "\n",
    424        "}\n",
    425        "\n",
    426        "\n",
    427        "\n",
    428        ".mini text {\n",
    429        "\n",
    430        "  font: 9px sans-serif;\n",
    431        "\n",
    432        "}\n",
    433        "\n",
    434        "\n",
    435        "\n",
    436        ".main text {\n",
    437        "\n",
    438        "  font: 12px sans-serif;\n",
    439        "\n",
    440        "}\n",
    441        "\n",
    442        "\n",
    443        "\n",
    444        ".axis line, .axis path {\n",
    445        "\n",
    446        "  stroke: black;\n",
    447        "\n",
    448        "}\n",
    449        "\n",
    450        "\n",
    451        "\n",
    452        ".miniItem {\n",
    453        "\n",
    454        "  stroke-width: 8;\n",
    455        "\n",
    456        "}\n",
    457        "\n",
    458        "\n",
    459        "\n",
    460        ".brush .extent {\n",
    461        "\n",
    462        "\n",
    463        "\n",
    464        "  stroke: #000;\n",
    465        "\n",
    466        "  fill-opacity: .125;\n",
    467        "\n",
    468        "  shape-rendering: crispEdges;\n",
    469        "\n",
    470        "}\n",
    471        "\n",
    472        "</style>\n",
    473        "<div id=\"fig_e79c6fb0e4324389a92f1aa080f4f390\" class=\"eventplot\">\n",
    474        "        <script>\n",
    475        "            var req = require.config( {\n",
    476        "\n",
    477        "                paths: {\n",
    478        "\n",
    479        "                    \"EventPlot\": '/nbextensions/plotter_scripts/EventPlot/EventPlot',\n",
    480        "                    \"d3-tip\": '/nbextensions/plotter_scripts/EventPlot/d3.tip.v0.6.3',\n",
    481        "                    \"d3-plotter\": '/nbextensions/plotter_scripts/EventPlot/d3.min'\n",
    482        "                },\n",
    483        "                shim: {\n",
    484        "                    \"d3-plotter\" : {\n",
    485        "                        \"exports\" : \"d3\"\n",
    486        "                    },\n",
    487        "                    \"d3-tip\": [\"d3-plotter\"],\n",
    488        "                    \"EventPlot\": {\n",
    489        "\n",
    490        "                        \"deps\": [\"d3-tip\", \"d3-plotter\" ],\n",
    491        "                        \"exports\":  \"EventPlot\"\n",
    492        "                    }\n",
    493        "                }\n",
    494        "            });\n",
    495        "            req([\"require\", \"EventPlot\"], function() {\n",
    496        "               EventPlot.generate('fig_e79c6fb0e4324389a92f1aa080f4f390', '/nbextensions/');\n",
    497        "            });\n",
    498        "        </script>\n",
    499        "        </div>"
    500       ],
    501       "text/plain": [
    502        "<IPython.core.display.HTML object>"
    503       ]
    504      },
    505      "metadata": {},
    506      "output_type": "display_data"
    507     }
    508    ],
    509    "source": [
    510     "# Suport for FTrace events parsing and visualization\n",
    511     "import trappy\n",
    512     "\n",
    513     "# NOTE: The interactive trace visualization is available only if you run\n",
    514     "#       the workload to generate a new trace-file\n",
    515     "trappy.plotter.plot_trace(trace_file)#, execnames=\"task_ramp\")#, pids=[2221])"
    516    ]
    517   },
    518   {
    519    "cell_type": "markdown",
    520    "metadata": {
    521     "hidden": true
    522    },
    523    "source": [
    524     "## Events Plotting"
    525    ]
    526   },
    527   {
    528    "cell_type": "markdown",
    529    "metadata": {
    530     "hidden": true
    531    },
    532    "source": [
    533     "The **sched_load_avg_task** trace events reports this information"
    534    ]
    535   },
    536   {
    537    "cell_type": "markdown",
    538    "metadata": {
    539     "hidden": true
    540    },
    541    "source": [
    542     "### Using all the unix arsenal to parse and filter the trace"
    543    ]
    544   },
    545   {
    546    "cell_type": "code",
    547    "execution_count": 8,
    548    "metadata": {
    549     "collapsed": false,
    550     "hidden": true
    551    },
    552    "outputs": [
    553     {
    554      "name": "stdout",
    555      "output_type": "stream",
    556      "text": [
    557       "First 5 sched_load_avg events:\n",
    558       "       trace-cmd-2204  [000]  1773.509207: sched_load_avg_task:  comm=trace-cmd pid=2204 cpu=0 load_avg=452 util_avg=176 util_est=176 load_sum=21607277 util_sum=8446887 period_contrib=125\n",
    559       "       trace-cmd-2204  [000]  1773.509223: sched_load_avg_task:  comm=trace-cmd pid=2204 cpu=0 load_avg=452 util_avg=176 util_est=176 load_sum=21607277 util_sum=8446887 period_contrib=125\n",
    560       "          <idle>-0     [002]  1773.509522: sched_load_avg_task:  comm=sudo pid=2203 cpu=2 load_avg=0 util_avg=0 util_est=941 load_sum=7 util_sum=7 period_contrib=576\n",
    561       "            sudo-2203  [002]  1773.511197: sched_load_avg_task:  comm=sudo pid=2203 cpu=2 load_avg=14 util_avg=14 util_est=941 load_sum=688425 util_sum=688425 period_contrib=219\n",
    562       "            sudo-2203  [002]  1773.511219: sched_load_avg_task:  comm=sudo pid=2203 cpu=2 load_avg=14 util_avg=14 util_est=14 load_sum=688425 util_sum=688425 period_contrib=219\n",
    563       "grep: write error\n"
    564      ]
    565     }
    566    ],
    567    "source": [
    568     "# Get a list of first 5 \"sched_load_avg_events\" events\n",
    569     "sched_load_avg_events = !(\\\n",
    570     "    grep sched_load_avg_task {trace_file.replace('.dat', '.txt')} | \\\n",
    571     "    head -n5 \\\n",
    572     ")\n",
    573     " \n",
    574     "print \"First 5 sched_load_avg events:\"\n",
    575     "for line in sched_load_avg_events:\n",
    576     "    print line"
    577    ]
    578   },
    579   {
    580    "cell_type": "markdown",
    581    "metadata": {
    582     "hidden": true
    583    },
    584    "source": [
    585     "A graphical representation whould be really usefuly!"
    586    ]
    587   },
    588   {
    589    "cell_type": "markdown",
    590    "metadata": {
    591     "hidden": true
    592    },
    593    "source": [
    594     "### Using TRAPpy generated DataFrames"
    595    ]
    596   },
    597   {
    598    "cell_type": "markdown",
    599    "metadata": {
    600     "hidden": true
    601    },
    602    "source": [
    603     "#### Generate DataFrames from Trace Events"
    604    ]
    605   },
    606   {
    607    "cell_type": "code",
    608    "execution_count": 11,
    609    "metadata": {
    610     "collapsed": false,
    611     "hidden": true
    612    },
    613    "outputs": [],
    614    "source": [
    615     "# Load the LISA::Trace parsing module\n",
    616     "from trace import Trace\n",
    617     "\n",
    618     "# Define which event we are interested into\n",
    619     "trace = Trace(platform, trace_file, [\n",
    620     "            \"sched_switch\",\n",
    621     "            \"sched_load_avg_cpu\",\n",
    622     "            \"sched_load_avg_task\",\n",
    623     "            \"sched_boost_cpu\",\n",
    624     "            \"sched_boost_task\",\n",
    625     "            \"cpu_frequency\",\n",
    626     "            \"cpu_capacity\",\n",
    627     "    ])"
    628    ]
    629   },
    630   {
    631    "cell_type": "markdown",
    632    "metadata": {
    633     "hidden": true
    634    },
    635    "source": [
    636     "#### Get the DataFrames for the events of interest"
    637    ]
    638   },
    639   {
    640    "cell_type": "code",
    641    "execution_count": 12,
    642    "metadata": {
    643     "collapsed": false,
    644     "hidden": true
    645    },
    646    "outputs": [
    647     {
    648      "data": {
    649       "text/html": [
    650        "<div>\n",
    651        "<table border=\"1\" class=\"dataframe\">\n",
    652        "  <thead>\n",
    653        "    <tr style=\"text-align: right;\">\n",
    654        "      <th></th>\n",
    655        "      <th>__comm</th>\n",
    656        "      <th>__cpu</th>\n",
    657        "      <th>__pid</th>\n",
    658        "      <th>comm</th>\n",
    659        "      <th>cpu</th>\n",
    660        "      <th>load_avg</th>\n",
    661        "      <th>load_sum</th>\n",
    662        "      <th>period_contrib</th>\n",
    663        "      <th>pid</th>\n",
    664        "      <th>util_avg</th>\n",
    665        "      <th>util_est</th>\n",
    666        "      <th>util_sum</th>\n",
    667        "      <th>cluster</th>\n",
    668        "    </tr>\n",
    669        "    <tr>\n",
    670        "      <th>Time</th>\n",
    671        "      <th></th>\n",
    672        "      <th></th>\n",
    673        "      <th></th>\n",
    674        "      <th></th>\n",
    675        "      <th></th>\n",
    676        "      <th></th>\n",
    677        "      <th></th>\n",
    678        "      <th></th>\n",
    679        "      <th></th>\n",
    680        "      <th></th>\n",
    681        "      <th></th>\n",
    682        "      <th></th>\n",
    683        "      <th></th>\n",
    684        "    </tr>\n",
    685        "  </thead>\n",
    686        "  <tbody>\n",
    687        "    <tr>\n",
    688        "      <th>0.000065</th>\n",
    689        "      <td>trace-cmd</td>\n",
    690        "      <td>0</td>\n",
    691        "      <td>2204</td>\n",
    692        "      <td>trace-cmd</td>\n",
    693        "      <td>0</td>\n",
    694        "      <td>452</td>\n",
    695        "      <td>21607277</td>\n",
    696        "      <td>125</td>\n",
    697        "      <td>2204</td>\n",
    698        "      <td>176</td>\n",
    699        "      <td>176</td>\n",
    700        "      <td>8446887</td>\n",
    701        "      <td>LITTLE</td>\n",
    702        "    </tr>\n",
    703        "    <tr>\n",
    704        "      <th>0.000081</th>\n",
    705        "      <td>trace-cmd</td>\n",
    706        "      <td>0</td>\n",
    707        "      <td>2204</td>\n",
    708        "      <td>trace-cmd</td>\n",
    709        "      <td>0</td>\n",
    710        "      <td>452</td>\n",
    711        "      <td>21607277</td>\n",
    712        "      <td>125</td>\n",
    713        "      <td>2204</td>\n",
    714        "      <td>176</td>\n",
    715        "      <td>176</td>\n",
    716        "      <td>8446887</td>\n",
    717        "      <td>LITTLE</td>\n",
    718        "    </tr>\n",
    719        "    <tr>\n",
    720        "      <th>0.000380</th>\n",
    721        "      <td>&lt;idle&gt;</td>\n",
    722        "      <td>2</td>\n",
    723        "      <td>0</td>\n",
    724        "      <td>sudo</td>\n",
    725        "      <td>2</td>\n",
    726        "      <td>0</td>\n",
    727        "      <td>7</td>\n",
    728        "      <td>576</td>\n",
    729        "      <td>2203</td>\n",
    730        "      <td>0</td>\n",
    731        "      <td>941</td>\n",
    732        "      <td>7</td>\n",
    733        "      <td>big</td>\n",
    734        "    </tr>\n",
    735        "    <tr>\n",
    736        "      <th>0.002055</th>\n",
    737        "      <td>sudo</td>\n",
    738        "      <td>2</td>\n",
    739        "      <td>2203</td>\n",
    740        "      <td>sudo</td>\n",
    741        "      <td>2</td>\n",
    742        "      <td>14</td>\n",
    743        "      <td>688425</td>\n",
    744        "      <td>219</td>\n",
    745        "      <td>2203</td>\n",
    746        "      <td>14</td>\n",
    747        "      <td>941</td>\n",
    748        "      <td>688425</td>\n",
    749        "      <td>big</td>\n",
    750        "    </tr>\n",
    751        "    <tr>\n",
    752        "      <th>0.002077</th>\n",
    753        "      <td>sudo</td>\n",
    754        "      <td>2</td>\n",
    755        "      <td>2203</td>\n",
    756        "      <td>sudo</td>\n",
    757        "      <td>2</td>\n",
    758        "      <td>14</td>\n",
    759        "      <td>688425</td>\n",
    760        "      <td>219</td>\n",
    761        "      <td>2203</td>\n",
    762        "      <td>14</td>\n",
    763        "      <td>14</td>\n",
    764        "      <td>688425</td>\n",
    765        "      <td>big</td>\n",
    766        "    </tr>\n",
    767        "  </tbody>\n",
    768        "</table>\n",
    769        "</div>"
    770       ],
    771       "text/plain": [
    772        "             __comm  __cpu  __pid       comm  cpu  load_avg  load_sum  \\\n",
    773        "Time                                                                    \n",
    774        "0.000065  trace-cmd      0   2204  trace-cmd    0       452  21607277   \n",
    775        "0.000081  trace-cmd      0   2204  trace-cmd    0       452  21607277   \n",
    776        "0.000380     <idle>      2      0       sudo    2         0         7   \n",
    777        "0.002055       sudo      2   2203       sudo    2        14    688425   \n",
    778        "0.002077       sudo      2   2203       sudo    2        14    688425   \n",
    779        "\n",
    780        "          period_contrib   pid  util_avg  util_est  util_sum cluster  \n",
    781        "Time                                                                  \n",
    782        "0.000065             125  2204       176       176   8446887  LITTLE  \n",
    783        "0.000081             125  2204       176       176   8446887  LITTLE  \n",
    784        "0.000380             576  2203         0       941         7     big  \n",
    785        "0.002055             219  2203        14       941    688425     big  \n",
    786        "0.002077             219  2203        14        14    688425     big  "
    787       ]
    788      },
    789      "execution_count": 12,
    790      "metadata": {},
    791      "output_type": "execute_result"
    792     }
    793    ],
    794    "source": [
    795     "# Trace events are converted into tables, let's have a look at one\n",
    796     "# of such tables\n",
    797     "load_df = trace.data_frame.trace_event('sched_load_avg_task')\n",
    798     "load_df.head()"
    799    ]
    800   },
    801   {
    802    "cell_type": "code",
    803    "execution_count": 14,
    804    "metadata": {
    805     "collapsed": false,
    806     "hidden": true
    807    },
    808    "outputs": [
    809     {
    810      "name": "stdout",
    811      "output_type": "stream",
    812      "text": [
    813       "['kworker/u12:0' 'kworker/5:0' 'kworker/2:1' 'kworker/1:1' 'kworker/0:1'\n",
    814       " 'ksoftirqd/0' 'kworker/3:1' 'kworker/4:1' 'ksoftirqd/5' 'kworker/5:1H'\n",
    815       " 'ksoftirqd/2' 'ksoftirqd/1' 'kworker/2:2' 'kthreadd' 'kworker/2:0'\n",
    816       " 'kworker/u12:2']\n"
    817      ]
    818     }
    819    ],
    820    "source": [
    821     "df = load_df[load_df.comm.str.match('k.*')]\n",
    822     "# df.head()\n",
    823     "print df.comm.unique()"
    824    ]
    825   },
    826   {
    827    "cell_type": "code",
    828    "execution_count": 15,
    829    "metadata": {
    830     "collapsed": false,
    831     "hidden": true
    832    },
    833    "outputs": [
    834     {
    835      "data": {
    836       "text/html": [
    837        "<div>\n",
    838        "<table border=\"1\" class=\"dataframe\">\n",
    839        "  <thead>\n",
    840        "    <tr style=\"text-align: right;\">\n",
    841        "      <th></th>\n",
    842        "      <th>__comm</th>\n",
    843        "      <th>__cpu</th>\n",
    844        "      <th>__pid</th>\n",
    845        "      <th>cpu</th>\n",
    846        "      <th>capacity</th>\n",
    847        "      <th>max_capacity</th>\n",
    848        "      <th>tip_capacity</th>\n",
    849        "    </tr>\n",
    850        "    <tr>\n",
    851        "      <th>Time</th>\n",
    852        "      <th></th>\n",
    853        "      <th></th>\n",
    854        "      <th></th>\n",
    855        "      <th></th>\n",
    856        "      <th></th>\n",
    857        "      <th></th>\n",
    858        "      <th></th>\n",
    859        "    </tr>\n",
    860        "  </thead>\n",
    861        "  <tbody>\n",
    862        "    <tr>\n",
    863        "      <th>0.002708</th>\n",
    864        "      <td>kschedfreq:0</td>\n",
    865        "      <td>4</td>\n",
    866        "      <td>1489</td>\n",
    867        "      <td>0</td>\n",
    868        "      <td>236</td>\n",
    869        "      <td>447</td>\n",
    870        "      <td>357.6</td>\n",
    871        "    </tr>\n",
    872        "    <tr>\n",
    873        "      <th>0.002710</th>\n",
    874        "      <td>kschedfreq:0</td>\n",
    875        "      <td>4</td>\n",
    876        "      <td>1489</td>\n",
    877        "      <td>3</td>\n",
    878        "      <td>236</td>\n",
    879        "      <td>447</td>\n",
    880        "      <td>357.6</td>\n",
    881        "    </tr>\n",
    882        "    <tr>\n",
    883        "      <th>0.002711</th>\n",
    884        "      <td>kschedfreq:0</td>\n",
    885        "      <td>4</td>\n",
    886        "      <td>1489</td>\n",
    887        "      <td>4</td>\n",
    888        "      <td>236</td>\n",
    889        "      <td>447</td>\n",
    890        "      <td>357.6</td>\n",
    891        "    </tr>\n",
    892        "    <tr>\n",
    893        "      <th>0.002712</th>\n",
    894        "      <td>kschedfreq:0</td>\n",
    895        "      <td>4</td>\n",
    896        "      <td>1489</td>\n",
    897        "      <td>5</td>\n",
    898        "      <td>236</td>\n",
    899        "      <td>447</td>\n",
    900        "      <td>357.6</td>\n",
    901        "    </tr>\n",
    902        "    <tr>\n",
    903        "      <th>0.410816</th>\n",
    904        "      <td>kschedfreq:1</td>\n",
    905        "      <td>2</td>\n",
    906        "      <td>1490</td>\n",
    907        "      <td>1</td>\n",
    908        "      <td>1024</td>\n",
    909        "      <td>1024</td>\n",
    910        "      <td>819.2</td>\n",
    911        "    </tr>\n",
    912        "  </tbody>\n",
    913        "</table>\n",
    914        "</div>"
    915       ],
    916       "text/plain": [
    917        "                __comm  __cpu  __pid  cpu  capacity  max_capacity  \\\n",
    918        "Time                                                                \n",
    919        "0.002708  kschedfreq:0      4   1489    0       236           447   \n",
    920        "0.002710  kschedfreq:0      4   1489    3       236           447   \n",
    921        "0.002711  kschedfreq:0      4   1489    4       236           447   \n",
    922        "0.002712  kschedfreq:0      4   1489    5       236           447   \n",
    923        "0.410816  kschedfreq:1      2   1490    1      1024          1024   \n",
    924        "\n",
    925        "          tip_capacity  \n",
    926        "Time                    \n",
    927        "0.002708         357.6  \n",
    928        "0.002710         357.6  \n",
    929        "0.002711         357.6  \n",
    930        "0.002712         357.6  \n",
    931        "0.410816         819.2  "
    932       ]
    933      },
    934      "execution_count": 15,
    935      "metadata": {},
    936      "output_type": "execute_result"
    937     }
    938    ],
    939    "source": [
    940     "cap_df = trace.data_frame.trace_event('cpu_capacity')\n",
    941     "cap_df.head()"
    942    ]
    943   },
    944   {
    945    "cell_type": "markdown",
    946    "metadata": {
    947     "hidden": true
    948    },
    949    "source": [
    950     "#### Plot the signals of interest"
    951    ]
    952   },
    953   {
    954    "cell_type": "code",
    955    "execution_count": 20,
    956    "metadata": {
    957     "code_folding": [],
    958     "collapsed": false,
    959     "hidden": true
    960    },
    961    "outputs": [
    962     {
    963      "data": {
    964       "text/html": [
    965        "<table style=\"border-style: hidden;\">\n",
    966        "<tr>\n",
    967        "<td style=\"border-style: hidden;\"><div class=\"ilineplot\" id=\"fig_9f11ea1e66b64b52b8d9c9de9722d549\">\n",
    968        "            <script>\n",
    969        "            var ilp_req = require.config( {\n",
    970        "\n",
    971        "                paths: {\n",
    972        "                    \"dygraph-sync\": '/nbextensions/plotter_scripts/ILinePlot/synchronizer',\n",
    973        "                    \"dygraph\": '/nbextensions/plotter_scripts/ILinePlot/dygraph-combined',\n",
    974        "                    \"ILinePlot\": '/nbextensions/plotter_scripts/ILinePlot/ILinePlot',\n",
    975        "                    \"underscore\": '/nbextensions/plotter_scripts/ILinePlot/underscore-min',\n",
    976        "                },\n",
    977        "\n",
    978        "                shim: {\n",
    979        "                    \"dygraph-sync\": [\"dygraph\"],\n",
    980        "                    \"ILinePlot\": {\n",
    981        "\n",
    982        "                        \"deps\": [\"dygraph-sync\", \"dygraph\", \"underscore\"],\n",
    983        "                        \"exports\":  \"ILinePlot\"\n",
    984        "                    }\n",
    985        "                }\n",
    986        "            });\n",
    987        "                ilp_req([\"require\", \"ILinePlot\"], function() {\n",
    988        "                ILinePlot.generate('fig_9f11ea1e66b64b52b8d9c9de9722d549', '/nbextensions/');\n",
    989        "            });\n",
    990        "            </script>\n",
    991        "        </div></td>\n",
    992        "<td style=\"border-style: hidden;\"><div class=\"ilineplot\" id=\"fig_63446a0cdc7e4257b218739f97e04140\">\n",
    993        "            <script>\n",
    994        "            var ilp_req = require.config( {\n",
    995        "\n",
    996        "                paths: {\n",
    997        "                    \"dygraph-sync\": '/nbextensions/plotter_scripts/ILinePlot/synchronizer',\n",
    998        "                    \"dygraph\": '/nbextensions/plotter_scripts/ILinePlot/dygraph-combined',\n",
    999        "                    \"ILinePlot\": '/nbextensions/plotter_scripts/ILinePlot/ILinePlot',\n",
   1000        "                    \"underscore\": '/nbextensions/plotter_scripts/ILinePlot/underscore-min',\n",
   1001        "                },\n",
   1002        "\n",
   1003        "                shim: {\n",
   1004        "                    \"dygraph-sync\": [\"dygraph\"],\n",
   1005        "                    \"ILinePlot\": {\n",
   1006        "\n",
   1007        "                        \"deps\": [\"dygraph-sync\", \"dygraph\", \"underscore\"],\n",
   1008        "                        \"exports\":  \"ILinePlot\"\n",
   1009        "                    }\n",
   1010        "                }\n",
   1011        "            });\n",
   1012        "                ilp_req([\"require\", \"ILinePlot\"], function() {\n",
   1013        "                ILinePlot.generate('fig_63446a0cdc7e4257b218739f97e04140', '/nbextensions/');\n",
   1014        "            });\n",
   1015        "            </script>\n",
   1016        "        </div></td>\n",
   1017        "</tr>\n",
   1018        "<tr>\n",
   1019        "<td style=\"border-style: hidden;\"><div style=\"text-align:center\" id=\"fig_9f11ea1e66b64b52b8d9c9de9722d549_legend\"></div></td>\n",
   1020        "<td style=\"border-style: hidden;\"><div style=\"text-align:center\" id=\"fig_63446a0cdc7e4257b218739f97e04140_legend\"></div></td>\n",
   1021        "</tr>\n",
   1022        "</table>"
   1023       ],
   1024       "text/plain": [
   1025        "<IPython.core.display.HTML object>"
   1026       ]
   1027      },
   1028      "metadata": {},
   1029      "output_type": "display_data"
   1030     }
   1031    ],
   1032    "source": [
   1033     "# Signals can be easily plot using the ILinePlotter\n",
   1034     "trappy.ILinePlot(\n",
   1035     "    \n",
   1036     "    # FTrace object\n",
   1037     "    trace.ftrace,\n",
   1038     "    \n",
   1039     "    # Signals to be plotted\n",
   1040     "    signals=[\n",
   1041     "      'cpu_capacity:capacity',\n",
   1042     "      'sched_load_avg_task:util_avg'\n",
   1043     "    ],\n",
   1044     "    \n",
   1045     "    # Generate one plot for each value of the specified column\n",
   1046     "     pivot='cpu',\n",
   1047     "    \n",
   1048     "    # Generate only plots which satisfy these filters\n",
   1049     "    filters={\n",
   1050     "        'comm': ['task_ramp'],\n",
   1051     "        'cpu' : [2,5]\n",
   1052     "    },\n",
   1053     "    \n",
   1054     "    # Formatting style\n",
   1055     "    per_line=2,\n",
   1056     "    drawstyle='steps-post',\n",
   1057     "    marker = '+',\n",
   1058     "    \n",
   1059     "    sync_zoom=True,\n",
   1060     "    group=\"GroupTag\"\n",
   1061     "\n",
   1062     ").view()"
   1063    ]
   1064   },
   1065   {
   1066    "cell_type": "markdown",
   1067    "metadata": {
   1068     "hidden": true
   1069    },
   1070    "source": [
   1071     "### Use a set of standard plots"
   1072    ]
   1073   },
   1074   {
   1075    "cell_type": "markdown",
   1076    "metadata": {
   1077     "hidden": true
   1078    },
   1079    "source": [
   1080     "A graphical representation can always be on hand"
   1081    ]
   1082   },
   1083   {
   1084    "cell_type": "code",
   1085    "execution_count": 21,
   1086    "metadata": {
   1087     "collapsed": true
   1088    },
   1089    "outputs": [],
   1090    "source": [
   1091     "trace = Trace(platform, boost15_trace,\n",
   1092     "              [\"sched_switch\",\n",
   1093     "               \"sched_overutilized\",\n",
   1094     "               \"sched_load_avg_cpu\",\n",
   1095     "               \"sched_load_avg_task\",\n",
   1096     "               \"sched_boost_cpu\",\n",
   1097     "               \"sched_boost_task\",\n",
   1098     "               \"cpu_frequency\",\n",
   1099     "               \"cpu_capacity\",\n",
   1100     "              ],\n",
   1101     "              tasks=['task_ramp'],\n",
   1102     "              plots_prefix='boost15_'\n",
   1103     "             )"
   1104    ]
   1105   },
   1106   {
   1107    "cell_type": "markdown",
   1108    "metadata": {
   1109     "hidden": true
   1110    },
   1111    "source": [
   1112     "Usually a common set of plots can be generated which capture the most useful information realted to a workload we are analysing"
   1113    ]
   1114   },
   1115   {
   1116    "cell_type": "markdown",
   1117    "metadata": {
   1118     "hidden": true
   1119    },
   1120    "source": [
   1121     "#### Example of task realted signals"
   1122    ]
   1123   },
   1124   {
   1125    "cell_type": "code",
   1126    "execution_count": 130,
   1127    "metadata": {
   1128     "collapsed": false,
   1129     "hidden": true
   1130    },
   1131    "outputs": [
   1132     {
   1133      "data": {
   1134       "image/png": "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\nYTtLKEbyKp+gulVp3ovAXIrkqfyamMqH6Hyc4jbP35af4lpFZaI4ieK24XcCi2L1+1zLT/b9AsWt\nrj+vWDa7Yv1vUozWPVqx/JSK5TdRJMEHlPq/jOKhUETE2yOishb216V/F0TEn0p1sv9GkXS9SJEQ\nX1XRfrfS9pcCM4Efp5RurTzQlNLi0rEdWhr57bOU0oPAWcBdFLfJvhG4o7IJ3ZO/3pLBBFxKkfgt\nAPajeMhRpd5Ga5eV+jMPeJ7iDxlHpZTmVml7OkUcPEFR1/trinrS3vpW7vsPgM0pYmwm8Dt6Pq43\nA38ofY9XAf/WQ38kSQ0gimcqSJLUWCLiIYoHEP0mpWQ94XoUERcCT6eUvtrD8ocpaksvTyl9tMb7\n/iRwTErpH9bYWJLUtAbqJeGSJPUqpbTnQPdhA9ZrbWtKqdpDkfq3o4jtKV6RcxewO/B54NxabV+S\nlCcTVUmSGkxE7Aw8UGVRAsanlKo9GbeWqt0qXC+bULwu6A0UtaPTgfPW074lSQ3KW38lSZIkSQ3F\nhylJkiRJkhpKQ9/6GxEO90qSJElSE0spdXs2QkMnqgCNdGty+5w5tAwZQntHBy3jxtVse0DNtlkr\n7XPmADRcn2p5/mul8nu8d/Zs9pswAYBpZ53FtC98of/bbbDj1IZn2rRpTJs2baC7IfWL8avc9SeG\nK69Jui3r6GD+/PmwbFnntUqP26nStnxd0ts+etteeV1ovOtLaLw+NXKO0Jfr8b7Eb3t7Oy0tLfT0\nynJv/ZXqZO5TTw10F6R1Mnfu3IHugtRvxq9yZwwrZ7WIXxNVSZIkSVJDMVGV6mTqMccMdBekdTJ1\n6tSB7oLUb8avcmcMK2e1iF8TValOWidNGuguSOuktbV1oLsg9Zvxq9wZw8pZLeLXRFWqk7aZMwe6\nC9I6aWtrG+guSP1m/Cp3xrByVov4NVGVJEmSJDUUE1WpTrz1V7nztjPlzPhV7oxh5cxbfyVJkiRJ\nTcdEVaoTa1SVO+ujlDPjV7kzhpUza1QlSZIkSU3HRFWqE2tUlTvro5Qz41e5M4aVM2tUJUmSJElN\nx0RVqhNrVJU766OUM+NXuTOGlTNrVCVJkiRJTcdEVaoTa1SVO+ujlDPjV7kzhpUza1QlSZIkSU3H\nRFWqE2tUlTvro5Qz41e5M4aVM2tUJUmSJElNx0RVqhNrVJU766OUM+NXuTOGlTNrVCVJkiRJTcdE\nVaoTa1SVO+ujlDPjV7kzhpUza1QlSZIkSU3HRFWqE2tUlTvro5Qz41e5M4aVM2tUJUmSJElNx0RV\nqhNrVJU766OUM+NXuTOGlbNaxG+klNa9J3USEQ3cO6l3bUDrAPdBWhdtGMPKVxvGr/LWhjGsfLXR\n9/gNIKUU3eabqEqSJEmSBkJPiergAejL2mmgVLV9zhxahgyhvaODlnHjarY9oGbbrJX2OXMAGq5P\ntTz/tVL5Pf7ownlsO+INAGy/3Wsc9NaV/d9ugx2nJElqbJXXJN2WdXQwf/58WLaM/SZM6H07VdqW\nr0t620dv2yuvC413fQmN16dGzhFqdT3e3t5OS0sLRLccFbBGVaqpe+4dwW9+tzmX/nZzjvzwfQPd\nHWmdWB+lnBm/yp0xrJzVIn4bf0RVysjnPjaH/SZsyvMLBrHb2wa6N5IkSVKe1mpENSJ+HhHzI2J2\nxbwREXFTRMyJiBkRMaxi2akR8UhEPBQRB1fMf1NEzC4t+2FtDkVqLJts3DrQXZDWie/wU86MX+XO\nGFbOBuI9qhcCh3SZdwpwU0ppHHBzaZqIGA98ABhfWue8iM4bkP8T+EhKaXdg94jouk1JkiRJ0gZq\nrRLVlNLtwMIus48ALi59vhh4T+nzkcD0lNIrKaW5wKPA30fEDsDQlNI9pXa/qFhHahorX2kb6C5I\n68T6KOXM+FXujGHlrBbxW4uHKY1KKc0vfZ4PjCp9bgGermj3NDC6yvxnSvMlSZIkSartw5RSSiki\navo+malTpzJmzBgAhg0bxsSJEzvveS5n6utreubdd7PN5pszbp99arq91kmTBuR4+tS/9vbG6k8N\nz3+tpse1tBTTM2fyyOOPv+6R720zZ67+fmfOLNbv43SjnX+nN8zpskbpj9NOr810WaP0x2mn18v0\nzJnFdJfri/L105/uu4/FS5f2ej3ywvLljC1df3ddv9v1aw/767q9o0uvMmm065uZd98N0Nm/ge5P\nW1sbLzz1FEdPntzZv0Y7X+t6PT5r1iwWLVrE0qVLWbBgAT2JtJbvKY2IMcA1KaUJpemHgNaU0rOl\n23pvSSntGRGnAKSUvl1qdwPwdeDJUpu9SvOPBQ5KKX2iyr7S2vavnnyP6sDK4T2q986ezX4TJvD8\ngkGMb92W52fPX8PavWy3wY5TkiQ1Nt+juvYatU+NnCPU+j2qEUFKqdvLVAet09YLVwMnlj6fCPy2\nYv6UiNgkIt4A7A7ck1J6FlgSEX9ferjSCRXrSE3DGlXlrvxXUClHxq9yZwwrZ7WI37W69TcipgMH\nAdtExFPA14BvA1dExEeAucAxACmlByPiCuBBYBXwqYrh0U8BFwGbA9enlG5Y5yORJEmSJDWFtUpU\nU0rH9rDon3pofwZwRpX5fwZ6v+dAylzxHtX+3/orDbRyPYmUI+NXuTOGlbNaxG8tbv2VJEmSJKlm\nTFSlOrFGVbmzPko5M36VO2NYOatF/JqoSpIkSZIaiomqVCdFjaqUL+ujlDPjV7kzhpUza1QlSZIk\nSU3HRFWqE2tUlTvro5Qz41e5M4aVM2tUJUmSJElNx0RVqhNrVJU766OUM+NXuTOGlTNrVCVJkiRJ\nTcdEVaoTa1SVO+ujlDPjV7kzhpUza1QlSZIkSU3HRFWqE2tUlTvro5Qz41e5M4aVM2tUJUmSJElN\nx0RVqhNrVJU766OUM+NXuTOGlTNrVCVJkiRJTcdEVaoTa1SVO+ujlDPjV7kzhpUza1QlSZIkSU3H\nRFWqE2tUlTvro5Qz41e5M4aVM2tUJUmSJElNx0RVqhNrVJU766OUM+NXuTOGlTNrVCVJkiRJTcdE\nVaoTa1SVO+ujlDPjV7kzhpUza1QlSZIkSU3HRFWqE2tUlTvro5Qz41e5M4aVM2tUJUmSJElNx0RV\nqhNrVJU766OUM+NXuTOGlTNrVCVJkiRJTcdEVaoTa1SVO+ujlDPjV7kzhpUza1QlSZIkSU3HRFWq\nE2tUlTvro5Qz41e5M4aVM2tUJUmSJElNx0RVqhNrVJU766OUM+NXuTOGlTNrVCVJkiRJTcdEVaoT\na1SVO+ujlDPjV7kzhpUza1QlSZIkSU3HRFWqE2tUlTvro5Qz41e5M4aVM2tUJUmSJElNx0RVqhNr\nVJU766OUM+NXuTOGlTNrVCVJkiRJTcdEVaoTa1SVO+ujlDPjV7kzhpUza1QlSZIkSU3HRFWqE2tU\nlTvro5Qz41e5M4aVM2tUJUmSJElNx0RVqhNrVJU766OUM+NXuTOGlTNrVCVJkiRJTcdEVaoTa1SV\nO+ujlDPjV7kzhpUza1QlSZIkSU3HRFWqE2tUlTvro5Qz41e5M4aVM2tUJUmSJElNx0RVqhNrVJU7\n66OUM+NXuTOGlTNrVCVJkiRJTcdEVaoTa1SVO+ujlDPjV7kzhpUza1QlSZIkSU3HRFWqE2tUlTvr\no5Qz41e5M4aVM2tUJUmSJElNx0RVqhNrVJU766OUM+NXuTOGlTNrVCVJkiRJTcdEVaoTa1SVO+uj\nlDPjV7kzhpUza1QlSZIkSU3HRFWqE2tUlTvro5Qz41e5M4aVM2tUJUmSJElNp/ET1YjuP9OmVW87\nbVpd2w8991wYPZqWPfZoiP6sl+NttP404Plv2WMPGD0aRo9mv0MOgbPOAqrUqJ51Vme71/2U2lc9\n3gY6/7bf8Nq3NVh/bG/7tWnf1mD9sb3t17Z9Z43f2m6/h+uNoeee2+f2LXvswfY//3nV5uXrsb5e\nz3DWWZ3Xbi177LH6Oq5Bzn9nnxqkP+U+9Xg+GyQ+19S+berUNbZvGT26+NyDSCn1uHCgRURqpP61\nz5lDy5AhtHd00DJuXM22B9Rsm7XSPmcOQMP1qZbnv1Yqv8d7Z89mvwkTeH7BIHZ72wMsfmiv/m+3\nwY5TG562tjZvPVO2jF/lrj8xXHlN0m1ZRwfz58+HZcvYb8KE3rdTpW35uqS3ffS2vfK60HjXl9B4\nfWrkHKEv1+N9id/29nZaWlqICFJK3TLWmo2oRsSpEfFARMyOiEsjYtOIGBERN0XEnIiYERHDurR/\nJCIeioiDa9UPqVFYo6rceZGvnBm/yp0xrJw1TI1qRIwBPgb8XUppArARMAU4BbgppTQOuLk0TUSM\nBz4AjAcOAc6LiMa/DVmSJEmSVHe1Sg6XAK8AW0TEYGALoB04Ari41OZi4D2lz0cC01NKr6SU5gKP\nAvvXqC9SQ/A9qsqd7/BTzoxf5c4YVs4a5j2qKaUXgbOAv1EkqItSSjcBo1JK80vN5gOjSp9bgKcr\nNvE0MLoWfZEkSZIk5a1Wt/6OBU4CxlAkoUMi4oOVbUpPRertyUiN89QkqQasUVXurI9Szoxf5c4Y\nVs5qEb+D170bALwZmJlSWgAQEb8B3go8GxHbp5SejYgdgOdK7Z8BdqpYf8fSvG6mTp3KmDFjABg2\nbBgTJ07sPPDykPL6mp55991ss/nmjNtnn5pur3XSpAE5nj71r729sfpTw/Nfq+lxLS3F9MyZPPL4\n451Px1v5ShttMxeu/n5nzizW7+N0o51/p5122mmnnXY6g+mZM4vpLtcX5eunP913H4uXLu31euSF\n5csZW7r+7rp+t+vXHvbXdXtHl54Q22jXNzPvvhugs38D3Z+2tjZeeOopjp48ubN/jXa+1vV6fNas\nWSxatIilS5eyYMECelKT19NExL7AJcBbgJeBi4B7gF2ABSmlMyPiFGBYSumU0sOULqWoSx0N/B7Y\nreu7aHw9zcBp5Ed1N+K58vU0akZtbW2d/2ORcmP8Knf9iWFfT7P2GrVPjZwjrK/X09RkRDWldF9E\n/AL4E/Aa8BfgfGAocEVEfASYCxxTav9gRFwBPAisAj7VUBmpJEmSJGnA1OrWX1JK3wG+02X2i8A/\n9dD+DOCMWu1fajRFjer8NTWTGpajUcqZ8avcGcPKWS3id9C6d0OSJEmSpNoxUZXqxPeoKnflByBI\nOTJ+lTtjWDmrRfyaqEqSJEmSGoqJqlQnvkdVubM+SjkzfpU7Y1g5s0ZVkiRJktR0TFSlOrFGVbmz\nPko5M36VO2NYObNGVZIkSZLUdExUpTqxRlW5sz5KOTN+lTtjWDmzRlWSJEmS1HRMVKU6sUZVubM+\nSjkzfpU7Y1g5s0ZVkiRJktR0TFSlOrFGVbmzPko5M36VO2NYObNGVZIkSZLUdExUpTqxRlW5sz5K\nOTN+lTtjWDmzRlWSJEmS1HRMVKU6sUZVubM+SjkzfpU7Y1g5s0ZVkiRJktR0TFSlOrFGVbmzPko5\nM36VO2NYObNGVZIkSZLUdExUpTqxRlW5sz5KOTN+lTtjWDmzRlWSJEmS1HRMVKU6sUZVubM+Sjkz\nfpU7Y1g5s0ZVkiRJktR0TFSlOrFGVbmzPko5M36VO2NYObNGVZIkSZLUdExUpTqxRlW5sz5KOTN+\nlTtjWDmzRlWSJEmS1HRMVKU6sUZVubM+SjkzfpU7Y1g5s0ZVkiRJktR0TFSlOrFGVbmzPko5M36V\nO2NYObNGVZIkSZLUdExUpTqxRlW5sz5KOTN+lTtjWDmzRlWSJEmS1HRMVKU6sUZVubM+SjkzfpU7\nY1g5s0ZVkiRJktR0TFSlOrFGVbmzPko5M36VO2NYObNGVZIkSZLUdExUpTqxRlW5sz5KOTN+lTtj\nWDmzRlWSJEmS1HRMVKU6sUZVubM+SjkzfpU7Y1g5s0ZVkiRJktR0TFSlOrFGVbmzPko5M36VO2NY\nObNGVZIkSZLUdExUpTqxRlW5sz5KOTN+lTtjWDmzRlWSJEmS1HRMVKU6sUZVubM+SjkzfpU7Y1g5\ns0ZVkiRJktR0TFSlOrFGVbmzPko5M36VO2NYObNGVZIkSZLUdExUpTqxRlW5sz5KOTN+lTtjWDmz\n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\nUM455xyOOeYYRowYwfTp0znyyCNf12b77bdn0qRJ3HXXXXzgAx/onD9+/HjOPfdcpkyZQktLC0OH\nDmW77bZj0003rdHRS5JUe976K9VJUaO610B3Q+q3trY2/6LfR29605v461//2uPyn/3sZ/zsZz/r\nnP7617/e+XnMmDG8+uqra9zHpz71KT71qU/12ub3v/991fknnngiJ554IgAdHR2cdtppr6tbbUbG\nr3JnDCtntYhfR1QlSWpy11xzDcuWLeOll17i5JNPZp999mGXXXYZ6G5JktQjE1WpTqxRVe78S/76\nN2TIEIYOHdrt584771yn7V599dWMHj2a0aNH89hjj3HZZZfVqMeNy/hV7oxh5awW8eutv5IkNYiO\njo66bPeCCy7gggsuqMu2JUmqB0dUpTrxParKne/wU86MX+XOGFbOahG/JqqSJEmSpIbirb9SnSxZ\nOpn3fHg5gwbBQQes5LMffWmguyStFeujlDPjV7kzhpUz36MqNbj3Hfoy+45/hd/esNlAd0WSJEnK\nhomqVDdtvO+wl3nH368c6I5I/WJ9lHJm/Cp3xrByZo2qJEmSJKnpmKhKddM60B2Q1on1UX03ZswY\nbr755oHuRp8NGjSIxx9/vKbbvP3229lzzz07pwf6nBi/yp0xrJxZoypJUgOICCJivezroosu4u1v\nf/t62Vdvuia7b3/723nooYc6p9fnOZEkNR8TVakOhm75Gm/aZwabbZoGuitSv1kfpTVJqXF/xxm/\nyp0xrJxZoyo1qM02g+99dQmDfQGUtMG455572HvvvRkxYgQf/vCHWbFiBQAXXHABu+++OyNHjuTI\nI49k3rx5nevMnDmTt7zlLQwbNoz999+fu+66q3PZRRddxNixY9lqq63YddddufTSS3nooYf4xCc+\nwV133cXQoUMZMWIEACtWrODkk09ml112Yfvtt+eTn/wkL7/8cue2vvvd79LS0sKOO+7Iz3/+8z4d\nT2trKz/72c9e15/ySO473vEOAPbdd1+GDh3Kr3/9a9ra2thpp536efYkSXo9L6OlOmmdNGmguyCt\nkxzro9ra1v1W09bWtR8lTClx6aWXMmPGDLbYYgve/e53841vfIN/+Id/4Mtf/jI33XQT48eP5+ST\nT2bKlCnceuutvPjii7zrXe/iRz/6EcceeyxXXHEF73rXu3jsscfYZJNN+OxnP8uf/vQndt99d+bP\nn8+CBQvYc889+a//+i9++tOfcvvtt3fu/5RTTuGJJ57gvvvuY/DgwRx33HGcfvrpnHHGGdxwww2c\nddZZ/O///i9jxozhox/9aJ+Oqbdbd2+77TYGDRrE/fffz6677go03uhPjvErVTKGlbNaxK+JqiSp\nafQnyayFiODTn/40o0ePBuArX/kKn/nMZ5g3bx4f+chHmDhxIgDf+ta3GD58OE8++SS33XYbe+yx\nB8cffzwAU6ZM4ZxzzuHqq6/m/e9/P4MGDWL27NnsuOOOjBo1ilGjRgHdb7dNKXHBBRdw//33M2zY\nMABOPfVUjj/+eM444wyuuOIKPvzhDzN+/HgATjvtNC677LL1cl4kSeovb/2V6qRt5syB7oK0Thpt\nhKzRVd72uvPOO9Pe3k57ezs777xz5/wtt9ySkSNH8swzzzBv3rzXLQPYZZddaG9vZ4sttuDyyy/n\nJz/5CS0tLRx++OE8/PDDVff7/PPPs2zZMt70pjcxfPhwhg8fzqGHHsoLL7wAwLx587r1bUNg/Cp3\nxrByZo2qJEkN4m9/+9vrPre0tNDS0sKTTz7ZOf+ll15iwYIF7Ljjjt2WATz55JOdo7IHH3wwM2bM\n4Nlnn2XPPffkYx/7GEC323G32WYbNt98cx588EEWLlzIwoULWbRoEUuWLAFghx126Na3vthyyy15\n6aWXOqefffbZPq0nSVItmKhKdWKNqnJnfVTfpZT48Y9/zDPPPMOLL77IN7/5TaZMmcKxxx7LhRde\nyH333ceKFSv48pe/zAEHHMDOO+/MoYceypw5c5g+fTqrVq3i8ssv56GHHuLwww/nueee46qrruKl\nl15i4403Zsstt2SjjTYCYNSoUTz99NO88sorQPGamI997GOcdNJJPP/88wA888wzzJgxA4BjjjmG\niy66iP/7v/9j2bJlnHbaaX06pokTJ/Kb3/yG5cuX8+ijj77uwUrlfjz22GO1OoU1Z/wqd8awcuZ7\nVCVJagARwfHHH8/BBx/M2LFj2X333fn3f/93Jk+ezH/8x39w1FFH0dLSwhNPPNFZHzpy5EiuvfZa\nzjrrLLbZZhu+973vce211zJixAhee+01zj77bEaPHs3IkSO5/fbb+c///E8AJk+ezN57783222/P\ndtttB8CZZ57JbrvtxgEHHMDWW2/NO9/5TubMmQPAIYccwkknncQ//uM/Mm7cOCZPntyn95t+7nOf\nY5NNNmHUqFF86EMf4oMf/ODr1ps2bRonnngiw4cP58orr/S9qZKkmopGfgdaRKRG6l/7nDm0DBlC\ne0cHLePG1Wx7QM22WSvtpQucRutTLc9/rVR+j/fOns1+EyYARY1q66RJ3HLnJpx+9lBuuXLB2m23\nwY5TG562traG+ot+RDT0ezvVN+vre2y0+JXWVn9iuPKapNuyjg7mz58Py5Z1Xqv0uJ0qbcvXJb3t\no7ftldeFxru+hMbrUyPnCH25Hu9L/La3t9PS0lL+/0K3v3Q6oipJkiRJaigmqlKdWKOq3Dka1fz2\n3ntvhg4d2u1n+vTpA921dWb8KnfGsHLme1QlSVK/PfDAAwPdBUmSqnJEVaoT36Oq3PkOP+XM+FXu\njGHlzPeoSpIkSZKajrf+SnVijapy14j1Ub7+RH3ViPErrQ1jWDmzRlWStMHw1TSSJG04vPVXqhNr\nVJU766OUM+NXuTOGlTNrVCVJkiRJTcdEVaoTa1SVO+ujlDPjV7kzhpWzWsSviaokSZIkqaGYqEp1\nYo2qcmd9lHJm/Cp3xrByZo2qJEmSJKnpmKhKdWKNqnJnfZRyZvwqd8awcmaNqiRJkiSp6ZioSnVi\njapyZ32Ucmb8KnfGsHJmjaokSZIkqemYqEp1Yo2qcmd9lHJm/Cp3xrByZo2qJEmSJKnpmKhKdWKN\nqnJnfZRyZvwqd8awcmaNqiRJkiSp6URKaaD70KOISEwb6F5IkiRJkupiGqSUoutsR1QlSZIkSQ2l\n4UdUG6l/7XPm0DJkCO0dHbSMG1ez7QE122attM+ZA9Bwfarl+a+Vyu/x3tmz2W/CBKCoUW2dNIlb\n7tyE088eyi1XLli77TbYcWrD09bW5lMnla3K+L3jjhGsWrUQgMGDh3PggS8OYM+kvunP7+DKa5Ju\nyzo6mD9/Pixb1nmt0uN2qrQtX5f0to/etldeFxrv+hIar0+NnCP05Xq8L/Hb3t5OS0sLEVF1RHXw\nOvdWkiSpga1atZDW1uIP321t3a6FJEkNyFt/pTrxParKnaOpypnxq9wZw8qZ71GVJEmSJDUdE1Wp\nTnyPqnLnO/yUM+NXuTOGlTPfoypJkiRJajo+TEmqE2tUlTvro5SznuJ38ODhnQ9U8gnAamT+DlbO\nahG/JqqSJGmDUZmY+gRgSWpc3vor1Yk1qsqd9VHKmfGr3BnDypk1qpIkSZKkpmOiKtWJNarKnfVR\n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\n/vea4ykC/O53Wv8rrgBGj9Zjv/pVF+i9954L4O67T4P0fv1c/QcOBO6+Wz+/4QY3tPbRR12Q9vDD\nbqjuqFF63v77a/379wfOOcfVc/ZslyM8b54LVB94QIf4lpZqnW2O6u9+p8O1jz3WrX36xz8CDQ26\nPXeurh9r63/CCXrv9ttPf4dJk9x6rN/7nhte/NhjLqh96CF3b+6+W+vRtaveg759dd3cSZP081//\n2uUof/3reh2//r7q6mr+RZ+CxfZLoWMbppBlo/2KiZ8esoCIiCmk+kXq6lBeVoZIYyPK/dli2lge\ngKyVmS2R6HSmhVanbN7/bPF/x0VLlmB8NGJoa6BaaN+T9j58SKKQsf1S6FrThv1nkoTPGhtRX18P\nbNnS9KySspwkx9rnknTXSFeePRcovOdLoPDqVMgxQibP45m030gkgvLycogIjDEJY8o4mRJRjrRn\nbypRLvAhn0LG9kuhYxumkHEdVSIiIiIiIupwGKgS5Uhr11ElKhRcw49CxvZLoWMbppBxHVUiIiIi\nIiLqcBioEuUIc1QpdMyPopCx/VLo2IYpZMxRJSIiIiIiog4nr4GqiJwsIu+IyLsicm0+60KUbcxR\npdAxP4pCxvZLoWMbppAFnaMqIp0A3A7gZACHALhQRA7OV32Isq32zTfzXQWiNqmtrc13FYhaje2X\nQsc2TCHLRvvNZ4/qkQCWGmOWG2N2AvgrgDPzWB+irNqwaVO+q0DUJhs2bMh3FYhaje2XQsc2TCHL\nRvvNZ6C6L4CV3v6q6HtERERERES0F8tnoGryeG2inFu+cmXzBxEVsOXLl+e7CkStxvZLoWMbppBl\no/2KMfmJF0VkIoBZxpiTo/vXA9hjjPmpdwyDWSIiIiIiog7MGCPx7+UzUC0G8F8AUwFEALwM4EJj\nzNt5qRAREREREREVhOJ8XdgYs0tErgbwOIBOAO5ikEpERERERER561ElIiIiIiIiSiafkykRERER\nERERJWCgSkRERERERAWFgSoREREREREVFAaqREREREREVFAYqBIREREREVFBYaBKREREREREBYWB\nKhERERERERUUBqpERERERERUUBioEhERERERUUFhoEpEREREREQFhYEqERERERERFRQGqkRERERE\nRFRQGKgSERERERFRQWGgSkRERERERAWFgSoREREREREVFAaqREREREREVFAYqBIREREREVFBYaBK\n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\nERk9qkAZPfpo9rh3b2v58cdb69tvsjTbcvvrAQAAgLMMhSpQkMHe3tQhAAtCfxQiI38RHTmMyPLI\n32ULD6NYt99+u/r6+iRJPT09GhgYmHrjzVPKizUe2rVLFy5frv61a3PdX/OmO4v9fuYVX71ernhy\n/PzzGvdXKtK2bap+7Ws6fuSIdPCgtHq1qj//efb63l7prbdUXbUqG0vSqlXKtpYGG89XG88PNp5/\nYf16jSxbpsFNm6StW0vzfhkzZsyYMWPGJR4PDWXj5vyyMW7On3Y/84zemJg4ZX37+NCxY7q0Mf+e\nvv0p89dZjjd9f5v6+1vbl2x+KWkqvtTxVKtVHRod1aYNG6biK9vntdD5eK1W0/j4uCYmJnT48GHN\nxtx91pWLwcz6JH3L3dfMsM5Tx9euPjKiyooVqk9OqtJI5jz2Jym3fealPjIiSaWLKc/PPy/tv8c9\nw8Na99nPSg89pOrmzRocHZUeeki66irp6aezDS67THrxxbmXr7pK9SeeKNX7xNmnWq1O/Y8FiIb8\nRXRnksPtc5JT1k1OamxsTDp6VOvWnDLtPu1rm/OvuY4x1/6a20rlm19K5YupzDXCfObj88nfer2u\nSqUiM5O72/T1SxYc7QKY2VckDUnqN7NRM/t4yngAAAAAAOklvfTX3W9OeXygEBuzb1wa/OhHsxsq\nSdJ117XWt3+/6mzL7a8HEuFsFCIjfxEdOYzI8sjf0veoAuHccUf2uH59q/i8777W+gceOP3yffdJ\nk5PFxQgAAACUWNJLf4Fu1ryZABBV8wYIQETkL6IjhxFZHvlLoQoAAAAAKBUKVaAgg+09p0BA9Ech\nMvIX0ZHDiCyP/KVQBQAAAACUCoUqUBB6VBEd/VGIjPxFdOQwIqNHFQAAAADQdShUgYLQo4ro6I9C\nZOQvoiOHERk9qgAAAACArkOhChSEHlVER38UIiN/ER05jMjoUQUAAAAAdB0KVaAg9KgiOvqjEBn5\ni+jIYURGjyoAAAAAoOtQqAIFoUcV0dEfhcjIX0RHDiMyelQBAAAAAF2HQhUoCD2qiI7+KERG/iI6\nchiRhe9RNbONZvaimb1kZp9OGQsAAAAAoBySFapmtlTSVkkbJV0u6WYze0+qeIC80aOK6OiPQmTk\nL6IjhxFZ9B7VqyS97O773P2EpK9K+nDCeAAAAAAAJZCyUF0labRtvL/xHNAV6FFFdPRHITLyF9GR\nw4gseo+qJzw2AAAAAKCkliU89gFJvW3jXmVnVU9y++23q6+vT5LU09OjgYGBqQq9ee3zYo2Hdu3S\nhcuXq3/t2lz31zzzttjvZ17x1evliifHzz+vcX+lko2HhvTSK69o3Zo1kqQt27Zp4IorWr/fRs/q\nfMdl+/wZn33jWq2mzZs3lyYexozJX8Zn07j5XMfbDw1l42nzi+b8afczz+iNiYk55yOHjh3TpY35\n9/TtT5m/znK86fvb1N/f2r5E85uhXbskaSq+1PFUq1UdGh3Vpg0bpuIr2+c1n/l487mZ1tdqNY2P\nj2tiYkKHDx/WbMw9zYlNM1sm6ceSNkiqS3pa0s3u/kLbazxVfDOpj4yosmKF6pOTqjSSOY/9Scpt\nn3mpj4xIUuliyvPzz0v773HP8PBUoVodGlrQ5b9le584+1Sr1an/sQDRkL+I7kxyuH1Ocsq6yUmN\njY1JR49OzVVm3c8Mr23OS+Y6xlz7a24rlW9+KZUvpjLXCPOZj88nf+v1uiqVisxM7m7T1yc7o+ru\nb5rZnZK+LWmppPvbi1QgOnpUER2TfERG/iI6chiR5ZG/KS/9lbvvlLQzZQwAAAAAgHJZkjoAoFvx\nPaqIrr3PBIiG/EV05DAiyyN/KVQBAAAAAKVCoQoUhB5VREd/FCIjfxEdOYzI8shfClUAAAAAQKlQ\nqAIFoUcV0dEfhcjIX0RHDiMyelQBAAAAAF2HQhUoCD2qiI7+KERG/iI6chiR0aMKAAAAAOg6FKpA\nQehRRXT0RyEy8hfRkcOIjB5VAAAAAEDXoVAFCkKPKqKjPwqRkb+IjhxGZPSoAgAAAAC6DoUqUBB6\nVBEd/VGIjPxFdOQwIqNHFQAAAADQdShUgYLQo4ro6I9CZOQvoiOHERk9qgAAAACArpOkUDWz3zGz\nvWb2CzO7MkUMQNHoUUV09EchMvIX0ZHDiCxyj+qwpJskfS/R8YHC1fbuTR0CsCC1Wi11CMAZI38R\nHTmMyPLI32U5xNExd39RkswsxeGBRTH+s5+lDgFYkPHx8dQhAGeM/EV05DAiyyN/6VEFAAAAAJRK\nYWdUzewxSStnWHWvu3+rqOMCZbFvdDR1CMCC7Nu3L3UIwBkjfxEdOYzI8shfc/eFR3KmBzd7UtKf\nuvuPZlmfLjgAAAAAQOHc/ZSe0CQ9qtPM2qg6U8AAAAAAgO6W6utpbjKzUUlXS3rEzHamiAMAAAAA\nUD5JL/0FAAAAAGC6Ut7118w2mtmLZvaSmX06dTxAJ8ys18yeNLO9ZvacmX0qddw0/oIAAASmSURB\nVExAp8xsqZntMTNufodwzKzHzHaY2Qtm9ryZXZ06JmC+zOwzjTnEsJn9q5m9LXVMwFzM7AEzGzOz\n4bbnfsnMHjOzETP7TzPr6XS/pStUzWyppK2SNkq6XNLNZvaetFEBHTkh6W53v0LZ5e1/TA4joLsk\nPS+Jy24Q0d9L+g93f4+ktZJeSBwPMC9m1ifpDklXuvsaSUsl/V7KmIB5eFBZ7dbuHkmPuXu/pO80\nxh0pXaEq6SpJL7v7Pnc/Iemrkj6cOCZg3tz9oLvXGsuTyiZIlbRRAfNnZr8q6Tcl/ZPmuOEdUEZm\n9nZJv+7uD0iSu7/p7m8kDguYr58p+4P3+Wa2TNL5kg6kDQmYm7t/X9KRaU/fIGl7Y3m7pBs73W8Z\nC9VVktq/gHJ/4zkgnMZfRtdJ2pU2EqAjn5f0Z5LeSh0IcAZWS3rdzB40sx+Z2TYzOz91UMB8uPv/\nSvpbSa9Kqksad/fH00YFnJGL3X2ssTwm6eJOd1DGQpXLzNAVzGyFpB2S7mqcWQVKz8yul/RTd98j\nzqYipmWSrpT0j+5+paT/0xlccgakYGaXStosqU/Z1VgrzOxjSYMCFsizu/d2XOOVsVA9IKm3bdyr\n7KwqEIaZnSPpIUlfdvdvpI4H6MB6STeY2f9I+oqk3zCzf04cE9CJ/ZL2u/t/NcY7lBWuQATvlzTk\n7ofd/U1J/67s32UgmjEzWylJZvYrkn7a6Q7KWKjulvRuM+szs3Ml/a6kbyaOCZg3MzNJ90t63t23\npI4H6IS73+vuve6+WtkNPJ5w999PHRcwX+5+UNKomfU3nrpO0t6EIQGdeFHS1Wa2vDGfuE7Zje2A\naL4p6bbG8m2SOj5xsyzXcHLg7m+a2Z2Svq3sTmf3uzt360MkH5R0i6RnzWxP47nPuPujCWMCzhTt\nGIjoTyT9S+MP3v8t6eOJ4wHmxd2faVzFslvZfQJ+JOkLaaMC5mZmX5F0jaQLzWxU0p9L+itJ/2Zm\nn5S0T9JHO95vdskwAAAAAADlUMZLfwEAAAAAZzEKVQAAAABAqVCoAgAAAABKhUIVAAAAAFAqFKoA\nAAAAgFKhUAUAAAAAlAqFKgAABTGzXzazPY2f18xsf2N5wsy2po4PAICy4ntUAQBYBGb2F5Im3P3v\nUscCAEDZcUYVAIDFY5JkZoNm9q3G8mfNbLuZfc/M9pnZR8zsb8zsWTPbaWbLGq97n5lVzWy3mT1q\nZitTvhEAAIpEoQoAQHqrJV0r6QZJX5b0mLuvlXRM0ofM7BxJ/yDpt939/ZIelPSXqYIFAKBoy1IH\nAADAWc4l7XT3X5jZc5KWuPu3G+uGJfVJ6pd0haTHzUySlkqqJ4gVAIBFQaEKAEB6P5ckd3/LzE60\nPf+Wsv9Xm6S97r4+RXAAACw2Lv0FACAtm8drfizpIjO7WpLM7Bwzu7zYsAAASIdCFQCAxeNtjzMt\na9qyJLm7n5C0SdJfm1lN0h5JHygyUAAAUuLraQAAAAAApcIZVQAAAABAqVCoAgAAAABKhUIVAAAA\nAFAqFKoAAAAAgFKhUAUAAAAAlAqFKgAAAACgVChUAQAAAAClQqEKAAAAACiV/wcXDmKaSm4IaQAA\nAABJRU5ErkJggg==\n",
   1135       "text/plain": [
   1136        "<matplotlib.figure.Figure at 0x7fa97c9ea590>"
   1137       ]
   1138      },
   1139      "metadata": {},
   1140      "output_type": "display_data"
   1141     }
   1142    ],
   1143    "source": [
   1144     "trace.analysis.tasks.plotTasks(\n",
   1145     "    signals=['util_avg', 'boosted_util', 'sched_overutilized', 'residencies'],\n",
   1146     ")"
   1147    ]
   1148   },
   1149   {
   1150    "cell_type": "markdown",
   1151    "metadata": {},
   1152    "source": [
   1153     "#### Example of Clusters related singals"
   1154    ]
   1155   },
   1156   {
   1157    "cell_type": "code",
   1158    "execution_count": 131,
   1159    "metadata": {
   1160     "collapsed": false
   1161    },
   1162    "outputs": [
   1163     {
   1164      "data": {
   1165       "image/png": "iVBORw0KGgoAAAANSUhEUgAAA7UAAAISCAYAAAATN+jXAAAABHNCSVQICAgIfAhkiAAAAAlwSFlz\nAAALEgAACxIB0t1+/AAAIABJREFUeJzs3X+cXXdd4P/XuzSNqQMdoEvbSSnRwFQLKSnyS/aLZvlR\nq/Ijrl0iX6NE0Xa3uqDCaipb6RKtLSuyuG5dAgVaSqv1R7NSBNqyjMKOpCs2GCjNtEkDSS5NSWBo\nhqQ/gPf+cc6d3NzcyY+ZO3PvJ/N6Ph7zmPs553POfd8zn0w+7znnfU5kJpIkSZIkleikXgcgSZIk\nSdJ0mdRKkiRJkoplUitJkiRJKpZJrSRJkiSpWCa1kiRJkqRimdRKkiRJkoplUitJmpGI+NGIuCUi\ndkXEoxGxJyJuj4hfiIiT6j5rIuJ7EXHOLLz/ioh4e0REt/c9XfVn7fR1Q69j6xezOSYkSfPLyb0O\nQJJUroj4DeBdwKeA3wa+AjwZ+AngfwLjwEdnOYwVwO8B64B+evj6B4H3ti37ei8C6VO3AS8GHux1\nIJKkspnUSpKmJSJ+DPhj4E8y8zfaVn80Iv4IeOJchtS1HUUszMxHZ7ibXZl51zG+3xMAMvO7M3zP\nYmTmHmBPr+OQJJXPy48lSdP1O1RJyW93WpmZ2zNz81Qb15eevr1t2ZJ6+Rtalr0gIu6oL2veHxFb\nI+J/1OuupDpLC/B48zLflm1PjYhrIuKB+tLobRHxu62XKteXL38vIn4mIt4XEV+nPnsYEcMRcWtE\n7I6IAxHxlfpS6ycc78Hq8Nl/PyLWRsQDwKPAc+p1Px4Rn4qIhyNiIiI+ERHPbtv+CfX2X4uIb0fE\npyPi2e3HNCI+VO+//f1HIuLTbcv+VUT8z4jYGRGPRMSXI+JX2/o0Lxl+UUR8JCK+VV92/p6IWNjW\n9/sj4ur65/VIHetfRcTT2vZ1Ttt2l0TEF+rj/fWIeH9EPLmtz5vr+PZHxDci4v9GxMrj+RlIkk4c\nnqmVJB23Oqn7N8DfZOZjM9jVVJcLZ/0+A8Angc8BbwD2AT8A/Gjd733AYuCNwL8GJs90RsTJ9bY/\nDLwD2FxvdwXwFOCtbe/534G/A34e+L562ceAvcC/p0rgzwZ+kuqPwkc7q3pSHcPBD5X5nZbmGmAr\n8FvAt4GvRcRPA/+L6pLtn6c6+/w7wGci4vzM3FlveyVwOdWl37cDLwD+tvk2bXF0OsbZujwingR8\nFlgIvB14ALgI+LP6rPWftm3/YeAm4GeAl9TxfLP+TkScAtwBnA/8IdXPbxC4sP7+UIeYiIir6+Px\nHuAtVMf794HnRMRLMvN7EfHzwB8B/wX4DLAIeC7VZe+SpHnIpFaSNB2nUyV+X5nl9/khqiTotzPz\ni/WyfwCuB8jMXRGxq16+MTO/17Lt66kS3R/LzM/Wyz5dn6R9e0RcXV8CS8v2lzQbEXE6sBT4zcy8\nraXfzccY++/WX5Mi4pmZua1l0YWtlzlHxHuAT2fmz7Qs+zSwjSrJ+836rOVvAu/NzOZZ8jsj4rvA\n1R3i6HRZdnBosvtm4BzgOZm5tV72vyNikOpYXdt2bD+Smf+lpd+LqI73lfWy1VT1sq9pO3Z/3SGW\n5udcQvWHhisz8/dblo9RJdyvpkr4fxT4l9Y+wCem2q8k6cTn5ceSpH52H9XNptZHxM9HxNOPY9uL\nqJLuf4yIk5tfVGcQF1AlXa1ubW3UCe824JqI+JWIeNZxxn4d8Py2r50t6z/RltA+C/hB4Ka2eA9Q\nnen8sbrrMuBU4Ja29/vz44yv1UX1e2xve+/bgacC57X1/1hb+4tUSXHThcDX2hLao3kl1byk/fPf\nBUwAL6373QUsj4g/iYhXRMSpx/EekqQTkEmtJGk69lIlW8+YzTfJzG9RXebcAK4FvhIRmyPi3x7D\n5k+r43sceKzlayPVWcqntvX/Wod9vBL4J6pLaLfU9aH//hjD/1pm/nPbV+ul2u3v97T6+3Vt8T4G\n/DTVJdMAZ9Xfd7dt3/GS3mP0NODHOfxY3ULnY/WNtvajVJcuNz0V2MXxaX7++zn8839/M4bMvAH4\nD8CLqM7Q7o2Iv46IWR2LkqT+5eXHkqTjlpnfiYgR4MKIOGWadbWPAqe0LWtPnsjMLwAXR/XM2xdQ\n1ZLeEhHPzcwvHWH/e6hqQ//dFOvbL50+rPY0Mx+gquUlIp4L/DpwbURsz8yZXvLa/n576+9rgTs7\n9G8e42YyfAbw5Zb1Z3TY5hEOP8ZQHefWxwvtobo51puniHVsiuVT2QM8+6i9DtX8/K+kqs+daj2Z\nuZ7q7P1pVI+PehfwFxx+9l2SNA+Y1EqSputqYAR4J9D+SB8i4geAgSPcAfkrVJfStvrpqd6srunc\nGBG/B7yGqt72S1TJMVSX5E60bPIJ4GeBb2fmlqN9mKPJzC9ExFuobkr1bLpcx5mZ90bEdqq61nce\noeu/UN1YahXV8W/6uQ59vwKcERGnN+uHI2IpcC6HJrWfAP4jsCMzu/Es3U8CqyLiVcdxCfLtwPeA\nZ2Tmp45lg/pM/i0R8WLgkqP1lySdmExqJUnTkpmfiYjfAv44Is4DPgTsoLoL7cupkr/XU911uJM/\nB/5zRPwu1SXBL6UtMYuIV1ElK7cC26kuQ30T8DDwj3W35tnat0TEJ4DvZuY/AR8Bfgn4VES8iyoZ\nPIXq5k+vBlZm5oGpPl9EnE91F94/p7pL8ROo7lj8OPC/j3hwpu/XgP9V3z34L6nOeJ5BdYfhr2Tm\nuzNzPCLeDbwtIvZR1Qi/APjlDvu7herOzzfW25xOdSb46xx6A6l3UyXJn6n7jVEd6x8C/r/MPN7H\n5dwI/Cpwc0T8IVUd7BOpam3/W6c/MmTmtoi4BvjTiDiX6oZgjwBPB14BvD8zRyJiPdXP/3NUl1wP\nU92Y6pPHGaMk6QRhUitJmrbMfE9E3EV1N94/okqa9gH/lyoZbT1L13657R9S3dn416kSrY8Bv0CV\n4DaNAfupHsNzVr3vu4BXZmaj7nMbVb3tZRx8Zu0T6kukf6Le9yVUjwL6NlXN5sc4eDlvp9igusz3\nK1SPmDmbKsH6F+BVmXn3kY7LdGXmxyPix4C3UT2uaBHVZcH/yKF3Xb6SKin9Farj9zmqRP1Lbfvb\nGhEXUz0W51ZgC9XP6m20fObMfDgiXkJ1/H6H6jFJ48C9HH7H4qM+Iqg+9hdSPR7okvr7Xqq7GO9t\n26413rdFxJepkvtfq9fvoLocu3kJ9Gep/ljxC8BpVPXWH67fQ5I0D0XmVI8IlCRJJYmI71E9Eucd\nvY5FkqS54t2PJUmSJEnFMqmVJEmSJBXLy48lSZIkScXyTK0kSZIkqVgmtZIkSZKkYpnUSpIkSZKK\nZVIrSZIkSSqWSa0kSZIkqVgmtZIkSZKkYpnUSpIkSZKKZVIrSZIkSSqWSa0kSZIkqVgmtZIkSZKk\nYpnUSpI0TRGxPSJePsW6l0bEvbP43t+LiB+crf1LklQKk1pJkqYv66/DV2R+JjN/aLo7joizIuK6\niGhExMMR8eWIuDIiTp12tIe/x4ciYl239idJUi+Y1EqS1Gci4inAPwILgRdn5pOAVwKnAX1zdjYi\nntDrGCRJMqmVJGlmXhgRX4qIb0TEByJiIUBErIiIHc1OEfG8iLi7Put6S0T8xRHOkv4W8K3MXJ2Z\nXwXIzJ2Z+ZuZ+cX2zhExEhFvbGmviYjP1K8jIt4dEbsj4lsR8S8R8eyIuAT4/4Hfjoh9EfG/6v5D\nEfHXEfFQRGyLiP/Yst8rI+KvIuLDEfEt4A0zPnqSJM2QSa0kSdMXVInhhcBSYBj4z4d1ijgFuBX4\nAPBk4GZgJVNcugy8Avib44hjysug69heCjwrM08D/h2wNzPXAx8BrsnMJ2bmayPiJOCjwN3AEPBy\n4Dci4sKW/b0G+Mt6XzcdR4ySJM0Kk1pJkqYvgT/NzF2Z+U3gD4DXd+j3YuAJmfnfM/O7mXkrcNcR\n9vsU4GtdivFx4InAD0fESZm5JTMfbFkfLa9fAJyemb+fmd/JzAeA9wM/19JnNDP/FiAzH+lSjJIk\nTdvJvQ5AkqTC7Wh5/VWqM5zthoBdHbaLDn0B9k6xn+OWmf87Iv4U+B/AMyLib4C3Zua+Dt2fAQxF\nxDdblj0B+IeW9s5uxCVJUrd4plaSpJk5p+11o0OfrwGLO2w31SXDdwI/ExFTJb3tvg18f0v7zNaV\n9Rni5wPnUV0i/Z+aq9r281Xggcx8csvXkzLzVS39p4pZkqSeMKmVJGn6Avi1iFhc37H4bcCfd+j3\nj8B3I+LXI+LkiHgt1aW+U/lj4EnA9RFxDkD9Hu+KiOd06L8J+LcRsSgingm8kTr5jIjnR8SLImIB\nsB94BPhuvd1uDr2b8l3Avoj47XpfT4iI50TE81s+ryRJfcWkVpKk6Uuqmy3dDmwF7gN+v209mfkY\n8G+pks1vAj8P3AY81nGnVX3uS6jqYTdGxMNUZ2/Hgftb9117d72v3cAHgRtb1j0JWA98A9gO7AH+\na73uOuC8iPhmRPxNZn4PeBWwHNgGfL3e9kkt7+mZWklSX4nM2fm/KSI+APw08FBmLquX/Veq/ywf\no/rP/5cy81v1usuBX6b66/GbMvP2evmPAB8Cvg/4u8x886wELEnSHIqIjcC1mXl9r2ORJKlks3mm\n9oPARW3LbgeenZnPBcaAywEi4jxgFVWtz0XAtS11RH8GvDEznwU8KyLa9ylJUt+LiB+LiDPry4/f\nADwH+ESv45IkqXSzltRm5meoLrFqXXZHfWkTwEbg7Pr1a4GbM/PxzNxOdWnViyLiLOCJmdl87MEN\nVM/1kySpNOdS1b5+E/hN4OLM3N3bkCRJKl8vH+nzy1QPn4fqsQWfa1m3k+oukY9z6KMDdnH43SMl\nSep7mfk+4H29jkOSpBNNT5LaiHgb8Fhm3tTFfXrjCkmSJEk6gWXmYXfin/OkNiLWAD8FvLxl8S7g\n6S3ts6nO0O7i4CXKzeXtD6+fNFs3vZqOxtgYQwMDNCYmGBoe7tr+gK7ts1saY2MAfRdTN49/t7T+\nHO/evJkLli0D4Mp3vYsr3/KW6e2zzz6j5qcrr7ySK6+8stdhSNPi+FXppjOGW+ckh62bmODBiQnO\nHBiYsk9r3927d8P+/ZPzmsbEBMBRt51qf0PDw307v4T+i6mfc4RjmY8fy/htNBoMDQ0x1ePb5/SR\nPvVNnv4T8NrMfKRl1d8CPxcRp0TEDwDPAu7KzAeBh+vn6wXwC8CGuYxZmgvbd+zodQjSjGzfvr3X\nIUjT5vhV6RzDKlk3xu+snamNiJuBHwdOj4gdwNup7nZ8CnBHnWX/Y2Zelpn3RMQtwD3Ad4DL8uBp\n18uoHumziOqRPt4pUpIkSZIEzGJSm5mv77D4A0fofxVwVYflnweWdTE0qe+sed3reh2CNCNr1qzp\ndQjStDl+VTrHsErWjfE7p5cfS+psxUte0usQpBlZsWJFr0OQps3xq9I5hlWyboxfk1qpD4yMjvY6\nBGlGRkZGeh2CNG2OX5XOMaySdWP8mtRKkiRJkoplUiv1AS8/Vum89E0lc/yqdI5hlczLjyVJkiRJ\n85pJrdQHrKlV6aznUskcvyqdY1gls6ZWkiRJkjSvmdRKfcCaWpXOei6VzPGr0jmGVTJraiVJkiRJ\n85pJrdQHrKlV6aznUskcvyqdY1gls6ZWkiRJkjSvmdRKfcCaWpXOei6VzPGr0jmGVTJraiVJkiRJ\n85pJrdQHrKlV6aznUskcvyqdY1gl6+ua2oj4QETsjojNLcv+XUR8KSK+GxHPa+t/eUTcFxH3RsSF\nLct/JCI21+veM1vxSpIkSZLKM5tnaj8IXNS2bDPwM8A/tC6MiPOAVcB59TbXRkTUq/8MeGNmPgt4\nVkS071MqnjW1Kp31XCqZ41elcwyrZH1dU5uZnwG+2bbs3swc69D9tcDNmfl4Zm4H7gdeFBFnAU/M\nzLvqfjcAK2crZkmSJElSWfqlpnYI2NnS3gks7rB8V71cOqFYU6vSWc+lkjl+VTrHsErW1zW1kiRJ\nkiTNtpN7HUBtF/D0lvbZVGdod9WvW5fvmmona9asYcmSJQAMDg6yfPnyyWu0m38BmKv2P199NWML\nFrD87LPhnHMYecYzZrS/z//RHzEWwYqlSzn10UcZGR+v1p97btV/y5aetU/dvZvPPvAAY09+8ty/\n//nnwxveMOXxWn722XDGGT09Pq3t5YODsHAhI1u3snvPHi540YsAYOtWRkZGWPG7v1v1r8/cNmtt\nj9RedOutjDz00JweX9u2O7Wb+iUe27aPp93UL/HYtj3b7UW33srItm2wYAErzjmnWr91KwDLzz6b\np3zve/zzV77C2IIFrPjhH67Wf/nL1fZLl07235fJc087DR57jJGPfhQef7yafwEjO3dW+z+O+c2e\nAwe4eHiYRbfeyv/ZsqU388sp2v/8uc8BMPTiF/dFPCPbtrHn2c/m4q99rYrv3nv77nhN5kNHm4+P\njXVcv2nHDsYPHOCRRx7hwYkJphKZOeXKmYqIJcBHM3NZ2/JPA2/NzM/X7fOAm4AXUl1efCfwzMzM\niNgIvAm4C/gY8CeZ+YkO75Wz+VmOV2NsjKENG2isXMnQyAhccsmM9je+bh2DCxfC6tU0JiYYGh7u\nTqBd0BiryqR7EtP69R2PbfN4NVau7LtjNTQwAMDdmzdzwbKWfxo33girVx/3Psevu47BK67oVoiH\nmuL4SpKksk3OLeGw+cf4ddfxrUcf5bSFCw/26dCv2ffhhx+Gxx7jnMWLJ+eqQDXnOc75TXOeO75u\nHftXreq7eRz0aM7byfr1NFasYGjDhr7NEYYGBroSV6PRYOi224hLLyUzo339STPa+xFExM3AKHBu\nROyIiF+OiJURsQN4MfCxiPg4QGbeA9wC3AN8HLisJUO9DHg/cB9wf6eEViqdNbUqXfvZLqkkjl+V\nzjGsknVj/M7a5ceZ+fopVm2Yov9VwFUdln8eWHb4FpIkSZKk+W7WztRKOnY+p1ala9ZrSSVy/Kp0\njmGVrBvj16RWkiRJklQsk1qpD1hTq9JZz6WSOX5VOsewStaN8WtSK0mSJEkqlkmt1AesqVXprOdS\nyRy/Kp1jWCWzplaSJEmSNK+Z1Ep9wJpalc56LpXM8avSOYZVMmtqJUmSJEnzmkmt1AesqVXprOdS\nyRy/Kp1jWCWzplaSJEmSNK+Z1Ep9wJpalc56LpXM8avSOYZVMmtqJUmSJEnzmkmt1AesqVXprOdS\nyRy/Kp1jWCWzplaSJEmSNK+Z1Ep9wJpalc56LpXM8avSOYZVsr6uqY2ID0TE7ojY3LLsKRFxR0SM\nRcTtETHYsu7yiLgvIu6NiAtblv9IRGyu171ntuKVJEmSJJVnNs/UfhC4qG3ZWuCOzBwGPlW3iYjz\ngFXAefU210ZE1Nv8GfDGzHwW8KyIaN+nVDxralU667lUMsevSucYVsn6uqY2Mz8DfLNt8WuA6+vX\n1wMr69evBW7OzMczcztwP/CiiDgLeGJm3lX3u6FlG0mSJEnSPDfXNbVnZObu+vVu4Iz69RCws6Xf\nTmBxh+W76uXSCcWaWpXOei6VzPGr0jmGVbK+rqk9msxMIHv1/pIkSZKk8p08x++3OyLOzMwH60uL\nH6qX7wKe3tLvbKoztLvq163Ld0218zVr1rBkyRIABgcHWb58+eQ12s2/AMxVe3TjRk7fupXhOraZ\n7u+zDzzAwIIFrOjS/mbl8zYac//+0HF983h16/h3qz08NFS1R0e5b9s2Lli2jKaRrVsPfp76zG2z\n1vao7Tk+vrZtd2o39Us8tm0fT7upX+KxbXtO2lu3Vm0qzfnF8ro9Of9cuvSQ9a3zkYkHHuD8pz71\n4P5GRxk+//yD/Y9zfrPnwAEuHh4Geji/nKI9unEjwGR8vY5nZMsW9ixaxMUwGV+/Ha/TFy06OB6m\nsb9NmzYxPj7Ovn372FuPl06iOmE6OyJiCfDRzFxWt98J7M3MayJiLTCYmWvrG0XdBLyQ6vLiO4Fn\nZmZGxEbgTcBdwMeAP8nMT3R4r5zNz3K8GmNjDG3YQGPlSoZGRuCSS2a0v/F16xhcuBBWr6YxMcFQ\n/Y+pHzTGxgB6E9P69R2PbfN4NVau7LtjNTQwAMDdmzcfktRy442wevVx73P8uusYvOKKboV4qCmO\nryRJKtvk3BIOm3+MX3cd33r0UU5buPBgnw79mn0ffvhheOwxzlm8eHKuClRznuOc3zTnuePr1rF/\n1aq+m8dBj+a8naxfT2PFCoY2bOjbHGFoYKArcTUaDYZuu4249FIyM9rXnzSjvR9BRNwMjALnRsSO\niPgl4GrglRExBrysbpOZ9wC3APcAHwcua8lQLwPeD9wH3N8poZVKZ02tStf866pUIsevSucYVsm6\nMX5n7fLjzHz9FKteMUX/q4CrOiz/PLDs8C0kSZIkSfPdrJ2plXTsfE6tStesf5FK5PhV6RzDKlk3\nxq9JrSRJkiSpWCa1Uh+wplals55LJXP8qnSOYZWsG+PXpFaSJEmSVCyTWqkPWFOr0lnPpZI5flU6\nx7BKZk2tJEmSJGleM6mV+oA1tSqd9VwqmeNXpXMMq2TW1EqSJEmS5jWTWqkPrHjJS+CUU+DGG+GW\nW3odjnTcrOdSyRy/KsL69VOucgyrZN0YvyfPPAxJXfG611Xfb7yxt3FIkiRJBfFMrdQHrKlV6azn\nUskcvyqdY1gls6ZWkiRJkjSvmdRKfcDn1Kp01nOpZI5flc4xrJL5nFpJkiRJ0rxmUiv1AWtqVTrr\nuVQyx69K5xhWyYqtqY2IN0fE5oj4YkS8uV72lIi4IyLGIuL2iBhs6X95RNwXEfdGxIW9iFmSJEmS\n1H/mPKmNiOcAvwK8AHgu8KqIWAqsBe7IzGHgU3WbiDgPWAWcB1wEXBsRnmHWCcWaWpXOei6VzPGr\n0jmGVbJSa2p/CNiYmY9k5neBvwd+FngNcH3d53pgZf36tcDNmfl4Zm4H7gdeOLchS5IkSZL6US+S\n2i8CL60vNz4V+CngbOCMzNxd99kNnFG/HgJ2tmy/E1g8V8FKc8GaWpXOei6VzPGr0jmGVbJujN+T\nZx7G8cnMeyPiGuB24NvAJuC7bX0yIvJIu5nFECVJkiRJhZjzpBYgMz8AfAAgIv6A6uzr7og4MzMf\njIizgIfq7ruAp7dsfna97DBr1qxhyZIlAAwODrJ8+fLJa7SbfwGYq/boxo2cvnUrw3VsM93fZx94\ngIEFC1jRpf3NyudtNOb+/aHj+ubx6tbx71Z7eGioao+Oct+2bVywbBlNI6Ojk7W1zTO3x9ye4+Nr\n23andlO/xGPb9vG0m/olHtu256S9dWvVptKcXyyv25Pzz6VLD1nfOh+ZeOABzn/qUw/ub3SU4fPP\nP9h/69bD9n+k+c2eAwe4eHgY6OH8cor26MaNAJPx9TqekS1b2LNoERfDZHz9drxOX7To4HiYxv42\nbdrE+Pg4+/btY289XjqJzLk/6RkRT8vMhyLiHOCTwIuBtwF7M/OaiFgLDGbm2vpGUTdR1dEuBu4E\nnpltgUdE+6KeaoyNMbRhA42VKxkaGYFLLpnR/sbXrWNw4UJYvZrGxARD9T+mftAYGwPoTUzr13c8\nts3j1Vi5su+O1dDAAAB3b958SFI76cYbYfXqY97n+HXXMXjFFd0K8VBTHF9JkjTHuvx/8uTcEg6b\nd4xfdx3fevRRTlu48GCfDv2afR9++GF47DHOWbx4cq4KVHOe45zXNOe54+vWsX/Vqr6bx0GP5ryd\nrF9PY8UKhjZs6NscYWhgoCtxNRoNhm67jbj0UjIz2tefNKO9T99fRcSXgL8FLsvMbwFXA6+MiDHg\nZXWbzLwHuAW4B/h43b9/slepC6ypVemaf12VSuT4VekcwypZN8Zvry4//rEOy74BvGKK/lcBV812\nXJIkSZKksvTqTK2kFj6nVqVr1r9IJXL8qnSOYZWsG+PXpFaSJEmSVCyTWqkPWFOr0lnPpZI5flU6\nx7BK1o3xa1IrSZIkSSqWSa3UB6ypVems51LJHL8qnWNYJbOmVpIkSZI0r5nUSn3AmlqVznoulczx\nq9I5hlUya2olSZIkSfOaSa3UB6ypVems51LJHL8qnWNYJbOmVpIkSZI0r5nUSn3AmlqVznoulczx\nq9I5hlUya2olSZIkSfOaSa3UB6ypVems51LJHL8qnWNYJbOmVpIkSZI0r5nUSn3AmlqVznoulczx\nq9I5hlWyYmtqI+LyiPhSRGyOiJsiYmFEPCUi7oiIsYi4PSIG2/rfFxH3RsSFvYhZkiRJktR/5jyp\njYglwK8Cz8vMZcATgJ8D1gJ3ZOYw8Km6TUScB6wCzgMuAq6NCM8w64RiTa1KZz2XSub4VekcwyrZ\nnNTURsS2iPgPbctum8F7Pgw8DpwaEScDpwIN4DXA9XWf64GV9evXAjdn5uOZuR24H3jhDN5fkiRJ\nknSCOJYzno8DKyLigxGxsF62eLpvmJnfAN4FfJUqmR3PzDuAMzJzd91tN3BG/XoI2Nmyi50zeX+p\nH1lTq9JZz6WSOX5VOsewSjZXNbX7M3MV8GXgHyLiGTN5w4hYCvwGsIQqYR2IiNWtfTIzgTzCbo60\nTpIkSZI0T5x8rB0z850R8c/A7cBTZvCezwdGM3MvQET8DfCjwIMRcWZmPhgRZwEP1f13AU9v2f7s\netlh1qxZw5IlSwAYHBxk+fLlk9doN/8CMFft0Y0bOX3rVobr2Ga6v88+8AADCxawokv7m5XP22jM\n/ftDx/XN49Wt49+t9vDQUNUeHeW+bdu4YNkymkZGRydra5tnbo+5PcfH17btTu2mfonHtu3jaTf1\nSzy2bc9Je+vWqk2lOb9YXrcn559Llx6yvnU+sm/HDp572mkH9zc6yvD55x/sv3XrYfs/0vxmz4ED\nXDw8DPRwfjlFe3TjRoDJ+Hodz8iWLexZtIiLYTK+fjtepy9adHA8TGN/mzZtYnx8nH379rG3Hi+d\nRHVSdGoR8erM/GhL+xnAGzLzHUfccOr9PRf4CPAC4BHgQ8BdwDOAvZl5TUSsBQYzc219o6ibqOpo\nFwN3As+6gE5nAAAgAElEQVTMtsAjon1RTzXGxhjasIHGypUMjYzAJZfMaH/j69YxuHAhrF5NY2KC\nofofUz9ojI0B9Cam9es7Htvm8WqsXNl3x2poYACAuzdvPiSpnXTjjbB69eHLpzB+3XUMXnFFt0I8\n1BTHV5IkzbEu/588ObeEw+YdjYkJHr/hBk5buPBgnw79mn2/8773wWOPcc7ixZNzVaCa8xznvKY5\nzx1ft479q1b13TwOejTn7WT9ehorVjC0YUPf5ghDAwNdiavRaDB0223EpZeSmdG+/qSpNoyIH4mI\n5wGNiHhe8wt4KvCx6QaUmV8AbgD+CfiXevF64GrglRExBrysbpOZ9wC3APcAHwcu66vsVeoCa2pV\nuuZfV6USOX5VOsewStaN8Xuky4/fxcHa1edTJaGt/s103zQz3wm8s23xN4BXTNH/KuCq6b6fJEmS\nJOnENGVSm5krmq8j4u7MnHYSK+nIfE6tStesf5FK5PhV6RzDKlk3xu+Ulx9LkiRJktTvTGqlPmBN\nrUpnPZdK5vhV6RzDKtms1tRGxH9vaS6OiD8Bmneaysx804zfXZIkSZKkGTjSjaI+T3WjqKhft/Lu\nw1IXWVOr0lnPpZI5flU6x7BK1o3xe6QbRX1oxnuXJEmSJGkWHek5tR+NiL+tv7d//e1cBimd6Kyp\nVems51LJHL8qnWNYJZvt59S+GNgJ3AxsrJdN1tTO+J0lSZIkSZqhIyW1ZwGvBF5ff30MuDkzvzQX\ngUnziTW1Kp31XCqZ41elcwyrZLP6nNrM/E5mfjwzf5HqrO39wN9HxK/P+F0lSZIkSeqCIz6nNiK+\nLyJ+FrgR+DXgPcCtcxGYNJ9YU6vSWc+lkjl+VTrHsEo228+p/TDwbODvgHdk5uYZv5skSZIkSV10\npJranwe+DbwZeHNEtK7LzHzSbAYmzSfW1Kp01nOpZI5flc4xrJLN9nNqj3hpsiRJkiRJvWbiKvUB\na2pVOuu5VDLHr0rnGFbJujF+5zypjYhzI+Lulq9vRcSbIuIpEXFHRIxFxO0RMdiyzeURcV9E3BsR\nF851zJIkSZKk/jTnSW1mbsnMCzLzAuBHgP1Ud1ReC9yRmcPAp+o2EXEesAo4D7gIuDYiPMOsE4o1\ntSqd9VwqmeNXpXMMq2Sz+pzaOfIK4P7M3AG8Bri+Xn49sLJ+/Vrg5sx8PDO3Uz0v94VzHagkSZIk\nqf/0Oqn9OeDm+vUZmbm7fr0bOKN+PQTsbNlmJ7B4bsKT5oY1tSqd9VwqmeNXpXMMq2RF1tQ2RcQp\nwKuBv2xfl5kJ5BE2P9I6SZIkSdI8caTn1M62nwQ+n5lfr9u7I+LMzHwwIs4CHqqX7wKe3rLd2fWy\nw6xZs4YlS5YAMDg4yPLlyyev0W7+BWCu2qMbN3L61q0M17HNdH+ffeABBhYsYEWX9jcrn7fRmPv3\nh47rm8erW8e/W+3hoaGqPTrKfdu2ccGyZTSNjI5O1tY2z9wec3uOj69t253aTf0Sj23bx9Nu6pd4\nbNuek/bWrVWbSnN+MXz++UDL/HPp0kPWt85H9hw4MFkXOLJ1K4yOTm4/MjoKW7cetv8jzW/2HDjA\nxcPDQA/nl1O0RzduBJiMr9fxjGzZwp5Fi7gYJuPrt+N1+qJFB8fDNPa3adMmxsfH2bdvH3vr8dJJ\nVCdF515E/Dnw8cy8vm6/E9ibmddExFpgMDPX1jeKuomqjnYxcCfwzGwLPCLaF/VUY2yMoQ0baKxc\nydDICFxyyYz2N75uHYMLF8Lq1TQmJhiq/zH1g8bYGEBvYlq/vuOxbR6vxsqVfXeshgYGALh78+ZD\nktpJN94Iq1cf8z7Hr7uOwSuu6FaIh5ri+EqSpDnW5f+TJ+eWcNi8ozExweM33MBpCxce7NOhX7Pv\nd973PnjsMc5ZvHhyrgpUc57jnNc057nj69axf9WqvpvHQY/mvJ2sX09jxQqGNmzo2xxhaGCgK3E1\nGg2GbruNuPRSMjPa1580o71PU0R8P9VNov6mZfHVwCsjYgx4Wd0mM+8BbgHuAT4OXNZX2avUBdbU\nqnTNv65KJXL8qnSOYZWsG+O3J5cfZ+a3gdPbln2DKtHt1P8q4Ko5CE2SJEmSVJBe1tR2Xxx2Jhqm\nOqnbqW8X+w+de271/Xd+p1pw6aU9jWeuPu+cx/Pe93ZcPPh7v1fF1Tz+cxXPUfoPtSy6AGBXVR5+\n2HNqF09xg+9dHcvJ+2482H/+9V/RZ/HY3/7H039Fn8Vjf/tP2X+K+WSzBvG499+cJ7XPl7Zs6dy/\nw/xkCPjqW9965P7t+59qPrN48eRcaZCD87l+Of6T87g+iWcypmuu6Zt4ptN/xTH0H+rcY1JPLj+W\nJEmSJKkbTqykNvPwr+Pp28X+jS1b4Jprqu/vfW/P45mTz9tH8Yy/4x0Hj38fxNNc39iypfrr5K5d\n3P2JT0yuPqymtu5z2FeP47e//afqP/LpT/dVPPa3//H0H/n0p/sqHvvbv2P/I8wnJ2sSj3f/11xT\nfR3rfKPD3KQx1VndZv/j3H9z7jb+jnccnMdNZY5/Xo0tW478eed6/Lz3vf0VzzT7T1lT23rsd+2a\n8gpNONGSWkmSJEnSvGJSK/WBw2pqpcJM1nNJBXL8qnSOYZWsG+PXpFaSJEmSVCyTWqkP+Jxalc5n\nJKpkjl+VzjGsknVj/JrUSpIkSZKKZVIr9QFralU667lUMsevSucYVsmsqZUkSZIkzWsmtVIfsKZW\npbOeSyVz/Kp0jmGVzJpaSZIkSdK8ZlIr9QFralU667lUMsevSucYVsmsqZUkSZIkzWsn9zoASVVN\n7eTZ2lNOgRtvPPj6da/rXWDSMRoZGfFMgYo1snYtK37wB4/caeFCeMMb5iagVtdfX33vxXufaK6/\nHh59tHq9cOHB5SfAse317+BcsIB47LFq3iIdp26M354ktRExCLwfeDaQwC8B9wF/ATwD2A68LjPH\n6/6XA78MfBd4U2be3oOwpbnRmsQ2k1tJ0ux5/HG45JIj91m/fm5iaddMwjRzjz568Ofcq5/nCeob\nP/mTsH8/5yxb1utQNE/16vLj9wB/l5k/DJwP3AusBe7IzGHgU3WbiDgPWAWcB1wEXBsRXjatE4o1\ntSqdZ2lVshXnntvrEKQZ8XewSlZkTW1EnAa8NDM/AJCZ38nMbwGvAeprbLgeWFm/fi1wc2Y+npnb\ngfuBF85t1JIkSZKkftSLM54/AHw9Ij4YEf8cEe+LiO8HzsjM3XWf3cAZ9eshYGfL9juBxXMXrjT7\nfE6tSuczElWykS1beh2CNCP+DlbJSn1O7cnA84BrM/N5wLepLzVuysykqrWdypHWSZIkSZLmiV7c\nKGonsDMz/2/d/ivgcuDBiDgzMx+MiLOAh+r1u4Cnt2x/dr3sMGvWrGHJkiUADA4Osnz58slrtJt/\nAZir9ujGjZy+dSvDdWwz3d9nH3iAgQULWNGl/c3K52005v79oeP65vHq1vHvVnt4aKhqj45y37Zt\nXNByQ4XWOyA3z9yuaFkHHL6+2Z7j42vbdqd2U7/EY9v28bSbpux/tPWz1a7PIvfs/U/UNpWRLVtg\nZKT38fSqvXVr1abSnF8Mn38+0DL/XLr0kPWt85E9Bw6wtJ5/t28/MjoKW7cetv8p5zP1/i4eHgZ6\nOL+coj26cSPAZHy9jmdkyxb2LFrExTAZX78dr9MXLTo4Hqaxv02bNjE+Ps6+ffvYW4+XTqI6KTq3\nIuIfgF/JzLGIuBI4tV61NzOviYi1wGBmrq1vFHUTVR3tYuBO4JnZFnhEtC/qqcbYGEMbNtBYuZKh\nkZGj31XxKMbXrWNw4UJYvZrGxARD9T+mftAYGwPoTUzr13c8ts3j1Vi5su+O1dDAAAB3b958SFLb\n0Y03wurVR+wyft11DF5xRbdCPNQUx1eSTijH8ruuV78Pm3fp9XfxzLX+DFvvflzKse3yGJycW8Jh\nc43GxASP33ADpy1ceLBPh37Nvrt374b9+yfnNY2JCYBqznMMc5n2/Q0NDzO+bh37V63qu3kc9GjO\n28n69TRWrGBow4a+zRGGBga6Elej0WDottuISy8lM6N9/Ukz2vv0/UfgIxHxBaq7H/8BcDXwyogY\nA15Wt8nMe4BbgHuAjwOX9VX2KnWBNbUqXfOvq1KJrKlV6fwdrJJ1Y/z25Dm1mfkF4AUdVr1iiv5X\nAVfNalCSJEmSpOL06kytpBY+p1ala9a/SCXyObUqnb+DVbJujF+TWkmSJElSsUxqpT5gTa1KZz2X\nSmZNrUrn72CVrBvj16RWkiRJklQsk1qpD1hTq9JZz6WSWVOr0vk7WCWzplaSJEmSNK+Z1Ep9wJpa\nlc56LpXMmlqVzt/BKpk1tZIkSZKkec2kVuoD1tSqdNZzqWTW1Kp0/g5WyayplSRJkiTNaya1Uh+w\nplals55LJbOmVqXzd7BKZk2tJEmSJGleM6mV+oA1tSqd9VwqmTW1Kp2/g1Uya2olSZIkSfOaSa3U\nB6ypVems51LJrKlV6fwdrJIVW1MbEdsj4l8i4u6IuKte9pSIuCMixiLi9ogYbOl/eUTcFxH3RsSF\nvYhZkiRJktR/enWmNoEVmXlBZr6wXrYWuCMzh4FP1W0i4jxgFXAecBFwbUR4hlknFGtqVTrruVQy\na2pVOn8Hq2Sl19RGW/s1wPX16+uBlfXr1wI3Z+bjmbkduB94IZIkSZKkea+XZ2rvjIh/iohfrZed\nkZm769e7gTPq10PAzpZtdwKL5yZMaW5YU6vSWc+lkllTq9L5O1gl68b4PXnmYUzLv87Mr0XEvwLu\n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\nzPxk7yKWZoc1tSpd+yVEUkkcvyqdY1gl68b47WlSK0mSJEnSTJjUSn3A59SqdM2bOkglcvyqdI5h\nlawb49ekVpIkSZJULJNaqQ9YU6vSWc+lkjl+VTrHsEpmTa10gmg+p1Yq1aZNm3odgjRtjl+VzjGs\nknVj/JrUSn1g/OGHex2CNCPj4+NH7yT1KcevSucYVsm6MX5NaiVJkiRJxTKplfrA9h07eh2CNCPb\nt2/vdQjStDl+VTrHsErWjfEbmTnzSPpARJwYH0SSJEmS1FFmRvuyEyaplSRJkiTNP15+LEmSJEkq\nlkmtJEmSJKlYJrWSJEmSpGKZ1EqSJEmSimVSK0mSJEkqlkmtJEmSJKlYJrWSJEmSpGKZ1EqSJEmS\nimVSK0mSJEkqlkmtJEmSJKlYJrWSJEmSpGKZ1EqSJEmSimVSK0mSJEkqlkmtJEmSJKlYJrWSJEmS\npGKZ1EqSJEmSimVSK0mSJEkqlkmtJEmSJKlYJrWSJEmSpGKZ1EqSJEmSimVSK0mSJEkqlkmtJEmS\nJKlYJrWSJEmSpGKZ1EqSJEmSimVSK0nSCSoitkfEy3sdhyRJs8mkVpKkFlMlghGxIiJ21K+/FBH7\n6q/vRMSBlvb3Wl4/FhGPtrSvbd1Ph/f4UFv/fRFx9xFifVJE/LeI+Erd9/6IeHdEPLXukvXXTI7H\nlRHx4ZnsQ5Kk2WRSK0nSoY6aCGbmszPziZn5ROAzwK8125l5Usu6jwDXtKy77Bjeu7X/EzPzgk4d\nI+IU4FPADwM/Ub/fjwJ7gBcc1yeeRRHxhF7HIEk6sZnUSpI0czHNdTPxi8DTgZ/JzHsBMvPrmfkH\nmfmJw4KozgKva2kfcsY4In4nInZGxMMRcW9EvCwiLgIuB1a1njWOiNMi4rqIaNTbrIuIk+p1ayLi\n/0TEH0fEHuDts/T5JUkC4OReByBJ0glgRpf4tjnWJPgVwMczc/8x9p/yDHREnAv8GvD8zHwwIs4B\nTs7MbRFxFbA0M3+xZZMPAQ8CS4EB4DZgB7C+Xv9C4CbgacApxxifJEnT4plaSZL6RwBvjYhvtnx9\ncIq+TwG+No39d/JdYCHw7IhYkJlfzcxtLdtMbhcRZwA/CfxmZh7IzK8D/w34uZb9NTLzf2Tm9zLz\nkeOMUZKk4+KZWkmS+kcC/zUzf+8Y+u4Fhrryppn3R8RvAFdSJbafBH4rMzslzc8AFgBfi5jMdU8C\nvtrSp+ONsCRJmg2eqZUkqUx3Aj8REaceY/9vA619z2xdmZk3Z+ZLqZLWBK5prmrbzw7gUeCpmfnk\n+uu0zFzWurtj/RCSJM2USa0kSYc7JSK+r+XraHfwneqy3inrYyNiYet7tPQ/1praD1MlmH8dEedG\nxEkR8dSI+N2I+MkO/TcBPxURT46IM4HfaIlluL4x1EKqhPURqkuSoaqdXRL1adn67O3twB9HxBPr\n910aET92jHFLktRVJrWSJB3u74D9LV9v58iP+jnS8vZ1CSwGDrTs/9sRsbRe99ttz6l9qOOOMx+j\nulnUvcAdwLeAjVS1tp/rsMmHgS8A24FPAH/eEttC4A+Br1PV6Z5OdddjgL+sv++NiH+qX/8i1Q2g\n7gG+Ufdpnvmd8bNxJUk6HpHp/zuSJEmSpDJ5plaSJEmSVCyTWkmSJElSsUxqJUmSJEnFMqmVJEmS\nJBXr5F4H0C0R4R2vJEmSJOkElpmHPfruhElqAfrpTs6NsTGGBgZoTEwwNDzctf0BXdtntzTGxgD6\nLqZuHv9uaf053r15MxcsWwbAle96F1e+5S3T22effUbNT1deeSVXXnllr8OQpsXxq9JNZwy3zkkO\nWzcxwYMTE5w5MDBln9a+u3fvhv37J+c1jYkJgKNuO9X+hoaH+3Z+Cf0XUz/nCMcyHz+W8dtoNBga\nGqJ+ZPphvPxY6gPbd+zodQjSjGzfvr3XIUjT5vhV6RzDKlk3xq9JrSRJkiSpWCa1Uh9Y87rX9ToE\naUbWrFnT6xCkaXP8qnSOYZWsG+PXpFbqAyte8pJehyDNyIoVK3odgjRtjl+VzjGsknVj/JrUSn1g\nZHS01yFIMzIyMtLrEKRpc/yqdI5hlawb49ekVpIkSZJULJNaqQ94+bFK56VvKpnjV6VzDKtkXn4s\nSZIkSZrXTGqlPmBNrUpnPZdK5vhV6RzDKpk1tZIkSZKkea0nSW1EvDkiNkfEFyPizfWyp0TEHREx\nFhG3R8RgS//LI+K+iLg3Ii7sRczSbLKmVqWznkslc/yqdI5hlazImtqIeA7wK8ALgOcCr4qIpcBa\n4I7MHAY+VbeJiPOAVcB5wEXAtRHhGWZJkiRJUk/O1P4QsDEzH8nM7wJ/D/ws8Brg+rrP9cDK+vVr\ngZsz8/HM3A7cD7xwbkOWZpc1tSqd9VwqmeNXpXMMq2Sl1tR+EXhpfbnxqcBPAWcDZ2Tm7rrPbuCM\n+vUQsLNl+53A4rkKVpIkSZLUv06e6zfMzHsj4hrgduDbwCbgu219MiLySLuZxRClOWdNrUpnPZdK\n5vhV6RzDKlk3xu+cJ7UAmfkB4AMAEfEHVGdfd0fEmZn5YEScBTxUd98FPL1l87PrZYdZs2YNS5Ys\nAWBwcJDly5dPHqTmae25ao9u3MjpixYxfP75Xd1fM/mZ689zTPE1Gv0VTxePf7faw0NDVXt0lPu2\nbeOCZcsm23AwuT3udp98Ptu2bdu2bdt2Qe3R0ardNr9ozp8Om3926L/nwAGW1vPv9u2nM7/Zc+AA\nFw8PH3z/PptfApPx9TqekZER9uzYwcUvf/lkfP12vGY6H9+0aRPj4+Ps27ePvXv3MpXInPuTnhHx\ntMx8KCLOAT4JvBh4G7A3M6+JiLXAYGaurW8UdRNVHe1i4E7gmdkWeES0L+qpxtgYQwMDNCYmGKoH\nfjf2B3Rtn93SGBsD6LuYunn8u6X153j35s2HJLXTPVvbb59R89PIyMjkf0JSaRy/Kt10xnDrnOSw\ndRMTPDgxwZkDA1P2ae27e/du2L9/cl7TmJgAOOq2U+3v/7V3/zF2leeBx78PP+zadcMspRiugTpq\nOmlBsIa2hLbK1m0IQikBskGQqii4YmNUtm1YqQWzVdJuq0UBNdufQsI0TSelobWyDSq0aTFsJm06\nkptsGKA4ePgRC+xbBjA7xFO7xoRn/7j3ji9jezw/7sw5r+/3I41833Pfe+a55z4zfp8597mnMThY\n2/Ul1C+mOtcIs1mPzyZ/m80mjUaDiCAzY/r9lZypBb4QEd8LHARuzszXI+JTwJaIuBHYCVwLkJnb\nI2ILsB14sz2/PtWrJEmSJKkyVb39+D8dYdtrwKVHmX8HcMdixyVVxZ5alc6zXCqZ+avSmcMqWS/y\n94SFhyFJkiRJUjUsaqUa8Dq1Kl3nwx2kEpm/Kp05rJL1In8taiVJkiRJxbKolWrAnlqVzn4ulcz8\nVenMYZXMnlpJkiRJUl+zqJVqwJ5alc5+LpXM/FXpzGGVzJ5aSZIkSVJfs6iVasCeWpXOfi6VzPxV\n6cxhlcyeWkmSJElSX7OolWrAnlqVzn4ulcz8VenMYZXMnlpJkiRJUl+zqJVqwJ5alc5+LpXM/FXp\nzGGVzJ5aSZIkSVJfs6gtzNCWFWz54juqDkMLMLRlBUNbVvDg1gZDW1YA9tSqfPZzqWTmr0q3GDn8\n4IOnznrN+eCXTp9a13TWNtJs9SJ/T1p4GFpKB94I3ngjqg5DC3Cg/fq9cfCEqduSJEl1cvBg8MYJ\ns4cT4YkAACAASURBVFunvHHwBHBdowp5plaqAXtqVTr7uVQy81elM4dVMntqJUmSJEl9zaJWqgF7\nalU6exJVMvNXpTOHVTKvUytJkiRJ6msWtVIN2FOr0tnPpZKZvyqdOayS2VMrSZIkSeprFrVSDdhT\nq9LZz6WSmb8qnTmsktlTK0mSJEnqaxa1Ug3YU6vS2c+lkpm/Kp05rJLZUytJkiRJ6muVFLURcXtE\nPBURT0bE5yNieUScGhFbI2IsIh6OiIFp85+JiKcj4rIqYpYWkz21Kp39XCqZ+avSmcMqWZE9tRGx\nFvgYcFFmng+cCHwE2ARszcxB4NH2mIg4F7gOOBe4HLg7IjzDLEmSJEmq5Eztt4GDwMqIOAlYCTSB\nK4Gh9pwh4Or27auA+zPzYGbuBJ4FLl7SiKVFZk+tSmc/l0pm/qp05rBKVmRPbWa+BnwaeIFWMTuR\nmVuB1Zk53p42Dqxu324Au7p2sQtYs0ThSpIkSZJqrIq3H/8AcAuwllbBuioiru+ek5kJ5Ay7mek+\nqTj21Kp09nOpZOavSmcOq2S9yN+TFh7GnP0oMJKZewAi4q+AHwdeiogzMvOliDgTeLk9fzdwdtfj\nz2pvO8yGDRtYu3YtAAMDA6xbt27qdHbnYC3VeGTbNk5bsYLBCy7o6f7g0kqez6ziazbrFU8Pj3+v\nxoONBgA7nvsqL7/6Cues+RAAo0891Zrffhtyp8id9bgmz89x/45HR0drFY9jx+av434ad8z58SMj\nrfG09UVn/fTct/6J4ZG3ZlyPvLp/P3AJ0FrfAFzB4Iz7P9b+rhlsPb6O60tgKr6q4xkeHubVF1/k\nmve9byq+uh2v2azHO450/+joKBMTE+zdu5c9e/ZwNNE6Kbp0IuI/An8O/Bjw78CfAv8MfD+wJzPv\njIhNwEBmbmp/UNTnafXRrgEeAd6V0wKPiOmbKtUcG6OxahXNyUka7cTvxf4237eSiQMHuPUTq4/9\noCXSHBsD6Mnz7JVeH/9eaY6N8dADpwPwwu7dnLNmDRuv37ewfdbsOUqSpPrrrJWOeN/kJHd/bjnv\nWP5d3Hrjd2bez+Qkd98b8MYbnLOm1SF4xdWtc1NH2/+x9tcYHKzt+hLqF1PnONdtTdjL9Xiz2aTR\naBARZGZMv3/Jz9Rm5uMR8Tng68BbwDeAzcD3AFsi4kZgJ3Bte/72iNgCbAfeBG6uVfUqSZIkSarM\nCVV808y8KzPPy8zzM/OG9icbv5aZl2bmYGZelpkTXfPvyMx3ZeYPZebfVxGztJjsqVXppr+FSCqJ\n+avSmcMqWS/yt5KiVpIkSZKkXrColWrA69SqdJ0PdZBKZP6qdOawStaL/LWolSRJkiQVy6JWqgF7\nalU6+7lUMvNXpTOHVbJe5G8V16mVJEmq3NAQHDgAO3ZA+0odmsHy5XDDDVVHoaW0bFkytGUFN1y7\n/9hzT35rCSKSjsyiVqoBe2pVOvu5VKIDB2DjRoD1FUdShs2bq45AR7NYv4Ov/dC3eeiB02c194Pv\nb/K1x89elDh0fLOnVpIkSZLU1yxqpRqwp1als59LJTN/VTpzWCXzOrWSJEmSpL5mUSvVgD21Kp09\ntSqZ+avSmcMqmT21kiRJkqS+ZlEr1YA9tSqd/Vwqmfmr0pnDKpk9tZIkSZKkvmZRK9WAPbUqnf1c\nKpn5q9KZwyqZPbWSJEmSpL5mUSvVgD21Kp39XCqZ+avSmcMqmT21kiRJkqS+ZlEr1YA9tSqd/Vwq\nmfmr0pnDKpk9tZIkSZKkvmZRK9WAPbUqnf1cKpn5q9KZwyqZPbWSJEmSpL5mUSvVgD21Kp39XCqZ\n+avSmcMqmT21kiRJkqS+ZlEr1YA9tSqd/Vwqmfmr0pnDKpk9tZIkSZKkvrbkRW1EvDsiHuv6ej0i\nfiUiTo2IrRExFhEPR8RA12Nuj4hnIuLpiLhsqWOWFps9tSqd/Vwqmfmr0pnDKlmRPbWZuSMzL8zM\nC4EfAfYBXwQ2AVszcxB4tD0mIs4FrgPOBS4H7o4IzzBLkiRJkip/+/GlwLOZ+SJwJTDU3j4EXN2+\nfRVwf2YezMydwLPAxUsdqLSY7KlV6eznUsnMX5XOHFbJjoee2o8A97dvr87M8fbtcWB1+3YD2NX1\nmF3AmqUJT5IkSZJUZydV9Y0jYhnwQeC26fdlZkZEzvDwI963YcMG1q5dC8DAwADr1q2beo925y8A\nSzUe2baN01asYPCCC3q6v9bJ7aV/PrOKr9msVzw9PP69Gg82GgDseO6rvPzqK5yz5kN0DI+MTPXW\nds7cznpck+fnuL/HQ0Nw4ADs2NEav/vdrftLHi9fDt/85jAHD9YjnuNtXPXxXb788DMEdfl5cux4\n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\njgAv7N7NOWvWsPH6fQvb5+QkjfYv12Pl2ULzcK66v99Sf28tnbq9tr2MZ/Pm1r91en5V8/j2r7r9\nrGthuteWh903OclLk5OcsWoVjVWrANh838qjzr373uDDlz7P1x5/DwBXXN06N9V57Jziaq9rmmNj\nrX10/9W0YnWJafqat7O27NQddTG9HlrQvppNHnqowU03BZk5/bOZOGFBe5+f1cA/RsQosA14KDMf\nBj4FvD8ixoCfaY/JzO3AFmA78CXg5lpVr1IP2FOr0h3667FUHvNXpTOHVbJe5O+Sv/04M78FrDvC\n9tdona090mPuAO5Y5NAkSZIkSYWp4kytpGm8Tq1K1+l/kUpk/qp05rBK1ov8taiVJEmSJBXLolaq\nAXtqVTr7uVQy81elM4dVsl7kr0WtJEmSJKlYFrVSDdhTq9LZz6WSmb8qnTmsktlTK0mSJEnqaxa1\nUg3YU6vS2c+lkpm/Kp05rJLZUytJkiRJ6msWtVIN2FOr0tnPpZKZvyqdOayS2VMrSZIkSeprFrVS\nDdhTq9LZz6WSmb8qnTmsktlTK0mSJEnqaxa1Ug3YU6vS2c+lkpm/Kp05rJL1In9PWngY9bF5c9UR\nHDIxfgqrvyenxsuXLyy+7v0tW5aVPtfly+e2fbF1ju2Rvn/Vx2q6t72OJ7/F8mXJ5vtWLmyfB05k\nYHXr9rFeg4Xm4Vx1x7PU31tLp6qf/aVwPD+3OvD4lsXf48eX6WvVYznammXiwIksO3nibfPu+8tT\nABiYxw95Z10zMd7ex+o572LR1CWm6Yd1+bLZv45LrZMPCz1mExMrWT3DPiKzvgdhLiIi6/RcmmNj\nNFatojk5SWNwsGf7A3q2z15pjo0B1C6mXh7/Xul+HR978kkuPP98oNVTO9+ztXV7jupPw8PDnilQ\nscxflW4+Ody9JjnsvslJXpqc5IxVq446p3vu+Pg47Ns3ta5pTk4CHPOxR9tfY3CwtutLqF9Mda4R\nZrMen03+NptNGo0GEUFmxvT7ffuxJEmSJKlYFrVSDdhTq9J5lkslM39VOnNYJfM6tZIkSZKkvmZR\nK9WA16lV6bxGokpm/qp05rBK5nVqJUmSJEl9zaJWqgF7alU6+7lUMvNXpTOHVTJ7aiVJkiRJfc2i\nVqoBe2pVOvu5VDLzV6Uzh1Uye2olSZIkSX3NolaqAXtqVTr7uVQy81elM4dVsqJ7aiPixIh4LCIe\n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\nU7ZmwAAAAABJRU5ErkJggg==\n",
   1166       "text/plain": [
   1167        "<matplotlib.figure.Figure at 0x7fa97d0ae610>"
   1168       ]
   1169      },
   1170      "metadata": {},
   1171      "output_type": "display_data"
   1172     }
   1173    ],
   1174    "source": [
   1175     "trace.analysis.frequency.plotClusterFrequencies()"
   1176    ]
   1177   },
   1178   {
   1179    "cell_type": "markdown",
   1180    "metadata": {
   1181     "hidden": true
   1182    },
   1183    "source": [
   1184     "#### Take-away"
   1185    ]
   1186   },
   1187   {
   1188    "cell_type": "markdown",
   1189    "metadata": {
   1190     "hidden": true
   1191    },
   1192    "source": [
   1193     "In a single plot we can aggregate multiple informations which makes it easy to verify the expected behaviros.\n",
   1194     "\n",
   1195     "With a set of properly defined plots we are able to condense mucy more sensible information which are easy to ready because they are \"standard\".<br>\n",
   1196     "We immediately capture what we are interested to evaluate!\n",
   1197     "\n",
   1198     "Moreover, all he produced plots are available as high resolution images, ready to be shared and/or used in other reports."
   1199    ]
   1200   },
   1201   {
   1202    "cell_type": "code",
   1203    "execution_count": 132,
   1204    "metadata": {
   1205     "collapsed": false,
   1206     "hidden": true
   1207    },
   1208    "outputs": [
   1209     {
   1210      "name": "stdout",
   1211      "output_type": "stream",
   1212      "text": [
   1213       "\u001b[01;34m../../results/SchedTuneAnalysis/\u001b[00m\r\n",
   1214       " \u001b[01;35mboost15_cluster_freqs.png\u001b[00m\r\n",
   1215       " \u001b[01;35mboost15_task_util_task_ramp.png\u001b[00m\r\n",
   1216       " energy.json\r\n",
   1217       " output.log\r\n",
   1218       " platform.json\r\n",
   1219       " rt-app-task_ramp-0.log\r\n",
   1220       " test_00.json\r\n",
   1221       " trace_boost15.dat\r\n",
   1222       " trace_boost15.raw.txt\r\n",
   1223       " trace_boost15.txt\r\n",
   1224       " trace_boost25.dat\r\n",
   1225       " trace_boost25.raw.txt\r\n",
   1226       " trace_boost25.txt\r\n",
   1227       " trace.dat\r\n",
   1228       " trace_noboost.dat\r\n",
   1229       " trace_noboost.raw.txt\r\n",
   1230       " trace_noboost.txt\r\n",
   1231       " trace.raw.txt\r\n",
   1232       " trace.txt\r\n",
   1233       "\r\n",
   1234       "0 directories, 19 files\r\n"
   1235      ]
   1236     }
   1237    ],
   1238    "source": [
   1239     "!tree {res_dir}"
   1240    ]
   1241   },
   1242   {
   1243    "cell_type": "markdown",
   1244    "metadata": {
   1245     "hidden": true
   1246    },
   1247    "source": [
   1248     "## Behavioral Analysis"
   1249    ]
   1250   },
   1251   {
   1252    "cell_type": "markdown",
   1253    "metadata": {
   1254     "hidden": true
   1255    },
   1256    "source": [
   1257     "### Is the task starting on a big core?"
   1258    ]
   1259   },
   1260   {
   1261    "cell_type": "markdown",
   1262    "metadata": {
   1263     "hidden": true
   1264    },
   1265    "source": [
   1266     "We always expect a new task to be allocated on a big core.\n",
   1267     "\n",
   1268     "To verify this condition we need to know what is the topology of the target.\n",
   1269     "\n",
   1270     "This information is **automatically collected by LISA** when the workload is executed.<br>\n",
   1271     "Thus it can be used to write **portable tests** conditions."
   1272    ]
   1273   },
   1274   {
   1275    "cell_type": "markdown",
   1276    "metadata": {
   1277     "hidden": true
   1278    },
   1279    "source": [
   1280     "#### Create a SchedAssert for the specific topology"
   1281    ]
   1282   },
   1283   {
   1284    "cell_type": "code",
   1285    "execution_count": 23,
   1286    "metadata": {
   1287     "collapsed": false,
   1288     "hidden": true
   1289    },
   1290    "outputs": [],
   1291    "source": [
   1292     "from bart.sched.SchedMultiAssert import SchedAssert\n",
   1293     "\n",
   1294     "# Create an object to get/assert scheduling pbehaviors\n",
   1295     "sa = SchedAssert(trace_file, topology,  execname='task_ramp')"
   1296    ]
   1297   },
   1298   {
   1299    "cell_type": "markdown",
   1300    "metadata": {
   1301     "hidden": true
   1302    },
   1303    "source": [
   1304     "#### Use the SchedAssert method to investigate properties of this task"
   1305    ]
   1306   },
   1307   {
   1308    "cell_type": "code",
   1309    "execution_count": 28,
   1310    "metadata": {
   1311     "collapsed": false,
   1312     "hidden": true
   1313    },
   1314    "outputs": [
   1315     {
   1316      "name": "stdout",
   1317      "output_type": "stream",
   1318      "text": [
   1319       "PASS: Task starts on big CPU:  1\n"
   1320      ]
   1321     }
   1322    ],
   1323    "source": [
   1324     "# Check on which CPU the task start its execution\n",
   1325     "if sa.assertFirstCpu(platform['clusters']['big']):#, window=(4,6)):\n",
   1326     "    print \"PASS: Task starts on big CPU: \", sa.getFirstCpu()\n",
   1327     "else:\n",
   1328     "    print \"FAIL: Task does NOT start on a big CPU!!!\""
   1329    ]
   1330   },
   1331   {
   1332    "cell_type": "markdown",
   1333    "metadata": {
   1334     "hidden": true
   1335    },
   1336    "source": [
   1337     "### Is the task generating the expected load?"
   1338    ]
   1339   },
   1340   {
   1341    "cell_type": "markdown",
   1342    "metadata": {
   1343     "hidden": true
   1344    },
   1345    "source": [
   1346     "We expect 35% load in the between 2 and 4 [s] of the execution"
   1347    ]
   1348   },
   1349   {
   1350    "cell_type": "markdown",
   1351    "metadata": {
   1352     "hidden": true
   1353    },
   1354    "source": [
   1355     "#### Identify the start of the first phase"
   1356    ]
   1357   },
   1358   {
   1359    "cell_type": "code",
   1360    "execution_count": 29,
   1361    "metadata": {
   1362     "collapsed": false,
   1363     "hidden": true
   1364    },
   1365    "outputs": [
   1366     {
   1367      "name": "stdout",
   1368      "output_type": "stream",
   1369      "text": [
   1370       "The task starts execution at [s]:  1.9683\n",
   1371       "Window of interest:  (1.9682999999999993, 3.9682999999999993)\n"
   1372      ]
   1373     }
   1374    ],
   1375    "source": [
   1376     "# Let's find when the task starts\n",
   1377     "start = sa.getStartTime()\n",
   1378     "first_phase = (start, start+2)\n",
   1379     "\n",
   1380     "print \"The task starts execution at [s]: \", start\n",
   1381     "print \"Window of interest: \", first_phase"
   1382    ]
   1383   },
   1384   {
   1385    "cell_type": "markdown",
   1386    "metadata": {
   1387     "hidden": true
   1388    },
   1389    "source": [
   1390     "#### Use the SchedAssert module to check the task load in that period"
   1391    ]
   1392   },
   1393   {
   1394    "cell_type": "code",
   1395    "execution_count": 30,
   1396    "metadata": {
   1397     "collapsed": false,
   1398     "hidden": true
   1399    },
   1400    "outputs": [
   1401     {
   1402      "name": "stdout",
   1403      "output_type": "stream",
   1404      "text": [
   1405       "FAIL: Task duty-cycle is 18.11125% in the [2,4] execution window\n"
   1406      ]
   1407     }
   1408    ],
   1409    "source": [
   1410     "import operator\n",
   1411     "\n",
   1412     "# Check the task duty cycle in the second step window\n",
   1413     "if sa.assertDutyCycle(10, operator.lt, window=first_phase):\n",
   1414     "    print \"PASS: Task duty-cycle is {}% in the [2,4] execution window\"\\\n",
   1415     "          .format(sa.getDutyCycle(first_phase))\n",
   1416     "else:\n",
   1417     "    print \"FAIL: Task duty-cycle is {}% in the [2,4] execution window\"\\\n",
   1418     "          .format(sa.getDutyCycle(first_phase))"
   1419    ]
   1420   },
   1421   {
   1422    "cell_type": "markdown",
   1423    "metadata": {
   1424     "hidden": true
   1425    },
   1426    "source": [
   1427     "This test fails because we have not considered a scaling factor due running at a lower OPP.\n",
   1428     "\n",
   1429     "To write a portable test we need to account for that condition!"
   1430    ]
   1431   },
   1432   {
   1433    "cell_type": "markdown",
   1434    "metadata": {
   1435     "hidden": true
   1436    },
   1437    "source": [
   1438     "#### Take OPP scaling into consideration"
   1439    ]
   1440   },
   1441   {
   1442    "cell_type": "code",
   1443    "execution_count": 31,
   1444    "metadata": {
   1445     "collapsed": false,
   1446     "hidden": true
   1447    },
   1448    "outputs": [
   1449     {
   1450      "name": "stdout",
   1451      "output_type": "stream",
   1452      "text": [
   1453       "LITTLEs capacities range:  (236, 447)\n",
   1454       "LITTLE's min capacity scale:  0.527964205817\n"
   1455      ]
   1456     }
   1457    ],
   1458    "source": [
   1459     "# Get LITTLEs capacities ranges:\n",
   1460     "littles = platform['clusters']['little']\n",
   1461     "little_capacities = cap_df[cap_df.cpu.isin(littles)].capacity\n",
   1462     "min_cap = little_capacities.min()\n",
   1463     "max_cap = little_capacities.max()\n",
   1464     "print \"LITTLEs capacities range: \", (min_cap, max_cap)\n",
   1465     "\n",
   1466     "# Get min OPP correction factor\n",
   1467     "min_little_scale = 1.0 * min_cap / max_cap\n",
   1468     "print \"LITTLE's min capacity scale: \", min_little_scale"
   1469    ]
   1470   },
   1471   {
   1472    "cell_type": "code",
   1473    "execution_count": 33,
   1474    "metadata": {
   1475     "collapsed": false,
   1476     "hidden": true
   1477    },
   1478    "outputs": [
   1479     {
   1480      "name": "stdout",
   1481      "output_type": "stream",
   1482      "text": [
   1483       "Scaled target duty-cycle:  18.9406779661\n",
   1484       "1% tolerance scaled duty-cycle:  19.1300847458\n"
   1485      ]
   1486     }
   1487    ],
   1488    "source": [
   1489     "# Scale the target duty-cycle according to the min OPP\n",
   1490     "target_dutycycle = 10 / min_little_scale\n",
   1491     "print \"Scaled target duty-cycle: \", target_dutycycle\n",
   1492     "\n",
   1493     "\n",
   1494     "target_dutycycle = 1.01 * target_dutycycle\n",
   1495     "\n",
   1496     "print \"1% tolerance scaled duty-cycle: \", target_dutycycle"
   1497    ]
   1498   },
   1499   {
   1500    "cell_type": "markdown",
   1501    "metadata": {
   1502     "hidden": true
   1503    },
   1504    "source": [
   1505     "#### Write a more portable assertion"
   1506    ]
   1507   },
   1508   {
   1509    "cell_type": "code",
   1510    "execution_count": 34,
   1511    "metadata": {
   1512     "collapsed": false,
   1513     "hidden": true
   1514    },
   1515    "outputs": [
   1516     {
   1517      "name": "stdout",
   1518      "output_type": "stream",
   1519      "text": [
   1520       "PASS: Task duty-cycle is 9.56209172258% in the [2,4] execution window\n"
   1521      ]
   1522     }
   1523    ],
   1524    "source": [
   1525     "# Add a 1% tolerance to our scaled target dutycycle\n",
   1526     "if sa.assertDutyCycle(1.01 * target_dutycycle, operator.lt, window=first_phase):\n",
   1527     "    print \"PASS: Task duty-cycle is {}% in the [2,4] execution window\"\\\n",
   1528     "          .format(sa.getDutyCycle(first_phase) * min_little_scale)\n",
   1529     "else:\n",
   1530     "    print \"FAIL: Task duty-cycle is {}% in the [2,4] execution window\"\\\n",
   1531     "          .format(sa.getDutyCycle(first_phase) * min_little_scale)"
   1532    ]
   1533   },
   1534   {
   1535    "cell_type": "markdown",
   1536    "metadata": {
   1537     "hidden": true
   1538    },
   1539    "source": [
   1540     "### Is the task migrated once we exceed the LITTLE CPUs capacity?"
   1541    ]
   1542   },
   1543   {
   1544    "cell_type": "markdown",
   1545    "metadata": {
   1546     "hidden": true
   1547    },
   1548    "source": [
   1549     "#### Check that the task is switching the cluster once expected"
   1550    ]
   1551   },
   1552   {
   1553    "cell_type": "code",
   1554    "execution_count": 35,
   1555    "metadata": {
   1556     "collapsed": false,
   1557     "hidden": true
   1558    },
   1559    "outputs": [
   1560     {
   1561      "name": "stdout",
   1562      "output_type": "stream",
   1563      "text": [
   1564       "PASS: Task switches to big within:  (5.8682999999999996, 6.0682999999999989)\n"
   1565      ]
   1566     }
   1567    ],
   1568    "source": [
   1569     "# Consider a 100 [ms] window for the task to migrate\n",
   1570     "delta = 0.1\n",
   1571     "\n",
   1572     "# Defined the window of interest\n",
   1573     "switch_window=(start+4-delta, start+4+delta)\n",
   1574     "\n",
   1575     "if sa.assertSwitch(\"cluster\",\n",
   1576     "             platform['clusters']['little'],\n",
   1577     "             platform['clusters']['big'],\n",
   1578     "             window=switch_window):\n",
   1579     "    print \"PASS: Task switches to big within: \", switch_window\n",
   1580     "else:\n",
   1581     "    print \"PASS: Task DOES NO switches to big within: \", switch_window"
   1582    ]
   1583   },
   1584   {
   1585    "cell_type": "markdown",
   1586    "metadata": {
   1587     "hidden": true
   1588    },
   1589    "source": [
   1590     "#### Check that the task is running most of its time on the LITTLE cluster"
   1591    ]
   1592   },
   1593   {
   1594    "cell_type": "code",
   1595    "execution_count": 36,
   1596    "metadata": {
   1597     "collapsed": false,
   1598     "hidden": true
   1599    },
   1600    "outputs": [
   1601     {
   1602      "name": "stdout",
   1603      "output_type": "stream",
   1604      "text": [
   1605       "PASS: Task exectuion on LITTLEs is 53.1% (less than 66% of its execution time)\n"
   1606      ]
   1607     }
   1608    ],
   1609    "source": [
   1610     "import operator\n",
   1611     "\n",
   1612     "if sa.assertResidency(\"cluster\", platform['clusters']['little'], 66, operator.le, percent=True):\n",
   1613     "    print \"PASS: Task exectuion on LITTLEs is {:.1f}% (less than 66% of its execution time)\".\\\n",
   1614     "        format(sa.getResidency(\"cluster\", platform['clusters']['little'], percent=True))\n",
   1615     "else:\n",
   1616     "    print \"FAIL: Task run on LITTLE for MORE than 66% of its execution time\""
   1617    ]
   1618   },
   1619   {
   1620    "cell_type": "markdown",
   1621    "metadata": {
   1622     "collapsed": true,
   1623     "hidden": true
   1624    },
   1625    "source": [
   1626     "### Check that the util estimation is properly computed and CPU capacity matches"
   1627    ]
   1628   },
   1629   {
   1630    "cell_type": "code",
   1631    "execution_count": 7,
   1632    "metadata": {
   1633     "collapsed": false,
   1634     "hidden": true
   1635    },
   1636    "outputs": [],
   1637    "source": [
   1638     "start = 2\n",
   1639     "last_phase = (start+4, start+6)\n",
   1640     "\n",
   1641     "analyzer_config = {\n",
   1642     "    \"SCALE\" : 1024,\n",
   1643     "    \"BOOST\" : 15,\n",
   1644     "}\n",
   1645     "\n",
   1646     "# Verify that the margin is properly computed for each event:\n",
   1647     "# margin := (scale - util) * boost\n",
   1648     "margin_check_statement = \"(((SCALE - sched_boost_task:util) * BOOST) // 100) == sched_boost_task:margin\""
   1649    ]
   1650   },
   1651   {
   1652    "cell_type": "code",
   1653    "execution_count": 8,
   1654    "metadata": {
   1655     "collapsed": false,
   1656     "hidden": true
   1657    },
   1658    "outputs": [],
   1659    "source": [
   1660     "from bart.common.Analyzer import Analyzer\n",
   1661     "\n",
   1662     "# Create an Assertion Object\n",
   1663     "a = Analyzer(trace.ftrace,\n",
   1664     "             analyzer_config,\n",
   1665     "             window=last_phase,\n",
   1666     "             filters={\"comm\": \"task_ramp\"})"
   1667    ]
   1668   },
   1669   {
   1670    "cell_type": "code",
   1671    "execution_count": 9,
   1672    "metadata": {
   1673     "collapsed": false,
   1674     "hidden": true
   1675    },
   1676    "outputs": [
   1677     {
   1678      "name": "stdout",
   1679      "output_type": "stream",
   1680      "text": [
   1681       "PASS: Margin properly computed in :  (6, 8)\n"
   1682      ]
   1683     }
   1684    ],
   1685    "source": [
   1686     "if a.assertStatement(margin_check_statement):\n",
   1687     "    print \"PASS: Margin properly computed in : \", last_phase\n",
   1688     "else:\n",
   1689     "    print \"FAIL: Margin NOT properly computed in : \", last_phase"
   1690    ]
   1691   },
   1692   {
   1693    "cell_type": "markdown",
   1694    "metadata": {
   1695     "hidden": true
   1696    },
   1697    "source": [
   1698     "#### Check that the CPU capacity matches the task boosted value"
   1699    ]
   1700   },
   1701   {
   1702    "cell_type": "code",
   1703    "execution_count": 10,
   1704    "metadata": {
   1705     "collapsed": false,
   1706     "hidden": true
   1707    },
   1708    "outputs": [],
   1709    "source": [
   1710     "# Get the two dataset of interest\n",
   1711     "df1 = trace.data_frame.trace_event('cpu_capacity')[['cpu', 'capacity']]\n",
   1712     "df2 = trace.data_frame.trace_event('boost_task_rtapp')[['__cpu', 'boosted_util']]\n",
   1713     "\n",
   1714     "# Join the information from these two\n",
   1715     "df3 = df2.join(df1, how='outer')\n",
   1716     "df3 = df3.fillna(method='ffill')\n",
   1717     "df3 = df3[df3.__cpu == df3.cpu]\n",
   1718     "#df3.ix[start+4:start+6,].head()"
   1719    ]
   1720   },
   1721   {
   1722    "cell_type": "code",
   1723    "execution_count": 11,
   1724    "metadata": {
   1725     "collapsed": false,
   1726     "hidden": true
   1727    },
   1728    "outputs": [
   1729     {
   1730      "data": {
   1731       "text/plain": [
   1732        "19"
   1733       ]
   1734      },
   1735      "execution_count": 11,
   1736      "metadata": {},
   1737      "output_type": "execute_result"
   1738     }
   1739    ],
   1740    "source": [
   1741     "len(df3[df3.boosted_util >= df3.capacity])"
   1742    ]
   1743   },
   1744   {
   1745    "cell_type": "markdown",
   1746    "metadata": {
   1747     "hidden": true
   1748    },
   1749    "source": [
   1750     "##### Do it the TRAPpy way"
   1751    ]
   1752   },
   1753   {
   1754    "cell_type": "code",
   1755    "execution_count": 12,
   1756    "metadata": {
   1757     "collapsed": false,
   1758     "hidden": true
   1759    },
   1760    "outputs": [
   1761     {
   1762      "data": {
   1763       "text/plain": [
   1764        "True"
   1765       ]
   1766      },
   1767      "execution_count": 12,
   1768      "metadata": {},
   1769      "output_type": "execute_result"
   1770     }
   1771    ],
   1772    "source": [
   1773     "# Create the TRAPpy class\n",
   1774     "trace.ftrace.add_parsed_event('rtapp_capacity_check', df3)\n",
   1775     "# Define pivoting value\n",
   1776     "trace.ftrace.rtapp_capacity_check.pivot = 'cpu'\n",
   1777     "\n",
   1778     "# Create an Assertion\n",
   1779     "a = Analyzer(trace.ftrace,\n",
   1780     "             {\"CAP\" : trace.ftrace.rtapp_capacity_check},\n",
   1781     "             window=(start+4.1, start+6))\n",
   1782     "a.assertStatement(\"CAP:capacity >= CAP:boosted_util\")"
   1783    ]
   1784   },
   1785   {
   1786    "cell_type": "markdown",
   1787    "metadata": {
   1788     "hidden": true
   1789    },
   1790    "source": [
   1791     "## Going further on events processing"
   1792    ]
   1793   },
   1794   {
   1795    "cell_type": "markdown",
   1796    "metadata": {
   1797     "hidden": true
   1798    },
   1799    "source": [
   1800     "### What are the relative residency on different OPPs?"
   1801    ]
   1802   },
   1803   {
   1804    "cell_type": "markdown",
   1805    "metadata": {
   1806     "hidden": true
   1807    },
   1808    "source": [
   1809     "We are not limited to the usage of pre-defined functions. We can exploit the full power of PANDAS to process the DataFrames to extract all kind of information we want."
   1810    ]
   1811   },
   1812   {
   1813    "cell_type": "markdown",
   1814    "metadata": {
   1815     "hidden": true
   1816    },
   1817    "source": [
   1818     "#### Use PANDAs APIs to filter and aggregate events"
   1819    ]
   1820   },
   1821   {
   1822    "cell_type": "code",
   1823    "execution_count": 40,
   1824    "metadata": {
   1825     "collapsed": false,
   1826     "hidden": true
   1827    },
   1828    "outputs": [
   1829     {
   1830      "name": "stdout",
   1831      "output_type": "stream",
   1832      "text": [
   1833       "Residency time per OPP:\n",
   1834       "Freq     450000Hz :  59.3%\n",
   1835       "Freq     575000Hz :  11.7%\n",
   1836       "Freq     700000Hz :  19.5%\n",
   1837       "Freq     775000Hz :   8.8%\n",
   1838       "Freq     850000Hz :   0.6%\n"
   1839      ]
   1840     }
   1841    ],
   1842    "source": [
   1843     "import pandas as pd\n",
   1844     "\n",
   1845     "# Focus on cpu_frequency events for CPU0\n",
   1846     "df = trace.data_frame.trace_event('cpu_frequency')\n",
   1847     "df = df[df.cpu == 0]\n",
   1848     "\n",
   1849     "# Compute the residency on each OPP before switching to the next one\n",
   1850     "df.loc[:,'start'] = df.index\n",
   1851     "df.loc[:,'delta'] = (df['start'] - df['start'].shift()).fillna(0).shift(-1)\n",
   1852     "\n",
   1853     "# Group by frequency and sum-up the deltas\n",
   1854     "freq_residencies = df.groupby('frequency')['delta'].sum()\n",
   1855     "print \"Residency time per OPP:\"\n",
   1856     "df = pd.DataFrame(freq_residencies)\n",
   1857     "\n",
   1858     "df.head()\n",
   1859     "\n",
   1860     "# Compute the relative residency time\n",
   1861     "tot = sum(freq_residencies)\n",
   1862     "#df = df.apply(lambda delta : 100*delta/tot)\n",
   1863     "for f in freq_residencies.index:\n",
   1864     "    print \"Freq {:10d}Hz : {:5.1f}%\".format(f, 100*freq_residencies[f]/tot)"
   1865    ]
   1866   },
   1867   {
   1868    "cell_type": "markdown",
   1869    "metadata": {
   1870     "hidden": true
   1871    },
   1872    "source": [
   1873     "#### Use MathPlot Lib to generate all kind of plot from collected data"
   1874    ]
   1875   },
   1876   {
   1877    "cell_type": "code",
   1878    "execution_count": 44,
   1879    "metadata": {
   1880     "collapsed": false,
   1881     "hidden": true
   1882    },
   1883    "outputs": [
   1884     {
   1885      "data": {
   1886       "image/png": "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\nE5/4BBdddBFrr70222+/PQDnnXce22yzDRMnTuSFL3whX/7yl4e99r4LwXRqngBUVT0MnAX8Dnhl\nkp0H/3oN8pAkSZIkLc28efM44IADePvb387MmTM55JBDuOSSS0jC9ddfzxFHHMG5557Lww8/zNFH\nH81+++3H/Pnz/+wce+21F6eddhpTpkzhscce4/rrrwdgo4024sorr2TWrFmcd955nHDCCU9/Nlz6\nLgRX1YPAd4DDkmxeVY8AFwILgP16WpwkSZIkjXFXX301CxYs4Pjjj2eVVVbhoIMO4uUvfzlVxbnn\nnsvRRx/Ny1/+cpJw+OGH85znPIerr776WeepqmcNod57773ZaqutANhtt93YY489+PGPfzys9fdF\nCE6yZ5IPJDk2yUTgouajNyXZoqpmAp8GdkqyUe8qlSRJkqSx7b777mPTTTf9s/e22GILAO68807+\n8R//kUmTJj39uOeee7jvvvuGdO5p06bxqle9ivXXX59Jkybxb//2bzz00EPDWv+oD8FJXgN8gU6n\nd1vgamAhcDmwIXBSkh2A19JZ6OuJHpUqSZIkSWPeJptswr333vtn7915550AbLbZZnzoQx9i5syZ\nTz9mz57Nm970pmedZ/H1mJ588kkOOuggPvCBD/DHP/6RmTNnsvfeew/7glujPgQDLwcuraqzqurd\nwKXAt4Df05kPvOjnUcCxVTWrZ5VKkiRJ0hi30047MX78eD772c8yf/58Lr30Uq699lqScNRRR/Gl\nL32Ja665hqpizpw5XHnllcyePftZ59l444254447ng658+bNY968eTz3uc9l3LhxTJs2jR/84AfD\nXn8/hOBfAasnWRegqk4H/gP4d2BOVZ0F7A8cUFXX9a5MSZIkSRr7Vl11VS699FLOP/981l9/fS6+\n+GIOOuggAHbYYQfOPfdcjj32WNZbbz1e9KIXccEFFyxxF55DDjkEgPXXX58dd9yRtddem89+9rMc\neuihrLfeenzrW99i//33H/b6Mxr3ckqyOfBYVc1MsiGdha++W1VfGnDMucB/VtU3luO8NfgK0Omb\n/a0kSZIkjU3Js3PJSGzn2i9ZaEn/fAa8v8x/UOO7VtUKSnIgcAowK8k1wBXA0cBlzf/o321WiH4U\nWLdnhUqSJEnSCOqXgDrajapOcJINgOnAkcAcYEfgYOBTwN3AOc3P8cAuwIFVdfNynN9OsCRJkqRR\n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\nTkSuQmCC\n",
   1887       "text/plain": [
   1888        "<matplotlib.figure.Figure at 0x7f8b58536910>"
   1889       ]
   1890      },
   1891      "metadata": {},
   1892      "output_type": "display_data"
   1893     }
   1894    ],
   1895    "source": [
   1896     "# Plot residency time\n",
   1897     "import matplotlib.pyplot as plt\n",
   1898     "\n",
   1899     "fig, axes = plt.subplots(1, 1, figsize=(16, 5));\n",
   1900     "df.plot(kind='barh', ax=axes, title=\"Frequency residency\", rot=45);"
   1901    ]
   1902   },
   1903   {
   1904    "cell_type": "markdown",
   1905    "metadata": {
   1906     "hidden": true
   1907    },
   1908    "source": [
   1909     "<br><br><br><br>\n",
   1910     "Advanced DataFrame usage: filtering by columns/rows, merging tables, plotting data<br>\n",
   1911     "[notebooks/tutorial/05_TrappyUsage.ipynb](05_TrappyUsage.ipynb)\n",
   1912     "<br><br><br><br>"
   1913    ]
   1914   },
   1915   {
   1916    "cell_type": "markdown",
   1917    "metadata": {},
   1918    "source": [
   1919     "# Remote target connection and control"
   1920    ]
   1921   },
   1922   {
   1923    "cell_type": "markdown",
   1924    "metadata": {
   1925     "hidden": true
   1926    },
   1927    "source": [
   1928     "Using LISA APIs to control a remote device and run custom workloads"
   1929    ]
   1930   },
   1931   {
   1932    "cell_type": "markdown",
   1933    "metadata": {
   1934     "hidden": true
   1935    },
   1936    "source": [
   1937     "## Configure the connection"
   1938    ]
   1939   },
   1940   {
   1941    "cell_type": "code",
   1942    "execution_count": null,
   1943    "metadata": {
   1944     "collapsed": true,
   1945     "hidden": true
   1946    },
   1947    "outputs": [],
   1948    "source": [
   1949     "# Setup a target configuration\n",
   1950     "conf = {\n",
   1951     "    \n",
   1952     "    # Target is localhost\n",
   1953     "    \"platform\"    : 'linux',\n",
   1954     "    \"board\"       : \"juno\",\n",
   1955     "    \n",
   1956     "    # Login credentials\n",
   1957     "    \"host\"        : \"192.168.0.1\",\n",
   1958     "    \"username\"    : \"root\",\n",
   1959     "    \"password\"    : \"\",\n",
   1960     "\n",
   1961     "    # Binary tools required to run this experiment\n",
   1962     "    # These tools must be present in the tools/ folder for the architecture\n",
   1963     "    \"tools\"   : ['rt-app', 'taskset', 'trace-cmd'],\n",
   1964     "    \n",
   1965     "    # Comment the following line to force rt-app calibration on your target\n",
   1966     "    \"rtapp-calib\" : {\n",
   1967     "       \"0\": 355, \"1\": 138, \"2\": 138, \"3\": 355, \"4\": 354, \"5\": 354\n",
   1968     "    },\n",
   1969     "    \n",
   1970     "    # FTrace events end buffer configuration\n",
   1971     "    \"ftrace\"  : {\n",
   1972     "        \"events\" : [\n",
   1973     "            \"sched_switch\",\n",
   1974     "            \"sched_wakeup\",\n",
   1975     "            \"sched_wakeup_new\",\n",
   1976     "            \"sched_overutilized\",\n",
   1977     "            \"sched_contrib_scale_f\",\n",
   1978     "            \"sched_load_avg_cpu\",\n",
   1979     "            \"sched_load_avg_task\",\n",
   1980     "            \"sched_tune_config\",\n",
   1981     "            \"sched_tune_tasks_update\",\n",
   1982     "            \"sched_tune_boostgroup_update\",\n",
   1983     "            \"sched_tune_filter\",\n",
   1984     "            \"sched_boost_cpu\",\n",
   1985     "            \"sched_boost_task\",\n",
   1986     "            \"sched_energy_diff\",\n",
   1987     "            \"cpu_frequency\",\n",
   1988     "            \"cpu_capacity\",\n",
   1989     "         ],\n",
   1990     "         \"buffsize\" : 10240\n",
   1991     "    },\n",
   1992     "\n",
   1993     "    # Where results are collected\n",
   1994     "    \"results_dir\" : \"SchedTuneAnalysis\",\n",
   1995     "\n",
   1996     "    # Devlib module required (or not required)\n",
   1997     "    'modules' : [ \"cpufreq\", \"cgroups\" ],\n",
   1998     "    #\"exclude_modules\" : [ \"hwmon\" ],\n",
   1999     "}"
   2000    ]
   2001   },
   2002   {
   2003    "cell_type": "markdown",
   2004    "metadata": {
   2005     "hidden": true
   2006    },
   2007    "source": [
   2008     "## Setup the connection"
   2009    ]
   2010   },
   2011   {
   2012    "cell_type": "code",
   2013    "execution_count": null,
   2014    "metadata": {
   2015     "collapsed": true,
   2016     "hidden": true
   2017    },
   2018    "outputs": [],
   2019    "source": [
   2020     "# Support to access the remote target\n",
   2021     "from env import TestEnv\n",
   2022     "\n",
   2023     "# Initialize a test environment using:\n",
   2024     "# the provided target configuration (my_target_conf)\n",
   2025     "# the provided test configuration   (my_test_conf)\n",
   2026     "te = TestEnv(conf)\n",
   2027     "target = te.target\n",
   2028     "\n",
   2029     "print \"DONE\""
   2030    ]
   2031   },
   2032   {
   2033    "cell_type": "markdown",
   2034    "metadata": {
   2035     "hidden": true
   2036    },
   2037    "source": [
   2038     "## Target control"
   2039    ]
   2040   },
   2041   {
   2042    "cell_type": "markdown",
   2043    "metadata": {
   2044     "hidden": true
   2045    },
   2046    "source": [
   2047     "### Run custom commands"
   2048    ]
   2049   },
   2050   {
   2051    "cell_type": "code",
   2052    "execution_count": null,
   2053    "metadata": {
   2054     "collapsed": true,
   2055     "hidden": true
   2056    },
   2057    "outputs": [],
   2058    "source": [
   2059     "# Enable Energy-Aware scheduler\n",
   2060     "target.execute(\"echo ENERGY_AWARE > /sys/kernel/debug/sched_features\");\n",
   2061     "target.execute(\"echo UTIL_EST > /sys/kernel/debug/sched_features\");\n",
   2062     "\n",
   2063     "# Check which sched_feature are enabled\n",
   2064     "sched_features = target.read_value(\"/sys/kernel/debug/sched_features\");\n",
   2065     "print \"sched_features:\"\n",
   2066     "print sched_features"
   2067    ]
   2068   },
   2069   {
   2070    "cell_type": "markdown",
   2071    "metadata": {
   2072     "hidden": true
   2073    },
   2074    "source": [
   2075     "### Example CPUFreq configuration"
   2076    ]
   2077   },
   2078   {
   2079    "cell_type": "code",
   2080    "execution_count": null,
   2081    "metadata": {
   2082     "collapsed": true,
   2083     "hidden": true
   2084    },
   2085    "outputs": [],
   2086    "source": [
   2087     "target.cpufreq.set_all_governors('sched');\n",
   2088     "\n",
   2089     "# Check which governor is enabled on each CPU\n",
   2090     "enabled_governors =  target.cpufreq.get_all_governors()\n",
   2091     "print enabled_governors"
   2092    ]
   2093   },
   2094   {
   2095    "cell_type": "markdown",
   2096    "metadata": {
   2097     "hidden": true
   2098    },
   2099    "source": [
   2100     "### Example of CGruops configuration"
   2101    ]
   2102   },
   2103   {
   2104    "cell_type": "code",
   2105    "execution_count": null,
   2106    "metadata": {
   2107     "collapsed": true,
   2108     "hidden": true
   2109    },
   2110    "outputs": [],
   2111    "source": [
   2112     "schedtune = target.cgroups.controller('schedtune')\n",
   2113     "\n",
   2114     "# Configure a 50% boostgroup\n",
   2115     "boostgroup = schedtune.cgroup('/boosted')\n",
   2116     "boostgroup.set(boost=25)\n",
   2117     "\n",
   2118     "# Dump the configuraiton of each groups\n",
   2119     "cgroups = schedtune.list_all()\n",
   2120     "for cgname in cgroups:\n",
   2121     "    cgroup = schedtune.cgroup(cgname)\n",
   2122     "    attrs = cgroup.get()\n",
   2123     "    boost = attrs['boost']\n",
   2124     "    print '{}:{:<15} boost: {}'.format(schedtune.kind, cgroup.name, boost)"
   2125    ]
   2126   },
   2127   {
   2128    "cell_type": "markdown",
   2129    "metadata": {},
   2130    "source": [
   2131     "# Remote workloads execution"
   2132    ]
   2133   },
   2134   {
   2135    "cell_type": "markdown",
   2136    "metadata": {
   2137     "hidden": true
   2138    },
   2139    "source": [
   2140     "## Generate RTApp configurations"
   2141    ]
   2142   },
   2143   {
   2144    "cell_type": "code",
   2145    "execution_count": null,
   2146    "metadata": {
   2147     "collapsed": true,
   2148     "hidden": true
   2149    },
   2150    "outputs": [],
   2151    "source": [
   2152     "# RTApp configurator for generation of PERIODIC tasks\n",
   2153     "from wlgen import RTA, Periodic, Ramp\n",
   2154     "\n",
   2155     "# Create a new RTApp workload generator using the calibration values\n",
   2156     "# reported by the TestEnv module\n",
   2157     "rtapp = RTA(target, 'test', calibration=te.calibration())\n",
   2158     "\n",
   2159     "# Ramp workload\n",
   2160     "ramp = Ramp(\n",
   2161     "    start_pct=10,\n",
   2162     "    end_pct=60,\n",
   2163     "    delta_pct=25,\n",
   2164     "    time_s=2,\n",
   2165     "    period_ms=32\n",
   2166     ")\n",
   2167     "\n",
   2168     "# Configure this RTApp instance to:\n",
   2169     "rtapp.conf(\n",
   2170     "\n",
   2171     "    # 1. generate a \"profile based\" set of tasks\n",
   2172     "    kind = 'profile',\n",
   2173     "    \n",
   2174     "    # 2. define the \"profile\" of each task\n",
   2175     "    params = {\n",
   2176     "        \n",
   2177     "        # 3. Composed task\n",
   2178     "        'task_ramp': ramp.get(),\n",
   2179     "    },\n",
   2180     "    \n",
   2181     "    #loadref='big',\n",
   2182     "    loadref='LITTLE',\n",
   2183     "    run_dir=target.working_directory\n",
   2184     "    \n",
   2185     ");"
   2186    ]
   2187   },
   2188   {
   2189    "cell_type": "markdown",
   2190    "metadata": {
   2191     "hidden": true
   2192    },
   2193    "source": [
   2194     "## Execution and tracing"
   2195    ]
   2196   },
   2197   {
   2198    "cell_type": "code",
   2199    "execution_count": null,
   2200    "metadata": {
   2201     "collapsed": true,
   2202     "hidden": true
   2203    },
   2204    "outputs": [],
   2205    "source": [
   2206     "def execute(te, wload, res_dir, cg='/'):\n",
   2207     "    \n",
   2208     "    logging.info('# Setup FTrace')\n",
   2209     "    te.ftrace.start()\n",
   2210     "\n",
   2211     "    if te.emeter:\n",
   2212     "        logging.info('## Start energy sampling')\n",
   2213     "        te.emeter.reset()\n",
   2214     "\n",
   2215     "    logging.info('### Start RTApp execution')\n",
   2216     "    wload.run(out_dir=res_dir, cgroup=cg)\n",
   2217     "\n",
   2218     "    if te.emeter:\n",
   2219     "        logging.info('## Read energy consumption: %s/energy.json', res_dir)\n",
   2220     "        nrg_report = te.emeter.report(out_dir=res_dir)\n",
   2221     "    else:\n",
   2222     "        nrg_report = None\n",
   2223     "\n",
   2224     "    logging.info('# Stop FTrace')\n",
   2225     "    te.ftrace.stop()\n",
   2226     "\n",
   2227     "    trace_file = os.path.join(res_dir, 'trace.dat')\n",
   2228     "    logging.info('# Save FTrace: %s', trace_file)\n",
   2229     "    te.ftrace.get_trace(trace_file)\n",
   2230     "\n",
   2231     "    logging.info('# Save platform description: %s/platform.json', res_dir)\n",
   2232     "    plt, plt_file = te.platform_dump(res_dir)\n",
   2233     "    \n",
   2234     "    logging.info('# Report collected data:')\n",
   2235     "    logging.info('   %s', res_dir)\n",
   2236     "    !tree {res_dir}\n",
   2237     "    \n",
   2238     "    return nrg_report, plt, plt_file, trace_file"
   2239    ]
   2240   },
   2241   {
   2242    "cell_type": "code",
   2243    "execution_count": null,
   2244    "metadata": {
   2245     "collapsed": true,
   2246     "hidden": true
   2247    },
   2248    "outputs": [],
   2249    "source": [
   2250     "nrg_report, plt, plt_file, trace_file = execute(te, rtapp, te.res_dir, cg=boostgroup.name)"
   2251    ]
   2252   },
   2253   {
   2254    "cell_type": "markdown",
   2255    "metadata": {},
   2256    "source": [
   2257     "# Regression testing support"
   2258    ]
   2259   },
   2260   {
   2261    "cell_type": "markdown",
   2262    "metadata": {
   2263     "hidden": true
   2264    },
   2265    "source": [
   2266     "Writing and running regression tests using the LISA API"
   2267    ]
   2268   },
   2269   {
   2270    "cell_type": "markdown",
   2271    "metadata": {
   2272     "hidden": true
   2273    },
   2274    "source": [
   2275     "## Defined configurations to test and workloads"
   2276    ]
   2277   },
   2278   {
   2279    "cell_type": "code",
   2280    "execution_count": 116,
   2281    "metadata": {
   2282     "collapsed": false,
   2283     "hidden": true
   2284    },
   2285    "outputs": [
   2286     {
   2287      "name": "stdout",
   2288      "output_type": "stream",
   2289      "text": [
   2290       "{\r\n",
   2291       "    /* Devlib modules to enable/disbale for all the experiments */\r\n",
   2292       "    \"modules\"         : [ \"cpufreq\", \"cgroups\" ],\r\n",
   2293       "    \"exclude_modules\" : [ ],\r\n",
   2294       "\r\n",
   2295       "    /* Binary tools required by the experiments */\r\n",
   2296       "    \"tools\"    : [ \"rt-app\" ],\r\n",
   2297       "\r\n",
   2298       "    /* FTrace configuration */\r\n",
   2299       "    \"ftrace\" : {\r\n",
   2300       "        \"events\" : [\r\n",
   2301       "            \"sched_switch\",\r\n",
   2302       "            \"sched_contrib_scale_f\",\r\n",
   2303       "            \"sched_load_avg_cpu\",\r\n",
   2304       "            \"sched_load_avg_task\",\r\n",
   2305       "            \"sched_tune_config\",\r\n",
   2306       "            \"sched_tune_tasks_update\",\r\n",
   2307       "            \"sched_tune_boostgroup_update\",\r\n",
   2308       "            \"sched_tune_filter\",\r\n",
   2309       "            \"sched_boost_cpu\",\r\n",
   2310       "            \"sched_boost_task\",\r\n",
   2311       "            \"sched_energy_diff\",\r\n",
   2312       "            \"cpu_frequency\",\r\n",
   2313       "            \"cpu_capacity\",\r\n",
   2314       "        ],\r\n",
   2315       "        \"buffsize\" : 10240,\r\n",
   2316       "    },\r\n",
   2317       "\r\n",
   2318       "    /* Set of platform configurations to test */\r\n",
   2319       "    \"confs\" : [\r\n",
   2320       "        {\r\n",
   2321       "            \"tag\" : \"noboost\",\r\n",
   2322       "            \"flags\" : \"ftrace\",\r\n",
   2323       "            \"sched_features\" : \"ENERGY_AWARE\",\r\n",
   2324       "            \"cpufreq\" : { \"governor\" : \"sched\" },\r\n",
   2325       "            \"cgroups\" : {\r\n",
   2326       "                \"conf\" : {\r\n",
   2327       "                    \"schedtune\" : {\r\n",
   2328       "                        \"/\"      : {\"boost\" :  0 },\r\n",
   2329       "                        \"/stune\" : {\"boost\" :  0 },\r\n",
   2330       "                    }\r\n",
   2331       "                },\r\n",
   2332       "                \"default\" : \"/\",\r\n",
   2333       "            }\r\n",
   2334       "        },\r\n",
   2335       "        {\r\n",
   2336       "            \"tag\" : \"boost15\",\r\n",
   2337       "            \"flags\" : \"ftrace\",\r\n",
   2338       "            \"sched_features\" : \"ENERGY_AWARE\",\r\n",
   2339       "            \"cpufreq\" : { \"governor\" : \"sched\" },\r\n",
   2340       "\t    \"cgroups\" : {\r\n",
   2341       "                \"conf\" : {\r\n",
   2342       "                    \"schedtune\" : {\r\n",
   2343       "                        \"/\"      : {\"boost\" :  0 },\r\n",
   2344       "                        \"/stune\" : {\"boost\" : 15 },\r\n",
   2345       "                    }\r\n",
   2346       "                },\r\n",
   2347       "                \"default\" : \"/stune\",\r\n",
   2348       "            }\r\n",
   2349       "        },\r\n",
   2350       "        {\r\n",
   2351       "            \"tag\" : \"boost30\",\r\n",
   2352       "            \"flags\" : \"ftrace\",\r\n",
   2353       "            \"sched_features\" : \"ENERGY_AWARE\",\r\n",
   2354       "            \"cpufreq\" : { \"governor\" : \"sched\" },\r\n",
   2355       "\t    \"cgroups\" : {\r\n",
   2356       "                \"conf\" : {\r\n",
   2357       "                    \"schedtune\" : {\r\n",
   2358       "                        \"/\"      : {\"boost\" :  0 },\r\n",
   2359       "                        \"/stune\" : {\"boost\" : 30 },\r\n",
   2360       "                    }\r\n",
   2361       "                },\r\n",
   2362       "                \"default\" : \"/stune\",\r\n",
   2363       "            }\r\n",
   2364       "        },\r\n",
   2365       "        {\r\n",
   2366       "            \"tag\" : \"boost60\",\r\n",
   2367       "            \"flags\" : \"ftrace\",\r\n",
   2368       "            \"sched_features\" : \"ENERGY_AWARE\",\r\n",
   2369       "            \"cpufreq\" : { \"governor\" : \"sched\" },\r\n",
   2370       "\t    \"cgroups\" : {\r\n",
   2371       "                \"conf\" : {\r\n",
   2372       "                    \"schedtune\" : {\r\n",
   2373       "                        \"/\"      : {\"boost\" :  0 },\r\n",
   2374       "                        \"/stune\" : {\"boost\" : 60 },\r\n",
   2375       "                    }\r\n",
   2376       "                },\r\n",
   2377       "                \"default\" : \"/stune\",\r\n",
   2378       "            }\r\n",
   2379       "        }\r\n",
   2380       "\r\n",
   2381       "    ],\r\n",
   2382       "\r\n",
   2383       "    /* Set of workloads to run on each platform configuration */\r\n",
   2384       "    \"wloads\" : {\r\n",
   2385       "        \"mixprof\" : {\r\n",
   2386       "            \"type\": \"rt-app\",\r\n",
   2387       "            \"conf\" : {\r\n",
   2388       "                \"class\"  : \"profile\",\r\n",
   2389       "                \"params\"  : {\r\n",
   2390       "                    \"r5_10-60\" : {\r\n",
   2391       "                        \"kind\"   : \"Ramp\",\r\n",
   2392       "                        \"params\" : {\r\n",
   2393       "                            \"period_ms\" : 16,\r\n",
   2394       "                            \"start_pct\" :  5,\r\n",
   2395       "                            \"end_pct\"   : 60,\r\n",
   2396       "                            \"delta_pct\" :  5,\r\n",
   2397       "                            \"time_s\"    :  1,\r\n",
   2398       "                         }\r\n",
   2399       "                    }\r\n",
   2400       "                }\r\n",
   2401       "            },\r\n",
   2402       "            \"loadref\" : \"LITTLE\",\r\n",
   2403       "        }\r\n",
   2404       "    },\r\n",
   2405       "\r\n",
   2406       "    /* Number of iterations for each workload */\r\n",
   2407       "    \"iterations\" : 1,\r\n",
   2408       "\r\n",
   2409       "}\r\n",
   2410       "\r\n",
   2411       "// vim :set tabstop=4 shiftwidth=4 expandtab\r\n"
   2412      ]
   2413     }
   2414    ],
   2415    "source": [
   2416     "stune_smoke_test = '../../tests/stune/smoke_test_ramp.config'\n",
   2417     "!cat {stune_smoke_test}"
   2418    ]
   2419   },
   2420   {
   2421    "cell_type": "markdown",
   2422    "metadata": {
   2423     "hidden": true
   2424    },
   2425    "source": [
   2426     "## Write Test Cases"
   2427    ]
   2428   },
   2429   {
   2430    "cell_type": "code",
   2431    "execution_count": 120,
   2432    "metadata": {
   2433     "collapsed": false,
   2434     "hidden": true
   2435    },
   2436    "outputs": [
   2437     {
   2438      "name": "stdout",
   2439      "output_type": "stream",
   2440      "text": [
   2441       "# SPDX-License-Identifier: Apache-2.0\r\n",
   2442       "#\r\n",
   2443       "# Copyright (C) 2015, ARM Limited and contributors.\r\n",
   2444       "#\r\n",
   2445       "# Licensed under the Apache License, Version 2.0 (the \"License\"); you may\r\n",
   2446       "# not use this file except in compliance with the License.\r\n",
   2447       "# You may obtain a copy of the License at\r\n",
   2448       "#\r\n",
   2449       "# http://www.apache.org/licenses/LICENSE-2.0\r\n",
   2450       "#\r\n",
   2451       "# Unless required by applicable law or agreed to in writing, software\r\n",
   2452       "# distributed under the License is distributed on an \"AS IS\" BASIS, WITHOUT\r\n",
   2453       "# WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\r\n",
   2454       "# See the License for the specific language governing permissions and\r\n",
   2455       "# limitations under the License.\r\n",
   2456       "#\r\n",
   2457       "\r\n",
   2458       "import logging\r\n",
   2459       "import os\r\n",
   2460       "\r\n",
   2461       "from test import LisaTest\r\n",
   2462       "\r\n",
   2463       "import trappy\r\n",
   2464       "from bart.common.Analyzer import Analyzer\r\n",
   2465       "\r\n",
   2466       "TESTS_DIRECTORY = os.path.dirname(os.path.realpath(__file__))\r\n",
   2467       "TESTS_CONF = os.path.join(TESTS_DIRECTORY, \"smoke_test_ramp.config\")\r\n",
   2468       "\r\n",
   2469       "class STune(LisaTest):\r\n",
   2470       "    \"\"\"Tests for SchedTune framework\"\"\"\r\n",
   2471       "\r\n",
   2472       "    @classmethod\r\n",
   2473       "    def setUpClass(cls, *args, **kwargs):\r\n",
   2474       "        super(STune, cls)._init(TESTS_CONF, *args, **kwargs)\r\n",
   2475       "\r\n",
   2476       "    def test_boosted_utilization_signal(self):\r\n",
   2477       "        \"\"\"The boosted utilization signal is appropriately boosted\r\n",
   2478       "\r\n",
   2479       "        The margin should match the formula\r\n",
   2480       "        (sched_load_scale - util) * boost\"\"\"\r\n",
   2481       "\r\n",
   2482       "        for tc in self.conf[\"confs\"]:\r\n",
   2483       "            test_id = tc[\"tag\"]\r\n",
   2484       "\r\n",
   2485       "            wload_idx = self.conf[\"wloads\"].keys()[0]\r\n",
   2486       "            run_dir = os.path.join(self.te.res_dir,\r\n",
   2487       "                                   \"rtapp:{}:{}\".format(test_id, wload_idx),\r\n",
   2488       "                                   \"1\")\r\n",
   2489       "\r\n",
   2490       "            ftrace_events = [\"sched_boost_task\"]\r\n",
   2491       "            ftrace = trappy.FTrace(run_dir, scope=\"custom\",\r\n",
   2492       "                                   events=ftrace_events)\r\n",
   2493       "\r\n",
   2494       "            first_task_params = self.conf[\"wloads\"][wload_idx][\"conf\"][\"params\"]\r\n",
   2495       "            first_task_name = first_task_params.keys()[0]\r\n",
   2496       "            rta_task_name = \"task_{}\".format(first_task_name)\r\n",
   2497       "\r\n",
   2498       "            sbt_dfr = ftrace.sched_boost_task.data_frame\r\n",
   2499       "            boost_task_rtapp = sbt_dfr[sbt_dfr.comm == rta_task_name]\r\n",
   2500       "            ftrace.add_parsed_event(\"boost_task_rtapp\", boost_task_rtapp)\r\n",
   2501       "\r\n",
   2502       "            # Avoid the first period as the task starts with a very\r\n",
   2503       "            # high load and it overutilizes the CPU\r\n",
   2504       "            rtapp_period = first_task_params[first_task_name][\"params\"][\"period_ms\"]\r\n",
   2505       "            task_start = boost_task_rtapp.index[0]\r\n",
   2506       "            after_first_period = task_start + (rtapp_period / 1000.)\r\n",
   2507       "\r\n",
   2508       "            boost = tc[\"cgroups\"][\"conf\"][\"schedtune\"][\"/stune\"][\"boost\"] / 100.\r\n",
   2509       "            analyzer_const = {\r\n",
   2510       "                \"SCHED_LOAD_SCALE\": 1024,\r\n",
   2511       "                \"BOOST\": boost,\r\n",
   2512       "            }\r\n",
   2513       "            analyzer = Analyzer(ftrace, analyzer_const,\r\n",
   2514       "                                window=(after_first_period, None))\r\n",
   2515       "            statement = \"(((SCHED_LOAD_SCALE - boost_task_rtapp:util) * BOOST) // 100) == boost_task_rtapp:margin\"\r\n",
   2516       "            error_msg = \"task was not boosted to the expected margin: {}\".\\\r\n",
   2517       "                        format(boost)\r\n",
   2518       "            self.assertTrue(analyzer.assertStatement(statement), msg=error_msg)\r\n",
   2519       "\r\n",
   2520       "# vim :set tabstop=4 shiftwidth=4 expandtab\r\n"
   2521      ]
   2522     }
   2523    ],
   2524    "source": [
   2525     "stune_smoke_test = '../../tests/stune/smoke_test_ramp.py'\n",
   2526     "!cat {stune_smoke_test}"
   2527    ]
   2528   },
   2529   {
   2530    "cell_type": "markdown",
   2531    "metadata": {
   2532     "hidden": true
   2533    },
   2534    "source": [
   2535     "## Tests execution"
   2536    ]
   2537   },
   2538   {
   2539    "cell_type": "markdown",
   2540    "metadata": {
   2541     "hidden": true
   2542    },
   2543    "source": [
   2544     "The execution of a test can be triggered from a LISA shell using nosetest with the test class as a parameter. This command:\n",
   2545     "\n",
   2546     "```bash\n",
   2547     "$ nosetests -v tests/stune/smoke_test_ramp.py\n",
   2548     "```\n",
   2549     "\n",
   2550     "will execute all the tests described in the **smoke_test_ramp.py** module and collect all the products in a timestamp named subfolder of the results folder.\n",
   2551     "Tests PASS/FAILURE is reported after the completion of each test execution."
   2552    ]
   2553   },
   2554   {
   2555    "cell_type": "markdown",
   2556    "metadata": {
   2557     "hidden": true
   2558    },
   2559    "source": [
   2560     "## Results reporting"
   2561    ]
   2562   },
   2563   {
   2564    "cell_type": "markdown",
   2565    "metadata": {},
   2566    "source": [
   2567     "Detailed results of the experiments which compares also some base configurations with each test configuration can be reported in a tablular format using this command:\n",
   2568     "\n",
   2569     "```bash\n",
   2570     "$ lisa-report --base noboost --tests '(boost15|boost30|boost60)'\n",
   2571     "```\n"
   2572    ]
   2573   },
   2574   {
   2575    "cell_type": "markdown",
   2576    "metadata": {
   2577     "hidden": true
   2578    },
   2579    "source": [
   2580     "<img  src=\"SchedTune_SmokeTestResults.png\"/>"
   2581    ]
   2582   }
   2583  ],
   2584  "metadata": {
   2585   "kernelspec": {
   2586    "display_name": "Python 2",
   2587    "language": "python",
   2588    "name": "python2"
   2589   },
   2590   "language_info": {
   2591    "codemirror_mode": {
   2592     "name": "ipython",
   2593     "version": 2
   2594    },
   2595    "file_extension": ".py",
   2596    "mimetype": "text/x-python",
   2597    "name": "python",
   2598    "nbconvert_exporter": "python",
   2599    "pygments_lexer": "ipython2",
   2600    "version": "2.7.9"
   2601   },
   2602   "toc": {
   2603    "toc_cell": false,
   2604    "toc_number_sections": true,
   2605    "toc_threshold": 6,
   2606    "toc_window_display": false
   2607   }
   2608  },
   2609  "nbformat": 4,
   2610  "nbformat_minor": 0
   2611 }
   2612