Changeset 7141


Ignore:
Timestamp:
Jun 1, 2009, 4:24:20 PM (11 years ago)
Author:
rwilson
Message:

Changes to print only 'max error' if in quiet mode.

File:
1 edited

Legend:

Unmodified
Added
Removed
  • branches/numpy_anuga_validation/automated_validation_tests/patong_beach_validation/cmpsww.py

    r6974 r7141  
    2121#####
    2222
    23 # allowable 'slop' when testing two float values
    24 epsilon = 1.0e-9
     23# Global for the '-q' quiet flag
     24quiet = None
     25
     26# default tolerances - same as numpy defaults
     27default_abs_tolerance = 1.0e-08
     28default_rel_tolerance = 1.0000000000000001e-05
    2529
    2630# Global attributes that should exist and be same in both files
     
    6973# @param variables A list of variable names to compare.
    7074# @return Returns if files 'equal', else raises RuntimeError.
    71 def files_are_the_same(files, globals=None, timesteps=None, variables=None):
     75def files_are_the_same(files, globals=None, timesteps=None, variables=None,
     76                       rel_tolerance=default_rel_tolerance,
     77                       abs_tolerance=default_abs_tolerance):
    7278    # split out the filenames and check they exist
    7379    (file1, file2) = files
     
    232238
    233239    # check data variables, be clever with time series data
     240    max_difference = -1
     241    diff_count = 0
    234242    for var_name in variables:
    235243        var_dims = expected_variables[var_name]
     
    239247                var1 = num.array(fid1.variables[var_name][t,:])
    240248                var2 = num.array(fid2.variables[var_name][t,:])
    241                 if var1 != var2:
     249                if not num.allclose(var1, var2,
     250                                    rtol=rel_tolerance, atol=abs_tolerance):
     251                    error = True
    242252                    for i in xrange(len(var1)):
    243                         if var1[i] != var2[i]:
    244                             error_msg += ('\nFiles differ in variable '
    245                                               '%s[%d,%d]:\n'
    246                                           '%s: %f\n'
    247                                           '%s: %f\n'
    248                                           'difference=%f\n'
    249                                           % (var_name, t, i,
    250                                              filename1, var1[i],
    251                                              filename2, var2[i],
    252                                              var1[i]-var2[i]))
    253                             break
    254                     error = True
     253                        if not num.allclose(var1[i], var2[i],
     254                                            rtol=rel_tolerance,
     255                                            atol=abs_tolerance):
     256                            if not quiet:
     257                                error_msg += ('\nFiles differ in variable '
     258                                                  '%s[%d,%d]:\n'
     259                                              '%s: %f\n'
     260                                              '%s: %f\n'
     261                                              'difference=%e\n'
     262                                              % (var_name, t, i,
     263                                                 filename1, var1[i],
     264                                                 filename2, var2[i],
     265                                                 num.abs(var1[i]-var2[i])))
     266                            max_difference = max(max_difference,
     267                                                 num.abs(var1[i]-var2[i]))
     268                            diff_count += 1
    255269        else:
    256270            # simple data, check whole thing at once
    257271            var1 = num.array(fid1.variables[var_name][:])
    258272            var2 = num.array(fid2.variables[var_name][:])
    259             if not num.allclose(var1, var2):
     273            if not num.allclose(var1, var2,
     274                                rtol=rel_tolerance, atol=abs_tolerance):
    260275                for j in xrange(len(var1)):
    261                     if abs(var1[j] - var2[j]) > epsilon:
    262                         error_msg += ('\nFiles differ in variable '
    263                                       '%s[%d]:\n'
    264                                       '%s: %f\n'
    265                                       '%s: %f\n'
    266                                       'difference=%f\n'
    267                                        % (var_name, j, 
    268                                           filename1, var1[j],
    269                                           filename2, var2[j],
    270                                           var1[j]-var2[j]))
    271                         break
     276                    if not num.allclose(var1[j], var2[j],
     277                                          rtol=rel_tolerance, atol=abs_tolerance):
     278                        if not quiet:
     279                            error_msg += ('\nFiles differ in variable '
     280                                          '%s[%d]:\n'
     281                                          '%s: %f\n'
     282                                          '%s: %f\n'
     283                                          'difference=%e\n'
     284                                           % (var_name, j, 
     285                                              filename1, var1[j],
     286                                              filename2, var2[j],
     287                                              num.abs(var1[j]-var2[j])))
     288                        max_difference = max(max_difference,
     289                                             num.abs(var1[i]-var2[i]))
     290                        diff_count += 1
    272291                error = True
    273292
     
    280299
    281300    if error:
     301        error_msg += ('\nNumber of data differences=%d\n'
     302                      'Maximum data difference=%e\n'
     303                      % (diff_count, max_difference))
    282304        raise RuntimeError, error_msg
    283305
     
    293315    a('where <options> is zero or more of:\n')
    294316    a('                   -h        print this help\n')
     317    a('                   -q        be quiet, print only summary of differences\n')
    295318    a("                   -a <val>  set absolute threshold of 'equivalent'\n")
    296319    a("                   -r <val>  set relative threshold of 'equivalent'\n")
     
    319342# @return The status code the program will exit with.
    320343def main(argv=None):
     344    global quiet
     345
    321346    if argv is None:
    322347        argv = sys.argv
     
    324349    try:
    325350        try:
    326             opts, args = getopt.getopt(argv[1:], 'hg:t:v:',
     351            opts, args = getopt.getopt(argv[1:], 'hqa:g:r:t:v:',
    327352                                       ['help', 'globals',
    328353                                        'variables', 'timesteps'])
     
    338363    timesteps = None
    339364    variables = None
     365    quiet = False
     366    rel_tolerance = default_rel_tolerance
     367    abs_tolerance = default_abs_tolerance
    340368    for opt, arg in opts:
    341369        if opt in ('-h', '--help'):
    342370            print usage()
    343371            sys.exit(0)
     372        elif opt in ('-q', '--quiet'):
     373            quiet = True
     374        elif opt in ('-a', '--absolute'):
     375            abs_tolerance = float(arg)
     376        elif opt in ('-r', '--relative'):
     377            rel_tolerance = float(arg)
    344378        elif opt in ('-g', '--globals'):
    345379            globals = arg.split(',')
     
    357391    try:
    358392        files_are_the_same(args, globals=globals,
    359                            timesteps=timesteps, variables=variables)
     393                           timesteps=timesteps, variables=variables,
     394                           rel_tolerance=rel_tolerance,
     395                           abs_tolerance=abs_tolerance)
    360396    except RuntimeError, msg:
    361397         print msg
Note: See TracChangeset for help on using the changeset viewer.