import { useState } from "react"; import AlgorithmControls, { DEFAULT_HYPERPARAMETERS } from "./AlgorithmControls"; import type { ComparisonEntry, ComparisonTrajectory, SettingsUi } from "./types"; export default function ComparePanel({ settings, entries, trajectories, onAdd, onRemove, onToggleVisibility, iteration, busy, ready, animating, onAction }: { settings: SettingsUi; entries: ComparisonEntry[]; trajectories: ComparisonTrajectory[]; onAdd: (settings: SettingsUi) => void; onRemove: (id: number) => void; onToggleVisibility: (id: number) => void; iteration: number; busy: boolean; ready: boolean; animating: boolean; onAction: (action: string) => void; }) { const [draft, setDraft] = useState(settings); const configured: SettingsUi = { algorithm: draft.algorithm, x0: draft.x0, y0: draft.y0, mode: settings.mode, functionExpr: settings.functionExpr, ...Object.fromEntries(Object.entries(DEFAULT_HYPERPARAMETERS[draft.algorithm]).map(([key, fallback]) => [key, draft[key as keyof SettingsUi] ?? fallback])) }; const valid = [configured.x0, ...(configured.mode === "Bivariate" ? [configured.y0] : []), ...Object.entries(configured).filter(([key]) => ["learningRate", "momentum", "beta", "beta1", "beta2", "epsilon"].includes(key)).map(([, value]) => value) ].every(value => value !== undefined && value.trim() !== "" && Number.isFinite(Number(value))); return <> setDraft({ ...configured, x0: (Math.random() * 2 - 1).toFixed(2), y0: (Math.random() * 2 - 1).toFixed(2) })} />
Selected algorithms
{entries.length === 0 &&

Add algorithms to compare their trajectories on the same objective.

}
Iteration {iteration}{busy ? " · Computing…" : ""}
{["Animate", "Previous", "Next", "Reset", "Pause"].map(action => )}
; }