import Box from '@mui/material/Box'; import Switch from '@mui/material/Switch'; import TextField from '@mui/material/TextField'; import Typography from '@mui/material/Typography'; import type { AnomalyConfig } from '../../types/labeleval'; type Detectors = AnomalyConfig['detectors']; function DetectorRow({ label, enabled, onToggle, children, }: { label: string; enabled: boolean; onToggle: (enabled: boolean) => void; children?: React.ReactNode; }) { return ( {label} onToggle(e.target.checked)} /> {enabled ? {children} : null} ); } function NumField({ label, value, onChange, step, }: { label: string; value: number; onChange: (v: number) => void; step?: number; }) { return ( onChange(Number(e.target.value))} sx={{ flex: 1, '& input': { fontSize: 13 } }} /> ); } /** Column 2 of the rare-event configuration grid: classical anomaly detectors. */ export default function AnomalyDetectionConfig({ detectors, onChange, }: { detectors: Detectors; onChange: (detectors: Detectors) => void; }) { const set = (key: K, patch: Partial) => onChange({ ...detectors, [key]: { ...detectors[key], ...patch } }); return ( set('knn', { enabled: v })}> set('knn', { k: v })} /> set('lof', { enabled: v })}> set('lof', { n_neighbors: v })} /> set('isolation_forest', { enabled: v })} > set('isolation_forest', { n_estimators: v })} /> set('ocsvm', { enabled: v })}> set('ocsvm', { nu: v })} /> set('dbscan', { enabled: v })} > set('dbscan', { eps: v })} /> set('dbscan', { min_samples: v })} /> ); }