BREAKING CHANGE: Module paths have been reorganized for better maintainability. Backwards compatibility aliases with deprecation warnings are provided. New Structure: - core/ - Optimization runners (runner, intelligent_optimizer, etc.) - processors/ - Data processing - surrogates/ - Neural network surrogates - nx/ - NX/Nastran integration (solver, updater, session_manager) - study/ - Study management (creator, wizard, state, reset) - reporting/ - Reports and analysis (visualizer, report_generator) - config/ - Configuration management (manager, builder) - utils/ - Utilities (logger, auto_doc, etc.) - future/ - Research/experimental code Migration: - ~200 import changes across 125 files - All __init__.py files use lazy loading to avoid circular imports - Backwards compatibility layer supports old import paths with warnings - All existing functionality preserved To migrate existing code: OLD: from optimization_engine.nx_solver import NXSolver NEW: from optimization_engine.nx.solver import NXSolver OLD: from optimization_engine.runner import OptimizationRunner NEW: from optimization_engine.core.runner import OptimizationRunner 🤖 Generated with [Claude Code](https://claude.com/claude-code) Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
169 lines
5.8 KiB
Python
169 lines
5.8 KiB
Python
"""
|
|
Test Optimization Setup Wizard - Phase 3.3
|
|
|
|
This test demonstrates the complete validation workflow:
|
|
1. Introspect model for expressions
|
|
2. Run baseline simulation
|
|
3. Introspect OP2 for element types
|
|
4. Validate complete pipeline
|
|
5. Report readiness for optimization
|
|
|
|
This prevents wasted time on optimizations that will fail!
|
|
"""
|
|
|
|
import sys
|
|
from pathlib import Path
|
|
|
|
sys.path.insert(0, str(Path(__file__).parent.parent))
|
|
|
|
from optimization_engine.config.setup_wizard import OptimizationSetupWizard
|
|
|
|
|
|
if __name__ == '__main__':
|
|
print("=" * 80)
|
|
print("Phase 3.3: Optimization Setup Wizard Test")
|
|
print("=" * 80)
|
|
print()
|
|
print("This wizard validates the optimization pipeline BEFORE running trials.")
|
|
print("It will:")
|
|
print(" 1. Introspect NX model for available expressions")
|
|
print(" 2. Run baseline simulation to generate OP2")
|
|
print(" 3. Introspect OP2 to detect element types and results")
|
|
print(" 4. Validate extraction/calculation/hook pipeline")
|
|
print(" 5. Report readiness for optimization")
|
|
print()
|
|
|
|
# Configuration
|
|
prt_file = Path("tests/Bracket.prt")
|
|
sim_file = Path("tests/Bracket_sim1.sim")
|
|
|
|
if not prt_file.exists():
|
|
print(f"ERROR: Part file not found: {prt_file}")
|
|
sys.exit(1)
|
|
|
|
if not sim_file.exists():
|
|
print(f"ERROR: Simulation file not found: {sim_file}")
|
|
sys.exit(1)
|
|
|
|
print(f"Part file: {prt_file}")
|
|
print(f"Sim file: {sim_file}")
|
|
print()
|
|
|
|
try:
|
|
# Initialize wizard
|
|
print("Initializing Optimization Setup Wizard...")
|
|
wizard = OptimizationSetupWizard(prt_file, sim_file)
|
|
print(" Wizard initialized!")
|
|
print()
|
|
|
|
# Define optimization goal
|
|
user_goal = "Maximize displacement while keeping stress below yield/4 (safety factor >= 4.0)"
|
|
|
|
# Custom workflow with safety factor constraint
|
|
llm_workflow = {
|
|
'engineering_features': [
|
|
{
|
|
'action': 'extract_displacement',
|
|
'domain': 'result_extraction',
|
|
'description': 'Extract displacement results from OP2 file',
|
|
'params': {'result_type': 'displacement'}
|
|
},
|
|
{
|
|
'action': 'extract_solid_stress',
|
|
'domain': 'result_extraction',
|
|
'description': 'Extract von Mises stress from solid elements',
|
|
'params': {
|
|
'result_type': 'stress',
|
|
'element_type': 'chexa' # Will be auto-detected
|
|
}
|
|
}
|
|
],
|
|
'inline_calculations': [
|
|
{
|
|
'action': 'calculate_safety_factor',
|
|
'params': {
|
|
'input': 'max_von_mises',
|
|
'yield_strength': 276.0, # MPa for Aluminum 6061-T6
|
|
'operation': 'divide'
|
|
},
|
|
'code_hint': 'safety_factor = 276.0 / max_von_mises'
|
|
},
|
|
{
|
|
'action': 'negate_displacement',
|
|
'params': {
|
|
'input': 'max_displacement',
|
|
'operation': 'negate'
|
|
},
|
|
'code_hint': 'neg_displacement = -max_displacement'
|
|
}
|
|
],
|
|
'post_processing_hooks': [] # Using manual safety_factor_constraint hook
|
|
}
|
|
|
|
# Run complete validation
|
|
print("=" * 80)
|
|
print("RUNNING COMPLETE VALIDATION WORKFLOW")
|
|
print("=" * 80)
|
|
print()
|
|
|
|
success, validation_results = wizard.run_complete_validation(
|
|
user_goal=user_goal,
|
|
llm_workflow=llm_workflow
|
|
)
|
|
|
|
print()
|
|
print("=" * 80)
|
|
print("VALIDATION COMPLETE")
|
|
print("=" * 80)
|
|
print()
|
|
|
|
if success:
|
|
print("[SUCCESS] ALL VALIDATIONS PASSED!")
|
|
print()
|
|
print("Pipeline is ready for optimization. Key findings:")
|
|
print()
|
|
|
|
# Show model expressions
|
|
if wizard.model_info:
|
|
print(f"Model Expressions ({len(wizard.model_info.expressions)}):")
|
|
for name, info in wizard.model_info.expressions.items():
|
|
print(f" - {name}: {info['value']} {info['units']}")
|
|
print()
|
|
|
|
# Show OP2 contents
|
|
if wizard.op2_info:
|
|
print(f"OP2 Contents:")
|
|
print(f" - Element types: {', '.join(wizard.op2_info.element_types)}")
|
|
print(f" - Result types: {', '.join(wizard.op2_info.result_types)}")
|
|
print(f" - Subcases: {wizard.op2_info.subcases}")
|
|
print(f" - Nodes: {wizard.op2_info.node_count}")
|
|
print(f" - Elements: {wizard.op2_info.element_count}")
|
|
print()
|
|
|
|
# Show validation summary
|
|
print(f"Validation Summary:")
|
|
for result in validation_results:
|
|
if result.success:
|
|
print(f" {result.message}")
|
|
print()
|
|
|
|
print("[OK] You can now start the optimization with confidence!")
|
|
print(" The system has verified that all pipeline components work correctly.")
|
|
|
|
else:
|
|
print("[FAILED] VALIDATION FAILED!")
|
|
print()
|
|
print("Issues found:")
|
|
for result in validation_results:
|
|
if not result.success:
|
|
print(f" [ERROR] {result.message}")
|
|
print()
|
|
print("Please fix these issues before starting optimization.")
|
|
sys.exit(1)
|
|
|
|
except Exception as e:
|
|
print(f"\nERROR during validation: {e}")
|
|
import traceback
|
|
traceback.print_exc()
|
|
sys.exit(1)
|