319 lines
		
	
	
		
			12 KiB
		
	
	
	
		
			Python
		
	
	
		
			Executable File
		
	
	
			
		
		
	
	
			319 lines
		
	
	
		
			12 KiB
		
	
	
	
		
			Python
		
	
	
		
			Executable File
		
	
	
#! /usr/bin/env python
 | 
						|
# -*- coding: utf-8 -*-
 | 
						|
 | 
						|
 | 
						|
###############################################################################
 | 
						|
# lapack_testing.py  
 | 
						|
###############################################################################
 | 
						|
 | 
						|
 | 
						|
from subprocess import Popen, STDOUT, PIPE 
 | 
						|
import os, sys, math
 | 
						|
import getopt
 | 
						|
# Arguments
 | 
						|
try:
 | 
						|
   opts, args = getopt.getopt(sys.argv[1:], "hd:srep:t:n", 
 | 
						|
                              ["help", "dir", "short", "run", "error","prec=","test=","number"])
 | 
						|
   
 | 
						|
except getopt.error, msg:
 | 
						|
   print msg
 | 
						|
   print "for help use --help"
 | 
						|
   sys.exit(2)
 | 
						|
 | 
						|
short_summary=0
 | 
						|
with_file=1
 | 
						|
just_errors = 0
 | 
						|
prec='x'
 | 
						|
test='all'
 | 
						|
only_numbers=0
 | 
						|
dir="TESTING"
 | 
						|
for o, a in opts:
 | 
						|
   if o in ("-h", "--help"):
 | 
						|
      print sys.argv[0]+" [-h|--help] [-d dir |--dir dir] [-s |--short] [-r |--run] [-e |--error] [-p p |--prec p] [-t test |--test test] [-n | --number]"
 | 
						|
      print "     - h is to print this message"
 | 
						|
      print "     - r is to use to run the LAPACK tests then analyse the output (.out files). By default, the script will not run all the LAPACK tests"
 | 
						|
      print "     - d [dir] is to indicate where is the LAPACK testing directory (.out files). By default, the script will use ."
 | 
						|
      print " LEVEL OF OUTPUT"
 | 
						|
      print "     - x is to print a detailed summary"
 | 
						|
      print "     - e is to print only the error summary"
 | 
						|
      print "     - s is to print a short summary"
 | 
						|
      print "     - n is to print the numbers of failing tests (turn on summary mode)"
 | 
						|
      print " SECLECTION OF TESTS:"
 | 
						|
      print "     - p [s/c/d/z/x] is to indicate the PRECISION to run:"
 | 
						|
      print "            s=single"
 | 
						|
      print "            d=double"
 | 
						|
      print "            sd=single/double"
 | 
						|
      print "            c=complex"
 | 
						|
      print "            z=double complex"
 | 
						|
      print "            cz=complex/double complex"
 | 
						|
      print "            x=all [DEFAULT]"
 | 
						|
      print "     - t [lin/eig/mixed/rfp/all] is to indicate which TEST FAMILY to run:"
 | 
						|
      print "            lin=Linear Equation"
 | 
						|
      print "            eig=Eigen Problems"
 | 
						|
      print "            mixed=mixed-precision"
 | 
						|
      print "            rfp=rfp format"
 | 
						|
      print "            all=all tests [DEFAULT]"
 | 
						|
      print " EXAMPLES:"
 | 
						|
      print "     ./lapack_testing.py -n"
 | 
						|
      print "            Will return the numbers of failed tests by analyzing the LAPACK output"
 | 
						|
      print "     ./lapack_testing.py -n -r -p s"
 | 
						|
      print "            Will return the numbers of failed tests in REAL precision by running the LAPACK Tests then analyzing the output"
 | 
						|
      print "     ./lapack_testing.py -n -p s -t eig "
 | 
						|
      print "            Will return the numbers of failed tests in REAL precision by analyzing only the LAPACK output of EIGEN testings"
 | 
						|
      print "Written by Julie Langou (June 2011) "
 | 
						|
      sys.exit(0)
 | 
						|
   else:
 | 
						|
      if o in ("-s", "--short"):
 | 
						|
         short_summary = 1
 | 
						|
      if o in ("-r", "--run"):
 | 
						|
         with_file = 0
 | 
						|
      if o in ("-e", "--error"):
 | 
						|
         just_errors = 1
 | 
						|
      if o in ( '-p', '--prec' ):
 | 
						|
         prec = a
 | 
						|
      if o in ( '-d', '--dir' ):
 | 
						|
         dir = a
 | 
						|
      if o in ( '-t', '--test' ):
 | 
						|
         test = a
 | 
						|
      if o in ( '-n', '--number' ):
 | 
						|
         only_numbers = 1
 | 
						|
         short_summary = 1
 | 
						|
 | 
						|
