| #! /usr/bin/env python | |
| # -*- coding: utf-8 -*- | |
| # | |
| # SPDX-FileCopyrightText: 1992-2013 The University of Tennessee and The University of Tennessee Research Foundation | |
| # SPDX-FileCopyrightText: 2000-2013 The University of California Berkeley | |
| # SPDX-FileCopyrightText: 2006-2013 The University of Colorado Denver | |
| # SPDX-FileCopyrightText: The Eigen Authors | |
| # SPDX-License-Identifier: BSD-3-Clause | |
| # | |
| ############################################################################### | |
| # lapack_testing.py | |
| ############################################################################### | |
| from __future__ import print_function | |
| 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 as 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+" directory\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, end="") | |
| whereisout= words_in_line.index("out") | |
| nb_test_fail+=int(words_in_line[whereisout-1]) | |
| if (line.find("illegal")!=-1): | |
| if (short_summary==0):print(line, end="") | |
| nb_test_illegal+=1 | |
| if (line.find(" INFO")!=-1): | |
| if (short_summary==0):print(line, end="") | |
| 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() |