|  | #!/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. | 
|  |  | 
|  | """Script to test out suitableForGpuRasterization (via gpuveto)""" | 
|  |  | 
|  | import argparse | 
|  | 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 | 
|  |  | 
|  | def list_files(dir_or_file): | 
|  | """Returns a list of all the files from the provided argument | 
|  |  | 
|  | @param dir_or_file: either a directory or skp file | 
|  |  | 
|  | @returns a list containing the files in the directory or a single file | 
|  | """ | 
|  | 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): | 
|  | """Executes a process and waits for it to complete. | 
|  |  | 
|  | @param args: is passed into subprocess.Popen(). | 
|  |  | 
|  | @returns a tuple of the process output (returncode, output) | 
|  | """ | 
|  | proc = subprocess.Popen(args, stdout=subprocess.PIPE, | 
|  | stderr=subprocess.STDOUT) | 
|  | output, _ = proc.communicate() | 
|  | errcode = proc.returncode | 
|  | return (errcode, output) | 
|  |  | 
|  |  | 
|  | class GpuVeto(object): | 
|  |  | 
|  | def __init__(self): | 
|  | self.bench_pictures = find_run_binary.find_path_to_program( | 
|  | 'bench_pictures') | 
|  | sys.stdout.write('Running: %s\n' % (self.bench_pictures)) | 
|  | self.gpuveto = find_run_binary.find_path_to_program('gpuveto') | 
|  | assert os.path.isfile(self.bench_pictures) | 
|  | assert os.path.isfile(self.gpuveto) | 
|  | self.indeterminate = 0 | 
|  | 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 IND %d\n' % (self.truePositives, | 
|  | self.falsePositives, | 
|  | self.trueNegatives, | 
|  | self.falseNegatives, | 
|  | self.indeterminate)) | 
|  |  | 
|  |  | 
|  | def process_skp(self, skp_file): | 
|  | assert os.path.isfile(skp_file) | 
|  | #print 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', | 
|  | '--timers', 'w', | 
|  | '--config', '8888'] | 
|  | returncode, output = execute_program(args) | 
|  | if (returncode != 0): | 
|  | return | 
|  |  | 
|  | matches = re.findall('[\d]+\.[\d]+', output) | 
|  | if len(matches) != 1: | 
|  | return | 
|  |  | 
|  | rasterTime = float(matches[0]) | 
|  |  | 
|  | # run gpu config | 
|  | args2 = [self.bench_pictures, '-r', skp_file, | 
|  | '--repeat', '20', | 
|  | '--timers', 'w', | 
|  | '--config', 'gpu'] | 
|  | returncode, output = execute_program(args2) | 
|  | if (returncode != 0): | 
|  | return | 
|  |  | 
|  | matches = re.findall('[\d]+\.[\d]+', output) | 
|  | if len(matches) != 1: | 
|  | return | 
|  |  | 
|  | gpuTime = float(matches[0]) | 
|  |  | 
|  | # happens if page is too big it will not render | 
|  | if 0 == gpuTime: | 
|  | return | 
|  |  | 
|  | tolerance = 0.05 | 
|  | tol_range = tolerance * gpuTime | 
|  |  | 
|  |  | 
|  | if rasterTime > gpuTime - tol_range and rasterTime < gpuTime + tol_range: | 
|  | result = "NONE" | 
|  | self.indeterminate += 1 | 
|  | elif suitable: | 
|  | if gpuTime < rasterTime: | 
|  | self.truePositives += 1 | 
|  | result = "TP" | 
|  | else: | 
|  | self.falsePositives += 1 | 
|  | result = "FP" | 
|  | else: | 
|  | if gpuTime < rasterTime: | 
|  | self.falseNegatives += 1 | 
|  | result = "FN" | 
|  | else: | 
|  | self.trueNegatives += 1 | 
|  | result = "TN" | 
|  |  | 
|  |  | 
|  | sys.stdout.write('%s: gpuveto: %d raster %.2f gpu: %.2f  Result: %s\n' % ( | 
|  | skp_file, suitable, rasterTime, gpuTime, result)) | 
|  |  | 
|  | def main(main_argv): | 
|  | parser = argparse.ArgumentParser() | 
|  | parser.add_argument('--skp_path', | 
|  | help='Path to the SKP(s). Can either be a directory ' \ | 
|  | 'containing SKPs or a single SKP.', | 
|  | required=True) | 
|  |  | 
|  | args = parser.parse_args() | 
|  | GpuVeto().process_skps(list_files(args.skp_path)) | 
|  |  | 
|  | if __name__ == '__main__': | 
|  | sys.exit(main(sys.argv[1])) |