diff --git a/src/combination/fubini.h b/src/combination/fubini.h index 769f217..6d33218 100644 --- a/src/combination/fubini.h +++ b/src/combination/fubini.h @@ -83,45 +83,26 @@ IntegratorFubini integrator_fubini(IntegratorF template auto integrator_fubini(const std::tuple& dims, IntegratorFirst&& ifirst, IntegratorRest&& irest) { - std::array reorder{std::get<0>(dims)}; - return integrator_reorder(integrator_fubini<1>(std::forward(ifirst), std::forward(irest)),reorder); + std::vector> reorder{ {0, std::get<0>(dims)}}; + return integrator_reorder(integrator_fubini<1>(std::forward(ifirst), std::forward(irest)),{0,std::get<0>(dims)}); } template auto integrator_fubini(const std::tuple& dims, IntegratorFirst&& ifirst, IntegratorRest&& irest) { - std::array reorder{std::get<0>(dims),std::get<1>(dims)}; + std::vector> reorder{ {0, std::get<0>(dims)}, {1, std::get<1>(dims)}}; return integrator_reorder(integrator_fubini<2>(std::forward(ifirst), std::forward(irest)),reorder); } template auto integrator_fubini(const std::tuple& dims, IntegratorFirst&& ifirst, IntegratorRest&& irest) { - std::array reorder{std::get<0>(dims),std::get<1>(dims),std::get<2>(dims)}; + std::vector> reorder{ {0, std::get<0>(dims)}, {1, std::get<1>(dims)}, {2, std::get<2>(dims)}}; return integrator_reorder(integrator_fubini<3>(std::forward(ifirst), std::forward(irest)),reorder); } template auto integrator_fubini(const std::tuple& dims, IntegratorFirst&& ifirst, IntegratorRest&& irest) { - std::array reorder{std::get<0>(dims),std::get<1>(dims),std::get<2>(dims),std::get<3>(dims)}; + std::vector> reorder{ {0, std::get<0>(dims)}, {1, std::get<1>(dims)}, {2, std::get<2>(dims)}, {3, std::get<3>(dims)}}; return integrator_reorder(integrator_fubini<4>(std::forward(ifirst), std::forward(irest)),reorder); } -template -auto integrator_fubini(const std::tuple& dims, IntegratorFirst&& ifirst, IntegratorRest&& irest) { - std::array reorder{std::get<0>(dims),std::get<1>(dims),std::get<2>(dims),std::get<3>(dims),std::get<4>(dims)}; - return integrator_reorder(integrator_fubini<5>(std::forward(ifirst), std::forward(irest)),reorder); -} - -template -auto integrator_fubini(const std::tuple& dims, IntegratorFirst&& ifirst, IntegratorRest&& irest) { - std::array reorder{std::get<0>(dims),std::get<1>(dims),std::get<2>(dims),std::get<3>(dims),std::get<4>(dims),std::get<5>(dims)}; - return integrator_reorder(integrator_fubini<6>(std::forward(ifirst), std::forward(irest)),reorder); -} - -template -auto integrator_fubini(const std::tuple& dims, IntegratorFirst&& ifirst, IntegratorRest&& irest) { - std::array reorder{std::get<0>(dims),std::get<1>(dims),std::get<2>(dims),std::get<3>(dims),std::get<4>(dims),std::get<5>(dims),std::get<6>(dims)}; - return integrator_reorder(integrator_fubini<7>(std::forward(ifirst), std::forward(irest)),reorder); -} - - }; \ No newline at end of file diff --git a/src/combination/reorder.h b/src/combination/reorder.h index 5df21c8..e5d21a3 100644 --- a/src/combination/reorder.h +++ b/src/combination/reorder.h @@ -11,37 +11,55 @@ namespace viltrum { -template +template class IntegratorReorder { Integrator integrator; - std::array first_dimensions; + std::vector> to_from; + + template + std::vector reorder(const V& v, const typename V::value_type& def = typename V::value_type()) const { + + std::vector tos(v.size(),false), froms(v.size(),false); + for (auto [to, from] : to_from) { + if (from=tos.size()) tos.resize(to+1,false); + froms[from]=true; tos[to]=true; + } + } + std::size_t ntos = 0, nfroms = 0; + std::for_each(tos.begin(),tos.end(),[&ntos] (bool b) { if (b) ++ntos; }); + std::for_each(froms.begin(),froms.end(),[&nfroms] (bool b) { if (b) ++nfroms; }); + + std::vector sol(std::max(tos.size(),ntos + v.size()-nfroms),def); + for (auto [to, from] : to_from) { + if ((from& fd) : - integrator(i), first_dimensions(fd) {} + IntegratorReorder(const Integrator& i, const std::vector>& fd) : + integrator(i), to_from(fd) {} template void integrate(Bins& bins, const std::array& bin_resolution, const F& f, const Range& range, Logger& logger) const { - std::array reorder_min = range.min(); - std::array reorder_max = range.max(); - for (std::size_t i = 0; i range_reordered(reorder_min,reorder_max); - - + auto range_reordered = viltrum::range(reorder(range.min(),Float(0)),reorder(range.max(),Float(1))); const auto f_reordered = [&] (const std::array& x) { - std::array x_reordered = x; - for (std::size_t i = 0; i x_re; + for (std::size_t i = 0; (i& bin_resolution, const F& f, const RangeInfinite& range, Logger& logger) const { - std::size_t size_reorder = 0; //For checking max size of the reorder vector - for (std::size_t i : first_dimensions) if (size_reorder<=i) size_reorder = (i+1); - - std::vector reorder_min = range.min(); - if (reorder_min.size() reorder_max = range.max(); - if (reorder_max.size() range_reordered(reorder_min,reorder_max); - + RangeInfinite range_reordered(reorder(range.min(),Float(0)),reorder(range.max(),Float(1))); + std::size_t size_reorder = 0; + for (auto [to, from] : to_from) { + if (size_reorder<=from) { + size_reorder = from + 1; + } + } const auto f_reordered = [&] (const auto& x) { - std::vector x_reordered(size_reorder); + std::vector xr(size_reorder); auto it = x.begin(); - for (Float& xr : x_reordered) { xr = (*it); ++it; } - - for (std::size_t i = 0; i "; + for (Float v : reorder(xr)) std::cerr< -IntegratorReorder integrator_reorder(Integrator&& i, const std::array& fd) { - return IntegratorReorder,N>(std::forward(i),fd); +template +IntegratorReorder integrator_reorder(Integrator&& i, const std::vector>& fd) { + return IntegratorReorder>(std::forward(i),fd); } }; \ No newline at end of file diff --git a/src/range.h b/src/range.h index 1ddfd16..376a717 100644 --- a/src/range.h +++ b/src/range.h @@ -161,6 +161,18 @@ Range range_all(const T& va, const T& vb) { return range(a,b); } +template +Range range(const std::vector& a, const std::vector& b) { + std::array ar, br; + std::size_t i; + for (i = 0; (i Range range_primary() { return range_all(T(0),T(1));