import { type Vec2 } from '../../math'; import { type DataSeries } from './types'; export type InvalidValueMode = `remove` | `propagate` | `interpolate`; export type TruncationMode = `hard_cut` | `mark_unstable`; export interface PhysicalBounds { min?: number | ((x: number) => number); max?: number | ((x: number) => number); mode?: `clamp` | `filter` | `null`; } export interface OscillationWeights { derivative_variance?: number; amplitude_growth?: number; sign_changes?: number; } export type SmoothingConfig = { type: `moving_avg`; window: number; } | { type: `savgol`; window: number; polynomial_order?: number; } | { type: `gaussian`; sigma: number; }; export interface LocalOutlierConfig { window_half?: number; mad_threshold?: number; max_iterations?: number; } export interface InstabilityResult { detected: boolean; onset_index: number; onset_x: number; combined_score: number; method_scores: { derivative_variance: number; amplitude_growth: number; sign_changes: number; }; } export interface CleaningConfig { oscillation_threshold?: number; oscillation_weights?: OscillationWeights; window_size?: number; invalid_values?: InvalidValueMode; bounds?: PhysicalBounds; smooth?: SmoothingConfig; local_outliers?: LocalOutlierConfig; truncation_mode?: TruncationMode; in_place?: boolean; } export interface CleaningQuality { points_removed: number; invalid_values_found: number; oscillation_detected: boolean; oscillation_score?: number; bounds_violations: number; outliers_removed?: number; stable_range?: Vec2; truncated_at_x?: number; } export interface CleaningResult { series: T; quality: CleaningQuality; } export declare function detect_instability(x_values: readonly number[], y_values: readonly number[], config?: Pick): InstabilityResult; export declare function smooth_moving_average(values: readonly number[], window: number): number[]; export declare function clean_series(series: T, config?: CleaningConfig): CleaningResult; export declare function clean_multi_series(x_values: readonly number[], y_arrays: number[][], config?: CleaningConfig): { x: number[]; cleaned_y: number[][]; quality: CleaningQuality[]; }; export declare function clean_xyz(x_values: readonly number[], y_values: readonly number[], z_values: readonly number[], config?: CleaningConfig & { primary_axis?: `x` | `y` | `z`; }): { x: number[]; y: number[]; z: number[]; quality: CleaningQuality; };