Changeset a08c47f in sasmodels for sasmodels/model_test.py
- Timestamp:
- Mar 11, 2019 10:43:15 AM (5 years ago)
- Branches:
- master, core_shell_microgels, magnetic_model, ticket-1257-vesicle-product, ticket_1156, ticket_1265_superball, ticket_822_more_unit_tests
- Children:
- c11d09f
- Parents:
- b9c7379 (diff), e589e9a (diff)
Note: this is a merge changeset, the changes displayed below correspond to the merge itself.
Use the (diff) links above to see all the changes relative to each parent. - File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
sasmodels/model_test.py
rb9c7379 ra08c47f 48 48 import sys 49 49 import unittest 50 import traceback 50 51 51 52 try: … … 77 78 # pylint: enable=unused-import 78 79 79 80 80 def make_suite(loaders, models): 81 81 # type: (List[str], List[str]) -> unittest.TestSuite … … 88 88 *models* is the list of models to test, or *["all"]* to test all models. 89 89 """ 90 ModelTestCase = _hide_model_case_from_nose()91 90 suite = unittest.TestSuite() 92 91 … … 97 96 skip = [] 98 97 for model_name in models: 99 if model_name in skip: 100 continue 101 model_info = load_model_info(model_name) 102 103 #print('------') 104 #print('found tests in', model_name) 105 #print('------') 106 107 # if ispy then use the dll loader to call pykernel 108 # don't try to call cl kernel since it will not be 109 # available in some environmentes. 110 is_py = callable(model_info.Iq) 111 112 # Some OpenCL drivers seem to be flaky, and are not producing the 113 # expected result. Since we don't have known test values yet for 114 # all of our models, we are instead going to compare the results 115 # for the 'smoke test' (that is, evaluation at q=0.1 for the default 116 # parameters just to see that the model runs to completion) between 117 # the OpenCL and the DLL. To do this, we define a 'stash' which is 118 # shared between OpenCL and DLL tests. This is just a list. If the 119 # list is empty (which it will be when DLL runs, if the DLL runs 120 # first), then the results are appended to the list. If the list 121 # is not empty (which it will be when OpenCL runs second), the results 122 # are compared to the results stored in the first element of the list. 123 # This is a horrible stateful hack which only makes sense because the 124 # test suite is thrown away after being run once. 125 stash = [] 126 127 if is_py: # kernel implemented in python 128 test_name = "%s-python"%model_name 129 test_method_name = "test_%s_python" % model_info.id 98 if model_name not in skip: 99 model_info = load_model_info(model_name) 100 _add_model_to_suite(loaders, suite, model_info) 101 102 return suite 103 104 def _add_model_to_suite(loaders, suite, model_info): 105 ModelTestCase = _hide_model_case_from_nose() 106 107 #print('------') 108 #print('found tests in', model_name) 109 #print('------') 110 111 # if ispy then use the dll loader to call pykernel 112 # don't try to call cl kernel since it will not be 113 # available in some environmentes. 114 is_py = callable(model_info.Iq) 115 116 # Some OpenCL drivers seem to be flaky, and are not producing the 117 # expected result. Since we don't have known test values yet for 118 # all of our models, we are instead going to compare the results 119 # for the 'smoke test' (that is, evaluation at q=0.1 for the default 120 # parameters just to see that the model runs to completion) between 121 # the OpenCL and the DLL. To do this, we define a 'stash' which is 122 # shared between OpenCL and DLL tests. This is just a list. If the 123 # list is empty (which it will be when DLL runs, if the DLL runs 124 # first), then the results are appended to the list. If the list 125 # is not empty (which it will be when OpenCL runs second), the results 126 # are compared to the results stored in the first element of the list. 127 # This is a horrible stateful hack which only makes sense because the 128 # test suite is thrown away after being run once. 129 stash = [] 130 131 if is_py: # kernel implemented in python 132 test_name = "%s-python"%model_info.name 133 test_method_name = "test_%s_python" % model_info.id 134 test = ModelTestCase(test_name, model_info, 135 test_method_name, 136 platform="dll", # so that 137 dtype="double", 138 stash=stash) 139 suite.addTest(test) 140 else: # kernel implemented in C 141 142 # test using dll if desired 143 if 'dll' in loaders or not use_opencl(): 144 test_name = "%s-dll"%model_info.name 145 test_method_name = "test_%s_dll" % model_info.id 130 146 test = ModelTestCase(test_name, model_info, 131 test_method_name,132 platform="dll", # so that133 dtype="double",134 stash=stash)147 test_method_name, 148 platform="dll", 149 dtype="double", 150 stash=stash) 135 151 suite.addTest(test) 136 else: # kernel implemented in C 137 138 # test using dll if desired 139 if 'dll' in loaders: 140 test_name = "%s-dll"%model_name 141 test_method_name = "test_%s_dll" % model_info.id 142 test = ModelTestCase(test_name, model_info, 143 test_method_name, 144 platform="dll", 145 dtype="double", 146 stash=stash) 147 suite.addTest(test) 148 149 # test using opencl if desired and available 150 if 'opencl' in loaders and use_opencl(): 151 test_name = "%s-opencl"%model_name 152 test_method_name = "test_%s_opencl" % model_info.id 153 # Using dtype=None so that the models that are only 154 # correct for double precision are not tested using 155 # single precision. The choice is determined by the 156 # presence of *single=False* in the model file. 157 test = ModelTestCase(test_name, model_info, 158 test_method_name, 159 platform="ocl", dtype=None, 160 stash=stash) 161 #print("defining", test_name) 162 suite.addTest(test) 163 164 # test using cuda if desired and available 165 if 'cuda' in loaders and use_cuda(): 166 test_name = "%s-cuda"%model_name 167 test_method_name = "test_%s_cuda" % model_info.id 168 # Using dtype=None so that the models that are only 169 # correct for double precision are not tested using 170 # single precision. The choice is determined by the 171 # presence of *single=False* in the model file. 172 test = ModelTestCase(test_name, model_info, 173 test_method_name, 174 platform="cuda", dtype=None, 175 stash=stash) 176 #print("defining", test_name) 177 suite.addTest(test) 178 179 return suite 152 153 # test using opencl if desired and available 154 if 'opencl' in loaders and use_opencl(): 155 test_name = "%s-opencl"%model_info.name 156 test_method_name = "test_%s_opencl" % model_info.id 157 # Using dtype=None so that the models that are only 158 # correct for double precision are not tested using 159 # single precision. The choice is determined by the 160 # presence of *single=False* in the model file. 161 test = ModelTestCase(test_name, model_info, 162 test_method_name, 163 platform="ocl", dtype=None, 164 stash=stash) 165 #print("defining", test_name) 166 suite.addTest(test) 167 168 # test using cuda if desired and available 169 if 'cuda' in loaders and use_cuda(): 170 test_name = "%s-cuda"%model_name 171 test_method_name = "test_%s_cuda" % model_info.id 172 # Using dtype=None so that the models that are only 173 # correct for double precision are not tested using 174 # single precision. The choice is determined by the 175 # presence of *single=False* in the model file. 176 test = ModelTestCase(test_name, model_info, 177 test_method_name, 178 platform="cuda", dtype=None, 179 stash=stash) 180 #print("defining", test_name) 181 suite.addTest(test) 182 180 183 181 184 def _hide_model_case_from_nose(): … … 384 387 for par in sorted(pars.keys()): 385 388 # special handling of R_eff mode, which is not a usual parameter 386 if par == 'radius_effective_type':389 if par == product.RADIUS_MODE_ID: 387 390 continue 388 391 parts = par.split('_pd') … … 404 407 return abs(target-actual)/shift < 1.5*10**-digits 405 408 406 def run_one(model): 407 # type: (str) -> str 408 """ 409 Run the tests for a single model, printing the results to stdout. 410 411 *model* can by a python file, which is handy for checking user defined 412 plugin models. 409 # CRUFT: old interface; should be deprecated and removed 410 def run_one(model_name): 411 # msg = "use check_model(model_info) rather than run_one(model_name)" 412 # warnings.warn(msg, category=DeprecationWarning, stacklevel=2) 413 try: 414 model_info = load_model_info(model_name) 415 except Exception: 416 output = traceback.format_exc() 417 return output 418 419 success, output = check_model(model_info) 420 return output 421 422 def check_model(model_info): 423 # type: (ModelInfo) -> str 424 """ 425 Run the tests for a single model, capturing the output. 426 427 Returns success status and the output string. 413 428 """ 414 429 # Note that running main() directly did not work from within the … … 424 439 425 440 # Build a test suite containing just the model 426 loader = 'opencl' if use_opencl() else 'cuda' if use_cuda() else 'dll' 427 models = [model] 428 try: 429 suite = make_suite([loader], models) 430 except Exception: 431 import traceback 432 stream.writeln(traceback.format_exc()) 433 return 441 loaders = ['opencl' if use_opencl() else 'cuda' if use_cuda() else 'dll'] 442 suite = unittest.TestSuite() 443 _add_model_to_suite(loaders, suite, model_info) 434 444 435 445 # Warn if there are no user defined tests. … … 446 456 for test in suite: 447 457 if not test.info.tests: 448 stream.writeln("Note: %s has no user defined tests."%model )458 stream.writeln("Note: %s has no user defined tests."%model_info.name) 449 459 break 450 460 else: … … 462 472 output = stream.getvalue() 463 473 stream.close() 464 return output474 return result.wasSuccessful(), output 465 475 466 476
Note: See TracChangeset
for help on using the changeset viewer.