| 678 | |
| 679 | template <class TColumn, class TGetAggregatedColumn> |
| 680 | static void GetSubsetWithScheduling( |
| 681 | TConstArrayRef<THolder<TColumn>> src, |
| 682 | const TFeaturesArraySubsetIndexing* subsetIndexing, |
| 683 | |
| 684 | // needed only for sparse features |
| 685 | const TMaybe<TFeaturesArraySubsetInvertedIndexing>& subsetInvertedIndexing, |
| 686 | |
| 687 | /* flatFeatureIdx -> THolder<TColumn> |
| 688 | * returns packed or bundled or grouped column data, returns nullptr if not packed or bundled or grouped |
| 689 | */ |
| 690 | TGetAggregatedColumn&& getAggregatedData, |
| 691 | //std::function<THolder<TColumn>(ui32)> getAggregatedData, |
| 692 | TResourceConstrainedExecutor* resourceConstrainedExecutor, |
| 693 | TVector<THolder<TColumn>>* dst |
| 694 | ) { |
| 695 | |
| 696 | dst->clear(); // cleanup old data |
| 697 | dst->resize(src.size()); |
| 698 | |
| 699 | TCloningParams cloningParams; |
| 700 | cloningParams.MakeConsecutive = false; |
| 701 | cloningParams.SubsetIndexing = subsetIndexing; |
| 702 | if (subsetInvertedIndexing.Defined()) { |
| 703 | cloningParams.InvertedSubsetIndexing = subsetInvertedIndexing.Get(); |
| 704 | } |
| 705 | |
| 706 | auto localExecutor = resourceConstrainedExecutor->GetExecutorPtr(); |
| 707 | for (auto i : xrange(src.size())) { |
| 708 | auto* srcDataPtr = src[i].Get(); |
| 709 | if (!srcDataPtr) { |
| 710 | continue; |
| 711 | } |
| 712 | |
| 713 | (*dst)[i] = getAggregatedData(srcDataPtr->GetId()); |
| 714 | if ((*dst)[i]) { |
| 715 | continue; |
| 716 | } |
| 717 | auto dstHolderPtr = &(*dst)[i]; |
| 718 | // TODO(kirillovs): add shortcut here for zero-cost cloneable columns |
| 719 | resourceConstrainedExecutor->Add( |
| 720 | { |
| 721 | srcDataPtr->EstimateMemoryForCloning(cloningParams), |
| 722 | [srcDataPtr, dstHolderPtr, localExecutor, cloningParams] () { |
| 723 | auto clonedColumn = srcDataPtr->CloneWithNewSubsetIndexing( |
| 724 | cloningParams, |
| 725 | localExecutor |
| 726 | ); |
| 727 | *dstHolderPtr = DynamicHolderCast<TColumn>( |
| 728 | srcDataPtr->CloneWithNewSubsetIndexing( |
| 729 | cloningParams, |
| 730 | localExecutor |
| 731 | ), |
| 732 | "Column type changed after cloning" |
| 733 | ); |
| 734 | } |
| 735 | } |
| 736 | ); |
| 737 | } |
no test coverage detected