Changes in / [d0876c9d:d1c4760] in sasmodels


Ignore:
Location:
sasmodels
Files:
3 edited

Legend:

Unmodified
Added
Removed
  • sasmodels/core.py

    rfb5914f rd19962c  
    241241                 else ([pars.get(p.name, p.default)], [])) 
    242242                for p in parameters.call_parameters] 
    243  
    244     details, weights, values = build_details(kernel, vw_pairs) 
    245     return kernel(details, weights, values, cutoff) 
    246  
    247 def build_details(kernel, pairs): 
    248     values, weights = zip(*pairs) 
     243    values, weights = zip(*vw_pairs) 
     244 
    249245    if max([len(w) for w in weights]) > 1: 
    250246        details = generate.poly_details(kernel.info, weights) 
    251247    else: 
    252248        details = kernel.info['mono_details'] 
     249 
    253250    weights, values = [np.hstack(v) for v in (weights, values)] 
     251 
    254252    weights = weights.astype(dtype=kernel.dtype) 
    255253    values = values.astype(dtype=kernel.dtype) 
    256     return details, weights, values 
    257  
     254    return kernel(details, weights, values, cutoff) 
    258255 
    259256def call_ER_VR(model_info, vol_pars): 
  • sasmodels/modelinfo.py

    rfb5914f rce896fd  
    432432                         if p.polydisperse and p.type != 'magnetic') 
    433433 
    434     def user_parameters(self, pars={}, is2d=True): 
     434    def user_parameters(self, pars, is2d): 
    435435        """ 
    436436        Return the list of parameters for the given data type. 
     
    493493                if table: 
    494494                    # look up length from incoming parameters 
    495                     table_length = int(pars.get(p.length_control, p.length)) 
     495                    table_length = int(pars[p.length_control]) 
    496496                    del dependent[p.length_control] # first entry seen 
    497497                    for k in range(1, table_length+1): 
  • sasmodels/sasview_model.py

    rfb5914f rce896fd  
    2121 
    2222from . import core 
    23 from . import weights 
     23from . import generate 
    2424 
    2525def standard_models(): 
     
    5252    """ 
    5353    def __init__(self): 
    54         self._model = None 
     54        self._kernel = None 
    5555        model_info = self._model_info 
    5656        parameters = model_info['parameters'] 
     
    7575        self.params = collections.OrderedDict() 
    7676        self.dispersion = dict() 
    77  
    78         self.orientation_params = [] 
    79         self.magnetic_params = [] 
    80         self.fixed = [] 
    81         for p in parameters.user_parameters(): 
     77        partype = model_info['partype'] 
     78 
     79        for p in model_info['parameters']: 
    8280            self.params[p.name] = p.default 
    8381            self.details[p.name] = [p.units] + p.limits 
    84             if p.polydisperse: 
    85                 self.dispersion[p.name] = { 
    86                     'width': 0, 
    87                     'npts': 35, 
    88                     'nsigmas': 3, 
    89                     'type': 'gaussian', 
    90                 } 
    91             if p.type == 'orientation': 
    92                 self.orientation_params.append(p.name) 
    93                 self.orientation_params.append(p.name+".width") 
    94                 self.fixed.append(p.name+".width") 
    95             if p.type == 'magnetic': 
    96                 self.orientation_params.append(p.name) 
    97                 self.magnetic_params.append(p.name) 
    98                 self.fixed.append(p.name+".width") 
    99  
     82 
     83        for name in partype['pd-2d']: 
     84            self.dispersion[name] = { 
     85                'width': 0, 
     86                'npts': 35, 
     87                'nsigmas': 3, 
     88                'type': 'gaussian', 
     89            } 
     90 
     91        self.orientation_params = ( 
     92            partype['orientation'] 
     93            + [n + '.width' for n in partype['orientation']] 
     94            + partype['magnetic']) 
     95        self.magnetic_params = partype['magnetic'] 
     96        self.fixed = [n + '.width' for n in partype['pd-2d']] 
    10097        self.non_fittable = [] 
    10198 
     
    116113    def __get_state__(self): 
    117114        state = self.__dict__.copy() 
     115        model_id = self._model_info['id'] 
    118116        state.pop('_kernel') 
    119117        # May need to reload model info on set state since it has pointers 
     
    124122    def __set_state__(self, state): 
    125123        self.__dict__ = state 
    126         self._model = None 
     124        self._kernel = None 
    127125 
    128126    def __str__(self): 
     
    213211    def getDispParamList(self): 
    214212        """ 
    215         Return a list of polydispersity parameters for the model 
     213        Return a list of all available parameters for the model 
    216214        """ 
    217215        # TODO: fix test so that parameter order doesn't matter 
    218         ret = ['%s.%s' % (p.name.lower(), ext) 
    219                for p in self._model_info['parameters'].user_parameters() 
    220                for ext in ('npts', 'nsigmas', 'width') 
    221                if p.polydisperse] 
     216        ret = ['%s.%s' % (d.lower(), p) 
     217               for d in self._model_info['partype']['pd-2d'] 
     218               for p in ('npts', 'nsigmas', 'width')] 
    222219        #print(ret) 
    223220        return ret 
     
    292289            # Check whether we have a list of ndarrays [qx,qy] 
    293290            qx, qy = qdist 
    294             if not self._model_info['parameters'].has_2d: 
     291            partype = self._model_info['partype'] 
     292            if not partype['orientation'] and not partype['magnetic']: 
    295293                return self.calculate_Iq(np.sqrt(qx ** 2 + qy ** 2)) 
    296294            else: 
     
    314312        to the card for each evaluation. 
    315313        """ 
    316         if self._model is None: 
    317             self._model = core.build_model(self._model_info, platform='dll') 
     314        if self._kernel is None: 
     315            self._kernel = core.build_model(self._model_info) 
    318316        q_vectors = [np.asarray(q) for q in args] 
    319         kernel = self._model.make_kernel(q_vectors) 
    320         pairs = [self._get_weights(p) 
    321                  for p in self._model_info['parameters'].call_parameters] 
    322         details, weights, values = core.build_details(kernel, pairs) 
    323         return kernel(details, weights, values, cutoff=self.cutoff) 
    324         kernel.q_input.release() 
    325         kernel.release() 
     317        fn = self._kernel(q_vectors) 
     318        pars = [self.params[v] for v in fn.fixed_pars] 
     319        pd_pars = [self._get_weights(p) for p in fn.pd_pars] 
     320        result = fn(pars, pd_pars, self.cutoff) 
     321        fn.q_input.release() 
     322        fn.release() 
    326323        return result 
    327324 
     
    396393    def _get_weights(self, par): 
    397394        """ 
    398         Return dispersion weights for parameter 
    399         """ 
    400         if par.polydisperse: 
    401             dis = self.dispersion[par.name] 
    402             value, weight = weights.get_weights( 
    403                 dis['type'], dis['npts'], dis['width'], dis['nsigmas'], 
    404                 self.params[par.name], par.limits, par.relative_pd) 
    405             return value, weight / np.sum(weight) 
    406         else: 
    407             return [self.params[par.name]], [] 
    408  
    409 def test_model(): 
    410     Cylinder = make_class('cylinder') 
    411     cylinder = Cylinder() 
    412     return cylinder.evalDistribution([0.1,0.1]) 
    413  
    414 if __name__ == "__main__": 
    415     print("cylinder(0.1,0.1)=%g"%test_model()) 
     395            Return dispersion weights 
     396            :param par parameter name 
     397        """ 
     398        from . import weights 
     399 
     400        relative = self._model_info['partype']['pd-rel'] 
     401        limits = self._model_info['limits'] 
     402        dis = self.dispersion[par] 
     403        value, weight = weights.get_weights( 
     404            dis['type'], dis['npts'], dis['width'], dis['nsigmas'], 
     405            self.params[par], limits[par], par in relative) 
     406        return value, weight / np.sum(weight) 
     407 
Note: See TracChangeset for help on using the changeset viewer.