# process options
 | 
						|
os.chdir(dir)
 | 
						|
execution=1
 | 
						|
summary="\n\t\t\t-->   LAPACK TESTING SUMMARY  <--\n";
 | 
						|
if with_file: summary+= "\t\tProcessing LAPACK Testing output found in the "+dir+" direcory\n";
 | 
						|
summary+="SUMMARY             \tnb test run \tnumerical error   \tother error  \n";
 | 
						|
summary+="================   \t===========\t=================\t================  \n";
 | 
						|
nb_of_test=0
 | 
						|
 | 
						|
# Add current directory to the path for subshells of this shell
 | 
						|
# Allows the popen to find local files in both windows and unixes
 | 
						|
os.environ["PATH"] = os.environ["PATH"]+":."
 | 
						|
 | 
						|
# Define a function to open the executable (different filenames on unix and Windows)
 | 
						|
def run_summary_test( f, cmdline, short_summary):
 | 
						|
   nb_test_run=0
 | 
						|
   nb_test_fail=0
 | 
						|
   nb_test_illegal=0
 | 
						|
   nb_test_info=0
 | 
						|
   if (with_file):
 | 
						|
      if not os.path.exists(cmdline):
 | 
						|
        error_message=cmdline+" file not found"
 | 
						|
        r=1
 | 
						|
        if short_summary: return [nb_test_run,nb_test_fail,nb_test_illegal,nb_test_info]
 | 
						|
      else:
 | 
						|
        pipe = open(cmdline,'r')
 | 
						|
        r=0
 | 
						|
   else:
 | 
						|
      if os.name != 'nt':
 | 
						|
         cmdline="./" + cmdline
 | 
						|
 | 
						|
      outfile=cmdline.split()[4]
 | 
						|
      pipe = open(outfile,'w')
 | 
						|
      p = Popen(cmdline, shell=True, stdout=pipe)
 | 
						|
      p.wait()
 | 
						|
      pipe.close()
 | 
						|
      r=p.returncode
 | 
						|
      pipe = open(outfile,'r')
 | 
						|
      error_message=cmdline+" did not work"
 | 
						|
 | 
						|
   if r != 0 and not with_file:
 | 
						|
       print "---- TESTING " + cmdline.split()[0] + "... FAILED(" + error_message +") !"
 | 
						|
       for line in pipe.readlines():
 | 
						|
          f.write(str(line))
 | 
						|
   elif r != 0 and with_file and not short_summary:
 | 
						|
       print "---- WARNING: please check that you have the LAPACK output : "+cmdline+"!"
 | 
						|
       print "---- WARNING: with the option -r, we can run the LAPACK testing for you"
 | 
						|
      # print "---- "+error_message
 | 
						|
   else:
 | 
						|
         for line in pipe.readlines():
 | 
						|
        	f.write(str(line))
 | 
						|
        	words_in_line=line.split()
 | 
						|
        	if (line.find("run")!=-1):
 | 
						|
#        	   print line
 | 
						|
        	   whereisrun=words_in_line.index("run)")
 | 
						|
        	   nb_test_run+=int(words_in_line[whereisrun-2])
 | 
						|
        	if (line.find("out of")!=-1):
 | 
						|
        	   if (short_summary==0): print line,
 | 
						|
        	   whereisout= words_in_line.index("out")
 | 
						|
        	   nb_test_fail+=int(words_in_line[whereisout-1])
 | 
						|
        	if ((line.find("illegal")!=-1) or (line.find("Illegal")!=-1)):
 | 
						|
        	   if (short_summary==0):print line,
 | 
						|
        	   nb_test_illegal+=1
 | 
						|
        	if (line.find(" INFO")!=-1):
 | 
						|
        	   if (short_summary==0):print line,
 | 
						|
        	   nb_test_info+=1
 | 
						|
        	if (with_file==1):
 | 
						|
        	   pipe.close()
 | 
						|
           
 | 
						|
   f.flush();
 | 
						|
 | 
						|
   return [nb_test_run,nb_test_fail,nb_test_illegal,nb_test_info]
 | 
						|
 | 
						|
 | 
						|
# If filename cannot be opened, send output to sys.stderr
 | 
						|
filename = "testing_results.txt"
 | 
						|
try:
 | 
						|
     f = open(filename, 'w')
 | 
						|
except IOError:
 | 
						|
     f = sys.stdout
 | 
						|
 | 
						|
if (short_summary==0):
 | 
						|
   print " "
 | 
						|
   print "---------------- Testing LAPACK Routines ----------------"
 | 
						|
   print " "
 | 
						|
   print "-- Detailed results are stored in", filename
 | 
						|
 | 
						|
