diff --git a/Addons/testLoadUnstructured.hpp b/Addons/testLoadUnstructured.hpp index ab184ffa2..2f7a0430c 100644 --- a/Addons/testLoadUnstructured.hpp +++ b/Addons/testLoadUnstructured.hpp @@ -88,9 +88,10 @@ inline double coefficientDifference(TasmanianSparseGrid const &gA, TasmanianSpar size_t num_coeffs = Utils::size_mult(gA.getNumOutputs(), gA.getNumPoints()); double const *c1 = gA.getHierarchicalCoefficients(); double const *c2 = gB.getHierarchicalCoefficients(); - return std::inner_product(c1, c1 + num_coeffs, c2, 0.0, - [](double a, double b)->double{ return std::max(a, b); }, - [](double a, double b)->double{ return std::abs(a - b); }); + double err = 0.0; + for(size_t i=0; i const&x, TasmanianSparseGrid co gA.evaluateBatch(x, yA); gB.evaluateBatch(x, yB); - return std::inner_product(yA.begin(), yA.end(), yB.begin(), 0.0, - [](double a, double b)->double{ return std::max(a, b); }, - [](double a, double b)->double{ return std::abs(a - b); }); + double err = 0.0; + for(size_t i=0; i const &x, std::vector const &y){ if (x.size() != y.size()) return 1.E+20; - return std::inner_product(x.begin(), x.end(), y.begin(), 0.0, - [](double a, double b)->double{ return std::max(a, b); }, - [](double a, double b)->double{ return std::abs(a - b); }); + double err = 0.0; + for(size_t i=0; i xpnts = genRandom(10, grid.getNumDimensions()); grid.evaluateBatch(xpnts, res1); grid2.evaluateBatch(xpnts, res2); - double err = std::inner_product(res1.begin(), res1.end(), res2.begin(), 0.0, - [](double a, double b)->double{ return std::max(a, b); }, - [](double a, double b)->double{ return std::abs(a - b); }); - if (err > Maths::num_tol){ cout << "ERROR: failed evaluate after loading batch points." << endl; return false; } + double err = 0.0; + for(size_t i=0; i Maths::num_tol){ cout << "ERROR: failed evaluate after loading batch points. " << endl; return false; } return true; } diff --git a/SparseGrids/tsgGridLocalPolynomial.cpp b/SparseGrids/tsgGridLocalPolynomial.cpp index 3d62a71ba..62f75afe6 100644 --- a/SparseGrids/tsgGridLocalPolynomial.cpp +++ b/SparseGrids/tsgGridLocalPolynomial.cpp @@ -1266,83 +1266,117 @@ Data2D GridLocalPolynomial::buildUpdateMap(double tolerance, TypeRefinement int max_1D_parents = rule->getMaxNumParents(); HierarchyManipulations::SplitDirections split(points); - std::vector global_to_pnts(num_points); - #pragma omp parallel for firstprivate(global_to_pnts) - for(int j=0; j levels(nump); + #pragma omp parallel + { + int max_nump = split.getMaxNumPoints(); + std::vector global_to_pnts(num_points); + std::vector levels(max_nump); + + std::vector monkey_count; + std::vector monkey_tail; + std::vector used; + if (max_1D_parents > 1) { + monkey_count.resize(top_level + 1); + monkey_tail.resize(top_level + 1); + used.resize(max_nump, false); + } - int max_level = 0; + #pragma omp for + for(int j=0; j vals(active_outputs, nump); + int max_level = 0; - for(int i=0; i vals(active_outputs, nump); + + if (output == -1) { + for(int i=0; igetLevel(points.getIndex(pnts[i])[d]); + if (max_level < levels[i]) max_level = levels[i]; + } + } else { + for(int i=0; igetLevel(points.getIndex(pnts[i])[d]); + if (max_level < levels[i]) max_level = levels[i]; + } } - global_to_pnts[pnts[i]] = i; - levels[i] = rule->getLevel(p[d]); - if (max_level < levels[i]) max_level = levels[i]; - } - std::vector monkey_count(max_level + 1); - std::vector monkey_tail(max_level + 1); + if (max_1D_parents == 1) { + for(int l=1; l<=max_level; l++){ + for(int i=0; igetNode(points.getIndex(pnts[i])[d]); + double *valsi = vals.getStrip(i); - for(int l=1; l<=max_level; l++){ - for(int i=0; igetNode(points.getIndex(pnts[i])[d]); - double *valsi = vals.getStrip(i); - - int current = 0; - monkey_count[0] = d * max_1D_parents; - monkey_tail[0] = pnts[i]; // uses the global indexes - std::vector used(nump, false); - - while(monkey_count[0] < (d+1) * max_1D_parents){ - if (monkey_count[current] < (d+1) * max_1D_parents){ - int branch = dagUp.getStrip(monkey_tail[current])[monkey_count[current]]; - if ((branch == -1) || (used[global_to_pnts[branch]])){ - monkey_count[current]++; - }else{ + int branch = dagUp.getStrip(pnts[i])[d]; + while(branch != -1) { const int *branch_point = points.getIndex(branch); double basis_value = rule->evalRaw(branch_point[d], x); const double *branch_vals = vals.getStrip(global_to_pnts[branch]); for(int k=0; kgetNode(points.getIndex(pnts[i])[d]); + double *valsi = vals.getStrip(i); + + int current = 0; + monkey_count[0] = d * max_1D_parents; + monkey_tail[0] = pnts[i]; // uses the global indexes + std::fill_n(used.begin(), nump, false); + + while(monkey_count[0] < (d+1) * max_1D_parents){ + if (monkey_count[current] < (d+1) * max_1D_parents){ + int branch = dagUp.getStrip(monkey_tail[current])[monkey_count[current]]; + if ((branch == -1) || (used[global_to_pnts[branch]])){ + monkey_count[current]++; + }else{ + const int *branch_point = points.getIndex(branch); + double basis_value = rule->evalRaw(branch_point[d], x); + const double *branch_vals = vals.getStrip(global_to_pnts[branch]); + for(int k=0; k lrefined(num_dimensions, 0); + + if (level_limits.empty()){ + #pragma omp for + for(int i=0; i 0) ? (int) std::max_element(job_pnts.begin(), job_pnts.end(), + [&](std::vector const &a, std::vector const& b)->bool{ return (a.size() < b.size()); })->size() : 0; } private: std::vector job_directions; diff --git a/SparseGrids/tsgIndexSets.hpp b/SparseGrids/tsgIndexSets.hpp index 8c6280ba4..3c238cb76 100644 --- a/SparseGrids/tsgIndexSets.hpp +++ b/SparseGrids/tsgIndexSets.hpp @@ -192,6 +192,12 @@ class Data2D{ num_strips++; } + //! \brief Uses std::vector::insert to append all the data from the other to this + void append(Data2D const &other) { + vec.insert(vec.end(), other.vec.begin(), other.vec.end()); + num_strips += other.num_strips; + } + private: size_t stride, num_strips; std::vector vec; diff --git a/SparseGrids/tsgSequenceOptimizer.cpp b/SparseGrids/tsgSequenceOptimizer.cpp index f44889941..61b6727b5 100644 --- a/SparseGrids/tsgSequenceOptimizer.cpp +++ b/SparseGrids/tsgSequenceOptimizer.cpp @@ -346,8 +346,11 @@ template<> double getValue(CurrentNodes cons auto lag = evalLagrange(current.nodes, current.coeff, x); auto lag_less1 = evalLagrange(current.nodes_less1, current.coeff_less1, x); - return std::abs(lag.back()) + std::inner_product(lag_less1.begin(), lag_less1.end(), lag.begin(), 0.0, - std::plus(), [](double a, double b)->double{ return std::abs(a - b); }); + double result = std::abs(lag.back()); + for(size_t i=0; i