From 5276c950377e6a626fa9f3e5536d6a7e03d8659a Mon Sep 17 00:00:00 2001
From: "Kurt A. O'Hearn" <ohearnku@msu.edu>
Date: Tue, 2 Aug 2016 08:45:35 -0700
Subject: [PATCH] Update tools.

---
 tools/run_sim.py | 112 ++++++++++++++++++++++++++---------------------
 1 file changed, 62 insertions(+), 50 deletions(-)

diff --git a/tools/run_sim.py b/tools/run_sim.py
index a5915aa5..39342fdb 100644
--- a/tools/run_sim.py
+++ b/tools/run_sim.py
@@ -4,20 +4,22 @@ from fileinput import input
 from itertools import product
 from re import sub
 from subprocess import Popen, PIPE
-from os import getcwd, environ, path, rename
+from os import getcwd, environ, path, remove, rename, rmdir
 from sys import exit
+from tempfile import mkdtemp
 from time import time
 
 
 class TestCase():
     def __init__(self, geo_file, ffield_file, control_file, params={}, result_header_fmt='',
-            result_body_fmt='', result_file='result.txt'):
+            result_header='', result_body_fmt='', result_file='results.txt'):
         self.__geo_file = geo_file
         self.__ffield_file = ffield_file
         self.__control_file = control_file
         self.__param_names = sorted(params.keys())
         self.__params = params
         self.__result_header_fmt = result_header_fmt
+        self.__result_header = result_header
         self.__result_body_fmt = result_body_fmt
         self.__result_file = result_file
         self.__control_res = { \
@@ -45,18 +47,22 @@ class TestCase():
                     r'(?P<key>geo_format\s+)\S+(?P<comment>.*)', r'\g<key>%s\g<comment>' % x, l), \
         }
 
-    def _setup(self, param):
-        for line in input(self.__control_file, inplace=1):
-            line = line.rstrip() 
-            for k in self.__control_res.keys():
-                try:
-                    line = self.__control_res[k](line, param[k])
-                except KeyError:
-                    pass
-            print line
-
-    def run(self):
+    def _setup(self, param, temp_file):
+        fp = open(self.__control_file, 'r')
+	lines = fp.read()
+	fp.close()
+        for k in self.__control_res.keys():
+            try:
+                lines = self.__control_res[k](lines, param[k])
+            except KeyError:
+                pass
+        fp_temp = open(temp_file, 'w', 0)
+	fp_temp.write(lines)
+	fp_temp.close()
+
+    def run(self, bin_file='sPuReMD/bin/spuremd'):
         base_dir = getcwd()
+	bin_path = path.join(base_dir, bin_file)
         env = dict(environ)
 
         write_header = True
@@ -64,8 +70,10 @@ class TestCase():
             write_header = False
         fout = open(self.__result_file, 'a', 0)
         if write_header:
-            fout.write(self.__result_header_fmt.format('Data Set', 'Steps', 'Q Tol', 'Pre T', 'Pre Comp',
-                    'Pre App', 'Iters', 'SpMV', 'QEq', 'Threads', 'Time (s)'))
+            fout.write(self.__result_header_fmt.format(*self.__result_header))
+
+        temp_dir = mkdtemp()
+	temp_file = path.join(temp_dir, path.basename(self.__control_file))
 
         for p in product(*[self.__params[k] for k in self.__param_names]):
             param_dict = dict((k, v) for (k, v) in zip(self.__param_names, p))
@@ -73,24 +81,24 @@ class TestCase():
                 + '_step' + param_dict['nsteps'] + '_tol' + param_dict['qeq_solver_q_err'] \
                 + '_precomp' + param_dict['pre_comp_type'] + '_thread' + param_dict['threads']
 
-            self._setup(param_dict)
+            self._setup(param_dict, temp_file)
 
             env['OMP_NUM_THREADS'] = param_dict['threads']
             start = time()
