source: sasview/park_integration/ScipyFitting.py @ 32d802f

ESS_GUIESS_GUI_DocsESS_GUI_batch_fittingESS_GUI_bumps_abstractionESS_GUI_iss1116ESS_GUI_iss879ESS_GUI_iss959ESS_GUI_openclESS_GUI_orderingESS_GUI_sync_sascalccostrafo411magnetic_scattrelease-4.1.1release-4.1.2release-4.2.2release_4.0.1ticket-1009ticket-1094-headlessticket-1242-2d-resolutionticket-1243ticket-1249ticket885unittest-saveload
Last change on this file since 32d802f was 9c648c7, checked in by Gervaise Alina <gervyh@…>, 16 years ago

reducing the start_points for parkfitting

  • Property mode set to 100644
File size: 4.7 KB
RevLine 
[792db7d5]1"""
2    @organization: ScipyFitting module contains FitArrange , ScipyFit,
3    Parameter classes.All listed classes work together to perform a
4    simple fit with scipy optimizer.
5"""
[48882d1]6#import scipy.linalg
7import numpy 
[61cb28d]8
[7705306]9from Loader import Load
10from scipy import optimize
11
[48882d1]12from AbstractFitEngine import FitEngine, sansAssembly
[61cb28d]13
[48882d1]14class fitresult:
15    """
16        Storing fit result
17    """
18    calls     = None
19    fitness   = None
20    chisqr    = None
21    pvec      = None
22    cov       = None
23    info      = None
24    mesg      = None
25    success   = None
26    stderr    = None
27    parameters= None
28   
[4c718654]29class ScipyFit(FitEngine):
[7705306]30    """
[792db7d5]31        ScipyFit performs the Fit.This class can be used as follow:
32        #Do the fit SCIPY
33        create an engine: engine = ScipyFit()
34        Use data must be of type plottable
35        Use a sans model
36       
[ca6d914]37        Add data with a dictionnary of FitArrangeDict where Uid is a key and data
[792db7d5]38        is saved in FitArrange object.
39        engine.set_data(data,Uid)
40       
41        Set model parameter "M1"= model.name add {model.parameter.name:value}.
42        @note: Set_param() if used must always preceded set_model()
43             for the fit to be performed.In case of Scipyfit set_param is called in
44             fit () automatically.
45        engine.set_param( model,"M1", {'A':2,'B':4})
46       
[ca6d914]47        Add model with a dictionnary of FitArrangeDict{} where Uid is a key and model
[792db7d5]48        is save in FitArrange object.
49        engine.set_model(model,Uid)
50       
51        engine.fit return chisqr,[model.parameter 1,2,..],[[err1....][..err2...]]
52        chisqr1, out1, cov1=engine.fit({model.parameter.name:value},qmin,qmax)
[7705306]53    """
[792db7d5]54    def __init__(self):
55        """
[ca6d914]56            Creates a dictionary (self.fitArrangeDict={})of FitArrange elements
[792db7d5]57            with Uid as keys
58        """
[ca6d914]59        self.fitArrangeDict={}
[ee5b04c]60        self.paramList=[]
[9c648c7]61    #def fit(self, *args, **kw):
62    #    return profile(self._fit, *args, **kw)
63
[681f0dc]64    def fit(self ,handler=None, qmin=None, qmax=None):
[a9e04aa]65        # Protect against simultanous fitting attempts
66        #if len(self.fitArrangeDict)>1:
67        #    raise RuntimeError, "Scipy can't fit more than a single fit problem at a time."
[792db7d5]68        # fitproblem contains first fitArrange object(one model and a list of data)
[a9e04aa]69        #list of fitproblem
[681f0dc]70       
[a9e04aa]71        fitproblem=[]
72        for id ,fproblem in self.fitArrangeDict.iteritems():
[9c648c7]73            #print "ScipyFitting:fproblem.get_to_fit() ",fproblem.get_to_fit()
[a9e04aa]74            if fproblem.get_to_fit()==1:
75                fitproblem.append(fproblem)
76        if len(fitproblem)>1 : 
77            raise RuntimeError, "Scipy can't fit more than a single fit problem at a time."
78            return
79        elif len(fitproblem)==0 : 
80            raise RuntimeError, "No Assembly scheduled for Scipy fitting."
81            return
82   
[7705306]83        listdata=[]
[a9e04aa]84        model = fitproblem[0].get_model()
85        listdata = fitproblem[0].get_data()
[792db7d5]86        # Concatenate dList set (contains one or more data)before fitting
[7d0c1a8]87        #data=self._concatenateData( listdata)
88        data=listdata
[792db7d5]89        #Assign a fit range is not boundaries were given
[f8ce013]90        if not hasattr(data, 'image'):
[7d0c1a8]91            if qmin==None:
92                qmin= min(data.x)
93            if qmax==None:
94                qmax= max(data.x) 
95        else:
96            if qmin==None:
97                qmin= numpy.min(data.image)
98            if qmax==None:
99                qmax= numpy.max(data.image) 
[e71440c]100        functor= sansAssembly(self.paramList,model,data)
[9c648c7]101       
102       
[48882d1]103        out, cov_x, info, mesg, success = optimize.leastsq(functor,model.getParams(self.paramList), full_output=1, warning=True)
104        chisqr = functor.chisq(out)
[e71440c]105       
[ca6d914]106        if cov_x is not None and numpy.isfinite(cov_x).all():
107            stderr = numpy.sqrt(numpy.diag(cov_x))
[e71440c]108        else:
109            stderr=None
[ca6d914]110        if not (numpy.isnan(out).any()) or ( cov_x !=None) :
[48882d1]111                result = fitresult()
112                result.fitness = chisqr
[ca6d914]113                result.stderr  = stderr
[48882d1]114                result.pvec = out
115                result.success =success
116               
117                return result
118        else: 
[ca6d914]119            raise ValueError, "SVD did not converge"+str(success)
[7705306]120       
[48882d1]121       
[9c648c7]122def profile(fn, *args, **kw):
123    import cProfile, pstats, os
124    global call_result
125    def call():
126        global call_result
127        call_result = fn(*args, **kw)
128    cProfile.runctx('call()', dict(call=call), {}, 'profile.out')
129    stats = pstats.Stats('profile.out')
130    #stats.sort_stats('time')
131    stats.sort_stats('calls')
132    stats.print_stats()
133    os.unlink('profile.out')
134    return call_result
135
[48882d1]136     
Note: See TracBrowser for help on using the repository browser.