Index: tools/test_gpuveto.py |
=================================================================== |
--- tools/test_gpuveto.py (revision 0) |
+++ tools/test_gpuveto.py (revision 0) |
@@ -0,0 +1,156 @@ |
+#!/usr/bin/env python |
+ |
+# Copyright 2014 Google Inc. |
+# |
+# Use of this source code is governed by a BSD-style license that can be |
+# found in the LICENSE file. |
+ |
+""" |
rmistry
2014/04/28 16:58:44
"""Script to test out suitableForGpuRasterization
robertphillips
2014/04/28 17:45:58
Done.
|
+Script to test out suitableForGpuRasterization (via gpuveto) |
+""" |
+ |
+import glob |
+import os |
+import re |
+import subprocess |
+import sys |
+ |
+# Set the PYTHONPATH to include the tools directory. |
+sys.path.append( |
+ os.path.join(os.path.dirname(os.path.realpath(__file__)), os.pardir)) |
+import find_run_binary |
+ |
+USAGE = """ |
+Usage: |
+ {command} SKP_FILE |
+ {command} SKP_DIR\n |
+""" |
+ |
+def find_path_to_program(program): |
+ """ |
+ Returns path to an existing program binary. |
rmistry
2014/04/28 16:58:44
Keep this line above, eg:
"""Returns path to an ex
robertphillips
2014/04/28 17:45:58
Done.
|
+ |
+ @param program: Basename of the program to find (e.g., 'render_pictures'). |
+ |
+ @returns absolute path to the program binary, as a string. |
+ |
+ Raises: |
+ Exception: unable to find the program binary. |
+ """ |
+ return find_run_binary.find_path_to_program(program) |
+ |
rmistry
2014/04/28 16:58:44
Nit: Need 2 newlines between top level definitions
robertphillips
2014/04/28 17:45:58
Done.
|
+def list_files(dir_or_file): |
+ """ |
+ Accepts a directory or filename. Returns a list of all the files in the |
+ directory or just the file. |
+ """ |
rmistry
2014/04/28 16:58:44
Change above to:
"""Returns list of all files fro
robertphillips
2014/04/28 17:45:58
Done.
|
+ files = [] |
+ for globbedpath in glob.iglob(dir_or_file): # useful on win32 |
+ if os.path.isdir(globbedpath): |
+ for filename in os.listdir(globbedpath): |
+ newpath = os.path.join(globbedpath, filename) |
+ if os.path.isfile(newpath): |
+ files.append(newpath) |
+ elif os.path.isfile(globbedpath): |
+ files.append(globbedpath) |
+ return files |
+ |
+def execute_program(args): |
+ """ |
+ Execute a process and wait for it to complete. Returns all |
+ output (stderr and stdout). |
+ |
+ @param args is passed into subprocess.Popen(). |
+ |
+ @returns a tuple (returncode, output) |
+ """ |
rmistry
2014/04/28 16:58:44
"""Executes a process and waits for it to complete
robertphillips
2014/04/28 17:45:58
Done.
|
+ proc = subprocess.Popen(args, stdout=subprocess.PIPE, stderr=subprocess.STDOUT) |
rmistry
2014/04/28 16:58:44
Nit: max line length in python is 80.
robertphillips
2014/04/28 17:45:58
Done.
|
+ output, ignore = proc.communicate() |
+ errcode = proc.returncode |
+ return (errcode, output) |
+ |
+class TestObj(object): |
+ |
+ def __init__(self): |
+ self.bench_pictures = find_path_to_program('bench_pictures') |
+ self.gpuveto = find_path_to_program('gpuveto') |
+ assert os.path.isfile(self.bench_pictures) |
+ assert os.path.isfile(self.gpuveto) |
+ self.truePositives = 0 |
+ self.falsePositives = 0 |
+ self.trueNegatives = 0 |
+ self.falseNegatives = 0 |
+ |
+ def process_skps(self, dir_or_file): |
+ for skp in enumerate(dir_or_file): |
+ self.process_skp(skp[1]) |
+ |
+ sys.stdout.write('TP %d FP %d TN %d FN %d\n' % (self.truePositives, |
+ self.falsePositives, |
+ self.trueNegatives, |
+ self.falseNegatives)) |
+ |
+ |
+ def process_skp(self, skp_file): |
+ assert os.path.isfile(skp_file) |
+ |
+ # run gpuveto on the skp |
+ args = [self.gpuveto, '-r', skp_file] |
+ returncode, output = execute_program(args) |
+ if (returncode != 0): |
+ return |
+ |
+ if ('unsuitable' in output): |
+ suitable = False |
+ else: |
+ assert 'suitable' in output |
+ suitable = True |
+ |
+ # run raster config |
+ args = [self.bench_pictures, '-r', skp_file, '--repeat', '20', '--config', '8888'] |
rmistry
2014/04/28 16:58:44
Nit: max line length in python is 80.
robertphillips
2014/04/28 17:45:58
Done.
|
+ returncode, output = execute_program(args) |
+ if (returncode != 0): |
+ return |
+ |
+ matches = re.findall('[\d.]+', output) |
+ if len(matches) != 4: |
+ return |
+ |
+ rasterTime = float(matches[3]) |
+ |
+ # run gpu config |
+ args2 = [self.bench_pictures, '-r', skp_file, '--repeat', '20', '--config', 'gpu'] |
rmistry
2014/04/28 16:58:44
Nit: max line length in python is 80.
robertphillips
2014/04/28 17:45:58
Done.
|
+ returncode, output = execute_program(args2) |
+ if (returncode != 0): |
+ return |
+ |
+ matches = re.findall('[\d.]+', output) |
+ if len(matches) != 4: |
+ return |
+ |
+ gpuTime = float(matches[3]) |
+ |
+ sys.stdout.write("%s: gpuveto: %d raster %.2f gpu: %.2f\n" % (skp_file, |
rmistry
2014/04/28 16:58:44
Move all arguments to the next line:
sys.stdout.w
robertphillips
2014/04/28 17:45:58
Done.
|
+ suitable, |
+ rasterTime, |
+ gpuTime)) |
+ |
+ if suitable: |
+ if gpuTime < rasterTime: |
+ self.truePositives += 1 |
+ else: |
+ self.falsePositives += 1 |
+ else: |
+ if gpuTime < rasterTime: |
+ self.falseNegatives += 1 |
+ else: |
+ self.trueNegatives += 1 |
+ |
+def main(main_argv): |
+ if not main_argv or main_argv[0] in ['-h', '-?', '-help', '--help']: |
rmistry
2014/04/28 16:58:44
Could you please use argparse instead for this? It
|
+ sys.stderr.write(USAGE.format(command=__file__)) |
+ return 1 |
+ TestObj().process_skps(list_files(main_argv)) |
+ |
+if __name__ == '__main__': |
+ exit(main(sys.argv[1])) |
rmistry
2014/04/28 16:58:44
Please use sys.exit(main(sys.argv[1])) instead.
robertphillips
2014/04/28 17:45:58
Done.
|
Property changes on: tools\test_gpuveto.py |
___________________________________________________________________ |
Added: svn:eol-style |
+ LF |