Changeset 4682 for trunk/GSASIIstrMain.py
- Timestamp:
- Dec 26, 2020 12:25:59 AM (2 years ago)
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
trunk/GSASIIstrMain.py
r4666 r4682 48 48 DEBUG = True 49 49 50 def ReportProblems(result,Rvals,varyList): 51 '''Create a message based results from the refinement 52 ''' 53 #report on SVD 0's and highly correlated variables 54 msg = '' 55 SVD0 = result[2].get('SVD0') 56 if SVD0 > 0: 57 msg += 'Warning: There were {} singularities in the Hessian'.format(SVD0) 58 # process singular variables 59 psing = result[2].get('psing',[]) 60 if psing: 61 if msg: msg += '\n' 62 msg += 'Parameters dropped due to singularities:' 63 for i,val in enumerate(psing): 64 if i == 0: 65 msg += '\n\t{}'.format(varyList[val]) 66 else: 67 msg += ', {}'.format(varyList[val]) 68 #report on highly correlated variables 69 Hcorr = result[2].get('Hcorr',[]) 70 for i,(v1,v2,corr) in enumerate(Hcorr): 71 if msg: msg += '\n' 72 if i == 0: 73 msg += 'Note highly correlated parameters:\n' 74 if corr > .95: 75 stars = '**' 76 else: 77 stars = ' ' 78 msg += ' {} {} and {} (@{:.2f}%)'.format( 79 stars,varyList[v1],varyList[v2],100.*corr) 80 if msg: 81 if 'msg' not in Rvals: Rvals['msg'] = '' 82 Rvals['msg'] += msg 83 50 84 def RefineCore(Controls,Histograms,Phases,restraintDict,rigidbodyDict,parmDict,varyList, 51 85 calcControls,pawleyLookup,ifSeq,printFile,dlg,refPlotUpdate=None): … … 60 94 # print 'current',varyList 61 95 # for item in parmDict: print item,parmDict[item] ######### show dict just before refinement 62 G2mv.Map2Dict(parmDict,varyList)63 96 ifPrint = True 64 97 if ifSeq: … … 67 100 chisq0 = None 68 101 while True: 102 G2mv.Map2Dict(parmDict,varyList) 69 103 begin = time.time() 70 104 values = np.array(G2stMth.Dict2Values(parmDict, varyList)) … … 95 129 ncyc = result[2]['num cyc']+1 96 130 Rvals['lamMax'] = result[2]['lamMax'] 131 if 'msg' in result[2]: 132 Rvals['msg'] = result[2]['msg'] 97 133 Controls['Marquardt'] = -3 #reset to default 98 134 if 'chisq0' in result[2] and chisq0 is None: … … 164 200 # table = dict(zip(varyList,zip(values,result[0],(result[0]-values)/sig))) 165 201 # for item in table: print item,table[item] #useful debug - are things shifting? 202 # report on refinement issues. Result in Rvals['msg'] 203 ReportProblems(result,Rvals,varyList) 166 204 break #refinement succeeded - finish up! 167 except TypeError: #result[1] is None on singular matrix or LinAlgError 205 except TypeError: 206 # if we get here, no result[1] (covar matrix) was returned or other calc error: refinement failed 168 207 IfOK = False 169 208 if not len(varyList): 170 209 covMatrix = [] 171 210 break 172 G2fil.G2Print ('**** Refinement failed - singular matrix ****',mode='error')173 211 if 'Hessian' in Controls['deriv type']: 212 SVD0 = result[2].get('SVD0') 213 if SVD0 == -1: 214 G2fil.G2Print ('**** Refinement failed - singular matrix ****',mode='error') 215 elif SVD0 == -2: 216 G2fil.G2Print ('**** Refinement failed - other problem ****',mode='error') 217 elif SVD0 > 0: 218 G2fil.G2Print ('**** Refinement failed with {} SVD singularities ****'.format(SVD0),mode='error') 219 else: 220 G2fil.G2Print ('**** Refinement failed ****',mode='error') 174 221 if result[1] is None: 175 222 IfOK = False 176 223 covMatrix = [] 177 224 sig = len(varyList)*[None,] 178 break 179 num = len(varyList)-1 180 for i,val in enumerate(np.flipud(result[2]['psing'])): 181 if val: 182 G2fil.G2Print ('Removing parameter: '+varyList[num-i]) 183 del(varyList[num-i]) 225 # report on highly correlated variables 226 ReportProblems(result,Rvals,varyList) 227 # process singular variables 228 psing = result[2].get('psing',[]) 229 if dlg: break # refining interactively 230 # non-interactive refinement 231 for val in sorted(psing,reverse=True): 232 G2fil.G2Print ('Removing parameter: '+varyList[val]) 233 del(varyList[val]) 234 if not psing: break # removed variable(s), try again 184 235 else: 236 G2fil.G2Print ('**** Refinement failed - singular matrix ****',mode='error') 185 237 Ipvt = result[2]['ipvt'] 186 238 for i,ipvt in enumerate(Ipvt): … … 196 248 197 249 def Refine(GPXfile,dlg=None,makeBack=True,refPlotUpdate=None): 198 'Global refinement -- refines to minimize against all histograms' 250 '''Global refinement -- refines to minimize against all histograms. 251 This can be called in one of three ways, from :meth:`GSASIIdataGUI.GSASII.OnRefine` in an 252 interactive refinement, where dlg will be a wx.ProgressDialog, or non-interactively from 253 :meth:`GSASIIscriptable.G2Project.refine` or from :func:`main`, where dlg will be None. 254 ''' 199 255 import GSASIImpsubs as G2mp 200 256 G2mp.InitMP() … … 217 273 G2fil.G2Print (' *** ERROR - you have no phases to refine! ***') 218 274 G2fil.G2Print (' *** Refine aborted ***') 219 return False, 'No phases'275 return False,{'msg':'No phases'} 220 276 if not Histograms: 221 277 G2fil.G2Print (' *** ERROR - you have no data to refine with! ***') 222 278 G2fil.G2Print (' *** Refine aborted ***') 223 return False, 'No data'279 return False,{'msg':'No data'} 224 280 rigidbodyDict = G2stIO.GetRigidBodies(GPXfile) 225 281 rbIds = rigidbodyDict.get('RBIds',{'Vector':[],'Residue':[]}) … … 250 306 msg = G2mv.EvaluateMultipliers(constrDict,parmDict) 251 307 if msg: 252 return False, 'Unable to interpret multiplier(s): '+msg308 return False,{'msg':'Unable to interpret multiplier(s): '+msg} 253 309 try: 254 310 G2mv.GenerateConstraints(varyList,constrDict,fixedList,parmDict) … … 261 317 #print 'Errors',errmsg 262 318 #if warnmsg: print 'Warnings',warnmsg 263 return False, ' Constraint error'319 return False,{'msg':' Constraint error'} 264 320 # print G2mv.VarRemapShow(varyList) 265 321 … … 280 336 printFile.write('\n Refinement results:\n') 281 337 printFile.write(135*'-'+'\n') 338 Rvals = {} 282 339 try: 283 340 covData = {} … … 305 362 G2stIO.SetHistogramData(parmDict,sigDict,Histograms,calcControls,pFile=printFile) 306 363 if len(frozen): 364 if 'msg' in Rvals: 365 Rvals['msg'] += '\n' 366 else: 367 Rvals['msg'] = '' 307 368 msg = ('Warning: {} variable(s) refined outside limits and were frozen ({} total frozen)' 308 369 .format(len(frozen),len(parmFrozenList)) 309 370 ) 310 371 G2fil.G2Print(msg) 311 Rvals['msg'] = msg372 Rvals['msg'] += msg 312 373 elif len(parmFrozenList): 374 if 'msg' in Rvals: 375 Rvals['msg'] += '\n' 376 else: 377 Rvals['msg'] = '' 313 378 msg = ('Note: a total of {} variable(s) are frozen due to refining outside limits' 314 379 .format(len(parmFrozenList)) 315 380 ) 316 381 G2fil.G2Print('Note: ',msg) 317 Rvals['msg'] = msg382 Rvals['msg'] += msg 318 383 G2stIO.SetUsedHistogramsAndPhases(GPXfile,Histograms,Phases,rigidbodyDict,covData,parmFrozenList,makeBack) 319 384 printFile.close() … … 321 386 G2fil.G2Print (' ***** Refinement successful *****') 322 387 else: 323 G2fil.G2Print ('****ERROR - Refinement failed') 324 raise G2obj.G2Exception('****ERROR - Refinement failed') 388 G2fil.G2Print ('****ERROR - Refinement failed',mode='error') 389 if 'msg' in Rvals: 390 G2fil.G2Print ('Note refinement problem:',mode='warn') 391 G2fil.G2Print (Rvals['msg'],mode='warn') 392 raise G2obj.G2Exception('**** ERROR: Refinement failed ****') 325 393 except G2obj.G2RefineCancel as Msg: 326 394 printFile.close() 327 395 G2fil.G2Print (' ***** Refinement stopped *****') 328 return False,Msg.msg 329 except G2obj.G2Exception as Msg: # cell metric error, others? 396 if not hasattr(Msg,'msg'): Msg.msg = str(Msg) 397 if 'msg' in Rvals: 398 Rvals['msg'] += '\n' 399 Rvals['msg'] += Msg.msg 400 if not dlg: 401 G2fil.G2Print ('Note refinement problem:',mode='warn') 402 G2fil.G2Print (Rvals['msg'],mode='warn') 403 else: 404 Rvals['msg'] = Msg.msg 405 return False,Rvals 406 # except G2obj.G2Exception as Msg: # cell metric error, others? 407 except Exception as Msg: # cell metric error, others? 408 if GSASIIpath.GetConfigValue('debug'): 409 import traceback 410 print(traceback.format_exc()) 411 if not hasattr(Msg,'msg'): Msg.msg = str(Msg) 330 412 printFile.close() 331 413 G2fil.G2Print (' ***** Refinement error *****') 332 return False,Msg.msg 414 if 'msg' in Rvals: 415 Rvals['msg'] += '\n\n' 416 Rvals['msg'] += Msg.msg 417 if not dlg: 418 G2fil.G2Print ('Note refinement problem:',mode='warn') 419 G2fil.G2Print (Rvals['msg'],mode='warn') 420 else: 421 Rvals['msg'] = Msg.msg 422 return False,Rvals 333 423 334 424 #for testing purposes, create a file for testderiv … … 346 436 if dlg: 347 437 return True,Rvals 438 elif 'msg' in Rvals: 439 G2fil.G2Print ('Reported from refinement:',mode='warn') 440 G2fil.G2Print (Rvals['msg'],mode='warn') 348 441 349 442 def phaseCheck(phaseVary,Phases,histogram): … … 642 735 643 736 except G2obj.G2RefineCancel as Msg: 737 if not hasattr(Msg,'msg'): Msg.msg = str(Msg) 644 738 printFile.close() 645 739 G2fil.G2Print (' ***** Refinement stopped *****') 646 740 return False,Msg.msg 647 741 except G2obj.G2Exception as Msg: # cell metric error, others? 742 if not hasattr(Msg,'msg'): Msg.msg = str(Msg) 648 743 printFile.close() 649 744 G2fil.G2Print (' ***** Refinement error *****') … … 657 752 G2stIO.SetSeqResult(GPXfile,Histograms,SeqResult) 658 753 except Exception as msg: 659 print('Error reading Sequential results ')754 print('Error reading Sequential results\n',str(msg)) 660 755 if GSASIIpath.GetConfigValue('debug'): 661 756 import traceback
Note: See TracChangeset
for help on using the changeset viewer.