Commit Graph

335 Commits

Author SHA1 Message Date
3718a8d5c8 Fix NX solve: backup/restore master model, archive outputs to iterations
NX .sim files store absolute internal references to .fem/.prt files.
Copying them to iteration folders breaks these references (Parts.Open
returns None). Instead:

1. Backup master model once at study start
2. Restore from backup before each trial (isolation)
3. Solve on master model in-place (NX references intact)
4. Archive solver outputs (OP2/F06) + params.exp to iterations/iterNNN/
5. params.exp in each iteration: import into NX to recreate any trial

iteration_manager.py kept for future use but not wired in.
2026-02-11 15:05:18 +00:00
815db0fb8d Add persistent trial history DB (append-only, survives --clean)
- history.db: SQLite append-only, never deleted by --clean
- history.csv: Auto-exported after each trial (live updates)
- Logs: DVs, results, feasibility, status, solve time, iter path
- Cross-study queries: full lineage across all runs/phases
- --clean only resets Optuna DB, history preserved
2026-02-11 14:59:52 +00:00
04fdae26ab Smart iteration management: full model copies + retention policy
- Each iteration gets full model files in iterations/iterNNN/ (openable in NX)
- Retention: keep last 10 + best 3 with full models, strip the rest
- Stripped iterations keep solver outputs (OP2, F06, params, results)
- All paths resolved to absolute before passing to NX (fixes reference issue)
- iteration_manager.py: reusable for future studies
2026-02-11 14:48:05 +00:00
e8877429f8 Smart isolation: backup/restore master model before each trial
- One-time backup of model files at study start (_model_backup/)
- Restore clean state before each trial (files stay in models/, NX refs intact)
- If a trial corrupts the model, next trial starts clean
- Best of both: NX reference integrity + trial isolation
2026-02-11 14:42:07 +00:00
4243a332a3 Iteration archival: solve on master model, archive outputs to studies/iterations/iterNNN/
- Each iteration gets: params.json, results.json, OP2, F06, mass files
- Model directory stays clean (no solver output buildup)
- Study folder is self-contained with full trial history
2026-02-11 14:39:10 +00:00
60dbf5b172 Disable iteration folders: copied NX files break internal references, solve directly on master model 2026-02-11 14:35:56 +00:00
686ec2ac6c KB: document simple vs assembly FEM workflow, automation notes 2026-02-11 14:26:59 +00:00
0e459028fe Fix: FEM part lookup (exclude _i.prt), hole_count unit (Constant not mm), add file logging
- solve_simulation.py: FEM finder now excludes idealized parts, falls back to loading .fem
- solve_simulation.py: hole_count written as [Constant] not [MilliMeter] in .exp
- run_doe.py: dual logging to console + results/doe_run.log
2026-02-11 14:17:43 +00:00
126f0bb2e0 Refactor: nx_interface uses optimization_engine (NXSolver + pyNastran extractors)
- AtomizerNXSolver wraps existing NXSolver + extractors from SAT3 pipeline
- HEEDS-style iteration folders with fresh model copies per trial
- Expression .exp file generation with correct unit mapping
- pyNastran OP2 extraction: displacement, von Mises (kPa→MPa), mass
- StubSolver improved with beam-theory approximations
- Reuses proven journal pipeline (solve_simulation.py)
2026-02-11 13:33:09 +00:00
135698d96a Fix: SQLite duplicate study (load_if_exists), sampling crash with n<11, add --clean flag 2026-02-11 13:09:30 +00:00
e8b4d37667 auto: daily sync 2026-02-11 08:00:20 +00:00
390ffed450 feat(hydrotech-beam): complete NXOpenSolver.evaluate() implementation
Complete the NXOpenSolver class in nx_interface.py with production-ready
evaluate() and close() methods, following proven patterns from
M1_Mirror/SAT3_Trajectory_V7.

Pipeline per trial:
1. NXSolver.create_iteration_folder() — HEEDS-style isolation with fresh
   model copies + params.exp generation
