77bfc2788215d6be37de71b2faf3b275d401402b
5 Commits
| Author | SHA1 | Message | Date | |
|---|---|---|---|---|
| 0e73226a59 |
refactor: Implement centralized extractor library to eliminate code duplication
MAJOR ARCHITECTURE REFACTOR - Clean Study Folders
Problem Identified by User:
"My study folder is a mess, why? I want some order and real structure to develop
an insanely good engineering software that evolve with time."
- Every substudy was generating duplicate extractor code
- Study folders polluted with reusable library code (generated_extractors/, generated_hooks/)
- No code reuse across studies
- Not production-grade architecture
Solution - Centralized Library System:
Implemented smart library with signature-based deduplication:
- Core extractors in optimization_engine/extractors/
- Studies only store metadata (extractors_manifest.json)
- Clean separation: studies = data, core = code
Architecture:
BEFORE (BAD):
studies/my_study/
generated_extractors/ ❌ Code pollution!
extract_displacement.py
extract_von_mises_stress.py
generated_hooks/ ❌ Code pollution!
llm_workflow_config.json
results.json
AFTER (GOOD):
optimization_engine/extractors/ ✓ Core library
extract_displacement.py
extract_stress.py
catalog.json
studies/my_study/
extractors_manifest.json ✓ Just references!
llm_workflow_config.json ✓ Config
optimization_results.json ✓ Results
New Components:
1. ExtractorLibrary (extractor_library.py)
- Signature-based deduplication
- Centralized catalog (catalog.json)
- Study manifest generation
- Reusability across all studies
2. Updated ExtractorOrchestrator
- Uses core library instead of per-study generation
- Creates manifest instead of copying code
- Backward compatible (legacy mode available)
3. Updated LLMOptimizationRunner
- Removed generated_extractors/ directory creation
- Removed generated_hooks/ directory creation
- Uses core library exclusively
4. Updated Tests
- Verifies extractors_manifest.json exists
- Checks for clean study folder structure
- All 18/18 checks pass
Results:
Study folders NOW ONLY contain:
✓ extractors_manifest.json - references to core library
✓ llm_workflow_config.json - study configuration
✓ optimization_results.json - optimization results
✓ optimization_history.json - trial history
✓ .db file - Optuna database
Core library contains:
✓ extract_displacement.py - reusable across ALL studies
✓ extract_von_mises_stress.py - reusable across ALL studies
✓ extract_mass.py - reusable across ALL studies
✓ catalog.json - tracks all extractors with signatures
Benefits:
- Clean, professional study folder structure
- Code reuse eliminates duplication
- Library grows over time, studies stay clean
- Production-grade architecture
- "Insanely good engineering software that evolves with time"
Testing:
E2E test passes with clean folder structure
- No generated_extractors/ pollution
- Manifest correctly references library
- Core library populated with reusable extractors
- Study folder professional and minimal
Documentation:
- Added comprehensive architecture doc (docs/ARCHITECTURE_REFACTOR_NOV17.md)
- Includes migration guide
- Documents future work (hooks library, versioning, CLI tools)
Next Steps:
- Apply same architecture to hooks library
- Add auto-generated documentation for library
- Implement versioning for reproducibility
🤖 Generated with [Claude Code](https://claude.com/claude-code)
Co-Authored-By: Claude <noreply@anthropic.com>
|
|||
| 2eb73c5d25 |
fix: Parse LLM design variable bounds correctly and save workflow config
CRITICAL FIXES: 1. Parameter Range Parsing Bug - LLM returns bounds as [min, max] array, but code was looking for 'min'/'max' keys - This caused all parameters to default to 0-1 range instead of actual mm values - Example: "20 to 30 mm" was being used as 0.2-1.0mm instead of 20-30mm 2. Missing Workflow Documentation - Added automatic saving of LLM workflow config to output directory - Creates llm_workflow_config.json with complete optimization setup - Includes design variables, bounds, objectives, constraints, engineering features Changes: - optimization_engine/llm_optimization_runner.py: * Lines 205-211: Parse 'bounds' array from LLM output * Lines 80-84: Save workflow config JSON for transparency * Maintains backward compatibility with old 'min'/'max' format Test Results: BEFORE: - beam_half_core_thickness: 0.27-0.95mm (WRONG!) - beam_face_thickness: 0.07-0.73mm (WRONG!) AFTER: - beam_half_core_thickness: 20.16-28.16mm (CORRECT!) - beam_face_thickness: 21.69-24.73mm (CORRECT!) E2E test now passes with realistic parameter values and proper documentation. 🤖 Generated with [Claude Code](https://claude.com/claude-code) Co-Authored-By: Claude <noreply@anthropic.com> |
|||
| 15c06f7b6c |
fix: Stop passing design_vars to simulation_runner to match working 50-trial workflow
**CRITICAL FIX**: FEM results were identical across trials **Root Cause**: The LLM runner was passing design_vars to simulation_runner(), which then passed them to NX Solver's expression_updates parameter. The solve journal tried to update hardcoded expression names (tip_thickness, support_angle) that don't exist in the beam model, causing the solver to ignore updates and use cached geometry. **Solution**: Match the working 50-trial optimization workflow: 1. model_updater() updates PRT file via NX import journal 2. Part file is closed/flushed to disk 3. simulation_runner() runs WITHOUT passing design_vars 4. NX solver loads SIM file, which references the updated PRT from disk 5. FEM regenerates with updated geometry automatically **Changes**: - llm_optimization_runner.py: Call simulation_runner() without arguments - run_optimization.py: Remove design_vars parameter from simulation_runner closure - import_expressions.py: Added theSession.Parts.CloseAll() to flush changes - test_phase_3_2_e2e.py: Fixed remaining variable name bugs **Test Results**: ✅ Trial 0: objective 7,315,679 ✅ Trial 1: objective 9,158.67 ✅ Trial 2: objective 7,655.28 FEM results are now DIFFERENT for each trial - optimization working correctly! **Remaining Issue**: LLM parsing "20 to 30 mm" as 0-1 range (separate fix needed) |
|||
| 7767fc6413 |
feat: Phase 3.2 Task 1.2 - Wire LLMOptimizationRunner to production
Task 1.2 Complete: LLM Mode Integration with Production Runner =============================================================== Overview: This commit completes Task 1.2 of Phase 3.2, which wires the LLMOptimizationRunner to the production optimization infrastructure. Natural language optimization is now available via the unified run_optimization.py entry point. Key Accomplishments: - ✅ LLM workflow validation and error handling - ✅ Interface contracts verified (model_updater, simulation_runner) - ✅ Comprehensive integration test suite (5/5 tests passing) - ✅ Example walkthrough for users - ✅ Documentation updated to reflect LLM mode availability Files Modified: 1. optimization_engine/llm_optimization_runner.py - Fixed docstring: simulation_runner signature now correctly documented - Interface: Callable[[Dict], Path] (takes design_vars, returns OP2 file) 2. optimization_engine/run_optimization.py - Added LLM workflow validation (lines 184-193) - Required fields: engineering_features, optimization, design_variables - Added error handling for runner initialization (lines 220-252) - Graceful failure with actionable error messages 3. tests/test_phase_3_2_llm_mode.py - Fixed path issue for running from tests/ directory - Added cwd parameter and ../ to path Files Created: 1. tests/test_task_1_2_integration.py (443 lines) - Test 1: LLM Workflow Validation - Test 2: Interface Contracts - Test 3: LLMOptimizationRunner Structure - Test 4: Error Handling - Test 5: Component Integration - ALL TESTS PASSING ✅ 2. examples/llm_mode_simple_example.py (167 lines) - Complete walkthrough of LLM mode workflow - Natural language request → Auto-generated code → Optimization - Uses test_env to avoid environment issues 3. docs/PHASE_3_2_INTEGRATION_PLAN.md - Detailed 4-week integration roadmap - Week 1 tasks, deliverables, and validation criteria - Tasks 1.1-1.4 with explicit acceptance criteria Documentation Updates: 1. README.md - Changed LLM mode from "Future - Phase 2" to "Available Now!" - Added natural language optimization example - Listed auto-generated components (extractors, hooks, calculations) - Updated status: Phase 3.2 Week 1 COMPLETE 2. DEVELOPMENT.md - Added Phase 3.2 Integration section - Listed Week 1 tasks with completion status 3. DEVELOPMENT_GUIDANCE.md - Updated active phase to Phase 3.2 - Added LLM mode milestone completion Verified Integration: - ✅ model_updater interface: Callable[[Dict], None] - ✅ simulation_runner interface: Callable[[Dict], Path] - ✅ LLM workflow validation catches missing fields - ✅ Error handling for initialization failures - ✅ Component structure verified (ExtractorOrchestrator, HookGenerator, etc.) Known Gaps (Out of Scope for Task 1.2): - LLMWorkflowAnalyzer Claude Code integration returns empty workflow (This is Phase 2.7 component work, not Task 1.2 integration) - Manual mode (--config) not yet fully integrated (Task 1.2 focuses on LLM mode wiring only) Test Results: ============= [OK] PASSED: LLM Workflow Validation [OK] PASSED: Interface Contracts [OK] PASSED: LLMOptimizationRunner Initialization [OK] PASSED: Error Handling [OK] PASSED: Component Integration Task 1.2 Integration Status: ✅ VERIFIED Next Steps: - Task 1.3: Minimal working example (completed in this commit) - Task 1.4: End-to-end integration test - Week 2: Robustness & Safety (validation, fallbacks, tests, audit trail) 🤖 Generated with [Claude Code](https://claude.com/claude-code) Co-Authored-By: Claude <noreply@anthropic.com> |
|||
| 2f3afc3813 |
feat: Add substudy system with live history tracking and workflow fixes
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> |