dtypes = (
 | 
						|
("s", "d", "c", "z"),
 | 
						|
("REAL             ", "DOUBLE PRECISION", "COMPLEX          ", "COMPLEX16         "),
 | 
						|
)
 | 
						|
 | 
						|
if prec=='s':
 | 
						|
   range_prec=[0]
 | 
						|
elif prec=='d':
 | 
						|
   range_prec=[1]
 | 
						|
elif prec=='sd':
 | 
						|
   range_prec=[0,1]
 | 
						|
elif prec=='c':
 | 
						|
   range_prec=[2]
 | 
						|
elif prec=='z':
 | 
						|
   range_prec=[3]
 | 
						|
elif prec=='cz':
 | 
						|
   range_prec=[2,3]
 | 
						|
else: 
 | 
						|
   prec='x';
 | 
						|
   range_prec=range(4)
 | 
						|
 | 
						|
if test=='lin':
 | 
						|
   range_test=[15]
 | 
						|
elif test=='mixed':
 | 
						|
   range_test=[16]
 | 
						|
   range_prec=[1,3]
 | 
						|
elif test=='rfp':
 | 
						|
   range_test=[17]
 | 
						|
elif test=='eig':
 | 
						|
   range_test=range(15)
 | 
						|
else:  
 | 
						|
   range_test=range(18)
 | 
						|
 | 
						|
list_results = [
 | 
						|
[0, 0, 0, 0, 0],
 | 
						|
[0, 0, 0, 0, 0],
 | 
						|
[0, 0, 0, 0, 0],
 | 
						|
[0, 0, 0, 0, 0],
 | 
						|
]
 | 
						|
 | 
						|
for dtype in range_prec:
 | 
						|
  letter = dtypes[0][dtype]
 | 
						|
  name = dtypes[1][dtype]
 | 
						|
 | 
						|
  if (short_summary==0):
 | 
						|
     print " "
 | 
						|
     print "------------------------- %s ------------------------" % name
 | 
						|
     print " "
 | 
						|
     sys.stdout.flush()
 | 
						|
 | 
						|
 | 
						|
  dtests = (
 | 
						|
  ("nep", "sep", "svd",
 | 
						|
  letter+"ec",letter+"ed",letter+"gg",
 | 
						|
  letter+"gd",letter+"sb",letter+"sg",
 | 
						|
  letter+"bb","glm","gqr",
 | 
						|
  "gsv","csd","lse",
 | 
						|
  letter+"test", letter+dtypes[0][dtype-1]+"test",letter+"test_rfp"),
 | 
						|
  ("Nonsymmetric Eigenvalue Problem", "Symmetric Eigenvalue Problem", "Singular Value Decomposition",
 | 
						|
  "Eigen Condition","Nonsymmetric Eigenvalue","Nonsymmetric Generalized Eigenvalue Problem",
 | 
						|
  "Nonsymmetric Generalized Eigenvalue Problem driver", "Symmetric Eigenvalue Problem", "Symmetric Eigenvalue Generalized Problem",
 | 
						|
  "Banded Singular Value Decomposition routines", "Generalized Linear Regression Model routines", "Generalized QR and RQ factorization routines",
 | 
						|
  "Generalized Singular Value Decomposition routines", "CS Decomposition routines", "Constrained Linear Least Squares routines",
 | 
						|
  "Linear Equation routines", "Mixed Precision linear equation routines","RFP linear equation routines"),
 | 
						|
  (letter+"nep", letter+"sep", letter+"svd",
 | 
						|
  letter+"ec",letter+"ed",letter+"gg",
 | 
						|
  letter+"gd",letter+"sb",letter+"sg",
 | 
						|
  letter+"bb",letter+"glm",letter+"gqr",
 | 
						|
  letter+"gsv",letter+"csd",letter+"lse",
 | 
						|
  letter+"test", letter+dtypes[0][dtype-1]+"test",letter+"test_rfp"),
 | 
						|
  )
 | 
						|
 | 
						|
 | 
						|
  for dtest in range_test:
 | 
						|
     nb_of_test=0
 | 
						|
     # NEED TO SKIP SOME PRECISION (namely s and c) FOR PROTO MIXED PRECISION TESTING
 | 
						|
     if dtest==16 and (letter=="s" or letter=="c"):
 | 
						|
        continue
 | 
						|
     if (with_file==1):
 | 
						|
        cmdbase=dtests[2][dtest]+".out"
 | 
						|
     else:
 | 
						|
        if dtest==15:
 | 
						|
           # LIN TESTS
 | 
						|
           cmdbase="xlintst"+letter+" < "+dtests[0][dtest]+".in > "+dtests[2][dtest]+".out"
 | 
						|
        elif dtest==16:
 | 
						|
           # PROTO LIN TESTS
 | 
						|
           cmdbase="xlintst"+letter+dtypes[0][dtype-1]+" < "+dtests[0][dtest]+".in > "+dtests[2][dtest]+".out"
 | 
						|
        elif dtest==17:
 | 
						|
           # PROTO LIN TESTS
 | 
						|
           cmdbase="xlintstrf"+letter+" < "+dtests[0][dtest]+".in > "+dtests[2][dtest]+".out"
 | 
						|
        else:
 | 
						|
           # EIG TESTS
 | 
						|
           cmdbase="xeigtst"+letter+" < "+dtests[0][dtest]+".in > "+dtests[2][dtest]+".out"
 | 
						|
     if (not just_errors and not short_summary):
 | 
						|
        print "-->  Testing "+name+" "+dtests[1][dtest]+" [ "+cmdbase+" ]"
 | 
						|
     # Run the process: either to read the file or run the LAPACK testing   
 | 
						|
     nb_test = run_summary_test(f, cmdbase, short_summary)
 | 
						|
     list_results[0][dtype]+=nb_test[0]
 | 
						|
     list_results[1][dtype]+=nb_test[1]
 | 
						|
     list_results[2][dtype]+=nb_test[2]
 | 
						|
     list_results[3][dtype]+=nb_test[3]
 | 
						|
     got_error=nb_test[1]+nb_test[2]+nb_test[3]
 | 
						|
     
 | 
						|
     if (not short_summary):
 | 
						|
        if (nb_test[0]>0 and just_errors==0):
 | 
						|
           print "-->  Tests passed: "+str(nb_test[0])
 | 
						|
        if (nb_test[1]>0):
 | 
						|
           print "-->  Tests failing to pass the threshold: "+str(nb_test[1])
 | 
						|
        if (nb_test[2]>0):
 | 
						|
           print "-->  Illegal Error: "+str(nb_test[2])
 | 
						|
        if (nb_test[3]>0):
 | 
						|
           print "-->  Info Error: "+str(nb_test[3])
 | 
						|
        if (got_error>0 and just_errors==1):
 | 
						|
           print "ERROR IS LOCATED IN "+name+" "+dtests[1][dtest]+" [ "+cmdbase+" ]"
 | 
						|
           print ""
 | 
						|
        if (just_errors==0):
 | 
						|
           print ""
 | 
						|
