Changeset d19962c in sasmodels for sasmodels/generate.py


Ignore:
Timestamp:
Mar 27, 2016 4:57:03 PM (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:
5c028e3
Parents:
c499331
Message:

working vector parameter example using dll engine

File:
1 edited

Legend:

Unmodified
Added
Removed
  • sasmodels/generate.py

    r5ff1b03 rd19962c  
    184184#__all__ = ["model_info", "make_doc", "make_source", "convert_type"] 
    185185 
    186 import sys 
    187186from os.path import abspath, dirname, join as joinpath, exists, basename, \ 
    188187    splitext, getmtime 
     
    198197 
    199198TEMPLATE_ROOT = dirname(__file__) 
    200  
    201 MAX_PD = 4 
    202199 
    203200F16 = np.dtype('float16') 
     
    478475    source = [kernel_header] + user_code 
    479476 
    480     vol_parameters = partable.kernel_pars('volume') 
    481     iq_parameters = partable.kernel_pars('1d') 
    482     iqxy_parameters = partable.kernel_pars('2d') 
    483  
    484477    # Make parameters for q, qx, qy so that we can use them in declarations 
    485478    q, qx, qy = [Parameter(name=v) for v in ('q', 'qx', 'qy')] 
    486479    # Generate form_volume function, etc. from body only 
    487480    if model_info['form_volume'] is not None: 
    488         pars = vol_parameters 
     481        pars = partable.form_volume_parameters 
    489482        source.append(_gen_fn('form_volume', pars, model_info['form_volume'])) 
    490483    if model_info['Iq'] is not None: 
    491         pars = [q] + iq_parameters 
     484        pars = [q] + partable.iq_parameters 
    492485        source.append(_gen_fn('Iq', pars, model_info['Iq'])) 
    493486    if model_info['Iqxy'] is not None: 
    494         pars = [qx, qy] + iqxy_parameters 
     487        pars = [qx, qy] + partable.iqxy_parameters 
    495488        source.append(_gen_fn('Iqxy', pars, model_info['Iqxy'])) 
    496489 
     
    498491    source.append("#define PARAMETER_TABLE \\") 
    499492    source.append("\\\n".join(p.as_definition() 
    500                                   for p in model_info['parameters'][2:])) 
     493                              for p in partable.kernel_parameters)) 
    501494 
    502495    # Define the function calls 
    503     if vol_parameters: 
    504         refs = _call_pars("v.", vol_parameters) 
     496    if partable.form_volume_parameters: 
     497        refs = _call_pars("v.", partable.form_volume_parameters) 
    505498        call_volume = "#define CALL_VOLUME(v) form_volume(%s)" % (",".join(refs)) 
    506499    else: 
     
    511504    source.append(call_volume) 
    512505 
    513     refs = ["q[i]"] + _call_pars("v.", iq_parameters) 
     506    refs = ["q[i]"] + _call_pars("v.", partable.iq_parameters) 
    514507    call_iq = "#define CALL_IQ(q,i,v) Iq(%s)" % (",".join(refs)) 
    515508    if _have_Iqxy(user_code): 
    516509        # Call 2D model 
    517         refs = ["q[2*i]", "q[2*i+1]"] + _call_pars("v.", iqxy_parameters) 
     510        refs = ["q[2*i]", "q[2*i+1]"] + _call_pars("v.", partable.iqxy_parameters) 
    518511        call_iqxy = "#define CALL_IQ(q,i,v) Iqxy(%s)" % (",".join(refs)) 
    519512    else: 
     
    525518 
    526519    # Fill in definitions for numbers of parameters 
    527     source.append("#define MAX_PD %s"%model_info['max_pd']) 
    528     source.append("#define NPARS %d"%(len(partable.kernel_pars()))) 
     520    source.append("#define MAX_PD %s"%partable.max_pd) 
     521    source.append("#define NPARS %d"%partable.npars) 
    529522 
    530523    # TODO: allow mixed python/opencl kernels? 
     
    546539    return '\n'.join(source) 
    547540 
    548 def categorize_parameters(pars): 
    549     """ 
    550     Categorize the parameters by use: 
    551  
    552     * *pd* list of polydisperse parameters in order; gui should test whether 
    553       they are in *2d* or *magnetic* as appropriate for the data 
    554     * *1d* set of parameters that are used to compute 1D patterns 
    555     * *2d* set of parameters that are used to compute 2D patterns (which 
    556       includes all 1D parameters) 
    557     * *magnetic* set of parameters that are used to compute magnetic 
    558       patterns (which includes all 1D and 2D parameters) 
    559     * *pd_relative* is the set of parameters with relative distribution 
    560       width (e.g., radius +/- 10%) rather than absolute distribution 
    561       width (e.g., theta +/- 6 degrees). 
    562     * *theta_par* is the index of the polar angle polydispersion parameter 
    563       or -1 if no such parameter exists 
    564     """ 
    565     par_set = {} 
    566  
    567541def process_parameters(model_info): 
    568542    """ 
     
    573547        model_info['demo'] = partable.defaults 
    574548 
    575     # Don't use more polydisperse parameters than are available in the model 
    576     # Note: we can do polydispersity on arbitrary parameters, so it is not 
    577     # clear that this is a good idea; it does however make the poly_details 
    578     # code easier to write, so we will leave it in for now. 
    579     model_info['max_pd'] = min(partable.num_pd, MAX_PD) 
    580  
    581549class CoordinationDetails(object): 
    582550    def __init__(self, model_info): 
    583         max_pd = model_info['max_pd'] 
    584         npars = len(model_info['parameters'].kernel_pars()) 
     551        parameters = model_info['parameters'] 
     552        max_pd = parameters.max_pd 
     553        npars = parameters.npars 
    585554        par_offset = 4*max_pd 
    586555        self.details = np.zeros(par_offset + 3*npars + 4, 'i4') 
     
    596565 
    597566        # theta_par is fixed 
    598         self.details[-1] = model_info['parameters'].theta_par 
     567        self.details[-1] = parameters.theta_offset 
    599568 
    600569    @property 
     
    647616 
    648617def poly_details(model_info, weights): 
    649     weights = weights[2:] 
    650     max_pd = model_info['max_pd'] 
     618    #print("weights",weights) 
     619    weights = weights[2:] # Skip scale and background 
    651620 
    652621    # Decreasing list of polydispersity lengths 
     
    654623    pd_length = np.array([len(w) for w in weights]) 
    655624    num_active = np.sum(pd_length>1) 
    656     if num_active > max_pd: 
     625    if num_active > model_info['parameters'].max_pd: 
    657626        raise ValueError("Too many polydisperse parameters") 
    658627 
     
    745714      *model_info* blocks for the composition objects.  This allows us to 
    746715      build complete product and mixture models from just the info. 
    747     * *max_pd* is the max polydispersity dimension.  This is constant and 
    748       should not be reset.  You may be able to change it when the program 
    749       starts by setting *sasmodels.generate.MAX_PD*. 
    750  
    751716    """ 
    752717    # TODO: maybe turn model_info into a class ModelDefinition 
     
    837802 
    838803 
    839  
    840804def demo_time(): 
    841805    """ 
     
    853817    Program which prints the source produced by the model. 
    854818    """ 
     819    import sys 
     820    from sasmodels.core import make_model_by_name 
    855821    if len(sys.argv) <= 1: 
    856822        print("usage: python -m sasmodels.generate modelname") 
    857823    else: 
    858824        name = sys.argv[1] 
    859         import sasmodels.models 
    860         __import__('sasmodels.models.' + name) 
    861         model = getattr(sasmodels.models, name) 
    862         model_info = make_model_info(model) 
     825        model_info = make_model_by_name(name) 
    863826        source = make_source(model_info) 
    864827        print(source) 
Note: See TracChangeset for help on using the changeset viewer.