1d95e98d88a6cf4347853427dc4ef6fd0222a3881Patrick Bellasi# SPDX-License-Identifier: Apache-2.0
2d95e98d88a6cf4347853427dc4ef6fd0222a3881Patrick Bellasi#
3d95e98d88a6cf4347853427dc4ef6fd0222a3881Patrick Bellasi# Copyright (C) 2015, ARM Limited and contributors.
4d95e98d88a6cf4347853427dc4ef6fd0222a3881Patrick Bellasi#
5d95e98d88a6cf4347853427dc4ef6fd0222a3881Patrick Bellasi# Licensed under the Apache License, Version 2.0 (the "License"); you may
6d95e98d88a6cf4347853427dc4ef6fd0222a3881Patrick Bellasi# not use this file except in compliance with the License.
7d95e98d88a6cf4347853427dc4ef6fd0222a3881Patrick Bellasi# You may obtain a copy of the License at
8d95e98d88a6cf4347853427dc4ef6fd0222a3881Patrick Bellasi#
9d95e98d88a6cf4347853427dc4ef6fd0222a3881Patrick Bellasi# http://www.apache.org/licenses/LICENSE-2.0
10d95e98d88a6cf4347853427dc4ef6fd0222a3881Patrick Bellasi#
11d95e98d88a6cf4347853427dc4ef6fd0222a3881Patrick Bellasi# Unless required by applicable law or agreed to in writing, software
12d95e98d88a6cf4347853427dc4ef6fd0222a3881Patrick Bellasi# distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
13d95e98d88a6cf4347853427dc4ef6fd0222a3881Patrick Bellasi# WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
14d95e98d88a6cf4347853427dc4ef6fd0222a3881Patrick Bellasi# See the License for the specific language governing permissions and
15d95e98d88a6cf4347853427dc4ef6fd0222a3881Patrick Bellasi# limitations under the License.
16d95e98d88a6cf4347853427dc4ef6fd0222a3881Patrick Bellasi#
17d95e98d88a6cf4347853427dc4ef6fd0222a3881Patrick Bellasi
180f8ac68fcd4e514ae6ee32a6496bd239fb9c03aPatrick Bellasi
190f8ac68fcd4e514ae6ee32a6496bd239fb9c03aPatrick Bellasiimport argparse
200f8ac68fcd4e514ae6ee32a6496bd239fb9c03aPatrick Bellasiimport fnmatch as fnm
210f8ac68fcd4e514ae6ee32a6496bd239fb9c03aPatrick Bellasiimport json
220f8ac68fcd4e514ae6ee32a6496bd239fb9c03aPatrick Bellasiimport math
230f8ac68fcd4e514ae6ee32a6496bd239fb9c03aPatrick Bellasiimport numpy as np
240f8ac68fcd4e514ae6ee32a6496bd239fb9c03aPatrick Bellasiimport os
250f8ac68fcd4e514ae6ee32a6496bd239fb9c03aPatrick Bellasiimport re
260f8ac68fcd4e514ae6ee32a6496bd239fb9c03aPatrick Bellasiimport sys
27c278c2343c7f25083a80cb164b6bdc761d50050bPatrick Bellasiimport logging
280f8ac68fcd4e514ae6ee32a6496bd239fb9c03aPatrick Bellasi
290f8ac68fcd4e514ae6ee32a6496bd239fb9c03aPatrick Bellasifrom collections import defaultdict
300f8ac68fcd4e514ae6ee32a6496bd239fb9c03aPatrick Bellasifrom colors import TestColors
31909185f2974e895696b155de92b168b84ea05266Patrick Bellasifrom results import Results
320f8ac68fcd4e514ae6ee32a6496bd239fb9c03aPatrick Bellasi
330f8ac68fcd4e514ae6ee32a6496bd239fb9c03aPatrick Bellasi
340f8ac68fcd4e514ae6ee32a6496bd239fb9c03aPatrick Bellasi# By default compare all the possible combinations
35e3bebfc47781208a03169507b5bae5f22621579bPatrick BellasiDEFAULT_COMPARE = [(r'base_', r'test_')]
360f8ac68fcd4e514ae6ee32a6496bd239fb9c03aPatrick Bellasi
3797f727443b83ef54e3bcdcd167e76cc4e0a59ad1Patrick Bellasiclass Report(object):
380f8ac68fcd4e514ae6ee32a6496bd239fb9c03aPatrick Bellasi
390f8ac68fcd4e514ae6ee32a6496bd239fb9c03aPatrick Bellasi
40a0c6af17b243d7e84a68449eb497fd91d59f1e6fPatrick Bellasi    def __init__(self, results_dir, compare=None, formats=['relative']):
4197f727443b83ef54e3bcdcd167e76cc4e0a59ad1Patrick Bellasi        self.results_json = results_dir + '/results.json'
4297f727443b83ef54e3bcdcd167e76cc4e0a59ad1Patrick Bellasi        self.results = {}
4397f727443b83ef54e3bcdcd167e76cc4e0a59ad1Patrick Bellasi
4497f727443b83ef54e3bcdcd167e76cc4e0a59ad1Patrick Bellasi        self.compare = []
4597f727443b83ef54e3bcdcd167e76cc4e0a59ad1Patrick Bellasi
46c278c2343c7f25083a80cb164b6bdc761d50050bPatrick Bellasi        # Setup logging
47c278c2343c7f25083a80cb164b6bdc761d50050bPatrick Bellasi        self._log = logging.getLogger('Report')
48c278c2343c7f25083a80cb164b6bdc761d50050bPatrick Bellasi
4997f727443b83ef54e3bcdcd167e76cc4e0a59ad1Patrick Bellasi        # Parse results (if required)
5097f727443b83ef54e3bcdcd167e76cc4e0a59ad1Patrick Bellasi        if not os.path.isfile(self.results_json):
5197f727443b83ef54e3bcdcd167e76cc4e0a59ad1Patrick Bellasi            Results(results_dir)
5297f727443b83ef54e3bcdcd167e76cc4e0a59ad1Patrick Bellasi
5397f727443b83ef54e3bcdcd167e76cc4e0a59ad1Patrick Bellasi        # Load results from file (if already parsed)
54c278c2343c7f25083a80cb164b6bdc761d50050bPatrick Bellasi        self._log.info('Load results from [%s]...',
55c278c2343c7f25083a80cb164b6bdc761d50050bPatrick Bellasi                       self.results_json)
5697f727443b83ef54e3bcdcd167e76cc4e0a59ad1Patrick Bellasi        with open(self.results_json) as infile:
5797f727443b83ef54e3bcdcd167e76cc4e0a59ad1Patrick Bellasi           self.results = json.load(infile)
580f8ac68fcd4e514ae6ee32a6496bd239fb9c03aPatrick Bellasi
590f8ac68fcd4e514ae6ee32a6496bd239fb9c03aPatrick Bellasi        # Setup configuration comparisons
600f8ac68fcd4e514ae6ee32a6496bd239fb9c03aPatrick Bellasi        if compare is None:
610f8ac68fcd4e514ae6ee32a6496bd239fb9c03aPatrick Bellasi            compare = DEFAULT_COMPARE
62c278c2343c7f25083a80cb164b6bdc761d50050bPatrick Bellasi            self._log.warning('Comparing all the possible combination')
630f8ac68fcd4e514ae6ee32a6496bd239fb9c03aPatrick Bellasi        for (base_rexp, test_rexp) in compare:
64c278c2343c7f25083a80cb164b6bdc761d50050bPatrick Bellasi            self._log.info('Configured regexps for comparisions '
65c278c2343c7f25083a80cb164b6bdc761d50050bPatrick Bellasi                           '(bases , tests): (%s, %s)',
66c278c2343c7f25083a80cb164b6bdc761d50050bPatrick Bellasi                           base_rexp, test_rexp)
670f8ac68fcd4e514ae6ee32a6496bd239fb9c03aPatrick Bellasi            base_rexp = re.compile(base_rexp, re.DOTALL)
680f8ac68fcd4e514ae6ee32a6496bd239fb9c03aPatrick Bellasi            test_rexp = re.compile(test_rexp, re.DOTALL)
690f8ac68fcd4e514ae6ee32a6496bd239fb9c03aPatrick Bellasi            self.compare.append((base_rexp, test_rexp))
700f8ac68fcd4e514ae6ee32a6496bd239fb9c03aPatrick Bellasi
71cc2343c456bfabf56a06f2c93b07df2802913b7bPatrick Bellasi        # Report all supported workload classes
7221756b552403589da5720eb04b85c9bfee83fd22Patrick Bellasi        self.__rtapp_report(formats)
7321756b552403589da5720eb04b85c9bfee83fd22Patrick Bellasi        self.__default_report(formats)
74cc2343c456bfabf56a06f2c93b07df2802913b7bPatrick Bellasi
75cc2343c456bfabf56a06f2c93b07df2802913b7bPatrick Bellasi    ############################### REPORT RTAPP ###############################
76cc2343c456bfabf56a06f2c93b07df2802913b7bPatrick Bellasi
7721756b552403589da5720eb04b85c9bfee83fd22Patrick Bellasi    def __rtapp_report(self, formats):
78cc2343c456bfabf56a06f2c93b07df2802913b7bPatrick Bellasi
79cc2343c456bfabf56a06f2c93b07df2802913b7bPatrick Bellasi        if 'rtapp' not in self.results.keys():
80c278c2343c7f25083a80cb164b6bdc761d50050bPatrick Bellasi            self._log.debug('No RTApp workloads to report')
81cc2343c456bfabf56a06f2c93b07df2802913b7bPatrick Bellasi            return
82cc2343c456bfabf56a06f2c93b07df2802913b7bPatrick Bellasi
83c278c2343c7f25083a80cb164b6bdc761d50050bPatrick Bellasi        self._log.debug('Reporting RTApp workloads')
84cc2343c456bfabf56a06f2c93b07df2802913b7bPatrick Bellasi
85cc2343c456bfabf56a06f2c93b07df2802913b7bPatrick Bellasi        # Setup lables depending on requested report
8621756b552403589da5720eb04b85c9bfee83fd22Patrick Bellasi        if 'absolute' in formats:
870f8ac68fcd4e514ae6ee32a6496bd239fb9c03aPatrick Bellasi            nrg_lable = 'Energy Indexes (Absolute)'
880f8ac68fcd4e514ae6ee32a6496bd239fb9c03aPatrick Bellasi            prf_lable = 'Performance Indexes (Absolute)'
89c278c2343c7f25083a80cb164b6bdc761d50050bPatrick Bellasi            self._log.info('')
90c278c2343c7f25083a80cb164b6bdc761d50050bPatrick Bellasi            self._log.info('Absolute comparisions:')
910f8ac68fcd4e514ae6ee32a6496bd239fb9c03aPatrick Bellasi            print ''
920f8ac68fcd4e514ae6ee32a6496bd239fb9c03aPatrick Bellasi        else:
930f8ac68fcd4e514ae6ee32a6496bd239fb9c03aPatrick Bellasi            nrg_lable = 'Energy Indexes (Relative)'
940f8ac68fcd4e514ae6ee32a6496bd239fb9c03aPatrick Bellasi            prf_lable = 'Performance Indexes (Relative)'
95c278c2343c7f25083a80cb164b6bdc761d50050bPatrick Bellasi            self._log.info('')
96c278c2343c7f25083a80cb164b6bdc761d50050bPatrick Bellasi            self._log.info('Relative comparisions:')
970f8ac68fcd4e514ae6ee32a6496bd239fb9c03aPatrick Bellasi            print ''
980f8ac68fcd4e514ae6ee32a6496bd239fb9c03aPatrick Bellasi
9997f727443b83ef54e3bcdcd167e76cc4e0a59ad1Patrick Bellasi        # Dump headers
1004453a39ca52499a0c59df2d82e800bf9465a5f27Patrick Bellasi        print '{:13s}   {:20s} |'\
1010f8ac68fcd4e514ae6ee32a6496bd239fb9c03aPatrick Bellasi                ' {:33s} | {:54s} |'\
1020f8ac68fcd4e514ae6ee32a6496bd239fb9c03aPatrick Bellasi                .format('Test Id', 'Comparision',
1030f8ac68fcd4e514ae6ee32a6496bd239fb9c03aPatrick Bellasi                        nrg_lable, prf_lable)
1044453a39ca52499a0c59df2d82e800bf9465a5f27Patrick Bellasi        print '{:13s}   {:20s} |'\
1050f8ac68fcd4e514ae6ee32a6496bd239fb9c03aPatrick Bellasi                ' {:>10s} {:>10s} {:>10s}  |'\
1060f8ac68fcd4e514ae6ee32a6496bd239fb9c03aPatrick Bellasi                ' {:>10s} {:>10s} {:>10s} {:>10s} {:>10s} |'\
1070f8ac68fcd4e514ae6ee32a6496bd239fb9c03aPatrick Bellasi                .format('', '',
1080f8ac68fcd4e514ae6ee32a6496bd239fb9c03aPatrick Bellasi                        'LITTLE', 'big', 'Total',
1090f8ac68fcd4e514ae6ee32a6496bd239fb9c03aPatrick Bellasi                        'PerfIndex', 'NegSlacks', 'EDP1', 'EDP2', 'EDP3')
1100f8ac68fcd4e514ae6ee32a6496bd239fb9c03aPatrick Bellasi
1110f8ac68fcd4e514ae6ee32a6496bd239fb9c03aPatrick Bellasi        # For each test
11297f727443b83ef54e3bcdcd167e76cc4e0a59ad1Patrick Bellasi        _results = self.results['rtapp']
11397f727443b83ef54e3bcdcd167e76cc4e0a59ad1Patrick Bellasi        for tid in sorted(_results.keys()):
1140f8ac68fcd4e514ae6ee32a6496bd239fb9c03aPatrick Bellasi            new_test = True
1150f8ac68fcd4e514ae6ee32a6496bd239fb9c03aPatrick Bellasi            # For each configuration...
116e3bebfc47781208a03169507b5bae5f22621579bPatrick Bellasi            for base_idx in sorted(_results[tid].keys()):
1170f8ac68fcd4e514ae6ee32a6496bd239fb9c03aPatrick Bellasi                # Which matches at least on base regexp
1180f8ac68fcd4e514ae6ee32a6496bd239fb9c03aPatrick Bellasi                for (base_rexp, test_rexp) in self.compare:
1190f8ac68fcd4e514ae6ee32a6496bd239fb9c03aPatrick Bellasi                    if not base_rexp.match(base_idx):
1200f8ac68fcd4e514ae6ee32a6496bd239fb9c03aPatrick Bellasi                        continue
1210f8ac68fcd4e514ae6ee32a6496bd239fb9c03aPatrick Bellasi                    # Look for a configuration which matches the test regexp
122e3bebfc47781208a03169507b5bae5f22621579bPatrick Bellasi                    for test_idx in sorted(_results[tid].keys()):
1230f8ac68fcd4e514ae6ee32a6496bd239fb9c03aPatrick Bellasi                        if test_idx == base_idx:
1240f8ac68fcd4e514ae6ee32a6496bd239fb9c03aPatrick Bellasi                            continue
1250f8ac68fcd4e514ae6ee32a6496bd239fb9c03aPatrick Bellasi                        if new_test:
1264453a39ca52499a0c59df2d82e800bf9465a5f27Patrick Bellasi                            print '{:-<37s}+{:-<35s}+{:-<56s}+'\
12797f727443b83ef54e3bcdcd167e76cc4e0a59ad1Patrick Bellasi                                    .format('','', '')
128a0c6af17b243d7e84a68449eb497fd91d59f1e6fPatrick Bellasi                            self.__rtapp_reference(tid, base_idx)
1290f8ac68fcd4e514ae6ee32a6496bd239fb9c03aPatrick Bellasi                            new_test = False
130e3bebfc47781208a03169507b5bae5f22621579bPatrick Bellasi                        if test_rexp.match(test_idx) == None:
1310f8ac68fcd4e514ae6ee32a6496bd239fb9c03aPatrick Bellasi                            continue
13221756b552403589da5720eb04b85c9bfee83fd22Patrick Bellasi                        self.__rtapp_compare(tid, base_idx, test_idx, formats)
1330f8ac68fcd4e514ae6ee32a6496bd239fb9c03aPatrick Bellasi
1340f8ac68fcd4e514ae6ee32a6496bd239fb9c03aPatrick Bellasi        print ''
1350f8ac68fcd4e514ae6ee32a6496bd239fb9c03aPatrick Bellasi
136a0c6af17b243d7e84a68449eb497fd91d59f1e6fPatrick Bellasi    def __rtapp_reference(self, tid, base_idx):
137a0c6af17b243d7e84a68449eb497fd91d59f1e6fPatrick Bellasi        _results = self.results['rtapp']
138a0c6af17b243d7e84a68449eb497fd91d59f1e6fPatrick Bellasi
139c278c2343c7f25083a80cb164b6bdc761d50050bPatrick Bellasi        self._log.debug('Test %s: compare against [%s] base',
140c278c2343c7f25083a80cb164b6bdc761d50050bPatrick Bellasi                        tid, base_idx)
1414453a39ca52499a0c59df2d82e800bf9465a5f27Patrick Bellasi        res_line = '{0:12s}: {1:22s} | '.format(tid, base_idx)
142a0c6af17b243d7e84a68449eb497fd91d59f1e6fPatrick Bellasi
143a0c6af17b243d7e84a68449eb497fd91d59f1e6fPatrick Bellasi        # Dump all energy metrics
144a0c6af17b243d7e84a68449eb497fd91d59f1e6fPatrick Bellasi        for cpus in ['LITTLE', 'big', 'Total']:
145a0c6af17b243d7e84a68449eb497fd91d59f1e6fPatrick Bellasi            res_base = _results[tid][base_idx]['energy'][cpus]['avg']
146a0c6af17b243d7e84a68449eb497fd91d59f1e6fPatrick Bellasi            # Dump absolute values
147a0c6af17b243d7e84a68449eb497fd91d59f1e6fPatrick Bellasi            res_line += ' {0:10.3f}'.format(res_base)
148a0c6af17b243d7e84a68449eb497fd91d59f1e6fPatrick Bellasi        res_line += ' |'
149a0c6af17b243d7e84a68449eb497fd91d59f1e6fPatrick Bellasi
150a0c6af17b243d7e84a68449eb497fd91d59f1e6fPatrick Bellasi        # If available, dump also performance results
151a0c6af17b243d7e84a68449eb497fd91d59f1e6fPatrick Bellasi        if 'performance' not in _results[tid][base_idx].keys():
152a0c6af17b243d7e84a68449eb497fd91d59f1e6fPatrick Bellasi            print res_line
153a0c6af17b243d7e84a68449eb497fd91d59f1e6fPatrick Bellasi            return
154a0c6af17b243d7e84a68449eb497fd91d59f1e6fPatrick Bellasi
155a0c6af17b243d7e84a68449eb497fd91d59f1e6fPatrick Bellasi        for pidx in ['perf_avg', 'slack_pct', 'edp1', 'edp2', 'edp3']:
156a0c6af17b243d7e84a68449eb497fd91d59f1e6fPatrick Bellasi            res_base = _results[tid][base_idx]['performance'][pidx]['avg']
157a0c6af17b243d7e84a68449eb497fd91d59f1e6fPatrick Bellasi
158c278c2343c7f25083a80cb164b6bdc761d50050bPatrick Bellasi            self._log.debug('idx: %s, base: %s', pidx, res_base)
159a0c6af17b243d7e84a68449eb497fd91d59f1e6fPatrick Bellasi
1608720abc26202a8f25dce60d4bdefed5dfeb76b4fPatrick Bellasi            if pidx in ['perf_avg']:
1618720abc26202a8f25dce60d4bdefed5dfeb76b4fPatrick Bellasi                res_line += ' {0:s}'.format(TestColors.rate(res_base))
1628720abc26202a8f25dce60d4bdefed5dfeb76b4fPatrick Bellasi                continue
1638720abc26202a8f25dce60d4bdefed5dfeb76b4fPatrick Bellasi            if pidx in ['slack_pct']:
1648720abc26202a8f25dce60d4bdefed5dfeb76b4fPatrick Bellasi                res_line += ' {0:s}'.format(
1658720abc26202a8f25dce60d4bdefed5dfeb76b4fPatrick Bellasi                        TestColors.rate(res_base, positive_is_good = False))
1668720abc26202a8f25dce60d4bdefed5dfeb76b4fPatrick Bellasi                continue
167a0c6af17b243d7e84a68449eb497fd91d59f1e6fPatrick Bellasi            if 'edp' in pidx:
168a0c6af17b243d7e84a68449eb497fd91d59f1e6fPatrick Bellasi                res_line += ' {0:10.2e}'.format(res_base)
1698720abc26202a8f25dce60d4bdefed5dfeb76b4fPatrick Bellasi                continue
170a0c6af17b243d7e84a68449eb497fd91d59f1e6fPatrick Bellasi        res_line += ' |'
171a0c6af17b243d7e84a68449eb497fd91d59f1e6fPatrick Bellasi        print res_line
172a0c6af17b243d7e84a68449eb497fd91d59f1e6fPatrick Bellasi
17321756b552403589da5720eb04b85c9bfee83fd22Patrick Bellasi    def __rtapp_compare(self, tid, base_idx, test_idx, formats):
17497f727443b83ef54e3bcdcd167e76cc4e0a59ad1Patrick Bellasi        _results = self.results['rtapp']
17597f727443b83ef54e3bcdcd167e76cc4e0a59ad1Patrick Bellasi
176c278c2343c7f25083a80cb164b6bdc761d50050bPatrick Bellasi        self._log.debug('Test %s: compare %s with %s',
177c278c2343c7f25083a80cb164b6bdc761d50050bPatrick Bellasi                        tid, base_idx, test_idx)
1784453a39ca52499a0c59df2d82e800bf9465a5f27Patrick Bellasi        res_line = '{0:12s}:   {1:20s} | '.format(tid, test_idx)
1790f8ac68fcd4e514ae6ee32a6496bd239fb9c03aPatrick Bellasi
1800f8ac68fcd4e514ae6ee32a6496bd239fb9c03aPatrick Bellasi        # Dump all energy metrics
1810f8ac68fcd4e514ae6ee32a6496bd239fb9c03aPatrick Bellasi        for cpus in ['LITTLE', 'big', 'Total']:
18297f727443b83ef54e3bcdcd167e76cc4e0a59ad1Patrick Bellasi            res_base = _results[tid][base_idx]['energy'][cpus]['avg']
18397f727443b83ef54e3bcdcd167e76cc4e0a59ad1Patrick Bellasi            res_test = _results[tid][test_idx]['energy'][cpus]['avg']
1840f8ac68fcd4e514ae6ee32a6496bd239fb9c03aPatrick Bellasi            speedup_cnt =  res_test - res_base
18521756b552403589da5720eb04b85c9bfee83fd22Patrick Bellasi            if 'absolute' in formats:
1860f8ac68fcd4e514ae6ee32a6496bd239fb9c03aPatrick Bellasi                res_line += ' {0:10.2f}'.format(speedup_cnt)
1870f8ac68fcd4e514ae6ee32a6496bd239fb9c03aPatrick Bellasi            else:
188e85295e802a078b114839dd7612c16b86cc7df01Patrick Bellasi                speedup_pct = 0
189e85295e802a078b114839dd7612c16b86cc7df01Patrick Bellasi                if res_base != 0:
190e85295e802a078b114839dd7612c16b86cc7df01Patrick Bellasi                    speedup_pct =  100.0 * speedup_cnt / res_base
1910f8ac68fcd4e514ae6ee32a6496bd239fb9c03aPatrick Bellasi                res_line += ' {0:s}'\
1920f8ac68fcd4e514ae6ee32a6496bd239fb9c03aPatrick Bellasi                        .format(TestColors.rate(
1930f8ac68fcd4e514ae6ee32a6496bd239fb9c03aPatrick Bellasi                            speedup_pct,
1940f8ac68fcd4e514ae6ee32a6496bd239fb9c03aPatrick Bellasi                            positive_is_good = False))
1950f8ac68fcd4e514ae6ee32a6496bd239fb9c03aPatrick Bellasi        res_line += ' |'
1960f8ac68fcd4e514ae6ee32a6496bd239fb9c03aPatrick Bellasi
1970f8ac68fcd4e514ae6ee32a6496bd239fb9c03aPatrick Bellasi        # If available, dump also performance results
19897f727443b83ef54e3bcdcd167e76cc4e0a59ad1Patrick Bellasi        if 'performance' not in _results[tid][base_idx].keys():
1990f8ac68fcd4e514ae6ee32a6496bd239fb9c03aPatrick Bellasi            print res_line
2000f8ac68fcd4e514ae6ee32a6496bd239fb9c03aPatrick Bellasi            return
2010f8ac68fcd4e514ae6ee32a6496bd239fb9c03aPatrick Bellasi
2020f8ac68fcd4e514ae6ee32a6496bd239fb9c03aPatrick Bellasi        for pidx in ['perf_avg', 'slack_pct', 'edp1', 'edp2', 'edp3']:
20397f727443b83ef54e3bcdcd167e76cc4e0a59ad1Patrick Bellasi            res_base = _results[tid][base_idx]['performance'][pidx]['avg']
20497f727443b83ef54e3bcdcd167e76cc4e0a59ad1Patrick Bellasi            res_test = _results[tid][test_idx]['performance'][pidx]['avg']
2050f8ac68fcd4e514ae6ee32a6496bd239fb9c03aPatrick Bellasi
206c278c2343c7f25083a80cb164b6bdc761d50050bPatrick Bellasi            self._log.debug('idx: %s, base: %s, test: %s',
207c278c2343c7f25083a80cb164b6bdc761d50050bPatrick Bellasi                            pidx, res_base, res_test)
2080f8ac68fcd4e514ae6ee32a6496bd239fb9c03aPatrick Bellasi
2098720abc26202a8f25dce60d4bdefed5dfeb76b4fPatrick Bellasi            if pidx in ['perf_avg']:
2108720abc26202a8f25dce60d4bdefed5dfeb76b4fPatrick Bellasi                res_line += ' {0:s}'.format(TestColors.rate(res_test))
2118720abc26202a8f25dce60d4bdefed5dfeb76b4fPatrick Bellasi                continue
2128720abc26202a8f25dce60d4bdefed5dfeb76b4fPatrick Bellasi
2138720abc26202a8f25dce60d4bdefed5dfeb76b4fPatrick Bellasi            if pidx in ['slack_pct']:
2148720abc26202a8f25dce60d4bdefed5dfeb76b4fPatrick Bellasi                res_line += ' {0:s}'.format(
2158720abc26202a8f25dce60d4bdefed5dfeb76b4fPatrick Bellasi                        TestColors.rate(res_test, positive_is_good = False))
2168720abc26202a8f25dce60d4bdefed5dfeb76b4fPatrick Bellasi                continue
2170f8ac68fcd4e514ae6ee32a6496bd239fb9c03aPatrick Bellasi
2188720abc26202a8f25dce60d4bdefed5dfeb76b4fPatrick Bellasi            # Compute difference base-vs-test
2198720abc26202a8f25dce60d4bdefed5dfeb76b4fPatrick Bellasi            if 'edp' in pidx:
2208720abc26202a8f25dce60d4bdefed5dfeb76b4fPatrick Bellasi                speedup_cnt = res_base - res_test
2218720abc26202a8f25dce60d4bdefed5dfeb76b4fPatrick Bellasi                if 'absolute':
2220f8ac68fcd4e514ae6ee32a6496bd239fb9c03aPatrick Bellasi                    res_line += ' {0:10.2e}'.format(speedup_cnt)
2230f8ac68fcd4e514ae6ee32a6496bd239fb9c03aPatrick Bellasi                else:
2248720abc26202a8f25dce60d4bdefed5dfeb76b4fPatrick Bellasi                    res_line += ' {0:s}'.format(TestColors.rate(speedup_pct))
2258720abc26202a8f25dce60d4bdefed5dfeb76b4fPatrick Bellasi
2260f8ac68fcd4e514ae6ee32a6496bd239fb9c03aPatrick Bellasi        res_line += ' |'
2270f8ac68fcd4e514ae6ee32a6496bd239fb9c03aPatrick Bellasi        print res_line
2280f8ac68fcd4e514ae6ee32a6496bd239fb9c03aPatrick Bellasi
229f97104f5c525f13f8375625062b0b7311a516d59Patrick Bellasi    ############################### REPORT DEFAULT #############################
230f97104f5c525f13f8375625062b0b7311a516d59Patrick Bellasi
23121756b552403589da5720eb04b85c9bfee83fd22Patrick Bellasi    def __default_report(self, formats):
232f97104f5c525f13f8375625062b0b7311a516d59Patrick Bellasi
233f97104f5c525f13f8375625062b0b7311a516d59Patrick Bellasi        # Build list of workload types which can be rendered using the default parser
234f97104f5c525f13f8375625062b0b7311a516d59Patrick Bellasi        wtypes = []
235f97104f5c525f13f8375625062b0b7311a516d59Patrick Bellasi        for supported_wtype in DEFAULT_WTYPES:
236f97104f5c525f13f8375625062b0b7311a516d59Patrick Bellasi            if supported_wtype in self.results.keys():
237f97104f5c525f13f8375625062b0b7311a516d59Patrick Bellasi                wtypes.append(supported_wtype)
238f97104f5c525f13f8375625062b0b7311a516d59Patrick Bellasi
239f97104f5c525f13f8375625062b0b7311a516d59Patrick Bellasi        if len(wtypes) == 0:
240c278c2343c7f25083a80cb164b6bdc761d50050bPatrick Bellasi            self._log.debug('No Default workloads to report')
241f97104f5c525f13f8375625062b0b7311a516d59Patrick Bellasi            return
242f97104f5c525f13f8375625062b0b7311a516d59Patrick Bellasi
243c278c2343c7f25083a80cb164b6bdc761d50050bPatrick Bellasi        self._log.debug('Reporting Default workloads')
244f97104f5c525f13f8375625062b0b7311a516d59Patrick Bellasi
245f97104f5c525f13f8375625062b0b7311a516d59Patrick Bellasi        # Setup lables depending on requested report
24621756b552403589da5720eb04b85c9bfee83fd22Patrick Bellasi        if 'absolute' in formats:
247f97104f5c525f13f8375625062b0b7311a516d59Patrick Bellasi            nrg_lable = 'Energy Indexes (Absolute)'
248f97104f5c525f13f8375625062b0b7311a516d59Patrick Bellasi            prf_lable = 'Performance Indexes (Absolute)'
249c278c2343c7f25083a80cb164b6bdc761d50050bPatrick Bellasi            self._log.info('')
250c278c2343c7f25083a80cb164b6bdc761d50050bPatrick Bellasi            self._log.info('Absolute comparisions:')
251f97104f5c525f13f8375625062b0b7311a516d59Patrick Bellasi            print ''
252f97104f5c525f13f8375625062b0b7311a516d59Patrick Bellasi        else:
253f97104f5c525f13f8375625062b0b7311a516d59Patrick Bellasi            nrg_lable = 'Energy Indexes (Relative)'
254f97104f5c525f13f8375625062b0b7311a516d59Patrick Bellasi            prf_lable = 'Performance Indexes (Relative)'
255c278c2343c7f25083a80cb164b6bdc761d50050bPatrick Bellasi            self._log.info('')
256c278c2343c7f25083a80cb164b6bdc761d50050bPatrick Bellasi            self._log.info('Relative comparisions:')
257f97104f5c525f13f8375625062b0b7311a516d59Patrick Bellasi            print ''
258f97104f5c525f13f8375625062b0b7311a516d59Patrick Bellasi
259f97104f5c525f13f8375625062b0b7311a516d59Patrick Bellasi        # Dump headers
260faf58b49b3246516c719d3bfdb000e22e4c6a431Patrick Bellasi        print '{:9s}   {:20s} |'\
261f97104f5c525f13f8375625062b0b7311a516d59Patrick Bellasi                ' {:33s} | {:54s} |'\
262f97104f5c525f13f8375625062b0b7311a516d59Patrick Bellasi                .format('Test Id', 'Comparision',
263f97104f5c525f13f8375625062b0b7311a516d59Patrick Bellasi                        nrg_lable, prf_lable)
264faf58b49b3246516c719d3bfdb000e22e4c6a431Patrick Bellasi        print '{:9s}   {:20s} |'\
265f97104f5c525f13f8375625062b0b7311a516d59Patrick Bellasi                ' {:>10s} {:>10s} {:>10s}  |'\
266f97104f5c525f13f8375625062b0b7311a516d59Patrick Bellasi                ' {:>10s} {:>10s} {:>10s} {:>10s} {:>10s} |'\
267f97104f5c525f13f8375625062b0b7311a516d59Patrick Bellasi                .format('', '',
268f97104f5c525f13f8375625062b0b7311a516d59Patrick Bellasi                        'LITTLE', 'big', 'Total',
269f97104f5c525f13f8375625062b0b7311a516d59Patrick Bellasi                        'Perf', 'CTime', 'EDP1', 'EDP2', 'EDP3')
270f97104f5c525f13f8375625062b0b7311a516d59Patrick Bellasi
271f97104f5c525f13f8375625062b0b7311a516d59Patrick Bellasi        # For each default test
272f97104f5c525f13f8375625062b0b7311a516d59Patrick Bellasi        for wtype in wtypes:
273f97104f5c525f13f8375625062b0b7311a516d59Patrick Bellasi            _results = self.results[wtype]
274f97104f5c525f13f8375625062b0b7311a516d59Patrick Bellasi            for tid in sorted(_results.keys()):
275f97104f5c525f13f8375625062b0b7311a516d59Patrick Bellasi                new_test = True
276f97104f5c525f13f8375625062b0b7311a516d59Patrick Bellasi                # For each configuration...
277e3bebfc47781208a03169507b5bae5f22621579bPatrick Bellasi                for base_idx in sorted(_results[tid].keys()):
278f97104f5c525f13f8375625062b0b7311a516d59Patrick Bellasi                    # Which matches at least on base regexp
279f97104f5c525f13f8375625062b0b7311a516d59Patrick Bellasi                    for (base_rexp, test_rexp) in self.compare:
280f97104f5c525f13f8375625062b0b7311a516d59Patrick Bellasi                        if not base_rexp.match(base_idx):
281f97104f5c525f13f8375625062b0b7311a516d59Patrick Bellasi                            continue
282f97104f5c525f13f8375625062b0b7311a516d59Patrick Bellasi                        # Look for a configuration which matches the test regexp
283e3bebfc47781208a03169507b5bae5f22621579bPatrick Bellasi                        for test_idx in sorted(_results[tid].keys()):
284f97104f5c525f13f8375625062b0b7311a516d59Patrick Bellasi                            if test_idx == base_idx:
285f97104f5c525f13f8375625062b0b7311a516d59Patrick Bellasi                                continue
286f97104f5c525f13f8375625062b0b7311a516d59Patrick Bellasi                            if new_test:
2874453a39ca52499a0c59df2d82e800bf9465a5f27Patrick Bellasi                                print '{:-<37s}+{:-<35s}+{:-<56s}+'\
288f97104f5c525f13f8375625062b0b7311a516d59Patrick Bellasi                                        .format('','', '')
289f97104f5c525f13f8375625062b0b7311a516d59Patrick Bellasi                                new_test = False
290f97104f5c525f13f8375625062b0b7311a516d59Patrick Bellasi                            if not test_rexp.match(test_idx):
291f97104f5c525f13f8375625062b0b7311a516d59Patrick Bellasi                                continue
29221756b552403589da5720eb04b85c9bfee83fd22Patrick Bellasi                            self.__default_compare(wtype, tid, base_idx, test_idx, formats)
293f97104f5c525f13f8375625062b0b7311a516d59Patrick Bellasi
294f97104f5c525f13f8375625062b0b7311a516d59Patrick Bellasi        print ''
295f97104f5c525f13f8375625062b0b7311a516d59Patrick Bellasi
29621756b552403589da5720eb04b85c9bfee83fd22Patrick Bellasi    def __default_compare(self, wtype, tid, base_idx, test_idx, formats):
297f97104f5c525f13f8375625062b0b7311a516d59Patrick Bellasi        _results = self.results[wtype]
298f97104f5c525f13f8375625062b0b7311a516d59Patrick Bellasi
299c278c2343c7f25083a80cb164b6bdc761d50050bPatrick Bellasi        self._log.debug('Test %s: compare %s with %s',
300c278c2343c7f25083a80cb164b6bdc761d50050bPatrick Bellasi                        tid, base_idx, test_idx)
301f97104f5c525f13f8375625062b0b7311a516d59Patrick Bellasi        res_comp = '{0:s} vs {1:s}'.format(test_idx, base_idx)
302faf58b49b3246516c719d3bfdb000e22e4c6a431Patrick Bellasi        res_line = '{0:8s}: {1:22s} | '.format(tid, res_comp)
303f97104f5c525f13f8375625062b0b7311a516d59Patrick Bellasi
304f97104f5c525f13f8375625062b0b7311a516d59Patrick Bellasi        # Dump all energy metrics
305f97104f5c525f13f8375625062b0b7311a516d59Patrick Bellasi        for cpus in ['LITTLE', 'big', 'Total']:
306f97104f5c525f13f8375625062b0b7311a516d59Patrick Bellasi
307f97104f5c525f13f8375625062b0b7311a516d59Patrick Bellasi            # If either base of test have a 0 MAX energy, this measn that
308f97104f5c525f13f8375625062b0b7311a516d59Patrick Bellasi            # energy has not been collected
309f97104f5c525f13f8375625062b0b7311a516d59Patrick Bellasi            base_max = _results[tid][base_idx]['energy'][cpus]['max']
310f97104f5c525f13f8375625062b0b7311a516d59Patrick Bellasi            test_max = _results[tid][test_idx]['energy'][cpus]['max']
311f97104f5c525f13f8375625062b0b7311a516d59Patrick Bellasi            if base_max == 0 or test_max == 0:
312f97104f5c525f13f8375625062b0b7311a516d59Patrick Bellasi                res_line += ' {0:10s}'.format('NA')
313f97104f5c525f13f8375625062b0b7311a516d59Patrick Bellasi                continue
314f97104f5c525f13f8375625062b0b7311a516d59Patrick Bellasi
315f97104f5c525f13f8375625062b0b7311a516d59Patrick Bellasi            # Otherwise, report energy values
316f97104f5c525f13f8375625062b0b7311a516d59Patrick Bellasi            res_base = _results[tid][base_idx]['energy'][cpus]['avg']
317f97104f5c525f13f8375625062b0b7311a516d59Patrick Bellasi            res_test = _results[tid][test_idx]['energy'][cpus]['avg']
318f97104f5c525f13f8375625062b0b7311a516d59Patrick Bellasi
319f97104f5c525f13f8375625062b0b7311a516d59Patrick Bellasi            speedup_cnt =  res_test - res_base
32021756b552403589da5720eb04b85c9bfee83fd22Patrick Bellasi            if 'absolute' in formats:
321f97104f5c525f13f8375625062b0b7311a516d59Patrick Bellasi                res_line += ' {0:10.2f}'.format(speedup_cnt)
322f97104f5c525f13f8375625062b0b7311a516d59Patrick Bellasi            else:
323f97104f5c525f13f8375625062b0b7311a516d59Patrick Bellasi                speedup_pct =  100.0 * speedup_cnt / res_base
324f97104f5c525f13f8375625062b0b7311a516d59Patrick Bellasi                res_line += ' {0:s}'\
325f97104f5c525f13f8375625062b0b7311a516d59Patrick Bellasi                        .format(TestColors.rate(
326f97104f5c525f13f8375625062b0b7311a516d59Patrick Bellasi                            speedup_pct,
327f97104f5c525f13f8375625062b0b7311a516d59Patrick Bellasi                            positive_is_good = False))
328f97104f5c525f13f8375625062b0b7311a516d59Patrick Bellasi        res_line += ' |'
329f97104f5c525f13f8375625062b0b7311a516d59Patrick Bellasi
330f97104f5c525f13f8375625062b0b7311a516d59Patrick Bellasi        # If available, dump also performance results
331f97104f5c525f13f8375625062b0b7311a516d59Patrick Bellasi        if 'performance' not in _results[tid][base_idx].keys():
332f97104f5c525f13f8375625062b0b7311a516d59Patrick Bellasi            print res_line
333f97104f5c525f13f8375625062b0b7311a516d59Patrick Bellasi            return
334f97104f5c525f13f8375625062b0b7311a516d59Patrick Bellasi
335f97104f5c525f13f8375625062b0b7311a516d59Patrick Bellasi        for pidx in ['perf_avg', 'ctime_avg', 'edp1', 'edp2', 'edp3']:
336f97104f5c525f13f8375625062b0b7311a516d59Patrick Bellasi            res_base = _results[tid][base_idx]['performance'][pidx]['avg']
337f97104f5c525f13f8375625062b0b7311a516d59Patrick Bellasi            res_test = _results[tid][test_idx]['performance'][pidx]['avg']
338f97104f5c525f13f8375625062b0b7311a516d59Patrick Bellasi
339c278c2343c7f25083a80cb164b6bdc761d50050bPatrick Bellasi            self._log.debug('idx: %s, base: %s, test: %s',
340c278c2343c7f25083a80cb164b6bdc761d50050bPatrick Bellasi                            pidx, res_base, res_test)
341f97104f5c525f13f8375625062b0b7311a516d59Patrick Bellasi
342f97104f5c525f13f8375625062b0b7311a516d59Patrick Bellasi            # Compute difference base-vs-test
343f97104f5c525f13f8375625062b0b7311a516d59Patrick Bellasi            speedup_cnt = 0
344f97104f5c525f13f8375625062b0b7311a516d59Patrick Bellasi            if res_base != 0:
345f97104f5c525f13f8375625062b0b7311a516d59Patrick Bellasi                if pidx in ['perf_avg']:
346f97104f5c525f13f8375625062b0b7311a516d59Patrick Bellasi                    speedup_cnt =  res_test - res_base
347f97104f5c525f13f8375625062b0b7311a516d59Patrick Bellasi                else:
348f97104f5c525f13f8375625062b0b7311a516d59Patrick Bellasi                    speedup_cnt =  res_base - res_test
349f97104f5c525f13f8375625062b0b7311a516d59Patrick Bellasi
350f97104f5c525f13f8375625062b0b7311a516d59Patrick Bellasi            # Compute speedup if required
351f97104f5c525f13f8375625062b0b7311a516d59Patrick Bellasi            speedup_pct = 0
35221756b552403589da5720eb04b85c9bfee83fd22Patrick Bellasi            if 'absolute' in formats:
353f97104f5c525f13f8375625062b0b7311a516d59Patrick Bellasi                if 'edp' in pidx:
354f97104f5c525f13f8375625062b0b7311a516d59Patrick Bellasi                    res_line += ' {0:10.2e}'.format(speedup_cnt)
355f97104f5c525f13f8375625062b0b7311a516d59Patrick Bellasi                else:
356f97104f5c525f13f8375625062b0b7311a516d59Patrick Bellasi                    res_line += ' {0:10.2f}'.format(speedup_cnt)
357f97104f5c525f13f8375625062b0b7311a516d59Patrick Bellasi            else:
358f97104f5c525f13f8375625062b0b7311a516d59Patrick Bellasi                if res_base != 0:
359f97104f5c525f13f8375625062b0b7311a516d59Patrick Bellasi                    if pidx in ['perf_avg']:
360f97104f5c525f13f8375625062b0b7311a516d59Patrick Bellasi                        # speedup_pct =  100.0 * speedup_cnt / res_base
361f97104f5c525f13f8375625062b0b7311a516d59Patrick Bellasi                        speedup_pct =  speedup_cnt
362f97104f5c525f13f8375625062b0b7311a516d59Patrick Bellasi                    else:
363f97104f5c525f13f8375625062b0b7311a516d59Patrick Bellasi                        speedup_pct =  100.0 * speedup_cnt / res_base
364f97104f5c525f13f8375625062b0b7311a516d59Patrick Bellasi                res_line += ' {0:s}'.format(TestColors.rate(speedup_pct))
365f97104f5c525f13f8375625062b0b7311a516d59Patrick Bellasi        res_line += ' |'
366f97104f5c525f13f8375625062b0b7311a516d59Patrick Bellasi        print res_line
367f97104f5c525f13f8375625062b0b7311a516d59Patrick Bellasi
368f97104f5c525f13f8375625062b0b7311a516d59Patrick Bellasi# List of workload types which can be parsed using the default test parser
369f97104f5c525f13f8375625062b0b7311a516d59Patrick BellasiDEFAULT_WTYPES = ['perf_bench_messaging', 'perf_bench_pipe']
370f97104f5c525f13f8375625062b0b7311a516d59Patrick Bellasi
3710f8ac68fcd4e514ae6ee32a6496bd239fb9c03aPatrick Bellasi#vim :set tabstop=4 shiftwidth=4 expandtab
372