LSSTApplications  16.0-11-g09ed895+2,16.0-11-g12e47bd,16.0-11-g9bb73b2+6,16.0-12-g5c924a4+6,16.0-14-g9a974b3+1,16.0-15-g1417920+1,16.0-15-gdd5ca33+1,16.0-16-gf0259e2,16.0-17-g31abd91+7,16.0-17-g7d7456e+7,16.0-17-ga3d2e9f+13,16.0-18-ga4d4bcb+1,16.0-18-gd06566c+1,16.0-2-g0febb12+21,16.0-2-g9d5294e+69,16.0-2-ga8830df+6,16.0-20-g21842373+7,16.0-24-g3eae5ec,16.0-28-gfc9ea6c+4,16.0-29-ge8801f9,16.0-3-ge00e371+34,16.0-4-g18f3627+13,16.0-4-g5f3a788+20,16.0-4-ga3eb747+10,16.0-4-gabf74b7+29,16.0-4-gb13d127+6,16.0-49-g42e581f7+6,16.0-5-g27fb78a+7,16.0-5-g6a53317+34,16.0-5-gb3f8a4b+87,16.0-6-g9321be7+4,16.0-6-gcbc7b31+42,16.0-6-gf49912c+29,16.0-7-gd2eeba5+51,16.0-71-ge89f8615e,16.0-8-g21fd5fe+29,16.0-8-g3a9f023+20,16.0-8-g4734f7a+1,16.0-8-g5858431+3,16.0-9-gf5c1f43+8,master-gd73dc1d098+1,w.2019.01
LSSTDataManagementBasePackage
comparison.py
Go to the documentation of this file.
1 #
2 # LSST Data Management System
3 # Copyright 2008-2013 LSST Corporation.
4 #
5 # This product includes software developed by the
6 # LSST Project (http://www.lsst.org/).
7 #
8 # This program is free software: you can redistribute it and/or modify
9 # it under the terms of the GNU General Public License as published by
10 # the Free Software Foundation, either version 3 of the License, or
11 # (at your option) any later version.
12 #
13 # This program is distributed in the hope that it will be useful,
14 # but WITHOUT ANY WARRANTY; without even the implied warranty of
15 # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
16 # GNU General Public License for more details.
17 #
18 # You should have received a copy of the LSST License Statement and
19 # the GNU General Public License along with this program. If not,
20 # see <http://www.lsstcorp.org/LegalNotices/>.
21 #
22 """
23 Helper functions for comparing Configs.
24 
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.
28 """
29 
30 import numpy
31 
32 __all__ = ("getComparisonName", "compareScalars", "compareConfigs")
33 
34 
35 def getComparisonName(name1, name2):
36  if name1 != name2:
37  return "%s / %s" % (name1, name2)
38  return name1
39 
40 
41 def compareScalars(name, v1, v2, output, rtol=1E-8, atol=1E-8, dtype=None):
42  """Helper function for Config.compare; used to compare two scalar values for equality.
43 
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.
53 
54  Floating point comparisons are performed by numpy.allclose; refer to that for details.
55  """
56  if v1 is None or v2 is None:
57  result = (v1 == v2)
58  elif dtype in (float, complex):
59  result = numpy.allclose(v1, v2, rtol=rtol, atol=atol) or (numpy.isnan(v1) and numpy.isnan(v2))
60  else:
61  result = (v1 == v2)
62  if not result and output is not None:
63  output("Inequality in %s: %r != %r" % (name, v1, v2))
64  return result
65 
66 
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.
69 
70  If the Configs contain RegistryFields or ConfigChoiceFields, unselected Configs
71  will not be compared.
72 
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.
81 
82  Floating point comparisons are performed by numpy.allclose; refer to that for details.
83  """
84  assert name is not None
85  if c1 is None:
86  if c2 is None:
87  return True
88  else:
89  if output is not None:
90  output("LHS is None for %s" % name)
91  return False
92  else:
93  if c2 is None:
94  if output is not None:
95  output("RHS is None for %s" % name)
96  return False
97  if type(c1) != type(c2):
98  if output is not None:
99  output("Config types do not match for %s: %s != %s" % (name, type(c1), type(c2)))
100  return False
101  equal = True
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:
105  return False
106  equal = equal and result
107  return equal
def compareConfigs(name, c1, c2, shortcut=True, rtol=1E-8, atol=1E-8, output=None)
Definition: comparison.py:67
table::Key< int > type
Definition: Detector.cc:164
def compareScalars(name, v1, v2, output, rtol=1E-8, atol=1E-8, dtype=None)
Definition: comparison.py:41
def getComparisonName(name1, name2)
Definition: comparison.py:35