2. NXSolver.run_simulation() — journal-based solve via run_journal.exe
   (handles expression import, geometry rebuild, FEM update, SOL 101)
3. extract_displacement() — max displacement from OP2
4. extract_solid_stress() — max von Mises with auto-detect element type
   (tries all solid types first, falls back to CQUAD4 shell)
5. extract_mass_from_expression() — reads _temp_mass.txt from journal,
   with _temp_part_properties.json fallback

Key decisions:
- Auto-detect element type for stress (element_type=None) instead of
  hardcoding CQUAD4 — the beam model may use solid or shell elements
- Lazy solver init on first evaluate() call for clean error handling
- OP2 fallback path: tries solver result first, then expected naming
  convention (beam_sim1-solution_1.op2)
- Mass fallback: _temp_mass.txt -> _temp_part_properties.json
- LAC-compliant close(): only uses session_manager.cleanup_stale_locks(),
  never kills NX processes directly

Expression mapping (confirmed from binary introspection):
- beam_half_core_thickness, beam_face_thickness, holes_diameter, hole_count
- Mass output: p173 (body_property147.mass, kg)

Refs: OP_09, OPTIMIZATION_STRATEGY.md §8.2
2026-02-11 01:11:09 +00:00
33180d66c9 Rewrite NXOpenSolver to use existing Atomizer optimization engine
- Use optimization_engine.nx.updater.NXParameterUpdater for expression updates (.exp import method)
- Use optimization_engine.nx.solver.NXSolver for journal-based solving (run_journal.exe)
- Use optimization_engine.extractors for displacement, stress, and mass extraction
- Displacement: extract_displacement() from pyNastran OP2
- Stress: extract_solid_stress() with cquad4 support (shell elements), kPa→MPa conversion
- Mass: extract_mass_from_expression() reads from temp file written by solve journal
- Support for iteration folders (HEEDS-style clean state between trials)
- Proper error handling with TrialResult(success=False, error_message=...)
- 600s timeout per trial (matching existing NXSolver default)
- Keep stub solver and create_solver() factory working
- Maintain run_doe.py interface compatibility
2026-02-10 23:26:51 +00:00
017b90f11e feat(hydrotech-beam): Phase 1 LHS DoE study code
Implements the optimization study code for Phase 1 (LHS DoE) of the
Hydrotech Beam structural optimization.

Files added:
- run_doe.py: Main entry point — Optuna study with SQLite persistence,
  Deb's feasibility rules, CSV/JSON export, Phase 1→2 gate check
- sampling.py: 50-point LHS via scipy.stats.qmc with stratified integer
  sampling ensuring all 11 hole_count levels (5-15) are covered
- geometric_checks.py: Pre-flight feasibility filter — hole overlap
  (corrected formula: span/(n-1) - d ≥ 30mm) and web clearance checks
- nx_interface.py: NX automation module with stub solver for development
  and NXOpen template for Windows/dalidou integration
- requirements.txt: optuna, scipy, numpy, pandas

Key design decisions:
- Baseline enqueued as Trial 0 (LAC lesson)
- All 4 DV expression names from binary introspection (exact spelling)
- Pre-flight geometric filter saves compute and prevents NX crashes
- No surrogates (LAC lesson: direct FEA via TPE beats surrogate+L-BFGS)
- SQLite persistence enables resume after interruption

Tested end-to-end with stub solver: 51 trials, 12 geometric rejects,
39 solved, correct CSV/JSON output.

Ref: OPTIMIZATION_STRATEGY.md, auditor review 2026-02-10
2026-02-10 22:15:06 +00:00
94bff37a67 Fix spacing formula (span/(n-1)), web height constraint, resolve audit blockers 2026-02-10 22:07:39 +00:00
3e5180485c Update optimization strategy with introspection-corrected baselines 2026-02-10 22:02:46 +00:00
15a457d2be KB introspection: corrected mass 1133 kg, DV baselines, full expression map from Beam.prt binary 2026-02-10 21:57:21 +00:00
b88657b00c KB Gen 002: Process KBS sessions, update model parameters
Sources: 3 KBS capture sessions (20260210-132817, 20260210-161401, 20260210-163801)

