aboutsummaryrefslogtreecommitdiff
path: root/crosperf/experiment_status.py
blob: ddf3f54ac11a1fe0fb1d52917b7586db1f81c168 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
#!/usr/bin/python

# Copyright 2011 Google Inc. All Rights Reserved.

import datetime
import time


class ExperimentStatus(object):
  def __init__(self, experiment):
    self.experiment = experiment
    self.num_total = len(self.experiment.benchmark_runs)

  def _GetProgressBar(self, num_complete, num_total):
    ret = "Done: %s%%" % int(100.0 * num_complete / num_total)
    bar_length = 50
    done_char = ">"
    undone_char = " "
    num_complete_chars = bar_length * num_complete / num_total
    num_undone_chars = bar_length - num_complete_chars
    ret += " [%s%s]" % (num_complete_chars * done_char, num_undone_chars *
                        undone_char)
    return ret

  def GetProgressString(self):
    current_time = time.time()
    if self.experiment.start_time:
      elapsed_time = current_time - self.experiment.start_time
    else:
      elapsed_time = 0
    try:
      eta_seconds = (float(self.num_total - self.experiment.num_complete) *
                     elapsed_time / self.experiment.num_complete)
      eta_seconds = int(eta_seconds)
      eta = datetime.timedelta(seconds=eta_seconds)
    except ZeroDivisionError:
      eta = "Unknown"
    strings = []
    strings.append("Current time: %s Elapsed: %s ETA: %s" %
                   (datetime.datetime.now(),
                    datetime.timedelta(seconds=int(elapsed_time)),
                    eta))
    strings.append(self._GetProgressBar(self.experiment.num_complete,
                                        self.num_total))
    return "\n".join(strings)

  def GetStatusString(self):
    status_bins = {}
    for benchmark_run in self.experiment.benchmark_runs:
      if benchmark_run.status not in status_bins:
        status_bins[benchmark_run.status] = []
      status_bins[benchmark_run.status].append(benchmark_run)

    status_strings = []
    for key, val in status_bins.items():
      status_strings.append("%s: %s" %
                            (key, self._GetNamesAndIterations(val)))
    result = "Thread Status:\n%s" % "\n".join(status_strings)

    # Add the machine manager status.
    result += "\n" + self.experiment.machine_manager.AsString() + "\n"

    return result

  def _GetNamesAndIterations(self, benchmark_runs):
    strings = []
    for benchmark_run in benchmark_runs:
      strings.append("'%s'" % benchmark_run.name)
    return " %s (%s)" % (len(strings), ", ".join(strings))