MayaFlux 0.4.0
Digital-First Multimedia Processing Framework
Loading...
Searching...
No Matches
StatisticalAnalyzer.hpp
Go to the documentation of this file.
1#pragma once
2
4
6
8#include <Eigen/Dense>
9
10/**
11 * @file StatisticalAnalyzer_new.hpp
12 * @brief Span-based statistical analysis for digital signals in Maya Flux
13 *
14 * Defines the StatisticalAnalyzer using the new UniversalAnalyzer framework with
15 * zero-copy span processing and automatic structure handling via OperationHelper.
16 * This analyzer extracts statistical features from digital data streams with multiple
17 * computation methods and flexible output configurations.
18 *
19 * Key Features:
20 * - **Zero-copy processing:** Uses spans for maximum efficiency
21 * - **Template-flexible I/O:** Instance defines input/output types at construction
22 * - **Multiple statistical methods:** Mean, variance, std dev, skewness, kurtosis, percentiles, etc.
23 * - **Parallel processing:** Utilizes std::execution for performance
24 * - **Cross-modal support:** Works on any numeric data stream - truly digital-first
25 * - **Statistical classification:** Maps values to qualitative levels (outliers, normal, etc.)
26 * - **Automatic data handling:** OperationHelper manages all extraction/conversion
27 */
28
29namespace MayaFlux::Yantra {
30
31/**
32 * @enum StatisticalMethod
33 * @brief Supported statistical computation methods
34 */
35enum class StatisticalMethod : uint8_t {
36 MEAN, ///< Arithmetic mean
37 VARIANCE, ///< Population or sample variance
38 STD_DEV, ///< Standard deviation
39 SKEWNESS, ///< Third moment - asymmetry measure
40 KURTOSIS, ///< Fourth moment - tail heaviness
41 MIN, ///< Minimum value
42 MAX, ///< Maximum value
43 MEDIAN, ///< 50th percentile
44 RANGE, ///< Max - min
45 PERCENTILE, ///< Arbitrary percentile (requires parameter)
46 MODE, ///< Most frequent value
47 MAD, ///< Median Absolute Deviation
48 CV, ///< Coefficient of Variation (std_dev/mean)
49 SUM, ///< Sum of all values
50 COUNT, ///< Number of values
51 RMS, ///< Root Mean Square
52 ENTROPY, ///< Shannon entropy for discrete data
53 ZSCORE ///< Z-score normalization
54};
55
56/**
57 * @enum StatisticalLevel
58 * @brief Qualitative classification of statistical values
59 */
60enum class StatisticalLevel : uint8_t {
62 LOW,
63 NORMAL,
64 HIGH,
67};
68
69/**
70 * @struct ChannelStatistics
71 * @brief Statistical results for a single data channel
72 */
73struct MAYAFLUX_API ChannelStatistics {
74 std::vector<double> statistical_values;
75
76 double mean_stat {};
77 double max_stat {};
78 double min_stat {};
79 double stat_variance {};
80 double stat_std_dev {};
81
82 double skewness {};
83 double kurtosis {};
84 double median {};
85 std::vector<double> percentiles;
86
87 std::vector<StatisticalLevel> stat_classifications;
88 std::array<int, 6> level_counts {};
89
90 std::vector<std::pair<size_t, size_t>> window_positions;
91 std::map<std::string, std::any> method_specific_data;
92};
93
94/**
95 * @struct StatisticalAnalysis
96 * @brief Analysis result structure for statistical analysis
97 */
98struct MAYAFLUX_API StatisticalAnalysis {
99 StatisticalMethod method_used { StatisticalMethod::MEAN };
100 uint32_t window_size {};
101 uint32_t hop_size {};
102
103 std::vector<ChannelStatistics> channel_statistics;
104};
105
106/**
107 * @class StatisticalAnalyzer
108 * @brief High-performance statistical analyzer with zero-copy processing
109 *
110 * The StatisticalAnalyzer provides comprehensive statistical analysis capabilities for
111 * digital data streams using span-based processing for maximum efficiency.
112 * All data extraction and conversion is handled automatically by OperationHelper.
113 *
114 * Example usage:
115 * ```cpp
116 * // DataVariant -> VectorXd analyzer
117 * auto stat_analyzer = std::make_shared<StatisticalAnalyzer<Kakshya::DataVariant, Eigen::VectorXd>>();
118 *
119 * // User-facing analysis
120 * auto analysis = stat_analyzer->analyze_data(numeric_data);
121 * auto stat_result = safe_any_cast<StatisticalAnalysisResult>(analysis);
122 *
123 * // Pipeline usage
124 * auto pipeline_output = stat_analyzer->apply_operation(IO{numeric_data});
125 * ```
126 */
127template <ComputeData InputType = std::vector<Kakshya::DataVariant>, ComputeData OutputType = Eigen::VectorXd>
128class StatisticalAnalyzer : public UniversalAnalyzer<InputType, OutputType> {
129public:
133
134 /**
135 * @brief Construct StatisticalAnalyzer with configurable window parameters
136 * @param window_size Size of analysis window in samples (default: 512)
137 * @param hop_size Step size between windows in samples (default: 256)
138 */
139 explicit StatisticalAnalyzer(uint32_t window_size = 512, uint32_t hop_size = 256)
140 : m_window_size(window_size)
141 , m_hop_size(hop_size)
142 {
144 }
145
146 /**
147 * @brief Type-safe statistical analysis method
148 * @param data Input data
149 * @return StatisticalAnalysisResult directly
150 */
152 {
153 auto result = this->analyze_data(data);
154 return safe_any_cast_or_throw<StatisticalAnalysis>(result);
155 }
156
158 {
159 return this->analyze_statistics(input_type { data });
160 }
161
162 /**
163 * @brief Get last statistical analysis result (type-safe)
164 * @return StatisticalAnalysisResult from last operation
165 */
167 {
168 return safe_any_cast_or_throw<StatisticalAnalysis>(this->get_current_analysis());
169 }
170
171 /**
172 * @brief Get analysis type category
173 * @return AnalysisType::STATISTICAL
174 */
175 [[nodiscard]] AnalysisType get_analysis_type() const override
176 {
178 }
179
180 /**
181 * @brief Get available analysis methods
182 * @return Vector of supported statistical method names
183 */
184 [[nodiscard]] std::vector<std::string> get_available_methods() const override
185 {
186 return Reflect::get_enum_names_lowercase<StatisticalMethod>();
187 }
188
189 /**
190 * @brief Get supported methods for specific input type
191 * @tparam T Input type to check
192 * @return Vector of method names supported for this type
193 */
194 template <typename T>
195 [[nodiscard]] std::vector<std::string> get_methods_for_type() const
196 {
197 return get_methods_for_type_impl(std::type_index(typeid(T)));
198 }
199
200 /**
201 * @brief Check if analyzer supports given input type
202 * @tparam T Input type to check
203 * @return True if supported
204 */
205 template <typename T>
206 [[nodiscard]] bool supports_input_type() const
207 {
208 return !get_methods_for_type<T>().empty();
209 }
210
211 /**
212 * @brief Set statistical analysis method
213 * @param method StatisticalMethod enum value
214 */
216 {
217 m_method = method;
218 this->set_parameter("method", method_to_string(method));
219 }
220
221 /**
222 * @brief Set method by string name
223 * @param method_name String representation of method
224 */
225 void set_method(const std::string& method_name)
226 {
227 m_method = string_to_method(method_name);
228 this->set_parameter("method", method_name);
229 }
230
231 /**
232 * @brief Get current statistical method
233 * @return StatisticalMethod enum value
234 */
235 [[nodiscard]] StatisticalMethod get_method() const
236 {
237 return m_method;
238 }
239
240 /**
241 * @brief Set window size for windowed analysis
242 * @param size Window size in samples
243 */
244 void set_window_size(uint32_t size)
245 {
246 m_window_size = size;
248 }
249
250 /**
251 * @brief Set hop size for windowed analysis
252 * @param size Hop size in samples
253 */
254 void set_hop_size(uint32_t size)
255 {
256 m_hop_size = size;
258 }
259
260 /**
261 * @brief Get window size
262 * @return Current window size
263 */
264 [[nodiscard]] uint32_t get_window_size() const { return m_window_size; }
265
266 /**
267 * @brief Get hop size
268 * @return Current hop size
269 */
270 [[nodiscard]] uint32_t get_hop_size() const { return m_hop_size; }
271
272 /**
273 * @brief Enable/disable outlier classification
274 * @param enabled Whether to classify outliers
275 */
276 void set_classification_enabled(bool enabled)
277 {
278 m_classification_enabled = enabled;
279 }
280
281 /**
282 * @brief Check if classification is enabled
283 * @return True if classification enabled
284 */
285 [[nodiscard]] bool is_classification_enabled() const { return m_classification_enabled; }
286
287 /**
288 * @brief Classify statistical value qualitatively
289 * @param value Statistical value to classify
290 * @return StatisticalLevel classification
291 */
292 [[nodiscard]] StatisticalLevel classify_statistical_level(double value) const
293 {
294 if (std::abs(value) > m_outlier_threshold)
296 if (value <= m_extreme_low_threshold)
298 if (value <= m_low_threshold)
300 if (value <= m_high_threshold)
302 if (value <= m_extreme_high_threshold)
305 }
306
307 /**
308 * @brief Convert statistical method enum to string
309 * @param method StatisticalMethod value
310 * @return String representation
311 */
312 static std::string method_to_string(StatisticalMethod method)
313 {
315 }
316
317 /**
318 * @brief Convert string to statistical method enum
319 * @param str String representation
320 * @return StatisticalMethod value
321 */
322 static StatisticalMethod string_to_method(const std::string& str)
323 {
324 if (str == "default")
326 return Reflect::string_to_enum_or_throw_case_insensitive<StatisticalMethod>(str, "StatisticalMethod");
327 }
328
329 /**
330 * @brief Convert statistical level enum to string
331 * @param level StatisticalLevel value
332 * @return String representation
333 */
335 {
337 }
338
339protected:
340 /**
341 * @brief Get analyzer name
342 * @return "StatisticalAnalyzer"
343 */
344 [[nodiscard]] std::string get_analyzer_name() const override
345 {
346 return "StatisticalAnalyzer";
347 }
348
349 /**
350 * @brief Core analysis implementation - creates analysis result AND pipeline output
351 * @param input Input data wrapped in Datum container
352 * @return Pipeline output (data flow for chaining operations)
353 */
355 {
356 if constexpr (requires { input.data.empty(); }) {
357 if (input.data.empty()) {
358 error<std::runtime_error>(Journal::Component::Yantra, Journal::Context::ComputeMatrix, std::source_location::current(), "Input is empty");
359 }
360 } else if constexpr (std::is_same_v<InputType, Kakshya::RegionGroup>) {
361 if (input.data.regions.empty()) {
362 error<std::runtime_error>(Journal::Component::Yantra, Journal::Context::ComputeMatrix, std::source_location::current(), "Input is empty");
363 }
364 }
365 try {
366 auto [data_span, structure_info] = OperationHelper::extract_structured_double(
367 const_cast<input_type&>(input));
368
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());
372
373 std::vector<std::vector<double>> stat_values;
374 stat_values.reserve(channel_spans.size());
375 for (const auto& ch_span : channel_spans) {
376 stat_values.push_back(compute_statistical_values(ch_span, m_method));
377 }
378
380 stat_values, channel_spans, structure_info);
381
382 this->store_current_analysis(analysis_result);
383 return create_pipeline_output(input, analysis_result, structure_info);
384 } catch (const std::exception& e) {
385 MF_ERROR(Journal::Component::Yantra, Journal::Context::ComputeMatrix, "Statistical analysis failed: {}", e.what());
386 output_type error_result;
387 error_result.metadata = input.metadata;
388 error_result.metadata["error"] = std::string("Analysis failed: ") + e.what();
389 return error_result;
390 }
391 }
392
393 /**
394 * @brief Handle analysis-specific parameters
395 */
396 void set_analysis_parameter(const std::string& name, std::any value) override
397 {
398 try {
399 if (name == "method") {
400 try {
401 auto method_str = safe_any_cast_or_throw<std::string>(value);
402 m_method = string_to_method(method_str);
403 } catch (const std::runtime_error&) {
404 auto method_enum = safe_any_cast_or_throw<StatisticalMethod>(value);
405 m_method = method_enum;
406 }
407 } else if (name == "window_size") {
408 auto size = safe_any_cast_or_throw<uint32_t>(value);
409 m_window_size = size;
411 } else if (name == "hop_size") {
412 auto size = safe_any_cast_or_throw<uint32_t>(value);
413 m_hop_size = size;
415 } else if (name == "classification_enabled") {
416 auto enabled = safe_any_cast_or_throw<bool>(value);
417 m_classification_enabled = enabled;
418 } else if (name == "percentile") {
419 auto percentile = safe_any_cast_or_throw<double>(value);
420 if (percentile < 0.0 || percentile > 100.0) {
421 error<std::invalid_argument>(Journal::Component::Yantra, Journal::Context::ComputeMatrix, std::source_location::current(), "Percentile must be between 0.0 and 100.0, got: {}", percentile);
422 }
423 m_percentile_value = percentile;
424 } else if (name == "sample_variance") {
425 auto sample = safe_any_cast_or_throw<bool>(value);
426 m_sample_variance = sample;
427 } else {
428 base_type::set_analysis_parameter(name, std::move(value));
429 }
430 } catch (const std::runtime_error& e) {
431 error_rethrow(Journal::Component::Yantra, Journal::Context::ComputeMatrix, std::source_location::current(), "Failed to set parameter '{}': {}", name, e.what());
432 }
433 }
434
435 /**
436 * @brief Get analysis-specific parameter
437 */
438 [[nodiscard]] std::any get_analysis_parameter(const std::string& name) const override
439 {
440 if (name == "method")
441 return std::any(method_to_string(m_method));
442 if (name == "window_size")
443 return std::any(m_window_size);
444 if (name == "hop_size")
445 return std::any(m_hop_size);
446 if (name == "classification_enabled")
447 return std::any(m_classification_enabled);
448 if (name == "percentile")
449 return std::any(m_percentile_value);
450 if (name == "sample_variance")
451 return std::any(m_sample_variance);
452
454 }
455
456 /**
457 * @brief Get supported methods for specific type index
458 * @param type_info Type index to check
459 * @return Vector of supported method names
460 */
461 [[nodiscard]] std::vector<std::string> get_methods_for_type_impl(std::type_index /*type_info*/) const
462 {
463 return get_available_methods();
464 }
465
466private:
469 uint32_t m_hop_size;
471 double m_percentile_value { 50.0 };
472 bool m_sample_variance { true };
473
474 double m_outlier_threshold { 3.0 };
475 double m_extreme_low_threshold { -2.0 };
476 double m_low_threshold { -1.0 };
477 double m_high_threshold { 1.0 };
479
480 /**
481 * @brief Validate window parameters
482 */
484 {
485 if (m_window_size == 0 || m_hop_size == 0) {
486 error<std::invalid_argument>(Journal::Component::Yantra, Journal::Context::ComputeMatrix, std::source_location::current(), "Window size and hop size must be greater than 0");
487 }
489 error<std::invalid_argument>(Journal::Component::Yantra, Journal::Context::ComputeMatrix, std::source_location::current(), "Hop size should not exceed window size");
490 }
491 }
492
493 /**
494 * @brief Compute statistical values using span (zero-copy processing)
495 */
496 [[nodiscard]] std::vector<double> compute_statistical_values(std::span<const double> data, StatisticalMethod method) const
497 {
498 const size_t num_windows = calculate_num_windows(data.size());
499
500 namespace D = MayaFlux::Kinesis::Discrete;
501
502 switch (method) {
504 return D::mean(data, num_windows, m_hop_size, m_window_size);
506 return D::variance(data, num_windows, m_hop_size, m_window_size, m_sample_variance);
508 return D::std_dev(data, num_windows, m_hop_size, m_window_size, m_sample_variance);
510 return D::skewness(data, num_windows, m_hop_size, m_window_size);
512 return D::kurtosis(data, num_windows, m_hop_size, m_window_size);
514 return D::median(data, num_windows, m_hop_size, m_window_size);
516 return D::percentile(data, num_windows, m_hop_size, m_window_size, m_percentile_value);
518 return D::entropy(data, num_windows, m_hop_size, m_window_size);
520 return D::min(data, num_windows, m_hop_size, m_window_size);
522 return D::max(data, num_windows, m_hop_size, m_window_size);
524 return D::range(data, num_windows, m_hop_size, m_window_size);
526 return D::sum(data, num_windows, m_hop_size, m_window_size);
528 return D::count(data, num_windows, m_hop_size, m_window_size);
530 return D::rms(data, num_windows, m_hop_size, m_window_size);
532 return D::mad(data, num_windows, m_hop_size, m_window_size);
536 return D::mode(data, num_windows, m_hop_size, m_window_size);
538 return D::mean_zscore(data, num_windows, m_hop_size, m_window_size, m_sample_variance);
539 default:
540 return D::mean(data, num_windows, m_hop_size, m_window_size);
541 }
542 }
543
544 /**
545 * @brief Calculate number of windows for given data size
546 */
547 [[nodiscard]] size_t calculate_num_windows(size_t data_size) const
548 {
549 if (data_size < m_window_size)
550 return 0;
551 return (data_size - m_window_size) / m_hop_size + 1;
552 }
553
554 /**
555 * @brief Create comprehensive analysis result
556 */
557 StatisticalAnalysis create_analysis_result(const std::vector<std::vector<double>>& stat_values,
558 std::vector<std::span<const double>> original_data, const auto& /*structure_info*/) const
559 {
560 namespace D = MayaFlux::Kinesis::Discrete;
561
562 StatisticalAnalysis result;
563 result.method_used = m_method;
564 result.window_size = m_window_size;
565 result.hop_size = m_hop_size;
566
567 if (stat_values.empty()) {
568 return result;
569 }
570
571 result.channel_statistics.resize(stat_values.size());
572
573 for (size_t ch = 0; ch < stat_values.size(); ++ch) {
574 auto& channel_result = result.channel_statistics[ch];
575 const auto& ch_stats = stat_values[ch];
576
577 channel_result.statistical_values = ch_stats;
578
579 if (ch_stats.empty())
580 continue;
581
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;
585
586 const std::span<const double> sp(ch_stats);
587 const auto sz = static_cast<uint32_t>(ch_stats.size());
588
589 const auto single = [&](auto fn) { return fn(sp, 1, 0, sz)[0]; };
590
591 channel_result.mean_stat = single([](auto&&... a) { return D::mean(a...); });
592 channel_result.stat_variance = single([&](auto&&... a) { return D::variance(a..., m_sample_variance); });
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...); });
597
598 channel_result.percentiles = {
599 D::percentile(sp, 1, 0, sz, 25.0)[0],
600 channel_result.median,
601 D::percentile(sp, 1, 0, sz, 75.0)[0]
602 };
603
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) {
607 const size_t start = i * m_hop_size;
608 const size_t end = std::min(start + m_window_size, data_size);
609 channel_result.window_positions.emplace_back(start, end);
610 }
611
613 channel_result.stat_classifications.reserve(ch_stats.size());
614 channel_result.level_counts.fill(0);
615
616 for (double value : ch_stats) {
617 const StatisticalLevel level = classify_statistical_level(value);
618 channel_result.stat_classifications.push_back(level);
619 channel_result.level_counts[static_cast<size_t>(level)]++;
620 }
621 }
622 }
623
624 return result;
625 }
626
627 /**
628 * @brief Create pipeline output for operation chaining
629 */
631 {
632 std::vector<std::vector<double>> channel_stats;
633 channel_stats.reserve(analysis_result.channel_statistics.size());
634 for (const auto& ch : analysis_result.channel_statistics) {
635 channel_stats.push_back(ch.statistical_values);
636 }
637
638 output_type output = this->convert_result(channel_stats, info);
639
640 output.metadata = input.metadata;
641
642 output.metadata["source_analyzer"] = "StatisticalAnalyzer";
643 output.metadata["statistical_method"] = method_to_string(analysis_result.method_used);
644 output.metadata["window_size"] = analysis_result.window_size;
645 output.metadata["hop_size"] = analysis_result.hop_size;
646 output.metadata["num_channels"] = analysis_result.channel_statistics.size();
647
648 if (!analysis_result.channel_statistics.empty()) {
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;
651
652 for (const auto& ch : analysis_result.channel_statistics) {
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());
662 }
663
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;
673 }
674
675 return output;
676 }
677};
678
679/// Standard statistical analyzer: DataVariant -> MatrixXd
681
682/// Container statistical analyzer: SignalContainer -> MatrixXd
684
685/// Region statistical analyzer: Region -> MatrixXd
687
688/// Raw statistical analyzer: produces double vectors
689template <ComputeData InputType = std::vector<Kakshya::DataVariant>>
691
692/// Variant statistical analyzer: produces DataVariant output
693template <ComputeData InputType = std::vector<Kakshya::DataVariant>>
695
696/**
697 * @brief Extract a named scalar from a StatisticalAnalysis result.
698 *
699 * Maps qualifier strings to scalar fields of the first channel in @p analysis.
700 * All scalar-valued fields of ChannelStatistics are addressable.
701 *
702 * Supported qualifiers:
703 * - "mean_stat" arithmetic mean of the statistical values
704 * - "max_stat" maximum statistical value
705 * - "min_stat" minimum statistical value
706 * - "variance" variance of the statistical values
707 * - "std_dev" standard deviation
708 * - "skewness" third moment
709 * - "kurtosis" fourth moment
710 * - "median" 50th percentile
711 * - "window_count" number of analysis windows
712 *
713 * An empty qualifier resolves to "mean_stat".
714 * Unknown qualifiers fall back to mean_stat.
715 *
716 * @param analysis Result produced by StatisticalAnalyzer.
717 * @param qualifier Name of the scalar to extract.
718 * @return Extracted double value, or 0.0 if channel_statistics is empty.
719 */
720[[nodiscard]] MAYAFLUX_API inline double extract_scalar_statistics(
721 const StatisticalAnalysis& analysis, const std::string& qualifier)
722{
723 if (analysis.channel_statistics.empty())
724 return 0.0;
725
726 const auto& ch = analysis.channel_statistics[0];
727 const std::string q = qualifier.empty() ? "mean_stat" : qualifier;
728
729 if (q == "mean_stat")
730 return ch.mean_stat;
731 if (q == "max_stat")
732 return ch.max_stat;
733 if (q == "min_stat")
734 return ch.min_stat;
735 if (q == "variance")
736 return ch.stat_variance;
737 if (q == "std_dev")
738 return ch.stat_std_dev;
739 if (q == "skewness")
740 return ch.skewness;
741 if (q == "kurtosis")
742 return ch.kurtosis;
743 if (q == "median")
744 return ch.median;
745 if (q == "window_count")
746 return static_cast<double>(ch.statistical_values.size());
747
748 return ch.mean_stat;
749}
750
751} // namespace MayaFlux::Yantra
Discrete sequence analysis primitives for MayaFlux::Kinesis.
#define MF_ERROR(comp, ctx,...)
Core::GlobalInputConfig input
Definition Config.cpp:36
size_t a
double q
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.
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.
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.
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.
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.
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.
Definition Analysis.cpp:469
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.
Definition Analysis.cpp:545
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.
Definition Analysis.cpp:436
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.
Definition Analysis.cpp:251
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.
Definition Analysis.cpp:375
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.
Definition Analysis.cpp:452
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.
Definition Analysis.cpp:350
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.
Definition Analysis.cpp:559
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.
Definition Analysis.cpp:219
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.
Definition Analysis.cpp:501
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)
Definition Analysis.cpp:485
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.
Definition Analysis.cpp:259
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.
Definition Analysis.cpp:32
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.
Definition Analysis.cpp:292
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.
Definition Analysis.cpp:420
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.
Definition Analysis.cpp:325
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.
Definition Analysis.cpp:590
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.
Definition Analysis.cpp:200
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)
@ 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
Statistical results for a single data channel.
Metadata about data structure for reconstruction.
std::unordered_map< std::string, std::any > metadata
Associated metadata.
Definition DataIO.hpp:28
Input/Output container for computation pipeline data flow with structure preservation.
Definition DataIO.hpp:24
std::vector< ChannelStatistics > channel_statistics
Analysis result structure for statistical analysis.