Key changes:
- Mass corrected: 974 kg (p173) → 11.33 kg (p1) — KBS ground truth
- Beam length confirmed: 5,000 mm cantilever
- BCs confirmed: left fixed, right 10,000 kgf downward
- Material confirmed: AISI Steel 1005, density 7.3 g/cm³
- Mesh confirmed: CQUAD4 thin shell, 33.7 mm elements
- Hole geometry: span 4,000 mm (p6), offsets 500 mm fixed
- 3 gaps closed (G1, G2, G8), 6 new gaps identified (G10-G15)
- New expressions: beam_half_height, beam_half_width, beam_length, p6

Files: CONTEXT.md, kb/_index.md, kb/_history.md, kb/components/sandwich-beam.md,
       kb/materials/steel-aisi.md, kb/fea/models/sol101-static.md, kb/dev/gen-002.md
2026-02-10 21:49:39 +00:00
3ab1cad4e1 auto: daily sync 2026-02-10 08:00:22 +00:00
857c01e7ca chore: major repo cleanup - remove dead code and cruft
Remove ~24K lines of dead code for a lean rebuild foundation:

- Remove atomizer-field/ (neural field predictor experiment, concept archived in docs)
- Remove generated_extractors/, generated_hooks/ (legacy generator outputs)
- Remove optimization_validation/ (empty skeleton)
- Remove reports/ (superseded by optimization_engine/reporting/)
- Remove root-level stale files: DEVELOPMENT.md, INSTALL_INSTRUCTIONS.md,
  config.py, atomizer_paths.py, optimization_config.json, train_neural.bat,
  generate_training_data.py, run_training_fea.py, migrate_imports.py
- Update .gitignore for introspection caches and insight outputs

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2026-02-09 14:26:37 -05:00
8d9d55356c docs: Archive stale docs and create Atomizer-HQ agent documentation
Archive Management:
- Moved RALPH_LOOP, CANVAS, and dashboard implementation plans to archive/review/ for CEO review
- Moved completed restructuring plan and protocol v1 to archive/historical/
- Moved old session summaries to archive/review/

New HQ Documentation (docs/hq/):
- README.md: Overview of Atomizer-HQ multi-agent optimization team
- PROJECT_STRUCTURE.md: Standard KB-integrated project layout with Hydrotech reference
- KB_CONVENTIONS.md: Knowledge Base accumulation principles with generation tracking
- AGENT_WORKFLOWS.md: Project lifecycle phases and agent handoffs (OP_09 integration)
- STUDY_CONVENTIONS.md: Technical study execution standards and atomizer_spec.json format

Index Update:
- Reorganized docs/00_INDEX.md with HQ docs prominent
- Updated structure to reflect new agent-focused organization
- Maintained core documentation access for engineers

No files deleted, only moved to appropriate archive locations.
2026-02-09 02:48:35 +00:00
9541958eae Restructure Hydrotech Beam project — KB-integrated layout
New project structure with knowledge base integration:
- kb/ with components, materials, fea, dev generations
- models/ for reference NX files (golden copies)
- studies/ for self-contained optimization campaigns
- deliverables/ for final outputs
- DECISIONS.md decision log (6 decisions tracked)
- BREAKDOWN.md (moved from 1_breakdown/)
- Gen 001 created from intake + technical breakdown

KB extension file: atomizer/shared/skills/knowledge-base-atomizer-ext.md

