Merge.
1.1 --- /dev/null Thu Jan 01 00:00:00 1970 +0000
1.2 +++ b/utils/flowmon/plot.py Wed May 06 17:36:47 2009 +0100
1.3 @@ -0,0 +1,151 @@
1.4 +from optparse import OptionParser
1.5 +import pylab
1.6 +try:
1.7 + from xml.etree import cElementTree as ElementTree
1.8 +except ImportError:
1.9 + from xml.etree import ElementTree
1.10 +import bz2
1.11 +
1.12 +
1.13 +class ConfidenceValue(object):
1.14 +
1.15 + def __init__(self):
1.16 + self.samples = []
1.17 + self._mean = None
1.18 + self._error = None
1.19 +
1.20 + def add_sample(self, sample):
1.21 + self.samples.append(sample)
1.22 +
1.23 + # from http://experimentor.googlecode.com/svn
1.24 + def _mean_confidence_interval(self, confidence=0.95):
1.25 + from numpy import mean, array, sqrt
1.26 + import scipy.stats
1.27 + a = 1.0*array(self.samples)
1.28 + n = len(a)
1.29 + m, se = mean(a), scipy.stats.stderr(a)
1.30 + # calls the inverse CDF of the Student's t distribution
1.31 + h = se * scipy.stats.t._ppf((1 + confidence)/2.0, n-1)
1.32 + self._mean = m
1.33 + self._error = h
1.34 +
1.35 + @property
1.36 + def mean(self):
1.37 + if self._mean is None:
1.38 + self._mean_confidence_interval()
1.39 + return self._mean
1.40 +
1.41 + @property
1.42 + def error(self):
1.43 + if self._error is None:
1.44 + self._mean_confidence_interval()
1.45 + return self._error
1.46 +
1.47 +
1.48 +class SimulationResults(object):
1.49 + def __init__(self, results_el):
1.50 + self.cpu_time = float(results_el.attrib['cpu-time'])
1.51 + self.run_number = int(results_el.attrib['run-number'])
1.52 + self.enable_monitor = {"True": True, "False": False} [results_el.attrib['enable-monitor']]
1.53 + self.max_memory = long(results_el.attrib['max-memory'])
1.54 + self.num_nodes_side = int(results_el.attrib['num-nodes-side'])
1.55 +
1.56 +
1.57 +class ResultsDb(object):
1.58 + def __init__(self):
1.59 + self.simulations = []
1.60 +
1.61 + def read_results_file(self, fname):
1.62 + tree = ElementTree.ElementTree()
1.63 + if fname.endswith('.bz2'):
1.64 + file_obj = bz2.BZ2File(fname)
1.65 + else:
1.66 + file_obj = open(fname)
1.67 + tree.parse(file_obj)
1.68 + for elem in tree.getroot():
1.69 + if elem.tag == 'simulation':
1.70 + self.simulations.append(SimulationResults(elem))
1.71 +
1.72 +
1.73 +def main():
1.74 + parser = OptionParser()
1.75 + (options, args) = parser.parse_args()
1.76 +
1.77 + results = ResultsDb()
1.78 + for fname in args:
1.79 + results.read_results_file(fname)
1.80 + print "Read %i simulations." % (len(results.simulations),)
1.81 +
1.82 + cpu_time_no_monitor = []
1.83 + cpu_time_monitor = []
1.84 + memory_no_monitor = []
1.85 + memory_monitor = []
1.86 +
1.87 + num_nodes_list = []
1.88 +
1.89 + for num_nodes_side in range(3,11):
1.90 +
1.91 + num_nodes_list.append(num_nodes_side*num_nodes_side)
1.92 +
1.93 + memory_cv_no_monitor = ConfidenceValue()
1.94 + memory_no_monitor.append(memory_cv_no_monitor)
1.95 +
1.96 + memory_cv_monitor = ConfidenceValue()
1.97 + memory_monitor.append(memory_cv_monitor)
1.98 +
1.99 + cpu_cv_no_monitor = ConfidenceValue()
1.100 + cpu_time_no_monitor.append(cpu_cv_no_monitor)
1.101 +
1.102 + cpu_cv_monitor = ConfidenceValue()
1.103 + cpu_time_monitor.append(cpu_cv_monitor)
1.104 +
1.105 + for sim in results.simulations:
1.106 + if sim.num_nodes_side == num_nodes_side:
1.107 + if sim.enable_monitor:
1.108 + memory_cv_monitor.add_sample(sim.max_memory)
1.109 + cpu_cv_monitor.add_sample(sim.cpu_time)
1.110 + else:
1.111 + memory_cv_no_monitor.add_sample(sim.max_memory)
1.112 + cpu_cv_no_monitor.add_sample(sim.cpu_time)
1.113 +
1.114 + pylab.subplot(211)
1.115 + pylab.title("Memory")
1.116 + pylab.xlabel("Number of Nodes")
1.117 + pylab.ylabel("Max. Memory (VSS) (bytes)")
1.118 +
1.119 + pylab.errorbar(
1.120 + num_nodes_list,
1.121 + [val.mean for val in memory_no_monitor],
1.122 + [val.error for val in memory_no_monitor],
1.123 + label="No Monitor", hold=True)
1.124 +
1.125 + pylab.errorbar(
1.126 + num_nodes_list,
1.127 + [val.mean for val in memory_monitor],
1.128 + [val.error for val in memory_monitor],
1.129 + label="With Monitor", hold=True)
1.130 + pylab.legend(loc='best')
1.131 +
1.132 +
1.133 + pylab.subplot(212)
1.134 + pylab.title("CPU Time")
1.135 + pylab.xlabel("Number of Nodes")
1.136 + pylab.ylabel("Time (s)")
1.137 +
1.138 + pylab.errorbar(
1.139 + num_nodes_list,
1.140 + [val.mean for val in cpu_time_no_monitor],
1.141 + [val.error for val in cpu_time_no_monitor],
1.142 + label="No Monitor", hold=True)
1.143 +
1.144 + pylab.errorbar(
1.145 + num_nodes_list,
1.146 + [val.mean for val in cpu_time_monitor],
1.147 + [val.error for val in cpu_time_monitor],
1.148 + label="With Monitor", hold=True)
1.149 + pylab.legend(loc='best')
1.150 +
1.151 + pylab.show()
1.152 +
1.153 +if __name__ == '__main__':
1.154 + main()