- 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>
4.9 KiB
4.9 KiB
Fix Summary: Protocol 11 - Multi-Objective Support
Date: 2025-11-21 Issue: IntelligentOptimizer crashes on multi-objective optimization studies Status: ✅ FIXED
Root Cause
The IntelligentOptimizer (Protocol 10) was hardcoded for single-objective optimization only. When used with multi-objective studies:
- Trials executed successfully - All simulations ran and data was saved to
study.db - Crash during result compilation - Failed when accessing
study.best_trial/best_params/best_value - No tracking files generated - intelligent_optimizer folder remained empty
- Silent failure - Error only visible in console output, not in results
Files Modified
1. optimization_engine/intelligent_optimizer.py
Changes:
- Added
self.directionsattribute to store study type - Modified
_compile_results()to handle both single and multi-objective (lines 327-370) - Modified
_run_fallback_optimization()to handle both cases (lines 372-413) - Modified
_print_final_summary()to format multi-objective values correctly (lines 427-445) - Added Protocol 11 initialization message (lines 116-119)
Key Fix:
def _compile_results(self) -> Dict[str, Any]:
is_multi_objective = len(self.study.directions) > 1
if is_multi_objective:
best_trials = self.study.best_trials # Pareto front
representative_trial = best_trials[0] if best_trials else None
# ...
else:
best_params = self.study.best_params # Single objective API
# ...
2. optimization_engine/landscape_analyzer.py
Changes:
- Modified
print_landscape_report()to handleNoneinput (lines 346-354) - Added check for multi-objective studies
Key Fix:
def print_landscape_report(landscape: Dict, verbose: bool = True):
# Handle None (multi-objective studies)
if landscape is None:
print(f"\n [LANDSCAPE ANALYSIS] Skipped for multi-objective optimization")
return
3. optimization_engine/strategy_selector.py
Changes:
- Modified
recommend_strategy()to handleNonelandscape (lines 58-61) - Added None check before calling
.get()on landscape dict
Key Fix:
def recommend_strategy(...):
# Handle None landscape (multi-objective optimization)
if landscape is None or not landscape.get('ready', False):
return self._recommend_random_exploration(trials_completed)
4. studies/bracket_stiffness_optimization/run_optimization.py
Changes:
- Fixed landscape_analysis None check in results printing (line 251)
Key Fix:
if 'landscape_analysis' in results and results['landscape_analysis'] is not None:
print(f" Landscape Type: {results['landscape_analysis'].get('landscape_type', 'N/A')}")
5. atomizer-dashboard/frontend/src/pages/Dashboard.tsx
Changes:
- Removed hardcoded "Hz" units from objective values and metrics
- Made dashboard generic for all optimization types
Changes:
- Line 204: Removed " Hz" from Best Value metric
- Line 209: Removed " Hz" from Avg Objective metric
- Line 242: Changed Y-axis label from "Objective (Hz)" to "Objective"
- Line 298: Removed " Hz" from parameter space tooltip
- Line 341: Removed " Hz" from trial feed objective display
- Line 43: Removed " Hz" from new best alert message
6. docs/PROTOCOL_11_MULTI_OBJECTIVE_SUPPORT.md
Created: Comprehensive documentation explaining:
- The problem and root cause
- The solution pattern
- Implementation checklist
- Testing protocol
- Files that need review
Testing
Tested with bracket_stiffness_optimization study:
- Objectives: Maximize stiffness, Minimize mass
- Directions:
["minimize", "minimize"](multi-objective) - Expected: Complete successfully with all tracking files
Results
✅ Before Fix:
- study.db created ✓
- intelligent_optimizer/ EMPTY ✗
- optimization_summary.json MISSING ✗
- RuntimeError in console ✗
✅ After Fix:
- study.db created ✓
- intelligent_optimizer/ populated ✓
- optimization_summary.json created ✓
- No errors ✓
- Protocol 11 message displayed ✓
Lessons Learned
- Always test both single and multi-objective cases
- Check for
Nonebefore calling.get()on dict-like objects - Multi-objective support must be baked into the design, not added later
- Silent failures are dangerous - always validate output files exist
Future Work
- Review files listed in Protocol 11 documentation for similar issues
- Add unit tests for multi-objective support in all optimizers
- Create helper function
get_best_solution(study)for both cases - Add validation checks in study creation to warn about configuration issues
Conclusion
Protocol 11 is now MANDATORY for all optimization components. Any code that accesses study.best_trial, study.best_params, or study.best_value MUST first check if the study is multi-objective and handle it appropriately.