Refs: DEC-HB-004, DEC-HB-005, DEC-HB-006
2026-02-09 02:18:29 +00:00
ca4101dcb0 feat: improve optical report with embedded Plotly and 4x PNG export
- Embed Plotly.js inline for offline viewing (fixes CDN loading issues)
- Add 4x resolution PNG export for all charts via toImageButtonOptions
- Add SAT3_Trajectory_V7 study (TPE warm-start from V5, 86 trials, WS=277.37)
- Include V7 optimization report and configuration

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2026-02-08 19:29:34 -05:00
65711cdbf1 Add Hydrotech Beam project files - CONTEXT.md and TECHNICAL_BREAKDOWN.md
Project intake and technical breakdown for beam structural optimization.
4 design variables, SOL 101, single-objective (minimize mass).
2026-02-09 00:23:01 +00:00
a5059dd64a Add PSD figure generation script for CDR reports
Generates publication-ready PSD figures from OP2 FEA data:
- psd_multi_angle.png: PSD curves for all elevation angles
- psd_band_decomposition.png: LSF/MSF/HSF bar chart
- psd_40deg_composite.png: WFE surface + PSD side-by-side
- psd_trajectory.png: Band evolution vs elevation

Uses Atomizer's full OPD pipeline for consistency with CDR WFE numbers.
2026-02-06 17:38:48 +00:00
38d0994d29 Add WFE PSD analysis tools (Tony Hull methodology)
- tools/wfe_psd.py: Quick PSD computation for WFE surfaces
- optimization_engine/insights/wfe_psd.py: Full PSD module with band
  decomposition (LSF/MSF/HSF), radial averaging, Hann windowing,
  and visualization support
- knowledge_base/lac/session_insights/stopp_command_20260129.jsonl:
  Session insight from stopp command implementation

PSD analysis decomposes WFE into spatial frequency bands per Tony Hull's
JWST methodology. Used for CDR V7 to validate that MSF (support
print-through) dominates the residual WFE at 85-89% of total RMS.
2026-02-06 17:38:34 +00:00
5f5d55d107 fix(report): trajectory plots full-width instead of side-by-side
- Remove two-col grid wrapper from trajectory section
- Each plot now gets full container width
- Trajectory plot height 450→500, width 1100 for better readability
2026-01-30 00:06:10 +00:00
27d9dbee5b fix(psd): auto-scale x-axis to data range, improve plot layout
- X-axis now auto-ranges from data (was going to 10^21)
- Band annotations clamped to actual data extent
- Legend moved to upper-right (was overlapping data)
- Thicker lines (2.5px), larger axis labels
- dtick=1 for clean log-scale tick marks
2026-01-30 00:03:38 +00:00
12afd0c54f fix(psd): add angle labels to PSD band decomposition cards 2026-01-29 23:58:14 +00:00
a1000052cb fix(psd): correct normalization using Parseval band summation
- Band RMS now uses direct Parseval: sqrt(sum(|FFT|²) / N⁴ / hann_power)
- Previous approach had dimensional mismatch (cycles/apt vs cycles/mm)
- Results now match Zernike filtered RMS within ~10%:
  40° vs 20°: PSD=6.18nm vs Zernike=7.70nm
  60° vs 20°: PSD=15.83nm vs Zernike=17.69nm
  90° Abs: PSD=27.01nm vs Zernike=22.33nm
- PSD plot curve uses separate normalization (shape, not absolute)
- Refactored compute_surface_psd to return dict with freqs, psd, bands
2026-01-29 23:49:03 +00:00
eeacfbe41a feat(report): replace LSF/MSF with Tony Hull PSD analysis
- Remove compute_spatial_freq_metrics() and _spatial_freq_html()
- Add compute_surface_psd(): 2D FFT + Hann window + radial averaging
- Add compute_psd_band_rms(): gravity/support/HF band decomposition
- Add make_psd_plot(): interactive log-log PSD plot with band annotations
- Add _psd_summary_html(): band RMS cards with % breakdown
- New section in report: Power Spectral Density Analysis
- Zernike details now show only coefficient bar charts (cleaner)
- Methodology: Tony Hull JWST approach for WFE spatial frequency analysis
2026-01-29 22:15:42 +00:00
487ecf67dc feat(report): wider surface maps + spatial frequency band metrics
- CSS .plot-grid: minmax(650px) → minmax(1100px) for full-width surface maps
- Add compute_spatial_freq_metrics(): LSF/MSF band RMS, per-radial-order breakdown
- Add styled metrics cards in Zernike Coefficient Details (section 6)
  showing LSF (J4-J15), MSF (J16-J50), ratio, and per-order RMS n=2..9
