| 356 | } |
| 357 | |
| 358 | void GetNumFeatureValuesSample( |
| 359 | const TFullModel& model, |
| 360 | const NCatboostOptions::TDatasetReadingParams& datasetReadingParams, |
| 361 | int threadCount, |
| 362 | const TVector<ui32>& sampleIndicesVector, |
| 363 | const TVector<TString>& sampleIdsVector, |
| 364 | TVector<TArrayRef<float>>* numFeaturesColumns |
| 365 | ) { |
| 366 | auto localExecutor = GetCachedLocalExecutor(threadCount).Get(); |
| 367 | |
| 368 | auto sampler = GetProcessor<IDataProviderSampler, TDataProviderSampleParams>( |
| 369 | datasetReadingParams.PoolPath, |
| 370 | TDataProviderSampleParams { |
| 371 | datasetReadingParams, |
| 372 | /*OnlyFeaturesData*/ true, |
| 373 | /*CpuUsedRamLimit*/ Max<ui64>(), |
| 374 | localExecutor |
| 375 | } |
| 376 | ); |
| 377 | |
| 378 | TDataProviderPtr dataProvider; |
| 379 | if (!sampleIndicesVector.empty()) { |
| 380 | dataProvider = sampler->SampleByIndices(sampleIndicesVector); |
| 381 | } else if (!sampleIdsVector.empty()) { |
| 382 | dataProvider = sampler->SampleBySampleIds(sampleIdsVector); |
| 383 | } else { |
| 384 | CB_ENSURE(false, "Neither indices nor sampleIds are provided"); |
| 385 | } |
| 386 | auto objectsDataProvider = dataProvider->ObjectsData; |
| 387 | auto rawObjectsDataProvider = dynamic_cast<const TRawObjectsDataProvider*>(objectsDataProvider.Get()); |
| 388 | CB_ENSURE(rawObjectsDataProvider, "Only non-quantized datasets are supported now"); |
| 389 | |
| 390 | for (const auto& floatFeature : model.ModelTrees->GetFloatFeatures()) { |
| 391 | auto values = (*rawObjectsDataProvider->GetFloatFeature(floatFeature.Position.Index))->ExtractValues(localExecutor); |
| 392 | auto dst = (*numFeaturesColumns)[floatFeature.Position.FlatIndex]; |
| 393 | Copy(values.begin(), values.end(), dst.begin()); |
| 394 | } |
| 395 | } |
| 396 | |
| 397 | TMetricsAndTimeLeftHistory GetTrainingMetrics(const TFullModel& model) { |
| 398 | if (model.ModelInfo.contains("training"sv)) { |
nothing calls this directly
no test coverage detected