| 146 | } |
| 147 | |
| 148 | data_size_t Split( |
| 149 | uint32_t min_bin, uint32_t max_bin, uint32_t default_bin, MissingType missing_type, bool default_left, |
| 150 | uint32_t threshold, data_size_t* data_indices, data_size_t num_data, |
| 151 | data_size_t* lte_indices, data_size_t* gt_indices) const override { |
| 152 | // not need to split |
| 153 | if (num_data <= 0) { return 0; } |
| 154 | VAL_T th = static_cast<VAL_T>(threshold + min_bin); |
| 155 | const VAL_T minb = static_cast<VAL_T>(min_bin); |
| 156 | const VAL_T maxb = static_cast<VAL_T>(max_bin); |
| 157 | VAL_T t_default_bin = static_cast<VAL_T>(min_bin + default_bin); |
| 158 | if (default_bin == 0) { |
| 159 | th -= 1; |
| 160 | t_default_bin -= 1; |
| 161 | } |
| 162 | SparseBinIterator<VAL_T> iterator(this, data_indices[0]); |
| 163 | data_size_t lte_count = 0; |
| 164 | data_size_t gt_count = 0; |
| 165 | data_size_t* default_indices = gt_indices; |
| 166 | data_size_t* default_count = >_count; |
| 167 | if (missing_type == MissingType::NaN) { |
| 168 | if (default_bin <= threshold) { |
| 169 | default_indices = lte_indices; |
| 170 | default_count = <e_count; |
| 171 | } |
| 172 | data_size_t* missing_default_indices = gt_indices; |
| 173 | data_size_t* missing_default_count = >_count; |
| 174 | if (default_left) { |
| 175 | missing_default_indices = lte_indices; |
| 176 | missing_default_count = <e_count; |
| 177 | } |
| 178 | for (data_size_t i = 0; i < num_data; ++i) { |
| 179 | const data_size_t idx = data_indices[i]; |
| 180 | const VAL_T bin = iterator.InnerRawGet(idx); |
| 181 | if (bin < minb || bin > maxb || t_default_bin == bin) { |
| 182 | default_indices[(*default_count)++] = idx; |
| 183 | } else if (bin == maxb) { |
| 184 | missing_default_indices[(*missing_default_count)++] = idx; |
| 185 | } else if (bin > th) { |
| 186 | gt_indices[gt_count++] = idx; |
| 187 | } else { |
| 188 | lte_indices[lte_count++] = idx; |
| 189 | } |
| 190 | } |
| 191 | } else { |
| 192 | if ((default_left && missing_type == MissingType::Zero) || (default_bin <= threshold && missing_type != MissingType::Zero)) { |
| 193 | default_indices = lte_indices; |
| 194 | default_count = <e_count; |
| 195 | } |
| 196 | for (data_size_t i = 0; i < num_data; ++i) { |
| 197 | const data_size_t idx = data_indices[i]; |
| 198 | const VAL_T bin = iterator.InnerRawGet(idx); |
| 199 | if (bin < minb || bin > maxb || t_default_bin == bin) { |
| 200 | default_indices[(*default_count)++] = idx; |
| 201 | } else if (bin > th) { |
| 202 | gt_indices[gt_count++] = idx; |
| 203 | } else { |
| 204 | lte_indices[lte_count++] = idx; |
| 205 | } |
nothing calls this directly
no test coverage detected