feat: Major update with validators, skills, dashboard, and docs reorganization

- Add validation framework (config, model, results, study validators)
- Add Claude Code skills (create-study, run-optimization, generate-report,
  troubleshoot, analyze-model)
- Add Atomizer Dashboard (React frontend + FastAPI backend)
- Reorganize docs into structured directories (00-09)
- Add neural surrogate modules and training infrastructure
- Add multi-objective optimization support

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude <noreply@anthropic.com>
This commit is contained in:
2025-11-25 19:23:58 -05:00
parent 74a92803b7
commit e3bdb08a22
155 changed files with 52729 additions and 37 deletions

View File

@@ -28,6 +28,7 @@ export default function Dashboard() {
// Protocol 13: New state for metadata and Pareto front
const [studyMetadata, setStudyMetadata] = useState<any>(null);
const [paretoFront, setParetoFront] = useState<any[]>([]);
const [allTrialsRaw, setAllTrialsRaw] = useState<any[]>([]); // All trials for parallel coordinates
// Load studies on mount
useEffect(() => {
@@ -117,13 +118,32 @@ export default function Dashboard() {
fetch(`/api/optimization/studies/${selectedStudyId}/pareto-front`)
.then(res => res.json())
.then(paretoData => {
console.log('[Dashboard] Pareto front data:', paretoData);
if (paretoData.is_multi_objective && paretoData.pareto_front) {
console.log('[Dashboard] Setting Pareto front with', paretoData.pareto_front.length, 'trials');
setParetoFront(paretoData.pareto_front);
} else {
console.log('[Dashboard] No Pareto front or not multi-objective');
setParetoFront([]);
}
})
.catch(err => console.error('Failed to load Pareto front:', err));
// Fetch ALL trials (not just Pareto) for parallel coordinates
fetch(`/api/optimization/studies/${selectedStudyId}/history`)
.then(res => res.json())
.then(data => {
// Transform to match the format expected by ParallelCoordinatesPlot
const trialsData = data.trials.map((t: any) => ({
trial_number: t.trial_number,
values: t.values || [],
params: t.design_variables || {},
user_attrs: t.user_attrs || {},
constraint_satisfied: t.constraint_satisfied !== false
}));
setAllTrialsRaw(trialsData);
})
.catch(err => console.error('Failed to load all trials:', err));
}
}, [selectedStudyId]);
@@ -275,13 +295,12 @@ export default function Dashboard() {
<div className="flex gap-2">
<button
onClick={() => {
if (selectedStudyId) {
window.open(`http://localhost:8080?study=${selectedStudyId}`, '_blank');
}
// Open Optuna dashboard on port 8081
// Note: The dashboard needs to be started separately with the correct study database
window.open('http://localhost:8081', '_blank');
}}
className="btn-secondary"
disabled={!selectedStudyId}
title="Open Optuna Dashboard (make sure it's running on port 8080)"
title="Open Optuna Dashboard (runs on port 8081)"
>
Optuna Dashboard
</button>
@@ -355,17 +374,19 @@ export default function Dashboard() {
<ParetoPlot
paretoData={paretoFront}
objectives={studyMetadata.objectives}
allTrials={allTrialsRaw}
/>
</div>
)}
{/* Parallel Coordinates (full width for multi-objective) */}
{paretoFront.length > 0 && studyMetadata && studyMetadata.objectives && studyMetadata.design_variables && (
{allTrialsRaw.length > 0 && studyMetadata && studyMetadata.objectives && studyMetadata.design_variables && (
<div className="mb-6">
<ParallelCoordinatesPlot
paretoData={paretoFront}
paretoData={allTrialsRaw}
objectives={studyMetadata.objectives}
designVariables={studyMetadata.design_variables}
paretoFront={paretoFront}
/>
</div>
)}