23 namespace BatchHelpers {
25 RooSpan<const double> BatchData::getBatch(std::size_t begin, std::size_t size)
const {
27 if (begin >= _foreignData->size())
30 const double* dataBegin = &*(_foreignData->begin()+begin);
31 const std::size_t maxSize = std::min(size, _foreignData->size() - begin);
32 return RooSpan<const double>(dataBegin, maxSize);
35 const auto item = _ownedBatches.find(begin);
36 if (item == _ownedBatches.end()) {
38 return findSpanInsideExistingBatch(begin, size);
41 const auto& batch = item->second;
42 const std::size_t maxSize = std::min(size, batch.data.size() - (begin-batch.begin));
44 return RooSpan<const double>(batch.data.data(), maxSize);
58 RooSpan<double> BatchData::makeWritableBatchUnInit(std::size_t begin, std::size_t batchSize) {
59 auto item = _ownedBatches.find(begin);
60 if (item == _ownedBatches.end()) {
61 auto inserted = _ownedBatches.insert(std::make_pair(begin, Batch{begin, std::vector<double>(batchSize), kWriting}));
62 return RooSpan<double>(inserted.first->second.data);
65 Batch& batch = item->second;
66 batch.status = kWriting;
67 if (batch.data.size() != batchSize) {
68 batch.data.resize(batchSize);
71 return RooSpan<double>(batch.data);
83 RooSpan<double> BatchData::makeWritableBatchInit(std::size_t begin, std::size_t batchSize,
double value) {
84 auto batch = makeWritableBatchUnInit(begin, batchSize);
85 for (
auto& elm : batch) {
94 void BatchData::attachForeignStorage(
const std::vector<double>& vec) {
98 _ownedBatches.clear();
103 void BatchData::print(std::ostream& os,
const std::string& indent)
const {
104 os << indent <<
"Batch data access";
105 if (_ownedBatches.empty() && !_foreignData) {
106 os <<
" not initialised." << std::endl;
112 os <<
" with " << (_foreignData ?
"(foreign)" :
"(owned)") <<
" data:";
113 os <<
"\n" << indent << std::right << std::setw(8) <<
"Batch #" << std::setw(8) <<
"Start"
114 << std::setw(7) <<
"Status";
117 for (
auto item : _ownedBatches) {
118 auto startPoint = item.first;
119 const Batch& batch = item.second;
122 << std::setw(8) << i << std::setw(8) << startPoint
123 << std::setw(7) << batch.status <<
": {";
124 for (
unsigned int j=0; j < 5 && j < batch.data.size(); ++j) {
125 os << batch.data[j] <<
", ";
129 os << std::resetiosflags(std::ios::adjustfield) << std::endl;