! \brief Extract local features from memory */
| 1047 | |
| 1048 | /*! \brief Extract local features from memory */ |
| 1049 | void 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 |
nothing calls this directly
no test coverage detected