Files
Atomizer/docs/OPTIMIZATION_WORKFLOW.md

677 lines
17 KiB
Markdown
Raw Normal View History

feat: Add centralized configuration system and Phase 3.2 enhancements Major Features Added: 1. Centralized Configuration System (config.py) - Single source of truth for all NX and environment paths - Change NX version in ONE place: NX_VERSION = "2412" - Change Python environment in ONE place: PYTHON_ENV_NAME = "atomizer" - Automatic path derivation and validation - Helper functions: get_nx_journal_command() - Future-proof: Easy to upgrade when NX 2506+ released 2. NX Path Corrections (Critical Fix) - Fixed all incorrect Simcenter3D_2412 references to NX2412 - Updated nx_updater.py to use config.NX_RUN_JOURNAL - Updated dashboard/api/app.py to use config.NX_RUN_JOURNAL - Corrected material library path to NX2412/UGII/materials - All files now use correct NX2412 installation 3. NX Expression Import System - Dual-method expression gathering (.exp export + binary parsing) - Robust handling of all NX expression types - Support for formulas, units, and dependencies - Documented in docs/NX_EXPRESSION_IMPORT_SYSTEM.md 4. Study Management & Analysis Tools - StudyCreator: Unified interface for study/substudy creation - BenchmarkingSubstudy: Automated baseline analysis - ComprehensiveResultsAnalyzer: Multi-result extraction from .op2 - Expression extractor generator (LLM-powered) 5. 50-Trial Beam Optimization Complete - Full optimization results documented - Best design: 23.1% improvement over baseline - Comprehensive analysis with plots and insights - Results in studies/simple_beam_optimization/ Documentation Updates: - docs/SYSTEM_CONFIGURATION.md - System paths and validation - docs/QUICK_CONFIG_REFERENCE.md - Quick config change guide - docs/NX_EXPRESSION_IMPORT_SYSTEM.md - Expression import details - docs/OPTIMIZATION_WORKFLOW.md - Complete workflow guide - Updated README.md with NX2412 paths Files Modified: - config.py (NEW) - Central configuration system - optimization_engine/nx_updater.py - Now uses config - dashboard/api/app.py - Now uses config - optimization_engine/study_creator.py - Enhanced features - optimization_engine/benchmarking_substudy.py - New analyzer - optimization_engine/comprehensive_results_analyzer.py - Multi-result extraction - optimization_engine/result_extractors/generated/extract_expression.py - Generated extractor Cleanup: - Removed all temporary test files - Removed migration scripts (no longer needed) - Clean production-ready codebase Strategic Impact: - Configuration maintenance time: reduced from hours to seconds - Path consistency: 100% enforced across codebase - Future NX upgrades: Edit ONE variable in config.py - Foundation for Phase 3.2 Integration completion 🤖 Generated with [Claude Code](https://claude.com/claude-code) Co-Authored-By: Claude <noreply@anthropic.com>
2025-11-17 14:36:00 -05:00
# Atomizer Optimization Workflow
> **Complete guide to running professional optimization campaigns with Atomizer**
>
> **Version**: 2.0 (Mandatory Benchmarking)
> **Last Updated**: 2025-11-17
---
## Overview
Atomizer enforces a professional, rigorous workflow for all optimization studies:
1. **Problem Definition** - User describes the engineering problem
2. **Benchmarking** (MANDATORY) - Discover, validate, propose
3. **Configuration** - User refines based on benchmark proposals
4. **Integration Testing** - Validate pipeline with 2-3 trials
5. **Full Optimization** - Run complete campaign
6. **Reporting** - Generate comprehensive results documentation
**Key Innovation**: Mandatory benchmarking ensures every study starts with a solid foundation.
---
## Phase 1: Problem Definition & Study Creation
### User Provides Problem Description
**Example**:
```
Optimize cantilevered beam with hole to minimize weight while
maintaining structural integrity.
Goals:
- Minimize: Total mass
- Constraints: Max stress < 150 MPa, Max deflection < 5 mm
Design Variables:
- Beam thickness: 5-15 mm
- Hole diameter: 20-60 mm
- Hole position from fixed end: 100-300 mm
Loading: 1000 N downward at free end
Material: Steel (yield 300 MPa)
```
### Atomizer Creates Study Structure
```python
from optimization_engine.study_creator import StudyCreator
from pathlib import Path
# Create study
creator = StudyCreator()
study_dir = creator.create_study(
study_name="cantilever_beam_optimization",
description="Minimize weight with stress and deflection constraints"
)
```
**Result**:
```
studies/cantilever_beam_optimization/
 model/ # Place NX files here
 substudies/
  benchmarking/ # Mandatory first substudy
 config/ # Configuration templates
 plugins/ # Study-specific hooks
 results/ # Optimization results
 study_metadata.json # Study tracking
 README.md # Study-specific guide
```
**Next**: User adds NX model files to `model/` directory
---
## Phase 2: Benchmarking (MANDATORY)
### Purpose
Benchmarking is a **mandatory first step** that:
1. **Discovers** what's in your model (expressions, OP2 contents)
2. **Validates** the pipeline works (simulation, extraction)
3. **Proposes** initial configuration (design variables, extractors, objectives)
4. **Gates** optimization (must pass before substudies can be created)
### Run Benchmarking
```python
# After placing NX files in model/ directory
results = creator.run_benchmarking(
study_dir=study_dir,
prt_file=study_dir / "model" / "beam.prt",
sim_file=study_dir / "model" / "beam_sim1.sim"
)
```
### What Benchmarking Does
**Step 1: Model Introspection**
- Reads all expressions from `.prt` file
- Lists parameter names, values, units
- Identifies potential design variables
**Example Output**:
```
Found 5 expressions:
- thickness: 10.0 mm
- hole_diameter: 40.0 mm
- hole_position: 200.0 mm
- beam_length: 500.0 mm (likely constant)
- applied_load: 1000.0 N (likely constant)
```
**Step 2: Baseline Simulation**
- Runs NX simulation with current parameters
- Validates NX integration works
- Generates baseline OP2 file
**Step 3: OP2 Introspection**
- Analyzes OP2 file contents
- Detects element types (CTETRA, CHEXA, etc.)
- Lists available result types (displacement, stress, etc.)
**Example Output**:
```
OP2 Analysis:
- Element types: CTETRA
- Result types: displacement, stress
- Subcases: [1]
- Nodes: 15234
- Elements: 8912
```
**Step 4: Baseline Results Extraction**
- Extracts key metrics from baseline OP2
- Provides performance reference
**Example Output**:
```
Baseline Performance:
- max_displacement: 0.004523 mm
- max_von_mises: 145.2 MPa
- mass: 2.45 kg (if available)
```
**Step 5: Configuration Proposals**
- Suggests design variables (excluding constants)
- Proposes extractors based on OP2 contents
- Recommends objectives
**Example Output**:
```
Proposed Design Variables:
- thickness: <20>20% of 10.0 mm <20> [8.0, 12.0] mm
- hole_diameter: <20>20% of 40.0 mm <20> [32.0, 48.0] mm
- hole_position: <20>20% of 200.0 mm <20> [160.0, 240.0] mm
Proposed Extractors:
- extract_displacement: Extract displacement from OP2
- extract_solid_stress: Extract stress from CTETRA elements
Proposed Objectives:
- max_displacement (minimize for stiffness)
- max_von_mises (minimize for safety)
- mass (minimize for weight)
```
### Benchmark Report
Results saved to `substudies/benchmarking/BENCHMARK_REPORT.md`:
```markdown
# Benchmarking Report
**Study**: cantilever_beam_optimization
**Date**: 2025-11-17T10:30:00
**Validation**:  PASSED
## Model Introspection
... (complete report)
## Configuration Proposals
... (proposals for user to review)
```
### Validation Status
Benchmarking either **PASSES** or **FAILS**:
-  **PASS**: Simulation works, OP2 extractable, ready for substudies
- L **FAIL**: Issues found, must fix before proceeding
**If failed**: Review errors in report, fix model/simulation issues, re-run benchmarking.
---
## Phase 3: Optimization Configuration
### User Reviews Benchmark Proposals
1. Open `substudies/benchmarking/BENCHMARK_REPORT.md`
2. Review discovered expressions
3. Review proposed design variables
4. Review proposed objectives
5. Decide on final configuration
### User Provides Official Guidance
Based on benchmark proposals, user specifies:
```python
# User's final configuration
config = {
"design_variables": [
{"parameter": "thickness", "min": 5.0, "max": 15.0, "units": "mm"},
{"parameter": "hole_diameter", "min": 20.0, "max": 60.0, "units": "mm"},
{"parameter": "hole_position", "min": 100.0, "max": 300.0, "units": "mm"}
],
"objectives": {
"primary": "mass", # Minimize weight
"direction": "minimize"
},
"constraints": [
{"metric": "max_von_mises", "limit": 150.0, "type": "less_than"},
{"metric": "max_displacement", "limit": 5.0, "type": "less_than"}
],
"n_trials": 50
}
```
### Create LLM Workflow
Use API to parse user's natural language request into structured workflow:
```python
from optimization_engine.llm_workflow_analyzer import LLMWorkflowAnalyzer
analyzer = LLMWorkflowAnalyzer(api_key="your-key")
workflow = analyzer.analyze_request("""
Minimize mass while ensuring:
- Max stress < 150 MPa
- Max deflection < 5 mm
Design variables: thickness (5-15mm), hole_diameter (20-60mm), hole_position (100-300mm)
Material: Steel with yield strength 300 MPa
""")
# Save workflow
with open(study_dir / "config" / "llm_workflow.json", 'w') as f:
json.dump(workflow, f, indent=2)
```
---
## Phase 4: Substudy Creation
### Create Substudies
Atomizer uses auto-numbering: `substudy_1`, `substudy_2`, etc.
```python
# Create first substudy (substudy_1)
substudy_1 = creator.create_substudy(
study_dir=study_dir,
config=config # Optional, uses benchmark proposals if not provided
)
# Or with custom name
substudy_coarse = creator.create_substudy(
study_dir=study_dir,
substudy_name="coarse_exploration",
config=coarse_config
)
```
**Auto-numbering**:
- First substudy: `substudy_1`
- Second substudy: `substudy_2`
- Third substudy: `substudy_3`
- etc.
**Custom naming** (optional):
- User can override with meaningful names
- `coarse_exploration`, `fine_tuning`, `robustness_check`, etc.
### Pre-Check Validation
**IMPORTANT**: Before ANY substudy runs, it validates against benchmarking:
1. Checks benchmarking completed
2. Verifies design variables exist in model
3. Validates extractors match OP2 contents
4. Ensures configuration is compatible
If validation fails <20> Study creator raises error with clear message.
---
## Phase 5: Integration Testing
### Purpose
Run 2-3 trials to validate complete pipeline before full optimization.
### Integration Test Substudy
Create special integration test substudy:
```python
integration_config = {
"n_trials": 3, # Just 3 trials for validation
# ... same design variables and extractors
}
integration_dir = creator.create_substudy(
study_dir=study_dir,
substudy_name="integration_test",
config=integration_config
)
```
### Run Integration Test
```python
from optimization_engine.llm_optimization_runner import LLMOptimizationRunner
# ... setup model_updater and simulation_runner ...
runner = LLMOptimizationRunner(
llm_workflow=workflow,
model_updater=model_updater,
simulation_runner=simulation_runner,
study_name="integration_test",
output_dir=integration_dir
)
results = runner.run_optimization(n_trials=3)
```
### Validate Results
Check:
-  All 3 trials completed successfully
-  NX simulations ran
-  OP2 extraction worked
-  Calculations executed
-  Objective function computed
-  Constraints evaluated
**Example Output**:
```
Integration Test Results (3 trials):
Trial 1: thickness=7.5mm, hole_dia=40mm <20> mass=2.1kg, max_stress=152MPa L (constraint violated)
Trial 2: thickness=10mm, hole_dia=35mm <20> mass=2.6kg, max_stress=138MPa 
Trial 3: thickness=8mm, hole_dia=45mm <20> mass=2.2kg, max_stress=148MPa 
 Pipeline validated - ready for full optimization
```
---
## Phase 6: Full Optimization
### Create Optimization Substudy
```python
# Create main optimization substudy
main_config = {
"n_trials": 50, # Full campaign
# ... design variables, objectives, constraints
}
main_dir = creator.create_substudy(
study_dir=study_dir,
config=main_config # substudy_1 (auto-numbered)
)
```
### Run Optimization
```python
runner = LLMOptimizationRunner(
llm_workflow=workflow,
model_updater=model_updater,
simulation_runner=simulation_runner,
study_name="substudy_1",
output_dir=main_dir
)
results = runner.run_optimization(n_trials=50)
```
### Monitor Progress
Live tracking with incremental history:
```python
# Check progress in real-time
history_file = main_dir / "optimization_history_incremental.json"
# Updates after each trial
```
---
## Phase 7: Comprehensive Reporting
### Auto-Generated Report
Atomizer generates complete documentation:
#### Executive Summary
- Best design found
- Objective value achieved
- All constraints satisfied?
- Performance vs baseline
- Improvement percentage
#### Optimization History
- Convergence plots (objective vs trial)
- Parameter evolution plots
- Constraint violation tracking
- Pareto frontier (if multi-objective)
#### Best Design Analysis
- Design variable values
- All result metrics
- Stress contour plots (if available)
- Comparison table (baseline vs optimized)
#### Technical Documentation
- Complete workflow specification
- All extractors used (with code)
- All hooks used (with code + references)
- Calculations performed (with formulas)
- Software versions, timestamps
#### Reproducibility Package
- Exact configuration files
- Random seeds used
- Environment specifications
- Instructions to reproduce
### Report Location
```
studies/cantilever_beam_optimization/
 substudies/
 substudy_1/
 OPTIMIZATION_REPORT.md # Main report
 plots/ # All visualizations
  convergence.png
  parameter_evolution.png
  pareto_frontier.png
 config/ # Configurations used
 code/ # All generated code
 results/ # Raw data
```
---
## Advanced Features
### Multiple Substudies (Continuation)
Build on previous results:
```python
# Substudy 1: Coarse exploration
coarse_config = {
"n_trials": 20,
"design_variables": [
{"parameter": "thickness", "min": 5.0, "max": 15.0}
]
}
coarse_dir = creator.create_substudy(study_dir, config=coarse_config) # substudy_1
# Substudy 2: Fine-tuning (narrow ranges based on substudy_1)
fine_config = {
"n_trials": 50,
"continuation": {
"enabled": True,
"from_substudy": "substudy_1",
"inherit_best_params": True
},
"design_variables": [
{"parameter": "thickness", "min": 8.0, "max": 12.0} # Narrowed
]
}
fine_dir = creator.create_substudy(study_dir, config=fine_config) # substudy_2
```
### Custom Hooks
Add study-specific post-processing:
```python
# Create custom hook in plugins/post_calculation/
custom_hook = study_dir / "plugins" / "post_calculation" / "custom_constraint.py"
# ... write hook code ...
# Hook automatically loaded by LLMOptimizationRunner
```
---
## Complete Example
### Step-by-Step Beam Optimization
```python
from pathlib import Path
from optimization_engine.study_creator import StudyCreator
from optimization_engine.llm_workflow_analyzer import LLMWorkflowAnalyzer
from optimization_engine.llm_optimization_runner import LLMOptimizationRunner
from optimization_engine.nx_updater import NXParameterUpdater
from optimization_engine.nx_solver import NXSolver
# 1. Create study
creator = StudyCreator()
study_dir = creator.create_study(
"cantilever_beam_opt",
"Minimize weight with stress/deflection constraints"
)
# 2. User adds NX files to model/ directory
# (manual step)
# 3. Run benchmarking
prt_file = study_dir / "model" / "beam.prt"
sim_file = study_dir / "model" / "beam_sim1.sim"
benchmark_results = creator.run_benchmarking(study_dir, prt_file, sim_file)
# 4. Review benchmark report
# Open substudies/benchmarking/BENCHMARK_REPORT.md
# 5. User provides configuration based on proposals
user_request = """
Minimize mass while ensuring:
- Max stress < 150 MPa
- Max deflection < 5 mm
Design variables:
- thickness: 5-15 mm
- hole_diameter: 20-60 mm
- hole_position: 100-300 mm
Material: Steel (yield 300 MPa)
Use TPE algorithm with 50 trials.
"""
# 6. Generate LLM workflow
analyzer = LLMWorkflowAnalyzer(api_key="your-key")
workflow = analyzer.analyze_request(user_request)
# 7. Create integration test substudy
integration_dir = creator.create_substudy(
study_dir,
substudy_name="integration_test"
)
# 8. Setup model updater and solver
updater = NXParameterUpdater(prt_file_path=prt_file)
def model_updater(design_vars):
updater.update_expressions(design_vars)
updater.save()
solver = NXSolver(nastran_version='2412', use_journal=True)
def simulation_runner(design_vars):
result = solver.run_simulation(sim_file, expression_updates=design_vars)
return result['op2_file']
# 9. Run integration test (3 trials)
integration_runner = LLMOptimizationRunner(
workflow, model_updater, simulation_runner,
"integration_test", integration_dir
)
integration_results = integration_runner.run_optimization(n_trials=3)
# 10. Validate integration results
# (check that all 3 trials passed)
# 11. Create main optimization substudy
main_dir = creator.create_substudy(study_dir) # auto: substudy_1
# 12. Run full optimization (50 trials)
main_runner = LLMOptimizationRunner(
workflow, model_updater, simulation_runner,
"substudy_1", main_dir
)
final_results = main_runner.run_optimization(n_trials=50)
# 13. Generate comprehensive report
# (auto-generated in substudy_1/OPTIMIZATION_REPORT.md)
# 14. Review results and archive
print(f"Best design: {final_results['best_params']}")
print(f"Best objective: {final_results['best_value']}")
```
---
## Benefits of This Workflow
### For Users
1. **No Surprises**: Benchmarking validates everything before optimization
2. **Clear Guidance**: Proposals help configure optimization correctly
3. **Professional Results**: Comprehensive reports with all documentation
4. **Reproducible**: Complete specification of what was done
5. **Traceable**: All code, formulas, references documented
### For Engineering Rigor
1. **Mandatory Validation**: Can't run optimization on broken setup
2. **Complete Documentation**: Every step is recorded
3. **Audit Trail**: Know exactly what was optimized and how
4. **Scientific Standards**: References, formulas, validation included
### For Collaboration
1. **Standard Structure**: Everyone uses same workflow
2. **Self-Documenting**: Reports explain the study
3. **Easy Handoff**: Complete package for review/approval
4. **Knowledge Capture**: Lessons learned documented
---
## Troubleshooting
### Benchmarking Fails
**Problem**: Benchmarking validation fails
**Solutions**:
1. Check NX model files are correct
2. Ensure simulation setup is valid
3. Review error messages in benchmark report
4. Fix model issues and re-run benchmarking
### Substudy Creation Blocked
**Problem**: Cannot create substudy
**Cause**: Benchmarking not completed
**Solution**: Run benchmarking first!
### Pipeline Validation Fails
**Problem**: Integration test trials fail
**Solutions**:
1. Check design variable ranges (too narrow/wide?)
2. Verify extractors match OP2 contents
3. Ensure constraints are feasible
4. Review error logs from failed trials
---
## References
- [BenchmarkingSubstudy](../optimization_engine/benchmarking_substudy.py) - Discovery and validation
- [StudyCreator](../optimization_engine/study_creator.py) - Study management
- [LLMOptimizationRunner](../optimization_engine/llm_optimization_runner.py) - Optimization execution
- [Phase 3.3 Wizard](../optimization_engine/optimization_setup_wizard.py) - Introspection tools
---
**Document Maintained By**: Antoine Letarte
**Last Updated**: 2025-11-17
**Version**: 2.0 (Mandatory Benchmarking Workflow)