report.py revision 0f8ac68fcd4e514ae6ee32a6496bd239fb9c03a
10f8ac68fcd4e514ae6ee32a6496bd239fb9c03aPatrick Bellasi#!/usr/bin/python
20f8ac68fcd4e514ae6ee32a6496bd239fb9c03aPatrick Bellasi
30f8ac68fcd4e514ae6ee32a6496bd239fb9c03aPatrick Bellasiimport argparse
40f8ac68fcd4e514ae6ee32a6496bd239fb9c03aPatrick Bellasiimport fnmatch as fnm
50f8ac68fcd4e514ae6ee32a6496bd239fb9c03aPatrick Bellasiimport json
60f8ac68fcd4e514ae6ee32a6496bd239fb9c03aPatrick Bellasiimport math
70f8ac68fcd4e514ae6ee32a6496bd239fb9c03aPatrick Bellasiimport numpy as np
80f8ac68fcd4e514ae6ee32a6496bd239fb9c03aPatrick Bellasiimport os
90f8ac68fcd4e514ae6ee32a6496bd239fb9c03aPatrick Bellasiimport re
100f8ac68fcd4e514ae6ee32a6496bd239fb9c03aPatrick Bellasiimport sys
110f8ac68fcd4e514ae6ee32a6496bd239fb9c03aPatrick Bellasi
120f8ac68fcd4e514ae6ee32a6496bd239fb9c03aPatrick Bellasifrom collections import defaultdict
130f8ac68fcd4e514ae6ee32a6496bd239fb9c03aPatrick Bellasifrom colors import TestColors
140f8ac68fcd4e514ae6ee32a6496bd239fb9c03aPatrick Bellasi
150f8ac68fcd4e514ae6ee32a6496bd239fb9c03aPatrick Bellasi# Configure logging
160f8ac68fcd4e514ae6ee32a6496bd239fb9c03aPatrick Bellasiimport logging
170f8ac68fcd4e514ae6ee32a6496bd239fb9c03aPatrick Bellasireload(logging)
180f8ac68fcd4e514ae6ee32a6496bd239fb9c03aPatrick Bellasilogging.basicConfig(
190f8ac68fcd4e514ae6ee32a6496bd239fb9c03aPatrick Bellasi    format='%(asctime)-9s %(levelname)-8s: %(message)s',
200f8ac68fcd4e514ae6ee32a6496bd239fb9c03aPatrick Bellasi    # level=logging.DEBUG,
210f8ac68fcd4e514ae6ee32a6496bd239fb9c03aPatrick Bellasi    level=logging.INFO,
220f8ac68fcd4e514ae6ee32a6496bd239fb9c03aPatrick Bellasi    datefmt='%I:%M:%S')
230f8ac68fcd4e514ae6ee32a6496bd239fb9c03aPatrick Bellasi
240f8ac68fcd4e514ae6ee32a6496bd239fb9c03aPatrick Bellasi# By default compare all the possible combinations
250f8ac68fcd4e514ae6ee32a6496bd239fb9c03aPatrick BellasiDEFAULT_COMPARE = [(r'.*', r'.*')]
260f8ac68fcd4e514ae6ee32a6496bd239fb9c03aPatrick Bellasi
270f8ac68fcd4e514ae6ee32a6496bd239fb9c03aPatrick Bellasiclass Results(object):
280f8ac68fcd4e514ae6ee32a6496bd239fb9c03aPatrick Bellasi
290f8ac68fcd4e514ae6ee32a6496bd239fb9c03aPatrick Bellasi    def __init__(self, results_dir, verbose=False):
300f8ac68fcd4e514ae6ee32a6496bd239fb9c03aPatrick Bellasi
310f8ac68fcd4e514ae6ee32a6496bd239fb9c03aPatrick Bellasi        self.results_dir = results_dir
320f8ac68fcd4e514ae6ee32a6496bd239fb9c03aPatrick Bellasi        self.verbose = verbose
330f8ac68fcd4e514ae6ee32a6496bd239fb9c03aPatrick Bellasi
340f8ac68fcd4e514ae6ee32a6496bd239fb9c03aPatrick Bellasi        self.results = {}
350f8ac68fcd4e514ae6ee32a6496bd239fb9c03aPatrick Bellasi        self.results_json = results_dir + '/results.json'
360f8ac68fcd4e514ae6ee32a6496bd239fb9c03aPatrick Bellasi        self.verbose = verbose
370f8ac68fcd4e514ae6ee32a6496bd239fb9c03aPatrick Bellasi
380f8ac68fcd4e514ae6ee32a6496bd239fb9c03aPatrick Bellasi        self.compare = []
390f8ac68fcd4e514ae6ee32a6496bd239fb9c03aPatrick Bellasi
400f8ac68fcd4e514ae6ee32a6496bd239fb9c03aPatrick Bellasi        # Load results from file (if already parsed)
410f8ac68fcd4e514ae6ee32a6496bd239fb9c03aPatrick Bellasi        if os.path.isfile(self.results_json):
420f8ac68fcd4e514ae6ee32a6496bd239fb9c03aPatrick Bellasi            logging.info('%14s - Load results from [%s]...',
430f8ac68fcd4e514ae6ee32a6496bd239fb9c03aPatrick Bellasi                    'Results', self.results_json)
440f8ac68fcd4e514ae6ee32a6496bd239fb9c03aPatrick Bellasi            with open(self.results_json) as infile:
450f8ac68fcd4e514ae6ee32a6496bd239fb9c03aPatrick Bellasi               self.results = json.load(infile)
460f8ac68fcd4e514ae6ee32a6496bd239fb9c03aPatrick Bellasi            return
470f8ac68fcd4e514ae6ee32a6496bd239fb9c03aPatrick Bellasi
480f8ac68fcd4e514ae6ee32a6496bd239fb9c03aPatrick Bellasi        # Parse results folder
490f8ac68fcd4e514ae6ee32a6496bd239fb9c03aPatrick Bellasi        self.parse()
500f8ac68fcd4e514ae6ee32a6496bd239fb9c03aPatrick Bellasi
510f8ac68fcd4e514ae6ee32a6496bd239fb9c03aPatrick Bellasi    ############################################################################
520f8ac68fcd4e514ae6ee32a6496bd239fb9c03aPatrick Bellasi    # Results Parsing
530f8ac68fcd4e514ae6ee32a6496bd239fb9c03aPatrick Bellasi    ############################################################################
540f8ac68fcd4e514ae6ee32a6496bd239fb9c03aPatrick Bellasi
550f8ac68fcd4e514ae6ee32a6496bd239fb9c03aPatrick Bellasi
560f8ac68fcd4e514ae6ee32a6496bd239fb9c03aPatrick Bellasi    def parse(self):
570f8ac68fcd4e514ae6ee32a6496bd239fb9c03aPatrick Bellasi
580f8ac68fcd4e514ae6ee32a6496bd239fb9c03aPatrick Bellasi        self.base_wls = defaultdict(list)
590f8ac68fcd4e514ae6ee32a6496bd239fb9c03aPatrick Bellasi        self.test_wls = defaultdict(list)
600f8ac68fcd4e514ae6ee32a6496bd239fb9c03aPatrick Bellasi
610f8ac68fcd4e514ae6ee32a6496bd239fb9c03aPatrick Bellasi        logging.info('%14s - Loading energy/perf data...', 'Parser')
620f8ac68fcd4e514ae6ee32a6496bd239fb9c03aPatrick Bellasi
630f8ac68fcd4e514ae6ee32a6496bd239fb9c03aPatrick Bellasi        for test_idx in sorted(os.listdir(self.results_dir)):
640f8ac68fcd4e514ae6ee32a6496bd239fb9c03aPatrick Bellasi
650f8ac68fcd4e514ae6ee32a6496bd239fb9c03aPatrick Bellasi            test_dir = self.results_dir + '/' + test_idx
660f8ac68fcd4e514ae6ee32a6496bd239fb9c03aPatrick Bellasi            if not os.path.isdir(test_dir):
670f8ac68fcd4e514ae6ee32a6496bd239fb9c03aPatrick Bellasi                continue
680f8ac68fcd4e514ae6ee32a6496bd239fb9c03aPatrick Bellasi
690f8ac68fcd4e514ae6ee32a6496bd239fb9c03aPatrick Bellasi            Test(test_idx, test_dir, self.results)
700f8ac68fcd4e514ae6ee32a6496bd239fb9c03aPatrick Bellasi
710f8ac68fcd4e514ae6ee32a6496bd239fb9c03aPatrick Bellasi        results_json = self.results_dir + '/results.json'
720f8ac68fcd4e514ae6ee32a6496bd239fb9c03aPatrick Bellasi        logging.info('%14s - Dump perf results on JSON file [%s]...',
730f8ac68fcd4e514ae6ee32a6496bd239fb9c03aPatrick Bellasi                'Parser', results_json)
740f8ac68fcd4e514ae6ee32a6496bd239fb9c03aPatrick Bellasi        with open(results_json, 'w') as outfile:
750f8ac68fcd4e514ae6ee32a6496bd239fb9c03aPatrick Bellasi            json.dump(self.results, outfile, indent=4, sort_keys=True)
760f8ac68fcd4e514ae6ee32a6496bd239fb9c03aPatrick Bellasi
770f8ac68fcd4e514ae6ee32a6496bd239fb9c03aPatrick Bellasi
780f8ac68fcd4e514ae6ee32a6496bd239fb9c03aPatrick Bellasi    ############################################################################
790f8ac68fcd4e514ae6ee32a6496bd239fb9c03aPatrick Bellasi    # Results Reporting
800f8ac68fcd4e514ae6ee32a6496bd239fb9c03aPatrick Bellasi    ############################################################################
810f8ac68fcd4e514ae6ee32a6496bd239fb9c03aPatrick Bellasi
820f8ac68fcd4e514ae6ee32a6496bd239fb9c03aPatrick Bellasi    def report(self, compare=None, numbers=False):
830f8ac68fcd4e514ae6ee32a6496bd239fb9c03aPatrick Bellasi
840f8ac68fcd4e514ae6ee32a6496bd239fb9c03aPatrick Bellasi        # Setup configuration comparisons
850f8ac68fcd4e514ae6ee32a6496bd239fb9c03aPatrick Bellasi        if compare is None:
860f8ac68fcd4e514ae6ee32a6496bd239fb9c03aPatrick Bellasi            compare = DEFAULT_COMPARE
870f8ac68fcd4e514ae6ee32a6496bd239fb9c03aPatrick Bellasi            logging.warning('%14s - Comparing all the possible combination',
880f8ac68fcd4e514ae6ee32a6496bd239fb9c03aPatrick Bellasi                    'Results')
890f8ac68fcd4e514ae6ee32a6496bd239fb9c03aPatrick Bellasi        for (base_rexp, test_rexp) in compare:
900f8ac68fcd4e514ae6ee32a6496bd239fb9c03aPatrick Bellasi            base_rexp = re.compile(base_rexp, re.DOTALL)
910f8ac68fcd4e514ae6ee32a6496bd239fb9c03aPatrick Bellasi            test_rexp = re.compile(test_rexp, re.DOTALL)
920f8ac68fcd4e514ae6ee32a6496bd239fb9c03aPatrick Bellasi            self.compare.append((base_rexp, test_rexp))
930f8ac68fcd4e514ae6ee32a6496bd239fb9c03aPatrick Bellasi
940f8ac68fcd4e514ae6ee32a6496bd239fb9c03aPatrick Bellasi        if numbers:
950f8ac68fcd4e514ae6ee32a6496bd239fb9c03aPatrick Bellasi            nrg_lable = 'Energy Indexes (Absolute)'
960f8ac68fcd4e514ae6ee32a6496bd239fb9c03aPatrick Bellasi            prf_lable = 'Performance Indexes (Absolute)'
970f8ac68fcd4e514ae6ee32a6496bd239fb9c03aPatrick Bellasi            logging.info('')
980f8ac68fcd4e514ae6ee32a6496bd239fb9c03aPatrick Bellasi            logging.info('%14s - Absolute comparisions:', 'Report')
990f8ac68fcd4e514ae6ee32a6496bd239fb9c03aPatrick Bellasi            print ''
1000f8ac68fcd4e514ae6ee32a6496bd239fb9c03aPatrick Bellasi        else:
1010f8ac68fcd4e514ae6ee32a6496bd239fb9c03aPatrick Bellasi            nrg_lable = 'Energy Indexes (Relative)'
1020f8ac68fcd4e514ae6ee32a6496bd239fb9c03aPatrick Bellasi            prf_lable = 'Performance Indexes (Relative)'
1030f8ac68fcd4e514ae6ee32a6496bd239fb9c03aPatrick Bellasi            logging.info('')
1040f8ac68fcd4e514ae6ee32a6496bd239fb9c03aPatrick Bellasi            logging.info('%14s - Relative comparisions:', 'Report')
1050f8ac68fcd4e514ae6ee32a6496bd239fb9c03aPatrick Bellasi            print ''
1060f8ac68fcd4e514ae6ee32a6496bd239fb9c03aPatrick Bellasi
1070f8ac68fcd4e514ae6ee32a6496bd239fb9c03aPatrick Bellasi        # Dump headers
1080f8ac68fcd4e514ae6ee32a6496bd239fb9c03aPatrick Bellasi
1090f8ac68fcd4e514ae6ee32a6496bd239fb9c03aPatrick Bellasi        print '{:9s}   {:15s} |'\
1100f8ac68fcd4e514ae6ee32a6496bd239fb9c03aPatrick Bellasi                ' {:33s} | {:54s} |'\
1110f8ac68fcd4e514ae6ee32a6496bd239fb9c03aPatrick Bellasi                .format('Test Id', 'Comparision',
1120f8ac68fcd4e514ae6ee32a6496bd239fb9c03aPatrick Bellasi                        nrg_lable, prf_lable)
1130f8ac68fcd4e514ae6ee32a6496bd239fb9c03aPatrick Bellasi        print '{:9s}   {:15s} |'\
1140f8ac68fcd4e514ae6ee32a6496bd239fb9c03aPatrick Bellasi                ' {:>10s} {:>10s} {:>10s}  |'\
1150f8ac68fcd4e514ae6ee32a6496bd239fb9c03aPatrick Bellasi                ' {:>10s} {:>10s} {:>10s} {:>10s} {:>10s} |'\
1160f8ac68fcd4e514ae6ee32a6496bd239fb9c03aPatrick Bellasi                .format('', '',
1170f8ac68fcd4e514ae6ee32a6496bd239fb9c03aPatrick Bellasi                        'LITTLE', 'big', 'Total',
1180f8ac68fcd4e514ae6ee32a6496bd239fb9c03aPatrick Bellasi                        'PerfIndex', 'NegSlacks', 'EDP1', 'EDP2', 'EDP3')
1190f8ac68fcd4e514ae6ee32a6496bd239fb9c03aPatrick Bellasi
1200f8ac68fcd4e514ae6ee32a6496bd239fb9c03aPatrick Bellasi        # For each test
1210f8ac68fcd4e514ae6ee32a6496bd239fb9c03aPatrick Bellasi        for tid in sorted(self.results.keys()):
1220f8ac68fcd4e514ae6ee32a6496bd239fb9c03aPatrick Bellasi            new_test = True
1230f8ac68fcd4e514ae6ee32a6496bd239fb9c03aPatrick Bellasi            # For each configuration...
1240f8ac68fcd4e514ae6ee32a6496bd239fb9c03aPatrick Bellasi            for i, base_idx in enumerate(sorted(self.results[tid].keys())):
1250f8ac68fcd4e514ae6ee32a6496bd239fb9c03aPatrick Bellasi                # Which matches at least on base regexp
1260f8ac68fcd4e514ae6ee32a6496bd239fb9c03aPatrick Bellasi                for (base_rexp, test_rexp) in self.compare:
1270f8ac68fcd4e514ae6ee32a6496bd239fb9c03aPatrick Bellasi                    if not base_rexp.match(base_idx):
1280f8ac68fcd4e514ae6ee32a6496bd239fb9c03aPatrick Bellasi                        continue
1290f8ac68fcd4e514ae6ee32a6496bd239fb9c03aPatrick Bellasi                    # Look for a configuration which matches the test regexp
1300f8ac68fcd4e514ae6ee32a6496bd239fb9c03aPatrick Bellasi                    for test_idx in sorted(self.results[tid].keys())[i+1:]:
1310f8ac68fcd4e514ae6ee32a6496bd239fb9c03aPatrick Bellasi                        if test_idx == base_idx:
1320f8ac68fcd4e514ae6ee32a6496bd239fb9c03aPatrick Bellasi                            continue
1330f8ac68fcd4e514ae6ee32a6496bd239fb9c03aPatrick Bellasi                        if new_test:
1340f8ac68fcd4e514ae6ee32a6496bd239fb9c03aPatrick Bellasi                            print '{:-<28s}+{:-<35s}+{:-<56s}+'.format('','', '')
1350f8ac68fcd4e514ae6ee32a6496bd239fb9c03aPatrick Bellasi                            new_test = False
1360f8ac68fcd4e514ae6ee32a6496bd239fb9c03aPatrick Bellasi                        if not test_rexp.match(test_idx):
1370f8ac68fcd4e514ae6ee32a6496bd239fb9c03aPatrick Bellasi                            continue
1380f8ac68fcd4e514ae6ee32a6496bd239fb9c03aPatrick Bellasi                        self.__compare(tid, base_idx, test_idx, numbers)
1390f8ac68fcd4e514ae6ee32a6496bd239fb9c03aPatrick Bellasi
1400f8ac68fcd4e514ae6ee32a6496bd239fb9c03aPatrick Bellasi        print ''
1410f8ac68fcd4e514ae6ee32a6496bd239fb9c03aPatrick Bellasi        return True
1420f8ac68fcd4e514ae6ee32a6496bd239fb9c03aPatrick Bellasi
1430f8ac68fcd4e514ae6ee32a6496bd239fb9c03aPatrick Bellasi    def __compare(self, tid, base_idx, test_idx, numbers):
1440f8ac68fcd4e514ae6ee32a6496bd239fb9c03aPatrick Bellasi        logging.debug('Test %s: compare %s with %s',
1450f8ac68fcd4e514ae6ee32a6496bd239fb9c03aPatrick Bellasi                tid, base_idx, test_idx)
1460f8ac68fcd4e514ae6ee32a6496bd239fb9c03aPatrick Bellasi        res_comp = '{0:s} vs {1:s}'.format(test_idx, base_idx)
1470f8ac68fcd4e514ae6ee32a6496bd239fb9c03aPatrick Bellasi        res_line = '{0:8s}: {1:15s} | '.format(tid, res_comp)
1480f8ac68fcd4e514ae6ee32a6496bd239fb9c03aPatrick Bellasi
1490f8ac68fcd4e514ae6ee32a6496bd239fb9c03aPatrick Bellasi        # Dump all energy metrics
1500f8ac68fcd4e514ae6ee32a6496bd239fb9c03aPatrick Bellasi        for cpus in ['LITTLE', 'big', 'Total']:
1510f8ac68fcd4e514ae6ee32a6496bd239fb9c03aPatrick Bellasi            res_base = self.results[tid][base_idx]['energy'][cpus]['avg']
1520f8ac68fcd4e514ae6ee32a6496bd239fb9c03aPatrick Bellasi            res_test = self.results[tid][test_idx]['energy'][cpus]['avg']
1530f8ac68fcd4e514ae6ee32a6496bd239fb9c03aPatrick Bellasi            speedup_cnt =  res_test - res_base
1540f8ac68fcd4e514ae6ee32a6496bd239fb9c03aPatrick Bellasi            if numbers:
1550f8ac68fcd4e514ae6ee32a6496bd239fb9c03aPatrick Bellasi                res_line += ' {0:10.2f}'.format(speedup_cnt)
1560f8ac68fcd4e514ae6ee32a6496bd239fb9c03aPatrick Bellasi            else:
1570f8ac68fcd4e514ae6ee32a6496bd239fb9c03aPatrick Bellasi                speedup_pct =  100.0 * speedup_cnt / res_base
1580f8ac68fcd4e514ae6ee32a6496bd239fb9c03aPatrick Bellasi                res_line += ' {0:s}'\
1590f8ac68fcd4e514ae6ee32a6496bd239fb9c03aPatrick Bellasi                        .format(TestColors.rate(
1600f8ac68fcd4e514ae6ee32a6496bd239fb9c03aPatrick Bellasi                            speedup_pct,
1610f8ac68fcd4e514ae6ee32a6496bd239fb9c03aPatrick Bellasi                            positive_is_good = False))
1620f8ac68fcd4e514ae6ee32a6496bd239fb9c03aPatrick Bellasi        res_line += ' |'
1630f8ac68fcd4e514ae6ee32a6496bd239fb9c03aPatrick Bellasi
1640f8ac68fcd4e514ae6ee32a6496bd239fb9c03aPatrick Bellasi        # If available, dump also performance results
1650f8ac68fcd4e514ae6ee32a6496bd239fb9c03aPatrick Bellasi        if 'performance' not in self.results[tid][base_idx].keys():
1660f8ac68fcd4e514ae6ee32a6496bd239fb9c03aPatrick Bellasi            print res_line
1670f8ac68fcd4e514ae6ee32a6496bd239fb9c03aPatrick Bellasi            return
1680f8ac68fcd4e514ae6ee32a6496bd239fb9c03aPatrick Bellasi
1690f8ac68fcd4e514ae6ee32a6496bd239fb9c03aPatrick Bellasi        for pidx in ['perf_avg', 'slack_pct', 'edp1', 'edp2', 'edp3']:
1700f8ac68fcd4e514ae6ee32a6496bd239fb9c03aPatrick Bellasi            res_base = self.results[tid][base_idx]['performance'][pidx]['avg']
1710f8ac68fcd4e514ae6ee32a6496bd239fb9c03aPatrick Bellasi            res_test = self.results[tid][test_idx]['performance'][pidx]['avg']
1720f8ac68fcd4e514ae6ee32a6496bd239fb9c03aPatrick Bellasi
1730f8ac68fcd4e514ae6ee32a6496bd239fb9c03aPatrick Bellasi            logging.debug('idx: %s, base: %s, test: %s',
1740f8ac68fcd4e514ae6ee32a6496bd239fb9c03aPatrick Bellasi                    pidx, res_base, res_test)
1750f8ac68fcd4e514ae6ee32a6496bd239fb9c03aPatrick Bellasi
1760f8ac68fcd4e514ae6ee32a6496bd239fb9c03aPatrick Bellasi            # Compute difference base-vs-test
1770f8ac68fcd4e514ae6ee32a6496bd239fb9c03aPatrick Bellasi            speedup_cnt = 0
1780f8ac68fcd4e514ae6ee32a6496bd239fb9c03aPatrick Bellasi            if res_base != 0:
1790f8ac68fcd4e514ae6ee32a6496bd239fb9c03aPatrick Bellasi                if pidx in ['perf_avg']:
1800f8ac68fcd4e514ae6ee32a6496bd239fb9c03aPatrick Bellasi                    speedup_cnt =  res_test - res_base
1810f8ac68fcd4e514ae6ee32a6496bd239fb9c03aPatrick Bellasi                else:
1820f8ac68fcd4e514ae6ee32a6496bd239fb9c03aPatrick Bellasi                    speedup_cnt =  res_base - res_test
1830f8ac68fcd4e514ae6ee32a6496bd239fb9c03aPatrick Bellasi
1840f8ac68fcd4e514ae6ee32a6496bd239fb9c03aPatrick Bellasi            # Compute speedup if required
1850f8ac68fcd4e514ae6ee32a6496bd239fb9c03aPatrick Bellasi            speedup_pct = 0
1860f8ac68fcd4e514ae6ee32a6496bd239fb9c03aPatrick Bellasi            if numbers:
1870f8ac68fcd4e514ae6ee32a6496bd239fb9c03aPatrick Bellasi                if 'edp' in pidx:
1880f8ac68fcd4e514ae6ee32a6496bd239fb9c03aPatrick Bellasi                    res_line += ' {0:10.2e}'.format(speedup_cnt)
1890f8ac68fcd4e514ae6ee32a6496bd239fb9c03aPatrick Bellasi                else:
1900f8ac68fcd4e514ae6ee32a6496bd239fb9c03aPatrick Bellasi                    res_line += ' {0:10.2f}'.format(speedup_cnt)
1910f8ac68fcd4e514ae6ee32a6496bd239fb9c03aPatrick Bellasi            else:
1920f8ac68fcd4e514ae6ee32a6496bd239fb9c03aPatrick Bellasi                if res_base != 0:
1930f8ac68fcd4e514ae6ee32a6496bd239fb9c03aPatrick Bellasi                    if pidx in ['perf_avg']:
1940f8ac68fcd4e514ae6ee32a6496bd239fb9c03aPatrick Bellasi                        # speedup_pct =  100.0 * speedup_cnt / res_base
1950f8ac68fcd4e514ae6ee32a6496bd239fb9c03aPatrick Bellasi                        speedup_pct =  speedup_cnt
1960f8ac68fcd4e514ae6ee32a6496bd239fb9c03aPatrick Bellasi                    else:
1970f8ac68fcd4e514ae6ee32a6496bd239fb9c03aPatrick Bellasi                        speedup_pct =  100.0 * speedup_cnt / res_base
1980f8ac68fcd4e514ae6ee32a6496bd239fb9c03aPatrick Bellasi                res_line += ' {0:s}'.format(TestColors.rate(speedup_pct))
1990f8ac68fcd4e514ae6ee32a6496bd239fb9c03aPatrick Bellasi        res_line += ' |'
2000f8ac68fcd4e514ae6ee32a6496bd239fb9c03aPatrick Bellasi        print res_line
2010f8ac68fcd4e514ae6ee32a6496bd239fb9c03aPatrick Bellasi
2020f8ac68fcd4e514ae6ee32a6496bd239fb9c03aPatrick Bellasiclass Stats(object):
2030f8ac68fcd4e514ae6ee32a6496bd239fb9c03aPatrick Bellasi
2040f8ac68fcd4e514ae6ee32a6496bd239fb9c03aPatrick Bellasi    def __init__(self, data):
2050f8ac68fcd4e514ae6ee32a6496bd239fb9c03aPatrick Bellasi        self.stats = {}
2060f8ac68fcd4e514ae6ee32a6496bd239fb9c03aPatrick Bellasi        self.stats['count'] = len(data)
2070f8ac68fcd4e514ae6ee32a6496bd239fb9c03aPatrick Bellasi        self.stats['min']   = min(data)
2080f8ac68fcd4e514ae6ee32a6496bd239fb9c03aPatrick Bellasi        self.stats['max']   = max(data)
2090f8ac68fcd4e514ae6ee32a6496bd239fb9c03aPatrick Bellasi        self.stats['avg']   = sum(data)/len(data)
2100f8ac68fcd4e514ae6ee32a6496bd239fb9c03aPatrick Bellasi        std = Stats.stdev(data)
2110f8ac68fcd4e514ae6ee32a6496bd239fb9c03aPatrick Bellasi        c99 = Stats.ci99(data, std)
2120f8ac68fcd4e514ae6ee32a6496bd239fb9c03aPatrick Bellasi        self.stats['std']   = std
2130f8ac68fcd4e514ae6ee32a6496bd239fb9c03aPatrick Bellasi        self.stats['c99']   = c99
2140f8ac68fcd4e514ae6ee32a6496bd239fb9c03aPatrick Bellasi
2150f8ac68fcd4e514ae6ee32a6496bd239fb9c03aPatrick Bellasi    def get(self):
2160f8ac68fcd4e514ae6ee32a6496bd239fb9c03aPatrick Bellasi        return self.stats
2170f8ac68fcd4e514ae6ee32a6496bd239fb9c03aPatrick Bellasi
2180f8ac68fcd4e514ae6ee32a6496bd239fb9c03aPatrick Bellasi    @staticmethod
2190f8ac68fcd4e514ae6ee32a6496bd239fb9c03aPatrick Bellasi    def stdev(values):
2200f8ac68fcd4e514ae6ee32a6496bd239fb9c03aPatrick Bellasi        sum1 = 0
2210f8ac68fcd4e514ae6ee32a6496bd239fb9c03aPatrick Bellasi        sum2 = 0
2220f8ac68fcd4e514ae6ee32a6496bd239fb9c03aPatrick Bellasi        for value in values:
2230f8ac68fcd4e514ae6ee32a6496bd239fb9c03aPatrick Bellasi            sum1 += value
2240f8ac68fcd4e514ae6ee32a6496bd239fb9c03aPatrick Bellasi            sum2 += math.pow(value, 2)
2250f8ac68fcd4e514ae6ee32a6496bd239fb9c03aPatrick Bellasi        # print 'sum1: {}, sum2: {}'.format(sum1, sum2)
2260f8ac68fcd4e514ae6ee32a6496bd239fb9c03aPatrick Bellasi        avg =  sum1 / len(values)
2270f8ac68fcd4e514ae6ee32a6496bd239fb9c03aPatrick Bellasi        var = (sum2 / len(values)) - (avg * avg)
2280f8ac68fcd4e514ae6ee32a6496bd239fb9c03aPatrick Bellasi        # print 'avg: {} var: {}'.format(avg, var)
2290f8ac68fcd4e514ae6ee32a6496bd239fb9c03aPatrick Bellasi        std = math.sqrt(var)
2300f8ac68fcd4e514ae6ee32a6496bd239fb9c03aPatrick Bellasi        return float(std)
2310f8ac68fcd4e514ae6ee32a6496bd239fb9c03aPatrick Bellasi
2320f8ac68fcd4e514ae6ee32a6496bd239fb9c03aPatrick Bellasi    @staticmethod
2330f8ac68fcd4e514ae6ee32a6496bd239fb9c03aPatrick Bellasi    def ci99(values, std):
2340f8ac68fcd4e514ae6ee32a6496bd239fb9c03aPatrick Bellasi        count = len(values)
2350f8ac68fcd4e514ae6ee32a6496bd239fb9c03aPatrick Bellasi        ste = std / math.sqrt(count)
2360f8ac68fcd4e514ae6ee32a6496bd239fb9c03aPatrick Bellasi        c99 = 2.58 * ste
2370f8ac68fcd4e514ae6ee32a6496bd239fb9c03aPatrick Bellasi        return c99
2380f8ac68fcd4e514ae6ee32a6496bd239fb9c03aPatrick Bellasi
2390f8ac68fcd4e514ae6ee32a6496bd239fb9c03aPatrick Bellasi
2400f8ac68fcd4e514ae6ee32a6496bd239fb9c03aPatrick Bellasiclass Test(object):
2410f8ac68fcd4e514ae6ee32a6496bd239fb9c03aPatrick Bellasi
2420f8ac68fcd4e514ae6ee32a6496bd239fb9c03aPatrick Bellasi    def __init__(self, test_idx, test_dir, res):
2430f8ac68fcd4e514ae6ee32a6496bd239fb9c03aPatrick Bellasi        self.test_idx = test_idx
2440f8ac68fcd4e514ae6ee32a6496bd239fb9c03aPatrick Bellasi
2450f8ac68fcd4e514ae6ee32a6496bd239fb9c03aPatrick Bellasi        # Energy measures per each run of the workload
2460f8ac68fcd4e514ae6ee32a6496bd239fb9c03aPatrick Bellasi        little = []
2470f8ac68fcd4e514ae6ee32a6496bd239fb9c03aPatrick Bellasi        total = []
2480f8ac68fcd4e514ae6ee32a6496bd239fb9c03aPatrick Bellasi        big = []
2490f8ac68fcd4e514ae6ee32a6496bd239fb9c03aPatrick Bellasi
2500f8ac68fcd4e514ae6ee32a6496bd239fb9c03aPatrick Bellasi        # Performance measures per each run of the workload
2510f8ac68fcd4e514ae6ee32a6496bd239fb9c03aPatrick Bellasi        slack_pct = []
2520f8ac68fcd4e514ae6ee32a6496bd239fb9c03aPatrick Bellasi        perf_avg = []
2530f8ac68fcd4e514ae6ee32a6496bd239fb9c03aPatrick Bellasi        edp1 = []
2540f8ac68fcd4e514ae6ee32a6496bd239fb9c03aPatrick Bellasi        edp2 = []
2550f8ac68fcd4e514ae6ee32a6496bd239fb9c03aPatrick Bellasi        edp3 = []
2560f8ac68fcd4e514ae6ee32a6496bd239fb9c03aPatrick Bellasi
2570f8ac68fcd4e514ae6ee32a6496bd239fb9c03aPatrick Bellasi        # Create required JSON entries
2580f8ac68fcd4e514ae6ee32a6496bd239fb9c03aPatrick Bellasi        wload_idx = self.wload()
2590f8ac68fcd4e514ae6ee32a6496bd239fb9c03aPatrick Bellasi        if wload_idx not in res.keys():
2600f8ac68fcd4e514ae6ee32a6496bd239fb9c03aPatrick Bellasi            res[wload_idx] = {}
2610f8ac68fcd4e514ae6ee32a6496bd239fb9c03aPatrick Bellasi        conf_idx = self.config()
2620f8ac68fcd4e514ae6ee32a6496bd239fb9c03aPatrick Bellasi        if conf_idx not in res[wload_idx].keys():
2630f8ac68fcd4e514ae6ee32a6496bd239fb9c03aPatrick Bellasi            res[wload_idx][conf_idx] = {}
2640f8ac68fcd4e514ae6ee32a6496bd239fb9c03aPatrick Bellasi
2650f8ac68fcd4e514ae6ee32a6496bd239fb9c03aPatrick Bellasi        logging.debug('%14s - Parse [%s]...', 'Test', test_dir)
2660f8ac68fcd4e514ae6ee32a6496bd239fb9c03aPatrick Bellasi        for run_idx in sorted(os.listdir(test_dir)):
2670f8ac68fcd4e514ae6ee32a6496bd239fb9c03aPatrick Bellasi
2680f8ac68fcd4e514ae6ee32a6496bd239fb9c03aPatrick Bellasi            # Parse test's run results
2690f8ac68fcd4e514ae6ee32a6496bd239fb9c03aPatrick Bellasi            run_dir = test_dir + '/' + run_idx
2700f8ac68fcd4e514ae6ee32a6496bd239fb9c03aPatrick Bellasi            run = Run(run_idx, run_dir)
2710f8ac68fcd4e514ae6ee32a6496bd239fb9c03aPatrick Bellasi
2720f8ac68fcd4e514ae6ee32a6496bd239fb9c03aPatrick Bellasi            # Keep track of average energy of each run
2730f8ac68fcd4e514ae6ee32a6496bd239fb9c03aPatrick Bellasi            little.append(run.little_nrg)
2740f8ac68fcd4e514ae6ee32a6496bd239fb9c03aPatrick Bellasi            total.append(run.total_nrg)
2750f8ac68fcd4e514ae6ee32a6496bd239fb9c03aPatrick Bellasi            big.append(run.big_nrg)
2760f8ac68fcd4e514ae6ee32a6496bd239fb9c03aPatrick Bellasi
2770f8ac68fcd4e514ae6ee32a6496bd239fb9c03aPatrick Bellasi            # Keep track of average performances of each run
2780f8ac68fcd4e514ae6ee32a6496bd239fb9c03aPatrick Bellasi            slack_pct.extend(run.slack_pct)
2790f8ac68fcd4e514ae6ee32a6496bd239fb9c03aPatrick Bellasi            perf_avg.extend(run.perf_avg)
2800f8ac68fcd4e514ae6ee32a6496bd239fb9c03aPatrick Bellasi            edp1.extend(run.edp1)
2810f8ac68fcd4e514ae6ee32a6496bd239fb9c03aPatrick Bellasi            edp2.extend(run.edp2)
2820f8ac68fcd4e514ae6ee32a6496bd239fb9c03aPatrick Bellasi            edp3.extend(run.edp3)
2830f8ac68fcd4e514ae6ee32a6496bd239fb9c03aPatrick Bellasi
2840f8ac68fcd4e514ae6ee32a6496bd239fb9c03aPatrick Bellasi        # Compute energy stats over all run
2850f8ac68fcd4e514ae6ee32a6496bd239fb9c03aPatrick Bellasi        res[wload_idx][conf_idx]['energy'] = {
2860f8ac68fcd4e514ae6ee32a6496bd239fb9c03aPatrick Bellasi                'LITTLE' : Stats(little).get(),
2870f8ac68fcd4e514ae6ee32a6496bd239fb9c03aPatrick Bellasi                'big'    : Stats(big).get(),
2880f8ac68fcd4e514ae6ee32a6496bd239fb9c03aPatrick Bellasi                'Total'  : Stats(total).get()
2890f8ac68fcd4e514ae6ee32a6496bd239fb9c03aPatrick Bellasi        }
2900f8ac68fcd4e514ae6ee32a6496bd239fb9c03aPatrick Bellasi
2910f8ac68fcd4e514ae6ee32a6496bd239fb9c03aPatrick Bellasi        # Compute average performance over all run
2920f8ac68fcd4e514ae6ee32a6496bd239fb9c03aPatrick Bellasi        res[wload_idx][conf_idx]['performance'] = {
2930f8ac68fcd4e514ae6ee32a6496bd239fb9c03aPatrick Bellasi                'slack_pct' : Stats(slack_pct).get(),
2940f8ac68fcd4e514ae6ee32a6496bd239fb9c03aPatrick Bellasi                'perf_avg'  : Stats(perf_avg).get(),
2950f8ac68fcd4e514ae6ee32a6496bd239fb9c03aPatrick Bellasi                'edp1'      : Stats(edp1).get(),
2960f8ac68fcd4e514ae6ee32a6496bd239fb9c03aPatrick Bellasi                'edp2'      : Stats(edp2).get(),
2970f8ac68fcd4e514ae6ee32a6496bd239fb9c03aPatrick Bellasi                'edp3'      : Stats(edp3).get(),
2980f8ac68fcd4e514ae6ee32a6496bd239fb9c03aPatrick Bellasi        }
2990f8ac68fcd4e514ae6ee32a6496bd239fb9c03aPatrick Bellasi
3000f8ac68fcd4e514ae6ee32a6496bd239fb9c03aPatrick Bellasi    def config(self):
3010f8ac68fcd4e514ae6ee32a6496bd239fb9c03aPatrick Bellasi        return self.test_idx.split(':')[0]
3020f8ac68fcd4e514ae6ee32a6496bd239fb9c03aPatrick Bellasi
3030f8ac68fcd4e514ae6ee32a6496bd239fb9c03aPatrick Bellasi    def wload(self):
3040f8ac68fcd4e514ae6ee32a6496bd239fb9c03aPatrick Bellasi        return self.test_idx.split(':')[1]
3050f8ac68fcd4e514ae6ee32a6496bd239fb9c03aPatrick Bellasi
3060f8ac68fcd4e514ae6ee32a6496bd239fb9c03aPatrick Bellasi
3070f8ac68fcd4e514ae6ee32a6496bd239fb9c03aPatrick Bellasiclass Run(object):
3080f8ac68fcd4e514ae6ee32a6496bd239fb9c03aPatrick Bellasi
3090f8ac68fcd4e514ae6ee32a6496bd239fb9c03aPatrick Bellasi    def __init__(self, run_idx, run_dir):
3100f8ac68fcd4e514ae6ee32a6496bd239fb9c03aPatrick Bellasi        self.run_idx = run_idx
3110f8ac68fcd4e514ae6ee32a6496bd239fb9c03aPatrick Bellasi
3120f8ac68fcd4e514ae6ee32a6496bd239fb9c03aPatrick Bellasi        # Set of exposed attibutes
3130f8ac68fcd4e514ae6ee32a6496bd239fb9c03aPatrick Bellasi        self.little_nrg = None
3140f8ac68fcd4e514ae6ee32a6496bd239fb9c03aPatrick Bellasi        self.total_nrg = None
3150f8ac68fcd4e514ae6ee32a6496bd239fb9c03aPatrick Bellasi        self.big_nrg = None
3160f8ac68fcd4e514ae6ee32a6496bd239fb9c03aPatrick Bellasi
3170f8ac68fcd4e514ae6ee32a6496bd239fb9c03aPatrick Bellasi        self.slack_pct = []
3180f8ac68fcd4e514ae6ee32a6496bd239fb9c03aPatrick Bellasi        self.perf_avg = []
3190f8ac68fcd4e514ae6ee32a6496bd239fb9c03aPatrick Bellasi        self.edp1 = []
3200f8ac68fcd4e514ae6ee32a6496bd239fb9c03aPatrick Bellasi        self.edp2 = []
3210f8ac68fcd4e514ae6ee32a6496bd239fb9c03aPatrick Bellasi        self.edp3 = []
3220f8ac68fcd4e514ae6ee32a6496bd239fb9c03aPatrick Bellasi
3230f8ac68fcd4e514ae6ee32a6496bd239fb9c03aPatrick Bellasi        logging.debug('%14s - Parse [%s]...', 'Run', run_dir)
3240f8ac68fcd4e514ae6ee32a6496bd239fb9c03aPatrick Bellasi
3250f8ac68fcd4e514ae6ee32a6496bd239fb9c03aPatrick Bellasi        # Load run's energy results
3260f8ac68fcd4e514ae6ee32a6496bd239fb9c03aPatrick Bellasi        nrg_file = run_dir + '/energy.json'
3270f8ac68fcd4e514ae6ee32a6496bd239fb9c03aPatrick Bellasi        if os.path.isfile(nrg_file):
3280f8ac68fcd4e514ae6ee32a6496bd239fb9c03aPatrick Bellasi            nrg = Energy(nrg_file)
3290f8ac68fcd4e514ae6ee32a6496bd239fb9c03aPatrick Bellasi            self.little_nrg = nrg.little
3300f8ac68fcd4e514ae6ee32a6496bd239fb9c03aPatrick Bellasi            self.total_nrg = nrg.total
3310f8ac68fcd4e514ae6ee32a6496bd239fb9c03aPatrick Bellasi            self.big_nrg = nrg.big
3320f8ac68fcd4e514ae6ee32a6496bd239fb9c03aPatrick Bellasi        else:
3330f8ac68fcd4e514ae6ee32a6496bd239fb9c03aPatrick Bellasi            nrg = None
3340f8ac68fcd4e514ae6ee32a6496bd239fb9c03aPatrick Bellasi
3350f8ac68fcd4e514ae6ee32a6496bd239fb9c03aPatrick Bellasi        # Load run's performance of each task
3360f8ac68fcd4e514ae6ee32a6496bd239fb9c03aPatrick Bellasi        for perf_idx in sorted(os.listdir(run_dir)):
3370f8ac68fcd4e514ae6ee32a6496bd239fb9c03aPatrick Bellasi
3380f8ac68fcd4e514ae6ee32a6496bd239fb9c03aPatrick Bellasi            if not fnm.fnmatch(perf_idx, 'rt-app-*.log'):
3390f8ac68fcd4e514ae6ee32a6496bd239fb9c03aPatrick Bellasi                continue
3400f8ac68fcd4e514ae6ee32a6496bd239fb9c03aPatrick Bellasi
3410f8ac68fcd4e514ae6ee32a6496bd239fb9c03aPatrick Bellasi            # Parse run's performance results
3420f8ac68fcd4e514ae6ee32a6496bd239fb9c03aPatrick Bellasi            prf_file = run_dir + '/' + perf_idx
3430f8ac68fcd4e514ae6ee32a6496bd239fb9c03aPatrick Bellasi            prf = Perf(prf_file, nrg)
3440f8ac68fcd4e514ae6ee32a6496bd239fb9c03aPatrick Bellasi
3450f8ac68fcd4e514ae6ee32a6496bd239fb9c03aPatrick Bellasi            # Keep track of average performances of each task
3460f8ac68fcd4e514ae6ee32a6496bd239fb9c03aPatrick Bellasi            self.slack_pct.append(prf.slack_pct)
3470f8ac68fcd4e514ae6ee32a6496bd239fb9c03aPatrick Bellasi            self.perf_avg.append(prf.perf_avg)
3480f8ac68fcd4e514ae6ee32a6496bd239fb9c03aPatrick Bellasi            self.edp1.append(prf.edp1)
3490f8ac68fcd4e514ae6ee32a6496bd239fb9c03aPatrick Bellasi            self.edp2.append(prf.edp2)
3500f8ac68fcd4e514ae6ee32a6496bd239fb9c03aPatrick Bellasi            self.edp3.append(prf.edp3)
3510f8ac68fcd4e514ae6ee32a6496bd239fb9c03aPatrick Bellasi
3520f8ac68fcd4e514ae6ee32a6496bd239fb9c03aPatrick Bellasiclass Energy(object):
3530f8ac68fcd4e514ae6ee32a6496bd239fb9c03aPatrick Bellasi
3540f8ac68fcd4e514ae6ee32a6496bd239fb9c03aPatrick Bellasi    def __init__(self, nrg_file):
3550f8ac68fcd4e514ae6ee32a6496bd239fb9c03aPatrick Bellasi
3560f8ac68fcd4e514ae6ee32a6496bd239fb9c03aPatrick Bellasi        # Set of exposed attributes
3570f8ac68fcd4e514ae6ee32a6496bd239fb9c03aPatrick Bellasi        self.little = None
3580f8ac68fcd4e514ae6ee32a6496bd239fb9c03aPatrick Bellasi        self.big = None
3590f8ac68fcd4e514ae6ee32a6496bd239fb9c03aPatrick Bellasi        self.total = None
3600f8ac68fcd4e514ae6ee32a6496bd239fb9c03aPatrick Bellasi
3610f8ac68fcd4e514ae6ee32a6496bd239fb9c03aPatrick Bellasi        logging.debug('%14s - Parse [%s]...', 'Energy', nrg_file)
3620f8ac68fcd4e514ae6ee32a6496bd239fb9c03aPatrick Bellasi
3630f8ac68fcd4e514ae6ee32a6496bd239fb9c03aPatrick Bellasi        with open(nrg_file, 'r') as infile:
3640f8ac68fcd4e514ae6ee32a6496bd239fb9c03aPatrick Bellasi            nrg = json.load(infile)
3650f8ac68fcd4e514ae6ee32a6496bd239fb9c03aPatrick Bellasi
3660f8ac68fcd4e514ae6ee32a6496bd239fb9c03aPatrick Bellasi        self.little = float(nrg['LITTLE'])
3670f8ac68fcd4e514ae6ee32a6496bd239fb9c03aPatrick Bellasi        self.big = float(nrg['big'])
3680f8ac68fcd4e514ae6ee32a6496bd239fb9c03aPatrick Bellasi        self.total = self.little + self.big
3690f8ac68fcd4e514ae6ee32a6496bd239fb9c03aPatrick Bellasi
3700f8ac68fcd4e514ae6ee32a6496bd239fb9c03aPatrick Bellasi        logging.debug('%14s - Energy LITTLE [%s], big [%s], Total [%s]',
3710f8ac68fcd4e514ae6ee32a6496bd239fb9c03aPatrick Bellasi                'Energy', self.little, self.big, self.total)
3720f8ac68fcd4e514ae6ee32a6496bd239fb9c03aPatrick Bellasi
3730f8ac68fcd4e514ae6ee32a6496bd239fb9c03aPatrick Bellasiclass Perf(object):
3740f8ac68fcd4e514ae6ee32a6496bd239fb9c03aPatrick Bellasi
3750f8ac68fcd4e514ae6ee32a6496bd239fb9c03aPatrick Bellasi    def __init__(self, perf_file, nrg):
3760f8ac68fcd4e514ae6ee32a6496bd239fb9c03aPatrick Bellasi
3770f8ac68fcd4e514ae6ee32a6496bd239fb9c03aPatrick Bellasi        # Set of exposed attibutes
3780f8ac68fcd4e514ae6ee32a6496bd239fb9c03aPatrick Bellasi        self.perf_avg = None
3790f8ac68fcd4e514ae6ee32a6496bd239fb9c03aPatrick Bellasi        self.perf_std = None
3800f8ac68fcd4e514ae6ee32a6496bd239fb9c03aPatrick Bellasi        self.run_sum = None
3810f8ac68fcd4e514ae6ee32a6496bd239fb9c03aPatrick Bellasi        self.slack_sum = None
3820f8ac68fcd4e514ae6ee32a6496bd239fb9c03aPatrick Bellasi        self.slack_pct = None
3830f8ac68fcd4e514ae6ee32a6496bd239fb9c03aPatrick Bellasi        self.edp1 = None
3840f8ac68fcd4e514ae6ee32a6496bd239fb9c03aPatrick Bellasi        self.edp2 = None
3850f8ac68fcd4e514ae6ee32a6496bd239fb9c03aPatrick Bellasi        self.edp3 = None
3860f8ac68fcd4e514ae6ee32a6496bd239fb9c03aPatrick Bellasi
3870f8ac68fcd4e514ae6ee32a6496bd239fb9c03aPatrick Bellasi        logging.debug('%14s - Parse [%s]...', 'Perf', perf_file)
3880f8ac68fcd4e514ae6ee32a6496bd239fb9c03aPatrick Bellasi
3890f8ac68fcd4e514ae6ee32a6496bd239fb9c03aPatrick Bellasi        # Load performance data for each RT-App task
3900f8ac68fcd4e514ae6ee32a6496bd239fb9c03aPatrick Bellasi        self.name = perf_file.split('-')[-2]
3910f8ac68fcd4e514ae6ee32a6496bd239fb9c03aPatrick Bellasi        self.data = np.loadtxt(perf_file, comments='#', unpack=False)
3920f8ac68fcd4e514ae6ee32a6496bd239fb9c03aPatrick Bellasi
3930f8ac68fcd4e514ae6ee32a6496bd239fb9c03aPatrick Bellasi        # Max Slack (i.e. configured/expected slack): period - run
3940f8ac68fcd4e514ae6ee32a6496bd239fb9c03aPatrick Bellasi        self.max_slack = np.subtract(
3950f8ac68fcd4e514ae6ee32a6496bd239fb9c03aPatrick Bellasi                self.data[:,RTAPP_COL_PERIOD], self.data[:,RTAPP_COL_RUN])
3960f8ac68fcd4e514ae6ee32a6496bd239fb9c03aPatrick Bellasi
3970f8ac68fcd4e514ae6ee32a6496bd239fb9c03aPatrick Bellasi        # Performance Index: 100 * slack / max_slack
3980f8ac68fcd4e514ae6ee32a6496bd239fb9c03aPatrick Bellasi        perf = np.divide(self.data[:,RTAPP_COL_SLACK], self.max_slack)
3990f8ac68fcd4e514ae6ee32a6496bd239fb9c03aPatrick Bellasi        perf = np.multiply(perf, 100)
4000f8ac68fcd4e514ae6ee32a6496bd239fb9c03aPatrick Bellasi        self.perf_avg = np.mean(perf)
4010f8ac68fcd4e514ae6ee32a6496bd239fb9c03aPatrick Bellasi        self.perf_std  = np.std(perf)
4020f8ac68fcd4e514ae6ee32a6496bd239fb9c03aPatrick Bellasi        # logging.debug('perf [%s]: %6.2f,%6.2f',
4030f8ac68fcd4e514ae6ee32a6496bd239fb9c03aPatrick Bellasi        #                 self.name, self.perf_mean, self.perf_std)
4040f8ac68fcd4e514ae6ee32a6496bd239fb9c03aPatrick Bellasi
4050f8ac68fcd4e514ae6ee32a6496bd239fb9c03aPatrick Bellasi        # Negative slacks
4060f8ac68fcd4e514ae6ee32a6496bd239fb9c03aPatrick Bellasi        slacks = self.data[:,RTAPP_COL_SLACK]
4070f8ac68fcd4e514ae6ee32a6496bd239fb9c03aPatrick Bellasi        slacks = slacks[slacks < 0]
4080f8ac68fcd4e514ae6ee32a6496bd239fb9c03aPatrick Bellasi        # logging.debug('Negative Slacks: %s', self.slacks)
4090f8ac68fcd4e514ae6ee32a6496bd239fb9c03aPatrick Bellasi        self.slack_sum = slacks.sum()
4100f8ac68fcd4e514ae6ee32a6496bd239fb9c03aPatrick Bellasi        # logging.debug('slack [%s]: %6.2f', self.name, self.slack_sum)
4110f8ac68fcd4e514ae6ee32a6496bd239fb9c03aPatrick Bellasi
4120f8ac68fcd4e514ae6ee32a6496bd239fb9c03aPatrick Bellasi        # Slack over run-time
4130f8ac68fcd4e514ae6ee32a6496bd239fb9c03aPatrick Bellasi        self.run_sum = np.sum(self.data[:,RTAPP_COL_RUN])
4140f8ac68fcd4e514ae6ee32a6496bd239fb9c03aPatrick Bellasi        self.slack_pct = 100 * self.slack_sum / self.run_sum
4150f8ac68fcd4e514ae6ee32a6496bd239fb9c03aPatrick Bellasi        # logging.debug('SlackPct [%s]: %6.2f %%', self.name, self.slack_pct)
4160f8ac68fcd4e514ae6ee32a6496bd239fb9c03aPatrick Bellasi
4170f8ac68fcd4e514ae6ee32a6496bd239fb9c03aPatrick Bellasi        if nrg is None:
4180f8ac68fcd4e514ae6ee32a6496bd239fb9c03aPatrick Bellasi            return
4190f8ac68fcd4e514ae6ee32a6496bd239fb9c03aPatrick Bellasi
4200f8ac68fcd4e514ae6ee32a6496bd239fb9c03aPatrick Bellasi        # Computing EDP
4210f8ac68fcd4e514ae6ee32a6496bd239fb9c03aPatrick Bellasi        self.edp1 = nrg.total * math.pow(self.run_sum, 1)
4220f8ac68fcd4e514ae6ee32a6496bd239fb9c03aPatrick Bellasi        # logging.debug('EDP1 [%s]: {%6.2f}', self.name, self.edp1)
4230f8ac68fcd4e514ae6ee32a6496bd239fb9c03aPatrick Bellasi        self.edp2 = nrg.total * math.pow(self.run_sum, 2)
4240f8ac68fcd4e514ae6ee32a6496bd239fb9c03aPatrick Bellasi        # logging.debug('EDP2 [%s]: %6.2f', self.name, self.edp2)
4250f8ac68fcd4e514ae6ee32a6496bd239fb9c03aPatrick Bellasi        self.edp3 = nrg.total * math.pow(self.run_sum, 3)
4260f8ac68fcd4e514ae6ee32a6496bd239fb9c03aPatrick Bellasi        # logging.debug('EDP3 [%s]: %6.2f', self.name, self.edp3)
4270f8ac68fcd4e514ae6ee32a6496bd239fb9c03aPatrick Bellasi
4280f8ac68fcd4e514ae6ee32a6496bd239fb9c03aPatrick Bellasi
4290f8ac68fcd4e514ae6ee32a6496bd239fb9c03aPatrick Bellasi# Columns of the per-task rt-app log file
4300f8ac68fcd4e514ae6ee32a6496bd239fb9c03aPatrick BellasiRTAPP_COL_IDX = 0
4310f8ac68fcd4e514ae6ee32a6496bd239fb9c03aPatrick BellasiRTAPP_COL_PERF = 1
4320f8ac68fcd4e514ae6ee32a6496bd239fb9c03aPatrick BellasiRTAPP_COL_RUN = 2
4330f8ac68fcd4e514ae6ee32a6496bd239fb9c03aPatrick BellasiRTAPP_COL_PERIOD = 3
4340f8ac68fcd4e514ae6ee32a6496bd239fb9c03aPatrick BellasiRTAPP_COL_START = 4
4350f8ac68fcd4e514ae6ee32a6496bd239fb9c03aPatrick BellasiRTAPP_COL_END = 5
4360f8ac68fcd4e514ae6ee32a6496bd239fb9c03aPatrick BellasiRTAPP_COL_REL_ST = 6
4370f8ac68fcd4e514ae6ee32a6496bd239fb9c03aPatrick BellasiRTAPP_COL_SLACK = 7
4380f8ac68fcd4e514ae6ee32a6496bd239fb9c03aPatrick BellasiRTAPP_COL_C_RUN = 8
4390f8ac68fcd4e514ae6ee32a6496bd239fb9c03aPatrick BellasiRTAPP_COL_C_PERIOD = 9
4400f8ac68fcd4e514ae6ee32a6496bd239fb9c03aPatrick BellasiRTAPP_COL_WU_LAT = 10
4410f8ac68fcd4e514ae6ee32a6496bd239fb9c03aPatrick Bellasi
4420f8ac68fcd4e514ae6ee32a6496bd239fb9c03aPatrick Bellasiif __name__ == '__main__':
4430f8ac68fcd4e514ae6ee32a6496bd239fb9c03aPatrick Bellasi
4440f8ac68fcd4e514ae6ee32a6496bd239fb9c03aPatrick Bellasi    results = Results('.')
4450f8ac68fcd4e514ae6ee32a6496bd239fb9c03aPatrick Bellasi    results.report(numbers=True)
4460f8ac68fcd4e514ae6ee32a6496bd239fb9c03aPatrick Bellasi    results.report(numbers=False)
4470f8ac68fcd4e514ae6ee32a6496bd239fb9c03aPatrick Bellasi
4480f8ac68fcd4e514ae6ee32a6496bd239fb9c03aPatrick Bellasi#vim :set tabstop=4 shiftwidth=4 expandtab
449