31#ifndef __TASMANIAN_SPARSE_GRID_DYNAMIC_CONST_GLOBAL_HPP
32#define __TASMANIAN_SPARSE_GRID_DYNAMIC_CONST_GLOBAL_HPP
34#include <forward_list>
36#include "tsgIndexManipulator.hpp"
84 std::vector<int> point;
86 std::vector<double> value;
103 std::vector<int> tensor;
105 MultiIndexSet points;
107 std::vector<bool> loaded;
117std::vector<const T*> makeReverseReferenceVector(
const std::forward_list<T> &list){
118 size_t num_entries = (size_t) std::distance(list.begin(), list.end());
119 std::vector<const T*> refs(num_entries);
120 auto p = list.begin();
121 auto r = refs.rbegin();
122 while(p != list.end()) *r++ = &*p++;
132template<
bool use_ascii>
133void writeNodeDataList(
const std::forward_list<NodeData> &data, std::ostream &os){
134 if (use_ascii ==
mode_ascii){ os << std::scientific; os.precision(17); }
136 auto data_refs = makeReverseReferenceVector(data);
138 IO::writeNumbers<use_ascii, IO::pad_line>(os,
static_cast<int>(data_refs.size()));
139 for(
auto d : data_refs){
140 IO::writeVector<use_ascii, IO::pad_rspace>(d->point, os);
141 IO::writeVector<use_ascii, IO::pad_line>(d->value, os);
151template<
typename iomode>
152std::forward_list<NodeData> readNodeDataList(std::istream &is,
size_t num_dimensions,
size_t num_outputs){
153 std::forward_list<NodeData> data;
154 int num_nodes = IO::readNumber<iomode, int>(is);
156 for(
int i=0; i<num_nodes; i++){
157 data.emplace_front(NodeData{
158 IO::readVector<iomode, int>(is, num_dimensions),
159 IO::readVector<iomode, double>(is, num_outputs)
172template<
typename iomode>
173std::forward_list<TensorData> readTensorDataList(std::istream &is,
size_t num_dimensions){
174 std::forward_list<TensorData> tensors;
175 int num_entries = IO::readNumber<iomode, int>(is);
177 for(
int i=0; i<num_entries; i++){
178 tensors.emplace_front(TensorData{
179 IO::readNumber<iomode, double>(is),
180 IO::readVector<iomode, int>(is, num_dimensions),
196template<
class RuleLike>
197std::vector<double> listToNodes(std::forward_list<NodeData>
const &node_list,
size_t num_dimensions, RuleLike
const &rule){
198 std::vector<double> result(Utils::size_mult(std::distance(node_list.begin(), node_list.end()), num_dimensions));
199 auto ix = result.begin();
200 for(
auto const &t : node_list)
201 ix = MultiIndexManipulations::indexesToNodes(t.point, rule, ix);
211template<
typename callable_method>
212std::vector<double> listToLocalNodes(std::forward_list<NodeData>
const &node_list,
size_t num_dimensions, callable_method rule){
213 std::vector<double> result(Utils::size_mult(std::distance(node_list.begin(), node_list.end()), num_dimensions));
214 auto ix = result.begin();
215 for(
auto const &t : node_list)
216 ix = std::transform(t.point.begin(), t.point.end(), ix, rule);
231class DynamicConstructorDataGlobal{
234 enum class AddPointResult {
244 DynamicConstructorDataGlobal(
size_t cnum_dimensions,
size_t cnum_outputs) : num_dimensions(cnum_dimensions), num_outputs(cnum_outputs){}
246 template<
typename iomode>
247 DynamicConstructorDataGlobal(std::istream &is,
size_t cnum_dimensions,
size_t cnum_outputs, iomode) :
248 num_dimensions(cnum_dimensions),
249 num_outputs(cnum_outputs),
250 tensors(readTensorDataList<iomode>(is, num_dimensions)),
251 data(readNodeDataList<iomode>(is, num_dimensions, num_outputs))
254 ~DynamicConstructorDataGlobal() =
default;
257 template<
bool use_ascii>
void write(std::ostream &os)
const;
260 void restrictData(
int ibegin,
int iend){
for(
auto &d : data) d.value = std::vector<double>(d.value.begin() + ibegin, d.value.begin() + iend); }
263 int getMaxTensor()
const;
265 double getMaxTensorWeight()
const{
267 for(
auto it = tensors.begin(); it != tensors.end(); it++){
268 if (it->weight > maxw) maxw = it->weight;
274 void reloadPoints(std::function<
int(
int)> getNumPoints);
280 MultiIndexSet getInitialTensors()
const;
283 void addTensor(
const int *tensor, std::function<
int(
int)> getNumPoints,
double weight);
286 MultiIndexSet getNodesIndexes();
289 AddPointResult addNewNode(
const std::vector<int> &point,
const std::vector<double> &value);
292 void ejectCompleteTensor(MultiIndexSet
const ¤t_tensors, MultiIndexSet &new_tensors, MultiIndexSet &new_points, StorageSet &vals);
295 size_t num_dimensions, num_outputs;
296 std::forward_list<TensorData> tensors;
297 std::forward_list<NodeData> data;
312struct SimpleConstructData{
314 SimpleConstructData() =
default;
316 template<
typename iomode>
317 SimpleConstructData(std::istream &is,
int num_dimensions,
int num_outputs, iomode) :
318 initial_points(MultiIndexSet(is, iomode())),
319 data(readNodeDataList<iomode>(is, num_dimensions, num_outputs))
322 MultiIndexSet initial_points;
324 std::forward_list<NodeData> data;
326 template<
bool use_ascii>
327 void write(std::ostream &os)
const{
328 initial_points.write<use_ascii>(os);
329 writeNodeDataList<use_ascii>(data, os);
332 void restrictData(
int ibegin,
int iend){
for(
auto &d : data) d.value = std::vector<double>(d.value.begin() + ibegin, d.value.begin() + iend); }
334 std::vector<double> extractValues(MultiIndexSet
const &points){
335 size_t num_outputs = data.front().value.size();
336 int num_points = points.getNumIndexes();
337 Data2D<double> result(num_outputs, num_points);
338 auto p = data.before_begin();
339 auto d = data.begin();
340 while(d != data.end()){
341 int slot = points.getSlot(d->point);
343 std::copy_n(d->value.begin(), num_outputs, result.getStrip(slot));
352 return result.release();
constexpr bool mode_ascii
Constant allowing for more expressive selection of ascii and binary mode in IO methods.
Definition tsgIOHelpers.hpp:62
Encapsulates the Tasmanian Sparse Grid module.
Definition TasmanianSparseGrid.hpp:68