2026-01-29 20:46:58 +00:00
faab234d05 fix: update Plotly.js CDN to 3.3.1 (match Python lib 6.5.2 bdata format), show 50 modes 2026-01-29 20:32:55 +00:00
c6427f3c6e fix: replace deprecated titlefont with title.font for Plotly compat 2026-01-29 20:20:01 +00:00
34b52f9543 Add comprehensive optical performance report generator
New tool: tools/generate_optical_report.py
- CDR-ready single HTML report from OP2 results
- Executive summary with pass/fail vs targets
- Per-angle WFE analysis with 3D surface plots
- Zernike trajectory analysis (mode-specific RMS)
- Axial vs lateral sensitivity matrix
- Manufacturing correction metrics
- Collapsible Zernike coefficient bar charts
- Optional study DB integration for design params
- Annular aperture support (default M1 inner R=135.75mm)
- Dark theme, interactive Plotly charts, print-friendly
2026-01-29 18:28:10 +00:00
7df18324b1 feat(extractors): add annular aperture support to trajectory extractor 2026-01-29 17:39:56 +00:00
abdbe9a708 fix: correct all baseline values from actual SAT3 model expression export
Previous baselines were from old V15 study, not from M1_Tensor best design.
Updated all 9 design variables with correct values from model introspection.

Baseline Corrections (from expression export):
- lateral_inner_angle: 26.79° → 30.18° (at upper bound)
- lateral_outer_angle: 14.64° → 15.09°
- lateral_outer_pivot: 5.5mm → 6.036mm (0.4 × 15.09°)
- lateral_inner_pivot: 10.07mm → 12.072mm (0.4 × 30.18°)
- lateral_middle_pivot: 20.73mm → 14.0mm (lower than expected)
- lateral_closeness: 11.02mm → 7.89mm
- whiffle_min: 40.55mm → 56.7mm
- inner_circular_rib_dia: 534.00mm → 537.86mm (fixed parameter)

Bound Adjustments:
- lateral_inner_pivot max: 11.0 → 13.0mm (to accommodate baseline 12.072)
- lateral_closeness min: 9.5 → 5.0mm (to accommodate baseline 7.89)

Root Cause:
- NX introspection failed (NX not running)
- Config was created with V15 study baselines as placeholders
- Actual model values now applied from user-provided expression export

Files Updated:
- optimization_config.json: All baselines corrected
- README.md: Design variable table updated
- STUDY_REPORT.md: Baseline values corrected

Co-Authored-By: Claude Sonnet 4.5 <noreply@anthropic.com>
2026-01-29 12:23:43 -05:00
b62605a736 refactor: update SAT3_Trajectory to 9 design variables with refined bounds
Updated configuration based on user adjustments:
- Reduced from 11 to 9 design variables (disabled blank_backface_angle and inner_circular_rib_dia)
- Refined parameter bounds for lateral supports

Design Variable Changes:
- lateral_inner_angle: min 20.0° (was 25.0°)
- lateral_outer_pivot: range 4.0-9.0mm, baseline 5.5mm (was 9.0-12.0mm, baseline 10.40mm)
- lateral_middle_pivot: range 12.0-25.0mm (was 15.0-27.0mm)
- blank_backface_angle: disabled (fixed at 4.00°)
- inner_circular_rib_dia: disabled (fixed at 534.00mm)

Documentation Updated:
- README.md: Updated design variable table with correct ranges and baselines
- STUDY_REPORT.md: Updated to reflect 9 enabled variables
- optimization_config.json: User-modified bounds applied

Rationale:
- Focus optimization on lateral supports and whiffle tree
- Fix geometry parameters to reduce search space
- Tighter bounds on critical lateral parameters

Co-Authored-By: Claude Sonnet 4.5 <noreply@anthropic.com>
2026-01-29 12:20:41 -05:00
f80b5d64a8 feat: create SAT3_Trajectory study with Zernike Trajectory Method
First production implementation of trajectory-based optimization for M1 mirror.

