67 std::vector<double>& output_storage,
90 const std::vector<std::span<const double>>& channels,
91 std::vector<std::vector<double>>& output_storage,
111 const std::vector<std::span<double>>& channels,
127template <std::random_access_iterator Iterator,
typename Comparator>
133 std::ranges::sort(begin, end, comp);
137 std::ranges::stable_sort(begin, end, comp);
141 if (std::distance(begin, end) > 1) {
142 auto middle = begin + std::distance(begin, end) / 2;
143 std::partial_sort(begin, middle, end, comp);
149 if (std::distance(begin, end) > 1) {
150 auto middle = begin + std::distance(begin, end) / 2;
151 std::nth_element(begin, middle, end, comp);
157 std::make_heap(begin, end, comp);
158 std::sort_heap(begin, end, comp);
163 MayaFlux::Parallel::sort(MayaFlux::Parallel::par_unseq, begin, end, comp);
176 std::ranges::sort(begin, end, comp);
192 return [direction](
double a,
double b) ->
bool {
203template <ComplexData T>
206 return [direction](
const T& a,
const T& b) ->
bool {
207 auto mag_a = std::abs(a);
208 auto mag_b = std::abs(b);
221template <
typename Container,
typename Comparator>
224 std::vector<size_t> indices(container.size());
225 std::iota(indices.begin(), indices.end(), 0);
227 std::ranges::sort(indices, [&](
size_t a,
size_t b) {
228 return comp(container[a], container[b]);
245template <ComputeData T>
252 throw std::runtime_error(
"Region-like types require container use UniversalSorter instead");
271template <ComputeData T>
277 static_assert(std::is_same_v<T, void>,
278 "Region-like types require container parameter - use UniversalSorter instead");
282 std::vector<std::vector<double>> working_buffer;
284 const_cast<T&
>(data), working_buffer);
288 return OperationHelper::reconstruct_from_double<T>(working_buffer, structure_info);
304 std::vector<std::vector<double>> working_buffer;
306 const_cast<IO<T>&
>(data), working_buffer);
310 return OperationHelper::reconstruct_from_double<T>(working_buffer, structure_info);
320template <ComputeData T>
333template <ComputeData T>
360 return [keys](
const T& a,
const T& b) ->
bool {
361 for (
const auto& key : keys) {
363 double val_a = key.extractor(std::any(a));
364 double val_b = key.extractor(std::any(b));
367 val_a = std::tanh(val_a);
368 val_b = std::tanh(val_b);
371 double weighted_diff = key.weight * (val_a - val_b);
372 if (std::abs(weighted_diff) > 1e-9) {
390 if constexpr (
requires { item.start_coordinates; }) {
391 return !item.start_coordinates.empty() ?
static_cast<double>(item.start_coordinates[0]) : 0.0;
392 }
else if constexpr (
requires { item.timestamp; }) {
393 return static_cast<double>(item.timestamp);
394 }
else if constexpr (
requires { item.time; }) {
395 return static_cast<double>(item.time);
397 static_assert(std::is_same_v<T, void>,
"Type does not have temporal information");
413 SortKey key(name, [](
const std::any& data) ->
double {
414 auto cast_result = safe_any_cast<T>(data);
419 const T& value = *cast_result.value;
421 if constexpr (ArithmeticData<T>) {
422 return static_cast<double>(value);
423 }
else if constexpr (ComplexData<T>) {
424 return std::abs(value);
Modern, digital-first universal sorting framework for Maya Flux.
static auto setup_operation_buffer(T &input, std::vector< std::vector< double > > &working_buffer)
Setup operation buffer from IO or ComputeData type.
static std::span< double > extract_numeric_data(const T &compute_data)
extract numeric data from single-variant types
A SingleVariant is either a single DataVariant, an Eigen vector type, or any type constructible from ...
void execute_sorting_algorithm(Iterator begin, Iterator end, Comparator comp, SortingAlgorithm algorithm)
Execute sorting algorithm on iterator range.
std::vector< size_t > generate_span_sort_indices(std::span< double > data, SortingDirection direction)
Generate sort indices for a single span.
void sort_channels_inplace(std::vector< std::span< double > > &channels, SortingDirection direction, SortingAlgorithm algorithm)
Sort multiple channels (spans) in-place.
std::vector< std::vector< size_t > > generate_channels_sort_indices(const std::vector< std::span< double > > &channels, SortingDirection direction)
Generate sort indices for multiple channels.
T sort_compute_data(const T &data, SortingDirection direction=SortingDirection::ASCENDING)
Convenience function with default algorithm.
std::vector< std::vector< size_t > > generate_compute_data_indices(const IO< T > &data, SortingDirection direction)
Generate sort indices for any ComputeData type.
std::vector< size_t > generate_sort_indices(const Container &container, Comparator comp)
Generate sort indices for any container with custom comparator.
void sort_span_inplace(std::span< double > data, SortingDirection direction, SortingAlgorithm algorithm)
Sort a single span of doubles in-place.
double get_temporal_position(const T &item)
Helper function to get temporal position from various types Used by TemporalSortable concept.
auto create_double_comparator(SortingDirection direction)
Create standard direction-based comparator for doubles.
SortKey create_universal_sort_key(const std::string &name, SortingDirection direction=SortingDirection::ASCENDING)
Create universal sort key extractor for common data types.
auto create_complex_magnitude_comparator(SortingDirection direction)
Create magnitude-based comparator for complex numbers.
SortingDirection
Basic sort direction for simple comparisons.
@ ASCENDING
Smallest to largest.
SortingAlgorithm
Available sorting algorithms for different use cases.
@ QUICK_OPTIMIZED
Optimized quicksort with hybrid pivot selection.
@ STABLE
std::stable_sort for equal element preservation
@ GPU_ACCELERATED
GPU-based sorting (future Vulkan integration)
@ EIGEN_OPTIMIZED
Eigen-specific mathematical sorting.
@ RADIX
Radix sort for integer types.
@ STANDARD
std::sort with comparator
@ COUNTING
Counting sort for limited range integers.
@ LAZY_STREAMING
Lazy evaluation with coroutines (Vruta/Kriya)
@ HEAP
Heap sort for memory-constrained scenarios.
@ MERGE_EXTERNAL
External merge sort for large datasets.
@ NTH_ELEMENT
std::nth_element for median/percentile
@ PREDICTIVE_ML
Machine learning based predictive sorting.
@ PARALLEL
Parallel sorting (std::execution::par_unseq)
@ BUCKET
Bucket sort for floating point.
@ PARTIAL
std::partial_sort for top-K selection
@ PARALLEL
Parallel with other operations.
std::vector< std::span< double > > sort_channels_extract(const std::vector< std::span< const double > > &channels, std::vector< std::vector< double > > &output_storage, SortingDirection direction, SortingAlgorithm algorithm)
Sort multiple channels and return copies.
std::span< double > sort_span_extract(std::span< const double > data, std::vector< double > &output_storage, SortingDirection direction, SortingAlgorithm algorithm)
Sort a single span and return copy in output vector.
T sort_compute_data_extract(const T &data, SortingDirection direction, SortingAlgorithm algorithm)
Universal sort function - returns sorted copy.
auto create_multi_key_comparator(const std::vector< SortKey > &keys)
Creates a multi-key comparator for complex sorting.
void sort_compute_data_inplace(IO< T > &data, SortingDirection direction, SortingAlgorithm algorithm)
Universal sort function - handles extraction/conversion internally.
bool has_container() const
Check if a container reference is associated.
bool needs_processig() const
Check if processing is needed (for container types)
T data
The actual computation data.
std::optional< std::shared_ptr< Kakshya::SignalSourceContainer > > container
Optional reference to container, required for regions.
Input/Output container for computation pipeline data flow with structure preservation.
SortingDirection direction
Multi-dimensional sort key specification for complex sorting.