Changeset 6cefbc9 in sasmodels
 Timestamp:
 Sep 27, 2016 9:52:00 AM (6 years ago)
 Branches:
 master, core_shell_microgels, costrafo411, magnetic_model, release_v0.94, release_v0.95, ticket1257vesicleproduct, ticket_1156, ticket_1265_superball, ticket_822_more_unit_tests
 Children:
 9acade6
 Parents:
 9c1a59c
 File:

 1 edited
Legend:
 Unmodified
 Added
 Removed

sasmodels/weights.py
r56b2687 r6cefbc9 3 3 """ 4 4 # TODO: include dispersion docs with the disperser models 5 from __future__ import division, print_function 6 5 7 from math import sqrt # type: ignore 8 from collections import OrderedDict 9 6 10 import numpy as np # type: ignore 7 11 from scipy.special import gammaln # type: ignore … … 54 58 else: 55 59 return np.array([], 'd'), np.array([], 'd') 56 return self._weights(center, sigma, lb, ub) 60 x, px = self._weights(center, sigma, lb, ub) 61 return x, px 57 62 58 63 def _weights(self, center, sigma, lb, ub): … … 79 84 default = dict(npts=35, width=0, nsigmas=3) 80 85 def _weights(self, center, sigma, lb, ub): 86 # TODO: sample high probability regions more densely 87 # i.e., step uniformly in cumulative density rather than x value 88 # so weight = 1/Npts for all weights, but values are unevenly spaced 81 89 x = self._linspace(center, sigma, lb, ub) 82 90 px = np.exp((xcenter)**2 / (2.0 * sigma * sigma)) … … 165 173 166 174 def _weights(self, center, sigma, lb, ub): 167 # TODO: interpolate into the array dispersion using npts 168 x = center + self.values*sigma 175 # TODO: rebin the array dispersion using npts 176 # TODO: use a distribution that can be recentered and scaled 177 x = self.values 178 #x = center + self.values*sigma 169 179 idx = (x >= lb) & (x <= ub) 170 180 x = x[idx] … … 174 184 175 185 # dispersion name > disperser lookup table. 176 MODELS = dict((d.type, d) for d in ( 177 GaussianDispersion, RectangleDispersion, 178 ArrayDispersion, SchulzDispersion, LogNormalDispersion 186 # Maintain order since this is used by sasview GUI to order the options in 187 # the dispersion type combobox. 188 MODELS = OrderedDict((d.type, d) for d in ( 189 RectangleDispersion, 190 ArrayDispersion, 191 LogNormalDispersion, 192 GaussianDispersion, 193 SchulzDispersion, 179 194 )) 180 195 … … 194 209 *value* is the value of the parameter in the model. 195 210 196 *limits* is [lb, ub], the lower and upper bound o f the weight value.211 *limits* is [lb, ub], the lower and upper bound on the possible values. 197 212 198 213 *relative* is true if *width* is defined in proportion to the value … … 201 216 Returns *(value, weight)*, where *value* and *weight* are vectors. 202 217 """ 218 if disperser == "array": 219 raise NotImplementedError("Don't handle arrays through get_weights; use values and weights directly") 203 220 cls = MODELS[disperser] 204 221 obj = cls(n, width, nsigmas) 205 222 v, w = obj.get_weights(value, limits[0], limits[1], relative) 206 223 return v, w 224 225 226 def plot_weights(model_info, pairs): 227 # type: (ModelInfo, List[Tuple[np.ndarray, np.ndarray]]) > None 228 """ 229 Plot the weights returned by :func:`get_weights`. 230 231 *model_info* is 232 :param model_info: 233 :param pairs: 234 :return: 235 """ 236 import pylab 237 238 if any(len(values)>1 for values, weights in pairs): 239 labels = [p.name for p in model_info.parameters.call_parameters] 240 pylab.interactive(True) 241 pylab.figure() 242 for (v,w), s in zip(pairs, labels): 243 if len(v) > 1: 244 #print("weights for", s, v, w) 245 pylab.plot(v, w, 'o', label=s) 246 pylab.grid(True) 247 pylab.legend()
Note: See TracChangeset
for help on using the changeset viewer.