Changeset d15a908 in sasmodels for sasmodels/compare_many.py
- Timestamp:
- Jan 27, 2016 3:35:15 PM (8 years ago)
- Branches:
- master, core_shell_microgels, costrafo411, magnetic_model, release_v0.94, release_v0.95, ticket-1257-vesicle-product, ticket_1156, ticket_1265_superball, ticket_822_more_unit_tests
- Children:
- fdc538a
- Parents:
- 37a7252
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
sasmodels/compare_many.py
r6458608 rd15a908 1 1 #!/usr/bin/env python 2 """ 3 Program to compare results from many random parameter sets for a given model. 4 5 The result is a comma separated value (CSV) table that can be redirected 6 from standard output into a file and loaded into a spreadsheet. 7 8 The models are compared for each parameter set and if the difference is 9 greater than expected for that precision, the parameter set is labeled 10 as bad and written to the output, along with the random seed used to 11 generate that parameter value. This seed can be used with :mod:`compare` 12 to reload and display the details of the model. 13 """ 2 14 from __future__ import print_function 3 15 … … 14 26 15 27 def calc_stats(target, value, index): 28 """ 29 Calculate statistics between the target value and the computed value. 30 31 *target* and *value* are the vectors being compared, with the 32 difference normalized by *target* to get relative error. Only 33 the elements listed in *index* are used, though index may be 34 and empty slice defined by *slice(None, None)*. 35 36 Returns: 37 38 *maxrel* the maximum relative difference 39 40 *rel95* the relative difference with the 5% biggest differences ignored 41 42 *maxabs* the maximum absolute difference for the 5% biggest differences 43 44 *maxval* the maximum value for the 5% biggest differences 45 """ 16 46 resid = abs(value-target)[index] 17 47 relerr = resid/target[index] 18 s rel= np.argsort(relerr)48 sorted_rel_index = np.argsort(relerr) 19 49 #p90 = int(len(relerr)*0.90) 20 50 p95 = int(len(relerr)*0.95) 21 51 maxrel = np.max(relerr) 22 rel95 = relerr[s rel[p95]]23 maxabs = np.max(resid[s rel[p95:]])24 maxval = np.max(value[s rel[p95:]])25 return maxrel, rel95,maxabs,maxval52 rel95 = relerr[sorted_rel_index[p95]] 53 maxabs = np.max(resid[sorted_rel_index[p95:]]) 54 maxval = np.max(value[sorted_rel_index[p95:]]) 55 return maxrel, rel95, maxabs, maxval 26 56 27 57 def print_column_headers(pars, parts): 58 """ 59 Generate column headers for the differences and for the parameters, 60 and print them to standard output. 61 """ 28 62 stats = list('Max rel err|95% rel err|Max abs err above 90% rel|Max value above 90% rel'.split('|')) 29 63 groups = [''] … … 36 70 print(','.join('"%s"'%c for c in columns)) 37 71 72 # Target 'good' value for various precision levels. 38 73 PRECISION = { 39 74 'fast': 1e-3, … … 48 83 def compare_instance(name, data, index, N=1, mono=True, cutoff=1e-5, 49 84 base='sasview', comp='double'): 50 is2D = hasattr(data, 'qx_data') 85 r""" 86 Compare the model under different calculation engines. 87 88 *name* is the name of the model. 89 90 *data* is the data object giving $q, \Delta q$ calculation points. 91 92 *index* is the active set of points. 93 94 *N* is the number of comparisons to make. 95 96 *cutoff* is the polydispersity weight cutoff to make the calculation 97 a little bit faster. 98 99 *base* and *comp* are the names of the calculation engines to compare. 100 """ 101 102 is_2d = hasattr(data, 'qx_data') 51 103 model_definition = core.load_model_definition(name) 52 104 pars = get_demo_pars(model_definition) 53 105 header = ('\n"Model","%s","Count","%d","Dimension","%s"' 54 % (name, N, "2D" if is 2Delse "1D"))106 % (name, N, "2D" if is_2d else "1D")) 55 107 if not mono: header += ',"Cutoff",%g'%(cutoff,) 56 108 print(header) 57 109 58 if is 2D:110 if is_2d: 59 111 info = generate.make_info(model_definition) 60 112 partype = info['partype'] … … 69 121 # declarations are not available in python 2.7. 70 122 def try_model(fn, pars): 123 """ 124 Return the model evaluated at *pars*. If there is an exception, 125 print it and return NaN of the right shape. 126 """ 71 127 try: 72 128 result = fn(**pars) … … 82 138 return result 83 139 def check_model(pars): 140 """ 141 Run the two calculators against *pars*, returning statistics 142 on the differences. See :func:`calc_stats` for the list of stats. 143 """ 84 144 base_value = try_model(calc_base, pars) 85 145 comp_value = try_model(calc_comp, pars) … … 108 168 good = [True] 109 169 columns = check_model(pars_i) 110 columns += [v for _, v in sorted(pars_i.items())]170 columns += [v for _, v in sorted(pars_i.items())] 111 171 if first: 112 172 labels = [" vs. ".join((calc_base.engine, calc_comp.engine))] … … 121 181 122 182 def print_usage(): 183 """ 184 Print the command usage string. 185 """ 123 186 print("usage: compare_many.py MODEL COUNT (1dNQ|2dNQ) (CUTOFF|mono) (single|double|quad)") 124 187 125 188 126 189 def print_models(): 190 """ 191 Print the list of available models in columns. 192 """ 127 193 print(columnize(MODELS, indent=" ")) 128 194 129 195 130 196 def print_help(): 197 """ 198 Print usage string, the option description and the list of available models. 199 """ 131 200 print_usage() 132 201 print("""\ … … 158 227 159 228 def main(): 160 if len(sys.argv) not in (6,7): 229 """ 230 Main program. 231 """ 232 if len(sys.argv) not in (6, 7): 161 233 print_help() 162 234 sys.exit(1) … … 182 254 183 255 data, index = make_data({'qmax':1.0, 'is2d':is2D, 'nq':Nq, 'res':0., 184 256 'accuracy': 'Low', 'view':'log'}) 185 257 model_list = [model] if model != "all" else MODELS 186 258 for model in model_list:
Note: See TracChangeset
for help on using the changeset viewer.