| 390 | } |
| 391 | |
| 392 | void Metadata::LoadInitialScore(const char* initscore_file) { |
| 393 | num_init_score_ = 0; |
| 394 | std::string init_score_filename(initscore_file); |
| 395 | if (init_score_filename.size() <= 0) { |
| 396 | init_score_filename = std::string(data_filename_); |
| 397 | // default weight file name |
| 398 | init_score_filename.append(".init"); |
| 399 | } |
| 400 | TextReader<size_t> reader(init_score_filename.c_str(), false); |
| 401 | reader.ReadAllLines(); |
| 402 | if (reader.Lines().empty()) { |
| 403 | return; |
| 404 | } |
| 405 | Log::Info("Loading initial scores..."); |
| 406 | |
| 407 | // use first line to count number class |
| 408 | int num_class = static_cast<int>(Common::Split(reader.Lines()[0].c_str(), '\t').size()); |
| 409 | data_size_t num_line = static_cast<data_size_t>(reader.Lines().size()); |
| 410 | num_init_score_ = static_cast<int64_t>(num_line) * num_class; |
| 411 | |
| 412 | init_score_ = std::vector<double>(num_init_score_); |
| 413 | if (num_class == 1) { |
| 414 | #pragma omp parallel for schedule(static) |
| 415 | for (data_size_t i = 0; i < num_line; ++i) { |
| 416 | double tmp = 0.0f; |
| 417 | Common::Atof(reader.Lines()[i].c_str(), &tmp); |
| 418 | init_score_[i] = Common::AvoidInf(static_cast<double>(tmp)); |
| 419 | } |
| 420 | } else { |
| 421 | std::vector<std::string> oneline_init_score; |
| 422 | #pragma omp parallel for schedule(static) |
| 423 | for (data_size_t i = 0; i < num_line; ++i) { |
| 424 | double tmp = 0.0f; |
| 425 | oneline_init_score = Common::Split(reader.Lines()[i].c_str(), '\t'); |
| 426 | if (static_cast<int>(oneline_init_score.size()) != num_class) { |
| 427 | Log::Fatal("Invalid initial score file. Redundant or insufficient columns"); |
| 428 | } |
| 429 | for (int k = 0; k < num_class; ++k) { |
| 430 | Common::Atof(oneline_init_score[k].c_str(), &tmp); |
| 431 | init_score_[static_cast<size_t>(k) * num_line + i] = Common::AvoidInf(static_cast<double>(tmp)); |
| 432 | } |
| 433 | } |
| 434 | } |
| 435 | init_score_load_from_file_ = true; |
| 436 | } |
| 437 | |
| 438 | void Metadata::LoadQueryBoundaries() { |
| 439 | num_queries_ = 0; |