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;
73 const std::size_t targetCumulativeTrain =
74 cumulativeEntries -
static_cast<std::size_t
>(
fValidationSplit * cumulativeEntries);
75 const std::size_t trainSz = targetCumulativeTrain - currentCumulativeTrain;
76 currentCumulativeTrain = targetCumulativeTrain;
77 const std::size_t valSz = sz - trainSz;
80 bool trainIsPrefix = coin(
g);
81 const uint64_t trainStart = trainIsPrefix ?
c.start :
c.start +
static_cast<std::uint64_t
>(valSz);
82 const uint64_t valStart = trainIsPrefix ?
c.start +
static_cast<std::uint64_t
>(trainSz) :
c.start;
85 fTrainingClusters.push_back({
c.rdfIdx, trainStart, trainStart +
static_cast<std::uint64_t
>(trainSz)});
89 fValidationClusters.push_back({
c.rdfIdx, valStart, valStart +
static_cast<std::uint64_t
>(valSz)});
100 std::size_t accumulated = 0;
101 std::size_t splitIdx = 0;
103 const std::size_t sz =
fAllClusters[splitIdx].GetNumEntries();
104 if (accumulated + sz > targetTraining) {
114 if (splitIdx <
fAllClusters.size() && accumulated < targetTraining) {
117 const std::uint64_t splitPoint = boundary.
start +
static_cast<std::uint64_t
>(targetTraining - accumulated);
132 throw std::runtime_error(
"RClusterLoader::SplitDataset: no entries for training after split. "
133 "Reduce validation_split.");
136 throw std::runtime_error(
"RClusterLoader::SplitDataset: no entries for validation after split. "
137 "Increase validation_split.");
164 std::uint64_t endRow)
188 std::uint64_t endRow)
193 std::vector<ROOT::RDF::RResultPtr<ULong64_t>> counts;
194 counts.reserve(
fRdfs.size());
195 for (
auto &rdf :
fRdfs) {
196 counts.push_back(rdf.Count());
200 std::size_t totalFiltered = 0;
201 for (
auto &
c : counts) {
202 totalFiltered +=
c.GetValue();
210 const std::size_t numLoadedValues =
dest.fRVec.size();
217 auto &rdfEntries = *entries;
219 const std::size_t totalFiltered = rdfEntries.size();
220 if (totalFiltered == 0) {
223 std::sort(rdfEntries.begin(), rdfEntries.end());
232 const std::size_t targetCumulativeTrain =
234 : cumulativeFiltered,
237 const std::size_t valCount = totalFiltered - trainCount;
239 bool trainIsPrefix =
true;
244 std::uniform_int_distribution<int> coin(0, 1);
245 trainIsPrefix = coin(
g);
254 std::uint64_t boundary;
257 boundary = (trainCount < totalFiltered) ? rdfEntries[trainCount] : endRow;
260 boundary = (valCount < totalFiltered) ? rdfEntries[valCount] : endRow;
263 const std::uint64_t trainStart = trainIsPrefix ? startRow : boundary;
264 const std::uint64_t trainEnd = trainIsPrefix ? boundary : endRow;
265 const std::uint64_t valStart = trainIsPrefix ? boundary : startRow;
266 const std::uint64_t valEnd = trainIsPrefix ? endRow : boundary;
277 float *rows =
dest.fRVec.data() + numLoadedValues;
286 return endRow - startRow;
292 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.
RResultPtr< COLL > Take(std::string_view column="")
Return a collection of values of a column (lazy action, returns a std::vector by default).
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.