31#ifndef __TASMANIAN_SPARSE_GRID_INDEX_SETS_HPP
32#define __TASMANIAN_SPARSE_GRID_INDEX_SETS_HPP
34#include "tsgIOHelpers.hpp"
77std::vector<T> spltVector2D(std::vector<T>
const &x,
size_t stride,
int ibegin,
int iend){
78 size_t sbegin(ibegin), send(iend);
79 size_t num_strips = x.size() / stride;
80 size_t new_stride = send - sbegin;
81 std::vector<T> result(num_strips * new_stride);
83 auto ir = result.begin();
84 for(
size_t i=0; i<num_strips; i++){
85 std::copy_n(ix + sbegin, new_stride, ir);
86 std::advance(ix, stride);
87 std::advance(ir, new_stride);
109 template<
typename IntTypeA,
typename IntTypeB>
110 Data2D(IntTypeA new_stride, IntTypeB new_num_strips) : stride(static_cast<size_t>(new_stride)), num_strips(static_cast<size_t>(new_num_strips)),
111 vec(Utils::size_mult(stride, num_strips)){}
113 template<
typename IntTypeA,
typename IntTypeB>
114 Data2D(IntTypeA new_stride, IntTypeB new_num_strips, T val) : stride(static_cast<size_t>(new_stride)),
115 num_strips(static_cast<size_t>(new_num_strips)),
116 vec(Utils::size_mult(stride, num_strips), val){}
118 template<
typename IntTypeA,
typename IntTypeB>
119 Data2D(IntTypeA new_stride, IntTypeB new_num_strips, std::vector<T> &&data) : stride(static_cast<size_t>(new_stride)), num_strips(static_cast<size_t>(new_num_strips)),
120 vec(std::forward<std::vector<T>>(data)){}
123 template<
bool iomode, IO::IOPad pad>
124 void writeVector(std::ostream &os)
const{ IO::writeVector<iomode, pad, T>(vec, os); }
127 bool empty()
const{
return (num_strips == 0); }
130 Data2D<T> splitData(
int ibegin,
int iend)
const{
131 if (stride == 0)
return Data2D<T>();
132 Data2D<T> result(iend - ibegin, 0);
133 result.num_strips = num_strips;
134 result.vec = spltVector2D(vec, stride, ibegin, iend);
139 T* getStrip(
int i){
return &(vec[i*stride]); }
141 T
const* getStrip(
int i)
const{
return &(vec[i*stride]); }
143 typename std::vector<T>::iterator getIStrip(
int i){
return vec.begin() + Utils::size_mult(stride, i); }
145 size_t getStride()
const{
return stride; }
147 int getNumStrips()
const{
return (
int) num_strips; }
149 size_t getTotalEntries()
const{
return vec.size(); }
151 T* data(){
return vec.data(); }
153 T
const* data()
const{
return vec.data(); }
155 size_t totalSize()
const{
return vec.size(); }
160 vec = std::vector<double>();
164 inline typename std::vector<T> release(){
return std::move(vec); }
167 inline typename std::vector<T>::iterator begin(){
return vec.begin(); }
169 inline typename std::vector<T>::const_iterator begin()
const{
return vec.cbegin(); }
171 inline typename std::vector<T>::iterator end(){
return vec.end(); }
173 inline typename std::vector<T>::const_iterator end()
const{
return vec.cend(); }
176 inline typename std::vector<T>::reverse_iterator rbegin(){
return vec.rbegin(); }
179 void appendStrip(
typename std::vector<T>::const_iterator
const &x){
180 vec.insert(vec.end(), x, x + stride);
185 void appendStrip(
const std::vector<T> &x){
186 appendStrip(x.begin());
190 void appendStrip(
int pos,
const std::vector<T> &x){
191 vec.insert(vec.begin() +
static_cast<size_t>(pos) * stride, x.begin(), x.end());
196 void append(Data2D<T>
const &other) {
197 vec.insert(vec.end(), other.vec.begin(), other.vec.end());
198 num_strips += other.num_strips;
202 size_t stride = 0, num_strips = 0;
214 template<
typename iomode,
typename DataType,
typename IndexStr
ide,
typename IndexNumStrips>
215 Data2D<DataType> readData2D(std::istream &is, IndexStride stride, IndexNumStrips num_strips){
216 return Data2D<DataType>(stride, num_strips, readVector<iomode, DataType>(is, Utils::size_mult(stride, num_strips)));
237 MultiIndexSet() =
default;
239 MultiIndexSet(
size_t cnum_dimensions, std::vector<int> &&new_indexes) :
240 num_dimensions(cnum_dimensions), cache_num_indexes((int)(new_indexes.size() / cnum_dimensions)),
241 indexes(std::move(new_indexes)){}
243 MultiIndexSet(Data2D<int>
const &data);
245 template<
typename iomode> MultiIndexSet(std::istream &is, iomode) :
246 num_dimensions((size_t) IO::readNumber<iomode, int>(is)),
247 cache_num_indexes(IO::readNumber<iomode, int>(is)),
248 indexes(IO::readVector<iomode, int>(is, Utils::size_mult(num_dimensions, cache_num_indexes)))
255 template<
bool useAscii>
void write(std::ostream &os)
const;
258 inline bool empty()
const{
return indexes.empty(); }
261 inline size_t getNumDimensions()
const{
return num_dimensions; }
263 inline int getNumIndexes()
const{
return cache_num_indexes; }
266 void addSortedIndexes(std::vector<int>
const &addition);
268 inline MultiIndexSet& operator += (MultiIndexSet
const &addition){
269 num_dimensions = addition.getNumDimensions();
270 addSortedIndexes(addition.indexes);
275 inline std::vector<int>::const_iterator begin()
const{
return indexes.cbegin(); }
277 inline std::vector<int>::const_iterator end()
const{
return indexes.cend(); }
279 int* data(){
return indexes.data(); }
281 int const* data()
const{
return indexes.data(); }
283 inline size_t totalSize()
const{
return indexes.size(); }
286 inline std::vector<int> release(){
return std::move(indexes); }
289 int getSlot(
const int *p)
const;
291 inline int getSlot(
const std::vector<int> &p)
const{
return getSlot(p.data()); }
293 inline bool missing(
const std::vector<int> &p)
const{
return (getSlot(p.data()) == -1); }
296 inline const int *getIndex(
int i)
const{
return &(indexes[
static_cast<size_t>(i) * num_dimensions]); }
299 inline std::vector<int> copyIndex(
int i)
const{
300 return std::vector<int>(&indexes[
static_cast<size_t>(i) * num_dimensions], &indexes[
static_cast<size_t>(i) * num_dimensions] + num_dimensions);
309 MultiIndexSet operator -(
const MultiIndexSet &substract)
const;
312 void removeIndex(
const std::vector<int> &p);
315 int getMaxIndex()
const{
return (empty()) ? 0 : *std::max_element(indexes.begin(), indexes.end()); }
318 size_t num_dimensions = 0;
319 int cache_num_indexes = 0;
320 std::vector<int> indexes;
339 StorageSet() =
default;
341 StorageSet(
int cnum_outputs,
int cnum_values, std::vector<double> &&vals) :
342 num_outputs(cnum_outputs), num_values(cnum_values), values(std::move(vals)){}
344 template<
typename iomode> StorageSet(std::istream &is, iomode) :
345 num_outputs((size_t) IO::readNumber<iomode, int>(is)),
346 num_values((size_t) IO::readNumber<iomode, int>(is)),
347 values((IO::readFlag<iomode>(is)) ? IO::readVector<iomode, double>(is, Utils::size_mult(num_outputs, num_values)) : std::vector<double>())
356 template<
bool useAscii>
void write(std::ostream &os)
const;
359 void resize(
int cnum_outputs,
int cnum_values){
360 num_outputs = (size_t) cnum_outputs;
361 num_values = (size_t) cnum_values;
362 values = std::vector<double>();
366 size_t getNumOutputs()
const{
return num_outputs; }
369 double const* getValues(
int i)
const{
return &(values[i*num_outputs]); }
371 double* getValues(
int i){
return &(values[i*num_outputs]); }
374 void setValues(
const double vals[]){ values = std::vector<double>(vals, vals + num_outputs * num_values); }
376 void setValues(std::vector<double> &&vals){
377 num_values = vals.size() / num_outputs;
378 values = std::move(vals);
382 StorageSet splitValues(
int ibegin,
int iend)
const{
383 return {iend - ibegin, (int) num_values, spltVector2D(values, num_outputs, ibegin, iend)};
387 inline std::vector<double>::const_iterator begin()
const{
return values.cbegin(); }
389 inline std::vector<double>::const_iterator end()
const{
return values.cend(); }
392 inline std::vector<double> release(){
return std::move(values); }
404 void addValues(
const MultiIndexSet &old_set,
const MultiIndexSet &new_set,
const double new_vals[]);
407 double* data(){
return values.data(); }
409 double const* data()
const{
return values.data(); }
411 size_t totalSize()
const{
return values.size(); }
414 size_t num_outputs = 0, num_values = 0;
415 std::vector<double> values;
Encapsulates the Tasmanian Sparse Grid module.
Definition TasmanianSparseGrid.hpp:68