Changeset d19962c in sasmodels for sasmodels/generate.py
- Timestamp:
- Mar 27, 2016 4:57:03 PM (8 years ago)
- 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
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
sasmodels/generate.py
r5ff1b03 rd19962c 184 184 #__all__ = ["model_info", "make_doc", "make_source", "convert_type"] 185 185 186 import sys187 186 from os.path import abspath, dirname, join as joinpath, exists, basename, \ 188 187 splitext, getmtime … … 198 197 199 198 TEMPLATE_ROOT = dirname(__file__) 200 201 MAX_PD = 4202 199 203 200 F16 = np.dtype('float16') … … 478 475 source = [kernel_header] + user_code 479 476 480 vol_parameters = partable.kernel_pars('volume')481 iq_parameters = partable.kernel_pars('1d')482 iqxy_parameters = partable.kernel_pars('2d')483 484 477 # Make parameters for q, qx, qy so that we can use them in declarations 485 478 q, qx, qy = [Parameter(name=v) for v in ('q', 'qx', 'qy')] 486 479 # Generate form_volume function, etc. from body only 487 480 if model_info['form_volume'] is not None: 488 pars = vol_parameters481 pars = partable.form_volume_parameters 489 482 source.append(_gen_fn('form_volume', pars, model_info['form_volume'])) 490 483 if model_info['Iq'] is not None: 491 pars = [q] + iq_parameters484 pars = [q] + partable.iq_parameters 492 485 source.append(_gen_fn('Iq', pars, model_info['Iq'])) 493 486 if model_info['Iqxy'] is not None: 494 pars = [qx, qy] + iqxy_parameters487 pars = [qx, qy] + partable.iqxy_parameters 495 488 source.append(_gen_fn('Iqxy', pars, model_info['Iqxy'])) 496 489 … … 498 491 source.append("#define PARAMETER_TABLE \\") 499 492 source.append("\\\n".join(p.as_definition() 500 for p in model_info['parameters'][2:]))493 for p in partable.kernel_parameters)) 501 494 502 495 # 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) 505 498 call_volume = "#define CALL_VOLUME(v) form_volume(%s)" % (",".join(refs)) 506 499 else: … … 511 504 source.append(call_volume) 512 505 513 refs = ["q[i]"] + _call_pars("v.", iq_parameters)506 refs = ["q[i]"] + _call_pars("v.", partable.iq_parameters) 514 507 call_iq = "#define CALL_IQ(q,i,v) Iq(%s)" % (",".join(refs)) 515 508 if _have_Iqxy(user_code): 516 509 # 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) 518 511 call_iqxy = "#define CALL_IQ(q,i,v) Iqxy(%s)" % (",".join(refs)) 519 512 else: … … 525 518 526 519 # 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) 529 522 530 523 # TODO: allow mixed python/opencl kernels? … … 546 539 return '\n'.join(source) 547 540 548 def categorize_parameters(pars):549 """550 Categorize the parameters by use:551 552 * *pd* list of polydisperse parameters in order; gui should test whether553 they are in *2d* or *magnetic* as appropriate for the data554 * *1d* set of parameters that are used to compute 1D patterns555 * *2d* set of parameters that are used to compute 2D patterns (which556 includes all 1D parameters)557 * *magnetic* set of parameters that are used to compute magnetic558 patterns (which includes all 1D and 2D parameters)559 * *pd_relative* is the set of parameters with relative distribution560 width (e.g., radius +/- 10%) rather than absolute distribution561 width (e.g., theta +/- 6 degrees).562 * *theta_par* is the index of the polar angle polydispersion parameter563 or -1 if no such parameter exists564 """565 par_set = {}566 567 541 def process_parameters(model_info): 568 542 """ … … 573 547 model_info['demo'] = partable.defaults 574 548 575 # Don't use more polydisperse parameters than are available in the model576 # Note: we can do polydispersity on arbitrary parameters, so it is not577 # clear that this is a good idea; it does however make the poly_details578 # code easier to write, so we will leave it in for now.579 model_info['max_pd'] = min(partable.num_pd, MAX_PD)580 581 549 class CoordinationDetails(object): 582 550 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 585 554 par_offset = 4*max_pd 586 555 self.details = np.zeros(par_offset + 3*npars + 4, 'i4') … … 596 565 597 566 # theta_par is fixed 598 self.details[-1] = model_info['parameters'].theta_par567 self.details[-1] = parameters.theta_offset 599 568 600 569 @property … … 647 616 648 617 def 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 651 620 652 621 # Decreasing list of polydispersity lengths … … 654 623 pd_length = np.array([len(w) for w in weights]) 655 624 num_active = np.sum(pd_length>1) 656 if num_active > m ax_pd:625 if num_active > model_info['parameters'].max_pd: 657 626 raise ValueError("Too many polydisperse parameters") 658 627 … … 745 714 *model_info* blocks for the composition objects. This allows us to 746 715 build complete product and mixture models from just the info. 747 * *max_pd* is the max polydispersity dimension. This is constant and748 should not be reset. You may be able to change it when the program749 starts by setting *sasmodels.generate.MAX_PD*.750 751 716 """ 752 717 # TODO: maybe turn model_info into a class ModelDefinition … … 837 802 838 803 839 840 804 def demo_time(): 841 805 """ … … 853 817 Program which prints the source produced by the model. 854 818 """ 819 import sys 820 from sasmodels.core import make_model_by_name 855 821 if len(sys.argv) <= 1: 856 822 print("usage: python -m sasmodels.generate modelname") 857 823 else: 858 824 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) 863 826 source = make_source(model_info) 864 827 print(source)
Note: See TracChangeset
for help on using the changeset viewer.