| 471 | |
| 472 | // |
| 473 | void RunComputeTest(const TDocParallelDataSet& dataSet, |
| 474 | const ui32 numStats, |
| 475 | const ui32 maxLeaves, |
| 476 | double sampleRate, |
| 477 | const TComputeByBlocksConfig& byBlocksConfig, |
| 478 | const TBinarizedFeaturesManager& featuresManager) { |
| 479 | TRandom rand(10); |
| 480 | |
| 481 | TComputeSplitPropertiesByBlocksHelper computeSplitPropertiesByBlocksHelper(dataSet, |
| 482 | byBlocksConfig); |
| 483 | |
| 484 | TSplitPropertiesHelper splitPropertiesHelper(dataSet, |
| 485 | featuresManager, |
| 486 | computeSplitPropertiesByBlocksHelper); |
| 487 | |
| 488 | TVector<float> featureWeights(featuresManager.GetFeatureCount(), 1.0f); |
| 489 | auto subsets = splitPropertiesHelper.CreateInitialSubsets( |
| 490 | CreateTestTarget(dataSet, numStats, sampleRate), |
| 491 | maxLeaves, |
| 492 | featureWeights); |
| 493 | |
| 494 | while (subsets.Leaves.size() < maxLeaves) { |
| 495 | CATBOOST_DEBUG_LOG << "Leaves count #" << subsets.Leaves.size() << Endl; |
| 496 | |
| 497 | splitPropertiesHelper.BuildNecessaryHistograms(&subsets); |
| 498 | CheckHistograms(dataSet, subsets); |
| 499 | |
| 500 | TVector<ui32> leavesToSplit; |
| 501 | for (ui32 i = 0; i < subsets.Leaves.size(); ++i) { |
| 502 | if (subsets.Leaves[i].Size) { |
| 503 | leavesToSplit.push_back(i); |
| 504 | } |
| 505 | } |
| 506 | UNIT_ASSERT(leavesToSplit.size() > 0); |
| 507 | |
| 508 | Shuffle(leavesToSplit.begin(), leavesToSplit.end(), rand); |
| 509 | leavesToSplit.resize(Max<ui32>(leavesToSplit.size() * 0.5, 1)); |
| 510 | ui32 maxLeavesToSplit = leavesToSplit.size() + subsets.Leaves.size() > maxLeaves ? maxLeaves - subsets.Leaves.size() : leavesToSplit.size(); |
| 511 | leavesToSplit.resize(maxLeavesToSplit); |
| 512 | // leavesToSplit.resize(1); |
| 513 | |
| 514 | for (ui32 leafId : leavesToSplit) { |
| 515 | TBinarySplit bestSplit; |
| 516 | auto featureIds = dataSet.GetFeatures().GetFeatures(); |
| 517 | auto localIdx = rand.NextUniformL() % featureIds.size(); |
| 518 | bestSplit.FeatureId = featureIds[localIdx]; |
| 519 | bestSplit.BinIdx = (featuresManager.GetBinCount(bestSplit.FeatureId) - 1) / 2; |
| 520 | bestSplit.SplitType = featuresManager.IsCat(localIdx) ? EBinSplitType::TakeBin |
| 521 | : EBinSplitType::TakeGreater; |
| 522 | |
| 523 | subsets.Leaves[leafId].BestSplit.Score = static_cast<float>(-rand.NextUniform()); |
| 524 | subsets.Leaves[leafId].BestSplit.FeatureId = bestSplit.FeatureId; |
| 525 | subsets.Leaves[leafId].BestSplit.BinId = bestSplit.BinIdx; |
| 526 | } |
| 527 | |
| 528 | CheckAndMakeSplit(leavesToSplit, |
| 529 | splitPropertiesHelper, |
| 530 | subsets); |
no test coverage detected