-            proc_handle = Popen([path.join(base_dir, 'sPuReMD/bin/spuremd'),
-                self.__geo_file, self.__ffield_file, self.__control_file], 
+            proc_handle = Popen([bin_path, self.__geo_file, self.__ffield_file, temp_file], 
                 stdout=PIPE, stderr=PIPE, env=env)
             #TODO: handle outputs?
             stdout, stderr = proc_handle.communicate()
-            print 'stdout:', stdout
-            print 'stderr:', stderr
             stop = time()
 
             self._process_result(fout, stop - start, param_dict)
 
         fout.close()
+        remove(temp_file)
+	rmdir(temp_dir)
 
     def _process_result(self, fout, time, param):
+        qeq = 0.
         iters = 0.
         pre_comp = 0.
         pre_app = 0.
@@ -100,6 +108,7 @@ class TestCase():
             for line in fp:
                 line = line.split()
                 try:
+                    qeq = qeq + float(line[6])
                     iters = iters + float(line[7])
                     pre_comp = pre_comp + float(line[8])
                     pre_app = pre_app + float(line[9])
@@ -108,14 +117,15 @@ class TestCase():
                 except Exception:
                     pass
             cnt = cnt - 1
+            qeq = qeq / cnt
             iters = iters / cnt
             pre_comp = pre_comp / cnt
             pre_app = pre_app / cnt
             spmv = spmv / cnt
 
-        fout.write(self.__result_body_fmt.format(path.basename(self.__control_file).split('.')[0], 
+        fout.write(self.__result_body_fmt.format(path.basename(self.__geo_file).split('.')[0], 
             param['nsteps'], param['qeq_solver_q_err'], param['pre_comp_type'], pre_comp, pre_app, iters, spmv,
-            param['threads'], time))
+            qeq, param['threads'], time))
 
 
 if __name__ == '__main__':
@@ -124,21 +134,23 @@ if __name__ == '__main__':
     data_dir = path.join(base_dir, 'data/benchmarks')
 
     header_fmt_str = '{:20}|{:5}|{:5}|{:5}|{:10}|{:10}|{:10}|{:10}|{:10}|{:10}|{:10}\n'
+    header_str = ['Data Set', 'Steps', 'Q Tol', 'Pre T', 'Pre Comp',
+		    'Pre App', 'Iters', 'SpMV', 'QEq', 'Threads', 'Time (s)']
     body_fmt_str = '{:20} {:5} {:5} {:5} {:10.6f} {:10.6f} {:10.6f} {:10.6f} {:10.6f} {:10} {:10.6f}\n'
 
     params = {
             'ensemble_type': ['0'],
-            'nsteps': ['20'],
-            'qeq_solver_type': ['2'],
-            'qeq_solver_q_err': ['1e-6'],
+            'nsteps': ['20', '100', '500', '1000'],
+            'qeq_solver_type': ['0'],
+            'qeq_solver_q_err': ['1e-6', '1e-10'],
 #            'qeq_solver_q_err': ['1e-6', '1e-8', '1e-10', '1e-14'],
-            'pre_comp_type': ['2'],
+            'pre_comp_type': ['0'],
 #            'pre_comp_type': ['0', '1', '2'],
-            'pre_comp_refactor': ['20'],
+            'pre_comp_refactor': ['1'],
 #            'pre_comp_sweeps': ['3'],
 #            'pre_app_type': ['0'],
 #            'pre_app_jacobi_iters': ['50'],
-            'threads': ['1'],
+            'threads': ['12'],
 #            'threads': ['1', '2', '4', '12', '24'],
             'geo_format': ['1'],
     }
@@ -147,39 +159,39 @@ if __name__ == '__main__':
             TestCase(path.join(data_dir, 'water/water_6540.pdb'),
                 path.join(data_dir, 'water/ffield.water'),
                 path.join(control_dir, 'param.gpu.water'),
-                params=params, result_header_fmt=header_fmt_str, result_body_fmt=body_fmt_str),
+                params=params, result_header_fmt=header_fmt_str, result_header = header_str, result_body_fmt=body_fmt_str),
 #            TestCase(path.join(data_dir, 'water/water_78480.pdb'),
 #                path.join(data_dir, 'water/ffield.water'),
 #                path.join(control_dir, 'param.gpu.water'),