#     elif (got_error>0):
 | 
						|
#        print dtests[2][dtest]+".out \t"+str(nb_test[1])+"\t"+str(nb_test[2])+"\t"+str(nb_test[3])
 | 
						|
        
 | 
						|
     sys.stdout.flush()
 | 
						|
  if (list_results[0][dtype] > 0 ):
 | 
						|
     percent_num_error=float(list_results[1][dtype])/float(list_results[0][dtype])*100
 | 
						|
     percent_error=float(list_results[2][dtype]+list_results[3][dtype])/float(list_results[0][dtype])*100
 | 
						|
  else:
 | 
						|
     percent_num_error=0
 | 
						|
     percent_error=0
 | 
						|
  summary+=name+"\t"+str(list_results[0][dtype])+"\t\t"+str(list_results[1][dtype])+"\t("+"%.3f" % percent_num_error+"%)\t"+str(list_results[2][dtype]+list_results[3][dtype])+"\t("+"%.3f" % percent_error+"%)\t""\n"
 | 
						|
  list_results[0][4]+=list_results[0][dtype]
 | 
						|
  list_results[1][4]+=list_results[1][dtype]
 | 
						|
  list_results[2][4]+=list_results[2][dtype]
 | 
						|
  list_results[3][4]+=list_results[3][dtype]
 | 
						|
  
 | 
						|
if only_numbers==1:
 | 
						|
   print str(list_results[1][4])+"\n"+str(list_results[2][4]+list_results[3][4])
 | 
						|
else:
 | 
						|
   print summary
 | 
						|
   if (list_results[0][4] > 0 ):
 | 
						|
      percent_num_error=float(list_results[1][4])/float(list_results[0][4])*100
 | 
						|
      percent_error=float(list_results[2][4]+list_results[3][4])/float(list_results[0][4])*100
 | 
						|
   else:
 | 
						|
      percent_num_error=0
 | 
						|
      percent_error=0
 | 
						|
   if (prec=='x'):
 | 
						|
        print "--> ALL PRECISIONS\t"+str(list_results[0][4])+"\t\t"+str(list_results[1][4])+"\t("+"%.3f" % percent_num_error+"%)\t"+str(list_results[2][4]+list_results[3][4])+"\t("+"%.3f" % percent_error+"%)\t""\n"
 | 
						|
   if list_results[0][4] == 0:
 | 
						|
     print "NO TESTS WERE ANALYZED, please use the -r option to run the LAPACK TESTING"
 | 
						|
 | 
						|
# This may close the sys.stdout stream, so make it the last statement
 | 
						|
f.close()
 |