Doxygen 1.17.0
Toolkit for Adaptive Stochastic Modeling and Non-Intrusive ApproximatioN: Tasmanian v8.3
Loading...
Searching...
No Matches
tsgIOHelpers.hpp
1/*
2 * Copyright (c) 2017, Miroslav Stoyanov
3 *
4 * This file is part of
5 * Toolkit for Adaptive Stochastic Modeling And Non-Intrusive ApproximatioN: TASMANIAN
6 *
7 * Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met:
8 *
9 * 1. Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer.
10 *
11 * 2. Redistributions in binary form must reproduce the above copyright notice, this list of conditions
12 * and the following disclaimer in the documentation and/or other materials provided with the distribution.
13 *
14 * 3. Neither the name of the copyright holder nor the names of its contributors may be used to endorse
15 * or promote products derived from this software without specific prior written permission.
16 *
17 * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES,
18 * INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
19 * IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY,
20 * OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA,
21 * OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
22 * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
23 *
24 * UT-BATTELLE, LLC AND THE UNITED STATES GOVERNMENT MAKE NO REPRESENTATIONS AND DISCLAIM ALL WARRANTIES, BOTH EXPRESSED AND IMPLIED.
25 * THERE ARE NO EXPRESS OR IMPLIED WARRANTIES OF MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE, OR THAT THE USE OF THE SOFTWARE WILL NOT INFRINGE ANY PATENT,
26 * COPYRIGHT, TRADEMARK, OR OTHER PROPRIETARY RIGHTS, OR THAT THE SOFTWARE WILL ACCOMPLISH THE INTENDED RESULTS OR THAT THE SOFTWARE OR ITS USE WILL NOT RESULT IN INJURY OR DAMAGE.
27 * THE USER ASSUMES RESPONSIBILITY FOR ALL LIABILITIES, PENALTIES, FINES, CLAIMS, CAUSES OF ACTION, AND COSTS AND EXPENSES, CAUSED BY, RESULTING FROM OR ARISING OUT OF,
28 * IN WHOLE OR IN PART THE USE, STORAGE OR DISPOSAL OF THE SOFTWARE.
29 */
30
31#ifndef __TASMANIAN_IOHELPERS_HPP
32#define __TASMANIAN_IOHELPERS_HPP
33
34#include "tsgEnumerates.hpp"
35#include <functional> // put here because it causes a conflict with some versions of CUDA (keep out of tsgAcceleratedStructures.hpp)
36
48
55
56namespace TasGrid{
57
62constexpr bool mode_ascii = false;
63
68constexpr bool mode_binary = true;
69
70
76namespace IO{
77
82struct mode_ascii_type{};
83
88struct mode_binary_type{};
89
99enum IOPad{
101 pad_none,
103 pad_rspace,
105 pad_lspace,
107 pad_line,
109 pad_auto
110};
111
116inline std::map<std::string_view, TypeOneDRule> getStringRuleMap(){
117 return std::initializer_list<std::pair<std::string_view const, TypeOneDRule>>{
118 {"none", rule_none},
119 {"clenshaw-curtis", rule_clenshawcurtis},
120 {"clenshaw-curtis-zero", rule_clenshawcurtis0},
121 {"chebyshev", rule_chebyshev},
122 {"chebyshev-odd", rule_chebyshevodd},
123 {"gauss-legendre", rule_gausslegendre},
124 {"gauss-legendre-odd", rule_gausslegendreodd},
125 {"gauss-patterson", rule_gausspatterson},
126 {"leja", rule_leja},
127 {"leja-odd", rule_lejaodd},
128 {"rleja", rule_rleja},
129 {"rleja-double2", rule_rlejadouble2},
130 {"rleja-double4", rule_rlejadouble4},
131 {"rleja-odd", rule_rlejaodd},
132 {"rleja-shifted", rule_rlejashifted},
133 {"rleja-shifted-even", rule_rlejashiftedeven},
134 {"rleja-shifted-double", rule_rlejashifteddouble},
135 {"max-lebesgue", rule_maxlebesgue},
136 {"max-lebesgue-odd", rule_maxlebesgueodd},
137 {"min-lebesgue", rule_minlebesgue},
138 {"min-lebesgue-odd", rule_minlebesgueodd},
139 {"min-delta", rule_mindelta},
140 {"min-delta-odd", rule_mindeltaodd},
141 {"gauss-chebyshev1", rule_gausschebyshev1},
142 {"gauss-chebyshev1-odd", rule_gausschebyshev1odd},
143 {"gauss-chebyshev2", rule_gausschebyshev2},
144 {"gauss-chebyshev2-odd", rule_gausschebyshev2odd},
145 {"fejer2", rule_fejer2},
146 {"gauss-gegenbauer", rule_gaussgegenbauer},
147 {"gauss-gegenbauer-odd", rule_gaussgegenbauerodd},
148 {"gauss-jacobi", rule_gaussjacobi},
149 {"gauss-jacobi-odd", rule_gaussjacobiodd},
150 {"gauss-laguerre", rule_gausslaguerre},
151 {"gauss-laguerre-odd", rule_gausslaguerreodd},
152 {"gauss-hermite", rule_gausshermite},
153 {"gauss-hermite-odd", rule_gausshermiteodd},
154 {"custom-tabulated", rule_customtabulated},
155 {"localp", rule_localp},
156 {"localp-zero", rule_localp0},
157 {"localp-boundary", rule_localpb},
158 {"semi-localp", rule_semilocalp},
159 {"wavelet", rule_wavelet},
160 {"fourier", rule_fourier}};
161}
162
167inline TypeOneDRule getRuleString(std::string_view const &name){
168 auto const &name_map = getStringRuleMap();
169 auto rule = name_map.find(name);
170 return (rule == name_map.end()) ? rule_none : rule->second;
171}
172
177inline std::string_view getRuleString(TypeOneDRule rule){
178 auto smap = getStringRuleMap();
179 return std::find_if(smap.begin(), smap.end(),
180 [&](std::pair<std::string_view const, TypeOneDRule> r)->bool{ return (r.second == rule); })->first;
181}
182
187inline std::vector<TypeOneDRule> getIntRuleMap(){
201}
202
207inline TypeOneDRule getRuleInt(int r){
208 auto rmap = getIntRuleMap();
209 return ((size_t) r < rmap.size()) ? rmap[(size_t) r] : rule_none;
210}
211
216inline int getRuleInt(TypeOneDRule rule){
217 auto rmap = getIntRuleMap();
218 return (int) std::distance(rmap.begin(), std::find_if(rmap.begin(), rmap.end(),
219 [&](TypeOneDRule r)->bool{ return (r == rule); }));
220}
221
226inline std::map<std::string_view, TypeDepth> getStringToDepthMap(){
227 return std::initializer_list<std::pair<std::string_view const, TypeDepth>>{
228 {"level", type_level},
229 {"curved", type_curved},
230 {"iptotal", type_iptotal},
231 {"ipcurved", type_ipcurved},
232 {"qptotal", type_qptotal},
233 {"qpcurved", type_qpcurved},
234 {"hyperbolic", type_hyperbolic},
235 {"iphyperbolic", type_iphyperbolic},
236 {"qphyperbolic", type_qphyperbolic},
237 {"tensor", type_tensor},
238 {"iptensor", type_iptensor},
239 {"qptensor", type_qptensor}};
240}
245inline TypeDepth getDepthTypeString(std::string_view const &name){
246 auto const &name_map = getStringToDepthMap();
247 auto depth = name_map.find(name);
248 return (depth == name_map.end()) ? type_none : depth->second;
249}
250
255inline TypeDepth getDepthTypeInt(int t){
256 std::vector<TypeDepth> imap = {type_none, type_level, type_curved, type_iptotal,
259 return ((size_t) t < imap.size()) ? imap[(size_t) t] : type_none;
260}
261
266inline std::map<std::string_view, TypeRefinement> getStringToRefinementMap(){
267 return std::initializer_list<std::pair<std::string_view const, TypeRefinement>>{
268 {"classic", refine_classic},
269 {"parents", refine_parents_first},
270 {"direction", refine_direction_selective},
271 {"fds", refine_fds},
272 {"stable", refine_stable}};
273}
278inline TypeRefinement getTypeRefinementString(std::string_view const &name){
279 auto const &name_map = getStringToRefinementMap();
280 auto const ref = name_map.find(name);
281 return (ref == name_map.end()) ? refine_none : ref->second;
282}
287inline TypeRefinement getTypeRefinementInt(int refinement){
288 std::vector<TypeRefinement> imap = {refine_none, refine_classic,
291 return ((size_t) refinement < imap.size()) ? imap[(size_t) refinement] : refine_none;
292}
293
298template<bool iomode, IOPad pad>
299void writeFlag(bool flag, std::ostream &os){
300 if (iomode == mode_ascii){
301 os << ((flag) ? "1" : "0");
302 if ((pad == pad_rspace) || ((pad == pad_auto) && flag)) os << " ";
303 if ((pad == pad_line) || ((pad == pad_auto) && !flag)) os << std::endl;
304 }else{
305 char cflag = ((flag) ? 'y' : 'n');
306 os.write(&cflag, sizeof(char));
307 }
308}
309
314template<typename iomode>
315bool readFlag(std::istream &os){
316 if (std::is_same<iomode, mode_ascii_type>::value){
317 int flag;
318 os >> flag;
319 return (flag != 0);
320 }else{
321 char cflag;
322 os.read(&cflag, sizeof(char));
323 return (cflag == 'y');
324 }
325}
326
331template<bool iomode, IOPad pad, typename VecType>
332void writeVector(const std::vector<VecType> &x, std::ostream &os){
333 if (iomode == mode_ascii){
334 if (pad == pad_lspace)
335 for(auto i : x) os << " " << i;
336 if (pad == pad_rspace)
337 for(auto i : x) os << i << " ";
338 if ((pad == pad_none) || (pad == pad_line)){
339 os << x[0];
340 for(size_t i = 1; i < x.size(); i++) os << " " << x[i];
341 if (pad == pad_line) os << std::endl;
342 }
343 }else{
344 os.write((char*) x.data(), x.size() * sizeof(VecType));
345 }
346}
347
352template<typename iomode, typename VecType>
353void readVector(std::istream &is, std::vector<VecType> &x){
354 if (std::is_same<iomode, mode_ascii_type>::value){
355 for(auto &i : x) is >> i;
356 }else{
357 is.read((char*) x.data(), x.size() * sizeof(VecType));
358 }
359}
360
365template<typename iomode, typename VecType, typename SizeType>
366std::vector<VecType> readVector(std::istream &is, SizeType num_entries){
367 std::vector<VecType> x((size_t) num_entries);
368 readVector<iomode, VecType>(is, x);
369 return x;
370}
371
376template<bool iomode, IOPad pad, typename... Vals>
377void writeNumbers(std::ostream &os, Vals... vals){
378 std::vector<typename std::tuple_element<0, std::tuple<Vals...>>::type> values = {vals...};
379 writeVector<iomode, pad>(values, os);
380}
381
386template<typename iomode, typename Val>
387Val readNumber(std::istream &is){
388 Val v;
389 if (std::is_same<iomode, mode_ascii_type>::value){
390 is >> v;
391 }else{
392 is.read((char*) &v, sizeof(Val));
393 }
394 return v;
395}
396
401template<bool iomode>
402void writeRule(TypeOneDRule rule, std::ostream &os){
403 if (iomode == mode_ascii){
404 os << getRuleString(rule) << std::endl;
405 }else{
406 int r = getRuleInt(rule);
407 os.write((char*) &r, sizeof(int));
408 }
409}
410
415template<typename iomode>
416TypeOneDRule readRule(std::istream &is){
417 if (std::is_same<iomode, mode_ascii_type>::value){
418 std::string T;
419 is >> T;
420 return getRuleString(T);
421 }else{
422 return getRuleInt(readNumber<mode_binary_type, int>(is));
423 }
424}
425
426}
427
428}
429
430#endif
TypeOneDRule
Used to specify the one dimensional family of rules that induces the sparse grid.
Definition tsgEnumerates.hpp:288
TypeDepth
Used by Global Sequence and Fourier grids, indicates the selection criteria.
Definition tsgEnumerates.hpp:206
TypeRefinement
Refinement strategy for local polynomial and wavelet grids.
Definition tsgEnumerates.hpp:428
@ rule_minlebesgue
A greedy sequence rule with nodes added to minimize the Lebesgue constant.
Definition tsgEnumerates.hpp:324
@ rule_gaussgegenbauer
Non-nested rule optimized for integral of the form .
Definition tsgEnumerates.hpp:346
@ rule_gausshermite
Non-nested rule optimized for integral of the form .
Definition tsgEnumerates.hpp:358
@ rule_gausslegendre
Non-nested rule but optimized for integration.
Definition tsgEnumerates.hpp:332
@ rule_fejer2
Similar to rule_clenshawcurtis but with nodes strictly in the interior.
Definition tsgEnumerates.hpp:296
@ rule_leja
Classic sequence rule, moderate Lebesgue constant growth (empirical result only).
Definition tsgEnumerates.hpp:302
@ rule_rlejashifteddouble
Same as rule_rlejashifted but doubling the number of nodes per level, which reduced the Lebesgue cons...
Definition tsgEnumerates.hpp:318
@ rule_gausslaguerreodd
Same as rule_gausslaguerre but using only odd levels, partially mitigates the non-nested issues.
Definition tsgEnumerates.hpp:356
@ rule_localp
Nested rule with a hierarchy of uniformly distributed nodes and functions with compact support.
Definition tsgEnumerates.hpp:365
@ rule_chebyshevodd
Same as rule_chebyshev but using only odd levels, partially mitigates the non-nested issues.
Definition tsgEnumerates.hpp:300
@ rule_minlebesgueodd
Same as rule_minlebesgue but using only odd levels, quadrature is more stable.
Definition tsgEnumerates.hpp:326
@ rule_gausslegendreodd
Same as rule_gausslegendre but using only odd levels, partially mitigates the non-nested issues.
Definition tsgEnumerates.hpp:334
@ rule_gausschebyshev1
Non-nested rule optimized for integral of the form .
Definition tsgEnumerates.hpp:338
@ rule_gausslaguerre
Non-nested rule optimized for integral of the form .
Definition tsgEnumerates.hpp:354
@ rule_wavelet
Wavelet basis with uniformly distributed nodes (primarily for internal use).
Definition tsgEnumerates.hpp:373
@ rule_mindelta
A greedy sequence rule with nodes added to minimize the norm of the surplus operator.
Definition tsgEnumerates.hpp:328
@ rule_gaussgegenbauerodd
Same as rule_gaussgegenbauer but using only odd levels, partially mitigates the non-nested issues.
Definition tsgEnumerates.hpp:348
@ rule_localpb
Variation of rule_localp focusing nodes on the boundary instead of the interior.
Definition tsgEnumerates.hpp:371
@ rule_customtabulated
User provided rule, nodes and weights must be provided with a separate file.
Definition tsgEnumerates.hpp:362
@ rule_gausshermiteodd
Same as rule_gausshermite but using only odd levels, partially mitigates the non-nested issues.
Definition tsgEnumerates.hpp:360
@ rule_clenshawcurtis
Classic nested rule using Chebyshev nodes with very low Lebesgue constant.
Definition tsgEnumerates.hpp:292
@ rule_gausschebyshev2odd
Same as rule_gausschebyshev2 but using only odd levels, partially mitigates the non-nested issues.
Definition tsgEnumerates.hpp:344
@ rule_maxlebesgueodd
Same as rule_maxlebesgue but using only odd levels, quadrature is more stable.
Definition tsgEnumerates.hpp:322
@ rule_maxlebesgue
A greedy sequence rule with nodes placed at the maximum of the Lebesgue function.
Definition tsgEnumerates.hpp:320
@ rule_clenshawcurtis0
Same as rule_clenshawcurtis but with modified basis that assumes the model is zero at the boundary.
Definition tsgEnumerates.hpp:294
@ rule_none
Null rule, should never be used as input (default rule for an empty grid).
Definition tsgEnumerates.hpp:290
@ rule_chebyshev
Using Chebyshev nodes with very low Lebesgue constant and slow node growth, but non-nested.
Definition tsgEnumerates.hpp:298
@ rule_gausschebyshev1odd
Same as rule_gausschebyshev1 but using only odd levels, partially mitigates the non-nested issues.
Definition tsgEnumerates.hpp:340
@ rule_rlejashifted
Similar sequence to rule_rleja but with nodes strictly in the interior.
Definition tsgEnumerates.hpp:314
@ rule_gausschebyshev2
Non-nested rule optimized for integral of the form .
Definition tsgEnumerates.hpp:342
@ rule_localp0
Variation of rule_localp assuming the model is zero at the domain boundary.
Definition tsgEnumerates.hpp:367
@ rule_fourier
Trigonometric basis with uniformly distributed nodes (primarily for internal use).
Definition tsgEnumerates.hpp:375
@ rule_mindeltaodd
Same as rule_mindelta but using only odd levels, quadrature is more stable.
Definition tsgEnumerates.hpp:330
@ rule_rlejadouble4
Using rule_rleja nodes but doubling the nodes every 4 levels, reduces the Lebesgue constant.
Definition tsgEnumerates.hpp:310
@ rule_gaussjacobiodd
Same as rule_gaussjacobi but using only odd levels, partially mitigates the non-nested issues.
Definition tsgEnumerates.hpp:352
@ rule_lejaodd
Same as rule_leja but using only odd levels, quadrature is more stable.
Definition tsgEnumerates.hpp:304
@ rule_rlejaodd
Same as rule_rleja but using only odd levels, quadrature is more stable.
Definition tsgEnumerates.hpp:312
@ rule_rlejadouble2
Using rule_rleja nodes but doubling the nodes every 2 levels, reduces the Lebesgue constant.
Definition tsgEnumerates.hpp:308
@ rule_rlejashiftedeven
Same as rule_rlejashifted but using only even levels, quadrature is more stable.
Definition tsgEnumerates.hpp:316
@ rule_gausspatterson
Nested rule that is optimized for integration, probably the best integration rule in more than 2 dime...
Definition tsgEnumerates.hpp:336
@ rule_rleja
Classic sequence rule based on complex analysis, moderate Lebesgue constant growth (theoretically pro...
Definition tsgEnumerates.hpp:306
@ rule_semilocalp
Variation of rule_localp using increased support in exchange for higher order basis (better for smoot...
Definition tsgEnumerates.hpp:369
@ rule_gaussjacobi
Non-nested rule optimized for integral of the form .
Definition tsgEnumerates.hpp:350
@ type_curved
Ignoring the polynomial space, use rules with index .
Definition tsgEnumerates.hpp:216
@ type_iptensor
Make a dense tensor grid with interpolation range that includes .
Definition tsgEnumerates.hpp:248
@ type_qptotal
Total degree polynomial space for quadrature/integration.
Definition tsgEnumerates.hpp:227
@ type_qpcurved
Curved polynomial space for quadrature/integration.
Definition tsgEnumerates.hpp:234
@ type_level
Ignoring the polynomial space, use rules with index .
Definition tsgEnumerates.hpp:212
@ type_qphyperbolic
Hyperbolic cross section polynomial space for quadrature/integration.
Definition tsgEnumerates.hpp:241
@ type_none
Null type, should never be used for input, indicates an error of some sort.
Definition tsgEnumerates.hpp:208
@ type_iptotal
Total degree polynomial space for interpolation, i.e., the span of .
Definition tsgEnumerates.hpp:224
@ type_qptensor
Make a dense tensor grid with quadrature/integration range that includes .
Definition tsgEnumerates.hpp:252
@ type_hyperbolic
Ignoring the polynomial space, use rules with index .
Definition tsgEnumerates.hpp:220
@ type_iphyperbolic
Hyperbolic cross section polynomial space for interpolation, i.e., the span of .
Definition tsgEnumerates.hpp:238
@ type_tensor
Make a dense tensor grid with rules indexed by .
Definition tsgEnumerates.hpp:244
@ type_ipcurved
Curved polynomial space for interpolation, i.e., the span of .
Definition tsgEnumerates.hpp:231
@ refine_parents_first
Isotropic refinement adding children only if the parents are already included.
Definition tsgEnumerates.hpp:432
@ refine_classic
Isotropic refinement using only the children and disregarding missing parents.
Definition tsgEnumerates.hpp:430
@ refine_direction_selective
Anisotropic refinement using only the children and disregarding missing parents.
Definition tsgEnumerates.hpp:434
@ refine_fds
Anisotropic refinement adding children only if the parents are already included.
Definition tsgEnumerates.hpp:436
@ refine_none
Null method, should never be used as input.
Definition tsgEnumerates.hpp:440
@ refine_stable
Isotropic refinement that ensures the points maintain lower-complete structures.
Definition tsgEnumerates.hpp:438
constexpr bool mode_binary
Constant allowing for more expressive selection of ascii and binary mode in IO methods.
Definition tsgIOHelpers.hpp:68
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