Changeset 72a081d in sasmodels for sasmodels/core.py
- Timestamp:
- Mar 19, 2016 4:52:46 AM (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:
- f3d7abd
- Parents:
- ce43de0
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
sasmodels/core.py
rd5ba841 r72a081d 3 3 """ 4 4 5 from os.path import basename, dirname, join as joinpath 5 from os.path import basename, dirname, join as joinpath, splitext 6 6 from glob import glob 7 import imp 7 8 8 9 import numpy as np … … 11 12 from . import weights 12 13 from . import generate 13 14 # TODO: remove circular references between product and core 15 # product uses call_ER/call_VR, core uses make_product_info/ProductModel 16 #from . import product 17 from . import mixture 14 18 from . import kernelpy 15 19 from . import kerneldll … … 46 50 Load model info and build model. 47 51 """ 52 return build_model(load_model_info(model_name), **kw) 53 54 def load_model_info_from_path(path): 55 # Pull off the last .ext if it exists; there may be others 56 name = basename(splitext(path)[0]) 57 58 # Not cleaning name since don't need to be able to reload this 59 # model later 60 # Should probably turf the model from sys.modules after we are done... 61 62 # Placing the model in the 'sasmodels.custom' name space, even 63 # though it doesn't actually exist. imp.load_source doesn't seem 64 # to care. 65 kernel_module = imp.load_source('sasmodels.custom.'+name, path) 66 67 # Now that we have the module, we can load it as usual 68 model_info = generate.make_model_info(kernel_module) 69 return model_info 70 71 def load_model_info(model_name): 72 """ 73 Load a model definition given the model name. 74 75 This returns a handle to the module defining the model. This can be 76 used with functions in generate to build the docs or extract model info. 77 """ 48 78 parts = model_name.split('+') 49 79 if len(parts) > 1: 50 from .mixture import MixtureModel 51 models = [load_model(p, **kw) for p in parts] 52 return MixtureModel(models) 80 model_info_list = [load_model_info(p) for p in parts] 81 return mixture.make_mixture_info(model_info_list) 53 82 54 83 parts = model_name.split('*') 55 84 if len(parts) > 1: 85 from . import product 56 86 # Note: currently have circular reference 57 from .product import ProductModel58 87 if len(parts) > 2: 59 88 raise ValueError("use P*S to apply structure factor S to model P") 60 P, Q = [load_model(p, **kw) for p in parts] 61 return ProductModel(P, Q) 62 63 return build_model(load_model_info(model_name), **kw) 64 65 def load_model_info(model_name): 66 """ 67 Load a model definition given the model name. 68 69 This returns a handle to the module defining the model. This can be 70 used with functions in generate to build the docs or extract model info. 71 """ 89 P_info, Q_info = [load_model_info(p) for p in parts] 90 return product.make_product_info(P_info, Q_info) 91 72 92 #import sys; print "\n".join(sys.path) 73 93 __import__('sasmodels.models.'+model_name) … … 95 115 otherwise it uses the default "ocl". 96 116 """ 97 source = generate.make_source(model_info) 98 if dtype is None: 99 dtype = 'single' if model_info['single'] else 'double' 100 if callable(model_info.get('Iq', None)): 101 return kernelpy.PyModel(model_info) 117 composition = model_info.get('composition', None) 118 if composition is not None: 119 composition_type, parts = composition 120 models = [build_model(p, dtype=dtype, platform=platform) for p in parts] 121 if composition_type == 'mixture': 122 return mixture.MixtureModel(model_info, models) 123 elif composition_type == 'product': 124 from . import product 125 P, S = parts 126 return product.ProductModel(model_info, P, S) 127 else: 128 raise ValueError('unknown mixture type %s'%composition_type) 102 129 103 130 ## for debugging: … … 109 136 # open(model_info['name']+'.c','w').write(source) 110 137 # source = open(model_info['name']+'.cl','r').read() 111 138 source = generate.make_source(model_info) 139 if dtype is None: 140 dtype = 'single' if model_info['single'] else 'double' 141 if callable(model_info.get('Iq', None)): 142 return kernelpy.PyModel(model_info) 112 143 if (platform == "dll" 113 144 or not HAVE_OPENCL
Note: See TracChangeset
for help on using the changeset viewer.