18 #include "eckit/exception/Exceptions.h"
19 #include "eckit/log/Log.h"
44 template <
typename T1,
typename T2>
45 bool compare(T1& it1,
const T1& end1,
46 T2& it2,
const T2& end2,
47 const std::string& desc1,
const std::string& desc2);
49 template <
typename T1,
typename T2>
50 bool compare(T1& it1,
const T1& end1,
51 T2& it2,
const T2& end2,
52 const std::string& desc1,
const std::string& desc2,
53 const std::vector<std::string>& excludedColumnsTypes,
54 const std::vector<std::string>& excludedColumns);
56 void compare(eckit::DataHandle&, eckit::DataHandle&);
57 void compare(
const eckit::PathName&,
const eckit::PathName&);
59 void compare(
const eckit::PathName& pathName1,
60 const eckit::PathName& pathName2,
61 const std::vector<std::string>& excludedColumnsTypes,
62 const std::vector<std::string>& excludedcolumns);
65 const std::set<std::string>& excludedColumnsTypes,
66 const std::set<std::string>& excludedColumns,
67 std::vector<int>& skipCols);
80 const std::vector<int>& skipCols);
84 inline static double err(
double A,
double B)
89 relativeError = fabs(A-B);
90 else if (fabs(B) > fabs(A))
91 relativeError = fabs((A - B) / B);
93 relativeError = fabs((A - B) / A);
107 template<
typename T1,
typename T2>
108 bool Comparator::compare(T1& it1,
const T1& end1, T2& it2,
const T2& end2,
const std::string& desc1,
const std::string& desc2)
110 std::vector<std::string> noExcludedColumnsTypes;
111 std::vector<std::string> noExcludedColumns;
112 return compare(it1, end1, it2, end2, desc1, desc2, noExcludedColumnsTypes, noExcludedColumns);
115 template<
typename T1,
typename T2>
117 T2& it2,
const T2& end2,
118 const std::string& desc1,
const std::string& desc2,
119 const std::vector<std::string>& excludedColumnsTypes,
120 const std::vector<std::string>& excludedColumns)
122 eckit::Log::info() <<
"Comparator::compare: (1) " << desc1 <<
" to (2) " << desc2 << std::endl;
127 std::vector<int> skipCols;
130 std::set<std::string> excludedColumnsTypesSet(excludedColumnsTypes.begin(), excludedColumnsTypes.end());
131 std::set<std::string> excludedColumnsSet(excludedColumns.begin(), excludedColumns.end());
133 compare(it1->columns(), it2->columns(), excludedColumnsTypesSet, excludedColumnsSet, skipCols);
135 for (; it1 != end1 && it2 != end2; ++it1, ++it2)
139 if (it1->isNewDataset())
140 compare(it1->columns(), it2->columns(), excludedColumnsTypesSet, excludedColumnsSet, skipCols);
141 if (it2->isNewDataset())
142 compare(it1->columns(), it2->columns(), excludedColumnsTypesSet, excludedColumnsSet, skipCols);
144 compare(it1->columns().size(), it1->data(), it2->data(), it1->columns(), it2->columns(), skipCols);
147 ASSERT(
"First file has more rows!" && ! (it1 != end1));
148 ASSERT(
"Second file has more rows!" && ! (it2 != end2));
void compare(const eckit::PathName &pathName1, const eckit::PathName &pathName2, const std::vector< std::string > &excludedColumnsTypes, const std::vector< std::string > &excludedcolumns)
static double err(double A, double B)
bool compare(T1 &it1, const T1 &end1, T2 &it2, const T2 &end2, const std::string &desc1, const std::string &desc2)
void raiseNotEqual(const core::Column &, double, double)
static int same(double A, double B)
Comparator(bool checkMissingFlag=true)
void checkMissingFlag(bool v)
void compare(const eckit::PathName &, const eckit::PathName &)
const double maxRelativeError
const double maxAbsoluteError