MCPcopy Create free account
hub / github.com/antmachineintelligence/mtgbmcode / CostructFromSampleData

Method CostructFromSampleData

src/io/dataset_loader.cpp:574–723  ·  view source on GitHub ↗

Source from the content-addressed store, hash-verified

572
573
574Dataset* 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();

Calls 15

min_elementFunction · 0.85
push_backMethod · 0.80
resetMethod · 0.80
dataMethod · 0.80
emptyMethod · 0.45
sizeMethod · 0.45
beginMethod · 0.45
endMethod · 0.45
countMethod · 0.45
FindBinMethod · 0.45
SizesInByteMethod · 0.45
CopyToMethod · 0.45

Tested by

no test coverage detected