Changeset 5145


Ignore:
Timestamp:
Jan 17, 2022 5:29:52 PM (7 months ago)
Author:
toby
Message:

fix testDeriv to handle derivatives of parameters created by constraints; fix their derivative computation

Location:
trunk
Files:
2 edited

Legend:

Unmodified
Added
Removed
  • trunk/GSASIImapvars.py

    r5142 r5145  
    23822382            if name not in varyList: continue # skip if independent var not varied
    23832383            if multarr is None:
     2384                if debug: print ('start dMdv for',name,dMdv[varyList.index(name)])
    23842385                for v,m in zip(varlist,invmultarr):
    2385                     if debug: print ('start dMdv',dMdv[varyList.index(name)])
    2386                     if debug: print ('add derv',v,'/',m[0],'to derv',name,'add=',derivDict[v] / m[0])
     2386                    if m[0] == 0: continue
     2387                    dMdv[varyList.index(name)] += derivDict[v]/ m[0]
     2388            else:
     2389                for v,m in zip(varlist,invmultarr[:,i]):
    23872390                    if m == 0: continue
    2388                     dMdv[varyList.index(name)] += derivDict[v] / m[0]
    2389             else:
    2390                 for v,m in zip(varlist,multarr[i,:]):
    2391                     if debug: print ('start dMdv',dMdv[varyList.index(name)])
    2392                     if debug: print ('add derv',v,'*',m,'to derv',name,'add=',m * derivDict[v])
    2393                     if m == 0 or name not in varyList: continue
    23942391                    dMdv[varyList.index(name)] += m * derivDict[v]
    23952392
  • trunk/testDeriv.py

    r5114 r5145  
    2424import os
    2525import platform
     26import copy
    2627if '2' in platform.python_version_tuple()[0]:
    2728    import cPickle
     
    4546
    4647try:
    47     wx.NewId
     48    NewId = wx.NewIdRef
    4849except AttributeError:
    49     wx.NewId = wx.NewIdRef
    50 
    51 def create(parent):
    52     return testDeriv(parent)
    53    
     50    NewId = wx.NewId
    5451[wxID_FILEEXIT, wxID_FILEOPEN, wxID_MAKEPLOTS, wxID_CLEARSEL,wxID_SELECTALL,
    55 ] = [wx.NewId() for _init_coll_File_Items in range(5)]
     52] = [NewId() for _init_coll_File_Items in range(5)]
    5653
    5754def FileDlgFixExt(dlg,file):            #this is needed to fix a problem in linux wx.FileDialog
     
    6865        self.testDerivMenu = wx.MenuBar()
    6966        self.File = wx.Menu(title='')
    70         self.File.Append(wxID_FILEOPEN,'Open testDeriv file','Open testDeriv')
    71         self.File.Append(wxID_MAKEPLOTS,'Make plots','Make derivative plots')
    72         self.File.Append(wxID_SELECTALL,'Select all')
    73         self.File.Append(wxID_CLEARSEL,'Clear selections')
    74         self.File.Append(wxID_FILEEXIT,'Exit','Exit from testDeriv')
     67        self.File.Append(wxID_FILEOPEN,'Open testDeriv file\tCtrl+O','Open testDeriv')
     68        self.File.Append(wxID_MAKEPLOTS,'Make plots\tCtrl+P','Make derivative plots')
     69        self.File.Append(wxID_SELECTALL,'Select all\tCtrl+S')
     70        self.File.Append(wxID_CLEARSEL,'Clear selections\tCtrl+C')
     71        self.File.Append(wxID_FILEEXIT,'Exit\tALT+F4','Exit from testDeriv')
    7572        self.Bind(wx.EVT_MENU,self.OnTestRead, id=wxID_FILEOPEN)
    7673        self.Bind(wx.EVT_MENU,self.OnMakePlots,id=wxID_MAKEPLOTS)
     
    8077        self.testDerivMenu.Append(menu=self.File, title='File')
    8178        self.SetMenuBar(self.testDerivMenu)
    82         self.testDerivPanel = wx.ScrolledWindow(self)       
     79        self.testDerivPanel = wx.ScrolledWindow(self)
    8380        self.plotNB = plot.PlotNotebook()
    8481        self.testFile = ''
     
    9895        self.testfile = []
    9996        self.dataFrame = None
     97        self.timingOn = False
    10098
    10199    def ExitMain(self, event):
     
    149147                self.delt[iname] = 0.1
    150148        file.close()
     149        G2mv.InitVars()
    151150        msg = G2mv.EvaluateMultipliers(self.constrDict,self.parmDict)
    152151        if msg:
     
    156155        print(G2mv.VarRemapShow(self.varylist))
    157156        print('Dependent Vary List:',self.depVarList)
    158            
     157        G2mv.Map2Dict(self.parmDict,copy.copy(self.varylist))   # compute independent params, N.B. changes varylist
     158        G2mv.Dict2Map(self.parmDict) # imposes constraints on dependent values
     159
    159160    def UpdateControls(self,event):
    160        
    161161        def OnItemCk(event):
    162162            Obj = event.GetEventObject()
     
    175175            Obj.SetValue('%g'%(value))
    176176       
    177         self.testDerivPanel.DestroyChildren()
     177        if self.testDerivPanel.GetSizer():
     178            self.testDerivPanel.GetSizer().Clear(True)
    178179        ObjInd = {}
    179         names = self.names
    180180        use = self.use
    181181        delt = self.delt
     182        topSizer = wx.BoxSizer(wx.VERTICAL)
     183        self.timingVal = wx.CheckBox(self.testDerivPanel,label='Show Execution Profiling')
     184        topSizer.Add(self.timingVal,0)
     185        topSizer.Add((-1,10))
    182186        mainSizer = wx.FlexGridSizer(0,8,5,5)
    183         for id,[ck,name,d] in enumerate(zip(use,names,delt)):
     187        for id,[ck,name,d] in enumerate(zip(use,self.names,delt)):
    184188            useVal = wx.CheckBox(self.testDerivPanel,label=name)
    185189            useVal.SetValue(ck)
     
    192196            delVal.Bind(wx.EVT_KILL_FOCUS,OnDelValue)
    193197            mainSizer.Add(delVal,0)
    194         self.testDerivPanel.SetSizer(mainSizer)   
    195         Size = mainSizer.GetMinSize()
    196         self.testDerivPanel.SetScrollbars(10,10,Size[0]/10-4,Size[1]/10-1)
     198        topSizer.Add(mainSizer,0)
     199        self.testDerivPanel.SetSizer(topSizer)   
     200        Size = topSizer.GetMinSize()
     201        self.testDerivPanel.SetScrollbars(10,10,int(Size[0]/10-4),int(Size[1]/10-1))
    197202        Size[1] = min(200,Size[1])
    198         self.testDerivPanel.SetSize(Size)
     203        Size[0] += 20
     204        self.SetSize(Size)
    199205
    200206    def OnMakePlots(self,event):
     
    202208        def test1():
    203209            fplot = self.plotNB.add('function test').gca()
    204             pr = cProfile.Profile()
    205             pr.enable()
     210            if self.timingOn:
     211                pr = cProfile.Profile()
     212                pr.enable()
    206213            M = G2stMth.errRefine(self.values,self.HistoPhases,
    207214                self.parmDict,self.varylist,self.calcControls,
    208215                self.pawleyLookup,None)
    209             pr.disable()
    210             s = StringIO.StringIO()
    211             sortby = 'tottime'
    212             ps = pstats.Stats(pr, stream=s).strip_dirs().sort_stats(sortby)
    213             print('Profiler of function calculation; top 50% of routines:')
    214             ps.print_stats("GSASII",.5)
    215             print(s.getvalue())
     216            if self.timingOn:
     217                pr.disable()
     218                s = StringIO.StringIO()
     219                sortby = 'tottime'
     220                ps = pstats.Stats(pr, stream=s).strip_dirs().sort_stats(sortby)
     221                print('Profiler of function calculation; top 50% of routines:')
     222                ps.print_stats("GSASII",.5)
     223                print(s.getvalue())
    216224            fplot.plot(M,'r',label='M')
    217225            fplot.legend(loc='best')
     
    219227        def test2(name,delt,doProfile):
    220228            Title = 'derivatives test for '+name
    221             names = self.names
     229            ind = self.names.index(name)
    222230            hplot = self.plotNB.add(Title).gca()
    223             if doProfile:
     231            if doProfile and self.timingOn:
    224232                pr = cProfile.Profile()
    225233                pr.enable()
     
    229237                self.pawleyLookup,None)
    230238            dMdV = G2stMth.dervRefine(self.values,self.HistoPhases,self.parmDict,
    231                 names,self.calcControls,self.pawleyLookup,None)
    232             if doProfile:
     239                self.names,self.calcControls,self.pawleyLookup,None)
     240            if doProfile and self.timingOn:
    233241                pr.disable()
    234242                s = StringIO.StringIO()
     
    238246                print('Profiler of '+name+' derivative calculation; top 50% of routines:')
    239247                print(s.getvalue())
    240             M2 = dMdV[names.index(name)]
     248            M2 = dMdV[ind]
    241249            hplot.plot(M2,'b',label='analytic deriv')
    242             mmin = np.min(dMdV[names.index(name)])
    243             mmax = np.max(dMdV[names.index(name)])
     250            mmin = np.min(dMdV[ind])
     251            mmax = np.max(dMdV[ind])
    244252            if name in self.varylist:
    245                 self.values[self.varylist.index(name)] -= delt
     253                ind = self.varylist.index(name)
     254                orig = copy.copy(self.parmDict)  # save parmDict before changes
     255                self.parmDict[name] = self.values[ind] =  self.values[ind] - delt
     256                G2mv.Dict2Map(self.parmDict)
     257                first = True
     258                for i in self.parmDict:
     259                    if orig[i] != self.parmDict[i] and i != name:
     260                        if first:
     261                            print('Propogated changes from this shift')
     262                            print(name,orig[name],self.parmDict[name],orig[name]-self.parmDict[name])
     263                            print('are:')
     264                            first = False
     265                        print(i,orig[i],self.parmDict[i],orig[i]-self.parmDict[i])
    246266                M0 = G2stMth.errRefine(self.values,self.HistoPhases,self.parmDict,
    247                     names,self.calcControls,self.pawleyLookup,None)
    248                 self.values[self.varylist.index(name)] += 2.*delt
     267                    self.names,self.calcControls,self.pawleyLookup,None)
     268                self.parmDict[name] = self.values[ind] =  self.values[ind] + 2.*delt
     269                G2mv.Dict2Map(self.parmDict)
    249270                M1 = G2stMth.errRefine(self.values,self.HistoPhases,self.parmDict,
    250                     names,self.calcControls,self.pawleyLookup,None)
    251                 self.values[self.varylist.index(name)] -= delt
     271                    self.names,self.calcControls,self.pawleyLookup,None)
     272                self.parmDict[name] = self.values[ind] =  self.values[ind] - delt
     273                G2mv.Dict2Map(self.parmDict)
    252274            elif name in self.depVarList:   #in depVarList
    253275                if 'dA' in name:
    254276                    name = name.replace('dA','A')
    255                     delt *= -1
     277                    #delt *= -1  # why???
    256278                self.parmDict[name] -= delt
     279                G2mv.Dict2Map(self.parmDict)
    257280                M0 = G2stMth.errRefine(self.values,self.HistoPhases,self.parmDict,
    258                     names,self.calcControls,self.pawleyLookup,None)
     281                        self.names,self.calcControls,self.pawleyLookup,None)
    259282                self.parmDict[name] += 2.*delt
     283                G2mv.Dict2Map(self.parmDict)
    260284                M1 = G2stMth.errRefine(self.values,self.HistoPhases,self.parmDict,
    261                     names,self.calcControls,self.pawleyLookup,None)
     285                        self.names,self.calcControls,self.pawleyLookup,None)
    262286                self.parmDict[name] -= delt   
     287                G2mv.Dict2Map(self.parmDict)
    263288            Mn = (M1-M0)/(2.*abs(delt))
    264289            print('parameter:',name,self.parmDict[name],delt,mmin,mmax,np.sum(M0),np.sum(M1),np.sum(Mn))
     
    270295           
    271296        test1()
     297        self.timingOn = self.timingVal.GetValue()
    272298
    273299        doProfile = True
    274         for use,name,delt in zip(self.use,self.varylist+self.depVarList,self.delt):
     300        for use,name,delt in zip(self.use,self.names,self.delt):
    275301            if use:
    276302                test2(name,delt,doProfile)
     
    279305        self.plotNB.Show()
    280306       
    281 class testDerivmain(wx.App):
    282     def OnInit(self):
    283         self.main = testDeriv(None)
    284         self.main.Show()
    285         self.SetTopWindow(self.main)
    286         return True
    287 
    288307def main():
    289308    'Starts main application to compute and plot derivatives'
    290     application = testDerivmain(0)
     309    application = wx.App(0)
     310    application.main = testDeriv(None)
     311    application.main.Show()
     312    application.SetTopWindow(application.main)
    291313    application.MainLoop()
    292314   
Note: See TracChangeset for help on using the changeset viewer.