Exemple #1
0
    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)
Exemple #2
0
    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)
Exemple #3
0
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
Exemple #4
0
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