Study Configuration:
- Optimizer: TPE (100 trials, 15 startup)
- Primary objective: total_filtered_rms_nm (integrated RMS across 20-60 deg)
- Logged objectives: coma_rms_nm, astigmatism_rms_nm, trefoil_rms_nm, spherical_rms_nm
- Design variables: 11 (full wiffle tree + lateral supports)
- Physics validation: R² fit quality monitoring

Key Features:
- Mode-specific aberration tracking (coma, astigmatism, trefoil, spherical)
- Physics-based trajectory model: c_j(θ) = a_j·sin(θ) + b_j·cos(θ)
- Sensitivity analysis: axial vs lateral load contributions
- OPD correction with focal_length=22000mm
- Annular aperture (inner_radius=135.75mm)

Validation Results:
- Tested on existing M1_Tensor OP2: R²=1.0000 (perfect fit)
- Baseline total RMS: 4.30 nm
- All 5 angles auto-detected: [20, 30, 40, 50, 60] deg
- Dominant mode: spherical (10.51 nm)

Files Created:
- studies/M1_Mirror/SAT3_Trajectory/README.md (complete documentation)
- studies/M1_Mirror/SAT3_Trajectory/STUDY_REPORT.md (results template)
- studies/M1_Mirror/SAT3_Trajectory/run_optimization.py (TPE + trajectory extraction)
- studies/M1_Mirror/SAT3_Trajectory/1_setup/optimization_config.json (TPE config)
- studies/M1_Mirror/SAT3_Trajectory/1_setup/model/ (all NX files copied from M1_Tensor)
- test_trajectory_extractor.py (validation script)

References:
- Physics: docs/physics/ZERNIKE_TRAJECTORY_METHOD.md
- Handoff: docs/handoff/SETUP_TRAJECTORY_OPTIMIZATION.md
- Extractor: optimization_engine/extractors/extract_zernike_trajectory.py

Co-Authored-By: Claude Sonnet 4.5 <noreply@anthropic.com>
2026-01-29 12:10:02 -05:00
af195c3a75 docs: add handoff document for trajectory optimization setup 2026-01-29 16:46:55 +00:00
5d69b3bd10 docs: add Zernike trajectory method documentation + example config 2026-01-29 16:32:05 +00:00
5dec327988 fix(extractors): trajectory extractor working with auto angle detection + validation 2026-01-29 16:28:53 +00:00
99be370fad feat(extractors): add Zernike trajectory analysis for mode-specific optimization 2026-01-29 16:02:07 +00:00
d7986922d5 fix(tools): make Zernike OPD tools robust to extra subcases
- Replace brittle order-based subcase mapping with name-based search
- Tools now directly search for required angles (20, 40, 60, 90) by label
- Ignores extra subcases (e.g., 30, 50 degrees) without errors
- Falls back to numeric IDs (1,2,3,4) if angle labels not found
- Clear error messages show exactly which subcases are missing

This allows running WFE analysis on simulations with >4 subcases
without manual file/code modifications.

Co-Authored-By: Claude Sonnet 4.5 <noreply@anthropic.com>
2026-01-29 10:22:33 -05:00
a7039c5875 feat(draft): add local autosave + restore prompt + publish label 2026-01-29 03:16:31 +00:00
b3f3329c79 docs: update status + next sprint focus (Draft+Publish, Create Wizard) 2026-01-29 03:10:07 +00:00
f47b390ed7 feat(canvas): project edges from objective/constraint source 2026-01-29 03:01:47 +00:00
993c1ff17f feat(ui): edit objective/constraint source in panel + UNSET wiring 2026-01-29 02:49:04 +00:00
e2cfa0a3d9 feat(canvas): prompt for extractor output on connect 2026-01-29 02:45:15 +00:00
00dd88599e feat(canvas): sync objective/constraint source on edge connect/delete 2026-01-29 02:39:45 +00:00