Changeset 9a66e65 in sasmodels


Ignore:
Timestamp:
Dec 9, 2015 11:12:17 AM (8 years ago)
Author:
Paul Kienzle <pkienzle@…>
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:
716abe0
Parents:
dcef2ee
Message:

refactor sasmodels to sasview parameter conversion

Location:
sasmodels
Files:
3 edited

Legend:

Unmodified
Added
Removed
  • sasmodels/compare.py

    rcf404cb r9a66e65  
    2020from .data import plot_theory, empty_data1D, empty_data2D 
    2121from .direct_model import DirectModel 
    22 from .convert import revert_model 
     22from .convert import revert_model, constrain_new_to_old 
    2323kerneldll.ALLOW_SINGLE_PRECISION_DLLS = True 
    2424 
     
    8181 
    8282    for k,v in pars.items(): 
    83         if k.startswith("num_pearls_") or k.startswith("thick_string_"): 
    84             continue 
    85         if k.endswith("_pd"): 
    86             model.dispersion[k[:-3]]['width'] = v 
    87         elif k.endswith("_pd_n"): 
    88             model.dispersion[k[:-5]]['npts'] = v 
    89         elif k.endswith("_pd_nsigma"): 
    90             model.dispersion[k[:-10]]['nsigmas'] = v 
    91         elif k.endswith("_pd_type"): 
    92             model.dispersion[k[:-8]]['type'] = v 
     83        parts = k.split('.')  # polydispersity components 
     84        if len(parts) == 2: 
     85            model.dispersion[parts[0]][parts[1]] = v 
    9386        else: 
    9487            model.setParam(k, v) 
     
    129122 
    130123def constrain_pars(model_definition, pars): 
     124    """ 
     125    Restrict parameters to valid values. 
     126    """ 
    131127    name = model_definition.name 
    132128    if name == 'capped_cylinder' and pars['cap_radius'] < pars['radius']: 
     
    141137        rg_max = np.sqrt(90*np.log(10) + 3*np.log(pars['scale']))/q_max 
    142138        pars['rg'] = min(pars['rg'],rg_max) 
    143  
    144     # These constraints are only needed for comparison to sasview 
    145     if name in ('teubner_strey','broad_peak'): 
    146         del pars['scale'] 
    147     if name in ('guinier',): 
    148         del pars['background'] 
    149     if getattr(model_definition, 'category', None) == 'structure-factor': 
    150         del pars['scale'], pars['background'] 
    151  
    152139 
    153140def parlist(pars): 
     
    277264    pars.update(set_pars)  # set value after random to control value 
    278265    constrain_pars(model_definition, pars) 
     266    constrain_new_to_old(model_definition, pars) 
    279267 
    280268    # parameter selection 
  • sasmodels/compare_many.py

    r5d316e9 r9a66e65  
    99from .compare import (MODELS, randomize_model, suppress_pd, eval_sasview, 
    1010                      eval_opencl, eval_ctypes, make_data, get_demo_pars, 
    11                       columnize, constrain_pars) 
     11                      columnize, constrain_pars, constrain_new_to_old) 
    1212 
    1313def calc_stats(target, value, index): 
     
    7474        pars_i, seed = randomize_model(pars) 
    7575        constrain_pars(model_definition, pars_i) 
     76        constrain_new_to_old(model_definition, pars_i) 
    7677        if mono: suppress_pd(pars_i) 
    7778 
  • sasmodels/convert.py

    raa4946b r9a66e65  
    22Convert models to and from sasview. 
    33""" 
     4import warnings 
    45 
    5 def _rename_pars(pars, mapping): 
     6PD_DOT = [ 
     7    ("", ""), 
     8    ("_pd", ".width"), 
     9    ("_pd_n", ".npts"), 
     10    ("_pd_nsigma", ".nsigmas"), 
     11    ("_pd_type", ".type"), 
     12    ] 
     13def _convert_pars(pars, mapping): 
    614    """ 
    715    Rename the parameters and any associated polydispersity attributes. 
    816    """ 
    917    newpars = pars.copy() 
    10     for old,new in mapping.items(): 
     18    for new, old in mapping.items(): 
    1119        if old == new: continue 
    12         # Bumps style parameter names 
    13         for variant in ("", "_pd", "_pd_n", "_pd_nsigma", "_pd_type"): 
    14             if old+variant in newpars: 
     20        for pd, dot in PD_DOT: 
     21            if old+dot in newpars: 
    1522                if new is not None: 
    16                     newpars[new+variant] = pars[old+variant] 
    17                 del newpars[old+variant] 
    18         # Sasview style parameter names 
    19         for variant in (".width", ".nsigmas", ".type", ".npts"): 
    20             if old+variant in newpars: 
    21                 if new is not None: 
    22                     newpars[new+variant] = pars[old+variant] 
    23                 del newpars[old+variant] 
     23                    newpars[new+pd] = pars[old+dot] 
     24                del newpars[old+dot] 
    2425    return newpars 
    2526 
     
    5152                for p,v in pars.items()) 
    5253 
     54def _remove_pd(pars, key, name): 
     55    """ 
     56    Remove polydispersity from the parameter list. 
     57 
     58    Note: operates in place 
     59    """ 
     60    # Bumps style parameter names 
     61    pd = pars.pop(key+".width", 0.0) 
     62    pd_n = pars.pop(key+".npts", 0) 
     63    if pd != 0.0 and pd_n != 0: 
     64        warnings.warn("parameter %s not polydisperse in sasview %s"%(key, name)) 
     65    pars.pop(key+".nsigmas", None) 
     66    pars.pop(key+".type", None) 
     67    return pars 
     68 
     69def _revert_pars(pars, mapping): 
     70    """ 
     71    Rename the parameters and any associated polydispersity attributes. 
     72    """ 
     73    newpars = pars.copy() 
     74    for new, old in mapping.items(): 
     75        for pd, dot in PD_DOT: 
     76            if old+pd == new+dot: 
     77                continue 
     78            if new+pd in newpars: 
     79                if old is not None: 
     80                    newpars[old+dot] = pars[new+pd] 
     81                del newpars[new+pd] 
     82    return newpars 
     83 
    5384def revert_model(model_definition, pars): 
    5485    """ 
     
    5788    mapping = model_definition.oldpars 
    5889    oldname = model_definition.oldname 
    59     oldpars = _rename_pars(_unscale_sld(pars), mapping) 
     90    oldpars = _revert_pars(_unscale_sld(pars), mapping) 
     91 
     92    # Note: update compare.constrain_pars to match 
     93    name = model_definition.name 
     94    if name in ('teubner_strey', 'broad_peak'): 
     95        if oldpars.pop('scale', 1.0) != 1.0: 
     96            warnings.warn("parameter scale not used in sasview %s"%name) 
     97    elif name in ('guinier',): 
     98        if oldpars.pop('background', 0.0) != 0.0: 
     99            warnings.warn("parameter background not used in sasview %s"%name) 
     100    elif getattr(model_definition, 'category', None) == 'structure-factor': 
     101        if oldpars.pop('scale', 1.0) != 1.0: 
     102            warnings.warn("parameter scale not used in sasview %s"%name) 
     103        if oldpars.pop('background', 0.0) != 0.0: 
     104            warnings.warn("parameter background not used in sasview %s"%name) 
     105    elif name == 'pearl_necklace': 
     106        _remove_pd(oldpars, 'num_pearls', name) 
     107        _remove_pd(oldpars, 'thick_string', name) 
     108 
    60109    return oldname, oldpars 
    61110 
     111def constrain_new_to_old(model_definition, pars): 
     112    """ 
     113    Restrict parameter values to those that will match sasview. 
     114    """ 
     115    # Note: update convert.revert_model to match 
     116    name = model_definition.name 
     117    if name in ('teubner_strey','broad_peak'): 
     118        pars['scale'] = 1 
     119    elif name in ('guinier',): 
     120        pars['background'] = 0 
     121    elif name == 'pearl_necklace': 
     122        pars['string_thickness_pd_n'] = 0 
     123        pars['number_of_pearls_pd_n'] = 0 
     124    elif getattr(model_definition, 'category', None) == 'structure-factor': 
     125        pars['scale'], pars['background'] = 1, 0 
     126 
Note: See TracChangeset for help on using the changeset viewer.