def params_flat_to_func (self, flat): """update function parameters from a flat list""" # first split according to functions nshared = [sum(f.varshare) for f in self.functions] ntotal = [len(f.params) for f in self.functions] ndatasets = len(self.graph.fit_datasets()) fsizes = [s+(t-s)*ndatasets for s,t in zip(nshared,ntotal)] fparams = splitlist (flat, fsizes) # then split by variable for fn, fparam in zip (self.functions, fparams): dparams = [] vsizes = map (lambda x: x and 1 or ndatasets, fn.varshare) vparams = splitlist (fparam, vsizes) for d in range(ndatasets): dp = [] for j, vparam in enumerate(vparams): if fn.varshare [j]: dp.append (vparam[0]) else: try: dp.append (vparam[d]) except: print >>sys.stderr, d dparams.append (dp) for dparam, ds in zip(dparams, self.graph.fit_datasets()): fn.load(ds.curveid) fn.set_params (dparam) fn.save(ds.curveid)
def params_flat_to_func(self, flat): """update function parameters from a flat list""" # first split according to functions nshared = [sum(f.varshare) for f in self.functions] ntotal = [len(f.params) for f in self.functions] ndatasets = len(self.graph.fit_datasets()) fsizes = [s + (t - s) * ndatasets for s, t in zip(nshared, ntotal)] fparams = splitlist(flat, fsizes) # then split by variable for fn, fparam in zip(self.functions, fparams): dparams = [] vsizes = map(lambda x: x and 1 or ndatasets, fn.varshare) vparams = splitlist(fparam, vsizes) for d in range(ndatasets): dp = [] for j, vparam in enumerate(vparams): if fn.varshare[j]: dp.append(vparam[0]) else: try: dp.append(vparam[d]) except: print >> sys.stderr, d dparams.append(dp) for dparam, ds in zip(dparams, self.graph.fit_datasets()): fn.load(ds.curveid) fn.set_params(dparam) fn.save(ds.curveid)
def fitfunction (*args): if len(args) == 3: niter, actred, wss = args project.mainwin.statusBar().message ('Fitting: Iteration %d, xsqr=%g, reduced by %g' % (niter, wss, actred)) project.mainwin.progressbar.setProgress(niter*10, 0) project.main_dict['app'].processEvents() return else: params, x = args fitdatasets = FitWindow.inst.graph.fit_datasets() fsdizes = [len(d.x()) for d in fitdatasets] xreal = map (Numeric.array, splitlist (x, fsdizes)) y = [] FitWindow.inst.params_flat_to_func (params) for i, xx in enumerate(xreal): for fn in FitWindow.inst.functions: fn.load (fitdatasets[i].curveid) y.append (FitWindow.inst.call(xx)) ret = concatenate (y) if FitWindow.inst.graph.fitwin.wmethod == 2: try: return Numeric.log(ret) # logarithmic fit except: print >>sys.stderr, 'Math range error (den Vogel)' return zeros(ret.shape, 'f') else: return ret # linear fit
def fitfunction(*args): if len(args) == 3: niter, actred, wss = args project.mainwin.statusBar().message( 'Fitting: Iteration %d, xsqr=%g, reduced by %g' % (niter, wss, actred)) project.mainwin.progressbar.setProgress(niter * 10, 0) project.main_dict['app'].processEvents() return else: params, x = args fitdatasets = FitWindow.inst.graph.fit_datasets() fsdizes = [len(d.x()) for d in fitdatasets] xreal = map(Numeric.array, splitlist(x, fsdizes)) y = [] FitWindow.inst.params_flat_to_func(params) for i, xx in enumerate(xreal): for fn in FitWindow.inst.functions: fn.load(fitdatasets[i].curveid) y.append(FitWindow.inst.call(xx)) ret = concatenate(y) if FitWindow.inst.graph.fitwin.wmethod == 2: try: return Numeric.log(ret) # logarithmic fit except: print >> sys.stderr, 'Math range error (den Vogel)' return zeros(ret.shape, 'f') else: return ret # linear fit