Changeset 4e9f227 in sasview for src/sans/fit/BumpsFitting.py
- Timestamp:
- May 15, 2014 7:07:43 PM (10 years ago)
- Branches:
- master, ESS_GUI, ESS_GUI_Docs, ESS_GUI_batch_fitting, ESS_GUI_bumps_abstraction, ESS_GUI_iss1116, ESS_GUI_iss879, ESS_GUI_iss959, ESS_GUI_opencl, ESS_GUI_ordering, ESS_GUI_sync_sascalc, costrafo411, magnetic_scatt, release-4.1.1, release-4.1.2, release-4.2.2, release_4.0.1, ticket-1009, ticket-1094-headless, ticket-1242-2d-resolution, ticket-1243, ticket-1249, ticket885, unittest-saveload
- Children:
- 786685e
- Parents:
- e3efa6b3
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
src/sans/fit/BumpsFitting.py
re3efa6b3 r4e9f227 2 2 BumpsFitting module runs the bumps optimizer. 3 3 """ 4 import time5 6 4 import numpy 7 5 … … 11 9 from bumps.fitproblem import FitProblem 12 10 13 from sans.fit.AbstractFitEngine import FitEngine 14 from sans.fit.AbstractFitEngine import FResult 11 from .AbstractFitEngine import FitEngine 12 from .AbstractFitEngine import FResult 13 from .expression import compile_constraints 15 14 16 15 class BumpsMonitor(object): … … 52 51 53 52 53 # Note: currently using bumps parameters for each parameter object so that 54 # a SasFitness can be used directly in bumps with the usual semantics. 55 # The disadvantage of this technique is that we need to copy every parameter 56 # back into the model each time the function is evaluated. We could instead 57 # define reference parameters for each sans parameter, but then we would not 58 # be able to express constraints using python expressions in the usual way 59 # from bumps, and would instead need to use string expressions. 54 60 class SasFitness(object): 55 61 """ 56 62 Wrap SAS model as a bumps fitness object 57 63 """ 58 def __init__(self, name, model, data, fitted=[], **kw):59 self.name = name60 self.model = model 64 def __init__(self, model, data, fitted=[], constraints={}, **kw): 65 self.name = model.name 66 self.model = model.model 61 67 self.data = data 62 68 self._define_pars() 63 69 self._init_pars(kw) 70 self.constraints = dict(constraints) 64 71 self.set_fitted(fitted) 65 72 self._dirty = True … … 73 80 self._pars[k] = parameter.Parameter(value=value, bounds=bounds, 74 81 fixed=True, name=name) 82 #print parameter.summarize(self._pars.values()) 75 83 76 84 def _init_pars(self, kw): … … 102 110 """ 103 111 for k,p in self._pars.items(): 104 p.fixed = (k not in param_list )112 p.fixed = (k not in param_list or k in self.constraints) 105 113 self.fitted_pars = [self._pars[k] for k in param_list] 106 114 self.fitted_par_names = param_list … … 112 120 def update(self): 113 121 for k,v in self._pars.items(): 122 #print "updating",k,v,v.value 114 123 self.model.setParam(k,v.value) 115 124 self._dirty = True … … 154 163 ftol=1.49012e-8, reset_flag=False): 155 164 # Build collection of bumps fitness calculators 156 models = [ SasFitness(name="M%d"%(i+1), 157 model=M.get_model().model, 165 models = [ SasFitness(model=M.get_model(), 158 166 data=M.get_data(), 167 constraints=M.constraints, 159 168 fitted=M.pars) 160 169 for i,M in enumerate(self.fit_arrange_dict.values()) 161 170 if M.get_to_fit() == 1 ] 162 171 problem = FitProblem(models) 172 173 174 # Build constraint expressions 175 exprs = {} 176 for M in models: 177 exprs.update((".".join((M.name,k)),v) for k,v in M.constraints.items()) 178 if exprs: 179 symtab = dict((".".join((M.name,k)),p) 180 for M in models 181 for k,p in M.parameters().items()) 182 constraints = compile_constraints(symtab,exprs) 183 else: 184 constraints = lambda: 0 185 186 # Override model update so that parameter constraints are applied 187 problem._model_update = problem.model_update 188 def model_update(): 189 constraints() 190 problem._model_update() 191 problem.model_update = model_update 163 192 164 193 # Run the fit
Note: See TracChangeset
for help on using the changeset viewer.