2017-02-19 21:52:48 -08:00
|
|
|
#include "runtime/error_costs.h"
|
|
|
|
|
|
2017-06-29 14:58:20 -07:00
|
|
|
static const unsigned MAX_COST_DIFFERENCE = 16 * ERROR_COST_PER_SKIPPED_TREE;
|
|
|
|
|
static const unsigned MAX_PUSH_COUNT_WITH_COUNT_DIFFERENCE = 24;
|
2017-06-30 17:46:11 -07:00
|
|
|
static const unsigned MAX_DEPTH_TO_ALLOW_MULTIPLE = 12;
|
2017-02-19 21:52:48 -08:00
|
|
|
|
2017-06-29 14:58:20 -07:00
|
|
|
ErrorComparison error_status_compare(ErrorStatus a, ErrorStatus b, bool are_mergeable) {
|
|
|
|
|
if (a.count < b.count) {
|
|
|
|
|
if (are_mergeable ||
|
|
|
|
|
a.cost <= b.cost ||
|
|
|
|
|
a.count + 1 < b.count ||
|
|
|
|
|
b.push_count > MAX_PUSH_COUNT_WITH_COUNT_DIFFERENCE) {
|
|
|
|
|
return ErrorComparisonTakeLeft;
|
|
|
|
|
} else {
|
|
|
|
|
return ErrorComparisonPreferLeft;
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
if (b.count < a.count) {
|
|
|
|
|
if (are_mergeable ||
|
|
|
|
|
b.cost <= a.cost ||
|
|
|
|
|
b.count + 1 < a.count ||
|
|
|
|
|
a.push_count > MAX_PUSH_COUNT_WITH_COUNT_DIFFERENCE) {
|
|
|
|
|
return ErrorComparisonTakeRight;
|
|
|
|
|
} else {
|
|
|
|
|
return ErrorComparisonPreferRight;
|
|
|
|
|
}
|
|
|
|
|
}
|
2017-02-19 21:52:48 -08:00
|
|
|
|
2017-06-29 14:58:20 -07:00
|
|
|
if (a.cost < b.cost) {
|
|
|
|
|
if (are_mergeable || (b.cost - a.cost) * (1 + a.push_count) > MAX_COST_DIFFERENCE) {
|
|
|
|
|
return ErrorComparisonTakeLeft;
|
|
|
|
|
} else {
|
|
|
|
|
return ErrorComparisonPreferLeft;
|
|
|
|
|
}
|
|
|
|
|
}
|
2017-02-19 21:52:48 -08:00
|
|
|
|
2017-06-29 14:58:20 -07:00
|
|
|
if (b.cost < a.cost) {
|
|
|
|
|
if (are_mergeable || (a.cost - b.cost) * (1 + b.push_count) > MAX_COST_DIFFERENCE) {
|
|
|
|
|
return ErrorComparisonTakeRight;
|
|
|
|
|
} else {
|
|
|
|
|
return ErrorComparisonPreferRight;
|
|
|
|
|
}
|
|
|
|
|
}
|
2017-02-19 21:52:48 -08:00
|
|
|
|
2017-06-30 17:46:11 -07:00
|
|
|
if (a.count > 0) {
|
2017-07-02 23:28:31 -07:00
|
|
|
if (a.depth > MAX_DEPTH_TO_ALLOW_MULTIPLE ||
|
2017-06-30 17:46:11 -07:00
|
|
|
b.depth > MAX_DEPTH_TO_ALLOW_MULTIPLE) {
|
|
|
|
|
return a.depth <= b.depth ?
|
|
|
|
|
ErrorComparisonTakeLeft :
|
|
|
|
|
ErrorComparisonTakeRight;
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
2017-06-29 14:58:20 -07:00
|
|
|
return ErrorComparisonNone;
|
2017-02-19 21:52:48 -08:00
|
|
|
}
|