25 SortKey(std::string n, std::function<
double(
const std::any&)> e)
27 , extractor(
std::move(e))
39template <ComputeData T>
65template <ComputeData T>
71 static_assert(std::is_same_v<T, void>,
72 "Region-like types require container parameter - use UniversalSorter instead");
76 std::vector<std::vector<double>> working_buffer;
78 const_cast<T&
>(data), working_buffer);
82 return OperationHelper::reconstruct_from_double<T>(working_buffer, structure_info);
98 std::vector<std::vector<double>> working_buffer;
100 const_cast<Datum<T>&
>(data), working_buffer);
104 return OperationHelper::reconstruct_from_double<T>(working_buffer, structure_info);
114template <ComputeData T>
127template <ComputeData T>
154 return [keys](
const T&
a,
const T&
b) ->
bool {
155 for (
const auto& key : keys) {
157 double val_a = key.extractor(std::any(
a));
158 double val_b = key.extractor(std::any(
b));
161 val_a = std::tanh(val_a);
162 val_b = std::tanh(val_b);
165 double weighted_diff = key.weight * (val_a - val_b);
166 if (std::abs(weighted_diff) > 1e-9) {
167 return key.direction == SortingDirection::ASCENDING ? weighted_diff < 0 : weighted_diff > 0;
184 if constexpr (
requires { item.start_coordinates; }) {
185 return !item.start_coordinates.empty() ?
static_cast<double>(item.start_coordinates[0]) : 0.0;
186 }
else if constexpr (
requires { item.timestamp; }) {
187 return static_cast<double>(item.timestamp);
188 }
else if constexpr (
requires { item.time; }) {
189 return static_cast<double>(item.time);
191 static_assert(std::is_same_v<T, void>,
"Type does not have temporal information");
207 SortKey key(name, [](
const std::any& data) ->
double {
208 auto cast_result = safe_any_cast<T>(data);
213 const T& value = *cast_result.value;
215 if constexpr (ArithmeticData<T>) {
216 return static_cast<double>(value);
217 }
else if constexpr (ComplexData<T>) {
218 return std::abs(value);
Discrete sequence sorting primitives for MayaFlux::Kinesis.
static auto setup_operation_buffer(T &input, std::vector< std::vector< double > > &working_buffer)
Setup operation buffer from Datum 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 ...
@ ComputeMatrix
Compute operations (Yantra - algorithms, matrices, DSP)
@ Yantra
DSP algorithms, computational units, matrix operations, Grammar.
std::vector< size_t > span_sort_indices(std::span< double > data, SortingDirection direction)
Indices that would sort a span in the given direction.
void sort_channels(std::vector< std::span< double > > &channels, SortingDirection direction, SortingAlgorithm algorithm)
Sort all channels in-place.
std::vector< std::vector< size_t > > channels_sort_indices(const std::vector< std::span< double > > &channels, SortingDirection direction)
Per-channel sort indices.
SortingAlgorithm
Available sorting algorithm backends.
SortingDirection
Ascending or descending sort order.
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 Datum< T > &data, SortingDirection direction)
Generate sort indices for any ComputeData type.
double get_temporal_position(const T &item)
Helper function to get temporal position from various types Used by TemporalSortable concept.
SortKey create_universal_sort_key(const std::string &name, SortingDirection direction=SortingDirection::ASCENDING)
Create universal sort key extractor for common data types.
void sort_compute_data_inplace(Datum< T > &data, SortingDirection direction, SortingAlgorithm algorithm)
Universal sort function - handles extraction/conversion internally.
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 normalize(std::vector< double > &data, double target_peak)
Normalize single-channel data to specified peak level (in-place)
T data
The actual computation data.
bool has_container() const
Check if a container reference is associated.
bool needs_processig() const
Check if processing is needed (for container types)
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.
std::function< double(const std::any &)> extractor
Extract sort value from data.
SortingDirection direction
SortKey(std::string n, std::function< double(const std::any &)> e)
Multi-dimensional sort key specification for complex sorting.