--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/utils/flowmon/plot.py Tue May 05 19:05:46 2009 +0100
@@ -0,0 +1,151 @@
+from optparse import OptionParser
+import pylab
+try:
+ from xml.etree import cElementTree as ElementTree
+except ImportError:
+ from xml.etree import ElementTree
+import bz2
+
+
+class ConfidenceValue(object):
+
+ def __init__(self):
+ self.samples = []
+ self._mean = None
+ self._error = None
+
+ def add_sample(self, sample):
+ self.samples.append(sample)
+
+ # from http://experimentor.googlecode.com/svn
+ def _mean_confidence_interval(self, confidence=0.95):
+ from numpy import mean, array, sqrt
+ import scipy.stats
+ a = 1.0*array(self.samples)
+ n = len(a)
+ m, se = mean(a), scipy.stats.stderr(a)
+ # calls the inverse CDF of the Student's t distribution
+ h = se * scipy.stats.t._ppf((1 + confidence)/2.0, n-1)
+ self._mean = m
+ self._error = h
+
+ @property
+ def mean(self):
+ if self._mean is None:
+ self._mean_confidence_interval()
+ return self._mean
+
+ @property
+ def error(self):
+ if self._error is None:
+ self._mean_confidence_interval()
+ return self._error
+
+
+class SimulationResults(object):
+ def __init__(self, results_el):
+ self.cpu_time = float(results_el.attrib['cpu-time'])
+ self.run_number = int(results_el.attrib['run-number'])
+ self.enable_monitor = {"True": True, "False": False} [results_el.attrib['enable-monitor']]
+ self.max_memory = long(results_el.attrib['max-memory'])
+ self.num_nodes_side = int(results_el.attrib['num-nodes-side'])
+
+
+class ResultsDb(object):
+ def __init__(self):
+ self.simulations = []
+
+ def read_results_file(self, fname):
+ tree = ElementTree.ElementTree()
+ if fname.endswith('.bz2'):
+ file_obj = bz2.BZ2File(fname)
+ else:
+ file_obj = open(fname)
+ tree.parse(file_obj)
+ for elem in tree.getroot():
+ if elem.tag == 'simulation':
+ self.simulations.append(SimulationResults(elem))
+
+
+def main():
+ parser = OptionParser()
+ (options, args) = parser.parse_args()
+
+ results = ResultsDb()
+ for fname in args:
+ results.read_results_file(fname)
+ print "Read %i simulations." % (len(results.simulations),)
+
+ cpu_time_no_monitor = []
+ cpu_time_monitor = []
+ memory_no_monitor = []
+ memory_monitor = []
+
+ num_nodes_list = []
+
+ for num_nodes_side in range(3,11):
+
+ num_nodes_list.append(num_nodes_side*num_nodes_side)
+
+ memory_cv_no_monitor = ConfidenceValue()
+ memory_no_monitor.append(memory_cv_no_monitor)
+
+ memory_cv_monitor = ConfidenceValue()
+ memory_monitor.append(memory_cv_monitor)
+
+ cpu_cv_no_monitor = ConfidenceValue()
+ cpu_time_no_monitor.append(cpu_cv_no_monitor)
+
+ cpu_cv_monitor = ConfidenceValue()
+ cpu_time_monitor.append(cpu_cv_monitor)
+
+ for sim in results.simulations:
+ if sim.num_nodes_side == num_nodes_side:
+ if sim.enable_monitor:
+ memory_cv_monitor.add_sample(sim.max_memory)
+ cpu_cv_monitor.add_sample(sim.cpu_time)
+ else:
+ memory_cv_no_monitor.add_sample(sim.max_memory)
+ cpu_cv_no_monitor.add_sample(sim.cpu_time)
+
+ pylab.subplot(211)
+ pylab.title("Memory")
+ pylab.xlabel("Number of Nodes")
+ pylab.ylabel("Max. Memory (VSS) (bytes)")
+
+ pylab.errorbar(
+ num_nodes_list,
+ [val.mean for val in memory_no_monitor],
+ [val.error for val in memory_no_monitor],
+ label="No Monitor", hold=True)
+
+ pylab.errorbar(
+ num_nodes_list,
+ [val.mean for val in memory_monitor],
+ [val.error for val in memory_monitor],
+ label="With Monitor", hold=True)
+ pylab.legend(loc='best')
+
+
+ pylab.subplot(212)
+ pylab.title("CPU Time")
+ pylab.xlabel("Number of Nodes")
+ pylab.ylabel("Time (s)")
+
+ pylab.errorbar(
+ num_nodes_list,
+ [val.mean for val in cpu_time_no_monitor],
+ [val.error for val in cpu_time_no_monitor],
+ label="No Monitor", hold=True)
+
+ pylab.errorbar(
+ num_nodes_list,
+ [val.mean for val in cpu_time_monitor],
+ [val.error for val in cpu_time_monitor],
+ label="With Monitor", hold=True)
+ pylab.legend(loc='best')
+
+ pylab.show()
+
+if __name__ == '__main__':
+ main()