in src/io/dense_bin.hpp [176:254]
data_size_t SplitInner(uint32_t min_bin, uint32_t max_bin,
uint32_t default_bin, uint32_t most_freq_bin,
bool default_left, uint32_t threshold,
const data_size_t* data_indices, data_size_t cnt,
data_size_t* lte_indices,
data_size_t* gt_indices) const {
auto th = static_cast<VAL_T>(threshold + min_bin);
auto t_zero_bin = static_cast<VAL_T>(min_bin + default_bin);
if (most_freq_bin == 0) {
--th;
--t_zero_bin;
}
const auto minb = static_cast<VAL_T>(min_bin);
const auto maxb = static_cast<VAL_T>(max_bin);
data_size_t lte_count = 0;
data_size_t gt_count = 0;
data_size_t* default_indices = gt_indices;
data_size_t* default_count = >_count;
data_size_t* missing_default_indices = gt_indices;
data_size_t* missing_default_count = >_count;
if (most_freq_bin <= threshold) {
default_indices = lte_indices;
default_count = <e_count;
}
if (MISS_IS_ZERO || MISS_IS_NA) {
if (default_left) {
missing_default_indices = lte_indices;
missing_default_count = <e_count;
}
}
if (min_bin < max_bin) {
for (data_size_t i = 0; i < cnt; ++i) {
const data_size_t idx = data_indices[i];
const auto bin = data(idx);
if ((MISS_IS_ZERO && !MFB_IS_ZERO && bin == t_zero_bin) ||
(MISS_IS_NA && !MFB_IS_NA && bin == maxb)) {
missing_default_indices[(*missing_default_count)++] = idx;
} else if ((USE_MIN_BIN && (bin < minb || bin > maxb)) ||
(!USE_MIN_BIN && bin == 0)) {
if ((MISS_IS_NA && MFB_IS_NA) || (MISS_IS_ZERO && MFB_IS_ZERO)) {
missing_default_indices[(*missing_default_count)++] = idx;
} else {
default_indices[(*default_count)++] = idx;
}
} else if (bin > th) {
gt_indices[gt_count++] = idx;
} else {
lte_indices[lte_count++] = idx;
}
}
} else {
data_size_t* max_bin_indices = gt_indices;
data_size_t* max_bin_count = >_count;
if (maxb <= th) {
max_bin_indices = lte_indices;
max_bin_count = <e_count;
}
for (data_size_t i = 0; i < cnt; ++i) {
const data_size_t idx = data_indices[i];
const auto bin = data(idx);
if (MISS_IS_ZERO && !MFB_IS_ZERO && bin == t_zero_bin) {
missing_default_indices[(*missing_default_count)++] = idx;
} else if (bin != maxb) {
if ((MISS_IS_NA && MFB_IS_NA) || (MISS_IS_ZERO && MFB_IS_ZERO)) {
missing_default_indices[(*missing_default_count)++] = idx;
} else {
default_indices[(*default_count)++] = idx;
}
} else {
if (MISS_IS_NA && !MFB_IS_NA) {
missing_default_indices[(*missing_default_count)++] = idx;
} else {
max_bin_indices[(*max_bin_count)++] = idx;
}
}
}
}
return lte_count;
}