Changeset 7578961 in sasview


Ignore:
Timestamp:
Jul 3, 2008 3:33:46 PM (16 years ago)
Author:
Mathieu Doucet <doucetm@…>
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:
357b79b
Parents:
a916ccc
Message:

Small improvements

Location:
pr_inversion
Files:
3 edited

Legend:

Unmodified
Added
Removed
  • pr_inversion/invertor.py

    rf168d02 r7578961  
    66import numpy 
    77import sys 
     8import math, time 
     9from scipy.linalg.basic import lstsq 
    810 
    911def help(): 
     
    331333        
    332334    def lstsq(self, nfunc=5, nr=20): 
    333         #TODO: do this on the C side 
    334         # 
    335         # To make sure an array is contiguous: 
    336         # blah = numpy.ascontiguousarray(blah_original) 
    337         # ... before passing it to C 
    338335        """ 
    339336            The problem is solved by posing the problem as  Ax = b, 
     
    366363 
    367364        """ 
    368         #TODO: Allow for background by starting at n=0 (since the base function 
    369         # is zero for n=0). 
    370         import math, time 
    371         from scipy.linalg.basic import lstsq 
     365        # Note: To make sure an array is contiguous: 
     366        # blah = numpy.ascontiguousarray(blah_original) 
     367        # ... before passing it to C 
    372368         
    373369        if self.is_valid()<0: 
     
    395391        t_0 = time.time() 
    396392        self._get_matrix(nfunc, nq, a, b) 
    397         #print "elasped: ", time.time()-t_0 
    398393              
    399394        # Perform the inversion (least square fit) 
     
    423418            err = math.fabs(chi2/float(npts-nfunc)) * cov 
    424419        except: 
    425             # We were not able to estimate the errors, 
    426             # returns an empty covariance matrix 
    427             print "lstsq:", sys.exc_value 
    428             print chi2 
     420            # We were not able to estimate the errors 
     421            # Return an empty error matrix 
    429422            pass 
    430423             
     
    450443        return self.out, self.cov 
    451444         
    452     def lstsq_bck(self, nfunc=5, nr=20): 
    453         #TODO: Allow for background by starting at n=0 (since the base function 
    454         # is zero for n=0). 
    455         import math 
    456         from scipy.linalg.basic import lstsq 
    457          
    458         if self.is_valid()<0: 
    459             raise RuntimeError, "Invertor: invalid data; incompatible data lengths." 
    460          
    461         self.nfunc = nfunc 
    462         # a -- An M x N matrix. 
    463         # b -- An M x nrhs matrix or M vector. 
    464         npts = len(self.x) 
    465         nq   = nr 
    466         sqrt_alpha = math.sqrt(math.fabs(self.alpha)) 
    467         if sqrt_alpha<0.0: 
    468             nq = 0 
    469          
    470         err_0 = numpy.zeros([nfunc, nfunc]) 
    471         c_0 = numpy.zeros(nfunc) 
    472         nfunc_0 = nfunc 
    473         nfunc += 1 
    474          
    475         a = numpy.zeros([npts+nq, nfunc]) 
    476         b = numpy.zeros(npts+nq) 
    477         err = numpy.zeros([nfunc, nfunc]) 
    478          
    479         # Construct the a matrix and b vector that represent the problem 
    480         self._get_matrix(nfunc, nq, a, b) 
    481              
    482         c, chi2, rank, n = lstsq(a, b) 
    483         # Sanity check 
    484         try: 
    485             float(chi2) 
    486         except: 
    487             chi2 = -1.0 
    488         self.chi2 = chi2 
    489  
    490         inv_cov = numpy.zeros([nfunc,nfunc]) 
    491         # Get the covariance matrix, defined as inv_cov = a_transposed * a 
    492         self._get_invcov_matrix(nfunc, nr, a, inv_cov) 
    493                      
    494         # Compute the reg term size for the output 
    495         sum_sig, sum_reg = self._get_reg_size(nfunc, nr, a) 
    496          
    497         if math.fabs(self.alpha)>0: 
    498             new_alpha = sum_sig/(sum_reg/self.alpha) 
    499         else: 
    500             new_alpha = 0.0 
    501         self.suggested_alpha = new_alpha 
    502          
    503         try: 
    504             cov = numpy.linalg.pinv(inv_cov) 
    505             err = math.fabs(chi2/float(npts-nfunc)) * cov 
    506         except: 
    507             # We were not able to estimate the errors, 
    508             # returns an empty covariance matrix 
    509             print "lstsq:", sys.exc_value 
    510             print chi2 
    511             pass 
    512              
    513         # Keep a copy of the last output 
    514          
    515         print "BACKGROUND =", c[0] 
    516         self.background = c[0] 
    517          
    518         for i in range(nfunc_0): 
    519             c_0[i] = c[i+1] 
    520             for j in range(nfunc_0): 
    521                 err_0[i][j] = err[i+1][j+1] 
    522                  
    523         self.out = c_0 
    524         self.cov = err_0 
    525          
    526         return c_0, err_0 
    527  
    528445    def estimate_numterms(self, isquit_func=None): 
    529446        """ 
    530447            Returns a reasonable guess for the 
    531448            number of terms 
     449            @param isquit_func: reference to thread function to call to  
     450                                check whether the computation needs to 
     451                                be stopped. 
    532452             
    533453            @return: number of terms, alpha, message 
     
    548468            regularization constant alpha 
    549469             
     470            @param nfunc: number of terms to use in the expansion. 
    550471            @return: alpha, message, elapsed 
    551472             
     
    641562        file.write("#chi2=%g\n" % self.chi2) 
    642563        file.write("#elapsed=%g\n" % self.elapsed) 
     564        file.write("#qmin=%s\n" % str(self.q_min)) 
     565        file.write("#qmax=%s\n" % str(self.q_max)) 
     566        file.write("#slit_height=%g\n" % self.slit_height) 
     567        file.write("#slit_width=%g\n" % self.slit_width) 
     568        file.write("#background=%g\n" % self.background) 
     569        if self.has_bck==True: 
     570            file.write("#has_bck=1\n") 
     571        else: 
     572            file.write("#has_bck=0\n") 
    643573        file.write("#alpha_estimate=%g\n" % self.suggested_alpha) 
    644574        if not self.out==None: 
     
    692622                        toks = line.split('=') 
    693623                        self.suggested_alpha = float(toks[1]) 
     624                    elif line.startswith('#qmin='): 
     625                        toks = line.split('=') 
     626                        try: 
     627                            self.q_min = float(toks[1]) 
     628                        except: 
     629                            self.q_min = None 
     630                    elif line.startswith('#qmax='): 
     631                        toks = line.split('=') 
     632                        try: 
     633                            self.q_max = float(toks[1]) 
     634                        except: 
     635                            self.q_max = None 
     636                    elif line.startswith('#slit_height='): 
     637                        toks = line.split('=') 
     638                        self.slit_height = float(toks[1]) 
     639                    elif line.startswith('#slit_width='): 
     640                        toks = line.split('=') 
     641                        self.slit_width = float(toks[1]) 
     642                    elif line.startswith('#background='): 
     643                        toks = line.split('=') 
     644                        self.background = float(toks[1]) 
     645                    elif line.startswith('#has_bck='): 
     646                        toks = line.split('=') 
     647                        if int(toks[1])==1: 
     648                            self.has_bck=True 
     649                        else: 
     650                            self.has_bck=False 
    694651             
    695652                    # Now read in the parameters 
  • pr_inversion/num_term.py

    rbd30f4a5 r7578961  
    88         self.nterm_min = 10 
    99         self.nterm_max = len(self.invertor.x) 
     10         if self.nterm_max>50: 
     11             self.nterm_max=50 
    1012         self.isquit_func = None 
    1113          
     
    4850        self.err_list = [] 
    4951        self.alpha_list = [] 
    50         for k in range(self.nterm_min, self.nterm_max): 
     52        for k in range(self.nterm_min, self.nterm_max, 1): 
    5153            if self.isquit_func != None: 
    5254                self.isquit_func() 
     
    5658            osc = inver.oscillations(inver.out) 
    5759            err = inver.get_pos_err(inver.out, inver.cov) 
    58              
     60            if osc>10.0: 
     61                break 
    5962            self.osc_list.append(osc) 
    6063            self.err_list.append(err) 
  • pr_inversion/test/test_output.txt

    r9a23253e r7578961  
    44#chi2=836.797 
    55#elapsed=0 
     6#qmin=None 
     7#qmax=None 
     8#slit_height=0 
     9#slit_width=0 
     10#background=0 
     11#has_bck=0 
    612#alpha_estimate=4.58991e-006 
    713#C_0=217.876478953+-2522.42314999 
Note: See TracChangeset for help on using the changeset viewer.