Changes in sasmodels/compare_many.py [d15a908:6458608] in sasmodels
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
sasmodels/compare_many.py
rd15a908 r6458608 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 redirected6 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 is9 greater than expected for that precision, the parameter set is labeled10 as bad and written to the output, along with the random seed used to11 generate that parameter value. This seed can be used with :mod:`compare`12 to reload and display the details of the model.13 """14 2 from __future__ import print_function 15 3 … … 26 14 27 15 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 the32 difference normalized by *target* to get relative error. Only33 the elements listed in *index* are used, though index may be34 and empty slice defined by *slice(None, None)*.35 36 Returns:37 38 *maxrel* the maximum relative difference39 40 *rel95* the relative difference with the 5% biggest differences ignored41 42 *maxabs* the maximum absolute difference for the 5% biggest differences43 44 *maxval* the maximum value for the 5% biggest differences45 """46 16 resid = abs(value-target)[index] 47 17 relerr = resid/target[index] 48 s orted_rel_index= np.argsort(relerr)18 srel = np.argsort(relerr) 49 19 #p90 = int(len(relerr)*0.90) 50 20 p95 = int(len(relerr)*0.95) 51 21 maxrel = np.max(relerr) 52 rel95 = relerr[s orted_rel_index[p95]]53 maxabs = np.max(resid[s orted_rel_index[p95:]])54 maxval = np.max(value[s orted_rel_index[p95:]])55 return maxrel, rel95, maxabs,maxval22 rel95 = relerr[srel[p95]] 23 maxabs = np.max(resid[srel[p95:]]) 24 maxval = np.max(value[srel[p95:]]) 25 return maxrel,rel95,maxabs,maxval 56 26 57 27 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 """62 28 stats = list('Max rel err|95% rel err|Max abs err above 90% rel|Max value above 90% rel'.split('|')) 63 29 groups = [''] … … 70 36 print(','.join('"%s"'%c for c in columns)) 71 37 72 # Target 'good' value for various precision levels.73 38 PRECISION = { 74 39 'fast': 1e-3, … … 83 48 def compare_instance(name, data, index, N=1, mono=True, cutoff=1e-5, 84 49 base='sasview', comp='double'): 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') 50 is2D = hasattr(data, 'qx_data') 103 51 model_definition = core.load_model_definition(name) 104 52 pars = get_demo_pars(model_definition) 105 53 header = ('\n"Model","%s","Count","%d","Dimension","%s"' 106 % (name, N, "2D" if is _2delse "1D"))54 % (name, N, "2D" if is2D else "1D")) 107 55 if not mono: header += ',"Cutoff",%g'%(cutoff,) 108 56 print(header) 109 57 110 if is _2d:58 if is2D: 111 59 info = generate.make_info(model_definition) 112 60 partype = info['partype'] … … 121 69 # declarations are not available in python 2.7. 122 70 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 """127 71 try: 128 72 result = fn(**pars) … … 138 82 return result 139 83 def check_model(pars): 140 """141 Run the two calculators against *pars*, returning statistics142 on the differences. See :func:`calc_stats` for the list of stats.143 """144 84 base_value = try_model(calc_base, pars) 145 85 comp_value = try_model(calc_comp, pars) … … 168 108 good = [True] 169 109 columns = check_model(pars_i) 170 columns += [v for _, 110 columns += [v for _,v in sorted(pars_i.items())] 171 111 if first: 172 112 labels = [" vs. ".join((calc_base.engine, calc_comp.engine))] … … 181 121 182 122 def print_usage(): 183 """184 Print the command usage string.185 """186 123 print("usage: compare_many.py MODEL COUNT (1dNQ|2dNQ) (CUTOFF|mono) (single|double|quad)") 187 124 188 125 189 126 def print_models(): 190 """191 Print the list of available models in columns.192 """193 127 print(columnize(MODELS, indent=" ")) 194 128 195 129 196 130 def print_help(): 197 """198 Print usage string, the option description and the list of available models.199 """200 131 print_usage() 201 132 print("""\ … … 227 158 228 159 def main(): 229 """ 230 Main program. 231 """ 232 if len(sys.argv) not in (6, 7): 160 if len(sys.argv) not in (6,7): 233 161 print_help() 234 162 sys.exit(1) … … 254 182 255 183 data, index = make_data({'qmax':1.0, 'is2d':is2D, 'nq':Nq, 'res':0., 256 'accuracy': 'Low', 'view':'log'})184 'accuracy': 'Low', 'view':'log'}) 257 185 model_list = [model] if model != "all" else MODELS 258 186 for model in model_list:
Note: See TracChangeset
for help on using the changeset viewer.