| 403 | } |
| 404 | |
| 405 | void TLibSvmDataLoader::ProcessCdData(TVector<ui32>* catFeatures, TVector<TString>* featureNames) { |
| 406 | catFeatures->clear(); |
| 407 | |
| 408 | TVector<TColumn> columns = Args.CdProvider->GetColumnsDescription(/*columnCount*/ Nothing()); |
| 409 | CB_ENSURE( |
| 410 | columns.size() >= 1, |
| 411 | "CdProvider has no columns. libsvm format contains at least one column" |
| 412 | ); |
| 413 | |
| 414 | size_t featuresStartColumn = 1; |
| 415 | |
| 416 | if (DataMetaInfo.HasGroupId) { |
| 417 | CB_ENSURE( |
| 418 | (columns.size() >= 2) && (columns[1].Type == EColumn::GroupId), |
| 419 | "libsvm format data contains 'qid' but Column Description doesn't specify it at the second column" |
| 420 | ); |
| 421 | ++featuresStartColumn; |
| 422 | } |
| 423 | |
| 424 | for (auto columnIdx : xrange(featuresStartColumn, columns.size())) { |
| 425 | const auto& column = columns[columnIdx]; |
| 426 | switch (column.Type) { |
| 427 | case EColumn::Categ: |
| 428 | catFeatures->push_back(columnIdx - featuresStartColumn); |
| 429 | [[fallthrough]]; |
| 430 | case EColumn::Num: |
| 431 | featureNames->push_back(column.Id); |
| 432 | break; |
| 433 | default: |
| 434 | CB_ENSURE( |
| 435 | false, |
| 436 | "Column Description. Column #" << columnIdx |
| 437 | << ": Bad type for libsvm format: " << column.Type << ". Expected feature type." |
| 438 | ); |
| 439 | } |
| 440 | } |
| 441 | } |
| 442 | |
| 443 | namespace { |
| 444 | TExistsCheckerFactory::TRegistrator<TFSExistsChecker> LibSvmExistsCheckerReg("libsvm"); |