Major Features: - Hierarchical substudy system (like NX Solutions/Subcases) * Shared model files across all substudies * Independent configuration per substudy * Continuation support from previous substudies * Real-time incremental history updates - Live history tracking with optimization_history_incremental.json - Complete bracket_displacement_maximizing study with substudy examples Core Fixes: - Fixed expression update workflow to pass design_vars through simulation_runner * Restored working NX journal expression update mechanism * OP2 timestamp verification instead of file deletion * Resolved issue where all trials returned identical objective values - Fixed LLMOptimizationRunner to pass design variables to simulation runner - Enhanced NXSolver with timestamp-based file regeneration verification New Components: - optimization_engine/llm_optimization_runner.py - LLM-driven optimization runner - optimization_engine/optimization_setup_wizard.py - Phase 3.3 setup wizard - studies/bracket_displacement_maximizing/ - Complete substudy example * run_substudy.py - Substudy runner with continuation * run_optimization.py - Standalone optimization runner * config/substudy_template.json - Template for new substudies * substudies/coarse_exploration/ - 20-trial coarse search * substudies/fine_tuning/ - 50-trial refinement (continuation example) * SUBSTUDIES_README.md - Complete substudy documentation Technical Improvements: - Incremental history saving after each trial (optimization_history_incremental.json) - Expression update workflow: .prt update → NX journal receives values → geometry update → FEM update → solve - Trial indexing fix in substudy result saving - Updated README with substudy system documentation Testing: - Successfully ran 20-trial coarse_exploration substudy - Verified different objective values across trials (workflow fix validated) - Confirmed live history updates in real-time - Tested shared model file usage across substudies 🤖 Generated with [Claude Code](https://claude.com/claude-code) Co-Authored-By: Claude <noreply@anthropic.com>
206 lines
5.6 KiB
Markdown
206 lines
5.6 KiB
Markdown
# Substudy System
|
|
|
|
The substudy system allows you to organize multiple optimization runs that share the same model files but have different configurations, like NX Solutions with subcases.
|
|
|
|
## Directory Structure
|
|
|
|
```
|
|
bracket_displacement_maximizing/
|
|
├── model/ # Shared model files
|
|
│ ├── Bracket.prt # Part file (shared)
|
|
│ ├── Bracket_fem1.fem # FEM file (shared)
|
|
│ └── Bracket_sim1.sim # Simulation file (shared)
|
|
├── config/
|
|
│ └── substudy_template.json # Template for new substudies
|
|
├── substudies/ # Independent substudy results
|
|
│ ├── coarse_exploration/ # Example: fast exploration
|
|
│ │ ├── config.json
|
|
│ │ ├── optimization_history.json
|
|
│ │ ├── optimization_history_incremental.json # Live updates!
|
|
│ │ ├── best_design.json
|
|
│ │ └── report.md
|
|
│ └── fine_tuning/ # Example: refined optimization
|
|
│ ├── config.json
|
|
│ └── ...
|
|
├── run_substudy.py # Substudy runner
|
|
└── run_optimization.py # Original standalone runner
|
|
```
|
|
|
|
## Key Concepts
|
|
|
|
### Shared Model Files
|
|
All substudies use the **same** model files from `model/` directory:
|
|
- `Bracket.prt` - Updated with design variables during optimization
|
|
- `Bracket_fem1.fem` - Automatically updated when geometry changes
|
|
- `Bracket_sim1.sim` - Simulation definition
|
|
|
|
This is like NX where different Subcases share the same model.
|
|
|
|
### Independent Substudy Configurations
|
|
Each substudy has its own:
|
|
- Parameter bounds (coarse vs. fine)
|
|
- Number of trials
|
|
- Algorithm settings
|
|
- Results directory
|
|
|
|
### Continuation Support
|
|
Substudies can continue from previous runs:
|
|
- Start from best design of previous substudy
|
|
- Refine search in narrower bounds
|
|
- Build on previous work incrementally
|
|
|
|
### Live History Tracking
|
|
Each substudy automatically saves incremental history:
|
|
- `optimization_history_incremental.json` updates after each trial
|
|
- Monitor progress in real-time
|
|
- No need to query Optuna database
|
|
|
|
## Usage
|
|
|
|
### 1. Create a New Substudy
|
|
|
|
Copy the template and customize:
|
|
|
|
```bash
|
|
# Create new substudy directory
|
|
mkdir substudies/my_substudy_name
|
|
|
|
# Copy template
|
|
cp config/substudy_template.json substudies/my_substudy_name/config.json
|
|
|
|
# Edit config.json with your parameters
|
|
```
|
|
|
|
### 2. Configure the Substudy
|
|
|
|
Edit `substudies/my_substudy_name/config.json`:
|
|
|
|
```json
|
|
{
|
|
"substudy_name": "my_substudy_name",
|
|
"description": "What this substudy investigates",
|
|
"parent_study": "bracket_displacement_maximizing",
|
|
|
|
"optimization": {
|
|
"algorithm": "TPE",
|
|
"direction": "minimize",
|
|
"n_trials": 20,
|
|
"design_variables": [
|
|
{
|
|
"parameter": "tip_thickness",
|
|
"min": 15.0,
|
|
"max": 25.0,
|
|
"units": "mm"
|
|
},
|
|
{
|
|
"parameter": "support_angle",
|
|
"min": 20.0,
|
|
"max": 40.0,
|
|
"units": "degrees"
|
|
}
|
|
]
|
|
},
|
|
|
|
"continuation": {
|
|
"enabled": false
|
|
}
|
|
}
|
|
```
|
|
|
|
**IMPORTANT**: Use `"parameter"` not `"name"` for design variables!
|
|
|
|
### 3. Run the Substudy
|
|
|
|
```bash
|
|
cd studies/bracket_displacement_maximizing
|
|
python run_substudy.py my_substudy_name
|
|
```
|
|
|
|
### 4. Monitor Progress
|
|
|
|
Watch the live history file update in real-time:
|
|
|
|
```bash
|
|
# In another terminal
|
|
watch -n 5 cat substudies/my_substudy_name/optimization_history_incremental.json
|
|
```
|
|
|
|
### 5. Continuing from Previous Substudy
|
|
|
|
To refine results from a previous substudy:
|
|
|
|
```json
|
|
{
|
|
"substudy_name": "refined_search",
|
|
"optimization": {
|
|
"design_variables": [
|
|
{
|
|
"parameter": "tip_thickness",
|
|
"min": 18.0, // Narrower bounds
|
|
"max": 22.0,
|
|
"units": "mm"
|
|
}
|
|
]
|
|
},
|
|
|
|
"continuation": {
|
|
"enabled": true,
|
|
"from_substudy": "my_substudy_name",
|
|
"inherit_best_params": true // Start from best design
|
|
}
|
|
}
|
|
```
|
|
|
|
## Example Workflows
|
|
|
|
### Workflow 1: Coarse-to-Fine Optimization
|
|
|
|
1. **Coarse Exploration** (20 trials, wide bounds)
|
|
- Fast exploration of entire design space
|
|
- Identify promising regions
|
|
|
|
2. **Fine Tuning** (50 trials, narrow bounds)
|
|
- Continue from best coarse design
|
|
- Refine solution in narrow bounds
|
|
|
|
### Workflow 2: Algorithm Comparison
|
|
|
|
1. **TPE Optimization** (substudy with TPE algorithm)
|
|
2. **NSGAII Optimization** (substudy with genetic algorithm)
|
|
3. Compare results across different algorithms
|
|
|
|
### Workflow 3: Incremental Study Extension
|
|
|
|
1. Run initial 20-trial substudy
|
|
2. Analyze results
|
|
3. Create continuation substudy for 30 more trials
|
|
4. Keep building on previous work
|
|
|
|
## Files Generated per Substudy
|
|
|
|
After running a substudy, you'll find:
|
|
|
|
- `optimization_history.json` - Complete trial history
|
|
- `optimization_history_incremental.json` - Live-updating history
|
|
- `best_design.json` - Best parameters and performance
|
|
- `report.md` - Human-readable markdown report
|
|
- `optuna_study.db` - Optuna database (in output_dir)
|
|
|
|
## Tips
|
|
|
|
1. **Name substudies descriptively**: `coarse_20trials`, `fine_50trials_narrow_bounds`
|
|
2. **Use continuation wisely**: Continue from coarse to fine, not vice versa
|
|
3. **Monitor live history**: Use it to catch issues early
|
|
4. **Keep model files clean**: The shared model in `model/` is modified during optimization
|
|
5. **Back up good results**: Copy substudy directories before running new ones
|
|
|
|
## Comparison with NX
|
|
|
|
| NX Concept | Substudy Equivalent |
|
|
|------------|-------------------|
|
|
| Solution | Study (bracket_displacement_maximizing) |
|
|
| Subcase | Substudy (coarse_exploration) |
|
|
| Shared model | model/ directory |
|
|
| Subcase parameters | config.json |
|
|
| Subcase results | substudy directory |
|