added support for variable axis

This commit is contained in:
Hans Dembinski
2018-11-18 17:08:06 +01:00
parent 82186969f3
commit db8fe44e9e
4 changed files with 75 additions and 11 deletions

View File

@@ -39,20 +39,31 @@ struct reduce_option_type {
operator bool() const noexcept { return merge; }
};
reduce_option_type shrink(unsigned iaxis, double lower, double upper) {
return {iaxis, lower, upper, 1};
}
reduce_option_type shrink_and_rebin(unsigned iaxis, double lower, double upper,
unsigned merge) {
return {iaxis, lower, upper, merge};
}
reduce_option_type shrink(unsigned iaxis, double lower, double upper) {
return {iaxis, lower, upper, 1};
}
reduce_option_type rebin(unsigned iaxis, unsigned merge) {
return {iaxis, std::numeric_limits<double>::quiet_NaN(),
std::numeric_limits<double>::quiet_NaN(), merge};
}
/// Convenience overload for when there is only one axis.
reduce_option_type shrink_and_rebin(double lower, double upper, unsigned merge) {
return shrink_and_rebin(0, lower, upper, merge);
}
/// Convenience overload for when there is only one axis.
reduce_option_type shrink(double lower, double upper) { return shrink(0, lower, upper); }
/// Convenience overload for when there is only one axis.
reduce_option_type rebin(unsigned merge) { return rebin(0, merge); }
template <typename A, typename S, typename C, typename = detail::requires_iterable<C>>
histogram<A, S> reduce(const histogram<A, S>& h, const C& c) {
auto options =

View File

@@ -107,6 +107,25 @@ public:
allocator_type a = allocator_type())
: variable(l.begin(), l.end(), std::move(m), o, std::move(a)) {}
/// Constructor used by algorithm::reduce to shrink and rebin (not for users).
variable(const variable& src, unsigned begin, unsigned end, unsigned merge)
: base_type((end - begin) / merge, src.metadata(), src.options()), x_(src.x_) {
BOOST_ASSERT((end - begin) % merge == 0);
using It = const detail::unqual<decltype(*src.x_.first())>*;
struct skip_iterator {
It it;
unsigned skip;
skip_iterator operator++(int) {
auto tmp = *this;
it += skip;
return tmp;
}
decltype(auto) operator*() { return *it; }
bool operator==(const skip_iterator& rhs) const { return it == rhs.it; }
} iter{src.x_.first() + begin, merge};
x_.first() = detail::create_buffer_from_iter(x_.second(), nx(), iter);
}
variable() : x_(nullptr) {}
variable(const variable& o) : base_type(o), x_(o.x_) {