Files
Atomizer/studies/M1_Mirror/m1_mirror_adaptive_V13
Anto01 cb6b130908 feat(config): Add AtomizerSpec v2.0 schema and migrate all studies
Added JSON Schema:
- optimization_engine/schemas/atomizer_spec_v2.json

Migrated 28 studies to AtomizerSpec v2.0 format:
- Drone_Gimbal studies (1)
- M1_Mirror studies (21)
- M2_Mirror studies (2)
- SheetMetal_Bracket studies (4)

Each atomizer_spec.json is the unified configuration containing:
- Design variables with bounds and expressions
- Extractors (standard and custom)
- Objectives and constraints
- Optimization algorithm settings
- Canvas layout information
2026-01-20 13:11:23 -05:00
..

M1 Mirror Pure NSGA-II FEA Optimization V13

Pure multi-objective FEA optimization with NSGA-II sampler for the M1 telescope mirror support system.

Created: 2025-12-09 Protocol: Pure NSGA-II Multi-Objective (No Neural Surrogate) Status: Running


1. Purpose

V13 runs pure FEA optimization without any neural surrogate to establish ground-truth Pareto front. This serves as:

  1. Baseline for evaluating GNN/MLP surrogate accuracy
  2. Ground truth Pareto front for comparison
  3. Validation data for future surrogate training

Key Difference from V11/V12

Aspect V11 (Adaptive MLP) V12 (GNN + Validation) V13 (Pure FEA)
Surrogate MLP (4-layer) Zernike GNN None
Sampler TPE NSGA-II NSGA-II
Trials/hour ~100 NN + 5 FEA ~5000 GNN + 5 FEA 6-7 FEA
Purpose Fast exploration Field prediction Ground truth

2. Seeding Strategy

V13 seeds from all prior FEA data in V11 and V12:

V11 (107 FEA trials) + V12 (131 FEA trials) = 238 total
                                               │
                                    ┌──────────┴──────────┐
                                    │  Parameter Filter   │
                                    │  (blank_backface    │
                                    │   4.0-5.0 range)    │
                                    └──────────┬──────────┘
                                               │
                                    217 trials seeded into V13

Why 21 Trials Were Skipped

V13 config uses blank_backface_angle: [4.0, 5.0] (intentionally narrower). Trials from V10/V11 with blank_backface_angle < 4.0 (range was 3.5-5.0) were rejected by Optuna.


3. Mathematical Formulation

3.1 Objectives (Same as V11/V12)

Objective Goal Formula Target Units
rel_filtered_rms_40_vs_20 minimize RMS_filt(Z_40 - Z_20) 4.0 nm
rel_filtered_rms_60_vs_20 minimize RMS_filt(Z_60 - Z_20) 10.0 nm
mfg_90_optician_workload minimize RMS_J1-J3(Z_90 - Z_20) 20.0 nm

3.2 Design Variables (11)

Parameter Bounds Units
lateral_inner_angle [25.0, 28.5] deg
lateral_outer_angle [13.0, 17.0] deg
lateral_outer_pivot [9.0, 12.0] mm
lateral_inner_pivot [9.0, 12.0] mm
lateral_middle_pivot [18.0, 23.0] mm
lateral_closeness [9.5, 12.5] mm
whiffle_min [35.0, 55.0] mm
whiffle_outer_to_vertical [68.0, 80.0] deg
whiffle_triangle_closeness [50.0, 65.0] mm
blank_backface_angle [4.0, 5.0] deg
inner_circular_rib_dia [480.0, 620.0] mm

4. NSGA-II Configuration

sampler = NSGAIISampler(
    population_size=50,
    crossover=SBXCrossover(eta=15),
    mutation=PolynomialMutation(eta=20),
    seed=42
)

NSGA-II performs true multi-objective optimization:

  • Non-dominated sorting for Pareto ranking
  • Crowding distance for diversity preservation
  • No scalarization - preserves full Pareto front

5. Study Structure

m1_mirror_adaptive_V13/
├── 1_setup/
│   ├── model/                    # NX model files (from V11)
│   └── optimization_config.json  # Study config
├── 2_iterations/
│   └── iter{N}/                  # FEA working directories
│       ├── *.prt, *.fem, *.sim   # NX files
│       ├── params.exp            # Parameter expressions
│       └── *solution_1.op2       # Results
├── 3_results/
│   └── study.db                  # Optuna database
├── run_optimization.py           # Main entry point
└── README.md                     # This file

6. Usage

# Start fresh optimization
python run_optimization.py --start --trials 55

# Resume after interruption (Windows update, etc.)
python run_optimization.py --start --trials 35 --resume

# Check status
python run_optimization.py --status

Expected Runtime

  • ~8-10 min per FEA trial
  • 55 trials ≈ 7-8 hours overnight

7. Trial Sources in Database

Source Tag Count Description
V11_FEA 5 V11-only FEA trials
V11_V10_FEA 81 V11 trials inherited from V10
V12_FEA 41 V12-only FEA trials
V12_V10_FEA 90 V12 trials inherited from V10
FEA 10+ New V13 FEA trials

Query trial sources:

SELECT value_json, COUNT(*)
FROM trial_user_attributes
WHERE key = 'source'
GROUP BY value_json;

8. Post-Processing

Extract Pareto Front

import optuna

study = optuna.load_study(
    study_name="m1_mirror_V13_nsga2",
    storage="sqlite:///3_results/study.db"
)

# Get Pareto-optimal trials
pareto = study.best_trials

# Print Pareto front
for t in pareto:
    print(f"Trial {t.number}: {t.values}")

Compare to GNN Predictions

# Load V13 FEA Pareto front
# Load GNN predictions from V12
# Compute error: |GNN - FEA| / FEA

9. Results (To Be Updated)

Metric Value
Seeded trials 217
New FEA trials TBD
Pareto front size TBD
Best rel_rms_40 TBD
Best rel_rms_60 TBD
Best mfg_90 TBD

10. Cross-References

  • V10: ../m1_mirror_zernike_optimization_V10/ - Original LHS sampling
  • V11: ../m1_mirror_adaptive_V11/ - MLP adaptive surrogate
  • V12: ../m1_mirror_adaptive_V12/ - GNN field prediction

Generated by Atomizer Framework. Pure NSGA-II for ground-truth Pareto optimization.