Changes in / [9ae85f0:c68c5e9] in sasmodels
- Location:
- sasmodels
- Files:
-
- 4 edited
Legend:
- Unmodified
- Added
- Removed
-
sasmodels/compare_many.py
r424fe00 r5124c969 106 106 header = ('\n"Model","%s","Count","%d","Dimension","%s"' 107 107 % (name, N, "2D" if is_2d else "1D")) 108 if not mono: header += ',"Cutoff",%g'%(cutoff,) 108 if not mono: 109 header += ',"Cutoff",%g'%(cutoff,) 109 110 print(header) 110 111 … … 161 162 max_diff = [0] 162 163 for k in range(N): 163 print(" %s %d"%(name, k), file=sys.stderr)164 print("Model %s %d"%(name, k+1), file=sys.stderr) 164 165 seed = np.random.randint(1e6) 165 166 pars_i = randomize_pars(model_info, pars, seed) 166 167 constrain_pars(model_info, pars_i) 167 constrain_new_to_old(model_info, pars_i) 168 if 'sasview' in (base, comp): 169 constrain_new_to_old(model_info, pars_i) 168 170 if mono: 169 171 pars_i = suppress_pd(pars_i) … … 204 206 print("""\ 205 207 206 MODEL is the model name of the model or "all" for all the models 207 in alphabetical order. 208 MODEL is the model name of the model or one of the model types listed in 209 sasmodels.core.list_models (all, py, c, double, single, opencl, 1d, 2d, 210 nonmagnetic, magnetic). Model types can be combined, such as 2d+single. 208 211 209 212 COUNT is the number of randomly generated parameter sets to try. A value … … 237 240 return 238 241 239 model = argv[0] 240 if not (model in MODELS) and (model != "all"): 241 print('Bad model %s. Use "all" or one of:'%model) 242 target = argv[0] 243 try: 244 model_list = [target] if target in MODELS else core.list_models(target) 245 except ValueError: 246 print('Bad model %s. Use model type or one of:'%model) 242 247 print_models() 248 print('model types: all, py, c, double, single, opencl, 1d, 2d, nonmagnetic, magnetic') 243 249 return 244 250 try: … … 258 264 data, index = make_data({'qmax':1.0, 'is2d':is2D, 'nq':Nq, 'res':0., 259 265 'accuracy': 'Low', 'view':'log', 'zero': False}) 260 model_list = [model] if model != "all" else MODELS261 266 for model in model_list: 262 267 compare_instance(model, data, index, N=count, mono=mono, -
sasmodels/core.py
r52e9a45 r5124c969 69 69 * magnetic: models with an sld 70 70 * nommagnetic: models without an sld 71 """ 72 if kind and kind not in KINDS: 71 72 For multiple conditions, combine with plus. For example, *c+single+2d* 73 would return all oriented models implemented in C which can be computed 74 accurately with single precision arithmetic. 75 """ 76 if kind and any(k not in KINDS for k in kind.split('+')): 73 77 raise ValueError("kind not in " + ", ".join(KINDS)) 74 78 files = sorted(glob(joinpath(generate.MODEL_PATH, "[a-zA-Z]*.py"))) 75 79 available_models = [basename(f)[:-3] for f in files] 76 selected = [name for name in available_models if _matches(name, kind)] 80 if kind and '+' in kind: 81 all_kinds = kind.split('+') 82 condition = lambda name: all(_matches(name, k) for k in all_kinds) 83 else: 84 condition = lambda name: _matches(name, kind) 85 selected = [name for name in available_models if condition(name)] 77 86 78 87 return selected -
sasmodels/model_test.py
r1a6cd57 rb216880 97 97 is_py = callable(model_info.Iq) 98 98 99 # Some OpenCL drivers seem to be flaky, and are not producing the 100 # expected result. Since we don't have known test values yet for 101 # all of our models, we are instead going to compare the results 102 # for the 'smoke test' (that is, evaluation at q=0.1 for the default 103 # parameters just to see that the model runs to completion) between 104 # the OpenCL and the DLL. To do this, we define a 'stash' which is 105 # shared between OpenCL and DLL tests. This is just a list. If the 106 # list is empty (which it will be when DLL runs, if the DLL runs 107 # first), then the results are appended to the list. If the list 108 # is not empty (which it will be when OpenCL runs second), the results 109 # are compared to the results stored in the first element of the list. 110 # This is a horrible stateful hack which only makes sense because the 111 # test suite is thrown away after being run once. 112 stash = [] 113 99 114 if is_py: # kernel implemented in python 100 115 test_name = "Model: %s, Kernel: python"%model_name … … 103 118 test_method_name, 104 119 platform="dll", # so that 105 dtype="double") 120 dtype="double", 121 stash=stash) 106 122 suite.addTest(test) 107 123 else: # kernel implemented in C 124 125 # test using dll if desired 126 if 'dll' in loaders or not core.HAVE_OPENCL: 127 test_name = "Model: %s, Kernel: dll"%model_name 128 test_method_name = "test_%s_dll" % model_info.id 129 test = ModelTestCase(test_name, model_info, 130 test_method_name, 131 platform="dll", 132 dtype="double", 133 stash=stash) 134 suite.addTest(test) 135 108 136 # test using opencl if desired and available 109 137 if 'opencl' in loaders and core.HAVE_OPENCL: … … 116 144 test = ModelTestCase(test_name, model_info, 117 145 test_method_name, 118 platform="ocl", dtype=None) 146 platform="ocl", dtype=None, 147 stash=stash) 119 148 #print("defining", test_name) 120 suite.addTest(test)121 122 # test using dll if desired123 if 'dll' in loaders or not core.HAVE_OPENCL:124 test_name = "Model: %s, Kernel: dll"%model_name125 test_method_name = "test_%s_dll" % model_info.id126 test = ModelTestCase(test_name, model_info,127 test_method_name,128 platform="dll",129 dtype="double")130 149 suite.addTest(test) 131 150 … … 144 163 """ 145 164 def __init__(self, test_name, model_info, test_method_name, 146 platform, dtype ):147 # type: (str, ModelInfo, str, str, DType ) -> None165 platform, dtype, stash): 166 # type: (str, ModelInfo, str, str, DType, List[Any]) -> None 148 167 self.test_name = test_name 149 168 self.info = model_info 150 169 self.platform = platform 151 170 self.dtype = dtype 171 self.stash = stash # container for the results of the first run 152 172 153 173 setattr(self, test_method_name, self.run_all) … … 167 187 #({}, (0.0, 0.0), None), 168 188 # test vector form 169 ({}, [0. 1]*2, [None]*2),189 ({}, [0.001, 0.01, 0.1], [None]*3), 170 190 ({}, [(0.1, 0.1)]*2, [None]*2), 171 191 # test that ER/VR will run if they exist … … 174 194 ] 175 195 176 tests = s elf.info.tests196 tests = smoke_tests + self.info.tests 177 197 try: 178 198 model = build_model(self.info, dtype=self.dtype, 179 199 platform=self.platform) 180 for test in smoke_tests + tests: 181 self.run_one(model, test) 182 183 if not tests and self.platform == "dll": 184 ## Uncomment the following to make forgetting the test 185 ## values an error. Only do so for the "dll" tests 186 ## to reduce noise from both opencl and dll, and because 187 ## python kernels use platform="dll". 188 #raise Exception("No test cases provided") 189 pass 200 results = [self.run_one(model, test) for test in tests] 201 if self.stash: 202 for test, target, actual in zip(tests, self.stash[0], results): 203 assert np.all(abs(target-actual) < 5e-5*abs(actual)),\ 204 "expected %s but got %s for %s"%(target, actual, test[0]) 205 else: 206 self.stash.append(results) 207 208 # Check for missing tests. Only do so for the "dll" tests 209 # to reduce noise from both opencl and dll, and because 210 # python kernels use platform="dll". 211 if self.platform == "dll": 212 missing = [] 213 ## Uncomment the following to require test cases 214 #missing = self._find_missing_tests() 215 if missing: 216 raise ValueError("Missing tests for "+", ".join(missing)) 190 217 191 218 except: 192 219 annotate_exception(self.test_name) 193 220 raise 221 222 def _find_missing_tests(self): 223 # type: () -> None 224 """make sure there are 1D, 2D, ER and VR tests as appropriate""" 225 model_has_VR = callable(self.info.VR) 226 model_has_ER = callable(self.info.ER) 227 model_has_1D = True 228 model_has_2D = any(p.type == 'orientation' 229 for p in self.info.parameters.kernel_parameters) 230 231 # Lists of tests that have a result that is not None 232 single = [test for test in self.info.tests 233 if not isinstance(test[2], list) and test[2] is not None] 234 tests_has_VR = any(test[1] == 'VR' for test in single) 235 tests_has_ER = any(test[1] == 'ER' for test in single) 236 tests_has_1D_single = any(isinstance(test[1], float) for test in single) 237 tests_has_2D_single = any(isinstance(test[1], tuple) for test in single) 238 239 multiple = [test for test in self.info.tests 240 if isinstance(test[2], list) 241 and not all(result is None for result in test[2])] 242 tests_has_1D_multiple = any(isinstance(test[1][0], float) 243 for test in multiple) 244 tests_has_2D_multiple = any(isinstance(test[1][0], tuple) 245 for test in multiple) 246 247 missing = [] 248 if model_has_VR and not tests_has_VR: 249 missing.append("VR") 250 if model_has_ER and not tests_has_ER: 251 missing.append("ER") 252 if model_has_1D and not (tests_has_1D_single or tests_has_1D_multiple): 253 missing.append("1D") 254 if model_has_2D and not (tests_has_2D_single or tests_has_2D_multiple): 255 missing.append("2D") 256 257 return missing 194 258 195 259 def run_one(self, model, test): … … 207 271 208 272 if x[0] == 'ER': 209 actual = [call_ER(model.info, pars)]273 actual = np.array([call_ER(model.info, pars)]) 210 274 elif x[0] == 'VR': 211 actual = [call_VR(model.info, pars)]275 actual = np.array([call_VR(model.info, pars)]) 212 276 elif isinstance(x[0], tuple): 213 277 qx, qy = zip(*x) … … 238 302 'f(%s); expected:%s; actual:%s' 239 303 % (xi, yi, actual_yi)) 304 return actual 240 305 241 306 return ModelTestCase -
sasmodels/modelinfo.py
r85fe7f8 r5124c969 730 730 info.docs = kernel_module.__doc__ 731 731 info.category = getattr(kernel_module, 'category', None) 732 info.single = getattr(kernel_module, 'single', True)733 info.opencl = getattr(kernel_module, 'opencl', True)734 732 info.structure_factor = getattr(kernel_module, 'structure_factor', False) 735 733 info.profile_axes = getattr(kernel_module, 'profile_axes', ['x', 'y']) … … 745 743 info.profile = getattr(kernel_module, 'profile', None) # type: ignore 746 744 info.sesans = getattr(kernel_module, 'sesans', None) # type: ignore 745 # Default single and opencl to True for C models. Python models have callable Iq. 746 info.opencl = getattr(kernel_module, 'opencl', not callable(info.Iq)) 747 info.single = getattr(kernel_module, 'single', not callable(info.Iq)) 747 748 748 749 # multiplicity info
Note: See TracChangeset
for help on using the changeset viewer.