23 Helper functions for comparing Configs. 25 The function here should be use for any comparison in a Config.compare 26 or Field._compare implementation, as they take care of writing messages 27 as well as floating-point comparisons and shortcuts. 32 __all__ = (
"getComparisonName",
"compareScalars",
"compareConfigs")
37 return "%s / %s" % (name1, name2)
42 """Helper function for Config.compare; used to compare two scalar values for equality. 44 @param[in] name Name to use when reporting differences 45 @param[in] dtype Data type for comparison; may be None if it's definitely not floating-point. 46 @param[in] v1 LHS value to compare 47 @param[in] v2 RHS value to compare 48 @param[in] output If not None, a callable that takes a string, used (possibly repeatedly) 49 to report inequalities. 50 @param[in] rtol Relative tolerance for floating point comparisons. 51 @param[in] atol Absolute tolerance for floating point comparisons. 52 @param[in] dtype Data type for comparison; may be None if it's definitely not floating-point. 54 Floating point comparisons are performed by numpy.allclose; refer to that for details. 56 if v1
is None or v2
is None:
58 elif dtype
in (float, complex):
59 result = numpy.allclose(v1, v2, rtol=rtol, atol=atol)
or (numpy.isnan(v1)
and numpy.isnan(v2))
62 if not result
and output
is not None:
63 output(
"Inequality in %s: %r != %r" % (name, v1, v2))
67 def compareConfigs(name, c1, c2, shortcut=True, rtol=1E-8, atol=1E-8, output=None):
68 """Helper function for Config.compare; used to compare two Configs for equality. 70 If the Configs contain RegistryFields or ConfigChoiceFields, unselected Configs 73 @param[in] name Name to use when reporting differences 74 @param[in] c1 LHS config to compare 75 @param[in] c2 RHS config to compare 76 @param[in] shortcut If True, return as soon as an inequality is found. 77 @param[in] rtol Relative tolerance for floating point comparisons. 78 @param[in] atol Absolute tolerance for floating point comparisons. 79 @param[in] output If not None, a callable that takes a string, used (possibly repeatedly) 80 to report inequalities. 82 Floating point comparisons are performed by numpy.allclose; refer to that for details. 84 assert name
is not None 89 if output
is not None:
90 output(
"LHS is None for %s" % name)
94 if output
is not None:
95 output(
"RHS is None for %s" % name)
97 if type(c1) != type(c1):
98 if output
is not None:
99 output(
"Config types do not match for %s: %s != %s" % (name, type(c1), type(c2)))
102 for field
in c1._fields.values():
103 result = field._compare(c1, c2, shortcut=shortcut, rtol=rtol, atol=atol, output=output)
104 if not result
and shortcut:
106 equal = equal
and result
def compareConfigs(name, c1, c2, shortcut=True, rtol=1E-8, atol=1E-8, output=None)
def compareScalars(name, v1, v2, output, rtol=1E-8, atol=1E-8, dtype=None)
def getComparisonName(name1, name2)