mirror of
https://github.com/boostorg/histogram.git
synced 2026-02-19 02:22:10 +00:00
added support for variable axis
This commit is contained in:
@@ -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 =
|
||||
|
||||
@@ -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_) {
|
||||
|
||||
Reference in New Issue
Block a user