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

Method ExtractFeaturesFromMemory

src/io/dataset_loader.cpp:1049–1138  ·  view source on GitHub ↗

! \brief Extract local features from memory */

Source from the content-addressed store, hash-verified

1047
1048/*! \brief Extract local features from memory */
1049void DatasetLoader::ExtractFeaturesFromMemory(std::vector<std::string>* text_data, const Parser* parser, Dataset* dataset) {
1050 std::vector<std::pair<int, double>> oneline_features;
1051 double tmp_label = 0.0f;
1052 auto& ref_text_data = *text_data;
1053 if (predict_fun_ == nullptr) {
1054 OMP_INIT_EX();
1055 // if doesn't need to prediction with initial model
1056 #pragma omp parallel for schedule(static) private(oneline_features) firstprivate(tmp_label)
1057 for (data_size_t i = 0; i < dataset->num_data_; ++i) {
1058 OMP_LOOP_EX_BEGIN();
1059 const int tid = omp_get_thread_num();
1060 oneline_features.clear();
1061 // parser
1062 parser->ParseOneLine(ref_text_data[i].c_str(), &oneline_features, &tmp_label);
1063 // set label
1064 dataset->metadata_.SetLabelAt(i, static_cast<label_t>(tmp_label));
1065 // free processed line:
1066 ref_text_data[i].clear();
1067 // shrink_to_fit will be very slow in linux, and seems not free memory, disable for now
1068 // text_reader_->Lines()[i].shrink_to_fit();
1069 // push data
1070 for (auto& inner_data : oneline_features) {
1071 if (inner_data.first >= dataset->num_total_features_) { continue; }
1072 int feature_idx = dataset->used_feature_map_[inner_data.first];
1073 if (feature_idx >= 0) {
1074 // if is used feature
1075 int group = dataset->feature2group_[feature_idx];
1076 int sub_feature = dataset->feature2subfeature_[feature_idx];
1077 dataset->feature_groups_[group]->PushData(tid, sub_feature, i, inner_data.second);
1078 } else {
1079 if (inner_data.first == weight_idx_) {
1080 dataset->metadata_.SetWeightAt(i, static_cast<label_t>(inner_data.second));
1081 } else if (inner_data.first == group_idx_) {
1082 dataset->metadata_.SetQueryAt(i, static_cast<data_size_t>(inner_data.second));
1083 }
1084 }
1085 }
1086 OMP_LOOP_EX_END();
1087 }
1088 OMP_THROW_EX();
1089 } else {
1090 OMP_INIT_EX();
1091 // if need to prediction with initial model
1092 std::vector<double> init_score(dataset->num_data_ * num_class_);
1093 #pragma omp parallel for schedule(static) private(oneline_features) firstprivate(tmp_label)
1094 for (data_size_t i = 0; i < dataset->num_data_; ++i) {
1095 OMP_LOOP_EX_BEGIN();
1096 const int tid = omp_get_thread_num();
1097 oneline_features.clear();
1098 // parser
1099 parser->ParseOneLine(ref_text_data[i].c_str(), &oneline_features, &tmp_label);
1100 // set initial score
1101 std::vector<double> oneline_init_score(num_class_);
1102 predict_fun_(oneline_features, oneline_init_score.data());
1103 for (int k = 0; k < num_class_; ++k) {
1104 init_score[k * dataset->num_data_ + i] = static_cast<double>(oneline_init_score[k]);
1105 }
1106 // set label

Callers

nothing calls this directly

Calls 10

dataMethod · 0.80
omp_get_thread_numFunction · 0.50
clearMethod · 0.45
ParseOneLineMethod · 0.45
SetLabelAtMethod · 0.45
PushDataMethod · 0.45
SetWeightAtMethod · 0.45
SetQueryAtMethod · 0.45
SetInitScoreMethod · 0.45
FinishLoadMethod · 0.45

Tested by

no test coverage detected