source: sasmodels/sasmodels/core.py @ f734e7d

core_shell_microgelscostrafo411magnetic_modelrelease_v0.94release_v0.95ticket-1257-vesicle-productticket_1156ticket_1265_superballticket_822_more_unit_tests
Last change on this file since f734e7d was f734e7d, checked in by pkienzle, 9 years ago

restructure c code generation for maintainability; extend test harness to allow opencl and ctypes tests

  • Property mode set to 100644
File size: 1.9 KB
Line 
1__all__ = ["list_models", "load_model_cl", "load_model_dll",
2           "load_model_definition", ]
3
4from os.path import basename, dirname, join as joinpath
5from glob import glob
6
7import numpy as np
8
9from . import models
10from . import weights
11
12try:
13    from .kernelcl import load_model as load_model_cl
14except ImportError,exc:
15    load_model_cl = None
16from .kerneldll import load_model as load_model_dll
17
18def list_models():
19    root = dirname(__file__)
20    files = sorted(glob(joinpath(root, 'models', "[a-zA-Z]*.py")))
21    available_models = [basename(f)[:-3] for f in files]
22    return available_models
23
24def load_model_definition(model_name):
25    __import__('sasmodels.models.'+model_name)
26    model_definition = getattr(models, model_name, None)
27    return model_definition
28
29def make_kernel(model, q_vectors):
30    """
31    Return a computation kernel from the model definition and the q input.
32    """
33    input = model.make_input(q_vectors)
34    return model(input)
35
36def get_weights(kernel, pars, name):
37    """
38    Generate the distribution for parameter *name* given the parameter values
39    in *pars*.
40
41    Searches for "name", "name_pd", "name_pd_type", "name_pd_n", "name_pd_sigma"
42    """
43    relative = name in kernel.info['partype']['pd-rel']
44    limits = kernel.info['limits']
45    disperser = pars.get(name+'_pd_type', 'gaussian')
46    value = pars.get(name, kernel.info['defaults'][name])
47    npts = pars.get(name+'_pd_n', 0)
48    width = pars.get(name+'_pd', 0.0)
49    nsigma = pars.get(name+'_pd_nsigma', 3.0)
50    v,w = weights.get_weights(
51        disperser, npts, width, nsigma,
52        value, limits[name], relative)
53    return v,w/np.sum(w)
54
55def call_kernel(kernel, pars, cutoff=1e-5):
56    fixed_pars = [pars.get(name, kernel.info['defaults'][name])
57                  for name in kernel.fixed_pars]
58    pd_pars = [get_weights(kernel, pars, name) for name in kernel.pd_pars]
59    return kernel(fixed_pars, pd_pars, cutoff=cutoff)
60
Note: See TracBrowser for help on using the repository browser.