63 lines
1.8 KiB
C
63 lines
1.8 KiB
C
#include "runtime/error_costs.h"
|
|
|
|
static const unsigned MAX_COST_DIFFERENCE = 16 * ERROR_COST_PER_SKIPPED_TREE;
|
|
static const unsigned MAX_PUSH_COUNT_WITH_COUNT_DIFFERENCE = 24;
|
|
static const unsigned MAX_PUSH_COUNT_TO_ALLOW_MULTIPLE = 32;
|
|
static const unsigned MAX_DEPTH_TO_ALLOW_MULTIPLE = 12;
|
|
|
|
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;
|
|
}
|
|
}
|
|
|
|
if (a.cost < b.cost) {
|
|
if (are_mergeable || (b.cost - a.cost) * (1 + a.push_count) > MAX_COST_DIFFERENCE) {
|
|
return ErrorComparisonTakeLeft;
|
|
} else {
|
|
return ErrorComparisonPreferLeft;
|
|
}
|
|
}
|
|
|
|
if (b.cost < a.cost) {
|
|
if (are_mergeable || (a.cost - b.cost) * (1 + b.push_count) > MAX_COST_DIFFERENCE) {
|
|
return ErrorComparisonTakeRight;
|
|
} else {
|
|
return ErrorComparisonPreferRight;
|
|
}
|
|
}
|
|
|
|
if (a.count > 0) {
|
|
if (a.push_count > MAX_PUSH_COUNT_TO_ALLOW_MULTIPLE ||
|
|
b.push_count > MAX_PUSH_COUNT_TO_ALLOW_MULTIPLE ||
|
|
a.depth > MAX_DEPTH_TO_ALLOW_MULTIPLE ||
|
|
b.depth > MAX_DEPTH_TO_ALLOW_MULTIPLE) {
|
|
return a.depth <= b.depth ?
|
|
ErrorComparisonTakeLeft :
|
|
ErrorComparisonTakeRight;
|
|
} else {
|
|
return a.depth <= b.depth ?
|
|
ErrorComparisonPreferLeft :
|
|
ErrorComparisonPreferRight;
|
|
}
|
|
}
|
|
|
|
return ErrorComparisonNone;
|
|
}
|