6 const std::vector<std::size_t> &vecSizes,
float vecPadding,
float validationSplit,
7 bool shuffle, std::size_t setSeed)
11 fVecPadding(vecPadding),
12 fValidationSplit(validationSplit),
20 for (
auto &rdf :
fRdfs) {
22 if (!rdf.GetFilterNames().empty()) {
32 for (std::size_t rdfIdx = 0; rdfIdx <
fRdfs.size(); ++rdfIdx) {
35 auto numEntries =
r.second -
r.first;
48 throw std::runtime_error(
"RClusterLoader::SplitDataset: no clusters found.");
61 std::uniform_int_distribution<int> coin(0, 1);
63 std::size_t cumulativeEntries = 0;
64 std::size_t currentCumulativeTrain = 0;
70 const std::size_t sz =
c.GetNumEntries();
71 cumulativeEntries += sz;
72 const std::size_t targetCumulativeTrain =
74 const std::size_t trainSz = targetCumulativeTrain - currentCumulativeTrain;
75 currentCumulativeTrain = targetCumulativeTrain;
76 const std::size_t valSz = sz - trainSz;
79 bool trainIsPrefix = coin(
g);
80 const uint64_t trainStart = trainIsPrefix ?
c.start :
c.start +
static_cast<std::uint64_t
>(valSz);
81 const uint64_t valStart = trainIsPrefix ?
c.start +
static_cast<std::uint64_t
>(trainSz) :
c.start;
84 fTrainingClusters.push_back({
c.rdfIdx, trainStart, trainStart +
static_cast<std::uint64_t
>(trainSz)});
88 fValidationClusters.push_back({
c.rdfIdx, valStart, valStart +
static_cast<std::uint64_t
>(valSz)});
99 std::size_t accumulated = 0;
100 std::size_t splitIdx = 0;
102 const std::size_t sz =
fAllClusters[splitIdx].GetNumEntries();
103 if (accumulated + sz > targetTraining) {
113 if (splitIdx <
fAllClusters.size() && accumulated < targetTraining) {
116 const std::uint64_t splitPoint = boundary.
start +
static_cast<std::uint64_t
>(targetTraining - accumulated);
131 throw std::runtime_error(
"RClusterLoader::SplitDataset: no entries for training after split. "
132 "Reduce validation_split.");
135 throw std::runtime_error(
"RClusterLoader::SplitDataset: no entries for validation after split. "
136 "Increase validation_split.");
163 std::uint64_t endRow)
187 std::uint64_t endRow)
192 std::vector<ROOT::RDF::RResultPtr<ULong64_t>> counts;
193 counts.reserve(
fRdfs.size());
194 for (
auto &rdf :
fRdfs) {
195 counts.push_back(rdf.Count());
199 std::size_t totalFiltered = 0;
200 for (
auto &
c : counts) {
201 totalFiltered +=
c.GetValue();
209 std::vector<ULong64_t> rdfEntries;
210 rdfEntries.reserve(endRow - startRow);
213 rdf.
Foreach([&](
ULong64_t entry) { rdfEntries.push_back(entry); }, {
"rdfentry_"});
216 const std::size_t totalFiltered = rdfEntries.size();
217 if (totalFiltered == 0) {
220 std::sort(rdfEntries.begin(), rdfEntries.end());
223 const std::size_t targetCumulativeTrain =
226 const std::size_t valCount = totalFiltered - trainCount;
228 bool trainIsPrefix =
true;
233 std::uniform_int_distribution<int> coin(0, 1);
234 trainIsPrefix = coin(
g);
243 std::uint64_t boundary;
246 boundary = (trainCount < totalFiltered) ? rdfEntries[trainCount] : endRow;
249 boundary = (valCount < totalFiltered) ? rdfEntries[valCount] : endRow;
252 const std::uint64_t trainStart = trainIsPrefix ? startRow : boundary;
253 const std::uint64_t trainEnd = trainIsPrefix ? boundary : endRow;
254 const std::uint64_t valStart = trainIsPrefix ? boundary : startRow;
255 const std::uint64_t valEnd = trainIsPrefix ? endRow : boundary;
272 return endRow - startRow;
278 std::uint64_t endRow)
unsigned long long ULong64_t
Portable unsigned long integer 8 bytes.
Option_t Option_t TPoint TPoint const char GetTextMagnitude GetFillStyle GetLineColor GetLineWidth GetMarkerStyle GetTextAlign GetTextColor GetTextSize void char Point_t Rectangle_t dest
Option_t Option_t TPoint TPoint const char GetTextMagnitude GetFillStyle GetLineColor GetLineWidth GetMarkerStyle GetTextAlign GetTextColor GetTextSize void char Point_t Rectangle_t WindowAttributes_t Float_t r
std::vector< RClusterRange > fAllClusters
std::size_t fAccumulatedFilteredForTrain
std::vector< RClusterRange > fValidationClusters
std::vector< std::size_t > fVecSizes
std::vector< ROOT::RDF::RNode > & fRdfs
std::size_t fTotalEntries
void FinaliseSplitDiscovery()
Mark the train/val split as finalised after the first epoch.
std::size_t fNumTrainingEntries
void SplitDataset()
Distribute the clusters into training and validation datasets No-op for filtered RDataFrames,...
std::size_t fNumChunkCols
void LoadClusterInto(RFlat2DMatrix &dest, std::size_t rdfIdx, std::uint64_t startRow, std::uint64_t endRow)
std::size_t fNumValidationEntries
std::size_t fAccumulatedFilteredForVal
std::vector< RClusterRange > fTrainingClusters
std::size_t LoadTrainingClusterInto(RFlat2DMatrix &dest, std::size_t rdfIdx, std::uint64_t startRow, std::uint64_t endRow)
Load one training cluster and return the number of rows written.
void ShuffleValidationClusters(std::size_t epochIdx)
Re-order validation clusters for the upcoming epoch.
std::vector< std::size_t > fRdfSizes
std::vector< std::string > fCols
void LoadValidationClusterInto(RFlat2DMatrix &dest, std::size_t rdfIdx, std::uint64_t startRow, std::uint64_t endRow)
Load one validation cluster at the end of dest.
RClusterLoader(std::vector< ROOT::RDF::RNode > &rdfs, const std::vector< std::string > &cols, const std::vector< std::size_t > &vecSizes, float vecPadding, float validationSplit, bool shuffle, std::size_t setSeed)
void ShuffleTrainingClusters(std::size_t epochIdx)
Re-order training clusters for the upcoming epoch.
The public interface to the RDataFrame federation of classes.
void Foreach(F f, const ColumnNames_t &columns={})
Execute a user-defined function on each entry (instant action).
void LoadCustomValues(ROOT::RDF::RNode &node, const std::vector< std::string > &cols, const std::vector< std::size_t > &vecSizes, float vecPadding, ROOT::RVecF &dest)
std::vector< std::pair< std::uint64_t, std::uint64_t > > GetDatasetGlobalClusterBoundaries(const RNode &node)
Retrieve the cluster boundaries for each cluster in the dataset, across files, with a global offset.
void ChangeBeginAndEndEntries(const RNode &node, Long64_t begin, Long64_t end)
unsigned int RunGraphs(std::vector< RResultHandle > handles)
Run the event loops of multiple RDataFrames concurrently.
Describes a contiguous range of entries within a single RDataFrame, corresponding to one TTree/RNTupl...
Wrapper around ROOT::RVec<float> representing a 2D matrix.