import type { Vec2 } from '../../math'; import type { DataSeries } from './types'; export interface OscillationWeights { derivative_variance?: number; amplitude_growth?: number; sign_changes?: number; } 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 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 LocalOutlierResult { kept_indices: number[]; removed_indices: number[]; iterations_used: 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 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 declare function compute_local_variance(values: number[], window_size: number): number[]; export declare function detect_instability(x_values: readonly number[], y_values: readonly number[], config?: Pick): InstabilityResult; export declare function smooth_moving_average(values: number[], window: number): number[]; export declare function smooth_savitzky_golay(values: number[], window: number, polynomial_order?: number): number[]; export declare function remove_local_outliers(y_values: readonly number[], config?: LocalOutlierConfig): LocalOutlierResult; export declare function handle_invalid_values(values: number[], mode: InvalidValueMode): { cleaned: number[]; removed_indices: number[]; invalid_count: number; }; export declare function apply_bounds(x_values: readonly number[], y_values: number[], bounds: PhysicalBounds): { y: number[]; violations: number; filtered_indices: number[]; }; export declare function sync_metadata(metadata: M[] | M | undefined, kept_indices: number[]): M[] | M | undefined; 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; }; export declare function clean_trajectory_props(props: Record, config?: CleaningConfig & { independent_axis?: string; }): { props: Record; quality: Record; };