-#                params=params, result_header_fmt=header_fmt_str, result_body_fmt=body_fmt_str),
+#                params=params, result_header_fmt=header_fmt_str, result_header = header_str, result_body_fmt=body_fmt_str),
 #            TestCase(path.join(data_dir, 'water/water_327000.geo'),
 #                path.join(data_dir, 'water/ffield.water'),
 #                path.join(control_dir, 'param.gpu.water'),
-#                params=params, result_header_fmt=header_fmt_str, result_body_fmt=body_fmt_str),
-#            TestCase(path.join(data_dir, 'bilayer/bilayer_56800.pdb'),
-#                path.join(data_dir, 'bilayer/ffield-bio'),
-#                path.join(control_dir, 'param.gpu.water'),
-#                params=params, result_header_fmt=header_fmt_str, result_body_fmt=body_fmt_str),
-#            TestCase(path.join(data_dir, 'dna/dna_19733.pdb'),
-#                path.join(data_dir, 'dna/ffield-dna'),
-#                path.join(control_dir, 'param.gpu.water'),
-#                params=params, result_header_fmt=header_fmt_str, result_body_fmt=body_fmt_str),
-#            TestCase(path.join(data_dir, 'silica/silica_6000.pdb'),
-#                path.join(data_dir, 'silica/ffield-bio'),
-#                path.join(control_dir, 'param.gpu.water'),
-#                params=params, result_header_fmt=header_fmt_str, result_body_fmt=body_fmt_str),
+#                params=params, result_header_fmt=header_fmt_str, result_header = header_str, result_body_fmt=body_fmt_str),
+            TestCase(path.join(data_dir, 'bilayer/bilayer_56800.pdb'),
+                path.join(data_dir, 'bilayer/ffield-bio'),
+                path.join(control_dir, 'param.gpu.water'),
+                params=params, result_header_fmt=header_fmt_str, result_header = header_str, result_body_fmt=body_fmt_str),
+            TestCase(path.join(data_dir, 'dna/dna_19733.pdb'),
+                path.join(data_dir, 'dna/ffield-dna'),
+                path.join(control_dir, 'param.gpu.water'),
+                params=params, result_header_fmt=header_fmt_str, result_header = header_str, result_body_fmt=body_fmt_str),
+            TestCase(path.join(data_dir, 'silica/silica_6000.pdb'),
+                path.join(data_dir, 'silica/ffield-bio'),
+                path.join(control_dir, 'param.gpu.water'),
+                params=params, result_header_fmt=header_fmt_str, result_header = header_str, result_body_fmt=body_fmt_str),
 #            TestCase(path.join(data_dir, 'silica/silica_72000.geo'),
 #                path.join(data_dir, 'silica/ffield-bio'),
 #                path.join(control_dir, 'param.gpu.water'),
-#                params=params, result_header_fmt=header_fmt_str, result_body_fmt=body_fmt_str),
+#                params=params, result_header_fmt=header_fmt_str, result_header = header_str, result_body_fmt=body_fmt_str),
 #            TestCase(path.join(data_dir, 'silica/silica_300000.geo'),
 #                path.join(data_dir, 'silica/ffield-bio'),
 #                path.join(control_dir, 'param.gpu.water'),
-#                params=params, result_header_fmt=header_fmt_str, result_body_fmt=body_fmt_str),
-#            TestCase(path.join(data_dir, 'petn/petn_48256.pdb'),
-#                path.join(data_dir, 'petn/ffield.petn'),
-#                path.join(control_dir, 'param.gpu.water'),
-#                params=params, result_header_fmt=header_fmt_str, result_body_fmt=body_fmt_str),
+#                params=params, result_header_fmt=header_fmt_str, result_header = header_str, result_body_fmt=body_fmt_str),
+            TestCase(path.join(data_dir, 'petn/petn_48256.pdb'),
+                path.join(data_dir, 'petn/ffield.petn'),
+                path.join(control_dir, 'param.gpu.water'),
+                params=params, result_header_fmt=header_fmt_str, result_header = header_str, result_body_fmt=body_fmt_str),
                         ]
     for test in test_cases:
-        test.run()
+        test.run(bin_file='sPuReMD/bin/spuremd')
-- 
GitLab