| 520 | } |
| 521 | |
| 522 | void TFileQuantizedPoolLoader::LoadQuantizedPool(NCB::TLoadQuantizedPoolParameters params) { |
| 523 | CB_ENSURE_INTERNAL( |
| 524 | params.DatasetSubset.Range == NCB::TDatasetSubset().Range, |
| 525 | "Scheme quantized supports only default load subset range" |
| 526 | ); |
| 527 | |
| 528 | Pool.Blobs.push_back(params.LockMemory |
| 529 | ? TBlob::LockedFromFile(TString(PathWithScheme.Path)) |
| 530 | : TBlob::FromFile(TString(PathWithScheme.Path))); |
| 531 | |
| 532 | // TODO(yazevnul): optionally precharge pool |
| 533 | |
| 534 | const TConstArrayRef<ui8> blob{ |
| 535 | Pool.Blobs.back().AsUnsignedCharPtr(), |
| 536 | Pool.Blobs.back().Size()}; |
| 537 | |
| 538 | ValidatePoolPart(blob); |
| 539 | |
| 540 | TPoolMetainfo poolMetainfo; |
| 541 | auto parseMetainfo = [&] (TConstArrayRef<ui8> bytes) { |
| 542 | const auto poolMetainfoParsed = poolMetainfo.ParseFromArray(bytes.data(), bytes.size()); |
| 543 | CB_ENSURE(poolMetainfoParsed); |
| 544 | }; |
| 545 | auto parseSchema = [&] (TConstArrayRef<ui8> bytes) { |
| 546 | const auto quantizationSchemaParsed = Pool.QuantizationSchema.ParseFromArray(bytes.data(), bytes.size()); |
| 547 | CB_ENSURE(quantizationSchemaParsed); |
| 548 | }; |
| 549 | |
| 550 | TVector<TVector<NCB::TQuantizedPool::TChunkDescription>> stringColumnChunks; |
| 551 | THashMap<ui32, EColumn> stringColumnIndexToColumnType; |
| 552 | |
| 553 | TVector<NCB::TQuantizedPool::TChunkDescription>* currentChunksPointer = nullptr; |
| 554 | auto parseColumn = [&] (ui32 columnIndex) -> bool { |
| 555 | CB_ENSURE(!Pool.ColumnIndexToLocalIndex.contains(columnIndex), |
| 556 | "Quantized pool should have unique column indices, but " << |
| 557 | LabeledOutput(columnIndex) << " is repeated."); |
| 558 | |
| 559 | const bool isFakeColumn = NCB::NQuantizationSchemaDetail::IsFakeIndex(columnIndex, poolMetainfo); |
| 560 | if (!isFakeColumn) { |
| 561 | if (!params.DatasetSubset.HasFeatures) { |
| 562 | auto pbColumnType = poolMetainfo.columnindextotype().at(columnIndex); |
| 563 | if (IsFactorColumn(IdlColumnTypeToEColumn(pbColumnType))) { |
| 564 | return false; |
| 565 | } |
| 566 | } |
| 567 | |
| 568 | const auto localFeatureIndex = Pool.Chunks.size(); |
| 569 | Pool.ColumnIndexToLocalIndex.emplace(columnIndex, localFeatureIndex); |
| 570 | Pool.Chunks.push_back({}); |
| 571 | currentChunksPointer = &Pool.Chunks.back(); |
| 572 | } else { |
| 573 | EColumn columnType; |
| 574 | if (columnIndex == poolMetainfo.GetStringDocIdFakeColumnIndex()) { |
| 575 | columnType = EColumn::SampleId; |
| 576 | } else if (columnIndex == poolMetainfo.GetStringGroupIdFakeColumnIndex()) { |
| 577 | columnType = EColumn::GroupId; |
| 578 | } else if (columnIndex == poolMetainfo.GetStringSubgroupIdFakeColumnIndex()){ |
| 579 | columnType = EColumn::SubgroupId; |
no test coverage detected