31#ifndef __TSG_HIERARCHY_MANIPULATOR_HPP
32#define __TSG_HIERARCHY_MANIPULATOR_HPP
34#include "tsgRuleLocalPolynomial.hpp"
35#include "tsgIndexManipulator.hpp"
74namespace HierarchyManipulations{
87template<RuleLocal::erule effrule>
88Data2D<int> computeDAGup(MultiIndexSet
const &mset);
97Data2D<int> computeDAGup(MultiIndexSet
const &mset, RuleLocal::erule effrule);
108template<RuleLocal::erule effrule>
109Data2D<int> computeDAGup(MultiIndexSet
const &mset,
bool &is_complete);
122template<RuleLocal::erule effrule>
123Data2D<int> computeDAGDown(MultiIndexSet
const &mset);
131template<RuleLocal::erule effrule>
132std::vector<int> computeLevels(MultiIndexSet
const &mset);
139std::vector<int> computeLevels(MultiIndexSet
const &mset, RuleLocal::erule effrule);
147template<RuleLocal::erule effrule>
148void completeToLower(MultiIndexSet
const &mset, MultiIndexSet &refined);
156template<RuleLocal::erule effrule,
typename callable_method>
157void touchAllImmediateRelatives(std::vector<int> &point, MultiIndexSet
const &mset, callable_method apply){
158 int max_kids = RuleLocal::getMaxNumKids<effrule>();
159 for(
auto &v : point){
163 v = RuleLocal::getParent<effrule>(save);
165 int parent_index = mset.getSlot(point);
166 if (parent_index > -1)
170 v = RuleLocal::getStepParent<effrule>(save);
172 int parent_index = mset.getSlot(point);
173 if (parent_index > -1)
177 for(
int k=0; k<max_kids; k++){
178 v = RuleLocal::getKid<effrule>(save, k);
180 int kid_index = mset.getSlot(point);
197template<RuleLocal::erule effrule>
198MultiIndexSet getLevelZeroPoints(
size_t num_dimensions){
200 while(RuleLocal::getParent<effrule>(num_parents) == -1) num_parents++;
201 return MultiIndexManipulations::generateFullTensorSet(std::vector<int>(num_dimensions, num_parents));
211template<RuleLocal::erule effrule>
212MultiIndexSet getLargestConnected(MultiIndexSet
const ¤t, MultiIndexSet
const &candidates){
213 if (candidates.empty())
return MultiIndexSet();
214 auto num_dimensions = candidates.getNumDimensions();
217 MultiIndexSet level_zero = getLevelZeroPoints<effrule>(num_dimensions);
219 MultiIndexSet result;
220 MultiIndexSet total = current;
223 if (!total.empty()) level_zero = level_zero - total;
225 if (level_zero.getNumIndexes() > 0){
226 Data2D<int> roots(num_dimensions, 0);
227 for(
int i=0; i<level_zero.getNumIndexes(); i++){
228 std::vector<int> p(level_zero.getIndex(i), level_zero.getIndex(i) + num_dimensions);
229 if (!candidates.missing(p))
230 roots.appendStrip(p);
233 result = MultiIndexSet(roots);
237 if (total.empty())
return MultiIndexSet();
239 int max_kids = RuleLocal::getMaxNumKids<effrule>();
240 int max_relatives = RuleLocal::getMaxNumParents<effrule>() + max_kids;
243 update = Data2D<int>(num_dimensions, 0);
245 for(
int i=0; i<total.getNumIndexes(); i++){
246 std::vector<int> relative(total.getIndex(i), total.getIndex(i) + num_dimensions);
247 for(
auto &r : relative){
249 for(
int j=0; j<max_relatives; j++){
250 r = (j < max_kids) ? RuleLocal::getKid<effrule>(k, j)
251 : ((j - max_kids == 0) ? RuleLocal::getParent<effrule>(k) : RuleLocal::getStepParent<effrule>(k));
252 if ((r != -1) && !candidates.missing(relative) && total.missing(relative))
253 update.appendStrip(relative);
259 if (update.getNumStrips() > 0){
260 MultiIndexSet update_set(update);
261 result += update_set;
264 }
while(update.getNumStrips() > 0);
278std::vector<Data2D<T>> splitByLevels(
size_t stride,
typename std::vector<T>::const_iterator ibegin,
typename std::vector<T>::const_iterator iend, std::vector<int>::const_iterator ilevels){
279 size_t top_level = (size_t) *std::max_element(ilevels, ilevels + std::distance(ibegin, iend) / stride);
281 std::vector<Data2D<T>> split(top_level + 1, Data2D<T>(stride, 0));
283 for(
struct { std::vector<int>::const_iterator il;
typename std::vector<T>::const_iterator idata;} v = {ilevels, ibegin};
285 v.il++, std::advance(v.idata, stride))
286 split[*v.il].appendStrip(v.idata);
295inline std::vector<Data2D<int>> splitByLevels(MultiIndexSet
const &mset, std::vector<int>
const &levels){
296 return splitByLevels<int>(mset.getNumDimensions(), mset.begin(), mset.end(), levels.begin());
304inline std::vector<Data2D<T>> splitByLevels(Data2D<T>
const &data, std::vector<int>
const &levels){
305 return splitByLevels<T>(data.getStride(), data.begin(), data.end(), levels.begin());
312inline std::vector<Data2D<double>> splitByLevels(StorageSet
const &stortage, std::vector<int>
const &levels){
313 return splitByLevels<double>(stortage.getNumOutputs(), stortage.begin(), stortage.end(), levels.begin());
323class SplitDirections{
326 SplitDirections(
const MultiIndexSet &points);
331 int getNumJobs()
const{
return (
int) job_pnts.size(); }
333 int getJobDirection(
int job)
const{
return job_directions[job]; }
335 int getJobNumPoints(
int job)
const{
return (
int) job_pnts[job].size(); }
337 const int* getJobPoints(
int job)
const{
return job_pnts[job].data(); }
339 int getMaxNumPoints()
const {
return (job_pnts.size() > 0) ? (int) std::max_element(job_pnts.begin(), job_pnts.end(),
340 [&](std::vector<int>
const &a, std::vector<int>
const& b)->bool{ return (a.size() < b.size()); })->size() : 0; }
343 std::vector<int> job_directions;
344 std::vector<std::vector<int>> job_pnts;
Encapsulates the Tasmanian Sparse Grid module.
Definition TasmanianSparseGrid.hpp:68