feat: add pick command for reduce#429
Open
henryiii wants to merge 2 commits into
Open
Conversation
Add a pick command to algorithm::reduce, which selects an arbitrary subset of bins by index from an axis which is not ordered, like the category axis. Unlike slice, the picked bins do not have to be adjacent, and they may be given in any order, which reorders the bins in the new axis. Counts in bins which are not picked are added to the overflow bin, if it is present, consistent with how slice treats unordered axes; otherwise they are discarded. Axes opt into picking with a new special constructor which accepts the original axis and a vector of bin indices to keep. The new trait axis::traits::is_pickable detects this constructor, mirroring is_reducible. axis::category implements it; ordered axes throw invalid_argument, since picking a non-adjacent subset from them would require changing the axis type, which reduce does not support yet. Fixes boostorg#275 Assisted-by: ClaudeCode:claude-fable-5
Windows CI failed two ways: - C1128 (too many sections) when compiling algorithm_reduce_test.cpp; add /bigobj for the test under CMake, matching the b2 build which already sets it globally and the existing fill/operators tests. - C4702 (unreachable code, treated as error) for the non-pickable static_if branch in reduce(). Unlike is_reducible (true for all standard axes), is_pickable is false for most axes, so that branch is codegen'd and MSVC flags the value after the noreturn throw. Guard the function with a 4702 pragma, mirroring detail/fill.hpp. Assisted-by: ClaudeCode:claude-opus-4.8
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
This is a potential implementation of a
pickcommand.This is a test run of Claude Fable 5, which was released today.
🤖 AI text below 🤖
Closes #275.
This adds a
pickcommand toalgorithm::reduce, which selects an arbitrary subset of bins by index from an axis which is not ordered, like the category axis.Design
pick(iaxis, indices)/pick(indices)follow the same positional/explicit-index convention as the other reduce commands. Indices must be unique and non-empty (std::invalid_argumentotherwise); out-of-range indices are rejected insidereduce.slice, the picked bins do not have to be adjacent, and the order of the indices determines the bin order of the new axis, sopickcan also reorder an unordered axis.slicealready treats unordered axes.pickcannot be fused with any other command for the same axis.A(const A& src, const std::vector<index_type>& indices). A new public traitaxis::traits::is_pickabledetects it, mirroringis_reducible, so user-defined axes can opt in.axis::categoryimplements it; ordered axes (regular, variable, integer, circular) throw, since picking a non-adjacent subset from them would require changing the axis type, which reduce does not support yet (see discussion in Add pick command for reduce #275 about a futurediscontinuousaxis / type-changing reduce).Testing
algorithm_reduce_test.cpp: pick with/without overflow bin, reordering, 2d correlation preservation, static and dynamic histograms (throughaxis::variant), the iterable overload, and all error paths (empty, duplicate, out-of-range indices, non-pickable axis, fusion conflicts). New code paths are fully exercised for the coverage gate.is_pickabletrue/false cases inaxis_traits_test.cpp.guide_histogram_reduction.cpp.🤖 Generated with Claude Code