79 double stat_variance {};
80 double stat_std_dev {};
88 std::array<int, 6> level_counts {};
100 uint32_t window_size {};
101 uint32_t hop_size {};
127template <ComputeData InputType = std::vector<Kakshya::DataVariant>, ComputeData OutputType = Eigen::VectorXd>
154 return safe_any_cast_or_throw<StatisticalAnalysis>(result);
186 return Reflect::get_enum_names_lowercase<StatisticalMethod>();
194 template <
typename T>
205 template <
typename T>
208 return !get_methods_for_type<T>().empty();
324 if (str ==
"default")
326 return Reflect::string_to_enum_or_throw_case_insensitive<StatisticalMethod>(str,
"StatisticalMethod");
346 return "StatisticalAnalyzer";
356 if constexpr (
requires {
input.data.empty(); }) {
357 if (
input.data.empty()) {
360 }
else if constexpr (std::is_same_v<InputType, Kakshya::RegionGroup>) {
361 if (
input.data.regions.empty()) {
369 std::vector<std::span<const double>> channel_spans;
370 for (
const auto& span : data_span)
371 channel_spans.emplace_back(span.data(), span.size());
373 std::vector<std::vector<double>> stat_values;
374 stat_values.reserve(channel_spans.size());
375 for (
const auto& ch_span : channel_spans) {
380 stat_values, channel_spans, structure_info);
384 }
catch (
const std::exception& e) {
388 error_result.
metadata[
"error"] = std::string(
"Analysis failed: ") + e.what();
399 if (name ==
"method") {
401 auto method_str = safe_any_cast_or_throw<std::string>(value);
403 }
catch (
const std::runtime_error&) {
404 auto method_enum = safe_any_cast_or_throw<StatisticalMethod>(value);
407 }
else if (name ==
"window_size") {
408 auto size = safe_any_cast_or_throw<uint32_t>(value);
411 }
else if (name ==
"hop_size") {
412 auto size = safe_any_cast_or_throw<uint32_t>(value);
415 }
else if (name ==
"classification_enabled") {
416 auto enabled = safe_any_cast_or_throw<bool>(value);
418 }
else if (name ==
"percentile") {
419 auto percentile = safe_any_cast_or_throw<double>(value);
420 if (percentile < 0.0 || percentile > 100.0) {
424 }
else if (name ==
"sample_variance") {
425 auto sample = safe_any_cast_or_throw<bool>(value);
430 }
catch (
const std::runtime_error& e) {
440 if (name ==
"method")
442 if (name ==
"window_size")
444 if (name ==
"hop_size")
446 if (name ==
"classification_enabled")
448 if (name ==
"percentile")
450 if (name ==
"sample_variance")
558 std::vector<std::span<const double>> original_data,
const auto& )
const
567 if (stat_values.empty()) {
573 for (
size_t ch = 0; ch < stat_values.size(); ++ch) {
575 const auto& ch_stats = stat_values[ch];
577 channel_result.statistical_values = ch_stats;
579 if (ch_stats.empty())
582 const auto [min_it, max_it] = std::ranges::minmax_element(ch_stats);
583 channel_result.min_stat = *min_it;
584 channel_result.max_stat = *max_it;
586 const std::span<const double> sp(ch_stats);
587 const auto sz =
static_cast<uint32_t
>(ch_stats.size());
589 const auto single = [&](
auto fn) {
return fn(sp, 1, 0, sz)[0]; };
591 channel_result.mean_stat = single([](
auto&&...
a) {
return D::mean(
a...); });
593 channel_result.stat_std_dev = std::sqrt(channel_result.stat_variance);
594 channel_result.skewness = single([](
auto&&...
a) {
return D::skewness(
a...); });
595 channel_result.kurtosis = single([](
auto&&...
a) {
return D::kurtosis(
a...); });
596 channel_result.median = single([](
auto&&...
a) {
return D::median(
a...); });
598 channel_result.percentiles = {
600 channel_result.median,
604 const size_t data_size = (ch < original_data.size()) ? original_data[ch].size() : 0;
605 channel_result.window_positions.reserve(ch_stats.size());
606 for (
size_t i = 0; i < ch_stats.size(); ++i) {
608 const size_t end = std::min(start +
m_window_size, data_size);
609 channel_result.window_positions.emplace_back(start, end);
613 channel_result.stat_classifications.reserve(ch_stats.size());
614 channel_result.level_counts.fill(0);
616 for (
double value : ch_stats) {
618 channel_result.stat_classifications.push_back(level);
619 channel_result.level_counts[
static_cast<size_t>(level)]++;
632 std::vector<std::vector<double>> channel_stats;
635 channel_stats.push_back(ch.statistical_values);
642 output.
metadata[
"source_analyzer"] =
"StatisticalAnalyzer";
649 std::vector<double> channel_means, channel_maxs, channel_mins, channel_variances, channel_stddevs, channel_skewness, channel_kurtosis, channel_medians;
650 std::vector<size_t> channel_window_counts;
653 channel_means.push_back(ch.mean_stat);
654 channel_maxs.push_back(ch.max_stat);
655 channel_mins.push_back(ch.min_stat);
656 channel_variances.push_back(ch.stat_variance);
657 channel_stddevs.push_back(ch.stat_std_dev);
658 channel_skewness.push_back(ch.skewness);
659 channel_kurtosis.push_back(ch.kurtosis);
660 channel_medians.push_back(ch.median);
661 channel_window_counts.push_back(ch.statistical_values.size());
664 output.
metadata[
"mean_per_channel"] = channel_means;
665 output.
metadata[
"max_per_channel"] = channel_maxs;
666 output.
metadata[
"min_per_channel"] = channel_mins;
667 output.
metadata[
"variance_per_channel"] = channel_variances;
668 output.
metadata[
"stddev_per_channel"] = channel_stddevs;
669 output.
metadata[
"skewness_per_channel"] = channel_skewness;
670 output.
metadata[
"kurtosis_per_channel"] = channel_kurtosis;
671 output.
metadata[
"median_per_channel"] = channel_medians;
672 output.
metadata[
"window_count_per_channel"] = channel_window_counts;
689template <ComputeData InputType = std::vector<Kakshya::DataVariant>>
693template <ComputeData InputType = std::vector<Kakshya::DataVariant>>
727 const std::string
q = qualifier.empty() ?
"mean_stat" : qualifier;
729 if (
q ==
"mean_stat")
736 return ch.stat_variance;
738 return ch.stat_std_dev;
745 if (
q ==
"window_count")
746 return static_cast<double>(ch.statistical_values.size());
Discrete sequence analysis primitives for MayaFlux::Kinesis.
#define MF_ERROR(comp, ctx,...)
Core::GlobalInputConfig input
Modern, digital-first universal analyzer framework for Maya Flux.
output_type convert_result(std::vector< std::vector< double > > &result_data, DataStructureInfo &metadata)
Convert processed double data back to OutputType using metadata and optional callback.
static std::tuple< std::vector< std::span< double > >, DataStructureInfo > extract_structured_double(T &compute_data)
Extract structured double data from Datum container or direct ComputeData with automatic container ha...
std::any get_analysis_parameter(const std::string &name) const override
Get analysis-specific parameter.
void set_classification_enabled(bool enabled)
Enable/disable outlier classification.
bool is_classification_enabled() const
Check if classification is enabled.
StatisticalMethod get_method() const
Get current statistical method.
double m_percentile_value
double m_outlier_threshold
StatisticalAnalysis get_statistical_analysis() const
Get last statistical analysis result (type-safe)
void validate_window_parameters() const
Validate window parameters.
std::vector< std::string > get_methods_for_type_impl(std::type_index) const
Get supported methods for specific type index.
std::string get_analyzer_name() const override
Get analyzer name.
static StatisticalMethod string_to_method(const std::string &str)
Convert string to statistical method enum.
bool supports_input_type() const
Check if analyzer supports given input type.
std::vector< std::string > get_methods_for_type() const
Get supported methods for specific input type.
StatisticalMethod m_method
StatisticalAnalysis create_analysis_result(const std::vector< std::vector< double > > &stat_values, std::vector< std::span< const double > > original_data, const auto &) const
Create comprehensive analysis result.
std::vector< std::string > get_available_methods() const override
Get available analysis methods.
StatisticalAnalyzer(uint32_t window_size=512, uint32_t hop_size=256)
Construct StatisticalAnalyzer with configurable window parameters.
StatisticalLevel classify_statistical_level(double value) const
Classify statistical value qualitatively.
double m_extreme_low_threshold
static std::string method_to_string(StatisticalMethod method)
Convert statistical method enum to string.
std::vector< double > compute_statistical_values(std::span< const double > data, StatisticalMethod method) const
Compute statistical values using span (zero-copy processing)
static std::string statistical_level_to_string(StatisticalLevel level)
Convert statistical level enum to string.
AnalysisType get_analysis_type() const override
Get analysis type category.
uint32_t get_window_size() const
Get window size.
double m_extreme_high_threshold
void set_window_size(uint32_t size)
Set window size for windowed analysis.
void set_method(StatisticalMethod method)
Set statistical analysis method.
output_type create_pipeline_output(const input_type &input, const StatisticalAnalysis &analysis_result, DataStructureInfo &info)
Create pipeline output for operation chaining.
uint32_t get_hop_size() const
Get hop size.
output_type analyze_implementation(const input_type &input) override
Core analysis implementation - creates analysis result AND pipeline output.
size_t calculate_num_windows(size_t data_size) const
Calculate number of windows for given data size.
void set_method(const std::string &method_name)
Set method by string name.
void set_analysis_parameter(const std::string &name, std::any value) override
Handle analysis-specific parameters.
StatisticalAnalysis analyze_statistics(const InputType &data)
StatisticalAnalysis analyze_statistics(const input_type &data)
Type-safe statistical analysis method.
bool m_classification_enabled
void set_hop_size(uint32_t size)
Set hop size for windowed analysis.
High-performance statistical analyzer with zero-copy processing.
virtual void set_analysis_parameter(const std::string &name, std::any value)
Analysis-specific parameter handling (override for custom parameters)
std::any get_current_analysis() const
Access cached analysis from last operation.
void set_parameter(const std::string &name, std::any value) override
Type-safe parameter management with analysis-specific defaults.
std::any analyze_data(const input_type &data)
User-facing analysis method - returns analysis results directly.
virtual std::any get_analysis_parameter(const std::string &name) const
void store_current_analysis(AnalysisResultType &&result) const
Template-flexible analyzer base with instance-defined I/O types.
@ ComputeMatrix
Compute operations (Yantra - algorithms, matrices, DSP)
@ Yantra
DSP algorithms, computational units, matrix operations, Grammar.
std::vector< double > sum(std::span< const double > data, size_t n_windows, uint32_t hop_size, uint32_t window_size)
Sum per window.
std::vector< double > coefficient_of_variation(std::span< const double > data, size_t n_windows, uint32_t hop_size, uint32_t window_size, bool sample_variance)
Coefficient of variation (std_dev / mean) per window.
std::vector< double > max(std::span< const double > data, size_t n_windows, uint32_t hop_size, uint32_t window_size)
Maximum value per window.
std::vector< double > std_dev(std::span< const double > data, size_t n_windows, uint32_t hop_size, uint32_t window_size, bool sample_variance)
Standard deviation per window.
std::vector< double > entropy(std::span< const double > data, size_t n_windows, uint32_t hop_size, uint32_t window_size, size_t num_bins)
Shannon entropy per window using Sturges-rule histogram.
std::vector< double > range(std::span< const double > data, size_t n_windows, uint32_t hop_size, uint32_t window_size)
Value range (max - min) per window.
std::vector< double > percentile(std::span< const double > data, size_t n_windows, uint32_t hop_size, uint32_t window_size, double percentile_value)
Arbitrary percentile per window via linear interpolation.
std::vector< double > mode(std::span< const double > data, size_t n_windows, uint32_t hop_size, uint32_t window_size)
Mode per window via tolerance-bucketed frequency count.
std::vector< double > variance(std::span< const double > data, size_t n_windows, uint32_t hop_size, uint32_t window_size, bool sample_variance)
Variance per window.
std::vector< double > mad(std::span< const double > data, size_t n_windows, uint32_t hop_size, uint32_t window_size)
Median absolute deviation per window.
std::vector< double > count(std::span< const double > data, size_t n_windows, uint32_t hop_size, uint32_t window_size)
Sample count per window (as double for pipeline uniformity)
std::vector< double > skewness(std::span< const double > data, size_t n_windows, uint32_t hop_size, uint32_t window_size)
Skewness (standardised third central moment) per window.
std::vector< double > rms(std::span< const double > data, size_t n_windows, uint32_t hop_size, uint32_t window_size)
RMS energy per window.
std::vector< double > kurtosis(std::span< const double > data, size_t n_windows, uint32_t hop_size, uint32_t window_size)
Excess kurtosis (fourth central moment - 3) per window.
std::vector< double > min(std::span< const double > data, size_t n_windows, uint32_t hop_size, uint32_t window_size)
Minimum value per window.
std::vector< double > median(std::span< const double > data, size_t n_windows, uint32_t hop_size, uint32_t window_size)
Median per window via nth_element partial sort.
std::vector< double > mean_zscore(std::span< const double > data, size_t n_windows, uint32_t hop_size, uint32_t window_size, bool sample_variance)
Mean z-score per window.
std::vector< double > mean(std::span< const double > data, size_t n_windows, uint32_t hop_size, uint32_t window_size)
Arithmetic mean per window.
std::string enum_to_lowercase_string(EnumType value) noexcept
Universal enum to lowercase string converter using magic_enum.
AnalysisType
Categories of analysis operations for discovery and organization.
@ STATISTICAL
Mean, variance, distribution analysis.
@ RMS
Root Mean Square energy.
StatisticalLevel
Qualitative classification of statistical values.
StatisticalMethod
Supported statistical computation methods.
@ PERCENTILE
Arbitrary percentile (requires parameter)
@ KURTOSIS
Fourth moment - tail heaviness.
@ ZSCORE
Z-score normalization.
@ ENTROPY
Shannon entropy for discrete data.
@ MAD
Median Absolute Deviation.
@ CV
Coefficient of Variation (std_dev/mean)
@ STD_DEV
Standard deviation.
@ MODE
Most frequent value.
@ VARIANCE
Population or sample variance.
@ SKEWNESS
Third moment - asymmetry measure.
MAYAFLUX_API double extract_scalar_statistics(const StatisticalAnalysis &analysis, const std::string &qualifier)
Extract a named scalar from a StatisticalAnalysis result.
std::map< std::string, std::any > method_specific_data
std::vector< std::pair< size_t, size_t > > window_positions
std::vector< StatisticalLevel > stat_classifications
std::vector< double > percentiles
std::vector< double > statistical_values
Statistical results for a single data channel.
Metadata about data structure for reconstruction.
std::unordered_map< std::string, std::any > metadata
Associated metadata.
Input/Output container for computation pipeline data flow with structure preservation.
StatisticalMethod method_used
std::vector< ChannelStatistics > channel_statistics
Analysis result structure for statistical analysis.