{ "cells": [ { "cell_type": "markdown", "id": "91c974e2", "metadata": { "papermill": { "duration": 0.002479, "end_time": "2024-04-05T18:05:44.274834", "exception": false, "start_time": "2024-04-05T18:05:44.272355", "status": "completed" }, "tags": [] }, "source": [ "# Thicket and Extra-P: Thicket Tutorial\n", "\n", "Thicket is a python-based toolkit for Exploratory Data Analysis (EDA) of parallel performance data that enables performance optimization and understanding of applications’ performance on supercomputers. It bridges the performance tool gap between being able to consider only a single instance of a simulation run (e.g., single platform, single measurement tool, or single scale) and finding actionable insights in multi-dimensional, multi-scale, multi-architecture, and multi-tool performance datasets.\n", "\n", "This notebook provides an example for using Thicket's modeling feature. The modeling capability relies on _Extra-P_ - a tool for empirical performance modeling. It can perform N-parameter modeling with up to 3 parameters (N <= 3). The models follow a so-called _Performance Model Normal Form (PMNF)_ that expresses models as a summation of polynomial and logarithmic terms. One of the biggest advantages of this modeling method is that the produced models are human-readable and easily understandable.\n", "\n", "## 1. Import Necessary Packages\n", "\n", "To explore the capabilities of thicket with Extra-P, we begin by importing necessary packages." ] }, { "cell_type": "code", "execution_count": 1, "id": "b367937a", "metadata": { "execution": { "iopub.execute_input": "2024-04-05T18:05:44.278956Z", "iopub.status.busy": "2024-04-05T18:05:44.278821Z", "iopub.status.idle": "2024-04-05T18:05:44.874956Z", "shell.execute_reply": "2024-04-05T18:05:44.874605Z" }, "papermill": { "duration": 0.599043, "end_time": "2024-04-05T18:05:44.875742", "exception": false, "start_time": "2024-04-05T18:05:44.276699", "status": "completed" }, "tags": [] }, "outputs": [ { "data": { "application/javascript": [ "var Roundtrip_Obj = {};\n", "var refresh_cycle = false;\n", "var clicked_cell = null;\n", "var cached_cells = Jupyter.notebook.get_cell_elements();\n", "\n", "/**\n", " * @name unindentPyCode\n", " * @description Removes leading indentations from a python code string.\n", " * \n", " * @param {string} code Python code in string form\n", " * @returns Passed code string but with no leading indentations\n", " */\n", "function unindentPyCode(code){\n", " let uicode = code.split('\\n');\n", " let indent = 0;\n", "\n", " uicode.forEach((l,i, arr)=>{\n", " if(i == 0){\n", " indent = l.search(/\\S/);\n", " }\n", " arr[i] = l.slice(indent);\n", " })\n", " uicode = uicode.join('\\n');\n", " return uicode;\n", "}\n", "\n", "/**\n", " * @name buildPythonAssignment\n", " * @description Builds up a python code string which assigns javascript data back into jypyter notebook namespace\n", " * \n", " * @param {string} val This is data assigned back to the python code\n", " * @param {string} py_var This is the variable into which val is assigned\n", " * @param {string} converter This is a definition of a python function which translates data back to the desired format\n", " * @returns The python code to be run in the jupyter shell\n", " */\n", "function buildPythonAssignment(val, py_var, converter){\n", " // console.log(val, py_var, converter);\n", " var holder = `'${val}'`;\n", " var code = `${unindentPyCode(converter.code)}`\n", " code += `\\ntmp = ${holder}`;\n", " code += `\\n${py_var} = ${converter.name}(tmp)`\n", "\n", " return code\n", "}\n", "\n", "/**\n", " * @name manageNewCell\n", " * \n", " * @description Increments all two way bound cell ids by the number of new cells which proceed them. \n", " * Ex. Adding one cell at position 2 will increment a bound cell at position 3 from 3->4. \n", " * \n", " * @param {array} newCells A list of our current cells in the notebook to be compared against cached cells\n", " * @param {} obj The current roundtrip object containing all data bindings\n", " */\n", "function manageNewCell(newCells, obj){\n", " let newIds = [];\n", "\n", " Object.keys(newCells).forEach(function(i){\n", " if(!Object.values(cached_cells).includes(newCells[i]) && !isNaN(i)){\n", " newIds.push(i);\n", " }\n", " });\n", "\n", " //increment all bindings past each new id\n", " for(let js_var in obj){\n", " for(let id of newIds){\n", " for(let key in obj[js_var][\"two_way\"]){\n", " obj[js_var][\"two_way\"][key].forEach((two_way_id, i) => {\n", " if(two_way_id > id){\n", " obj[js_var][\"two_way\"][key][i] += 1;\n", " }\n", " });\n", " }\n", " } \n", " }\n", "\n", " cached_cells = newCells;\n", "}\n", "\n", "function manageDeletedCell(newCells, obj){\n", " let deletedId = null;\n", " \n", " for(i of Object.keys(cachedCells)){\n", " if (cached_cells[i] !== newCells[i]){\n", " deletedId = i;\n", " break;\n", " }\n", " }\n", "\n", "}\n", "\n", "\n", "function bindClickDetectToCells(){\n", " let cells = Jupyter.notebook.get_cell_elements();\n", "\n", " for(let i in Object.keys(cells)){\n", " let cell = cells[i];\n", "\n", " if(cell !== undefined){\n", " cell.addEventListener('mousedown', () => {\n", " clicked_cell = i;\n", " }, true)\n", " }\n", " }\n", "}\n", "\n", "bindClickDetectToCells();\n", "\n", "/**\n", " * @name RT_Handler\n", " * @description A wrapper for our roundtrip object. It is called as a proxy for the\n", " * roundtrip object defined above. This enables us to define custom call backs for\n", " * gets and sets on the roundtrip object. The custom set handles necessary data conversion,\n", " * the registering of two-way bound variables and automatic updating of watched cells. The get\n", " * allows users to interact with the underlying object without worrying about the proxy.\n", " */\n", "var RT_Handler = {\n", " set(obj, prop, value){\n", " //Do cell housekeeping\n", "\n", "\n", " //Initial pass of value into roundtrip object\n", " // from python code; there may be multiple different\n", " // visualizations of the same type we need to catch\n", " if (typeof value === 'object' && value.hasOwnProperty('origin') && value.origin == 'INIT'){\n", " \n", " /**\n", " * In this code block we need to check if there is already a \n", " * an array of id's which are two way bound already defined and \n", " * add to it or remove from it\n", " */\n", " let ida = Jupyter.notebook.get_selected_index()-1;\n", " value.id = ida;\n", " let new_val = value;\n", "\n", " // Block updating bindings while jupyter is running\n", " if(refresh_cycle){\n", " new_val = obj[prop];\n", " new_val.data = value.data;\n", " return Reflect.set(obj, prop, new_val);\n", " }\n", "\n", " /**\n", " * The broad case where we are updating bindings \n", " * on existing data\n", " */\n", " if(obj[prop] != undefined){\n", " new_val = obj[prop];\n", " new_val.data = value.data;\n", " new_val.converter = value.converter;\n", "\n", " // If there is no two way array, create one\n", " // Else push on our new id\n", " if(value.two_way === true){\n", " if(!Object.keys(new_val.two_way).includes(value['python_var'])){\n", " new_val.two_way[value['python_var']] = [];\n", " }\n", "\n", " let pybinding = new_val.two_way[value['python_var']];\n", "\n", " if(!pybinding.includes(value.id)){\n", " pybinding.push(value.id);\n", " }\n", "\n", " }\n", "\n", " //Deregister a cell id from being two-way bound now\n", " else if(value.two_way === false && Object.keys(new_val.two_way).includes(value['python_var'])){\n", " let pybinding = new_val.two_way[value['python_var']];\n", " const index = pybinding.indexOf(value.id);\n", " \n", " if (index > -1) {\n", " pybinding.splice(index, 1);\n", " }\n", " }\n", " }\n", "\n", " //Initalize a new two-way object if\n", " // one did not exist\n", " else{\n", " if(new_val.two_way == true){\n", " new_val.two_way = {};\n", " new_val.two_way[value['python_var']] = [value.id];\n", " }\n", " else{\n", " new_val.two_way = {};\n", " }\n", " delete new_val.id;\n", " delete new_val.from_py;\n", " delete new_val.python_var;\n", " }\n", "\n", " return Reflect.set(obj, prop, new_val);\n", " }\n", " //Assignment from javascript code\n", " else {\n", " // TODO: make the py/js data identification object a\n", " // formal class\n", " if(obj[prop] === undefined){\n", " obj[prop] = {\n", " two_way: {},\n", " origin: \"JS\",\n", " data: null,\n", " python_var: \"\",\n", " converter: null,\n", " type: typeof(value)\n", " }\n", " }\n", "\n", " var execable_cells = [];\n", " let origin = 'STANDARD';\n", " let python_var = '';\n", "\n", " if (typeof value === 'object' && \n", " value.hasOwnProperty('origin') && \n", " value.origin == 'PYASSIGN'){\n", "\n", " origin = value.origin;\n", " python_var = value.python_var;\n", " value = value.data;\n", " }\n", "\n", " //TODO: Replace with imported, webpacked D3\n", " require(['https://d3js.org/d3.v4.min.js'], function(d3) {\n", "\n", " // When 2 way bound this calls automatically when something changes\n", " if (obj[prop] !== undefined && Object.keys(obj[prop][\"two_way\"]).length > 0){\n", "\n", " let current_cell = Number(clicked_cell);\n", " let py_var = '';\n", "\n", " //ust set the data without updating if our current cell is not two way bound\n", " if(origin == 'STANDARD'){\n", " let found = false;\n", " for(let key in obj[prop][\"two_way\"]){\n", " if (obj[prop][\"two_way\"][key].includes(current_cell)){\n", " found = true;\n", " py_var = key;\n", " }\n", " }\n", "\n", " if(!found){\n", " return Reflect.set(obj[prop], \"data\", value);\n", " }\n", " }\n", "\n", "\n", " if(origin == 'PYASSIGN'){\n", " py_var = python_var;\n", " }\n", "\n", "\n", " /**\n", " * We now have a list of registered cells we can execute.\n", " * So we look through our javascript variables to see if they\n", " * are bound to the same py variable as our current assignment\n", " * TODO: Make this list update when cells are moved up or down\n", " */\n", "\n", " for(let js_var in obj){\n", " let boundpyvars = Object.keys(obj[js_var][\"two_way\"]);\n", "\n", " if(boundpyvars.includes(py_var)){\n", " let clls = obj[js_var][\"two_way\"][py_var].filter(x => x != current_cell );\n", " execable_cells = execable_cells.concat(clls);\n", " }\n", " }\n", "\n", " if(origin == 'STANDARD'){\n", " // TODO:THROW AN ERROR IF CONVERTER == NONE\n", " const code = buildPythonAssignment(value, py_var, obj[prop][\"converter\"]);\n", " \n", " //TODO: Turn this into a function that manages error reporting and printing\n", " Jupyter.notebook.kernel.execute(code, { \n", " shell:{\n", " reply: function(r){\n", " //consider putting this in a reserved jupyter variable\n", " if(r.content.status == 'error'){\n", " console.error(`${r.content.ename} in JS->Python coversion:\\n ${r.content.evalue}`)\n", " }\n", " }\n", " }\n", " });\n", " }\n", "\n", " refresh_cycle = true;\n", " Jupyter.notebook.execute_cells(execable_cells);\n", "\n", " /**\n", " * Test every half second to see if some of the\n", " * jupyter cells are still running. Avoids a race condition\n", " * where incorrect ids were stored in our roundtrip object.\n", " */\n", " const test_running = function(){\n", " let runtest = d3.selectAll(\".running\");\n", " if(runtest.empty()){\n", " refresh_cycle = false;\n", " return;\n", " }\n", " else{\n", " setTimeout(test_running, 500);\n", " }\n", " }\n", "\n", " test_running();\n", " }\n", "\n", " });\n", " } \n", "\n", " return Reflect.set(obj[prop], \"data\", value);\n", " },\n", " get(obj, prop, reciever){\n", " let ret = obj[prop].data\n", " return ret; \n", " }\n", "}\n", "\n", "window.Roundtrip = new Proxy(Roundtrip_Obj, RT_Handler);\n" ], "text/plain": [ "" ] }, "metadata": {}, "output_type": "display_data" }, { "data": { "text/html": [ "" ], "text/plain": [ "" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "import sys\n", "\n", "import matplotlib.pyplot as plt\n", "import pandas as pd\n", "from IPython.display import display\n", "from IPython.display import HTML\n", "\n", "import thicket as th\n", "from thicket.model_extrap import Modeling\n", "\n", "display(HTML(\"\"))" ] }, { "cell_type": "markdown", "id": "527feb27", "metadata": { "papermill": { "duration": 0.001995, "end_time": "2024-04-05T18:05:44.879928", "exception": false, "start_time": "2024-04-05T18:05:44.877933", "status": "completed" }, "tags": [] }, "source": [ "## 2. Define Dataset Paths and Names\n", "\n", "In this example, we use an MPI scaling study, profiled with Caliper, that has metadata about the runs. The data is also already aggregated, which means we can provide the data to Extra-P as-is." ] }, { "cell_type": "code", "execution_count": 2, "id": "85f92be1", "metadata": { "execution": { "iopub.execute_input": "2024-04-05T18:05:44.884138Z", "iopub.status.busy": "2024-04-05T18:05:44.883971Z", "iopub.status.idle": "2024-04-05T18:05:44.987976Z", "shell.execute_reply": "2024-04-05T18:05:44.987595Z" }, "papermill": { "duration": 0.106791, "end_time": "2024-04-05T18:05:44.988577", "exception": false, "start_time": "2024-04-05T18:05:44.881786", "status": "completed" }, "tags": [] }, "outputs": [ { "name": "stderr", "output_type": "stream", "text": [ "/opt/conda/lib/python3.9/site-packages/thicket/ensemble.py:319: FutureWarning: A value is trying to be set on a copy of a DataFrame or Series through chained assignment using an inplace method.\n", "The behavior will change in pandas 3.0. This inplace method will never work because the intermediate object on which we are setting values always behaves as a copy.\n", "\n", "For example, when doing 'df[col].method(value, inplace=True)', try using 'df.method({col: value}, inplace=True)' or df[col] = df[col].method(value) instead, to perform the operation inplace on the original object.\n", "\n", "\n", " perfdata[col].replace({fill_value: None}, inplace=True)\n" ] } ], "source": [ "data = \"../data/mpi_scaling_cali\"\n", "t_ens = th.Thicket.from_caliperreader(data, disable_tqdm=True)" ] }, { "cell_type": "markdown", "id": "a7a13750", "metadata": { "papermill": { "duration": 0.001902, "end_time": "2024-04-05T18:05:44.992675", "exception": false, "start_time": "2024-04-05T18:05:44.990773", "status": "completed" }, "tags": [] }, "source": [ "Specifically, the metadata table for this set of profiles contains a `jobsize` column, which provides the amount of cores used for each profile." ] }, { "cell_type": "code", "execution_count": 3, "id": "90d2d4bc", "metadata": { "execution": { "iopub.execute_input": "2024-04-05T18:05:44.996737Z", "iopub.status.busy": "2024-04-05T18:05:44.996640Z", "iopub.status.idle": "2024-04-05T18:05:44.999858Z", "shell.execute_reply": "2024-04-05T18:05:44.999592Z" }, "papermill": { "duration": 0.005969, "end_time": "2024-04-05T18:05:45.000393", "exception": false, "start_time": "2024-04-05T18:05:44.994424", "status": "completed" }, "scrolled": true, "tags": [] }, "outputs": [ { "data": { "text/plain": [ "profile\n", "27654391 64\n", "91138395 343\n", "368928273 27\n", "964810492 216\n", "1734033023 125\n", "Name: jobsize, dtype: int64" ] }, "execution_count": 3, "metadata": {}, "output_type": "execute_result" } ], "source": [ "t_ens.metadata[\"jobsize\"]" ] }, { "cell_type": "markdown", "id": "c06a799b", "metadata": { "papermill": { "duration": 0.001808, "end_time": "2024-04-05T18:05:45.004165", "exception": false, "start_time": "2024-04-05T18:05:45.002357", "status": "completed" }, "tags": [] }, "source": [ "## 3. More Information on a Function\n", "***\n", "You can use the `help()` method within Python to see the information for a given object. You can do this by typing `help(object)`. \n", "This will allow you to see the arguments for the function, and what will be returned. An example is below." ] }, { "cell_type": "code", "execution_count": 4, "id": "156eb968", "metadata": { "execution": { "iopub.execute_input": "2024-04-05T18:05:45.008289Z", "iopub.status.busy": "2024-04-05T18:05:45.008194Z", "iopub.status.idle": "2024-04-05T18:05:45.010913Z", "shell.execute_reply": "2024-04-05T18:05:45.010582Z" }, "papermill": { "duration": 0.005348, "end_time": "2024-04-05T18:05:45.011425", "exception": false, "start_time": "2024-04-05T18:05:45.006077", "status": "completed" }, "tags": [] }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "Help on class Modeling in module thicket.model_extrap:\n", "\n", "class Modeling(builtins.object)\n", " | Modeling(tht, param_name, params=None, chosen_metrics=None)\n", " | \n", " | Produce models for all the metrics across the given graphframes.\n", " | \n", " | Methods defined here:\n", " | \n", " | __init__(self, tht, param_name, params=None, chosen_metrics=None)\n", " | Create a new model object.\n", " | \n", " | Adds a model column for each metric for each common frame across all the\n", " | graphframes.\n", " | \n", " | The given list of params contains the parameters to build the models. For\n", " | example, MPI ranks, input sizes, and so on.\n", " | \n", " | Arguments:\n", " | tht (Thicket): thicket object\n", " | param_name (str): arbitrary if 'params' is being provided, otherwise name of\n", " | the metadata column from which 'params' will be extracted\n", " | params (list): parameters list, domain for the model\n", " | chosen_metrics (list): metrics to be evaluated in the model, range for the\n", " | model\n", " | \n", " | componentize_statsframe(self, columns=None)\n", " | Componentize multiple Extra-P modeling objects in the aggregated statistics\n", " | table\n", " | \n", " | Arguments:\n", " | column (list): list of column names in the aggregated statistics table to\n", " | componentize. Values must be of type 'thicket.model_extrap.ModelWrapper'.\n", " | \n", " | produce_models(self, agg_func=, add_stats=True)\n", " | Produces an Extra-P model. Models are generated by calling Extra-P's\n", " | ModelGenerator.\n", " | \n", " | Arguments:\n", " | agg_func (function): aggregation function to apply to multi-dimensional\n", " | measurement values. Extra-P v4.0.4 applies mean by default so that is\n", " | set here for clarity.\n", " | add_stats (bool): Option to add hypothesis function statistics to the\n", " | aggregated statistics table\n", " | \n", " | to_html(self, RSS=False)\n", " | \n", " | ----------------------------------------------------------------------\n", " | Data descriptors defined here:\n", " | \n", " | __dict__\n", " | dictionary for instance variables (if defined)\n", " | \n", " | __weakref__\n", " | list of weak references to the object (if defined)\n", "\n" ] } ], "source": [ "help(Modeling)" ] }, { "cell_type": "markdown", "id": "bdc699f7", "metadata": { "papermill": { "duration": 0.001865, "end_time": "2024-04-05T18:05:45.015137", "exception": false, "start_time": "2024-04-05T18:05:45.013272", "status": "completed" }, "tags": [] }, "source": [ "## 3. Create Models\n", "\n", "First, we construct the `Modeling` object by passing all the relevant data to it. We provide `jobsize` as the `param_name` argument so the model will grab this column from the metadata table to use as our parameter. We also sub-select some metrics, since this dataset has a lot of metrics (otherwise the modeling will take a long time to do all metrics).\n", "\n", "Then, we call `produce_models` on that object (it's unnecessary to provide an aggregation function since the data is already aggregated.).\n", "\n", "**NOTE:** For this example, you can view all the metric columns by adding a new cell and running: `t_ens.performance_cols`. " ] }, { "cell_type": "code", "execution_count": 5, "id": "7ddf3c43", "metadata": { "execution": { "iopub.execute_input": "2024-04-05T18:05:45.019101Z", "iopub.status.busy": "2024-04-05T18:05:45.019014Z", "iopub.status.idle": "2024-04-05T18:05:45.326992Z", "shell.execute_reply": "2024-04-05T18:05:45.326645Z" }, "papermill": { "duration": 0.310896, "end_time": "2024-04-05T18:05:45.327812", "exception": false, "start_time": "2024-04-05T18:05:45.016916", "status": "completed" }, "tags": [] }, "outputs": [], "source": [ "mdl = Modeling(\n", " t_ens,\n", " \"jobsize\",\n", " chosen_metrics=[\n", " \"Total time\",\n", " ],\n", ")\n", "\n", "mdl.produce_models()" ] }, { "cell_type": "markdown", "id": "4c46a91a", "metadata": { "papermill": { "duration": 0.001979, "end_time": "2024-04-05T18:05:45.332095", "exception": false, "start_time": "2024-04-05T18:05:45.330116", "status": "completed" }, "tags": [] }, "source": [ "## 4. Models Dataframe\n", "\n", "Model hypothesis functions are stored in thicket's aggregated statistics table." ] }, { "cell_type": "code", "execution_count": 6, "id": "00fae139", "metadata": { "execution": { "iopub.execute_input": "2024-04-05T18:05:45.336288Z", "iopub.status.busy": "2024-04-05T18:05:45.336163Z", "iopub.status.idle": "2024-04-05T18:05:45.345905Z", "shell.execute_reply": "2024-04-05T18:05:45.345663Z" }, "papermill": { "duration": 0.012561, "end_time": "2024-04-05T18:05:45.346478", "exception": false, "start_time": "2024-04-05T18:05:45.333917", "status": "completed" }, "scrolled": false, "tags": [] }, "outputs": [ { "data": { "text/html": [ "
\n", "\n", "\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
nameTotal time_extrap-modelTotal time_RSS_extrap-modelTotal time_rRSS_extrap-modelTotal time_SMAPE_extrap-modelTotal time_AR2_extrap-modelTotal time_RE_extrap-model
node
{'name': 'MPI_Allreduce', 'type': 'function'}MPI_Allreduce-0.0024835738301864883 + 4.6723137107329955e-0...2.373695e-0233.63854071.8547110.9828061.569021
{'name': 'MPI_Bcast', 'type': 'function'}MPI_Bcast0.005594622766668683 + 1.1211777143604538e-05 ...5.234884e-030.59284918.7754410.9941360.222561
{'name': 'MPI_Comm_dup', 'type': 'function'}MPI_Comm_dup0.20714199930961863 + 0.0003794872132338881 * ...1.468475e+011.45843950.3503160.3248600.467371
{'name': 'MPI_Comm_free', 'type': 'function'}MPI_Comm_free2.9748964461513302e-05 + 2.9632810629043044e-0...4.012398e-080.0263865.6976920.9953810.054844
{'name': 'MPI_Comm_split', 'type': 'function'}MPI_Comm_split0.0340992099469718 + 4.861767349462252e-07 * p...4.094649e+001.58479840.9277870.9047110.445655
{'name': 'MPI_Gather', 'type': 'function'}MPI_Gather1.1110717100841163e-05 + 1.875931772029739e-09...1.805567e-072.31945037.4106840.8576750.515782
{'name': 'MPI_Initialized', 'type': 'function'}MPI_Initialized-1.2157511991333312e-06 + 4.473650007736346e-0...2.079887e-090.0165954.5285700.9978570.046511
{'name': 'main', 'type': 'function'}main5.3345854025532375 + 50.4472239870803 * p^(1)1.428021e+070.13273115.6515880.8868930.157082
{'name': 'MPI_Barrier', 'type': 'function'}MPI_Barrier-3.8613044063814517 + 0.7228867130047671 * log...7.133681e+0080964.639853127.158285-0.33030265.337903
{'name': 'MPI_Irecv', 'type': 'function'}MPI_Irecv0.00016930423157778974 + 5.344486361848511e-05...5.902043e-040.0482328.4369750.9855370.084786
{'name': 'MPI_Isend', 'type': 'function'}MPI_Isend-0.7378766027055433 + 0.011372374310428854 * p...5.386096e-015023.40077280.3063040.93772419.620193
{'name': 'MPI_Reduce', 'type': 'function'}MPI_Reduce0.008950513364525873 + 2.1551606902927176e-05 ...1.756609e-0332.37198149.2513160.4369221.295318
{'name': 'MPI_Wait', 'type': 'function'}MPI_Wait-0.08273770855385487 + 0.0008985035981343798 *...2.613648e-0115.10642550.4781590.5678591.000543
{'name': 'MPI_Waitall', 'type': 'function'}MPI_Waitall0.01183241.275860e-03282.767881109.8102351.0000003.622031
{'name': 'lulesh.cycle', 'type': 'function'}lulesh.cycle6.361023656690073 + 50.40069659189232 * p^(1)1.431665e+070.13336215.6882030.8864070.157454
{'name': 'LagrangeLeapFrog', 'type': 'function'}LagrangeLeapFrog-588.7139217783075 + 118.0201880558251 * p^(4/5)3.026414e+060.0406477.6191680.9478710.076241
{'name': 'CalcTimeConstraintsForElems', 'type': 'function'}CalcTimeConstraintsForElems0.2912128378771341 + 0.15464468104595394 * p^(1)6.423611e-010.0102782.6712440.9994460.027639
{'name': 'LagrangeElements', 'type': 'function'}LagrangeElements55.8023570683435 + 12.21983926020424 * p^(1)2.180612e+050.0418618.9427280.9700600.089881
{'name': 'ApplyMaterialPropertiesForElems', 'type': 'function'}ApplyMaterialPropertiesForElems6.909192329599326 + 3.812718071421941 * p^(1)1.344775e+030.0019751.6402540.9980920.016486
{'name': 'EvalEOSForElems', 'type': 'function'}EvalEOSForElems7.437812732121266 + 3.719775901083089 * p^(1)1.057620e+030.0017011.5247140.9984240.015326
{'name': 'CalcEnergyForElems', 'type': 'function'}CalcEnergyForElems7.3616219620609575 + 2.352394804115736 * p^(1)1.943577e+020.0013041.4908330.9992750.015001
{'name': 'CalcLagrangeElements', 'type': 'function'}CalcLagrangeElements-3.807204897434417 + 1.5032184055481064 * p^(3...7.778453e+020.0023241.8596400.9981180.018461
{'name': 'CalcKinematicsForElems', 'type': 'function'}CalcKinematicsForElems-3.191063749981387 + 1.440739634475724 * p^(3/...9.575080e+020.0028451.9350650.9974780.019204
{'name': 'CalcQForElems', 'type': 'function'}CalcQForElems6.979231420889168 + 2.799033804303159 * p^(3/4...3.048464e+050.19182417.5974530.7952770.175135
{'name': 'CalcMonotonicQForElems', 'type': 'function'}CalcMonotonicQForElems-4.021092516288899 + 0.49595942520127567 * p^(...1.628638e+020.0144414.5350010.9963830.044701
{'name': 'MPI_Irecv', 'type': 'function'}MPI_Irecv0.020640239201916117 + 0.0009474689031858098 *...1.147505e-020.0032392.2998900.9975520.023065
{'name': 'MPI_Isend', 'type': 'function'}MPI_Isend-0.10548527169972247 + 0.004772194045454103 * ...1.151804e+000.0091423.7816700.9903290.038011
{'name': 'MPI_Wait', 'type': 'function'}MPI_Wait58.43177001577187 + 0.10805277471434777 * p^(3...2.687218e+052.30129546.138279-0.2657900.504422
{'name': 'MPI_Waitall', 'type': 'function'}MPI_Waitall-28.32003046236924 + 0.5649498323219662 * p^(1...1.854066e+037.73276640.0643320.8198840.720597
{'name': 'LagrangeNodal', 'type': 'function'}LagrangeNodal-501.7214996437166 + 103.6028442396303 * p^(3/4)1.307338e+060.0525329.5398950.9453550.096236
{'name': 'CalcForceForNodes', 'type': 'function'}CalcForceForNodes-483.43658919501837 + 94.44404618163018 * p^(3/4)7.615735e+050.0287876.3738360.9615020.063767
{'name': 'CalcVolumeForceForElems', 'type': 'function'}CalcVolumeForceForElems-8.924824714807004 + 18.087142774934236 * p^(1)4.205287e+040.0074813.2513600.9973490.033025
{'name': 'CalcHourglassControlForElems', 'type': 'function'}CalcHourglassControlForElems-18.407641701934274 + 15.299434861302805 * p^(1)3.933893e+040.0053483.0439180.9965350.030703
{'name': 'CalcFBHourglassForceForElems', 'type': 'function'}CalcFBHourglassForceForElems-3.454147978296185 + 1.9523476557370125 * p^(3...4.555233e+020.0074292.8565520.9993460.028786
{'name': 'IntegrateStressForElems', 'type': 'function'}IntegrateStressForElems-3.2210357806507735 + 1.3155188131276156 * p^(...9.669293e+020.0031832.2373800.9969460.022230
{'name': 'MPI_Irecv', 'type': 'function'}MPI_Irecv0.07139784821037228 + 0.0012913170911470285 * ...1.217607e-020.0386154.8343060.9994870.051334
{'name': 'MPI_Isend', 'type': 'function'}MPI_Isend-0.13477165012239584 + 0.006980575896793848 * ...4.308979e-010.0050762.8438890.9983060.028019
{'name': 'MPI_Wait', 'type': 'function'}MPI_Wait200.41963366.491636e+0423.56946857.9768501.0000000.401049
{'name': 'MPI_Waitall', 'type': 'function'}MPI_Waitall-60.47462228639048 + 15.850591840236687 * p^(2/3)2.200269e+05124572.01948070.4495040.19752770.913096
{'name': 'MPI_Irecv', 'type': 'function'}MPI_Irecv-0.05528188247031427 + 0.005354748856582524 * ...7.789738e-010.14424313.3363940.8562700.133853
{'name': 'MPI_Isend', 'type': 'function'}MPI_Isend-0.03796477449325472 + 0.00852182055673094 * p...9.730921e+000.17804317.4452650.8674480.182547
{'name': 'MPI_Wait', 'type': 'function'}MPI_Wait-98.98907610355376 + 23.56658785930815 * log2(...9.984181e+0393.16585673.120318-0.3601852.393805
{'name': 'MPI_Waitall', 'type': 'function'}MPI_Waitall-90.56809038671453 + 5.542383651985729 * log2(...6.315946e+042.82206637.003734-0.2146280.477486
{'name': 'TimeIncrement', 'type': 'function'}TimeIncrement108.79336164114378 + 0.41659851800619824 * p^(...5.231852e+060.68128434.8588600.6149040.339668
{'name': 'MPI_Allreduce', 'type': 'function'}MPI_Allreduce108.66456642370454 + 0.41649782186503276 * p^(...5.232565e+060.68166134.8620730.6146770.339689
\n", "
" ], "text/plain": [ " name \\\n", "node \n", "{'name': 'MPI_Allreduce', 'type': 'function'} MPI_Allreduce \n", "{'name': 'MPI_Bcast', 'type': 'function'} MPI_Bcast \n", "{'name': 'MPI_Comm_dup', 'type': 'function'} MPI_Comm_dup \n", "{'name': 'MPI_Comm_free', 'type': 'function'} MPI_Comm_free \n", "{'name': 'MPI_Comm_split', 'type': 'function'} MPI_Comm_split \n", "{'name': 'MPI_Gather', 'type': 'function'} MPI_Gather \n", "{'name': 'MPI_Initialized', 'type': 'function'} MPI_Initialized \n", "{'name': 'main', 'type': 'function'} main \n", "{'name': 'MPI_Barrier', 'type': 'function'} MPI_Barrier \n", "{'name': 'MPI_Irecv', 'type': 'function'} MPI_Irecv \n", "{'name': 'MPI_Isend', 'type': 'function'} MPI_Isend \n", "{'name': 'MPI_Reduce', 'type': 'function'} MPI_Reduce \n", "{'name': 'MPI_Wait', 'type': 'function'} MPI_Wait \n", "{'name': 'MPI_Waitall', 'type': 'function'} MPI_Waitall \n", "{'name': 'lulesh.cycle', 'type': 'function'} lulesh.cycle \n", "{'name': 'LagrangeLeapFrog', 'type': 'function'} LagrangeLeapFrog \n", "{'name': 'CalcTimeConstraintsForElems', 'type':... CalcTimeConstraintsForElems \n", "{'name': 'LagrangeElements', 'type': 'function'} LagrangeElements \n", "{'name': 'ApplyMaterialPropertiesForElems', 'ty... ApplyMaterialPropertiesForElems \n", "{'name': 'EvalEOSForElems', 'type': 'function'} EvalEOSForElems \n", "{'name': 'CalcEnergyForElems', 'type': 'function'} CalcEnergyForElems \n", "{'name': 'CalcLagrangeElements', 'type': 'funct... CalcLagrangeElements \n", "{'name': 'CalcKinematicsForElems', 'type': 'fun... CalcKinematicsForElems \n", "{'name': 'CalcQForElems', 'type': 'function'} CalcQForElems \n", "{'name': 'CalcMonotonicQForElems', 'type': 'fun... CalcMonotonicQForElems \n", "{'name': 'MPI_Irecv', 'type': 'function'} MPI_Irecv \n", "{'name': 'MPI_Isend', 'type': 'function'} MPI_Isend \n", "{'name': 'MPI_Wait', 'type': 'function'} MPI_Wait \n", "{'name': 'MPI_Waitall', 'type': 'function'} MPI_Waitall \n", "{'name': 'LagrangeNodal', 'type': 'function'} LagrangeNodal \n", "{'name': 'CalcForceForNodes', 'type': 'function'} CalcForceForNodes \n", "{'name': 'CalcVolumeForceForElems', 'type': 'fu... CalcVolumeForceForElems \n", "{'name': 'CalcHourglassControlForElems', 'type'... CalcHourglassControlForElems \n", "{'name': 'CalcFBHourglassForceForElems', 'type'... CalcFBHourglassForceForElems \n", "{'name': 'IntegrateStressForElems', 'type': 'fu... IntegrateStressForElems \n", "{'name': 'MPI_Irecv', 'type': 'function'} MPI_Irecv \n", "{'name': 'MPI_Isend', 'type': 'function'} MPI_Isend \n", "{'name': 'MPI_Wait', 'type': 'function'} MPI_Wait \n", "{'name': 'MPI_Waitall', 'type': 'function'} MPI_Waitall \n", "{'name': 'MPI_Irecv', 'type': 'function'} MPI_Irecv \n", "{'name': 'MPI_Isend', 'type': 'function'} MPI_Isend \n", "{'name': 'MPI_Wait', 'type': 'function'} MPI_Wait \n", "{'name': 'MPI_Waitall', 'type': 'function'} MPI_Waitall \n", "{'name': 'TimeIncrement', 'type': 'function'} TimeIncrement \n", "{'name': 'MPI_Allreduce', 'type': 'function'} MPI_Allreduce \n", "\n", " Total time_extrap-model \\\n", "node \n", "{'name': 'MPI_Allreduce', 'type': 'function'} -0.0024835738301864883 + 4.6723137107329955e-0... \n", "{'name': 'MPI_Bcast', 'type': 'function'} 0.005594622766668683 + 1.1211777143604538e-05 ... \n", "{'name': 'MPI_Comm_dup', 'type': 'function'} 0.20714199930961863 + 0.0003794872132338881 * ... \n", "{'name': 'MPI_Comm_free', 'type': 'function'} 2.9748964461513302e-05 + 2.9632810629043044e-0... \n", "{'name': 'MPI_Comm_split', 'type': 'function'} 0.0340992099469718 + 4.861767349462252e-07 * p... \n", "{'name': 'MPI_Gather', 'type': 'function'} 1.1110717100841163e-05 + 1.875931772029739e-09... \n", "{'name': 'MPI_Initialized', 'type': 'function'} -1.2157511991333312e-06 + 4.473650007736346e-0... \n", "{'name': 'main', 'type': 'function'} 5.3345854025532375 + 50.4472239870803 * p^(1) \n", "{'name': 'MPI_Barrier', 'type': 'function'} -3.8613044063814517 + 0.7228867130047671 * log... \n", "{'name': 'MPI_Irecv', 'type': 'function'} 0.00016930423157778974 + 5.344486361848511e-05... \n", "{'name': 'MPI_Isend', 'type': 'function'} -0.7378766027055433 + 0.011372374310428854 * p... \n", "{'name': 'MPI_Reduce', 'type': 'function'} 0.008950513364525873 + 2.1551606902927176e-05 ... \n", "{'name': 'MPI_Wait', 'type': 'function'} -0.08273770855385487 + 0.0008985035981343798 *... \n", "{'name': 'MPI_Waitall', 'type': 'function'} 0.0118324 \n", "{'name': 'lulesh.cycle', 'type': 'function'} 6.361023656690073 + 50.40069659189232 * p^(1) \n", "{'name': 'LagrangeLeapFrog', 'type': 'function'} -588.7139217783075 + 118.0201880558251 * p^(4/5) \n", "{'name': 'CalcTimeConstraintsForElems', 'type':... 0.2912128378771341 + 0.15464468104595394 * p^(1) \n", "{'name': 'LagrangeElements', 'type': 'function'} 55.8023570683435 + 12.21983926020424 * p^(1) \n", "{'name': 'ApplyMaterialPropertiesForElems', 'ty... 6.909192329599326 + 3.812718071421941 * p^(1) \n", "{'name': 'EvalEOSForElems', 'type': 'function'} 7.437812732121266 + 3.719775901083089 * p^(1) \n", "{'name': 'CalcEnergyForElems', 'type': 'function'} 7.3616219620609575 + 2.352394804115736 * p^(1) \n", "{'name': 'CalcLagrangeElements', 'type': 'funct... -3.807204897434417 + 1.5032184055481064 * p^(3... \n", "{'name': 'CalcKinematicsForElems', 'type': 'fun... -3.191063749981387 + 1.440739634475724 * p^(3/... \n", "{'name': 'CalcQForElems', 'type': 'function'} 6.979231420889168 + 2.799033804303159 * p^(3/4... \n", "{'name': 'CalcMonotonicQForElems', 'type': 'fun... -4.021092516288899 + 0.49595942520127567 * p^(... \n", "{'name': 'MPI_Irecv', 'type': 'function'} 0.020640239201916117 + 0.0009474689031858098 *... \n", "{'name': 'MPI_Isend', 'type': 'function'} -0.10548527169972247 + 0.004772194045454103 * ... \n", "{'name': 'MPI_Wait', 'type': 'function'} 58.43177001577187 + 0.10805277471434777 * p^(3... \n", "{'name': 'MPI_Waitall', 'type': 'function'} -28.32003046236924 + 0.5649498323219662 * p^(1... \n", "{'name': 'LagrangeNodal', 'type': 'function'} -501.7214996437166 + 103.6028442396303 * p^(3/4) \n", "{'name': 'CalcForceForNodes', 'type': 'function'} -483.43658919501837 + 94.44404618163018 * p^(3/4) \n", "{'name': 'CalcVolumeForceForElems', 'type': 'fu... -8.924824714807004 + 18.087142774934236 * p^(1) \n", "{'name': 'CalcHourglassControlForElems', 'type'... -18.407641701934274 + 15.299434861302805 * p^(1) \n", "{'name': 'CalcFBHourglassForceForElems', 'type'... -3.454147978296185 + 1.9523476557370125 * p^(3... \n", "{'name': 'IntegrateStressForElems', 'type': 'fu... -3.2210357806507735 + 1.3155188131276156 * p^(... \n", "{'name': 'MPI_Irecv', 'type': 'function'} 0.07139784821037228 + 0.0012913170911470285 * ... \n", "{'name': 'MPI_Isend', 'type': 'function'} -0.13477165012239584 + 0.006980575896793848 * ... \n", "{'name': 'MPI_Wait', 'type': 'function'} 200.4196336 \n", "{'name': 'MPI_Waitall', 'type': 'function'} -60.47462228639048 + 15.850591840236687 * p^(2/3) \n", "{'name': 'MPI_Irecv', 'type': 'function'} -0.05528188247031427 + 0.005354748856582524 * ... \n", "{'name': 'MPI_Isend', 'type': 'function'} -0.03796477449325472 + 0.00852182055673094 * p... \n", "{'name': 'MPI_Wait', 'type': 'function'} -98.98907610355376 + 23.56658785930815 * log2(... \n", "{'name': 'MPI_Waitall', 'type': 'function'} -90.56809038671453 + 5.542383651985729 * log2(... \n", "{'name': 'TimeIncrement', 'type': 'function'} 108.79336164114378 + 0.41659851800619824 * p^(... \n", "{'name': 'MPI_Allreduce', 'type': 'function'} 108.66456642370454 + 0.41649782186503276 * p^(... \n", "\n", " Total time_RSS_extrap-model \\\n", "node \n", "{'name': 'MPI_Allreduce', 'type': 'function'} 2.373695e-02 \n", "{'name': 'MPI_Bcast', 'type': 'function'} 5.234884e-03 \n", "{'name': 'MPI_Comm_dup', 'type': 'function'} 1.468475e+01 \n", "{'name': 'MPI_Comm_free', 'type': 'function'} 4.012398e-08 \n", "{'name': 'MPI_Comm_split', 'type': 'function'} 4.094649e+00 \n", "{'name': 'MPI_Gather', 'type': 'function'} 1.805567e-07 \n", "{'name': 'MPI_Initialized', 'type': 'function'} 2.079887e-09 \n", "{'name': 'main', 'type': 'function'} 1.428021e+07 \n", "{'name': 'MPI_Barrier', 'type': 'function'} 7.133681e+00 \n", "{'name': 'MPI_Irecv', 'type': 'function'} 5.902043e-04 \n", "{'name': 'MPI_Isend', 'type': 'function'} 5.386096e-01 \n", "{'name': 'MPI_Reduce', 'type': 'function'} 1.756609e-03 \n", "{'name': 'MPI_Wait', 'type': 'function'} 2.613648e-01 \n", "{'name': 'MPI_Waitall', 'type': 'function'} 1.275860e-03 \n", "{'name': 'lulesh.cycle', 'type': 'function'} 1.431665e+07 \n", "{'name': 'LagrangeLeapFrog', 'type': 'function'} 3.026414e+06 \n", "{'name': 'CalcTimeConstraintsForElems', 'type':... 6.423611e-01 \n", "{'name': 'LagrangeElements', 'type': 'function'} 2.180612e+05 \n", "{'name': 'ApplyMaterialPropertiesForElems', 'ty... 1.344775e+03 \n", "{'name': 'EvalEOSForElems', 'type': 'function'} 1.057620e+03 \n", "{'name': 'CalcEnergyForElems', 'type': 'function'} 1.943577e+02 \n", "{'name': 'CalcLagrangeElements', 'type': 'funct... 7.778453e+02 \n", "{'name': 'CalcKinematicsForElems', 'type': 'fun... 9.575080e+02 \n", "{'name': 'CalcQForElems', 'type': 'function'} 3.048464e+05 \n", "{'name': 'CalcMonotonicQForElems', 'type': 'fun... 1.628638e+02 \n", "{'name': 'MPI_Irecv', 'type': 'function'} 1.147505e-02 \n", "{'name': 'MPI_Isend', 'type': 'function'} 1.151804e+00 \n", "{'name': 'MPI_Wait', 'type': 'function'} 2.687218e+05 \n", "{'name': 'MPI_Waitall', 'type': 'function'} 1.854066e+03 \n", "{'name': 'LagrangeNodal', 'type': 'function'} 1.307338e+06 \n", "{'name': 'CalcForceForNodes', 'type': 'function'} 7.615735e+05 \n", "{'name': 'CalcVolumeForceForElems', 'type': 'fu... 4.205287e+04 \n", "{'name': 'CalcHourglassControlForElems', 'type'... 3.933893e+04 \n", "{'name': 'CalcFBHourglassForceForElems', 'type'... 4.555233e+02 \n", "{'name': 'IntegrateStressForElems', 'type': 'fu... 9.669293e+02 \n", "{'name': 'MPI_Irecv', 'type': 'function'} 1.217607e-02 \n", "{'name': 'MPI_Isend', 'type': 'function'} 4.308979e-01 \n", "{'name': 'MPI_Wait', 'type': 'function'} 6.491636e+04 \n", "{'name': 'MPI_Waitall', 'type': 'function'} 2.200269e+05 \n", "{'name': 'MPI_Irecv', 'type': 'function'} 7.789738e-01 \n", "{'name': 'MPI_Isend', 'type': 'function'} 9.730921e+00 \n", "{'name': 'MPI_Wait', 'type': 'function'} 9.984181e+03 \n", "{'name': 'MPI_Waitall', 'type': 'function'} 6.315946e+04 \n", "{'name': 'TimeIncrement', 'type': 'function'} 5.231852e+06 \n", "{'name': 'MPI_Allreduce', 'type': 'function'} 5.232565e+06 \n", "\n", " Total time_rRSS_extrap-model \\\n", "node \n", "{'name': 'MPI_Allreduce', 'type': 'function'} 33.638540 \n", "{'name': 'MPI_Bcast', 'type': 'function'} 0.592849 \n", "{'name': 'MPI_Comm_dup', 'type': 'function'} 1.458439 \n", "{'name': 'MPI_Comm_free', 'type': 'function'} 0.026386 \n", "{'name': 'MPI_Comm_split', 'type': 'function'} 1.584798 \n", "{'name': 'MPI_Gather', 'type': 'function'} 2.319450 \n", "{'name': 'MPI_Initialized', 'type': 'function'} 0.016595 \n", "{'name': 'main', 'type': 'function'} 0.132731 \n", "{'name': 'MPI_Barrier', 'type': 'function'} 80964.639853 \n", "{'name': 'MPI_Irecv', 'type': 'function'} 0.048232 \n", "{'name': 'MPI_Isend', 'type': 'function'} 5023.400772 \n", "{'name': 'MPI_Reduce', 'type': 'function'} 32.371981 \n", "{'name': 'MPI_Wait', 'type': 'function'} 15.106425 \n", "{'name': 'MPI_Waitall', 'type': 'function'} 282.767881 \n", "{'name': 'lulesh.cycle', 'type': 'function'} 0.133362 \n", "{'name': 'LagrangeLeapFrog', 'type': 'function'} 0.040647 \n", "{'name': 'CalcTimeConstraintsForElems', 'type':... 0.010278 \n", "{'name': 'LagrangeElements', 'type': 'function'} 0.041861 \n", "{'name': 'ApplyMaterialPropertiesForElems', 'ty... 0.001975 \n", "{'name': 'EvalEOSForElems', 'type': 'function'} 0.001701 \n", "{'name': 'CalcEnergyForElems', 'type': 'function'} 0.001304 \n", "{'name': 'CalcLagrangeElements', 'type': 'funct... 0.002324 \n", "{'name': 'CalcKinematicsForElems', 'type': 'fun... 0.002845 \n", "{'name': 'CalcQForElems', 'type': 'function'} 0.191824 \n", "{'name': 'CalcMonotonicQForElems', 'type': 'fun... 0.014441 \n", "{'name': 'MPI_Irecv', 'type': 'function'} 0.003239 \n", "{'name': 'MPI_Isend', 'type': 'function'} 0.009142 \n", "{'name': 'MPI_Wait', 'type': 'function'} 2.301295 \n", "{'name': 'MPI_Waitall', 'type': 'function'} 7.732766 \n", "{'name': 'LagrangeNodal', 'type': 'function'} 0.052532 \n", "{'name': 'CalcForceForNodes', 'type': 'function'} 0.028787 \n", "{'name': 'CalcVolumeForceForElems', 'type': 'fu... 0.007481 \n", "{'name': 'CalcHourglassControlForElems', 'type'... 0.005348 \n", "{'name': 'CalcFBHourglassForceForElems', 'type'... 0.007429 \n", "{'name': 'IntegrateStressForElems', 'type': 'fu... 0.003183 \n", "{'name': 'MPI_Irecv', 'type': 'function'} 0.038615 \n", "{'name': 'MPI_Isend', 'type': 'function'} 0.005076 \n", "{'name': 'MPI_Wait', 'type': 'function'} 23.569468 \n", "{'name': 'MPI_Waitall', 'type': 'function'} 124572.019480 \n", "{'name': 'MPI_Irecv', 'type': 'function'} 0.144243 \n", "{'name': 'MPI_Isend', 'type': 'function'} 0.178043 \n", "{'name': 'MPI_Wait', 'type': 'function'} 93.165856 \n", "{'name': 'MPI_Waitall', 'type': 'function'} 2.822066 \n", "{'name': 'TimeIncrement', 'type': 'function'} 0.681284 \n", "{'name': 'MPI_Allreduce', 'type': 'function'} 0.681661 \n", "\n", " Total time_SMAPE_extrap-model \\\n", "node \n", "{'name': 'MPI_Allreduce', 'type': 'function'} 71.854711 \n", "{'name': 'MPI_Bcast', 'type': 'function'} 18.775441 \n", "{'name': 'MPI_Comm_dup', 'type': 'function'} 50.350316 \n", "{'name': 'MPI_Comm_free', 'type': 'function'} 5.697692 \n", "{'name': 'MPI_Comm_split', 'type': 'function'} 40.927787 \n", "{'name': 'MPI_Gather', 'type': 'function'} 37.410684 \n", "{'name': 'MPI_Initialized', 'type': 'function'} 4.528570 \n", "{'name': 'main', 'type': 'function'} 15.651588 \n", "{'name': 'MPI_Barrier', 'type': 'function'} 127.158285 \n", "{'name': 'MPI_Irecv', 'type': 'function'} 8.436975 \n", "{'name': 'MPI_Isend', 'type': 'function'} 80.306304 \n", "{'name': 'MPI_Reduce', 'type': 'function'} 49.251316 \n", "{'name': 'MPI_Wait', 'type': 'function'} 50.478159 \n", "{'name': 'MPI_Waitall', 'type': 'function'} 109.810235 \n", "{'name': 'lulesh.cycle', 'type': 'function'} 15.688203 \n", "{'name': 'LagrangeLeapFrog', 'type': 'function'} 7.619168 \n", "{'name': 'CalcTimeConstraintsForElems', 'type':... 2.671244 \n", "{'name': 'LagrangeElements', 'type': 'function'} 8.942728 \n", "{'name': 'ApplyMaterialPropertiesForElems', 'ty... 1.640254 \n", "{'name': 'EvalEOSForElems', 'type': 'function'} 1.524714 \n", "{'name': 'CalcEnergyForElems', 'type': 'function'} 1.490833 \n", "{'name': 'CalcLagrangeElements', 'type': 'funct... 1.859640 \n", "{'name': 'CalcKinematicsForElems', 'type': 'fun... 1.935065 \n", "{'name': 'CalcQForElems', 'type': 'function'} 17.597453 \n", "{'name': 'CalcMonotonicQForElems', 'type': 'fun... 4.535001 \n", "{'name': 'MPI_Irecv', 'type': 'function'} 2.299890 \n", "{'name': 'MPI_Isend', 'type': 'function'} 3.781670 \n", "{'name': 'MPI_Wait', 'type': 'function'} 46.138279 \n", "{'name': 'MPI_Waitall', 'type': 'function'} 40.064332 \n", "{'name': 'LagrangeNodal', 'type': 'function'} 9.539895 \n", "{'name': 'CalcForceForNodes', 'type': 'function'} 6.373836 \n", "{'name': 'CalcVolumeForceForElems', 'type': 'fu... 3.251360 \n", "{'name': 'CalcHourglassControlForElems', 'type'... 3.043918 \n", "{'name': 'CalcFBHourglassForceForElems', 'type'... 2.856552 \n", "{'name': 'IntegrateStressForElems', 'type': 'fu... 2.237380 \n", "{'name': 'MPI_Irecv', 'type': 'function'} 4.834306 \n", "{'name': 'MPI_Isend', 'type': 'function'} 2.843889 \n", "{'name': 'MPI_Wait', 'type': 'function'} 57.976850 \n", "{'name': 'MPI_Waitall', 'type': 'function'} 70.449504 \n", "{'name': 'MPI_Irecv', 'type': 'function'} 13.336394 \n", "{'name': 'MPI_Isend', 'type': 'function'} 17.445265 \n", "{'name': 'MPI_Wait', 'type': 'function'} 73.120318 \n", "{'name': 'MPI_Waitall', 'type': 'function'} 37.003734 \n", "{'name': 'TimeIncrement', 'type': 'function'} 34.858860 \n", "{'name': 'MPI_Allreduce', 'type': 'function'} 34.862073 \n", "\n", " Total time_AR2_extrap-model \\\n", "node \n", "{'name': 'MPI_Allreduce', 'type': 'function'} 0.982806 \n", "{'name': 'MPI_Bcast', 'type': 'function'} 0.994136 \n", "{'name': 'MPI_Comm_dup', 'type': 'function'} 0.324860 \n", "{'name': 'MPI_Comm_free', 'type': 'function'} 0.995381 \n", "{'name': 'MPI_Comm_split', 'type': 'function'} 0.904711 \n", "{'name': 'MPI_Gather', 'type': 'function'} 0.857675 \n", "{'name': 'MPI_Initialized', 'type': 'function'} 0.997857 \n", "{'name': 'main', 'type': 'function'} 0.886893 \n", "{'name': 'MPI_Barrier', 'type': 'function'} -0.330302 \n", "{'name': 'MPI_Irecv', 'type': 'function'} 0.985537 \n", "{'name': 'MPI_Isend', 'type': 'function'} 0.937724 \n", "{'name': 'MPI_Reduce', 'type': 'function'} 0.436922 \n", "{'name': 'MPI_Wait', 'type': 'function'} 0.567859 \n", "{'name': 'MPI_Waitall', 'type': 'function'} 1.000000 \n", "{'name': 'lulesh.cycle', 'type': 'function'} 0.886407 \n", "{'name': 'LagrangeLeapFrog', 'type': 'function'} 0.947871 \n", "{'name': 'CalcTimeConstraintsForElems', 'type':... 0.999446 \n", "{'name': 'LagrangeElements', 'type': 'function'} 0.970060 \n", "{'name': 'ApplyMaterialPropertiesForElems', 'ty... 0.998092 \n", "{'name': 'EvalEOSForElems', 'type': 'function'} 0.998424 \n", "{'name': 'CalcEnergyForElems', 'type': 'function'} 0.999275 \n", "{'name': 'CalcLagrangeElements', 'type': 'funct... 0.998118 \n", "{'name': 'CalcKinematicsForElems', 'type': 'fun... 0.997478 \n", "{'name': 'CalcQForElems', 'type': 'function'} 0.795277 \n", "{'name': 'CalcMonotonicQForElems', 'type': 'fun... 0.996383 \n", "{'name': 'MPI_Irecv', 'type': 'function'} 0.997552 \n", "{'name': 'MPI_Isend', 'type': 'function'} 0.990329 \n", "{'name': 'MPI_Wait', 'type': 'function'} -0.265790 \n", "{'name': 'MPI_Waitall', 'type': 'function'} 0.819884 \n", "{'name': 'LagrangeNodal', 'type': 'function'} 0.945355 \n", "{'name': 'CalcForceForNodes', 'type': 'function'} 0.961502 \n", "{'name': 'CalcVolumeForceForElems', 'type': 'fu... 0.997349 \n", "{'name': 'CalcHourglassControlForElems', 'type'... 0.996535 \n", "{'name': 'CalcFBHourglassForceForElems', 'type'... 0.999346 \n", "{'name': 'IntegrateStressForElems', 'type': 'fu... 0.996946 \n", "{'name': 'MPI_Irecv', 'type': 'function'} 0.999487 \n", "{'name': 'MPI_Isend', 'type': 'function'} 0.998306 \n", "{'name': 'MPI_Wait', 'type': 'function'} 1.000000 \n", "{'name': 'MPI_Waitall', 'type': 'function'} 0.197527 \n", "{'name': 'MPI_Irecv', 'type': 'function'} 0.856270 \n", "{'name': 'MPI_Isend', 'type': 'function'} 0.867448 \n", "{'name': 'MPI_Wait', 'type': 'function'} -0.360185 \n", "{'name': 'MPI_Waitall', 'type': 'function'} -0.214628 \n", "{'name': 'TimeIncrement', 'type': 'function'} 0.614904 \n", "{'name': 'MPI_Allreduce', 'type': 'function'} 0.614677 \n", "\n", " Total time_RE_extrap-model \n", "node \n", "{'name': 'MPI_Allreduce', 'type': 'function'} 1.569021 \n", "{'name': 'MPI_Bcast', 'type': 'function'} 0.222561 \n", "{'name': 'MPI_Comm_dup', 'type': 'function'} 0.467371 \n", "{'name': 'MPI_Comm_free', 'type': 'function'} 0.054844 \n", "{'name': 'MPI_Comm_split', 'type': 'function'} 0.445655 \n", "{'name': 'MPI_Gather', 'type': 'function'} 0.515782 \n", "{'name': 'MPI_Initialized', 'type': 'function'} 0.046511 \n", "{'name': 'main', 'type': 'function'} 0.157082 \n", "{'name': 'MPI_Barrier', 'type': 'function'} 65.337903 \n", "{'name': 'MPI_Irecv', 'type': 'function'} 0.084786 \n", "{'name': 'MPI_Isend', 'type': 'function'} 19.620193 \n", "{'name': 'MPI_Reduce', 'type': 'function'} 1.295318 \n", "{'name': 'MPI_Wait', 'type': 'function'} 1.000543 \n", "{'name': 'MPI_Waitall', 'type': 'function'} 3.622031 \n", "{'name': 'lulesh.cycle', 'type': 'function'} 0.157454 \n", "{'name': 'LagrangeLeapFrog', 'type': 'function'} 0.076241 \n", "{'name': 'CalcTimeConstraintsForElems', 'type':... 0.027639 \n", "{'name': 'LagrangeElements', 'type': 'function'} 0.089881 \n", "{'name': 'ApplyMaterialPropertiesForElems', 'ty... 0.016486 \n", "{'name': 'EvalEOSForElems', 'type': 'function'} 0.015326 \n", "{'name': 'CalcEnergyForElems', 'type': 'function'} 0.015001 \n", "{'name': 'CalcLagrangeElements', 'type': 'funct... 0.018461 \n", "{'name': 'CalcKinematicsForElems', 'type': 'fun... 0.019204 \n", "{'name': 'CalcQForElems', 'type': 'function'} 0.175135 \n", "{'name': 'CalcMonotonicQForElems', 'type': 'fun... 0.044701 \n", "{'name': 'MPI_Irecv', 'type': 'function'} 0.023065 \n", "{'name': 'MPI_Isend', 'type': 'function'} 0.038011 \n", "{'name': 'MPI_Wait', 'type': 'function'} 0.504422 \n", "{'name': 'MPI_Waitall', 'type': 'function'} 0.720597 \n", "{'name': 'LagrangeNodal', 'type': 'function'} 0.096236 \n", "{'name': 'CalcForceForNodes', 'type': 'function'} 0.063767 \n", "{'name': 'CalcVolumeForceForElems', 'type': 'fu... 0.033025 \n", "{'name': 'CalcHourglassControlForElems', 'type'... 0.030703 \n", "{'name': 'CalcFBHourglassForceForElems', 'type'... 0.028786 \n", "{'name': 'IntegrateStressForElems', 'type': 'fu... 0.022230 \n", "{'name': 'MPI_Irecv', 'type': 'function'} 0.051334 \n", "{'name': 'MPI_Isend', 'type': 'function'} 0.028019 \n", "{'name': 'MPI_Wait', 'type': 'function'} 0.401049 \n", "{'name': 'MPI_Waitall', 'type': 'function'} 70.913096 \n", "{'name': 'MPI_Irecv', 'type': 'function'} 0.133853 \n", "{'name': 'MPI_Isend', 'type': 'function'} 0.182547 \n", "{'name': 'MPI_Wait', 'type': 'function'} 2.393805 \n", "{'name': 'MPI_Waitall', 'type': 'function'} 0.477486 \n", "{'name': 'TimeIncrement', 'type': 'function'} 0.339668 \n", "{'name': 'MPI_Allreduce', 'type': 'function'} 0.339689 " ] }, "execution_count": 6, "metadata": {}, "output_type": "execute_result" } ], "source": [ "t_ens.statsframe.dataframe" ] }, { "cell_type": "markdown", "id": "b216388a", "metadata": { "papermill": { "duration": 0.002234, "end_time": "2024-04-05T18:05:45.351190", "exception": false, "start_time": "2024-04-05T18:05:45.348956", "status": "completed" }, "tags": [] }, "source": [ "## 5. Show the Models Dataframe with Embedded Plots\n", "\n", "(For every `node`, sub-selected `metric` combination)" ] }, { "cell_type": "code", "execution_count": 7, "id": "ce8a5992", "metadata": { "execution": { "iopub.execute_input": "2024-04-05T18:05:45.356004Z", "iopub.status.busy": "2024-04-05T18:05:45.355909Z", "iopub.status.idle": "2024-04-05T18:05:46.272721Z", "shell.execute_reply": "2024-04-05T18:05:46.272318Z" }, "papermill": { "duration": 0.924211, "end_time": "2024-04-05T18:05:46.277576", "exception": false, "start_time": "2024-04-05T18:05:45.353365", "status": "completed" }, "scrolled": true, "tags": [] }, "outputs": [ { "data": { "text/html": [ "\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
Total time_extrap-model
node
{'name': 'MPI_Allreduce', 'type': 'function'}
{'name': 'MPI_Bcast', 'type': 'function'}
{'name': 'MPI_Comm_dup', 'type': 'function'}
{'name': 'MPI_Comm_free', 'type': 'function'}
{'name': 'MPI_Comm_split', 'type': 'function'}
{'name': 'MPI_Gather', 'type': 'function'}
{'name': 'MPI_Initialized', 'type': 'function'}
{'name': 'main', 'type': 'function'}
{'name': 'MPI_Barrier', 'type': 'function'}
{'name': 'MPI_Irecv', 'type': 'function'}
{'name': 'MPI_Isend', 'type': 'function'}
{'name': 'MPI_Reduce', 'type': 'function'}
{'name': 'MPI_Wait', 'type': 'function'}
{'name': 'MPI_Waitall', 'type': 'function'}
{'name': 'lulesh.cycle', 'type': 'function'}
{'name': 'LagrangeLeapFrog', 'type': 'function'}
{'name': 'CalcTimeConstraintsForElems', 'type': 'function'}
{'name': 'LagrangeElements', 'type': 'function'}
{'name': 'ApplyMaterialPropertiesForElems', 'type': 'function'}
{'name': 'EvalEOSForElems', 'type': 'function'}
{'name': 'CalcEnergyForElems', 'type': 'function'}
{'name': 'CalcLagrangeElements', 'type': 'function'}
{'name': 'CalcKinematicsForElems', 'type': 'function'}
{'name': 'CalcQForElems', 'type': 'function'}
{'name': 'CalcMonotonicQForElems', 'type': 'function'}
{'name': 'MPI_Irecv', 'type': 'function'}
{'name': 'MPI_Isend', 'type': 'function'}
{'name': 'MPI_Wait', 'type': 'function'}
{'name': 'MPI_Waitall', 'type': 'function'}
{'name': 'LagrangeNodal', 'type': 'function'}
{'name': 'CalcForceForNodes', 'type': 'function'}
{'name': 'CalcVolumeForceForElems', 'type': 'function'}
{'name': 'CalcHourglassControlForElems', 'type': 'function'}
{'name': 'CalcFBHourglassForceForElems', 'type': 'function'}
{'name': 'IntegrateStressForElems', 'type': 'function'}
{'name': 'MPI_Irecv', 'type': 'function'}
{'name': 'MPI_Isend', 'type': 'function'}
{'name': 'MPI_Wait', 'type': 'function'}
{'name': 'MPI_Waitall', 'type': 'function'}
{'name': 'MPI_Irecv', 'type': 'function'}
{'name': 'MPI_Isend', 'type': 'function'}
{'name': 'MPI_Wait', 'type': 'function'}
{'name': 'MPI_Waitall', 'type': 'function'}
{'name': 'TimeIncrement', 'type': 'function'}
{'name': 'MPI_Allreduce', 'type': 'function'}
" ], "text/plain": [ "" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "with pd.option_context(\"display.max_colwidth\", 1):\n", " display(HTML(mdl.to_html()))" ] }, { "cell_type": "markdown", "id": "02040fee", "metadata": { "papermill": { "duration": 0.010059, "end_time": "2024-04-05T18:05:46.299826", "exception": false, "start_time": "2024-04-05T18:05:46.289767", "status": "completed" }, "tags": [] }, "source": [ "## 6. Query Specific Model\n", "\n", "The 1st node `{\"name\": \"MPI_Allreduce\", \"type\": \"function\"}`, has an interesting graph so we want to retrieve its model. This can be achieved by indexing into the aggregated statistics table for our chosen node for the metric `Total time_extrap-model`." ] }, { "cell_type": "code", "execution_count": 8, "id": "fe12f84e", "metadata": { "execution": { "iopub.execute_input": "2024-04-05T18:05:46.318392Z", "iopub.status.busy": "2024-04-05T18:05:46.318269Z", "iopub.status.idle": "2024-04-05T18:05:46.320734Z", "shell.execute_reply": "2024-04-05T18:05:46.320321Z" }, "papermill": { "duration": 0.012374, "end_time": "2024-04-05T18:05:46.321396", "exception": false, "start_time": "2024-04-05T18:05:46.309022", "status": "completed" }, "tags": [] }, "outputs": [], "source": [ "model_obj = t_ens.statsframe.dataframe.at[t_ens.statsframe.dataframe.index[0], \"Total time_extrap-model\"]" ] }, { "cell_type": "markdown", "id": "be06353f", "metadata": { "papermill": { "duration": 0.008836, "end_time": "2024-04-05T18:05:46.339514", "exception": false, "start_time": "2024-04-05T18:05:46.330678", "status": "completed" }, "tags": [] }, "source": [ "## 7. Operations on a model\n", "\n", "We can evaluate the model at a value like a function." ] }, { "cell_type": "code", "execution_count": 9, "id": "87f83e4d", "metadata": { "execution": { "iopub.execute_input": "2024-04-05T18:05:46.358090Z", "iopub.status.busy": "2024-04-05T18:05:46.357804Z", "iopub.status.idle": "2024-04-05T18:05:46.360646Z", "shell.execute_reply": "2024-04-05T18:05:46.360275Z" }, "papermill": { "duration": 0.012613, "end_time": "2024-04-05T18:05:46.361226", "exception": false, "start_time": "2024-04-05T18:05:46.348613", "status": "completed" }, "tags": [] }, "outputs": [ { "data": { "text/plain": [ "9.311422624087944" ] }, "execution_count": 9, "metadata": {}, "output_type": "execute_result" } ], "source": [ "model_obj.eval(600)" ] }, { "cell_type": "markdown", "id": "9ab2455f", "metadata": { "papermill": { "duration": 0.00901, "end_time": "2024-04-05T18:05:46.379579", "exception": false, "start_time": "2024-04-05T18:05:46.370569", "status": "completed" }, "tags": [] }, "source": [ "### Displaying the model:\n", "\n", "It returns a _figure_ and an _axis_ objects. The axis object can be used to adjust the plot, i.e., change labels. The `display()` function requires an input for `RSS` (bool), that determines whether to display Extra-P RSS on the plot." ] }, { "cell_type": "code", "execution_count": 10, "id": "3595eb4e", "metadata": { "execution": { "iopub.execute_input": "2024-04-05T18:05:46.397940Z", "iopub.status.busy": "2024-04-05T18:05:46.397816Z", "iopub.status.idle": "2024-04-05T18:05:46.442811Z", "shell.execute_reply": "2024-04-05T18:05:46.442459Z" }, "papermill": { "duration": 0.055074, "end_time": "2024-04-05T18:05:46.443535", "exception": false, "start_time": "2024-04-05T18:05:46.388461", "status": "completed" }, "tags": [] }, "outputs": [ { "data": { "text/plain": [ "
" ] }, "metadata": {}, "output_type": "display_data" }, { "data": { "image/png": "iVBORw0KGgoAAAANSUhEUgAAAb0AAAEGCAYAAADxI0vyAAAAOXRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjguNCwgaHR0cHM6Ly9tYXRwbG90bGliLm9yZy8fJSN1AAAACXBIWXMAAAsTAAALEwEAmpwYAABCYElEQVR4nO3deVhV1foH8O86h1kEQVAQBBRBZlAJccwh08rhalo5m5Vm1i3LpmtlWv282VXzZmplzqY2OFXmWDmngoIiCA6ATDLP4xne3x9nuCCDQMgGzvt5nvNwzh4W7zpsznvW2muvLYgIjDHGmCGQSR0AY4wx1lw46THGGDMYnPQYY4wZDE56jDHGDAYnPcYYYwbDSOoAWO3s7OzIzc1N6jAYY6xVCQ8PzyIi+5rWcdJrwdzc3BAWFiZ1GIwx1qoIIRJrW8fdm4wxxgwGJz3GGGMGg5MeY4wxgyHqmoYsPDy8k5GR0QYAfuAE2eyys7NdHR0dpQ6DMcZaJDMzMzg7O8PY2LjKciFEOBEF17RPnQNZjIyMNjg4OHjb29vnymQynqSzmUVHR7t6e3tLHQZjjLU4RITs7GwkJyejW7du9d7vfq03P3t7+wJOeIwxxloSIQQ6duyIsrKyBu13v6Qn44THGGOsJRJCNHgfPk/HGGOsRbmbX4qSCuUDKbtVJT21Wo1Zs2Z1dXFx8fP09PQ5ffq0RU3bnTp1ysLT09PHxcXFb9asWV3VajUAID09Xd6/f38PV1dXv/79+3tkZmbKAWDdunW2np6ePp6enj69evXyOnfunHnl8pRKJby9vX2GDh3aQ7ds//797X18fLy9vLx8+vTp0zMqKsoUAJYvX27v6enpo1seHh5uBgCxsbEmZmZmvb28vHy8vLx8pkyZ4gIAubm5Mt0yLy8vHxsbm8DZs2d3BYDdu3fD398fQUFBGDhwIKKjowEACoUCM2fOhL+/P7y9vbFs2TIAQFlZGUJCQhAYGAhfX18sXrxYX4f4+Hj07dsXPXr0wNNPP42KigoAwMmTJ9G7d28YGRnhxx9/rPI+vvXWW/D19YW3tzf++c9/QjfoqaKiAnPmzIGnpye8vLzw008/Vdnvp59+ghBCf2F9bfECwKpVq+Dr6ws/Pz9MnjxZ31Xx3HPPITAwEAEBAZg4cSKKiorqPDYaYuzYsfDz86t1/Z9//omgoCD4+vri4YcfBgDExsYiKChI/7CyssLnn38OAHjzzTfh5eWFgIAAjB8/Hnl5eQCACxcu6LcPDAzE3r179b9j9uzZ6NSpU7U43n//fQQEBCAoKAiPPvooUlNTAQCfffaZviw/Pz/I5XLk5OTUWVZOTg5GjBgBDw8PjBgxArm5uXWWVdfxM3XqVPTs2RN+fn6YPXs2FAoFACA3Nxfjx49HQEAAQkJCEBUVpd9n9erV8PPzg6+vr/69AoAPP/wQTk5O+hgOHjwIAEhISIC5ubl++Ysvvlj3H7IGW7ZsgYeHBzw8PLBlyxb98t27dyMgIAC+vr54++23a9yXiJCQkIDNmzc3+PcCms+JJ554AnZ2dlXeB53XXnsNJ0+eBFD78b1mzRps3Lix1vj+/PNP/Pnnn6hpAOLmzZvx8ssvNyr2iIgI9OvXD76+vggICMDu3burrJ84cSJu375dZxkLFy7E77//Xm35smXLYGxsjG3btlVbt2/fPixduhRA1c+iHbu+R3G5CgCQmZmJUaNGNapeNSKiWh8REREJRBTWUh67du26MWjQoHyVShV27NixGH9//6KatvPz8ys+duxYjEqlChs0aFD+7t2744gobO7cuXfffffdZCIKe/fdd5NffPHFNCIKO3LkSExGRsZlIgrbvXt33L3lLl68OGn06NHZQ4YMydMtc3V1LQsPD48iorBly5YlTpgwIYuIwrKzsy/pttm+ffuNgQMH5hNR2PXr16/06NGj9H519PHxKT548OB1Igo7f/486ezfv59GjhxJREQ7duygp59+moiIiouLydXVleLj40mtVlNhYSEREVVUVFBISAidO3eOiIgmTZpEO3fuJCKiuXPn0tq1a4mIKD4+niIjI2n69On0ww8/6H/fmTNnqH///qRUKkmpVFJoaCj98ccfRET0wQcf0KJFi4iISKVSUWZmpn6/goICGjRoEPXt25cuXrxYZ7zJycnk5uZGJSUl+hg3bdpERET5+fn6MhcsWEDLli2jusycOVMfX11++uknmjx5Mvn6+ta4Pjc3l7y9vSkxMZGIiNLT06tto1QqqXPnzpSQkEBERIcPHyaFQkFERG+99Ra99dZb+rrqlqemppK9vb3+9YkTJyg8PLxaHJXrvXr1apo7d26133/gwAEaOnSo/nVtZb355pv6923ZsmX6uGorq67j59dffyW1Wk1qtZqeeeYZ/fGzcOFC+vDDD4mIKCYmhoYNG0ZERFevXiVfX1/9ezB8+HC6ceMGEREtXryYPvvss2qxxMfH1/p3qY/s7Gzq1q0bZWdnU05ODnXr1o1ycnIoKyuLunbtShkZGURENGPGDDp27Fi1/efMmUPbtm2jJUuW0OzZsyk5OblBv//555+n119/nU6dOkU+Pj6UlJSkX5eVlUV9+/bVv67t+C4uLqagoKBqZZeUlNCMGTNozZo19MUXX9CMGTP0/zc6mzZtovnz5zcoZp3Y2FiKi4sjIqKUlBRycHCg3NxcIiKKioqif/zjH/ctIyEhgUaMGFFl2datW2nw4MF048YNCgwMpKNHj1ZZ369fP/3nR3x8PEVERNA/Jk2mVV9vIZVKrd9u1qxZdPr06Rp/b3R0dLVlAMKolrzWqlp6+/fv7zB16tRsmUyG4cOHFxcUFBglJiZWGauamJhoXFRUJBs+fHixTCbD1KlTs/ft22cDAIcOHeowd+7cbACYO3du9m+//WYDACNGjCi2t7dXAcDQoUOL7969a6Ir79atW8aHDx+2fuGFF7LujScvL08OAPn5+XJHR0cFANja2qp164uKiuQN6XO+cuWKaXZ2tvHIkSOLAMDS0lK/rri4WN9/LYRAcXExlEolSktLYWJiAisrKwgh9PsoFAooFAoIIUBE+P333zFx4kQAwMyZM7Fv3z4AmqnOAgICIJNVPRSEECgrK0NFRQXKy8uhUCjQuXNnAMDGjRvx7rvvAgBkMhns7Oz0+73//vt4++23YWZmVqWsmuIFoF+mVCpRUlKCLl26AIB+PRGhtLS0UX339yoqKsLKlSvx3nvv1brNd999hwkTJsDFxQUA0KlTp2rbHD9+HO7u7nB1dQUAPProozAy0gyEDg0NRXJyMgDAwsJCv7ysrKxKHQYPHgxbW9tqZevqDVT9m1e2c+dOTJ48+b5l7d+/HzNnzgRQ9W9eW1m1HT8A8Pjjj0MIASEEQkJC9HWMjo7GsGHDAABeXl5ISEhAeno6YmJi0LdvX/178PDDD2PPnj3Vfn99HTlyBP369UPv3r0xadKkGlv+hw8fxogRI2BrawsbGxuMGDEChw4dwu3bt+Hh4QF7e81UjI888ki13gkAWLt2LXbu3ImNGzdi2bJlcHJyqrJ+8+bNGDduHIYMGQIPDw8sWbJEv27JkiWwtrbGihUrMHDgQGzYsAGTJ09Gfn4+AE3vR+XWSm3Ht4WFBdzc3HDhwoUqv9vc3Bzr1q3Dxo0bsWnTJqxbtw7m5lU6pKpISEjAsGHDEBAQgOHDh+POnTsAgFu3biE0NBT+/v5477339H9vT09PeHh4AAC6dOmCTp06ITMzEwCwY8cOjBs3Tl+2paUlFixYAF9fXwwfPly/naurK7Kzs3H37l0AwLFjx7B161YcPHgQPXr0wJEjR7B48WJERkYCAOLi4mBqaqr//HBzc0M3Tx+oCbA2N4ZM9r9j/x//+Ad27NhRa30bot5zb775Y2TXuLuFNXYnNpanQ/uSzyYGJtV3+7S0NGM3N7cK3WtHR8eKxMREY1dXV4VuWWJiorEuAQGAq6trRVpamjEAZGdnG+m27dq1qyI7O7ta/b/44gu7oUOH5utez58/v+vy5cuT8/Pz5ZW3W79+fcKECRM8TE1N1ZaWlqqLFy/G6NYtW7bMfu3atZ0VCoXs6NGjsbrlycnJJt7e3j6Wlpaqjz76KGXUqFFV/nO3bt1qO3bs2JzKCejLL7/EypUrUVFRoe86mDhxIvbv3w9HR0eUlJRg1apV+g89lUqFPn364ObNm5g/fz769u2LrKwsdOjQQf8B7OzsjJSUlDrf6379+mHo0KFwdHQEEeHll1+Gt7e3vuvu/fffx59//gl3d3esWbMGnTt3xqVLl5CUlIQnnngCn332mb6suuJduHAhXFxcYG5ujkcffRSPPvqofr9nn30WBw8ehI+PD1asWFFnvPXx/vvv44033oCFRe2HcVxcHBQKBYYMGYLCwkK8+uqrmDFjRpVtdu3aVSXpVLZx40Y8/fTT+tfnz5/H7NmzkZiYiG3btun/BnVZtGgRtm7dCmtra/zxxx9V1pWUlODQoUNYs2bNfctJT0+H7jpPBwcHpKen37esmo6fyhQKBbZt24bVq1cDAAIDA7Fnzx4MGjQIFy5cQGJiIpKTk+Hn54dFixYhOzsb5ubmOHjwIIKD/3fZ1Jo1a7B161YEBwdjxYoVsLGxAaDphu/VqxesrKzw8ccfY9CgQcjKysLHH3+MY8eOoV27dvj000+xcuVKfPDBB1ViS0lJQdeuXfWvdcf5qFGjEBsbi4SEBDg7O2Pfvn367v3KXn75ZUyePBm3b9/GokWLsGTJEv2XMJ0LFy4gKioKFhYWeOihh/DEE08gODi4SlcwoPn/OXXqlP71mTNn9F86dWo7voODg3Hq1CmEhITol5WWlmL+/Pl49tlnAQDz58/H2rVra018r7zyCmbOnImZM2di48aN+Oc//4l9+/bh1VdfxauvvorJkydj/fr1Ne574cIFVFRUwN3dXR975eO9uLgYwcHBWLVqFZYuXYolS5boj6HevXvjzJkzePLJJ/HII4/gkUce0e/XqVMnnDlzpsp70rt3b/1rIkJ6QRlkMoF2plX/T4KDg+v8stoQraql15RkMlm1b9E///xz++3bt9utXr06GQB27txpbWdnpxw0aFDJvfuvXLmy8549e26kp6dfmTJlSta8efP0/23vvvtuZlJSUtSHH36YvHjxYkcAcHFxUcTHx1+JiYmJXrlyZdKsWbO65+TkVHn/9+7dazt9+vScysvmz5+PW7du4dNPP8XHH38MQHNQyuVypKamIj4+HitWrND3t8vlckRERCA5OVn/D9oYN2/eRExMDJKTk5GSkoLff/8dp06dglKpRHJyMvr3749Lly6hX79+WLhwIdRqNV5//fUak1Nt8ebm5mL//v2Ij49HamoqiouLsX37dv1+mzZtQmpqKry9vaudYwA03+x1538OHDiA559/HkFBQdU+qAHNOYtbt25h/PjxddZbqVQiPDwcv/76Kw4fPoyPPvoIcXFx+vUVFRU4cOAAJk2aVG3fTz75BEZGRpg6dap+Wd++fXHt2jVcvHgRy5Ytq9fw6k8++QRJSUmYOnVqteT2888/Y8CAATW27Oqia6Xdr6z7HT8vvfQSBg8ejEGDBgEA3nnnHeTl5SEoKAhffPEFevXqBblcDm9vb7z99tt49NFHMWrUKAQFBUEu13xvnDdvHm7duoWIiAg4OjrijTfeAAA4Ojrizp07uHz5MlauXIkpU6agoKAAf/31F6KjozFgwAAEBQVhy5YtSEysdT7hamxsbLBu3To8/fTTGDRoENzc3PSxVLZ27VoMHDgQLi4u+Oabb6olPAAYMWIEOnbsCHNzc0yYMAGnT5+uVwxpaWn6lqZObcd3p06d9OdydczNzbFx40b4+fnBz88PGzdurLOld+7cOUyZMgUAMH36dH2c586d0x+7uvX3xjl9+nRs2rRJ3/tzb+wymUz/xW7atGlV3oOaYq/NveXmlypQqlDB3FgO2T3HakPKvZ96t/Qa0iJrKsuWLbPfsmWLPQAcOnTohqOjoyIhIUHf9ZiWlmZSuZUHAK6urgpdyw4AEhMTTXQtv44dOyp1LcPExERjW1tb/fCg8+fPm7/00kuuv/766w0HBwcVAJw+fdry6NGjHZycnKzLy8tlxcXFsnHjxnVbt25dUkxMjPmwYcOKAWDGjBm5o0aN8rg3/hdeeCHnzTffdAEAc3NzMjc3VwHAoEGDSlxcXMqjoqLMBg8eXAIA586dM1epVKKmBAsAzzzzDObNmwdA0wU3atQoGBsbo1OnThgwYADCwsLQvXt3/fYdOnTA0KFDcejQIbzxxhvIy8uDUqmEkZERkpOTq3Xd3Gvv3r0IDQ3Vd3889thjOHfuHAYOHAgLCwtMmDABADBp0iR8++23KCwsRFRUFIYMGQIAuHv3LsaOHYsDBw7UGq8QAt26ddMf+BMmTMDZs2cxbdo0fRxyuRzPPPMMli9frv+WqzNy5EiMHDkSADBr1izMmjVL//vvde7cOYSFhcHNzQ1KpRIZGRkYMmQI/vzzzyrbOTs7o2PHjmjXrh3atWuHwYMHIzIyEp6engCA3377Db1799Z39eps3rwZv/zyC44fP15jl6S3tzcsLS0RFRVVpcVTl6lTp+Lxxx+v0o1WVyvzXp07d0ZaWhocHR2RlpZWrau2rrIqHz+6ATJLlixBZmYmvvrqK/12VlZW2LRpEwDNN/Vu3brpj8PnnnsOzz33HADgX//6F5ydnfVx6bzwwgsYPXo0AMDU1BSmpqYAgD59+sDd3R1xcXEgIowYMQI7d+6sEuP58+cxd+5cAMDSpUvh5ORU5e+ZnJysPx7GjBmDMWPGAAC+/vrrGpOeEAJubm6YNWtWje+Jbpu6XtfG3Ny8xi88NR3fZWVlNSY0IUStx3dTKCgowBNPPIFPPvkEoaGh9429clw6tcVeE3Nzc333r6aVVw4zYzlMjKq3xRpS7v206Jbeu+++m3n9+vXo69evR7u5uSnGjh2bt2PHjo5qtRrHjx9v1759e1VNSc/S0lJ9/Pjxdmq1Gjt27Og4bty4PAAYOXJk3ldffdURAL766quOo0aNygOAGzdumEyaNMl948aN8QEBAeW6sr788suU9PT0KykpKVc3b958OzQ0tHD//v3x9vb2yqKiIvmVK1dMAeCXX36x6tGjRxkAXL161VS3/+7du61dXV3LASA1NdVIqdTk2OjoaJOEhATTnj176n/Xtm3bbMePH1+llVf52+yvv/6q73N3cXHRd3UWFxfjr7/+gpeXFzIzM/Xdj6WlpTh69Ci8vLwghMDQoUP1ozO3bNlSpY++Ji4uLjhx4gSUSiUUCgVOnDgBb29vCCEwZswY/YfL8ePH4ePjA2tra2RlZSEhIQEJCQkIDQ3FgQMHEBwcXGu8Li4u+Ouvv1BSUgIiwvHjx+Ht7Q0iws2bNwFo/hkOHDgALy+vOuO9n3nz5iE1NRUJCQk4ffo0PD09qyU8ABg3bhxOnz6tP8d4/vx5VJ4V597zaQBw6NAhLF++HAcOHKjSdRofHw/d3zwxMRHXr1/H/e6PeOPGDf3z/fv3V6l3fn4+Tpw4cd+/nc7YsWP1Ixjv/ZvXVFZtxw8AbNiwAYcPH8bOnTurnP/Ny8vTdxVu2LABgwcP1p+vysjIAADcuXMHe/bs0bcs0tLS9Pvv3btXn1QzMzOhUmlG7N2+fRs3btxA9+7dERoaijNnzuiPieLiYsTFxaFv376IiIhAREQExo4di5EjR+LIkSPIzc1Fbm4ujhw5ov9SpIslNzcXa9euxfPPP1+v9/BeR48eRU5ODkpLS7Fv3z4MGDCgXvt5e3tXOabrOr7j4uLqHF1cH/3798euXbsAaM7J6VrmoaGh+vOZuvWApgdj/PjxmDFjRrVu2MqxA5pR9LrPku+++w4DBw5sVOyVy80tUaBcqUJnK7Mat22K90SvthEu1AJHb6pUqrBp06ZlODs7l3l4eJScOHEiWreuZ8+eJbrnJ06ciO7Ro0eps7Nz2fTp0zNUKlUYEYWlpaVdDg0NLXBxcSnr169fwd27dy8TUdhTTz2V2b59e2XPnj1LevbsWeLr61t87+/++eefYyuP3tyyZctNDw+PEk9Pz5KHHnqo8Nq1a1eIKGzWrFnp7u7upT179iwJCQkpuHjxYhQRhW3atOmmbrm3t3fxjh07blQu38nJqfzSpUtRlZdNmzaNfHx8KDAwkIYMGUJRUVFERFRYWEgTJ04kHx8f8vb2puXLlxMRUWRkJAUFBZG/vz/5+vrSkiVL9KOZbt26RQ899BC5u7vTxIkTqaysjIiILly4QE5OTmRhYUG2trbk4+NDRJoRinPmzCEvLy/y9vamBQsW6MtKSEigQYMGkb+/Pw0bNkw/0rGyhx9+WD96s7Z4iTQjQXv27Em+vr40bdo0KisrI5VKRf379yc/Pz/y9fWlKVOmVBntVpP6jt4kqj5KcN26dbRu3Tr96+XLl5O3tzf5+vrSqlWr9MuLiorI1taW8vLyqpTn7u5Ozs7OFBgYSIGBgfoRl1u3btX//Xr16kV79+7V7/PMM8+Qg4MDGRkZkZOTE23YsIGIiCZMmEC+vr7k7+9Po0ePrjKCcNOmTfpRsJXVVlZWVhYNGzaMevToQcOHD6fs7Ow6y6rr+JHL5dS9e3d9HXXrzp49Sx4eHuTp6Unjx4+nnJwc/T4DBw4kb29vCggIqDJactq0aeTn50f+/v40ZswYSk1NJSKiH3/8scr7deDAAf0+x48fp+DgYPL39yd/f3/av39/tfeBiOjbb78ld3d3cnd3p40bN1Z5j7y9vcnb21s/irmhNm3aROPGjaMhQ4ZQjx499KNW6+PkyZM0depUIqL7Ht+9evWirKysRsWnG72ZkJBAQ4cOrfY/GhcXRyEhIeTv709vvvkmdenShYiItm3bRkZGRvq/b2BgIF2+fJmINMexbrQ2EVG7du1owYIF5OvrS0OHDtWPiq2oqCAvLy/9COX7KS4uJh8fH1KqVBSTmk8/Hvqjxs8iIqLPPvuM/vvf/9ZYTkNHb9Y54XRkZGRCYGBgtVGLrHlER0f38fHxkToMxhg0XdhhYWH1GkRUk4EDB+KXX35Bhw4dat1Gdz6zpmvamkJJSQnMzc0hhMCuXbuwc+dO7N+/v859SktLMXToUJw5cwZyuRyWlpY1jp7du3cvLl26hI8++qje8bz66qsYNHwkPHv3Rze7dmhvZlzjdoMHD8b+/fv1A54qi4mJwb1zFNc14XSL7t5kjLG2YsWKFfpLB2qTlZXVoKTRUOHh4QgKCkJAQADWrl1br1HR5ubmWLJkyX1HfCuVSv2gpPp6+513cDcnH5amRrUmvMzMTLz++us1JrzG4JZeC8YtPcZYW3Y3vwwZhWXw6GQJc5N6j6usglt6jDHGWjyFSo2sonJ0MDdpdMJrDE56jDHGml16QRmIgM7WpvffuAlx0mOMMdasyhQq5BYrYGtpAlOj6tdMPkic9BhjjDWr9IIyCAF0at+8rTyAkx5jjLFmVFKuRH6pAvbtTWEsb/4U1LS/cf16W3Tp4g+ZrA+6dPHH+vUNmyCwBkKIPuPGjeume61QKGBjYxOou7fdf//73442NjaBXl5ePu7u7r4rVqyw0y2fMWOGy/3K9/Ly8hk9enT3ysuefPJJt02bNtkAQEhISM+TJ082eqLt+sbBGGNtHREhraAMRjIZ7Cybv5UHNGXSW7/eFgsWuCItzQREQFqaCRYscP27ic/c3FwdGxtrXlRUJABg7969Vp07d64y9diYMWNyr1+/Hn3y5MnYjz/+2CkpKaleQ4EuXbpkplarceHCBcuCgoIGvRe66aUYY4zVT2G5EsXlSnSyMoVcVr95S5ta0yW9pUudUFZWtbyyMhmWLq17ZuN6eOSRR/J/+OGHDgCwc+dO2yeffDKnpu2cnJyULi4u5Tdv3jSpaf29tm7davvUU09lDx48uOC7777rcL/tLSwser3wwgvOPXv29Dl+/Ljl2rVrbf39/b21d0J31SXC1atXd3Rzc/Pz9/f3Pnv2rP6meJVbkLrydM8XLVrk4Onp6dOzZ0+fl156yQnQzFk4atQo9OnTB4MGDcL169frUy3GGGtxiAh388tgYiSDbbt6fUQ/EE2X9CrdeLVeyxtg+vTpObt377YpKSkRMTExFv369Suuabvo6GiTpKQkUx8fn/Ka1t9r3759tjNnzsydMmVKzvfff3/fFmlpaamsb9++xbGxsdH29vbKH3/80TYsLOz69evXo2UyGa1fv75jYmKi8b///e8uZ8+evX7x4sXrcXFx950a/Pvvv7c6ePBgh/Dw8OuxsbHRixcvvgsAH374Ib744guEh4fjP//5D1566aX6VIsxxlqc3JIKlClUcLAyq3broObUdFcEOjhUIC2teoJzcKh+t8YG6tu3b2lycrLpN998Y/vII4/k37v+559/tvHy8rI0MTFRf/7554mdO3dW3a/MkydPWtja2io9PDwqunXrVjFv3jy39PR0eV37yuVyzJo1KxcADh061D4qKsoiMDDQGwDKyspknTp1Up48ebJdaGhoYZcuXZQAMGHChJy4uLiapw7XOnr0qNW0adOy2rdvrwaAzp07q/Lz82URERFV7ttWXl6vXM4YYy2KSk24W1AOCxMjWJvXPN1Yc2m6pPfBBylYsMC1ShenmZkaH3xQ94Rt9TRq1Ki8xYsXdz1y5EhsRkZGlbjHjBmTu3Xr1rontbvHtm3bbG/fvm3m5OTkDwDFxcXy7du327zxxhu1TrtmYmKi1t35mojEpEmTsr/88ssq9du2bVuH2vY3MjKijIwMl6tXrzoSERQKRa0tbZVKhfbt2yMiIqIh1WKMsRYns7AcSpUarrYW9b4H4YPSdN2bL76Yg1WrEuHoWAEhAEfHCqxalYgXX6zx/FtDzZs3L2vhwoWpISEhpX+3LJVKhZ9//tk2IiLiWkpKytWUlJSrO3fuvPnDDz/Ue9DNqFGjCn755ReblJQUIwBIT0+Xx8XFmQwePLj4/Pnz7e/evSsvLy8Xe/fu1Z/Dc3V1rYiJiRFeXl5xkZGRqbpzgCNHjizYvn27XWFhoUxXlq2trdrZ2Rk//PADAE1/eGRk5N+tOmOMNasK5f+mG2tn2nzTjdWmaS9ZePHFHKSmXoVaHY7U1KtNlfAAwN3dXfHee+9lNEVZhw4dsuzcuXOFm5ubfhToY489Vnjz5k3zxMTEerW9+/TpU/bee++lDB8+3NPT09Nn2LBhnklJScaurq6Kt99+OzU0NNQ7ODjYy9PTU3/L4VdeeSUzPDxc5ufn1/Ps2bPtzM3N1QAwceLEgsceeywvKCjI28vLy+ejjz5yAIBPP/0U3377LQIDA+Hr63vfW4AwxlhLk15QBgLg0MzTjdWG77LQzCIjI/3lcrkSAOzs7DIdHByqvL937961y8rKsgcAtVptERAQIEWYjDH2t5VUKHEzowj27U3haH3fMX2N0tC7LEjf1jQwXl5e101NTRUVFRVGcXFxnubm5mXW1tb6OzI6ODhk6RJhdHR0H+kiZYyxxiMipOVpLkSXYrqx2rT5pPf222877N+/v8q5unHjxuV8+umnd6WIx9TUVAEAJiYmSmtr67yioqJ2lZMeY4y1BQVlShRXKOHUwRxyWcuZ8fJ+SU+tVquFTCarvQ+0hfv000/vSpXg7qVSqWREBCMjI7VKpZIVFhZaOTg4pEodF2OMNSU1EdLyS2FmLH+gF6LXdXquNvdLelGZmZk+9vb2+a058bUUFRUVRrdu3eoBaC55sLGxyba1tS2QOi7GGGtK2UUVqFCq0c2u3QO7RIGIkJ2dDTOzOi+DrqbOgSzh4eGdjIyMNgDwA9+RodllZ2e7Ojo6Sh0GY4zVm0pNSC/QTDf2oCeVNjMzg7OzM4yNqw66r2sgS51Jj0krODiYwsLCpA6DMcbq7d09V/FDWBIOvTYIPTq1lySGupIet94YY4w1iaiUfOy6eAcz+7tJlvDuh5MeY4yxv42IsPjANXRsZ4JXH/GQOpxacdJjjDH2t+2PSEV4Yi7eGukFKzNpJ5WuCyc9xhhjf0tRuRL/dzAGAc7WmNjHWepw6tTmL05njDH2YH35x01kFJZj/fQ+kEl0R/T64pYeY4yxRkvIKsa3p+IxobcTervY3H8HiXHSY4wx1mgf/xoNY7nAO6O8pA6lXjjpMcYYa5Q/YjNwLCYD/xzugU5WDZsZRSqc9BhjjDVYuVKFpT9Ho5tdOzw7oJvU4dQbD2RhjDHWYF+duI34rGJsnR0CE6PW035qPZEyxhhrERKzi7Hmj5t4IsARgz3tpQ6nQTjpMcYYqzfdzCvGMoH3n/CROpwG46THGGOs3g5fu4s/YzOxYIQnHKxbx+CVyjjpMcYYq5ficiWW/BwNL4f2mNXfTepwGoUHsjDGGKuX1cdvIC2/DGum9IKRvHW2mVpn1IwxxppV7N1CfHs6Hs881BV9XG2lDqfROOkxxhirExHhvX1XYWVmhLdbycwrteGkxxhjrE4/hifjYkIu3nnMCzbtTKQO52/hpMcYY6xW2UXl+L+DMejjaoNJfbpKHc7fxkmPMcZYrT76JRpF5Ur8e4J/i79tUH1w0mOMMVajP2IzsC8iFfOG9IBH5/ZSh9MkOOkxxhirprhciff2RsHdvh3mD3WXOpwmw9fpMcYYq2bl0Tik5JXihxf7wdRILnU4TYZbeowxxqqITMrDpjPxmBbqgofcWu81eTXhpMcYY0xPoVLj7Z+uwL69Kd5q5dfk1YSTXjMTQsiFEJeFEL9IHQtjjN3rm1O3cf1uIZaO84OVmbHU4TQ5TnrN71UAMVIHwRhj94rPKsbnx27gMT8HjPR1kDqcB4KTXjMSQjgDeALABqljYYyxytRqwjs/XYGpkQxLxvpKHc4Dw0mveX0O4C0A6to2EELMEUKECSHCMjMzmy0wxphh23ouAefjc/D+aB90smp998mrL056zUQIMRpABhGF17UdEX1NRMFEFGxvb99M0THGDFlidjE+PRSLIT3tMamPs9ThPFCc9JrPAABjhRAJAHYBGCaE2C5tSIwxQ6dWE9788QqM5ALLJvhDiNY/1VhdOOk1EyJ6l4icicgNwDMAfieiaRKHxRgzcFvPJeCCtlvT0dpc6nAeOE56jDFmoAypW1OHpyGTABH9CeBPicNgjBkwQ+vW1OGWHmOMGSBD69bU4aTHGGMGxhC7NXU46THGmAFRqQlvfB9pcN2aOnxOjzHGDMj6E7cQlpiLz58OMqhuTR1u6THGmIGISsnHqqNxeCLAEeOCukgdjiQ46THGmAEoU6jw2u4IdLQ0wSf/8DO4bk0d7t5kjDED8O/fruNmRhG2PReCDhYmUocjGW7pMcZYG3fqRiY2n03ArP5uGORh2HP6ctJjjLE2LK+kAgt/iESPTpZ457G2dyf0huKkxxhjbRQRYdHeKGQXVeDzp4NgZiyXOiTJcdJjjLE2as+lFPx6NQ0LRnjCz8la6nBaBE56jSSEMBdC9JQ6DsYYq0l8VjHe3x+FEDdbvPiwu9ThtBic9BpBCDEGQASAQ9rXQUKIA5IGxRhjWuVKFV7ZeQnGchk+fyYIcplhXp5QE056jfMhgBAAeQBARBEAukkXDmOM/c/yQ7GISinAZxMD0KWD4c26UhdOeo2jIKL8e5aRJJEwxlglf1zPwLen4zGznyse9XWQOpwWhy9Ob5xrQogpAORCCA8A/wRwVuKYGGMGLr2gDG/8EAlvRyu8+7i31OG0SNzSa5xXAPgCKAewE0ABgNekDIgxZthUasKC3REorVDhi8m9+PKEWnBLrxGIqATAIu2DMcYkt/7ELZy9lY3lTwagRydLqcNpsTjpNYIQIhjAvwC4odJ7SEQBUsXEGDNcYQk5WHk0DmMCu2BSsGHdFLahOOk1zg4AbwK4CkAtcSyMMQOWVVSOl7+7DGcbc3wy3nDvnlBfnPQaJ5OI+Lo8xpikVGrCa7sikFtSgT0v9YeVmbHUIbV4nPQaZ7EQYgOA49AMZgEAENEe6UJijBma1cdv4PTNLCx/MgC+XXiasfrgpNc4zwLwAmCM/3VvEgBOeoyxZvFnbAa++P0GJvVxxlMPdZU6nFaDk17jPEREPO8mY0wSKXmlWLA7Aj07t8fScX5Sh9Oq8HV6jXNWCOEjdRCMMcNToVRj/o5LUKgI66b1gbkJX4/XENzSa5xQABFCiHhozukJAMSXLDDGHrT/OxiDiKQ8rJvaG93s2kkdTqvDSa9xRjVmJyGEGYCTAEyhee9/JKLFTRkYY6zt2h+Rgs1nE/DcwG54zN9R6nBaJU56DSCEsCKiAgCFjSyiHMAwIioSQhgDOC2E+I2I/mq6KBljbVFUSj7e/ukKQtxs8c5jXlKH02px0muY7wCMBhAOzWjNyleBEoDude1MRASgSPvSWPvguzMwxuqUXVSOudvCYWNhgi+n9oaxnIdjNBYnvQYgotHan42+d54QQg5N0uwB4EsiOn/P+jkA5gCAi4tL44NljLUJCpUaL393GZlF5fjxxX6wb28qdUitGn9daAQhxPH6LKsJEamIKAiAM4AQIYTfPeu/JqJgIgq2t7dvkngZY63X/x2Mwbnb2Vg23h8Bzh2kDqfV45ZeA2gHolgAsBNC2OB/3ZtWAJwaUhYR5Qkh/oBmUExUkwbKGGsTfgxPxqYzCZg9oBue7MMTSTcFTnoNMxea++Z1gaaLUpf0CgCsud/OQgh7aO66nieEMAcwAsCnDyZUxlhrFpmUh3/tvYr+7h3xr8d54EpT4aTXAES0GsBqIcQrRPRFI4pwBLBFe15PBuB7IvqlSYNkjLV6GYVlmLstHPaWplgzpTeMeOBKk+Gk1wiNTHggoisAejVxOIyxNqRMocILW8ORX6rAj/P6wbadidQhtSmc9BhjrIVQqwlvfB+JK8l5WD+tD9854QHgNjNjjLUQq47F4deraXhnlBdG+jpIHU6bxC29BhBC9K5rPRFdaq5YGGNty97Lyfji95t4KtgZcwbXOc8F+xs46TXMijrWEYBhzRUIY6ztCEvIwds/XkVod1t8/A9/CCHuvxNrFE56DUBEQ6WOgTHWttzJLsGcbeFwsjHH+ml9YGLEZ50eJE56jaSdScUHgJluGRFtlS4ixlhrk1+qwOwtF6FSE76dGYwOFjxS80HjpNcIQojFAIZAk/QOAngMwGkAnPQYY/VSrlRhztYwJGYXY8vsEHS3t5Q6JIPA7ejGmQhgOIC7RPQsgEAAPLaYMVYvajXh9e8jcT4+B/+ZFIj+7nZSh2QwOOk1TikRqQEohRBWADIAdJU4JsZYK/HJwRj8eiUN7z7mhXFBDZq2l/1N3L3ZOGFCiA4AvoFmDs4iAOckjYgx1ipsOHUb356Ox6z+bnxpggQ46TUCEb2kfbpeCHEIgJV2ijHGGKvVgchUfPxrDB73d8D7o3340gQJcPdmI1S+dx4RJRDRlfreT48xZpjO3srCwu8jEeJmi5VPBUEu44QnBW7pNUBT3k+PMWY4rqXmY+7WcLh2tMA3M4JhZiyXOiSDxUmvYSrfT6/ylGP1up8eY8zw3M4swoxvL6C9mRE2zw6BtYWx1CEZNE56DdAE99NjjBmQlLxSTNtwHgCw7fm+cOpgLnFEjJNe43wlhPgngMHa138C+IqIFNKFxBhrSTILyzF9w3kUliux84VQuPPF5y0CJ73GWQvAWPsTAKYDWAfgeckiYoy1GPmlCszYeAGp+aXY/lxf+Dnx3BUtBSe9BhBCGBGREsBDRBRYadXvQohIqeJijLUcJRVKPLf5Im5mFGLDzIcQ7GYrdUisEr5koWEuaH+qhBDuuoVCiO4AVNKExBhrKcqVKry4/RIu3cnF6md64WFPe6lDYvfgll7D6C5RWAjgDyHEbe1rNwDPShIRY6xFKFeqMG/7JZyMy8TyJwPwuL+j1CGxGnDSaxh7IcTr2udfAdBdbKMC0AvAH5JExRiTVIVSjfk7LuH36xn4ZLwfnnqIp+JtqTjpNYwcgCX+1+LTMQLQvvnDYYxJTaFS4+XvLuFYTAY+GueLqX1dpQ6J1YGTXsOkEdFSqYNgjLUMCpUar3x3GUei07FkrC+m93OTOiR2HzyQpWF4sjzGGABAqVLjtV0ROHTtLj4Y7YOZ/d2kDonVAye9hhkudQCMMekpVGq8tjsCv15Nw3tPeGP2wG5Sh8TqiZNeAxBRzt/ZXwjRVQjxhxAiWghxTQjxalPFxhhrHuVKFebvuIRfrqThX4974flBfE+81oTP6TUvJYA3iOiSEKI9gHAhxFEiipY6MMbY/ZVWqPDi9nCciMvEh2N8MGsAt/BaG056zYiI0gCkaZ8XCiFioLklESc9xlq4onIlnt9yEefjc7D8yQC+LKGV4qQnESGEGzTX9p2/Z/kcAHMAwMXFpfkDY4xVk1+qwKxNF3AlOR+fPx2EcUF8+8zWis/pSUAIYQngJwCvEVFB5XVE9DURBRNRsL09T2HEmNRyiisw5Zu/EJWSjy+n9OaE18pxS6+ZCSGMoUl4O4hoj9TxMMZql5ZfihnfXsCdnBJ8MyMYQ3p2kjok9jdx0mtGQggB4FsAMUS0Uup4GGO1u5lRiBnfXkBhmRJbZocgtHtHqUNiTYC7N5vXAGjuvTdMCBGhfTwudVCMsarCE3Mxcf05KNSE3XP7ccJrQ7il14yI6DR4VhfGWrTfr6fjpR2X4GBlhm3P9UVXWwupQ2JNiJMeY4xp/RCWhHf2XIVvFytsnPUQ7CxNpQ6JNTFOeowxg0dEWHfiFpYfisUgDzusm9YHlqb88dgW8V+VMWbQFCo13t8XhV0XkzAuqAs+mxgIEyMe7tBWcdJjjBms/FIFXtoRjjM3s/HKsB5Y8IgnZDI+7d6WcdJjjBmkpJwSPLv5IhKzi/GfSYGY2MdZ6pBYM+CkxxgzOOGJuZizNQxKNWHr7L7o586XJBgK7rhmjLV9O3YAbm6ATIaSLs7Y8eoyWJoZYc9L/TnhGRhu6THG2rYdO4A5c4CSEgCARVoK/u+3/0I51heW9kMlDo41N27pMcbatkWL9AlPx6yiHJZLF0sUEJMSJz3GWJtGd+7UvKK25axN46THGGuzjly7izSrWm7RxferNEic9BhjbY5KTVh5NA5ztoXju3FzoTY3r7qBhQXwySfSBMckxUmPMdamZBWVY+bGC/jv8Rt4srczXt6wGLJvvgFcXQEhND+//hqYOlXqUJkEePQmY6zNOH87G6/svIz8UgWWPxmAScHOEEJoEhwnOQZOeoyxNkCtJnx18jb+cyQWLrYW2PxsCHy6WEkdFmuBOOkxxlq13OIKvPFDJH6/noEnAhzx7wn+aG9mLHVYrIXipMcYa7XO3srC67sjkV1cjqXjfDE91FXTnclYLTjpMcZanQqlGiuOxuLrk7fRrWM7fDNjAPydraUOi7UCnPQYY63KrcwivLrrMqJSCjA5xAXvj/aGhQl/lLH64SOFMdYqEBF2XkjC0l+uwdxYjq+m98FIXwepw2KtDCc9xliLl15Qhn/tuYrj1zMwsIcdVjwViM5WZlKHxVohTnqMsRaLiLD3cgo+PHAN5Uo13nvCG7MHdOO7m7NG46THGGuRMgrK8K+9V3EsJgN9XG3w2cQAdLe3lDos1spx0mOMtShEhH0RKfjwQDTKFCq894Q3nh3QDXJu3bEmwEmPMdZiJOWUYPGBa/j9uqZ1t3xiANy5dceaECc9xpjkFCo1Np6Ox+fHbkAI4P3RPpjV341bd6zJcdJrRkKIjQBGA8ggIj+p42GsJbh0Jxf/2nMV1+8W4hHvzlg6zhddOpjff0fGGoGTXvPaDGANgK0Sx8GY5PJLFfjP4VhsP5+Izu3N+Lo71iw46TUjIjophHCTOg7GpKRSE74PS8J/Dscit6QCs/q74Y1He8LSlD+O2IPHR1kLI4SYA2AOALi4uEgcDWNNKywhB4sPXMO11AIEu9pgy9gQ+DnxnJms+XDSa2GI6GsAXwNAcHAwSRwOY00iLb8U//7tOvZHpMLBygyrnwnC2MAufEcE1uw46THGHpiiciW+OXkbX5+8DRURXh7aAy8NdecJoplk+MhjjDU5hUqNXRfuYPXxG8gqqsDj/g54Z5Q3XDpaSB0aM3Cc9JqREGIngCEA7IQQyQAWE9G30kbFWNMhIvwWdRefHY5FfFYxQrrZ4psZXujlYiN1aIwB4KTXrIhostQxMPYgEBHO3srGf47E4vKdPHh2tsS3M4MxzKsTn7djLQonPcbY33L2VhY+P3oDFxJy4GBlhuVPBuDJPs48mwprkTjpMcYa5a/b2Vh1NA7n43PQ2coUS8f54umHusLUSC51aIzVipMeY6zedN2Ya36/iXO3s2Hf3hSLx/hgcogLzIw52bGWj5MeY+y+VGrC4Wt3sf7ELVxJzod9e1O8P9oHU/tysmOtCyc9xlitypUq7L2Ugq9O3kZ8VjHcOlrg/8b7Y0JvJ052rFXipMcYqya7qBzfnb+DbX8lIqOwHH5OVvhySm+M8nPgASqsVeOkxxjTu5aaj01nEnAgMhUVSjUGedhh5VNBGNCjI196wNoETnqMGTiFSo1j0enYdCYBFxJyYG4sx1PBzpjV3w09OrWXOjzGmhQnPcYMVFJOCXZeuIPvw5KRVVQOZxtzLHrcG08Fd4W1hbHU4TH2QHDSY8yA6Fp13124g1M3siATwDCvTnjmIRcM9erE5+tYm8dJj7E2johwLbUAP11Kxs+RqcgqqkAXazMseMQTTz3kDEdrc6lDZKzZcNJjrI1Kyy/Fvsup2HMpGTcyimAil2G4dydMCnbGw57cqmOGiZMeY21IdlE5Dl9Lxy9XUnHudjaIgD6uNvj4H34YHeCIDhYmUofImKQ46THWyuUUV+Dwtbv49Uoazt3OhkpN6GbXDq8M88CEXk5ws2sndYiMtRic9BhrLXbsABYtAu7cgdLJGaeffR3fuITir9s5UKkJbh0t8OLD3fGEfxd4O7bn6+oYqwEnPcZaAfX2HaA5L0BeWgoAMEpOQsiyd3Bm0kIEzJiG0QGO8HG04kTH2H1w0mOshcouKsfZW9n4IzYDC19+HV20CU/HQlmORWe3A999LFGEjLU+nPQYayGKy5W4kJCDszezcPpmNmLSCgAA1ubGWJGfWfNOd+40Y4SMtX6c9BiTSGmFCpHJeTh/OwdnbmbhclIuFCqCiVyGPq42WPioJwb0sIO/kzXEJhcgMbF6IS4uzR84Y60YJz3GmklGQRnCEnMRnpiLsMRcXEvJh1JNEALw62KN5wZ2x4AeHRHsagtzk3tu2/PJJ8CcOUBJyf+WWVholjPG6o2THmMPQEmFEjFpBbianI/I5HyEJeYgKUdzTs7USIZA5w54YXB3BLvaoI+rzf2vn5s6VfNTO3oTLi6ahKdbzhirF0FEUsfAahEcHExhYWFSh8Huo6hciejUAlxNyUeU9nErswhq7b+WnaUpgl1tEOymSXC+XaxhYiSTNmjG2jAhRDgRBde0jlt6jNVTmUKFmxlFuJFRiLj0ItxI1/xMyi2B7rtjp/am8HeyxmP+jvB3soa/kzU6W5nypQSMtRCc9FjbUOnC7b/T9adWE9ILy5CQVYKE7GIkZBcjPrMYNzKKkJhdrG+9GckEutu3g7+zNSb2cYafkxX8ulijk5VZE1eMMdaUOOmx1m/HjqqDPBITNa+BaomPiJBTXIHUvDKk5pciLa8UKXmlSMzWJLnE7BKUK9X67U3kMrh0tICXQ3uMCewCz86W8OzcHm4d23EXJWOtECc91votWlR1VCMAlJSgeOHbWG8fjNS8MqTllyI1rxRp+WVVkhoAmBjJ4GprATe7dnjY0x6uHduhm107uHa0gKO1Od+NgLE2hJNeMxNCjAKwGoAcwAYi+neT/oIm6uaTrHxouhgLy5UoKFUgv1Sh/1n5kVNcgayiCmQVlWNP4h3U1OYyv5uKL/+4ic5WZnC0NoOfkzUe9XWAo7UZHK3N4dTBHI4dzNCxnQmfc2PMQHDSa0ZCCDmALwGMAJAM4KIQ4gARRTfJL2hAN199ERGIAKWaoN6xA6bzXoQo/V/56hdeQHJOKTLHTkCFklChUkOhVEOhUqNCpUaZQoWSCt1DqflZrkKJQoXSCiWK73leWKZAYbkSdQ0qlssEbNuZoGM7E9i3N0WenQNss9Kqbafu6oy4jx+DkZy7IRljGpz0mlcIgJtEdBsAhBC7AIwD0DRJr5Zuvrsvv44nkxxBRFAToCL633M1Qa1NbGoiqNSVnmuX65xe9wacS6uWLysthey9f+HJFMf7hieXCVgYy2FhKoeFiREsTOSwMJHD2twYXazNYG4ih5WZMazMjGBlbgxrc2P9z8rP25nIq7bMzD6r8cJto2XLAE54jLFKOOk1LycASZVeJwPoW3kDIcQcAHMAwKWhU0zVMg9j5/xMhHbvCJkAZEJAJtP+FEKzTFbpuRDa15W3EZDLAKflWTVXqjALW2aHwFguYGokg7FcBhPtTzNjuT7RmchlD6YbkS/cZozVE1+c3oyEEBMBjCKi57WvpwPoS0Qv17R9gy9Od3OreX5GV1cgIaHhATd3+Ywx1gTqujid+36aVwqArpVeO2uXNY1PPtHMx1hZU87P+KDLZ4yxB4yTXvO6CMBDCNFNCGEC4BkAB5qs9KlTga+/1rS8hND8/Prrpuvme9DlM8bYA8bdm81MCPE4gM+huWRhIxHV2kziuTcZY6zheO7NFoSIDgI4KHUcjDFmiLh7kzHGmMHgpMcYY8xgcNJjjDFmMDjpMcYYMxg8erMFE0JkAqjhavA2zQ5AzVO/tH2GWndDrTdguHV/0PV2JSL7mlZw0mMtihAirLahxm2dodbdUOsNGG7dpaw3d28yxhgzGJz0GGOMGQxOeqyl+VrqACRkqHU31HoDhlt3yerN5/QYY4wZDG7pMcYYMxic9BhjjBkMTnqsWQkhNgohMoQQUZWW2Qohjgohbmh/2miXCyHEf4UQN4UQV4QQvaWL/O8RQnQVQvwhhIgWQlwTQryqXd6m6y6EMBNCXBBCRGrrvUS7vJsQ4ry2fru1t9qCEMJU+/qmdr2bpBVoAkIIuRDishDiF+1rg6i7ECJBCHFVCBEhhAjTLpP8eOekx5rbZgCj7ln2DoDjROQB4Lj2NQA8BsBD+5gDYF0zxfggKAG8QUQ+AEIBzBdC+KDt170cwDAiCgQQBGCUECIUwKcAVhFRDwC5AJ7Tbv8cgFzt8lXa7Vq7VwHEVHptSHUfSkRBla7Jk/54JyJ+8KNZHwDcAERVeh0LwFH73BFArPb5VwAm17Rda38A2A9ghCHVHYAFgEsA+kIzG4eRdnk/AIe1zw8D6Kd9bqTdTkgd+9+oszM0H+7DAPwCQBhQ3RMA2N2zTPLjnVt6rCXoTERp2ud3AXTWPncCkFRpu2TtslZN223VC8B5GEDdtd17EQAyABwFcAtAHhEptZtUrpu+3tr1+QA6NmvATetzAG8BUGtfd4Th1J0AHBFChAsh5miXSX68801kWYtCRCSEaLPX0QghLAH8BOA1IioQQujXtdW6E5EKQJAQogOAvQC8pI2oeQghRgPIIKJwIcQQicORwkAiShFCdAJwVAhxvfJKqY53bumxliBdCOEIANqfGdrlKQC6VtrOWbusVRJCGEOT8HYQ0R7tYoOoOwAQUR6AP6Dp0usghNB96a5cN329teutAWQ3b6RNZgCAsUKIBAC7oOniXA3DqDuIKEX7MwOaLzshaAHHOyc91hIcADBT+3wmNOe7dMtnaEd2hQLIr9Q10qoITZPuWwAxRLSy0qo2XXchhL22hQchhDk05zFjoEl+E7Wb3Vtv3fsxEcDvpD3J09oQ0btE5ExEbgCegaYuU2EAdRdCtBNCtNc9B/AogCi0hONd6pOd/DCsB4CdANIAKKDpt38OmvMWxwHcAHAMgK12WwHgS2jOAV0FECx1/H+j3gOhOcdxBUCE9vF4W687gAAAl7X1jgLwgXZ5dwAXANwE8AMAU+1yM+3rm9r13aWuQxO9D0MA/GIoddfWMVL7uAZgkXa55Mc7T0PGGGPMYHD3JmOMMYPBSY8xxpjB4KTHGGPMYHDSY4wxZjA46THGGDMYnPQYM1BCiLN1rBuiuytAPctaKoR4pGkiY+zB4WnIGDNQRNS/Ccv6oKnKYuxB4pYeYwZKCFGknQHjMyFElPbeZ09X2sRKCPGrECJWCLFeCCHTTh69udL2C7RlbRZCTBRCBGvvnxahXU/a9e5CiEPayYdPCSEMYv5N1vJwS48xwzYBmvvcBQKwA3BRCHFSuy4EgA+ARACHtNvGA3AiIj8A0E0xpkNEYdryIIT4TLsfAHwN4EUiuiGE6AtgLTRzUTLWrDjpMWbYBgLYSZo7IaQLIU4AeAhAAYALRHQbAIQQO7XbHgfQXQjxBYBfARypqVBti7E3gEe1d5boD+CHSneVMH1wVWKsdpz0GGO1uXeOQiKiXCFEIICRAF4E8BSA2ZU3EkL4AfgQwGAiUgkhZNDcQy7owYfMWN34nB5jhu0UgKe15+rsAQyGZrJjAAgRQnTTJq2nAZwWQtgBkBHRTwDeg6Y1p6ft7twJYAYRZQIAERUAiBdCTNJuI7SJk7Fmxy09xgwXQXOfs37QzIZPAN4iorvagSYXAawB0AOa2+HsBeAPYJM2EQLAu/eUOQ6AK4BvdF2Z2hbeVADrhBDvATCG5v5ykQ+sZozVgu+ywJgBEkJ0BHCJiFyljoWx5sTdm4wZGCFEFwDnAPxH6lgYa27c0mOMMWYwuKXHGGPMYHDSY4wxZjA46THGGDMYnPQYY4wZDE56jDHGDMb/A/9i7CIX6j0cAAAAAElFTkSuQmCC\n", "text/plain": [ "
" ] }, "metadata": { "needs_background": "light" }, "output_type": "display_data" } ], "source": [ "plt.clf()\n", "fig, ax = model_obj.display(RSS=False)\n", "plt.show()" ] } ], "metadata": { "kernelspec": { "display_name": "Python 3", "language": "python", "name": "python3" }, "language_info": { "codemirror_mode": { "name": "ipython", "version": 3 }, "file_extension": ".py", "mimetype": "text/x-python", "name": "python", "nbconvert_exporter": "python", "pygments_lexer": "ipython3", "version": "3.9.12" }, "papermill": { "default_parameters": {}, "duration": 3.253235, "end_time": "2024-04-05T18:05:46.769167", "environment_variables": {}, "exception": null, "input_path": "03_extrap-with-metadata-aggregated.ipynb", "output_path": "03_extrap-with-metadata-aggregated.ipynb", "parameters": {}, "start_time": "2024-04-05T18:05:43.515932", "version": "2.5.0" }, "vscode": { "interpreter": { "hash": "e9b2a95c73c2c3cbd2385f2b17bb401a2882e839041a509387bd5d08c5b62925" } } }, "nbformat": 4, "nbformat_minor": 5 }