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 })}
/>
);
}