@@ -254,10 +254,24 @@ def warn(msg,cdict=None,val=None,prefix=None):
254254 if '_vary' in cdict :
255255 warninfo ['msg' ] += prefix + 'new var expression: ' + _FormatConstraint (cdict ,cdict .get ('_name' ,'New Var' ))
256256 else :
257- warninfo ['msg' ] += prefix + 'constraint equation: ' + _FormatConstraint (cdict ,val )
257+ warninfo ['msg' ] += prefix + 'constraint equation:\n \t ' + _FormatConstraint (cdict ,val )
258258 if warninfo ['msg' ]: warninfo ['msg' ] += '\n '
259259 warninfo ['msg' ] += ' ' + msg
260-
260+ def showChanged (group ):
261+ errmsg = ''
262+ changed = False
263+ for rel in group :
264+ orel = OrigSeq [rel ]
265+ if constrDict [rel ] != OrigConstrDict [orel ]: changed = True
266+ if changed :
267+ errmsg += '\n \n Note that these constraints were changed (due\n '
268+ errmsg += 'to unrefined parameters?) Original constraints:\n '
269+ for rel in group :
270+ orel = OrigSeq [rel ]
271+ errmsg += '\n \t ' + _FormatConstraint (OrigConstrDict [orel ],OrigFixedList [orel ])
272+ errmsg += '\n \n See the Warnings for details on unrefined parameters.\n '
273+ return errmsg
274+
261275 global dependentParmList ,arrayList ,invarrayList ,indParmList ,consNum
262276 # lists of parameters used for error reporting
263277 global undefinedVars # parameters that are used in equivalences but are not defined
@@ -284,6 +298,9 @@ def warn(msg,cdict=None,val=None,prefix=None):
284298 # Hold, Unvaried & Undefined parameters
285299 skipList = []
286300 invalidParms = []
301+ OrigConstrDict = copy .deepcopy (constrDict )
302+ OrigFixedList = copy .deepcopy (fixedList )
303+ OrigSeq = list (range (len (constrDict )))
287304 for cnum ,(cdict ,fixVal ) in enumerate (zip (constrDict ,fixedList )):
288305 #constrVarList += [i for i in cdict if i not in constrVarList and not i.startswith('_')]
289306 valid = 0 # count of good parameters
@@ -334,11 +351,11 @@ def warn(msg,cdict=None,val=None,prefix=None):
334351 notDefList = []
335352
336353 if noVaryList and cdict .get ('_vary' ,True ): # true for constr eq & varied New Var
337- msg = "parameter(s) not varied: "
354+ noVarMsg = "parameter(s) not varied: "
338355 for i ,v in enumerate (noVaryList ):
339- if i != 0 : msg += ', '
340- msg += v
341- warn (msg ,cdict ,fixVal ,prefix = '\n Unused ' )
356+ if i != 0 : noVarMsg += ', '
357+ noVarMsg += v
358+ warn (noVarMsg ,cdict ,fixVal ,prefix = '\n Unused parameters in ' )
342359 for l ,m in ((zeroList ,"have zero multipliers" ), # show warning
343360 (holdList ,'set as "Hold"' ),
344361 #(noVaryList,"not varied"),
@@ -352,20 +369,19 @@ def warn(msg,cdict=None,val=None,prefix=None):
352369 warn (msg ,cdict ,fixVal )
353370 if valid == 0 : # no valid entries
354371 if seqHistNum is None :
355- warn ('Ignoring constraint, contains no usable parameters' ,cdict ,prefix = '\n Unused ' )
372+ warn ('Ignoring this constraint; contains no refined parameters' ,cdict ,prefix = '\n Unused ' )
356373 skipList .append (cnum )
357374 elif problem : # mix of valid & refined and undefined items, cannot use this
358375 if cdict .get ('_vary' ,True ): # true for constr eq & varied New Var
359376 warn ('New Var constraint will be ignored' ,cdict ,prefix = '\n Unused ' )
360377 skipList .append (cnum )
361378 invalidParms += VarKeys (cdict )
362379 elif len (dropList ) > 0 : # mix of valid and problematic items, drop problem vars, but keep rest
363- if GSASIIpath .GetConfigValue ('debug' ):
364- msg = ''
365- for v in dropList :
366- if msg : msg += ' ,'
367- msg += v
368- warn ('removing: ' + msg ,cdict )
380+ msg = ''
381+ for v in dropList :
382+ if msg : msg += ' ,'
383+ msg += v
384+ warn ('removing unvaried: ' + msg ,cdict )
369385 value = fixedList [cnum ]
370386 for var in dropList : # do cleanup
371387 # NB expressions in constraint multipliers have already been evaluated
@@ -375,19 +391,36 @@ def warn(msg,cdict=None,val=None,prefix=None):
375391 value = float (value ) - cdict [var ]* parmDict [var ]
376392 del cdict [var ]
377393 if float (value ) != float (fixedList [cnum ]): fixedList [cnum ] = float (np .round (value ,12 ))
378- if GSASIIpath .GetConfigValue ('debug' ):
379- warn ('revised as: ' + _FormatConstraint (constrDict [cnum ],fixedList [cnum ]))
394+ warn ('constraint revised as: ' + _FormatConstraint (constrDict [cnum ],fixedList [cnum ]))
380395 for i in list (range (len (constrDict )- 1 ,- 1 ,- 1 )): # remove the dropped constraints
381396 if i in skipList :
382397 del constrDict [i ]
383398 del fixedList [i ]
399+ del OrigSeq [i ] # keep pointer to original lists
384400
385401 for i in invalidParms : StoreHold (i ,"Used in invalid constraint" )
386402 if warning : warning += '\n '
387403 warning += warninfo ['msg' ]
388404
389405 groups ,parmlist = GroupConstraints (constrDict )
390406
407+ # Look for duplicate constraints and eliminate one
408+ for group ,depPrmList in zip (groups ,parmlist ):
409+ droplist = []
410+ for i in group :
411+ for j in group :
412+ if i == j : continue
413+ if i in droplist : continue
414+ if j in droplist : continue
415+ if constrDict [i ] == constrDict [j ] and fixedList [i ] == fixedList [j ]:
416+ droplist .append (j )
417+ if droplist and warning : warning += '\n '
418+ for j in sorted (droplist ,reverse = True ):
419+ warning += '\n Ignoring duplicated constraint\n \t '
420+ warning += _FormatConstraint (constrDict [j ],fixedList [j ])
421+ warning += '\n '
422+ del group [group .index (j )]
423+
391424 # now process each group and create the relations that are needed to form
392425 # a non-singular square matrix
393426 # Now check that all parameters are varied (probably do not need to do this
@@ -402,6 +435,7 @@ def warn(msg,cdict=None,val=None,prefix=None):
402435 errmsg += ") than parameters (" + str (len (depPrmList )) + ")\n in these constraints:"
403436 for rel in group :
404437 errmsg += '\n \t ' + _FormatConstraint (constrDict [rel ],fixedList [rel ])
438+ errmsg += showChanged (group )
405439 groupErrors += depPrmList
406440 continue # go on to next group
407441
@@ -416,6 +450,7 @@ def warn(msg,cdict=None,val=None,prefix=None):
416450 errmsg += "\n Error expanding matrix with these constraints:"
417451 for rel in group :
418452 errmsg += '\n \t ' + _FormatConstraint (constrDict [rel ],fixedList [rel ])
453+ errmsg += showChanged (group )
419454 groupErrors += depPrmList
420455 continue
421456
@@ -426,6 +461,7 @@ def warn(msg,cdict=None,val=None,prefix=None):
426461 errmsg += "\n Unexpected singularity with constraints group (in Gram-Schmidt)"
427462 for rel in group :
428463 errmsg += '\n \t ' + _FormatConstraint (constrDict [rel ],fixedList [rel ])
464+ errmsg += showChanged (group )
429465 groupErrors += depPrmList
430466 continue
431467
@@ -440,6 +476,7 @@ def warn(msg,cdict=None,val=None,prefix=None):
440476 errmsg += 'This is unexpected. Please report this (toby@anl.gov)'
441477 for rel in group :
442478 errmsg += '\n \t ' + _FormatConstraint (constrDict [rel ],fixedList [rel ])
479+ errmsg += showChanged (group )
443480 groupErrors += depPrmList
444481 continue
445482
@@ -559,12 +596,12 @@ def CheckEquivalences(constrDict,varyList,fixedList,parmDict=None,seqHistNum=Non
559596 '''
560597
561598 warninfo = {'msg' :'' , 'shown' :- 1 }
562- def warnEqv (msg ,cnum = None ):
599+ def warnEqv (msg ,cnum = None , prefix = 'Problem with equivalence' ):
563600 if cnum is not None and cnum != warninfo ['shown' ]:
564601 warninfo ['shown' ] = cnum
565- if warninfo ['msg' ]: warninfo ['msg' ] += '\n '
566- warninfo ['msg' ] += ' \n Problem with equivalence : ' + _showEquiv (
567- dependentParmList [cnum ],indParmList [cnum ],invarrayList [cnum ])
602+ if warninfo ['msg' ]: warninfo ['msg' ] += '\n \n '
603+ warninfo ['msg' ] += f' { prefix } : '
604+ warninfo [ 'msg' ] += _showEquiv ( dependentParmList [cnum ],indParmList [cnum ],invarrayList [cnum ])
568605 if warninfo ['msg' ]: warninfo ['msg' ] += '\n '
569606 warninfo ['msg' ] += ' ' + msg
570607
@@ -634,23 +671,27 @@ def warnEqv(msg,cnum=None):
634671 if v in constrVarList + convVarList :
635672 changed = True
636673 msg = True
637- warnEqv ("Independent parameter " + str (v )+ ' used in constraint' ,cnum )
674+ warnEqv ("Independent parameter " + str (v )+ ' used in constraint' ,cnum ,
675+ prefix = 'Converting equivalence to constraint' )
638676 if cnum not in convertList : convertList .append (cnum )
639677 for v in varlist :
640678 if v in multdepVarList :
641679 changed = True
642680 msg = True
643- warnEqv ("Dependent parameter " + str (v )+ ' repeated' ,cnum )
681+ warnEqv ("Dependent parameter " + str (v )+ ' repeated' ,cnum ,
682+ prefix = 'Converting equivalence to constraint' )
644683 if cnum not in convertList : convertList .append (cnum )
645684 elif v in indepVarList :
646685 changed = True
647686 msg = True
648- warnEqv ("Dependent parameter " + str (v )+ ' used elsewhere as independent' ,cnum )
687+ warnEqv ("Dependent parameter " + str (v )+ ' used elsewhere as independent' ,cnum ,
688+ prefix = 'Converting equivalence to constraint' )
649689 if cnum not in convertList : convertList .append (cnum )
650690 elif v in constrVarList + convVarList :
651691 changed = True
652692 msg = True
653- warnEqv ("Dependent parameter " + str (v )+ ' used in constraint' ,cnum )
693+ warnEqv ("Dependent parameter " + str (v )+ ' used in constraint' ,cnum ,
694+ prefix = 'Converting equivalence to constraint' )
654695 if cnum not in convertList : convertList .append (cnum )
655696 if msg :
656697 warnEqv ('Converting to "Constr"' ,cnum )
@@ -685,7 +726,8 @@ def warnEqv(msg,cnum=None):
685726 else :
686727 msg = ' All parameters set as "Hold" '
687728 msg += "\n Will ignore equivalence"
688- warnEqv (msg ,cnum )
729+ warnEqv (msg ,cnum ,prefix = 'Unused equivalence' )
730+
689731 removeList .append (cnum )
690732 continue
691733
@@ -711,9 +753,10 @@ def warnEqv(msg,cnum=None):
711753 removeList .append (cnum )
712754 continue
713755 else :
714- msg = 'No parameters varied '
715- msg += "\n Will ignore equivalence"
716- warnEqv (msg ,cnum )
756+ msg = 'Contains no varied parameters'
757+ msg += "\n Will ignore this equivalence"
758+ warnEqv (msg ,cnum ,prefix = 'Unused equivalence' )
759+
717760 removeList .append (cnum )
718761 continue
719762
0 commit comments