blob: cd46046f0531a1fbf7384b41c00bd8a392e11b4c [file] [log] [blame]
{
"cells": [
{
"cell_type": "markdown",
"metadata": {},
"source": [
"<center>\n",
"<h1>Energy Model Building Flow - Example 1</h1>\n",
"<h2>for platforms supporting per-cluster energy meters</h2>\n",
"</center>"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"This notebook shows how to build an energy model of a JUNO platform running a Linux kernel.\n",
"\n",
"It can be used as a reference implementation of an energy model building flow for platforms<br>\n",
"where it's possible to measure the energy consumption of each frequency domain.\n",
"\n",
"For JUNO, Linux kernel Hardware monitors will be used to measure energy.<br>\n",
"Hardware monitors measure energy in microJoule [$\\mu$J]."
]
},
{
"cell_type": "code",
"execution_count": 1,
"metadata": {
"collapsed": true
},
"outputs": [],
"source": [
"import logging\n",
"from conf import LisaLogging\n",
"LisaLogging.setup()"
]
},
{
"cell_type": "code",
"execution_count": 3,
"metadata": {
"collapsed": false
},
"outputs": [],
"source": [
"%matplotlib inline\n",
"\n",
"import devlib\n",
"import json\n",
"import matplotlib.pyplot as plt\n",
"import numpy as np\n",
"import os\n",
"import pandas as pd\n",
"import re\n",
"import trappy\n",
"\n",
"from collections import namedtuple, OrderedDict\n",
"from csv import DictWriter\n",
"from devlib.utils.misc import ranges_to_list\n",
"from env import TestEnv\n",
"from matplotlib.ticker import FormatStrFormatter, MaxNLocator\n",
"from scipy.stats import linregress\n",
"from time import sleep\n",
"from trappy.plotter.ColorMap import ColorMap"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"# Configuration"
]
},
{
"cell_type": "code",
"execution_count": 3,
"metadata": {
"collapsed": true
},
"outputs": [],
"source": [
"# Setup a target configuration\n",
"my_conf = {\n",
" \n",
" # Target platform and board\n",
" \"platform\" : 'linux',\n",
" \"board\" : 'juno',\n",
" \n",
" # Target board IP/MAC address\n",
" \"host\" : '10.1.211.18',\n",
" \n",
" # Login credentials\n",
" \"username\" : 'root',\n",
" \"password\" : '',\n",
" \n",
" # Tools required by the experiments\n",
" \"tools\" : ['trace-cmd'],\n",
" \"modules\" : ['hwmon', 'bl', 'cpufreq', 'cpuidle', 'hotplug', 'cgroups'],\n",
" \n",
" # Energy meters description\n",
" \"emeter\" : {\n",
" 'instrument' : 'hwmon',\n",
" 'conf' : {\n",
" 'sites' : [ 'a53', 'a57' ],\n",
" 'kinds' : [ 'energy' ],\n",
" },\n",
" 'channel_map' : {\n",
" 'little' : 'a53',\n",
" 'big' : 'a57',\n",
" }\n",
" },\n",
" \n",
" # FTrace events to collect for all the tests configuration which have\n",
" # the \"ftrace\" flag enabled\n",
" \"ftrace\" : {\n",
" \"events\" : [\n",
" \"cpu_frequency\",\n",
" \"cpu_idle\",\n",
" \"sched_switch\"\n",
" ],\n",
" \"buffsize\" : 10 * 1024,\n",
" },\n",
"}"
]
},
{
"cell_type": "code",
"execution_count": 4,
"metadata": {
"collapsed": false,
"scrolled": false
},
"outputs": [
{
"name": "stderr",
"output_type": "stream",
"text": [
"2016-09-08 19:27:12,272 INFO : Target - Using base path: /data/lisa\n",
"2016-09-08 19:27:12,273 INFO : Target - Loading custom (inline) target configuration\n",
"2016-09-08 19:27:12,274 INFO : Target - Devlib modules to load: ['cgroups', 'hwmon', 'cpufreq', 'bl', 'hotplug', 'cpuidle']\n",
"2016-09-08 19:27:12,275 INFO : Target - Connecting linux target:\n",
"2016-09-08 19:27:12,276 INFO : Target - username : root\n",
"2016-09-08 19:27:12,276 INFO : Target - host : 10.1.211.18\n",
"2016-09-08 19:27:12,277 INFO : Target - password : \n",
"2016-09-08 19:27:12,278 INFO : Target - Connection settings:\n",
"2016-09-08 19:27:12,279 INFO : Target - {'username': 'root', 'host': '10.1.211.18', 'password': ''}\n",
"2016-09-08 19:27:54,035 INFO : Target - Initializing target workdir:\n",
"2016-09-08 19:27:54,037 INFO : Target - /root/devlib-target\n",
"2016-09-08 19:28:10,999 INFO : Target - Topology:\n",
"2016-09-08 19:28:11,001 INFO : Target - [[0, 3, 4, 5], [1, 2]]\n",
"2016-09-08 19:28:12,634 INFO : Platform - Loading default EM:\n",
"2016-09-08 19:28:12,636 INFO : Platform - /data/lisa/libs/utils/platforms/juno.json\n",
"2016-09-08 19:28:13,839 INFO : FTrace - Enabled tracepoints:\n",
"2016-09-08 19:28:13,841 INFO : FTrace - cpu_frequency\n",
"2016-09-08 19:28:13,842 INFO : FTrace - cpu_idle\n",
"2016-09-08 19:28:13,843 INFO : FTrace - sched_switch\n",
"2016-09-08 19:28:13,844 INFO : HWMon - Scanning for HWMON channels, may take some time...\n",
"2016-09-08 19:28:13,850 INFO : HWMon - Channels selected for energy sampling:\n",
"2016-09-08 19:28:13,851 INFO : HWMon - a57_energy\n",
"2016-09-08 19:28:13,852 INFO : HWMon - a53_energy\n",
"2016-09-08 19:28:13,853 INFO : TestEnv - Set results folder to:\n",
"2016-09-08 19:28:13,854 INFO : TestEnv - /data/lisa/results/20160908_192813\n",
"2016-09-08 19:28:13,855 INFO : TestEnv - Experiment results available also in:\n",
"2016-09-08 19:28:13,856 INFO : TestEnv - /data/lisa/results_latest\n"
]
}
],
"source": [
"# Initialize a test environment using:\n",
"# the provided target configuration (my_conf)\n",
"te = TestEnv(target_conf=my_conf, force_new=True)\n",
"target = te.target"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"## Energy Model Parameters (CPUs, OPPs and Idle States)"
]
},
{
"cell_type": "code",
"execution_count": 5,
"metadata": {
"collapsed": true
},
"outputs": [],
"source": [
"# The EM reports capacity and energy consumption for each frequency domain.\n",
"# The frequency domains to be considered by the following EM building flow\n",
"# are described by the parameters of this named tuple\n",
"ClusterDescription = namedtuple('ClusterDescription',\n",
" ['name', 'emeter_ch', 'core_name',\n",
" 'cpus', 'freqs', 'idle_states'])"
]
},
{
"cell_type": "code",
"execution_count": 6,
"metadata": {
"collapsed": false
},
"outputs": [],
"source": [
"# List of frequency domains (i.e. clusters) to be considered for the EM\n",
"clusters = [\n",
" ClusterDescription(\n",
" # Name of the cluster\n",
" name = \"big\",\n",
" # Name of the energy meter channel as specified in the target configuration\n",
" emeter_ch = \"big\",\n",
" # Name of the cores in the cluster\n",
" core_name = target.big_core,\n",
" # List of cores in the cluster\n",
" cpus = target.bl.bigs,\n",
" # List of frequencies available in the cluster\n",
" freqs = target.bl.list_bigs_frequencies(),\n",
" # List of idle states available in the cluster\n",
" idle_states = range(len(target.cpuidle.get_states()))\n",
" ),\n",
" ClusterDescription(\"little\",\n",
" \"little\",\n",
" target.little_core,\n",
" target.bl.littles,\n",
" target.bl.list_littles_frequencies(),\n",
" range(len(target.cpuidle.get_states()))\n",
" )\n",
"]"
]
},
{
"cell_type": "code",
"execution_count": 7,
"metadata": {
"collapsed": false
},
"outputs": [
{
"data": {
"text/plain": [
"[ClusterDescription(name='big', emeter_ch='big', core_name='A72', cpus=[1, 2], freqs=[600000, 1000000, 1200000], idle_states=[0, 1, 2]),\n",
" ClusterDescription(name='little', emeter_ch='little', core_name='A53', cpus=[0, 3, 4, 5], freqs=[450000, 800000, 950000], idle_states=[0, 1, 2])]"
]
},
"execution_count": 7,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"clusters"
]
},
{
"cell_type": "code",
"execution_count": 8,
"metadata": {
"collapsed": false
},
"outputs": [],
"source": [
"# Mapping between cluster names and cluster IDs\n",
"cluster_ids = OrderedDict([(0, 'little'), (1, 'big')])"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"## Benchmark example"
]
},
{
"cell_type": "code",
"execution_count": 9,
"metadata": {
"collapsed": false
},
"outputs": [],
"source": [
"class Sysbench(object):\n",
" \"\"\"\n",
" Sysbench benchmark class.\n",
" \n",
" :param duration: maximum workload duration in seconds\n",
" :type duration: int\n",
" \"\"\"\n",
" sysbench_path = \"/data/local/tmp/bin/sysbench\"\n",
" \n",
" def __init__(self, target, duration):\n",
" self.target = target\n",
" self.duration = duration\n",
"\n",
" def run(self, cgroup, threads):\n",
" \"\"\"\n",
" Run benchmark using the specified number of 'threads'\n",
" to be executed under the specified 'cgroup'.\n",
" \n",
" :param cgroup: cgroup where to run the benchmark on\n",
" :type cgroup: str\n",
" \n",
" :param threads: number of threads to spawn\n",
" :type threads: int\n",
" \n",
" :returns: float - performance score\n",
" \"\"\"\n",
" bench_out = self.target.cgroups.run_into(\n",
" cgroup,\n",
" \"{} --test=cpu --num-threads={} --max-time={} run\"\n",
" .format(self.sysbench_path, threads, self.duration)\n",
" )\n",
" match = re.search(r'(total number of events:\\s*)([\\d.]*)', bench_out)\n",
" return float(match.group(2))"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"# Utility Functions"
]
},
{
"cell_type": "code",
"execution_count": 10,
"metadata": {
"collapsed": false
},
"outputs": [],
"source": [
"def linfit(x, y):\n",
" slope, intercept, r, p, stderr = linregress(x, y)\n",
" return slope, intercept"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"# Energy Model Building"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"## Active States Profiling"
]
},
{
"cell_type": "code",
"execution_count": 11,
"metadata": {
"collapsed": false
},
"outputs": [],
"source": [
"def compute_power_perf(clusters, loop_cnt, benchmark, bkp_file='pstates.csv'):\n",
" \"\"\"\n",
" Perform P-States profiling on each input cluster.\n",
" \n",
" This method requires a `benchmark` object with the following\n",
" characteristics:\n",
" \n",
" - duration, attribute that tells the workload duration in seconds\n",
" - run(cgroup, threads), run the benchmark into the specified 'cgroup',\n",
" spawning the specified number of 'threads',\n",
" and return a performance score of their execution.\n",
" \n",
" Data will be saved into a CSV file at each iteration such that, if something\n",
" goes wrong, the user can restart the experiment considering only idle_states\n",
" that had not yet been profiled.\n",
" \n",
" :param clusters: list of clusters to profile\n",
" :type clusters: list(namedtuple(ClusterDescription))\n",
" \n",
" :param loop_cnt: number of iterations for each experiment\n",
" :type loop_cnt: int\n",
" \n",
" :param benchmark: benchmark object\n",
" :type benchmark: int\n",
" \n",
" :param bkp_file: CSV file name\n",
" :type bkp_file: str\n",
" \"\"\"\n",
"\n",
" # Make sure all CPUs are online\n",
" target.hotplug.online_all()\n",
"\n",
" # Set cpufreq governor to userpace to allow manual frequency scaling\n",
" target.cpufreq.set_all_governors('userspace')\n",
"\n",
" bkp_file = os.path.join(te.res_dir, bkp_file)\n",
" with open(bkp_file, 'w') as csvfile:\n",
" writer = DictWriter(csvfile,\n",
" fieldnames=['cluster', 'cpus', 'freq',\n",
" 'perf', 'energy', 'power'])\n",
"\n",
" # A) For each cluster (i.e. frequency domain) to profile...\n",
" power_perf = []\n",
" for cl in clusters:\n",
" target_cg, _ = target.cgroups.isolate(cl.cpus)\n",
"\n",
" # P-States profiling requires to plug in CPUs one at the time\n",
" for cpu in cl.cpus:\n",
" target.hotplug.offline(cpu)\n",
"\n",
" # B) For each additional cluster's plugged in CPU...\n",
" on_cpus = []\n",
" for cnt, cpu in enumerate(cl.cpus):\n",
"\n",
" # Hotplug ON one more CPU\n",
" target.hotplug.online(cpu)\n",
" on_cpus.append(cpu)\n",
" \n",
" # Ensure online CPUs are part of the target cgroup\n",
" # (in case hotplug OFF removes it)\n",
" target_cg.set(cpus=on_cpus)\n",
" cl_cpus = set(target.list_online_cpus()).intersection(set(cl.cpus))\n",
" logging.info('Cluster {:8} (Online CPUs : {})'\\\n",
" .format(cl.name, list(cl_cpus)))\n",
"\n",
" # C) For each OPP supported by the current cluster\n",
" for freq in cl.freqs:\n",
" \n",
" # Set frequency to freq for current CPUs\n",
" target.cpufreq.set_frequency(cpu, freq)\n",
"\n",
" # Run the benchmark for the specified number of iterations each time\n",
" # collecting a sample of energy consumption and reported performance\n",
" energy = 0\n",
" perf = 0\n",
" for i in xrange(loop_cnt):\n",
" te.emeter.reset()\n",
" # Run benchmark into the target cgroup\n",
" perf += benchmark.run(target_cg.name, cnt + 1)\n",
" nrg = te.emeter.report(te.res_dir).channels\n",
" energy += nrg[cl.emeter_ch]\n",
" sleep(10)\n",
"\n",
" # Compute average energy and performance for the current number of\n",
" # active CPUs all running at the current OPP\n",
" perf = perf / loop_cnt\n",
" energy = energy / loop_cnt\n",
" power = energy / benchmark.duration\n",
" logging.info(' avg_prf: {:7.3}, avg_pwr: {:7.3}'\n",
" .format(perf, power))\n",
"\n",
" # Keep track of this new P-State profiling point\n",
" new_row = {'cluster': cl.name,\n",
" 'cpus': cnt + 1,\n",
" 'freq': freq,\n",
" 'perf': perf,\n",
" 'energy' : energy,\n",
" 'power': power}\n",
" power_perf.append(new_row)\n",
"\n",
" # Save data in a CSV file\n",
" writer.writerow(new_row)\n",
" \n",
" # C) profile next P-State\n",
"\n",
" # B) add one more CPU (for the current frequency domain)\n",
"\n",
" # A) Profile next cluster (i.e. frequency domain)\n",
"\n",
" target.hotplug.online_all()\n",
"\n",
" power_perf_df = pd.DataFrame(power_perf)\n",
" \n",
" return power_perf_df.set_index(['cluster', 'freq', 'cpus'])\\\n",
" .sort_index(level='cluster')"
]
},
{
"cell_type": "code",
"execution_count": 12,
"metadata": {
"collapsed": false,
"scrolled": true
},
"outputs": [
{
"name": "stderr",
"output_type": "stream",
"text": [
"2016-09-08 19:28:35,671 INFO : Cluster big - Online CPUs : set([1])\n",
"2016-09-08 19:34:11,966 INFO : Cluster big - Online CPUs : set([1, 2])\n",
"2016-09-08 19:39:55,727 INFO : Cluster little - Online CPUs : set([0])\n",
"2016-09-08 19:45:32,850 INFO : Cluster little - Online CPUs : set([0, 3])\n",
"2016-09-08 19:51:09,860 INFO : Cluster little - Online CPUs : set([0, 3, 4])\n",
"2016-09-08 19:56:46,850 INFO : Cluster little - Online CPUs : set([0, 3, 4, 5])\n"
]
}
],
"source": [
"sysbench = Sysbench(target, 10)\n",
"loop_cnt = 5\n",
"\n",
"power_perf_df = compute_power_perf(clusters, loop_cnt, sysbench)"
]
},
{
"cell_type": "code",
"execution_count": 13,
"metadata": {
"collapsed": true
},
"outputs": [],
"source": [
"def plot_pstates(power_perf_df, cluster):\n",
" \"\"\"\n",
" Plot P-States profiling for the specified cluster.\n",
" \n",
" :param power_perf_df: DataFrame reporting power and performance values\n",
" :type power_perf_df: :mod:`pandas.DataFrame`\n",
" \n",
" :param cluster: cluster description\n",
" :type cluster: namedtuple(ClusterDescription)\n",
" \"\"\"\n",
" cmap = ColorMap(len(cluster.freqs))\n",
" color_map = map(cmap.cmap, range(len(cluster.freqs)))\n",
" color_map = dict(zip(cluster.freqs, color_map))\n",
" \n",
" fig, ax = plt.subplots(1, 1, figsize=(16, 10))\n",
" \n",
" grouped = power_perf_df.loc[cluster.name].groupby(level='freq')\n",
" for freq, df in grouped:\n",
" x = df.index.get_level_values('cpus').tolist()\n",
" y = df.power.tolist()\n",
" slope, intercept = linfit(x, y)\n",
" x.insert(0, 0)\n",
" y.insert(0, intercept)\n",
" # Plot linear fit of the points\n",
" ax.plot(x, [slope*i + intercept for i in x], color=color_map[freq])\n",
" # Plot measured points\n",
" ax.scatter(x, y, color=color_map[freq], label='{} kHz'.format(freq))\n",
"\n",
" ax.set_title('JUNO {} cluster P-States profiling'.format(cluster.name),\n",
" fontsize=16)\n",
" ax.legend()\n",
" ax.set_xlabel('Active cores')\n",
" ax.set_ylabel('Power [$\\mu$W]')\n",
" ax.set_xlim(-0.5, len(cluster.cpus)+1)\n",
" ax.xaxis.set_major_locator(MaxNLocator(integer=True))\n",
" ax.yaxis.set_major_formatter(FormatStrFormatter('%.2f'))\n",
" ax.grid(True)"
]
},
{
"cell_type": "code",
"execution_count": 14,
"metadata": {
"collapsed": false
},
"outputs": [
{
"data": {
"image/png": "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\n",
"text/plain": [
"<matplotlib.figure.Figure at 0x7f1d8955cd10>"
]
},
"metadata": {},
"output_type": "display_data"
}
],
"source": [
"big_cl = clusters[0]\n",
"plot_pstates(power_perf_df, big_cl)"
]
},
{
"cell_type": "code",
"execution_count": 15,
"metadata": {
"collapsed": false
},
"outputs": [
{
"data": {
"image/png": "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\n",
"text/plain": [
"<matplotlib.figure.Figure at 0x7f1d88c6f390>"
]
},
"metadata": {},
"output_type": "display_data"
}
],
"source": [
"little_cl = clusters[1]\n",
"plot_pstates(power_perf_df, little_cl)"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"### Statistics"
]
},
{
"cell_type": "code",
"execution_count": 16,
"metadata": {
"collapsed": false
},
"outputs": [],
"source": [
"def power_perf_stats(power_perf_df):\n",
" \"\"\"\n",
" For each cluster compute per-OPP power and performance statistics.\n",
" \n",
" :param power_perf_df: dataframe containing power and performance numbers\n",
" :type power_perf_df: :mod:`pandas.DataFrame`\n",
" \"\"\"\n",
" clusters = power_perf_df.index.get_level_values('cluster')\\\n",
" .unique().tolist()\n",
"\n",
" stats = [] \n",
" for cl in clusters:\n",
" cl_power_df = power_perf_df.loc[cl].reset_index()\n",
"\n",
" grouped = cl_power_df.groupby('freq')\n",
" for freq, df in grouped:\n",
" perf = df['perf'] / df['cpus']\n",
" power = df['power'] / df['cpus']\n",
" energy = df['energy'] / df['cpus']\n",
"\n",
" avg_row = {'cluster': cl,\n",
" 'freq': freq,\n",
" 'stats': 'avg',\n",
" 'perf': perf.mean(),\n",
" 'power': power.mean(),\n",
" 'energy': energy.mean()\n",
" }\n",
" std_row = {'cluster': cl,\n",
" 'freq': freq,\n",
" 'stats': 'std',\n",
" 'perf': perf.std(),\n",
" 'power': power.std(),\n",
" 'energy': energy.std()\n",
" }\n",
" min_row = {'cluster': cl,\n",
" 'freq': freq,\n",
" 'stats': 'min',\n",
" 'perf': perf.min(),\n",
" 'power': power.min(),\n",
" 'energy': energy.min()\n",
" }\n",
" max_row = {'cluster' : cl,\n",
" 'freq' : freq,\n",
" 'stats' : 'max',\n",
" 'perf' : perf.max(),\n",
" 'power' : power.max(),\n",
" 'energy': energy.max()\n",
" }\n",
" c99_row = {'cluster' : cl,\n",
" 'freq' : freq,\n",
" 'stats' : 'c99',\n",
" 'perf' : perf.quantile(q=0.99),\n",
" 'power' : power.quantile(q=0.99),\n",
" 'energy': energy.quantile(q=0.99)\n",
" }\n",
"\n",
" stats.append(avg_row)\n",
" stats.append(std_row)\n",
" stats.append(min_row)\n",
" stats.append(max_row)\n",
" stats.append(c99_row)\n",
" \n",
" stats_df = pd.DataFrame(stats).set_index(['cluster', 'freq', 'stats'])\\\n",
" .sort_index(level='cluster')\n",
" return stats_df.unstack()"
]
},
{
"cell_type": "code",
"execution_count": 17,
"metadata": {
"collapsed": false
},
"outputs": [],
"source": [
"pp_stats = power_perf_stats(power_perf_df)"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"### Plots"
]
},
{
"cell_type": "code",
"execution_count": 18,
"metadata": {
"collapsed": true
},
"outputs": [],
"source": [
"def plot_power_perf(pp_stats, clusters):\n",
" cmap = ColorMap(len(clusters) + 1)\n",
" color_map = map(cmap.cmap, range(len(clusters) + 1))\n",
" \n",
" fig, ax = plt.subplots(1, 1, figsize=(16, 10))\n",
"\n",
" max_perf = pp_stats.perf['avg'].max()\n",
" max_power = pp_stats.power['avg'].max()\n",
"\n",
" for i, cl in enumerate(clusters):\n",
" cl_df = pp_stats.loc[cl.name]\n",
" norm_perf_df = cl_df.perf['avg'] * 100.0 / max_perf\n",
" norm_power_df = cl_df.power['avg'] * 100.0 / max_power\n",
"\n",
" x = norm_perf_df.values.tolist()\n",
" y = norm_power_df.values.tolist()\n",
" ax.plot(x, y, color=color_map[i], marker='o', label=cl.name)\n",
"\n",
" norm_perf_df = cl_df.perf['max'] * 100.0 / max_perf\n",
" norm_power_df = cl_df.power['max'] * 100.0 / max_power\n",
"\n",
" x = norm_perf_df.values.tolist()\n",
" y = norm_power_df.values.tolist()\n",
" ax.plot(x, y, '--', color=color_map[-1])\n",
"\n",
" norm_perf_df = cl_df.perf['min'] * 100.0 / max_perf\n",
" norm_power_df = cl_df.power['min'] * 100.0 / max_power\n",
"\n",
" x = norm_perf_df.values.tolist()\n",
" y = norm_power_df.values.tolist()\n",
" ax.plot(x, y, '--', color=color_map[-1])\n",
"\n",
" ax.set_title('JUNO Power VS Performance curves', fontsize=16)\n",
" ax.legend()\n",
" ax.set_xlabel('Performance [%]')\n",
" ax.set_ylabel('Power [%]')\n",
" ax.set_xlim(0, 120)\n",
" ax.set_ylim(0, 120)\n",
" ax.xaxis.set_major_locator(MaxNLocator(integer=True))\n",
" ax.yaxis.set_major_locator(MaxNLocator(integer=True))\n",
" ax.grid(True)"
]
},
{
"cell_type": "code",
"execution_count": 19,
"metadata": {
"collapsed": false
},
"outputs": [
{
"data": {
"image/png": "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\nD+6880723HNPli9fzrJly9Z4zr/+9S9OO+00Ro4cybJlyzjzzDP5/e9/z6pVq2o0luow0ZWwrkTp\nM6aUNmNKaTOmlCbjqXoWlyz6NkEtFZrDAyXj2ICQ1+2BknEV9rGkZHEqY6zKtX9HjhzJWWedxW67\n7UYIgR49erDeeusxe/bsVMZSFSa6kiRJklQP2jTbkrji++fiCjihWTe+IuZ1O6FZtwr72KJZm7p7\nIxlFRUXcdNNNtG7dmtatW9OqVSvef/99Fi9OJ+muChNdCetKlD5jSmkzppQ2Y0ppMp6q5+qeg9lm\n4LbfJqpxBWwzcFuu7jm4TvuoSEWbTuXaiGrrrbemX79+LFu2jGXLlvHpp5/yxRdfcNxxx9VoLNXh\nrsuSJEmSVA/at23PxD7PMuDG/iwpWcwWzdpwdZ+q7ZicRh8V2WSTTWjWrBnz5s1ju+22A2CzzTbj\n/fffZ9WqVayzzjprPKdXr14cffTRHHTQQXTo0IEVK1Ywffp09t9/f5o3b75G+9pkoithXYnSZ0wp\nbcaU0mZMKU3GU/W1b9ue+weOrdc+Kpqp3WCDDejXrx977703q1ev5umnn+bAAw9kp512YvPNN2et\ntdbiww8//N5zfvWrXzFy5EjOPfdc3nnnHTbYYAP22Wefb3dwrkuhKsXFhSKEEBviuCVJkiQ1TeWv\nSatEZZ9L5ny1L9prja6EdSVKnzGltBlTSpsxpTQZTyo0JrqSJEmSpEbFpcuSJEmSVMtculwxly5L\nkiRJkpQHE10J60qUPmNKaTOmlDZjSmkynlRoTHQlSZIkSY2KNbqSJEmSVMvatWtHUVFRfQ+j4LRt\n25YFCxascb6mNbomupIkSZKkguJmVFIKrCtR2owppc2YUtqMKaXJeFKhMdGVJEmSJDUqLl2WJEmS\nJBUUly5LkiRJklSGia6EdSVKnzGltBlTSpsxpTQZTyo0JrqSJEmSpEbFGl1JkiRJUkGxRleSJEmS\npDJMdCWsK1H6jCmlzZhS2owppcl4UqEx0ZUkSZIkNSrW6EqSJEmSCoo1upIkSZIklWGiK2FdidJn\nTCltxpTSZkwpTcaTCo2JriRJkiSpUbFGV5IkSZJUUKzRlSRJkiSpDBNdCetKlD5jSmkzppQ2Y0pp\nMp5UaEx0JUmSJEmNijW6kiRJkqSCYo2uJEmSJEllmOhKWFei9BlTSpsxpbQZU0qT8aRCY6IrSZIk\n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\nJEmSNFL+BsgR+xA4hP11AAAAAElFTkSuQmCC\n",
"text/plain": [
"<matplotlib.figure.Figure at 0x7f1d8883bb90>"
]
},
"metadata": {},
"output_type": "display_data"
}
],
"source": [
"plot_power_perf(pp_stats, clusters)"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"## Idle States Profiling"
]
},
{
"cell_type": "code",
"execution_count": 20,
"metadata": {
"collapsed": false,
"scrolled": true
},
"outputs": [],
"source": [
"def compute_idle_power(clusters, loop_cnt, sleep_duration, bkp_file='cstates.csv'):\n",
" \"\"\"\n",
" Perform C-States profiling on each input cluster.\n",
" \n",
" Data will be saved into a CSV file at each iteration such that if something\n",
" goes wrong the user can restart the experiment considering only idle_states\n",
" that had not been processed.\n",
" \n",
" :param clusters: list of clusters to profile\n",
" :type clusters: list(namedtuple(ClusterDescription))\n",
" \n",
" :param loop_cnt: number of loops for each experiment\n",
" :type loop_cnt: int\n",
" \n",
" :param sleep_duration: sleep time in seconds\n",
" :type sleep_duration: int\n",
" \n",
" :param bkp_file: CSV file name\n",
" :type bkp_file: str\n",
" \"\"\"\n",
"\n",
" # Make sure all CPUs are online\n",
" target.hotplug.online_all()\n",
"\n",
" with open(bkp_file, 'w') as csvfile:\n",
" writer = DictWriter(csvfile,\n",
" fieldnames=['cluster', 'cpus',\n",
" 'idle_state', 'energy', 'power'])\n",
"\n",
" # Disable frequency scaling by setting cpufreq governor to userspace\n",
" target.cpufreq.set_all_governors('userspace')\n",
"\n",
" # A) For each cluster (i.e. frequency domain) to profile...\n",
" idle_power = []\n",
" for cl in clusters:\n",
" target.cgroups.isolate(cl.cpus)\n",
"\n",
" # C-States profiling requires to plug in CPUs one at the time\n",
" for cpu in cl.cpus:\n",
" target.hotplug.offline(cpu)\n",
"\n",
" # B) For each additional cluster's plugged in CPU...\n",
" for cnt, cpu in enumerate(cl.cpus):\n",
" \n",
" # Hotplug ON one more CPU\n",
" target.hotplug.online(cpu)\n",
" \n",
" cl_cpus = set(target.list_online_cpus()).intersection(set(cl.cpus))\n",
" logging.info('Cluster {:8} (Online CPUs : {})'\\\n",
" .format(cl.name, list(cl_cpus)))\n",
"\n",
" # C) For each OPP supported by the current cluster\n",
" for idle in cl.idle_states:\n",
"\n",
" # Disable all idle states but the current one\n",
" for c in cl.cpus:\n",
" target.cpuidle.disable_all(cpu=c)\n",
" target.cpuidle.enable(idle, cpu=c)\n",
"\n",
" # Sleep for the specified duration each time collecting a sample\n",
" # of energy consumption and reported performance\n",
" energy = 0\n",
" for i in xrange(loop_cnt):\n",
" te.emeter.reset()\n",
" sleep(sleep_duration)\n",
" nrg = te.emeter.report(te.res_dir).channels\n",
" energy += nrg[cl.emeter_ch]\n",
"\n",
" # Compute average energy and performance for the current number of\n",
" # active CPUs all idle at the current OPP\n",
" energy = energy / loop_cnt\n",
" power = energy / SLEEP_DURATION\n",
" logging.info(' avg_pwr: {:7.3}'\n",
" .format(power))\n",
"\n",
" # Keep track of this new C-State profiling point\n",
" new_row = {'cluster': cl.name,\n",
" 'cpus': cnt + 1,\n",
" 'idle_state': idle,\n",
" 'energy': energy,\n",
" 'power': power}\n",
" idle_power.append(new_row)\n",
" \n",
" # Save data in a CSV file\n",
" writer.writerow(new_row)\n",
" \n",
" # C) profile next C-State\n",
"\n",
" # B) add one more CPU (for the current frequency domain)\n",
"\n",
" # A) profile next cluster (i.e. frequency domain)\n",
"\n",
" target.hotplug.online_all()\n",
"\n",
" idle_df = pd.DataFrame(idle_power)\n",
" return idle_df.set_index(['cluster', 'idle_state', 'cpus']).sort_index(level='cluster')"
]
},
{
"cell_type": "code",
"execution_count": 21,
"metadata": {
"collapsed": false,
"scrolled": true
},
"outputs": [
{
"name": "stderr",
"output_type": "stream",
"text": [
"2016-09-08 20:02:42,283 INFO : Cluster big - Online CPUs : set([1])\n",
"2016-09-08 20:06:04,376 INFO : Cluster big - Online CPUs : set([1, 2])\n",
"2016-09-08 20:09:23,459 INFO : Cluster little - Online CPUs : set([0])\n",
"2016-09-08 20:13:10,543 INFO : Cluster little - Online CPUs : set([0, 3])\n",
"2016-09-08 20:16:36,396 INFO : Cluster little - Online CPUs : set([0, 3, 4])\n",
"2016-09-08 20:20:02,271 INFO : Cluster little - Online CPUs : set([0, 3, 4, 5])\n"
]
}
],
"source": [
"SLEEP_DURATION = 10\n",
"loop_cnt = 5\n",
"\n",
"idle_df = compute_idle_power(clusters, loop_cnt, SLEEP_DURATION)"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"### Statistics"
]
},
{
"cell_type": "code",
"execution_count": 22,
"metadata": {
"collapsed": false
},
"outputs": [],
"source": [
"WFI = 0\n",
"CORE_OFF = 1\n",
"\n",
"def idle_power_stats(idle_df):\n",
" \"\"\"\n",
" For each cluster compute per idle state power statistics.\n",
" \n",
" :param idle_df: dataframe containing power numbers\n",
" :type idle_df: :mod:`pandas.DataFrame`\n",
" \"\"\"\n",
"\n",
" stats = []\n",
" for cl in clusters:\n",
" cl_df = idle_df.loc[cl.name].reset_index()\n",
" # Start from deepest idle state\n",
" cl_df = cl_df.sort_values('idle_state', ascending=False)\n",
" grouped = cl_df.groupby('idle_state', sort=False)\n",
" for state, df in grouped:\n",
" energy = df.energy\n",
" power = df.power\n",
" state_name = \"C{}_CLUSTER\".format(state)\n",
" if state == CORE_OFF:\n",
" core_off_nrg_avg = energy.mean()\n",
" core_off_pwr_avg = power.mean()\n",
" if state == WFI:\n",
" energy = df.energy.diff()\n",
" energy[0] = df.energy[0] - core_off_nrg_avg\n",
" power = df.power.diff()\n",
" power[0] = df.power[0] - core_off_pwr_avg\n",
" state_name = \"C0_CORE\"\n",
"\n",
" avg_row = {'cluster': cl.name,\n",
" 'idle_state': state_name,\n",
" 'stats': 'avg',\n",
" 'energy': energy.mean(),\n",
" 'power': power.mean()\n",
" }\n",
" std_row = {'cluster': cl.name,\n",
" 'idle_state': state_name,\n",
" 'stats': 'std',\n",
" 'energy': energy.std(),\n",
" 'power': power.std()\n",
" }\n",
" min_row = {'cluster' : cl.name,\n",
" 'idle_state' : state_name,\n",
" 'stats' : 'min',\n",
" 'energy' : energy.min(),\n",
" 'power' : power.min()\n",
" }\n",
" max_row = {'cluster' : cl.name,\n",
" 'idle_state' : state_name,\n",
" 'stats' : 'max',\n",
" 'energy' : energy.max(),\n",
" 'power' : power.max()\n",
" }\n",
" c99_row = {'cluster' : cl.name,\n",
" 'idle_state' : state_name,\n",
" 'stats' : 'c99',\n",
" 'energy' : energy.quantile(q=0.99),\n",
" 'power' : power.quantile(q=0.99)\n",
" }\n",
" stats.append(avg_row)\n",
" stats.append(std_row)\n",
" stats.append(min_row)\n",
" stats.append(max_row)\n",
" stats.append(c99_row)\n",
" \n",
" stats_df = pd.DataFrame(stats).set_index(\n",
" ['cluster', 'idle_state', 'stats']).sort_index(level='cluster')\n",
" return stats_df.unstack()"
]
},
{
"cell_type": "code",
"execution_count": 23,
"metadata": {
"collapsed": false
},
"outputs": [],
"source": [
"idle_stats = idle_power_stats(idle_df)"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"### Plots"
]
},
{
"cell_type": "code",
"execution_count": 24,
"metadata": {
"collapsed": false
},
"outputs": [],
"source": [
"def plot_cstates(idle_power_df, cluster):\n",
" \"\"\"\n",
" Plot C-States profiling for the specified cluster.\n",
" \n",
" :param idle_power_df: dataframe reporting power values in each idle state\n",
" :type idle_power_df: :mod:`pandas.DataFrame`\n",
"\n",
" :param cluster: cluster description\n",
" :type cluster: namedtuple(ClusterDescription)\n",
" \"\"\"\n",
" n_cpus = len(cluster.cpus)\n",
" cmap = ColorMap(len(cluster.idle_states))\n",
" color_map = map(cmap.cmap, cluster.idle_states)\n",
" color_map = [c for c in color_map for i in xrange(n_cpus)]\n",
"\n",
" cl_df = idle_power_df.loc[cluster.name]\n",
" ax = cl_df.power.plot.bar(figsize=(16,8), color=color_map, alpha=0.5,\n",
" legend=False, table=True)\n",
"\n",
" idx = 0\n",
" grouped = cl_df.groupby(level=0)\n",
" for state, df in grouped:\n",
" x = df.index.get_level_values('cpus').tolist()\n",
" y = df.power.tolist()\n",
" slope, intercept = linfit(x, y)\n",
"\n",
" y = [slope * v + intercept for v in x]\n",
" x = range(n_cpus * idx, n_cpus * (idx + 1))\n",
" ax.plot(x, y, color=color_map[idx*n_cpus], linewidth=4)\n",
" idx += 1\n",
"\n",
" ax.grid(True)\n",
" ax.get_xaxis().set_visible(False)\n",
" ax.set_ylabel(\"Idle Power [$\\mu$W]\")\n",
" ax.set_title(\"JUNO {} cluster C-states profiling\"\\\n",
" .format(cluster.name), fontsize=16)"
]
},
{
"cell_type": "code",
"execution_count": 25,
"metadata": {
"collapsed": false
},
"outputs": [
{
"data": {
"image/png": "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\nLCbf/nZy8cVdcL3wwuSOO4brd/DByXOfu33K8LJl81snAAAsIEEW5sFbzjknm2+4Yahtj7r77qy4\n6aasvOmmnHTbbdmvtaH63X3IIbn6hBNyzQkn5LrjjsuW/fdPPve57msKS5cty2vOPXfoYwAAgMVK\nkIV5sPmGG7Ju+fKpVz70UHdzpquvTq65pntczrBOOCFZuTJZsSKHH3tsTqvKaUN2XTc2NvzrAADA\nIibIwijce28XWq++Orn22uTBB4frd9BBySmnJCtWdP899ND5rRMAAHpAkIX50Fpy663bz7refPPw\nfY86qjvrunJlcuKJbtQEAACTCLIwV+69t3sszvr1+dW///vkO98Zrt+SJcny5d1Z15Uru8flAAAA\n0xJkYU+MjW1/tuvHPpY88ECS5OG76nfooduD62Me000hBgAAhiLIwmx897vJZz6zPbx+9avD9z3u\nuO3h9VGPSqrmr04AANiLCbKwK3femVx0URdeP/zh5K67hut3wAHJySd34XXFiuSww+a3TgAA2EcI\nsjBZa8nXvtadcb3gguRTn0q2bh2u76MfnaxZk7+88sr89OmnJ/v7EQMAgLnmt2xIkvvvTzZs2B5e\nh33m6n77Jc94RrJmTfd16qlJVa5du1aIBQCAeeI3bfZdN9+cXHhhF14/8pHkvvuG63fkkckLXtAF\n1zPPTI44Yn7rBAAAdiDIsu/YujX513/tguv69ckXvzh838c/Pjn77C68nnGGZ7sCAMACEmTZu337\n28m//EsXXC+8MLn99uH6HXRQ8rzndeH17LOTk06a3zoBAIChCbLsfa65ZvvjcT7xiWTLluH6HX98\nd8b17LOT5z63e9YrAACw6Aiy9N+DDyaXXro9vF599XD9qpLTT98eXp/4RM92BQCAHhBk6afbb++e\n6XrBBck//3M3hXgYD394d4OmNWu6GzYdffT81gkAAMw5QZZ+aC254ortj8f53Oe6ZcNYuXL743Ge\n+czkgAPmt1YAAGBeCbIsXvfdl1xyyfbwevPNw/U74IDkWc/aPmV4xYr5rRMAABgpQZbF5frrt1/r\n+tGPJg88MFy/Y45JXvjCLrw+//ndFGIAAGCvJMiysB56KPnsZ7c/2/UrXxm+75OfvP3Zrt///cmS\nJfNXJwAAsGgIsozeXXd1N2hav767YdOddw7X75BDurOta9Z0Z18f9aj5rRMAAFiUBFnmX2vJlVdu\n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\nTx1im4f2tBAAAAAYxi6DbGvt+lEUAgAAAMOY1XNkAQAAYKEJsgAAAPTKUEG2OifOdzEAAACwK0MF\n2dZaS3LhPNcCAAAAuzSbqcWXV9Vp81YJAAAADGGYx++MOz3Jy6pqLMm96Z4f21prT5iPwgAAAGAq\nswmyZ85bFQAAADCk2UwtviHJDyR5+eDZsi3JsfNSFQAAAExjNkH2z5I8LclLB+17kvzpnFcEAAAA\nM5hNkD29tfafk9yfJK21u5IcONsXrKqzquqqqrq6ql47zTarq+qLVfWVqvrYbF8DAACAvddsrpHd\nUlX7pZtSnKo6OsnW2bxYVS1J8rYkz0tyS5LLqur/tNaumrDN4enO9P5Qa+3mqnrEbF4DAACAvdts\nzsi+Nck/Jjmmqn4vyaVJ3jDL13tqkmtaa9e31rYkeX+SF0/a5ieTfKC1dnOStNa+NcvXAAAAYC82\n9BnZ1tpfV9UX0p1NrSQvaa1dOcvXOz7JjRPaN6ULtxOtTHLAYErx9yR5a2vtL2f5OgAAAOylhg6y\nVfVXST6e5JKJU4Hnwf5JnpzkuUkOTfKZqvpMa+0b8/iaAAAA9MRsrpF9d7rH7/xJVZ2c5ItJPtFa\n++NZ7OPmJMsmtE8YLJvopiTfaq3dn+T+qvpEkicm2SnIrl27NsuXL0+SLF26NKtWrcrq1auTJBs2\nbEiS4dtjY117sL+Fbo9t2pQNGzbs/vHMQ3ts06ZkkYzPeHvcYhifie2xTZuyYR6Od0/aY5s2ZdxC\nj894e1s9i2B8dmgvkvEZb986tilLNiSPXt3Vd92Grt6Fbo9b6PGZ3F4s4zPevnVs8X2e3zq2KSdn\nYcajb++nxfjzd+vY4vs819bW1p6L9saNG7N58+Ykydik3/cnq9bajBvssHF3s6fTkjwnyS8m+U5r\n7dRZ9v96uunJtyb5fJKXTpyiXFWnJvmTJGclOSjJ55L8eGvta5P21WZT+0zWrV2bdYNfYBeLdWNj\nWXf++Qtdxg6M0/CM1XCM03BesW5tTl63fKHL2Mm168Zy3rrzF7qMHSzGsTJOw1mM45QYK4CFVFVp\nrdVU62YztfiSDKb6JvlkktNaa7fPppDW2kNV9aokF6e70dS7W2tXVtUru9XtXa21q6rqn5N8KclD\nSd41OcQCAACw75rN1OIvJXlKku9LcneSzYNrV78zmxdsrV2U5LGTlr1zUvuNSd44m/0CAACwb5jN\n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\nMBBqtRpSqRSrV682OLbXXnsNfn5+kEgkWLt2bbN6unHjBiZPngx/f39IJBIcOXIEgHAbM5f/CNUp\ncyiy+4kAABioSURBVPm5nZ0dc1t/Iq3miufWrlOAcTw3lxuZa3/nz5/H6NGjERAQAKlUavAYRcCK\nfRmhe47r/6EJ7ncXg1arZf+bO6ba2lry8vKiwsJCqq6uJoVCQX/++afBe5YvX05LliwhIqLS0lLq\n1q0b1dTU0MWLFyknJ4eIiMrLy8nX15dtu3z5clq5cqXZYzxx4gR5e3uz10OHDjU5GPrgwYOk0WiI\niGj9+vU0depUIiK6du0aeXp60vXr16msrIz9rycrK4uio6OpY8eOZo+jPo3lqrCwkDw8POjWrVtE\nRDRlyhTatGkTO+89e/YQEdGuXbto6NChRKQbeB4VFUVERDdv3iR3d3c6d+4cEREdOXKELl26ZHRu\nf/31F6nVarpx4wY7Bv3yvLw8IiK6cOECOTk5sffs3r2bbR8VFUWffPKJRZ6siRjnixYtorfeeouI\niE6dOkUjRowwWL9q1SqaMWMGPfrooyb3sXDhQvrXv/5FRESVlZWUlpZGn376Kb3wwgsG7xNybo7G\n8JSSkkI5OTkkk8lMrt+1axcbj5Genk4DBgwgIvMuy8vL2fZr1qyh2NhYIiLSaDRUW1tLREQXL16k\n7t27k1arpZs3b9LBgweJiKimpoaGDBlCycnJrIzy8nIKDQ2lgQMH0tGjR0Wdl6Vtrz47duwwqgf6\ncpycnKioqIgtO3/+PI0ePZrc3d3p77//JiKi3NxcUiqVVFNTQ2fPniUvLy82bmbZsmW0dOlStr1+\nG6G2t3PnTho1ahTV1dVRZWUl9e/fn/l2d3en06dPExHRunXrKCYm5p7ydP78eSIyrh9PPvmk0TYN\n47mQp8cff5zFmNzcXHJ3dyci63siujddRUZG0pQpUwyuj0Ku6peVlJTE9t+UdUqIpvan1WpJLpfT\niRMniEh3/de3yaCgIMrIyCAiooiICBaLJk+eTF9++SURER04cICio6OJyLw/c1han0pLSykrK4te\nf/11o/zIw8ODrl27Znb/9a9VQvnB33//TW5ubgbt7ZdffmH/m2p7Bw8epMGDBxMRUV1dHQ0cOJB+\n/fVXIrq7/ICoeVwJ5VInT54UjOf1CQwMpNTUVCISbnvV1dVUXV1NRLp8oU+fPqzubty4kWbPnm1w\nDrejMT3Nnj2bNmzYQES667T+2iTUxoTyH3N1Sig/JyLBXKm54rk165SehvHcXG4k1P70+9m/fz8R\n6T4HvVOiO+/LwMwY2bv+RfbcuXPw9/fHzJkzERAQgClTpqCqqgr79++HWq2GQqFAbGwsampqkJWV\nhUmTJgEAtm/fDgcHB2i1Wty6dQteXl4AgIKCAkRERKB///4ICwtj00XHxMTg2WefRXBwMF5++WVR\nx5aRkQEfHx/06dMHbdu2xbRp04yej+To6Ijy8nIAuof+du/eHW3atIGjoyOUSiUAoEOHDvD390dJ\nSQnbjm5zC8DXX3+NadOmGSyrqzO+tTssLAz29vYAgODgYLaPPXv2YNSoUejcuTO6dOmCUaNGsV9+\n6+rqsGjRIrz//vuiPIjBEledOnVCu3btUFlZCa1Wi5s3b6J3794AACcnJ9y4cQOA7tdFZ2dnVlZl\nZSVqa2tx8+ZNPPDAA+zXwKCgIPTqZTwU+7PPPsPcuXPZ+3r06AEA8Pb2ZvXHyckJDz30EEpLSwEA\nY8aMYdsHBQUZ/YLQnIhxnpubi+HDhwMA/Pz8UFhYyM6tuLgYu3btQmxsrOA+tm7diqioKACAg4MD\nQkJC8MADDxi9T8h5UzN48GB07dpVcP327dsxa9YsAMCAAQNw48YNXL582azLDh06sO0rKyvZM/Xs\n7e3ZeBGNRoPOnTvDzs4O7du3R1hYGACgTZs2UKvVBvVm6dKlWLJkiUmPd4OYelCfr7/+mn2m9dm3\nbx+8vLzg6urKli1YsMAoTmzfvh3Tpk1DmzZt4O7uDh8fH2RkZAAANmzYYPCNdLdu3QAIt73c3FyE\nhobCxsYGDg4OkMvlLE45OTnh+vXrAHTfnutjwt1ibU8uLi4AjOuH/twallU/ngt5cnJywj///APA\nMN41pSegeVxt374dnp6ekEgkBmUIuapfVkVFRbPUKSGa2t/PP/8MhUIBqVQKQPeoMRsbG1y6dAnl\n5eXo378/AGDWrFn48ccfAeg8DRs2DIDuji/98Znz15g+evTogcDAQLRpYzzlChGZzH/qU/9aJZQf\nFBQUwNfXl9WhESNGYNu2bQCE295DDz2E6upqVFVVQaPRQKvVsmtdY+QHjeVKKJdKSkoSjOd6zpw5\ng9LSUgwaNAiAcNtr27Yt2rZtC0B3TWzXrh0cHBwAAOvXr8cbb7xhcA6WYImnf/75BykpKYiJiQEA\nloc2PLf6bUwo/zFXp4Tyc0C4D9Bc8dyadQowHc/N5UZC7e/PP/9EbW0ty2MdHByYU2v3ZSy6tfj0\n6dN4/vnnkZubi06dOmHlypWIiYnBt99+i+PHj6Ompgbr16+HSqVitw+lpqZCJpMhMzMTR44cQXBw\nMADgqaeewtq1a5GZmYn3338fzz77LNtPSUkJ0tPTsWLFClHHVVJSYpDUubi4GFREAJgzZw5OnjyJ\n3r17Q6FQGN1KAQCFhYU4duwYBgwYwJatXbsWSqUSsbGxrCLUZ8uWLUYXtscffxxqtRpvv/22yeP9\n/PPPERERYfLYnZ2d2bGvXbsW48ePR69evax2T70lrrp27YqFCxfCzc0Nzs7O6NKlC8LDwwEA7777\nLuLi4uDm5obFixcjPj4eADB69Gh06tQJTk5OcHd3x0svvcSeCSrEmTNncPr0aQwePBghISHYs2eP\n0XsyMjJQU1PDOrZ6tFotvvzyS4MLV3MjxrlCocD3338PQHduRUVFLHDoOylCg+xTUlLg6Oho5OJ+\nRsjZ7Vzqb51OSEgwSKozMjIglUohlUqNbscBdAF5x44dGDFiBADdQ+aLi4tZO23MczKFRqNBcnIy\n+0KwPg1jTlJSElxdXQ2etWhqf/rYoo9jr7/+OgIDAzF16lT2pYlQ21MoFEhOToZGo8HVq1dx4MAB\ndvvV2rVrERERATc3N2zevBlLliy5Gz2Cx20tT/pzNlU/TG1jztMrr7yCTZs2wdXVFWPHjsVHH30E\noGk9AU3vqrKyEu+99x6WLVtmcE0y5woA1q1bB29vbyxcuJBdG5ralSma2p/+C/sxY8agX79+LLEr\nKSlhneCGx6FUKtm14fvvv0dFRQXKysrM+rtb7sSHKWxsbDBy5Ej0798fn332mdH6htcqofzA29sb\np0+fRlFREbRaLX788Ud2bkJtz9/fH6NGjYKTkxOcnZ0xevRo+Pn5GezfmvlBY7kSyqXM5Yp6tmzZ\ngqlTpxosM9X2AN0X5AqFAm5ubpg/fz7r4OXn5+Obb75B//798cgjjyAvL0/0OZnCEk9nz55Fjx49\nEBMTA7VajaeeegoajYatv108r4+5OlWf+vk5oLv9vV+/fggJCTHoVDZ3PDfFndYpoXhen4a5kVD7\nO3PmDDp37oxJkyYhMDAQL7/8MivT2n0Zizqybm5urCM6Y8YM7N+/H56eniwozZ49G4cOHYKdnR28\nvLxw6tQpZGRkIC4uDr/++itSUlIwZMgQVFZW4vDhw+wBzk8//TQuX77M9jN58mRLDtMk8fHxUCgU\nuHDhAnJycjB37lxUVFSw9RUVFYiMjMTq1avZNz3PPfccCgoKcOzYMTg6OrJxB3oyMjLw4IMPIiAg\ngC1LTEzEiRMnkJKSgpSUFGzevNlgm82bN+Po0aNYtGiR2eO9ePEivv32Wzz//POWnvodI+SqoKAA\nH3zwAc6dO4cLFy6goqICiYmJAHRjHj/66CMUFRXhgw8+wBNPPAFAd74ajQaXLl1CQUEBVqxYgcLC\nQrP712q1yMvLw6FDh5CYmIg5c+awb4AAnZtZs2YZjN3V89xzzyEsLIx9I3m/sGTJEpSVlUGtVuPj\njz9mY/V27tyJXr16QalU1r/13wChXwlaEmKD39tvv42ioiLExMQYjJEKCgrCH3/8gezsbLz44osG\n9am2thbTp0/H/Pnz4e7uDiJCXFwcVq5cecf7txY7duzA4MGDjb70qampQVJSEouRGo0G77zzDt58\n803RZWu1WhQXF2Pw4ME4evQogoOD8dJLL7F1ptreyJEjERERgZCQEMyYMQMhISGws7MDESE6Ohp7\n9uxh3hcsWGA9EbdBrCc9QvUDMI7npjwtXLgQABAXF4fY2FicP38eO3fuZGOJ71VPgHVcLV++HAsW\nLGC/3ujbhTlXgC4u5+XlYdWqVezacC+7MoU1/Gm1WqSlpeHrr79GSkoKfvjhBxw4cMDsft9//30c\nPHgQgYGBSElJgbOzM+zs7AT9NSdpaWnIzs7Grl278PHHHyM1NdVgfcNr1VdffWUyP+jSpQvWr1+P\nKVOmICwsDB4eHuzchNreoUOHcODAAVy4cAElJSXYv38/0tLSDPZ/L+UHQq6EcikxfPPNN0a5gKm2\nB+g6ScePH0d+fj4+/PBD5OfnA9B13BwcHJCZmYnY2Ng72r+10Wq1yM7Oxty5c5GdnQ0HBweDcdTm\n4nlDzNUpPaby83PnziErKwtfffUV5s+fj7Nnz96zMepO65RQPNfTMDcChNufVqtFamoqVq1ahczM\nTOTn5yMhIaFR+jJWnezJ3C9rQ4YMwe7du9GuXTuEh4cjNTUVaWlpGDJkCOrq6tC1a1dkZ2cjJycH\nOTk5+OOPP9i2Dz744B0dh7Ozs8Gg4uLiYoOfzgHdB6y/0Hh5ecHDwwOnTp0CoPsAIiMjER0djXHj\nxrFtevbsyX4FmzNnDjIzMw3KNBU0nJyc2DlMnz7d4NaPffv2IT4+Hjt27GC3dQgde05ODvLz8+Ht\n7Q0PDw/cvHkTvr6+d+TFFJa4ysrKwqBBg9CtWzfY2dlh4sSJOHz4MADgyJEjbCB8ZGQkc3X48GFM\nmDABtra26NmzJwYNGmQ00LwhLi4ueOyxx2Brawt3d3f4+vrir7/+AqC71WTs2LGIj49nt2Hpeeut\nt3D16lWTv7g1J2Kcd+zYERs2bEB2djY2bdqE0tJSeHp6Ii0tDUlJSfD09ERUVBQOHDjAbrkFdIHm\n+++/N/oW9n7H2dnZ4NtSvTMxLgFg+vTpJuuZn58fvLy8WH0CdHeH+Pn54YUXXgCgu53+5MmTGDp0\nKDw8PJCeno5x48ZZPOGT2GMHTMcWANi9ezcCAwPRs2dPALpvzwsLC6FQKODh4YHi4mKo1WpcuXJF\ncH/du3fHgw8+iAkTJgDQfXGoPzdzbe/VV19FTk4O9uzZg7q6Ovj6+qK0tJR9Yw0AU6ZMwW+//XbP\neWqIqfrRsCxTnnJycgAYxsjg4GBUVVWxif2ayhPQ9K6OHDmCxYsXw9PTEx9++CHi4+Oxbt06s67q\nM3XqVIPlTenKFE3tz8XFBaGhoejatSvat2+Phx9+GNnZ2YLxDtDlFNu2bcPRo0fZXV762ytN+bOE\nO/FhCn3+07NnT0yYMMEg/zF1rUpLSxPMDx555BGkp6cjLS0Nvr6+7NyE2l56ejoiIiLQvn17ODg4\nICIiwqDeWDs/aCxXQrmUuToC6CYRq62thUqlMrm/hm1Pj6OjI4YMGcImVHR1dWXteMKECWyCqLvF\nEk8uLi5wdXVlsSAyMtLkdVjoet8QoToFmM7Pgf99Th4eHhg6dChycnLuiXhuijutU0LxXE/D3AgQ\nbn8uLi5QKpXo06cPbG1tMX78eNbHs3pfRmjwbP0/mBiMXFhYSDY2NpSenk5ERLGxsfTOO+9Qnz59\nKD8/nw0CXrNmDRHpBk+7ubnRG2+8QUREwcHB5OnpycobNGgQffvtt+z18ePHWRnbtm0TGvhrEq1W\nywZI37p1ixQKBeXm5hq8Jy4ujpYvX05ERJcuXSIXFxc26Ds6OpoWLFhgVO7FixfZ/6tWrWKTEhDp\nJhNwdnams2fPGhzH1atXiUg3mD4yMpI+/fRTIiLKzs4mLy8vNlmRnvqTPen/LysrMzqWDh06CJ5/\nQxrL1bFjx0gqlZJGo6G6ujqaPXs2ffzxx0REpFar2eDwffv2Ub9+/YiIaPXq1WwQfEVFBQUEBLCJ\nLoTOLTk5mU02UFpaSm5ubnTt2jWqrq6m4cOH0+rVq43O67PPPqOQkBCqqqoSq6nJJnsS4/z69ets\n8oX//Oc/BpMt6Dl48KDRZE+7d+82GrivJyEhgZ5//nmT66xVnyzh7NmzJJVKTa7buXMnm+zpt99+\nY5M9mXP5119/se3XrFlDM2fOZPvRTxxXWFhIbm5ubMKI1157jSIjI80ep9AEbqawtO0R6epCt27d\n6ObNm0brpk2bRgkJCYL7cHd3Z5M96CcHuXXrFhUUFBhMDhIVFcUmuti4cSNNmTKFiITbXm1tLYuX\nx48fJ5lMRrW1tVRXV0e9e/dm7v/73//e1idR83gSqh9EpuM5kbCniRMnsvJzc3PJ2dmZiMjqnoju\nPVd6Gk6GKOSqfllJSUlsQp6mrFNCNLW/srIyCgwMJI1GQzU1NRQeHs4mIhowYAAdOXKE6urqKCIi\ngi2/evUqa7evvfYaLVu2jIiE/d0Oa9QnIt3nv2LFCva6srKSTcBTUVFBISEhbIIZItPXKnP5wZUr\nV4hIlyMplUqWOwm1ve3bt9PIkSNJq9VSdXU1jRgxgn766Sciurv8gKhpXf38889EJJxLmYvnRERL\nlixheZseobZXXFzMJuK5du0a+fn5sYmLXnnlFTa50oEDBygoKOh2mhrNExFRaGgoO7bly5fT4sWL\njc7NVIwylf80rFP6MoTy87KyMja5aWlpKfn4+NCpU6eaPZ4TWadONSyvfjwXyo3MXfuUSiXrA8XE\nxNC6deuMthebe8LMZE8WdWT79u1L0dHR5O/vT5GRkaTRaOiXX34hlUpFcrmcnnzySZaMazQasre3\np3379hER0VNPPUXjx483KG/MmDGkUChIIpGwWexiYmLuuCNLpAuSvr6+5O3tTfHx8URE9Mknn7CO\nZGlpKY0dO5bkcjnJZDJKTEwkIqLU1FSytbUlhUJBSqWSVCoVu4BER0eTTCYjhUJB48aNo0uXLrH9\nHTx4kAYOHGhwDJWVlRQYGEgKhYKkUinNnz+fBZrw8HBydHQklUpFSqWSxo0bx7bbuHEjeXt7k4+P\nD5sFuCHWnGX2bl0REb333nsUEBBAMpmMZs2axT7vzMxMCgoKIqVSScHBwSzxr6qqohkzZpBUKiWJ\nRGLQUBYvXkwuLi5kZ2dHrq6u9Oabb7J1cXFxFBAQQHK5nLZu3UpERJs3b6Z27doxhyqVin0B0qZN\nG/L29mbL9fXJEk/W5HbOf/vtN/L19aW+ffvSpEmTDGau1mOqI/v444+zMurj7u5O3bt3p44dO5Kr\nqyub+c6ccyEaw1NUVBQ5OTlRu3btyNXVlTZs2GDgg4ho7ty55OXlRXK53GDWYFMuiYgmTZpEMpmM\nlEolTZw4kS5fvkxERF9++SVJJBJSqVQUFBTEZt8rLi4mGxsbCggIYPXm888/NzrWYcOGWWXWYqFj\nb3je9WfyrE9lZSX16NGD/vnnH8HyPTw8WHJLRPTOO++Ql5cX9e3b1yCpPHfuHIWGhpJCoaDw8HA2\nYyWR6bZXVVVFAQEBJJFIaODAgazdEek6v0qlkpRKJQ0bNsyoM2iK5vAkVD+ITMdzImFPeXl5FBYW\nRgqFglQqFbvOWdsT0b3nSk/DxEfI1Ysvvsja38iRI1ny19R1Soim9vfVV1+RRCIhmUzGng5ApJvV\nUyqVkre3N82bN48t/+6778jHx4f8/Pxozpw57Jrb0N/vv/8u6nwtrU/6L7c7d+5MXbt2JVdXVyov\nL6eCggKWR0mlUoPYTGT6WmUuP4iKimLnp49DRMJtj4ho/vz5JJFISCKR0MKFC9nyu8kPmsuVUC5F\nJBzPiYi8vLxYh0+PUNvbu3cvyeVy5uOLL75g21y/fp0eeeQRkslkFBISIqpeNZYnIqJjx45Rv379\nSKFQ0IQJE1huZK6NCeU/QnVKKD8/fPgw24dcLqeNGzeybZornlu7TumpH8/N5Ubm2t++fftILpeT\nXC6nmJgYqqmpMdqPNWYttiERY71sbGyo4fvOnTuHsWPH4sSJE3f/c7AF8IcIi4e7Egf3JA7uSTzc\nlTi4J/FwV+LgnsTBPYmHuxIH9yQe7koc/+/J5AynFo2RFZo1lcPhcDgcDofD4XA4nMbC+MFDJrC3\nt79sY2Nj8mGTzdWZtbe3r7OxsbHqZFUtFe5KHNyTOLgn8XBX4uCexMNdiYN7Egf3JB7uShzck3i4\nK3HY29tfFlon6tZiDofD4XA4HA6Hw+Fw7hX4twAcDofD4XA4HA6Hw7mv4B1ZDofD4XA4HA6Hw+Hc\nV/COLIfD4XA4HA6Hw+Fw7it4R5bD4XA4HA6Hw+FwOPcVvCPL4XA4HA6Hw+FwOJz7iv8D2i3TdmAm\nEqwAAAAASUVORK5CYII=\n",
"text/plain": [
"<matplotlib.figure.Figure at 0x7f1d88c5f4d0>"
]
},
"metadata": {},
"output_type": "display_data"
}
],
"source": [
"little = clusters[1]\n",
"\n",
"plot_cstates(idle_df, little)"
]
},
{
"cell_type": "code",
"execution_count": 26,
"metadata": {
"collapsed": false
},
"outputs": [
{
"data": {
"image/png": "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\n1++EVwkALARBFoBFcUTutNglAAA9tWKxCwAAAID5EGQBAADolR1OLa6qm85hP9taa5t2Qj0AAAAw\nq7mcI7vP6sv0AAAgAElEQVQhyfnJrFfPWJnk0J1SEQAAAMxiLkH2e621356tQ1V9Y65PWFUnJDkl\n3bTm01prL522/WZJ3pxudcGVSV7RWjtjrvsHAABgeZvLObLvrKq7V9Vsofeec3myqlqR5HVJjk9y\nRJKHVtXh07o9Kcn61tpRSe6X5BU7eG4AAAB2IXMJsjdN8uokF1XVZ6rqxVX1wKnnzrbWrpjj8x2T\n5EettZ+21rYkeVuSB03rszHJPoPb+yS5uLV29Rz3DwAAwDK3w5HO1tqzkqSqdk9ytyT3SnJiklOr\nalNr7Y7zeL6Dk5w3pf2zdOF2qn9N8smquiDJ3kn+Yh77BwAAYJmbz5TdPZPsm2S/wc8FSb69ADU9\nL8k3W2v3q6rbJfl4VR3ZWrtkesd169ZlzZo1SZLVq1fnqKOOytq1a5Mk4+PjSTLS9sTGjcmgnvGJ\niW679oztiY0bMz4+vqifVx/akxb78+pDe2LjxkxaKp/fUm2fMz6RJLnN2jXaQ9obJhxPc21vmNiY\nFeNL6/Nbiu1Ji/15aWtray/l9vr167NpU7cYzsTg771hqrU2e4eqU9Odz7o5yZeTnJnkzNbar2Z9\n4Mz7OjbJWGvthEH7uUna1As+VdWHkryotfaFQfuTSZ7TWvvqtH21HdU+amPr1mVs8Ic1sxubmMjY\nGWcsdhlLnmNq7hxTc3Pi2LrcbmzNYpex5J09NpHTx85Y7DJ6wTE1N44pgPmrqrTWZlw9Z8UcHn9o\nkhulO3f1/HTTga/vmrFnJbl9Vd16MFX5IUneP63P95P8z0HhByY5LMlPrufzAQAAsMzM5RzZE6qq\n0o3K3ivJM5Pcqap+meRLrbUXzPXJWmtbq+pJST6Wa5ff+X5VPb7b3E5N8g9JTq+qb6Zbu/bZrbVf\nzvuVAQAAsCzN6RzZwRze71TVpiS/Hvw8MN2FmuYcZAf7+kiSO0y771+m3P5Fkj+azz4BAADYdeww\nyFbVU9KNxN4ryZYkXxz8/HsW5mJPAAAAMNRcRmTXJHlnkqe31jYsbDkAAAAwu7mcI/uMydtVdUhr\n7bzB7d9JcnVr7UsLWB8AAABcx3zWkU2Sx1fVXZNcmeSbSXZPIsgCAAAwMvMKsq21v0mSwdI590g3\n7RgAAABGZi7ryF6jqh5eVXdqrV3VWvtckosXqC4AAACY0XynFl+c5MSqunOSvZLsW1WXpltP9qqd\nXh0AAABMM9+pxR9O8uEkqao9000v/p0kf5nk0Tu9OgAAAJhmviOy12itXZ5kfPADAAAAI7HDc2Sr\n6us7ow8AAADsDHMZkf0fVfWtWbZXkv12Uj0AAAAwq7kE2cPn0GfrDS0EAAAA5mKHQba19tNRFAIA\nAABzMa91ZAEAAGCxCbIAAAD0ypyCbHUOWehiAAAAYEfmFGRbay3Jhxa4FgAAANih+Uwt/npV3X3B\nKgEAAIA5mMvyO5PukeThVTWR5NJ068e21tqRC1EYAAAAzGQ+Qfb4BasCAAAA5mg+U4vPTfI7SR45\nWFu2JTlwQaoCAACAIeYTZN+Q5J5JHjpob07y+p1eEQAAAMxiXufIttaOrqpvJElr7VdVtfsC1QUA\nAAAzms+I7JaqWpluSnGqav8k2xakKgAAABhiPkH2NUn+K8kBVfWiJJ9P8uIFqQoAAACGmPPU4tba\nW6rqa0l+N93SOw9urX1/wSoDAACAGcw5yFbVm5N8JsknW2s/WLiSAAAAYLj5TC0+LclBSV5bVT+p\nqndX1VMXqC4AAACY0XymFn+6qj6b5O5J7pfkCUmOSPLqBaoNAAAAtjOfqcWfTHLjJF9K8rkkd2+t\nXbRQhQEAAMBM5jO1+FtJrkpypyRHJrlTVe25IFUBAADAEPOZWvz0JKmqfZKsS3J6klskudGCVAYA\nAAAzmM/U4icl+Z0kd00ykeTf000xBgAAgJGZc5BNskeSVyb5Wmvt6gWqBwAAAGY1n6nFL6+quyR5\nQlUlyedaa99csMoAAABgBnO+2FNVPSXJW5IcMPh5c1U9eaEKAwAAgJnMZ2rxY5Lco7V2aZJU1UvT\nLcXz2oUoDAAAAGYyn+V3KsnWKe2tg/sAAABgZOYzInt6ki9X1X8N2g9OctrOLwkAAACGm8/Fnl5Z\nVeNJjhvcdWJr7RsLUhUAAAAMscMgW1V7JHlCktsn+XaSN1h+BwAAgMUyl3Nk/yPJ3dKF2N9P8vIF\nrQgAAABmMZepxXdsrd05SarqtCRfWdiSAAAAYLi5jMhumbxhSjEAAACLbS4jsnepqt8MbleSPQft\nStJaa/suWHUAAAAwzQ6DbGtt5SgKAQAAgLmYy9RiAAAAWDIEWQAAAHpFkAUAAKBX5hxkq/Pwqnr+\noH1oVR2zcKUBAADA9uYzIvuGJPdM8tBBe3OS1+/0igAAAGAWc1l+Z9I9WmtHV9U3kqS19quq2n2B\n6gIAAIAZzWdEdktVrUzSkqSq9k+ybUGqAgAAgCHmE2Rfk+S/khxQVS9K8vkkL16QqgAAAGCIOU8t\nbq29paq+luR3k1SSB7fWvj/fJ6yqE5Kcki5En9Zae+kMfdYmeVWS3ZL8vLV2v/k+DwAAAMvTfM6R\nTWvtB0l+cH2frKpWJHldujB8QZKzqup9g/1O9tkv3UWkHtBaO7+qbn59nw8AAIDlZ4dBtqo2Z3Be\n7PRNSVprbd95PN8xSX7UWvvpYN9vS/KgXDccPyzJu1tr56d7gl/MY/8AAAAsczsMsq21fXbi8x2c\n5Lwp7Z+lC7dTHZZkt6r6dJK9k7ymtfamnVgDAAAAPTavqcUjsirJ0Unun+TGSb5UVV9qrf14esd1\n69ZlzZo1SZLVq1fnqKOOytq1a5Mk4+PjSTLS9sTGjcmgnvGJiW679oztiY0bMz4+vqifVx/akxb7\n8+pDe2LjxkxaKp/fUm2fMz6RJLnN2jXaQ9obJhxPc21vmNiYFeNL6/Nbiu1Ji/15aWtray/l9vr1\n67Np06YkycTg771hqrWZZg1P6VD1jNm2t9ZeOesOrruvY5OMtdZOGLSf2+3i2gs+VdVzkuzRWnvh\noP1vST7cWnv3tH21HdU+amPr1mVs8Ic1sxubmMjYGWcsdhlLnmNq7hxTc3Pi2LrcbmzNYpex5J09\nNpHTx85Y7DJ6wTE1N44pgPmrqrTWaqZtK+bw+H0GP3dLclK66cEHJ3lCupHT+Tgrye2r6tZVtXuS\nhyR5/7Q+70tyXFWtrKq9ktwjybyvjgwAAMDyNJdzZCdHRj+b5OjW2uZBeyzJf8/nyVprW6vqSUk+\nlmuX3/l+VT2+29xOba39oKo+muRbSbYmObW19r35PA8AAADL13zOkT0wyVVT2lcN7puX1tpHktxh\n2n3/Mq398iQvn+++AQAAWP7mE2TfmOQrVfVf6ZbeeXCS/1iQqgAAAGCIOQfZ1tqLqurDSY4b3PXI\n1tr6hSkLAAAAZrbDIFtVm5NMvTxwTdnWWmv7LkRhAAAAMJO5XOxpn1EUAgAAAHMxl+V3AAAAYMkQ\nZAEAAOgVQRYAAIBeEWQBAADoFUEWAACAXhFkAQAA6BVBFgAAgF4RZAEAAOgVQRYAAIBeEWQBAADo\nFUEWAACAXhFkAQAA6BVBFgAAgF4RZAEAAOgVQRYAAIBeEWQBAADoFUEWAACAXhFkAQAA6BVBFgAA\ngF4RZAEAAOgVQRYAAIBeEWQBAADoFUEWAACAXhFkAQAA6BVBFgAAgF4RZAEAAOgVQRYAAIBeEWQB\nAADoFUEWAACAXhFkAQAA6BVBFgAAgF4RZAEAAOgVQRYAAIBeEWQBAADoFUEWAACAXhFkAQAA6BVB\nFgAAgF4RZAEAAOgVQRYAAIBeEWQBAADoFUEWAACAXhFkAQAA6BVBFgAAgF4RZAEAAOgVQRYAAIBe\nEWQBAADoFUEWAACAXhFkAQAA6BVBFgAAgF4RZAEAAOgVQRYAAIBeGXmQraoTquoHVfXDqnrOLP3u\nXlVbqup/j7I+AAAAlraRBtmqWpHkdUmOT3JEkodW1eFD+r0kyUdHWR8AAABL36hHZI9J8qPW2k9b\na1uSvC3Jg2bo9+Qk70py0SiLAwAAYOkbdZA9OMl5U9o/G9x3jaq6ZZIHt9b+KUmNsDYAAAB6YNVi\nFzCDU5JMPXd2aJhdt25d1qxZkyRZvXp1jjrqqKxduzZJMj4+niQjbU9s3JgM6hmfmOi2a8/Ynti4\nMePj44v6efWhPWmxP68+tCc2bsykpfL5LdX2OeMTSZLbrF2jPaS9YcLxNNf2homNWTG+tD6/pdie\ntNifl7a2tvZSbq9fvz6bNm1KkkwM/t4bplprs3bYmarq2CRjrbUTBu3nJmmttZdO6fOTyZtJbp7k\n0iSPa629f9q+2ihrn4uxdesyNvjDmtmNTUxk7IwzFruMJc8xNXeOqbk5cWxdbje2ZrHLWPLOHpvI\n6WNnLHYZveCYmhvHFMD8VVVaazMObI56RPasJLevqlsn2ZDkIUkeOrVDa+22k7er6vQkH5geYgEA\nANh1jTTItta2VtWTknws3fm5p7XWvl9Vj+82t1OnP2SU9QEAALD0jfwc2dbaR5LcYdp9/zKk76NG\nUhQAAAC9sWKxCwAAAID5EGQBAADoFUEWAACAXhFkAQAA6BVBFgAAgF4RZAEAAOgVQRYAAIBeEWQB\nAADoFUEWAACAXhFkAQAA6BVBFgAAgF4RZAEAAOgVQRYAAIBeEWQBAADoFUEWAACAXhFkAQAA6BVB\nFgAAgF4RZAEAAOgVQRYAAIBeEWQBAADoFUEWAACAXhFkAQAA6BVBFgAAgF4RZAEAAOiVVYtdAAAA\nwHJ22WXJBRuT8zckF2zobh93bHKPuy12Zf0lyAIAAFwPW7YkGy/sgukFG5PzL5hye8O19/36N9s/\n9uS/FmRvCEEWAABgim3bkot/2Y2eTgbSmYLqRT9PWrt+z3H+BTu35l2NIAsAACxLz3/BKTn3vE3X\nuW/Llt1z2RX75rIr9slll++Ty67YJ5dfc7u7//LL98m2tnJBa/vvj/y/rPv1Wxf0Oebj0ENW5+QX\nPm2xy5gzQRYAAOi9K69MNlx43VHU//rw3VK7HZfNl+San6uuGn1tK1Yk++w95Wef5KAD75A1h42N\nvpghJn44ttglzIsgCwAALFlbtyY//8V1L5R0zXTfKaH1FxfP9OjjFry+G+/VBdPrBNW9k32n3LfX\nXknVgpeySxFkAQCAkWutuwjS5Hmnw4Lqhgu7MDtqN7rRdUPp3nsn+04bVd37xsnKhZ2BzBCCLAAA\nsFNdfvn2I6YzBdXLLx99bStXbj9iOhlMp7Z33330tTF3giwAADAnV1+dXHjRzFN7pwbVX23a8b52\nthUrklscmNzyFt3PwQclX/rSp3LomvtfE1T33TvZYw/TfJcDQRYAAHZxrV273Mz0NVCnLjdz4UXX\nf7mZG+KmNxmE01teN6je8qDBv7dIDtg/WTUt3ax71Gez5rD7j75gFpwgCwAAy9gllwyf2js1qC7G\n1Xz32uvaIDo1nE6/vcceo6+NpU2QBQCAHrrqqmTDxuuOmG4XVDckmzePvrZVq5KDDrzuiOlMI6r7\n7muaL9ePIAsAAEvItm3dcjMzTe2dGlR//ovFqW//m08Jp0OC6v43785ZhYUiyAIAwAi0lvzmN7Of\ngzq53MzVV4++vn32uTaUDguqB93C1XxZGgRZAAC4ga64Yvur+F7n9iCoXnbZ6GvbffftR0ynB9WD\nDuyCLPSFIAsAAENs3dpdqXfqiOl1wulgRPWXvxp9bVXJgQfMPLV3alC92U2dh8ryI8gCAMA0//3R\n5HFPTzZe2J2zOmo3WT37OagHH9SF2OnLzcCuwqEPAADT7LFHN/q6EPs9+KCZz0GdXG7moAO7ZWmA\n4QRZAACWjOe/4JSce96mxS4jm35z8yRPmnP/qm3Zc4/N2WuPzd2/e3a399pjc/ba8zfZc4/NufEe\nm7PbbldcO823JRdf0P18a571HXrI6pz8wqfN81GwfAiyAAAsGeeetylrDhtb7DJyxZXJ+z7Z3d5r\nz2SfvbuLIe2z93Vv7zto77XXiqxYsV+S/UZS38QPx0byPLBUCbIAADDNjXZPnvqEZO8bOw8VliK/\nlgAAME1Vsno0g6vA9bBisQsAAACA+RBkAQAA6BVBFgAAgF4RZAEAAOgVQRYAAIBeEWQBAADoFUEW\nAACAXhFkAQAA6BVBFgAAgF4ZeZCtqhOq6gdV9cOqes4M2x9WVd8c/Hy+qu486hoBAABYukYaZKtq\nRZLXJTk+yRFJHlpVh0/r9pMk92mt3SXJ3yf511HWCAAAwNI26hHZY5L8qLX209baliRvS/KgqR1a\na2e21n49aJ6Z5OAR1wgAAMASNuoge3CS86a0f5bZg+pjknx4QSsCAACgV1YtdgHDVNX9kpyY5Lhh\nfdatW5c1a9YkSVavXp2jjjoqa9euTZKMj48nyUjbExs3JoN6xicmuu3aM7YnNm7M+Pj4on5efWhP\nWuzPqw/tiY0bM2mpfH5LtX3O+ESS5DZr12gPaW+YcDzNtb1hYmNWjC+tz28ptict9ufVh/bGDRNZ\nc1iSJBM/6bavue1a7RnaS+HzWuptx9Pc2xs3TGR8kf8+X79+fTZt2tTVN/h7b5hqrc3aYWeqqmOT\njLXWThi0n5uktdZeOq3fkUneneSE1trZQ/bVRln7XIytW5exwR/WzG5sYiJjZ5yx2GUseY6puXNM\nzc2JY+tyu7E1i13Gknf22EROHztjscvoBcfU3Dim5m7do8ay5rCxxS5jyZv44VjO+PexxS5jyXM8\nzd1SPKaqKq21mmnbqKcWn5Xk9lV166raPclDkrx/aoeqOjRdiH3EsBALAADArmukU4tba1ur6klJ\nPpYuRJ/WWvt+VT2+29xOTfK3SW6a5A1VVUm2tNaOGWWdAAAALF0jP0e2tfaRJHeYdt+/TLn92CSP\nHXVdAAAA9MOopxYDAADADSLIAgAA0CuCLAAAAL0iyAIAANArgiwAAAC9IsgCAADQK4IsAAAAvSLI\nAgAA0CuCLAAAAL0iyAIAANArgiwAAAC9IsgCAADQK4IsAAAAvSLIAgAA0CuCLAAAAL0iyAIAANAr\ngiwAAAC9IsgCAADQK4IsAAAAvSLIAgAA0CuCLAAAAL0iyAIAANArgiwAAAC9IsgCAADQK4IsAAAA\nvSLIAgAA0CuCLAAAAL0iyAIAANArgiwAAAC9IsgCAADQK4IsAAAAvSLIAgAA0CuCLAAAAL0iyAIA\nANArgiwAAAC9IsgCAADQK4IsAAAAvSLIAgAA0CuCLAAAAL0iyAIAANArgiwAAAC9IsgCAADQK4Is\nAAAAvSLIAgAA0CuCLAAAAL0iyAIAANArgiwAAAC9IsgCAADQK4IsAAAAvSLIAgAA0CuCLAAAAL0i\nyAIAANArgiwAAAC9IsgCAADQK4IsAAAAvTLyIFtVJ1TVD6rqh1X1nCF9XlNVP6qq9VV11KhrBAAA\nYOkaaZCtqhVJXpfk+CRHJHloVR0+rc/vJ7lda+23kjw+yT+PskYAAACWtlGPyB6T5EettZ+21rYk\neVuSB03r86Akb0yS1tqXk+xXVQeOtkwAAACWqlEH2YOTnDel/bPBfbP1OX+GPgAAAOyiqrU2uier\n+pMkx7fWHjdoPzzJMa21p0zp84Ek/9Ba++Kg/Ykkz26tfX3avkZXOAAAACPXWquZ7l814jrOT3Lo\nlPatBvdN73PIDvokSUYZwvn/2zvzqKiOtA//WqJBVNwVZFFBZOkdBJGIguOGWzC4RHEZRjTGZBI1\njDqORs3kiIlbJnHUfDNjSGAcj6MmEhVcEFmMLCIqcWOUAOIKRBxFlO39/iBUaOhuGmhQh/c5h3O6\n771Vt7z9+FbVvVV1//eRSCTsFGNU2CnG2LBTjDFhnxhjw04xxkYi0dqHBdDyQ4tTAQyQSCR9JRJJ\nOwBvAoisdUwkgDkAIJFIPAEUEdG9li3mi0tpaSmGDx8ugsTXX3+NgQMHwtHREd9880296RMSEuDm\n5oa2bdviwIEDYvv9+/cxbty4Zis38+LSVKe2bt0KqVQKlUqFUaNG4ebNqpkB7FTrpbZTfn5+6Nq1\nKyZNmmRQeo5TTG2a6hTHKaYmNX26cOECvLy8IJfLoVKpsHfv3nrTc4xiatNUpzhGNY4W7cgSUQWA\ndwEcA3AJwB4iuiKRSN6SSCQLfjnmCICfJBLJdQBfAljUkmV80fnnP/+JCRMmQCKR4MGDB/joo4+Q\nmpqK5ORkrFu3Dg8fPtSbvm/fvvj6668RGBiosb1Xr17o1q0b0tPTm7P4zAtIU51ydXVFWloazp8/\nj4CAAPzhD38AwE61Zmo6BQDLli1DRESEwek5TjG1aapTHKeYmtT0yczMDOHh4cjIyEBUVBQWL16M\n//73v3rTc4xiatNUpzhGNY4Wf48sEUUTkSMRORDRhl+2fUlE/1fjmHeJaAARKWvPjW3t7N69G6+/\nXrXQ89GjRzF69Gh07twZXbp0wejRoxEdHa03va2tLWQymdbH9BMnTsTu3bubpdzMi0tTnRo+fDhM\nTU0BAJ6enrh169eZAOxU66SmUwDg6+uLjh07Gpye4xRTm6Y6xXGKqUlNnxwcHGBvbw8AsLS0RK9e\nvZCfn683PccopjZNdYpjVONo8Y4s03gqKyvx448/YuDAgQCAW7duwcbm1+nEVlZWGuI3FA8PD8TH\nxze5nMzLg7Gd+sc//gE/Pz/xnZ1qfVRWVuLSpUvCKWPDTrU+jO0Ux6nWjT6fUlJSUFZWJjohjYF9\nan0Y2ymOUYbT0os9MU2goKAA5ubmzZZ/nz59kJ2d3Wz5My8exnQqIiICaWlpiIuLE9vYqdZHQUEB\nOnXq1Gz5s1OtD2M6xXGK0eXTnTt3MGfOHISHhzcpf/ap9WFMpzhGNQx+IvuSUXMlOCsrK+Tm5orv\neXl5sLJq/Ct3iQht2rASrQ1jOHXixAmEhobi+++/R9u2bTXyZqdaH825YiU71ToxhlMcp5hqavv0\n6NEjTJgwAaGhoXB3d29y3uxT68MYTnGMajh8VV4ievTogcePH4vvY8aMwfHjx/Hw4UM8ePAAx48f\nx5gxYwAAK1euxMGDB/XmV/s/3Z07d9C3b1/jF5x5YTGGU+np6Vi4cCEiIyPRvXt3jX3sVOujtlPV\nEFGdmMNxijEEYzjFcYqpprZPZWVl8Pf3x9y5czF58mSNYzlGMYZgDKc4RjUO7si+RLRp0wYymQyZ\nmZkAgK5du2L16tUYNGgQBg8ejDVr1qBLly4AgIyMDFhYWNTJ4+zZs7CxscG+ffuwcOFCyOVysS8l\nJQXe3t4t849hXgiM4dSyZctQXFyMqVOnQq1Ww9/fX+xjp1oftZ0CgGHDhmH69Ok4efIkbG1tcfz4\ncQAcpxjDMIZTHKeYamr7tHfvXiQmJiIsLAxqtRqurq64ePEiAI5RjGEYwymOUY2k+o7my/ZXVfTW\nR1hYGG3YsKHe48aOHdvgvGfOnEnnzp1rTLH+J2Cn9MNONRx2Sj/sVMNhp/TDTjUM9kk/7FPDYaf0\nw041nF+c0tof5CeyLxkzZszAkSNH6p0vFBUV1aB88/PzUVRUBLVa3ZTiMS8h7BRjbNgpxtiwU4wx\nYZ8YY8NOPR8MWrW4ffv2d58+fdq7uQvTEExNTbW+v6u10FyTvlvzNWWn2Cljw06xU8aGnWKnjAn7\nxD4ZG3aKnTI2pqamlbr2Seq7cwAAEomEDDmuJZFIJM26MibT+mCnGGPDTjHGhp1ijAn7xBgbdoox\nNr84pbUnz0OLWwHz5s1D7969oVAodB7z3nvvwcHBASqVCufPnwcAPHv2DIMHD4ZarYZUKsXKlSvF\n8ampqfDw8IBarYaHhwfOnj0LAMjJyYGZmRlcXV3h6uqKRYsWiTSrVq2Cra2tzveW7t+/H23atMG5\nc+fENj8/P3Tt2hWTJk2qc/yf/vQnODo6QiqVYtu2bQ27KEyjqc+n3bt3Q6lUQqlUYujQoWKBAwDo\n168flEql8KYmX3zxBZydnSGXy7FixQoAVQ7OnDkTCoUCUqkUGzZsEMf7+flBrVZDJpMhODgY5eXl\nAIAvv/wSCoUCarUaXl5eGue/efMmxowZAxcXF8hkMo1XDbFPz5fo6Gg4OTlh4MCB+OSTT+rsLyws\nhJ+fH1QqFeRyOcLCwgDoj1Pr1q2DtbW1iEfR0dEaeebm5qJTp07YsmVLnfNNmjRJw/GEhAS4ubmh\nbdu2OHDgQJ3jHz16BBsbG7z33nti26xZs+Dk5ASFQoHg4GBUVFQ0+LowjaexTlVTWVkJV1dXjfpH\nl1P66r6ysjK89dZbcHR0hIuLC7799lsAdWPVhQsXRJr3338fUqkUUqkUixcvFtuPHDkClUoFtVqN\nYcOGISsryyjXiqmf+nxqTN334YcfQqlUQqVSYeTIkcjLy9PIU1uM8vX1hZOTk1hEqKCgQBw7cuRI\nKJVKjBgxArdv3xZpdPkEcN33PKnPqcjISOHNoEGDcPLkyXrT7tu3DzKZDCYmJhrtaX0xSld7Sl+9\nt3z5csjlcigUCuzdu1djX4s6pWvybM0/vCATt8vLy8XnF6VMLwMJCQmUnp5Ocrlc6/4jR47QuHHj\niIgoKSmJBg8eLPYVFxcTUdW1Hzx4MCUmJhIRkY+PDx09elSk9/HxISKi7OxsnedJTk6mu3fvUqdO\nnerse/ToEQ0bNoyGDBlCaWlpYvvJkyfp0KFDNHHiRI3jv/rqK5o7d674np+fr/caGAI7ZRj1+XTm\nzBkqKioiIqKoqCgNn/r3708///xznTSxsbE0atQoKisrI6Jff8+wsDCaMWMGERE9efKE+vXrRzk5\nOURU5Uw1AQEBFBERUWd7ZGQk/eY3vxHffXx8KCYmhoiq3C4pKSGi5vGJiJ0ylIqKCrK3t6fs7Gwq\nLS0lpVJJV65c0Thm7dq1tGLFCiKq+n26desmfNEVp9auXUubN2/Wed4pU6bQtGnT6hxz4MABCgwM\n1JYv4ykAABBUSURBVHA8JyeHMjIyaO7cubR///46eb3//vsUGBhIv//978W2qKgo8XnGjBm0c+dO\ng66HPtgpw2iqU0REW7ZsocDAQI36R5dT+uq+NWvW0OrVq8X3wsJCItIdq06dOkVDhw4lIqLKykoa\nMmQIxcXFERFRv3796Nq1a0REtH37dgoKCjLwimiHfTIMQ3xqTN1X04HPP/+c5s2bp7FfW4zy8fHR\nuvDP1KlTKTw8nIiq6tTZs2cTkX6fdu3axW2p54QhTlXXbUREFy9eJHt7+3rTXr16lTIzM8nX11ej\nPa0vRulqT+mq9w4fPkyjR4+myspKKi4uJnd3d5FHM7bPjbvYU05ODpydnTFr1iy4uLhg2rRpePr0\nKWJiYuDq6gqlUong4GCUlZXh7NmzCAgIAAAcPHgQZmZmKC8vx7Nnz2Bvbw8AyMrKgp+fH9zd3TF8\n+HCxhHVQUBDefvtteHp6Yvny5Y3vsbdihg4diq5du+rcf/DgQcyZMwcAMHjwYDx8+BD37t0DAJiZ\nmQGoeupRWVkp8rG0tMTDhw8BAEVFRbCyshL5kY4hJR4eHujdW/tU69WrV2PFihV49dVXNbb7+vqi\nY8eOdY7fsWMHPvzwQ/G9R48eOv99jHGpzydPT0907txZfL5165bYR0SorKw71WHHjh1YsWIFXnml\natp+9e9pYWGB4uJiVFRU4MmTJ3j11VfFE/1qL8rKylBaWireu1bTl8ePH4u8rly5goqKCowYMQJA\nldumpqbi/OzT8yMlJQUODg7o27cv2rZtizfffLPOe/YsLCzw6NEjAFVPP7t37y580RWnAN3x6ODB\ng7Czs4NUKtXYXlxcjK1bt2LVqlUa221tbSGTybTOU0pLS8P9+/cxevRoje1jx44Vnz08POo8bWGa\nj6Y6lZeXhyNHjiA4OLhO3rqc0rV9165d+OMf/yi+d+vWDYDuWNWrVy+Ulpbi6dOnKCkpQXl5uag7\nLS0tUVRUBAB4+PAh+vTpU//FYJqMIT41pu6r6UBxcbFG3aMrRgHQmtfly5fh6+sLAPDx8RHl0+fT\nzp07ue57ThjiVHXdBmjGCH1pHR0d4eDgoDUe6YpRutpTuuq9y5cvY9iwYZBIJDAzM4NCoRCjU1q6\nPdWkocXXrl3Du+++i8uXL8Pc3BybN29GUFAQ/v3vf+PChQsoKyvDjh07oFarxZCZxMREyOVypKam\nIjk5GZ6engCABQsWYNu2bUhNTcXGjRvx9ttvi/PcunULSUlJ2LRpU1OKy+jg1q1bsLGxEd+trKxE\nAK6srIRarYaFhQV8fHzg4uICANiwYQOWLl0KW1tbLFu2DKGhoSJ9dnY2XF1d4evri8TExHrPn56e\njry8PPj5+Rlc5hs3bmDPnj1wd3fH+PHjcf36dYPTMi3H3//+d43fVSKRYNSoUXB3d8ff/vY3sT0z\nMxPx8fHw9PSEr6+vGKo+ZswYmJubw9LSEv369UNISIh4ry1Q1VGwsLBA+/btNToN27dvx4ABA/DB\nBx8INzMzM9G5c2cEBATAzc0Ny5cvF0GdfXq+1I5B1tbWGo1AAJg/fz4uXbqEPn36QKlU4i9/+YvY\npytOAcC2bdugUqkQHBwsOgDFxcX49NNPsWbNmjoV++rVqxESEoL27dsbVHYiQkhICDZt2qSzkVBe\nXo7w8HANR5nmpalOLVmyBBs3btR640KbU4D2uq/6hu+qVavg5uaG6dOnIz8/X6TRFqucnZ0xevRo\nWFpawsrKCmPGjIGjo6M4t5+fH2xtbRERESGmYTDNiyE+1cTQug/4ddpVWFiYuOGhL0YBwG9/+1u4\nurri448/FttUKpUY/nngwAE8fvwYDx480OsT133PD0Od+u677+Ds7Ixx48bh888/b1Da2uhrn+tq\nT2lDqVQiOjoaJSUlKCgoQGxsLG7evAmg5Z1qUkfW1tZWdEQDAwMRExMDOzs78ZR17ty5iI+Ph4mJ\nCezt7XH16lWkpKRg6dKliIuLQ0JCAry9vVFcXIwffvhBvAT4rbfeEk8EAWDq1KlNKSbTBNq0aSM6\nmvHx8YiLiwNQNU/yiy++QG5uLrZu3Yrf/e53AKruFufm5uLcuXPYvHkzZs6cicePH+vMn4iwdOlS\nbN68WWNbfTx79gxmZmZITU1FcHCwOD/z4hAbG4uvvvpKY+7G6dOnce7cORw5cgR//etfRSAtLy/H\ngwcPkJSUhE8//RTTpk0DAERERKCkpAR3795FVlYWNm3ahOzsbJFfdHQ07ty5g2fPnuGbb74R2xct\nWoTr169jy5Ytwo3y8nIkJiZiy5YtSE1NxY0bNzTmWbJPLzahoaFQKpW4ffs20tPT8c4774jYoitO\nLVq0CFlZWTh//jwsLCwQEhICAFi7di2WLFmicbcbAC5cuIAbN25g0qRJNafW6GX79u0YP368eDKm\nLc2iRYswfPhwvPbaa026Boxx0eXU4cOH0bt3b6hUqjoe1Hbqgw8+AKC77isvL0deXh6GDh2KtLQ0\neHp6ijTV+dWOVfHx8YiNjcXt27dx69YtxMTE4PTp0yAizJ49G0ePHkVubi6CgoKwZMmSlr1oTL00\npO4DgI8//lj8ntXzV2vHqJoO7t69GxkZGUhISEBCQgIiIiIAABs3bsSpU6fg5uaGhIQEWFlZwcTE\nRKdPANd9LwP+/v64cuUKIiMjMXv27Ebn06dPH73tc13tKW2MGjUKfn5+8PLyQmBgILy8vGBiYgKg\n5Z0y6mJPNZ+U1Mbb2xtRUVFo164dRo4cicTERJw+fRre3t5iKNi5c+eQnp6O9PR0/PjjjyJthw4d\njFlMphZWVlbiTgpQNaSq5lBhADA3N8f48ePFk7Lk5GT4+/sDAKZMmYKUlBQAQLt27cSwPldXV9jb\n24th4tp49OgRLl26BB8fH/Tv3x9JSUl4/fXXNSaoa8PGxgaTJ08GAEyePFljUQXm+XPx4kUsWLAA\nkZGRGsM8LS0tAQA9e/bE5MmThTfW1tZ44403AADu7u4wMTFBYWEhfvjhB0yePBlt2rRBz5498dpr\nrwkHq2nXrh0CAgKQmppapxzTp09Henq6OIdKpULfvn3Rpk0b+Pv7C8/Yp+eLlZWVxsJb2mLQ6dOn\nxU1Ne3t79O/fH1evXtU4pnac6tmzp3iiNn/+fOFbcnIyli1bBjs7O3z22WdYv349tm/fjjNnziAt\nLQ12dnbw9vZGZmamGIquizNnzmDbtm2ws7NDSEgIwsPDNRac+uijj1BQUKB1QSmm+WiKU6dPn0Zk\nZCTs7OwwY8YMxMbGiuk3tZ2qjju66r7u3bujQ4cOIr5MnTpVxKSa1IxVSUlJ8PPzQ/v27WFmZgY/\nPz+cOXMG+fn5ePbsGQYNGgQAmDZtGs6cOWO0a8boxhCfgIbXfTWZOXOmRhurZowKDQ3F9u3bNfLq\n0KEDZs6cKfKytLTE/v37kZaWJp7Umpub6/QJ4LrveWKoU9V4e3ujvLwchYWFDU4LAG3btq23fa6v\nPVWblStXIj09HUePHkVlZSUGDhwIoOWdalJHNjc3F8nJyQCq7hC5u7sjOztbrKIXHh6O4cOHA6j6\nAT777DN4eXmhe/fuKCwsxLVr1yCVStGpUyf0798f+/btE3nzfybjou/pwqRJk8Tdl6SkJHTp0gW9\ne/dGQUGBGBZVUlKC48ePixcyOzg4iKceMTExQuCCggIxdyMrKwvXr1+HnZ1dnbJUY25ujvv37yMr\nKws//fQTPD098f3338PV1VVv2f39/cXqbadOnRLDZJiWQZ9Pubm5CAgIQHh4uBidAQBPnjwRd/+K\ni4tx7NgxyGQyAJq/Z2Zmppij4eTkhJiYGJEmKSkJTk5OKC4uxt27dwFUPWk9fPgwVCoVAGgMYzl0\n6BDkcjmAqg5yUVERCgsLAQAnT54UQ1DZp+eLu7s7rl+/jpycHJSWlmLPnj11Vip3dnbGiRMnAAD3\n7t1DZmYm7OzstMapaheqHQGqhtpV+xYfH4+srCxkZWVh8eLFWLlyJRYtWoSFCxciLy8PWVlZSExM\nhKOjo8YqkdXUdD8iIkLUe5s2bcKcOXOwfv16AFXDC48ePYp//etfRrxajCE0xan169cjNzcXWVlZ\n2LNnD0aMGCHqSF1O6av7Jk6ciNjYWADAiRMnRNzRFaucnJwQFxeHiooKlJWVIS4uDi4uLujZsydK\nSkpEumPHjsHZ2dm4F47RiiE+Nabuq+nAd999J2KXrhhVUVEh6rCysjIcOnRI5FVYWChiU2hoqHgS\nps2nam+47nt+GOLUjRs3xOfqG+/du3c3KC2gWVfpilH62lO68qqsrMTPP/8MoKq/lpGRIdaIaHGn\ndK0CVfMPWlYgy87OJicnJ5o9ezY5OzvTlClTqKSkhE6ePElqtZoUCgXNmzePSktLiYiopKSETE1N\n6cSJE0REtGDBAvL399fIb+zYsaRUKkkqldKf//xnIiIKCgrSukKktjIx2pkxYwZZWlpSu3btyMbG\nhnbt2kU7d+6kL7/8UhzzzjvvkL29PSkUCrHK2cWLF0mtVpNKpSKFQkEbN24Ux6emppKHhwepVCry\n9PQUK+jt37+fpFIpqdVqcnNzo8OHD4s0y5YtI2trazIxMSEbGxtat25dnbLWXmXN29ubevXqRWZm\nZmRjY0PHjh0jIqKioiIaP348yeVy8vLyoosXLzb5OrFThlGfT8HBwdStWzfhjru7OxERZWVlkVKp\nJJVKRTKZjEJDQ0WepaWlNGvWLJLJZOTm5kanTp0iIqKnT59SYGAgyWQykkqlYuXGe/fukbu7OymV\nSlIoFBQSEkKVlZVEVLV6bLWDo0aNov/85z/iPCdOnCCFQkEKhYKCgoLECqXN4RMRO9UQoqKiaODA\ngTRgwADhRk2v8vPzacKECaRQKEgul9Pu3buJSH+cmj17NsnlclIqlfT666/T3bt365zX0FVoU1NT\nydramjp27Eg9evQgmUxWJ01YWJjGqsWvvPIKDRgwgFQqFanValGvNQV2ynAa61RNTp06pbFqsS6n\n9NV9OTk5NGzYMFIqlTRy5Ei6efMmEemPVYsXLyapVEpSqZRCQkLE9ujoaFKpVKRSqcjX15d++umn\nJl0j9slw6vOpMXVfQEAAyeVyUqlU9MYbb9C9e/fqnLdmjCouLiY3NzdSKpUkk8lo8eLFou7bt28f\nOTg4kKOjI82fP1+0v4l0+8RtqedLfU598sknIkYMHTqUUlJS9KYlIvr222/J2tqaTE1NycLCgsaO\nHUtEumOUvvaUrnrv6dOn5OLiQlKplIYMGaLhTTM6pbWPKiED5gBJJBKqfVxOTg4mTJiAjIwMI3et\nDYNfuMwYG3aKMTbsFGNs2CnGmLBPjLFhpxhj84tTdVfeQxOHFmtbzY9hGIZhGIZhGIZhmpNXDDnI\n1NT0nkQi0foC0OfVmTU1Na2USCRGXayKad2wU4yxYacYY8NOMcaEfWKMDTvFGBtTU9N7uvYZNLSY\nYRiGYRiGYRiGYV4U+I4JwzAMwzAMwzAM81LBHVmGYRiGYRiGYRjmpYI7sgzDMAzDMAzDMMxLBXdk\nGYZhGIZhGIZhmJcK7sgyDMMwDMMwDMMwLxX/Dzze9h3s0mtYAAAAAElFTkSuQmCC\n",
"text/plain": [
"<matplotlib.figure.Figure at 0x7f1d889a9ad0>"
]
},
"metadata": {},
"output_type": "display_data"
}
],
"source": [
"big = clusters[0]\n",
"\n",
"plot_cstates(idle_df, big)"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"# Energy Model Generation"
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {
"collapsed": true
},
"outputs": [],
"source": [
"def pstates_model_df(clusters, pp_stats, power_perf_df, metric='avg'):\n",
" \"\"\"\n",
" Build two data frames containing data to create the energy model for each\n",
" cluster given as input.\n",
" \n",
" :param clusters: list of clusters to profile\n",
" :type clusters: list(namedtuple(ClusterDescription))\n",
" \n",
" :param pp_stats: power and performance statistics\n",
" :type pp_stats: :mod:`pandas.DataFrame`\n",
" \n",
" :param power_perf_df: power and performance data\n",
" :type power_perf_df: :mod:`pandas.DataFrame`\n",
" \"\"\"\n",
" max_score = pp_stats.perf[metric].max()\n",
"\n",
" core_cap_energy = []\n",
" cluster_cap_energy = []\n",
" for cl in clusters:\n",
" # ACTIVE Energy\n",
" grouped = power_perf_df.loc[cl.name].groupby(level='freq')\n",
" for freq, df in grouped:\n",
" # Get average energy at OPP freq for 1 CPU\n",
" energy_freq_1 = pp_stats.loc[cl.name].loc[freq]['energy'][metric]\n",
" # Get cluster energy at OPP freq\n",
" x = df.index.get_level_values('cpus').tolist()\n",
" y = df.energy.tolist()\n",
" slope, intercept = linfit(x, y)\n",
" # Energy can't be negative but the regression line may intercept the\n",
" # y-axis at a negative value. Im this case cluster energy can be\n",
" # assumed to be 0.\n",
" cluster_energy = intercept if intercept >= 0.0 else 0.0\n",
" core_energy = energy_freq_1 - cluster_energy\n",
"\n",
" # Get score at OPP freq\n",
" score_freq = pp_stats.loc[cl.name].loc[freq]['perf'][metric]\n",
" capacity = int(score_freq * 1024 / max_score)\n",
"\n",
" core_cap_energy.append({'cluster' : cl.name,\n",
" 'core': cl.core_name,\n",
" 'freq': freq,\n",
" 'cap': capacity,\n",
" 'energy': core_energy})\n",
" cluster_cap_energy.append({'cluster': cl.name,\n",
" 'freq': freq,\n",
" 'cap': capacity,\n",
" 'energy': cluster_energy})\n",
"\n",
" core_cap_nrg_df = pd.DataFrame(core_cap_energy)\n",
" cluster_cap_nrg_df = pd.DataFrame(cluster_cap_energy)\n",
" return core_cap_nrg_df, cluster_cap_nrg_df"
]
},
{
"cell_type": "code",
"execution_count": 790,
"metadata": {
"collapsed": false
},
"outputs": [],
"source": [
"core_cap_nrg_df, cluster_cap_nrg_df = pstates_model_df(clusters,\n",
" pp_stats,\n",
" power_perf_df)"
]
},
{
"cell_type": "code",
"execution_count": 791,
"metadata": {
"collapsed": false
},
"outputs": [
{
"data": {
"text/html": [
"<div>\n",
"<table border=\"1\" class=\"dataframe\">\n",
" <thead>\n",
" <tr style=\"text-align: right;\">\n",
" <th></th>\n",
" <th>cap</th>\n",
" <th>cluster</th>\n",
" <th>core</th>\n",
" <th>energy</th>\n",
" <th>freq</th>\n",
" </tr>\n",
" </thead>\n",
" <tbody>\n",
" <tr>\n",
" <th>0</th>\n",
" <td>511</td>\n",
" <td>big</td>\n",
" <td>A72</td>\n",
" <td>17.789481</td>\n",
" <td>600000</td>\n",
" </tr>\n",
" <tr>\n",
" <th>1</th>\n",
" <td>853</td>\n",
" <td>big</td>\n",
" <td>A72</td>\n",
" <td>35.823328</td>\n",
" <td>1000000</td>\n",
" </tr>\n",
" <tr>\n",
" <th>2</th>\n",
" <td>1024</td>\n",
" <td>big</td>\n",
" <td>A72</td>\n",
" <td>54.063424</td>\n",
" <td>1200000</td>\n",
" </tr>\n",
" <tr>\n",
" <th>3</th>\n",
" <td>214</td>\n",
" <td>little</td>\n",
" <td>A53</td>\n",
" <td>2.006948</td>\n",
" <td>450000</td>\n",
" </tr>\n",
" <tr>\n",
" <th>4</th>\n",
" <td>382</td>\n",
" <td>little</td>\n",
" <td>A53</td>\n",
" <td>4.815868</td>\n",
" <td>800000</td>\n",
" </tr>\n",
" <tr>\n",
" <th>5</th>\n",
" <td>454</td>\n",
" <td>little</td>\n",
" <td>A53</td>\n",
" <td>7.074375</td>\n",
" <td>950000</td>\n",
" </tr>\n",
" </tbody>\n",
"</table>\n",
"</div>"
],
"text/plain": [
" cap cluster core energy freq\n",
"0 511 big A72 17.789481 600000\n",
"1 853 big A72 35.823328 1000000\n",
"2 1024 big A72 54.063424 1200000\n",
"3 214 little A53 2.006948 450000\n",
"4 382 little A53 4.815868 800000\n",
"5 454 little A53 7.074375 950000"
]
},
"execution_count": 791,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"core_cap_nrg_df"
]
},
{
"cell_type": "code",
"execution_count": 792,
"metadata": {
"collapsed": false
},
"outputs": [
{
"data": {
"text/html": [
"<div>\n",
"<table border=\"1\" class=\"dataframe\">\n",
" <thead>\n",
" <tr style=\"text-align: right;\">\n",
" <th></th>\n",
" <th>cap</th>\n",
" <th>cluster</th>\n",
" <th>energy</th>\n",
" <th>freq</th>\n",
" </tr>\n",
" </thead>\n",
" <tbody>\n",
" <tr>\n",
" <th>0</th>\n",
" <td>511</td>\n",
" <td>big</td>\n",
" <td>3.603797</td>\n",
" <td>600000</td>\n",
" </tr>\n",
" <tr>\n",
" <th>1</th>\n",
" <td>853</td>\n",
" <td>big</td>\n",
" <td>5.473947</td>\n",
" <td>1000000</td>\n",
" </tr>\n",
" <tr>\n",
" <th>2</th>\n",
" <td>1024</td>\n",
" <td>big</td>\n",
" <td>7.764931</td>\n",
" <td>1200000</td>\n",
" </tr>\n",
" <tr>\n",
" <th>3</th>\n",
" <td>214</td>\n",
" <td>little</td>\n",
" <td>3.051592</td>\n",
" <td>450000</td>\n",
" </tr>\n",
" <tr>\n",
" <th>4</th>\n",
" <td>382</td>\n",
" <td>little</td>\n",
" <td>4.941256</td>\n",
" <td>800000</td>\n",
" </tr>\n",
" <tr>\n",
" <th>5</th>\n",
" <td>454</td>\n",
" <td>little</td>\n",
" <td>7.347481</td>\n",
" <td>950000</td>\n",
" </tr>\n",
" </tbody>\n",
"</table>\n",
"</div>"
],
"text/plain": [
" cap cluster energy freq\n",
"0 511 big 3.603797 600000\n",
"1 853 big 5.473947 1000000\n",
"2 1024 big 7.764931 1200000\n",
"3 214 little 3.051592 450000\n",
"4 382 little 4.941256 800000\n",
"5 454 little 7.347481 950000"
]
},
"execution_count": 792,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"cluster_cap_nrg_df"
]
},
{
"cell_type": "code",
"execution_count": 793,
"metadata": {
"collapsed": false
},
"outputs": [],
"source": [
"def energy_model_dict(clusters, core_cap_nrg_df, cluster_cap_nrg_df, metric='avg'):\n",
" n_states = len(clusters[0].idle_states)\n",
"\n",
" nrg_dict = {}\n",
"\n",
" grouped = core_cap_nrg_df.groupby('cluster')\n",
" for cl, df in grouped:\n",
" nrg_dict[cl] = {\n",
" \"opps\" : {},\n",
" \"core\": {\n",
" \"name\": df.core.iloc[0],\n",
" \"busy-cost\": OrderedDict(),\n",
" \"idle-cost\": OrderedDict()\n",
" },\n",
" \"cluster\": {\n",
" \"busy-cost\": OrderedDict(),\n",
" \"idle-cost\": OrderedDict()\n",
" }\n",
" }\n",
" # Core COSTS\n",
" # ACTIVE costs\n",
" for row in df.iterrows():\n",
" nrg_dict[cl][\"opps\"][row[1].cap] = row[1].freq\n",
" nrg_dict[cl][\"core\"][\"busy-cost\"][row[1].cap] = int(row[1].energy)\n",
"\n",
" # IDLE costs\n",
" wfi_nrg = idle_stats.loc[cl].energy[metric][0]\n",
" # WFI\n",
" nrg_dict[cl][\"core\"][\"idle-cost\"][0] = int(wfi_nrg)\n",
" # All remaining states are zeroes\n",
" for i in xrange(1, n_states):\n",
" nrg_dict[cl][\"core\"][\"idle-cost\"][i] = 0\n",
"\n",
" # Cluster COSTS\n",
" cl_data = cluster_cap_nrg_df[cluster_cap_nrg_df.cluster == cl]\n",
" # ACTIVE costs\n",
" for row in cl_data.iterrows():\n",
" nrg_dict[cl][\"cluster\"][\"busy-cost\"][row[1].cap] = int(row[1].energy)\n",
"\n",
" # IDLE costs\n",
" # Core OFF is the first valid idle cost for cluster\n",
" idle_data = idle_stats.loc[cl].energy[metric]\n",
" # WFI (same as Core OFF)\n",
" nrg_dict[cl][\"cluster\"][\"idle-cost\"][0] = int(idle_data[1])\n",
" # All other idle states (from CORE OFF down)\n",
" for i in xrange(1, n_states):\n",
" nrg_dict[cl][\"cluster\"][\"idle-cost\"][i] = int(idle_data[i])\n",
"\n",
" return nrg_dict"
]
},
{
"cell_type": "code",
"execution_count": 794,
"metadata": {
"collapsed": true
},
"outputs": [],
"source": [
"nrg_dict = energy_model_dict(clusters, core_cap_nrg_df, cluster_cap_nrg_df)"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"## Device Tree EM Format"
]
},
{
"cell_type": "code",
"execution_count": 771,
"metadata": {
"collapsed": false
},
"outputs": [],
"source": [
"def dump_device_tree(nrg_dict, outfile='sched-energy.dtsi'):\n",
" \"\"\"\n",
" Generate device tree energy model file.\n",
" \n",
" :param nrg_dict: dictionary describing the energy model\n",
" :type nrg_dict: dict\n",
" \n",
" :param outfile: output file name\n",
" :type outfile: str\n",
" \"\"\"\n",
" with open(os.path.join(te.res_dir, outfile), 'w') as out:\n",
" out.write(\"energy-costs {\\n\")\n",
" idx = 0\n",
" for cl_name in nrg_dict.keys():\n",
" core = nrg_dict[cl_name][\"core\"]\n",
" # Dump Core costs\n",
" out.write(\"\\tCPU_COST_{}: core_cost{} {}\\n\"\\\n",
" .format(core[\"name\"], idx, '{'))\n",
" # ACTIVE costs\n",
" out.write(\"\\t\\tbusy-cost-data = <\\n\")\n",
" for cap, nrg in core[\"busy-cost\"].iteritems():\n",
" out.write(\"\\t\\t\\t{} {}\\n\".format(cap, nrg))\n",
" out.write(\"\\t\\t>;\\n\")\n",
" # IDLE costs\n",
" out.write(\"\\t\\tidle-cost-data = <\\n\")\n",
" # arch idle\n",
" out.write(\"\\t\\t\\t{}\\n\".format(core[\"idle-cost\"][0]))\n",
" for nrg in core[\"idle-cost\"].values():\n",
" out.write(\"\\t\\t\\t{}\\n\".format(nrg)) \n",
" out.write(\"\\t\\t>;\\n\")\n",
" out.write(\"\\t};\\n\")\n",
"\n",
" # Dump Cluster costs\n",
" cl = nrg_dict[cl_name][\"cluster\"]\n",
" out.write(\"\\tCLUSTER_COST_{}: cluster_cost{} {}\\n\"\\\n",
" .format(cl_name, idx, '{'))\n",
" # ACTIVE costs\n",
" out.write(\"\\t\\tbusy-cost-data = <\\n\")\n",
" for cap, nrg in cl[\"busy-cost\"].iteritems():\n",
" out.write(\"\\t\\t\\t{} {}\\n\".format(cap, nrg))\n",
" out.write(\"\\t\\t>;\\n\")\n",
" # IDLE costs\n",
" out.write(\"\\t\\tidle-cost-data = <\\n\")\n",
" # arch idle\n",
" out.write(\"\\t\\t\\t{}\\n\".format(cl[\"idle-cost\"][0]))\n",
" for nrg in cl[\"idle-cost\"].values():\n",
" out.write(\"\\t\\t\\t{}\\n\".format(nrg))\n",
" out.write(\"\\t\\t>;\\n\")\n",
" out.write(\"\\t};\\n\")\n",
" idx += 1\n",
" out.write(\"};\")"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"## C Code EM Format"
]
},
{
"cell_type": "code",
"execution_count": 777,
"metadata": {
"collapsed": false
},
"outputs": [],
"source": [
"def dump_c_code(nrg_dict, cluster_ids, outfile='energy_model.c'):\n",
" \"\"\"\n",
" Generate C code energy model file.\n",
" \n",
" :param nrg_dict: dictionary describing the energy model\n",
" :type nrg_dict: dict\n",
" \n",
" :param cluster_ids: mapping between cluster names and cluster IDs\n",
" :type cluster_ids: dict\n",
" \n",
" :param outfile: output file name\n",
" :type outfile: str\n",
" \"\"\"\n",
" with open(os.path.join(te.res_dir, outfile), 'w') as o:\n",
"\n",
" core_names = []\n",
" for cl_name in nrg_dict.keys():\n",
" # Dump Core data\n",
" core = nrg_dict[cl_name][\"core\"]\n",
" core_names.append(core[\"name\"])\n",
" o.write(\"static struct capacity_state cap_states_core_{}[] = {}\\n\"\\\n",
" .format(core[\"name\"], '{'))\n",
" o.write(\"\\t/* Power per CPU */\\n\")\n",
" for cap, nrg in core[\"busy-cost\"].iteritems():\n",
" o.write(\"\\t {{ .cap = {:5d}, .power = {:5d}, }},\\n\"\\\n",
" .format(cap, nrg))\n",
" o.write(\"\\t};\\n\")\n",
"\n",
" o.write(\"\\n\")\n",
"\n",
" o.write(\"static struct idle_state idle_states_core_{}[] = {}\\n\"\\\n",
" .format(core[\"name\"], '{'))\n",
" # arch idle (same as WFI)\n",
" o.write(\"\\t {{ .power = {:5d}, }},\\n\".format(core[\"idle-cost\"][0]))\n",
" for nrg in core[\"idle-cost\"].values():\n",
" o.write(\"\\t {{ .power = {:5d}, }},\\n\".format(nrg))\n",
" o.write(\"\\t};\\n\")\n",
"\n",
" o.write(\"\\n\")\n",
"\n",
" # Dump Cluster data\n",
" cl = nrg_dict[cl_name][\"cluster\"]\n",
" o.write(\"static struct capacity_state cap_states_cluster_{}[] = {}\\n\"\\\n",
" .format(cl_name, '{'))\n",
" o.write(\"\\t/* Power per cluster */\\n\")\n",
" for cap, nrg in cl[\"busy-cost\"].iteritems():\n",
" o.write(\"\\t {{ .cap = {:5d}, .power = {:5d}, }},\\n\"\\\n",
" .format(cap, nrg))\n",
" o.write(\"\\t};\\n\")\n",
"\n",
" o.write(\"\\n\")\n",
"\n",
" o.write(\"static struct idle_state idle_states_cluster_{}[] = {}\\n\"\\\n",
" .format(cl_name, '{'))\n",
" # arch idle (same as Core OFF)\n",
" o.write(\"\\t {{ .power = {:5d}, }},\\n\".format(cl[\"idle-cost\"][0]))\n",
" for nrg in cl[\"idle-cost\"].values():\n",
" o.write(\"\\t {{ .power = {:5d}, }},\\n\".format(nrg))\n",
" o.write(\"\\t};\\n\")\n",
"\n",
" o.write(\"\\n\")\n",
"\n",
" o.write(\"static struct sched_group_energy energy_cluster_{} = {}\\n\"\\\n",
" .format(core[\"name\"], '{'))\n",
" o.write(\"\\t.nr_idle_states = ARRAY_SIZE(idle_states_cluster_{}),\\n\"\\\n",
" .format(core[\"name\"]))\n",
" o.write(\"\\t.idle_states = idle_states_cluster_{},\\n\"\\\n",
" .format(core[\"name\"]))\n",
" o.write(\"\\t.nr_cap_states = ARRAY_SIZE(cap_states_cluster_{}),\\n\"\\\n",
" .format(core[\"name\"]))\n",
" o.write(\"\\t.cap_states = cap_states_cluster_{},\\n\"\\\n",
" .format(core[\"name\"]))\n",
" o.write(\"};\\n\")\n",
"\n",
" o.write(\"\\n\")\n",
"\n",
" # Array of pointers to CORE sched_group_energy structs\n",
" o.write(\"static struct sched_group_energy *energy_cores[] = {\\n\")\n",
" for cl_name in cluster_ids.values():\n",
" o.write(\"\\t&energy_core_{},\\n\"\\\n",
" .format(nrg_dict[cl_name][\"core\"][\"name\"]))\n",
" o.write(\"};\\n\")\n",
"\n",
" o.write(\"\\n\")\n",
"\n",
" # Array of pointers to CLUSTER sched_group_energy structs\n",
" o.write(\"static struct sched_group_energy *energy_clusters[] = {\\n\")\n",
" for name in cluster_ids.values():\n",
" o.write(\"\\t&energy_cluster_{},\\n\".format(name))\n",
" o.write(\"};\\n\")\n",
"\n",
" o.write(\"\\n\")\n",
"\n",
" o.write(\"static inline\\n\")\n",
" o.write(\"const struct sched_group_energy * const cpu_core_energy(int cpu)\\n\")\n",
" o.write(\"{\\n\")\n",
" o.write(\"\\treturn energy_cores[cpu_topology[cpu].cluster_id];\\n\")\n",
" o.write(\"}\\n\")\n",
"\n",
" o.write(\"\\n\")\n",
"\n",
" o.write(\"static inline\\n\")\n",
" o.write(\"const struct sched_group_energy * const cpu_cluster_energy(int cpu)\\n\")\n",
" o.write(\"{\\n\")\n",
" o.write(\"\\treturn energy_clusters[cpu_topology[cpu].cluster_id];\\n\")\n",
" o.write(\"}\\n\")"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"## JSON EM Format"
]
},
{
"cell_type": "code",
"execution_count": 14,
"metadata": {
"collapsed": false
},
"outputs": [],
"source": [
"def dump_json(nrg_dict, outfile='energy_model.json'):\n",
" \"\"\"\n",
" Generate JSON energy model file.\n",
" \n",
" :param nrg_dict: dictionary describing the energy model\n",
" :type nrg_dict: dict\n",
" \n",
" :param outfile: output file name\n",
" :type outfile: str\n",
" \"\"\"\n",
" with open(os.path.join(te.res_dir, outfile), 'w') as ofile:\n",
" json.dump(nrg_dict, ofile, sort_keys=True, indent=4)"
]
}
],
"metadata": {
"kernelspec": {
"display_name": "Python 2",
"language": "python",
"name": "python2"
},
"language_info": {
"codemirror_mode": {
"name": "ipython",
"version": 2
},
"file_extension": ".py",
"mimetype": "text/x-python",
"name": "python",
"nbconvert_exporter": "python",
"pygments_lexer": "ipython2",
"version": "2.7.9"
},
"toc": {
"toc_cell": false,
"toc_number_sections": true,
"toc_threshold": 6,
"toc_window_display": true
}
},
"nbformat": 4,
"nbformat_minor": 0
}