## Protocol 13: Adaptive Multi-Objective Optimization - Iterative FEA + Neural Network surrogate workflow - Initial FEA sampling, NN training, NN-accelerated search - FEA validation of top NN predictions, retraining loop - adaptive_state.json tracks iteration history and best values - M1 mirror study (V11) with 103 FEA, 3000 NN trials ## Dashboard Visualization Enhancements - Added Plotly.js interactive charts (parallel coords, Pareto, convergence) - Lazy loading with React.lazy() for performance - Code splitting: plotly.js-basic-dist (~1MB vs 3.5MB) - Chart library toggle (Recharts default, Plotly on-demand) - ExpandableChart component for full-screen modal views - ConsoleOutput component for real-time log viewing ## Documentation - Protocol 13 detailed documentation - Dashboard visualization guide - Plotly components README - Updated run-optimization skill with Mode 5 (adaptive) ## Bug Fixes - Fixed TypeScript errors in dashboard components - Fixed Card component to accept ReactNode title - Removed unused imports across components 🤖 Generated with [Claude Code](https://claude.com/claude-code) Co-Authored-By: Claude <noreply@anthropic.com>
10 KiB
Run Optimization Skill
Last Updated: December 3, 2025 Version: 2.0 - Added Adaptive Multi-Objective (Protocol 13)
You are helping the user run and monitor Atomizer optimization studies.
Purpose
Execute optimization studies with proper:
- Pre-flight validation
- Resource management
- Progress monitoring
- Error recovery
- Dashboard integration
Triggers
- "run optimization"
- "start the study"
- "run {study_name}"
- "execute optimization"
- "begin the optimization"
Prerequisites
- Study must exist in
studies/{study_name}/ optimization_config.jsonmust be present and validrun_optimization.pymust exist- NX model files must be in place
Pre-Flight Checklist
Before running, verify:
1. Study Structure
studies/{study_name}/
├── 1_setup/
│ ├── model/
│ │ ├── {Model}.prt ✓ Required
│ │ ├── {Model}_sim1.sim ✓ Required
│ │ └── {Model}_fem1.fem ? Optional (created by NX)
│ ├── optimization_config.json ✓ Required
│ └── workflow_config.json ? Optional
├── 2_results/ ? Created automatically
└── run_optimization.py ✓ Required
2. Configuration Validation
from optimization_engine.validators.config_validator import validate_config
result = validate_config(study_dir / "1_setup" / "optimization_config.json")
if result.errors:
# STOP - fix errors first
for error in result.errors:
print(f"ERROR: {error}")
if result.warnings:
# WARN but can continue
for warning in result.warnings:
print(f"WARNING: {warning}")
3. NX Environment
- Verify NX is installed (check
config.pyforNX_VERSION) - Verify Nastran solver is available
- Check for any running NX processes that might conflict
Execution Modes
Mode 1: Quick Test (3-5 trials)
cd studies/{study_name}
python run_optimization.py --trials 3
Use when: First time running, testing configuration
Mode 2: Standard Run
cd studies/{study_name}
python run_optimization.py --trials 30
Use when: Production optimization with FEA only
Mode 3: Extended with NN Surrogate
cd studies/{study_name}
python run_optimization.py --trials 200 --enable-nn
Use when: Large-scale optimization with trained surrogate
Mode 4: Resume Interrupted
cd studies/{study_name}
python run_optimization.py --trials 30 --resume
Use when: Optimization was interrupted
Mode 5: Adaptive Multi-Objective (Protocol 13)
cd studies/{study_name}
python run_optimization.py --start
Use when:
- FEA takes > 5 minutes per run
- Multi-objective optimization (2-4 objectives)
- Need to explore > 100 designs efficiently
Workflow:
- Initial FEA trials (50-100) for NN training data
- Train neural network surrogate
- NN-accelerated search (1000+ trials in seconds)
- Validate top NN predictions with FEA
- Retrain NN with new data, repeat
Configuration (in optimization_config.json):
{
"protocol": 13,
"adaptive_settings": {
"enabled": true,
"initial_fea_trials": 50,
"nn_trials_per_iteration": 1000,
"fea_validation_per_iteration": 5,
"max_iterations": 10
}
}
Monitoring:
adaptive_state.json: Current iteration, best values, history- Dashboard shows FEA (blue) vs NN (orange) trials
- Pareto front updates after each FEA validation
Execution Steps
Step 1: Validate Study
Run pre-flight checks and present status:
PRE-FLIGHT CHECK: {study_name}
===============================
Configuration:
✓ optimization_config.json valid
✓ 4 design variables defined
✓ 2 objectives (multi-objective)
✓ 2 constraints configured
Model Files:
✓ Beam.prt exists (3.2 MB)
✓ Beam_sim1.sim exists (1.1 MB)
✓ Beam_fem1.fem exists (0.8 MB)
Environment:
✓ NX 2412 detected
✓ Nastran solver available
? No NX processes running (clean slate)
Estimated Runtime:
- 30 trials × ~30s/trial = ~15 minutes
- With NN: 200 trials × ~2s/trial = ~7 minutes (after training)
Ready to run. Proceed? (Y/n)
Step 2: Start Optimization
import subprocess
import sys
from pathlib import Path
def run_optimization(study_name: str, trials: int = 30,
enable_nn: bool = False, resume: bool = False):
"""Start optimization as background process."""
study_dir = Path(f"studies/{study_name}")
cmd = [
sys.executable,
str(study_dir / "run_optimization.py"),
"--trials", str(trials)
]
if enable_nn:
cmd.append("--enable-nn")
if resume:
cmd.append("--resume")
# Run in background
process = subprocess.Popen(
cmd,
cwd=study_dir,
stdout=subprocess.PIPE,
stderr=subprocess.STDOUT
)
return process.pid
Step 3: Monitor Progress
Provide real-time updates:
OPTIMIZATION RUNNING: {study_name}
==================================
Progress: [████████░░░░░░░░░░░░] 12/30 trials (40%)
Elapsed: 5m 32s
ETA: ~8 minutes
Current Trial #12:
Parameters: thickness=2.3, diameter=15.2, ...
Status: Running FEA...
Best So Far (Pareto Front):
#1: mass=245g, freq=125Hz (feasible)
#2: mass=280g, freq=142Hz (feasible)
#3: mass=310g, freq=158Hz (feasible)
Constraint Violations: 3/12 trials (25%)
Common: max_stress exceeded
Dashboard: http://localhost:3003
Optuna Dashboard: http://localhost:8081
Step 4: Handle Completion/Errors
On Success:
OPTIMIZATION COMPLETE
=====================
Study: {study_name}
Duration: 14m 23s
Trials: 30/30
Results:
Feasible designs: 24/30 (80%)
Pareto-optimal: 8 designs
Best Designs:
#1: mass=231g, freq=118Hz ← Lightest
#2: mass=298g, freq=156Hz ← Stiffest
#3: mass=265g, freq=138Hz ← Balanced
Next Steps:
1. View results: /generate-report {study_name}
2. Continue optimization: python run_optimization.py --trials 50 --resume
3. Export designs: python export_pareto.py
On Error:
OPTIMIZATION ERROR
==================
Trial #15 failed with:
Error: NX simulation timeout after 600s
Design: thickness=1.2, diameter=45, hole_count=12
Possible causes:
1. Mesh quality issues with extreme parameters
2. Convergence problems in solver
3. NX process locked/crashed
Recovery options:
1. [Recommended] Resume with --resume flag (skips failed)
2. Narrow design variable bounds
3. Check NX manually with these parameters
Resume command:
python run_optimization.py --trials 30 --resume
Dashboard Integration
Always inform user about monitoring options:
MONITORING OPTIONS
==================
1. Atomizer Dashboard (recommended):
cd atomizer-dashboard/backend && python -m uvicorn api.main:app --port 8000
cd atomizer-dashboard/frontend && npm run dev
→ http://localhost:3003
Features:
- ALL extracted metrics displayed per trial (not just mass/frequency)
- Quick preview shows first 6 metrics with abbreviations
- Expanded view shows full metric names and values
- Multi-objective studies: Zernike RMS, coefficients, workload metrics
2. Optuna Dashboard:
python -c "import optuna; from optuna_dashboard import run_server; ..."
→ http://localhost:8081
3. Command Line:
Watch study.db for updates
Tail the log file
IMPORTANT: For multi-objective studies with custom metrics (Zernike, thermal, etc.), the Atomizer Dashboard automatically displays ALL numeric metrics from user_attrs. No configuration needed - metrics are discovered dynamically.
Resource Management
Before Running
- Check available RAM (recommend 8GB+ free)
- Check disk space (OP2 files can be large)
- Close unnecessary NX sessions
During Run
- Monitor CPU usage (Nastran is CPU-intensive)
- Watch for disk space issues
- Handle NX license timeouts
Cleanup After
- Option to remove intermediate OP2 files
- Compress results for archival
- Clean worker directories
Error Handling
| Error | Cause | Recovery |
|---|---|---|
| NX not found | NX not installed/configured | Check config.py settings |
| Simulation timeout | Complex mesh/convergence | Increase timeout or simplify |
| License error | NX license unavailable | Wait for license or use queue |
| Database locked | Multiple processes | Stop conflicting processes |
| Out of memory | Large mesh | Reduce mesh density |
| OP2 parse error | Corrupted output | Re-run trial |
Parallel Execution (Advanced)
For large studies, can run parallel workers:
# Warning: Requires careful NX session management
# Each worker needs isolated model directory
python run_training_fea.py --study {study_name} --workers 2
Output Format
After starting optimization:
OPTIMIZATION STARTED
====================
Study: {study_name}
Trials: 30
Mode: Multi-objective (NSGA-II)
Started: 2025-11-25 15:30:00
Process ID: 12345
Log File: studies/{study_name}/2_results/optimization.log
Monitoring:
Dashboard: http://localhost:3003
Database: studies/{study_name}/2_results/study.db
Commands:
Check progress: "how's the optimization going?"
Stop: Ctrl+C in terminal or kill process 12345
Resume: python run_optimization.py --resume
Integration with Other Skills
- After completion →
/generate-report - On error →
/troubleshoot - For more trials →
/configure-surrogate(enable NN)
Example Conversation
USER: Run the uav_arm optimization
CLAUDE: I'll start the UAV arm optimization. Let me run pre-flight checks...
PRE-FLIGHT CHECK: uav_arm_optimization
======================================
✓ Configuration valid (Protocol 11, 30 trials)
✓ Model files present
✓ NX 2412 available
Ready to start. This will take approximately 15 minutes.
Starting now...
OPTIMIZATION STARTED
====================
Process running in background.
Monitor at: http://localhost:3003
I'll let you know when it completes. You can ask "how's it going?" anytime.
[... 15 minutes later ...]
OPTIMIZATION COMPLETE
=====================
30/30 trials completed successfully.
Found 8 Pareto-optimal designs.
Best lightweight: 231g @ 118Hz
Best stiff: 298g @ 156Hz
Would you like me to generate a detailed report?