17 #ifndef ROOFIT_ROOFITCORE_INC_BATCHDATA_H_
18 #define ROOFIT_ROOFITCORE_INC_BATCHDATA_H_
21 #include <unordered_map>
24 namespace BatchHelpers {
30 enum Status_t {kNoBatch, kDirty, kWriting, kReady, kReadyAndConstant};
41 _ownedBatches.clear();
48 Status_t status(std::size_t begin, std::size_t size)
const {
49 if (_foreignData && begin+size <= _foreignData->size())
50 return kReadyAndConstant;
51 else if (_foreignData)
54 if (_ownedBatches.empty())
57 auto item = _ownedBatches.find(begin);
59 if (item == _ownedBatches.end()) {
63 item = findEnclosingBatch(begin);
64 if (item == _ownedBatches.end())
67 auto item2 = findEnclosingBatch(begin+size-1);
69 return item == item2 ? item->second.status : kNoBatch;
72 const Batch& batch = item->second;
73 if (size <= batch.data.size())
84 bool setStatus(std::size_t begin, std::size_t size, Status_t stat) {
88 auto item = _ownedBatches.find(begin);
89 if (item == _ownedBatches.end() || size != item->second.data.size())
92 item->second.status = stat;
98 for (
auto& elm : _ownedBatches) {
99 if (elm.second.status != kReadyAndConstant)
100 elm.second.status = kDirty;
105 RooSpan<const double> getBatch(std::size_t begin, std::size_t batchSize)
const;
107 RooSpan<double> makeWritableBatchUnInit(std::size_t begin, std::size_t batchSize);
109 RooSpan<double> makeWritableBatchInit(std::size_t begin, std::size_t batchSize,
double value);
111 void attachForeignStorage(
const std::vector<double>& vec);
113 void print(std::ostream& os,
const std::string& indent)
const;
121 std::vector<double> data;
124 bool inBatch(std::size_t evt)
const {
125 return begin <= evt && evt < begin + data.size();
128 RooSpan<const double> makeSpan(std::size_t evt, std::size_t batchSize)
const {
129 return RooSpan<const double>(&data[evt-begin], batchSize);
134 bool validRange(std::size_t begin, std::size_t size)
const {
136 return begin < _foreignData->size() && begin+size <= _foreignData->size();
139 auto batch = findSpanInsideExistingBatch(begin, size);
140 return !batch.empty();
144 using Map_t = std::unordered_map<std::size_t, Batch>;
145 Map_t::const_iterator findEnclosingBatch(std::size_t evt)
const {
146 for (
auto it = _ownedBatches.cbegin(); it != _ownedBatches.cend(); ++it) {
147 if (it->second.inBatch(evt))
151 return _ownedBatches.end();
154 RooSpan<const double> findSpanInsideExistingBatch(std::size_t begin, std::size_t batchSize)
const {
155 for (
auto it = _ownedBatches.cbegin(); it != _ownedBatches.cend(); ++it) {
156 if (it->second.inBatch(begin) && it->second.inBatch(begin+batchSize-1))
157 return it->second.makeSpan(begin, batchSize);
160 return RooSpan<const double>();
164 const std::vector<double>* _foreignData;