Changeset 3709366 in sasmodels


Ignore:
Timestamp:
Mar 28, 2019 11:53:36 AM (5 years ago)
Author:
Paul Kienzle <pkienzle@…>
Branches:
master, ticket-1257-vesicle-product, ticket_1156, ticket_822_more_unit_tests
Children:
e5cb3df
Parents:
6140894
Message:

simplify is_near test

File:
1 edited

Legend:

Unmodified
Added
Removed
  • sasmodels/model_test.py

    r6140894 r3709366  
    344344 
    345345        def _check_scalar(self, target, actual, name): 
    346             if target is None: 
    347                 # smoke test --- make sure it runs and produces a value 
    348                 self.assertTrue(not np.isnan(actual), 
    349                                 'invalid %s: %s' % (name, actual)) 
    350             elif np.isnan(target): 
    351                 # make sure nans match 
    352                 self.assertTrue(np.isnan(actual), 
    353                                 '%s: expected:%s; actual:%s' 
    354                                 % (name, target, actual)) 
    355             else: 
    356                 # is_near does not work for infinite values, so also test 
    357                 # for exact values. 
    358                 self.assertTrue(target == actual or is_near(target, actual, 5), 
    359                                 '%s: expected:%s; actual:%s' 
    360                                 % (name, target, actual)) 
     346            self.assertTrue(is_near(target, actual, 5), 
     347                            '%s: expected:%s; actual:%s' 
     348                            % (name, target, actual)) 
    361349 
    362350        def _check_vectors(self, x, target, actual, name='I'): 
     
    368356                             '%s(...) returned wrong length'%name) 
    369357            for xi, yi, actual_yi in zip(x, target, actual): 
    370                 if yi is None: 
    371                     # smoke test --- make sure it runs and produces a value 
    372                     self.assertTrue(not np.isnan(actual_yi), 
    373                                     'invalid %s(%s): %s' % (name, xi, actual_yi)) 
    374                 elif np.isnan(yi): 
    375                     # make sure nans match 
    376                     self.assertTrue(np.isnan(actual_yi), 
    377                                     '%s(%s): expected:%s; actual:%s' 
    378                                     % (name, xi, yi, actual_yi)) 
    379                 else: 
    380                     # is_near does not work for infinite values, so also test 
    381                     # for exact values. 
    382                     self.assertTrue(yi == actual_yi or is_near(yi, actual_yi, 5), 
    383                                     '%s(%s); expected:%s; actual:%s' 
    384                                     % (name, xi, yi, actual_yi)) 
     358                self.assertTrue(is_near(yi, actual_yi, 5), 
     359                                '%s(%s): expected:%s; actual:%s' 
     360                                % (name, xi, target, actual)) 
    385361 
    386362    return ModelTestCase 
     
    413389    """ 
    414390    Returns true if *actual* is within *digits* significant digits of *target*. 
    415     """ 
    416     import math 
    417     if target == 0.: 
     391 
     392    *taget* zero and inf should match *actual* zero and inf.  If you want to 
     393    accept eps for zero, choose a value such as 1e-10, which must match up to 
     394    +/- 1e-15 when *digits* is the default value of 5. 
     395 
     396    If *target* is None, then just make sure that *actual* is not NaN. 
     397 
     398    If *target* is NaN, make sure *actual* is NaN. 
     399    """ 
     400    if target is None: 
     401        # target is None => actual cannot be NaN 
     402        return not np.isnan(actual) 
     403    elif target == 0.: 
     404        # target is 0. => actual must be 0. 
     405        # Note: if small values are allowed, then use maybe test zero against eps instead? 
    418406        return actual == 0. 
    419     shift = 10**math.ceil(math.log10(np.abs(target))) 
    420     return np.abs(target-actual)/shift < 1.5*10**-digits 
     407    elif np.isfinite(target): 
     408        shift = np.ceil(np.log10(abs(target))) 
     409        return abs(target-actual) < 1.5*10**(shift-digits) 
     410    elif target == actual: 
     411        # target is inf => actual must be inf of same sign 
     412        return True 
     413    else: 
     414        # target is NaN => actual must be NaN 
     415        return np.isnan(target) == np.isnan(actual) 
    421416 
    422417# CRUFT: old interface; should be deprecated and removed 
Note: See TracChangeset for help on using the changeset viewer.