| 572 | |
| 573 | |
| 574 | Dataset* DatasetLoader::CostructFromSampleData(double** sample_values, |
| 575 | int** sample_indices, int num_col, const int* num_per_col, |
| 576 | size_t total_sample_size, data_size_t num_data) { |
| 577 | int num_total_features = num_col; |
| 578 | if (Network::num_machines() > 1) { |
| 579 | num_total_features = Network::GlobalSyncUpByMax(num_total_features); |
| 580 | } |
| 581 | std::vector<std::unique_ptr<BinMapper>> bin_mappers(num_total_features); |
| 582 | // fill feature_names_ if not header |
| 583 | if (feature_names_.empty()) { |
| 584 | for (int i = 0; i < num_col; ++i) { |
| 585 | std::stringstream str_buf; |
| 586 | str_buf << "Column_" << i; |
| 587 | feature_names_.push_back(str_buf.str()); |
| 588 | } |
| 589 | } |
| 590 | if (!config_.max_bin_by_feature.empty()) { |
| 591 | CHECK(static_cast<size_t>(num_col) == config_.max_bin_by_feature.size()); |
| 592 | CHECK(*(std::min_element(config_.max_bin_by_feature.begin(), config_.max_bin_by_feature.end())) > 1); |
| 593 | } |
| 594 | |
| 595 | // get forced split |
| 596 | std::string forced_bins_path = config_.forcedbins_filename; |
| 597 | std::vector<std::vector<double>> forced_bin_bounds = DatasetLoader::GetForcedBins(forced_bins_path, num_col, categorical_features_); |
| 598 | |
| 599 | const data_size_t filter_cnt = static_cast<data_size_t>( |
| 600 | static_cast<double>(config_.min_data_in_leaf * total_sample_size) / num_data); |
| 601 | if (Network::num_machines() == 1) { |
| 602 | // if only one machine, find bin locally |
| 603 | OMP_INIT_EX(); |
| 604 | #pragma omp parallel for schedule(guided) |
| 605 | for (int i = 0; i < num_col; ++i) { |
| 606 | OMP_LOOP_EX_BEGIN(); |
| 607 | if (ignore_features_.count(i) > 0) { |
| 608 | bin_mappers[i] = nullptr; |
| 609 | continue; |
| 610 | } |
| 611 | BinType bin_type = BinType::NumericalBin; |
| 612 | if (categorical_features_.count(i)) { |
| 613 | bin_type = BinType::CategoricalBin; |
| 614 | bool feat_is_unconstrained = ((config_.monotone_constraints.size() == 0) || (config_.monotone_constraints[i] == 0)); |
| 615 | if (!feat_is_unconstrained) { |
| 616 | Log::Fatal("The output cannot be monotone with respect to categorical features"); |
| 617 | } |
| 618 | } |
| 619 | bin_mappers[i].reset(new BinMapper()); |
| 620 | if (config_.max_bin_by_feature.empty()) { |
| 621 | bin_mappers[i]->FindBin(sample_values[i], num_per_col[i], total_sample_size, |
| 622 | config_.max_bin, config_.min_data_in_bin, filter_cnt, |
| 623 | bin_type, config_.use_missing, config_.zero_as_missing, |
| 624 | forced_bin_bounds[i]); |
| 625 | } else { |
| 626 | bin_mappers[i]->FindBin(sample_values[i], num_per_col[i], total_sample_size, |
| 627 | config_.max_bin_by_feature[i], config_.min_data_in_bin, |
| 628 | filter_cnt, bin_type, config_.use_missing, |
| 629 | config_.zero_as_missing, forced_bin_bounds[i]); |
| 630 | } |
| 631 | OMP_LOOP_EX_END(); |
no test coverage detected