Files
Atomizer/generated_hooks/hook_constraint_yield_constraint.py
Anto01 38abb0d8d2 feat: Complete Phase 3 - pyNastran Documentation Integration
Phase 3 implements automated OP2 extraction code generation using
pyNastran documentation research. This completes the zero-manual-coding
pipeline for FEA optimization workflows.

Key Features:
- PyNastranResearchAgent for automated OP2 code generation
- Documentation research via WebFetch integration
- 3 core extraction patterns (displacement, stress, force)
- Knowledge base architecture for learned patterns
- Successfully tested on real OP2 files

Phase 2.9 Integration:
- Updated HookGenerator with lifecycle hook generation
- Added POST_CALCULATION hook point to hooks.py
- Created post_calculation/ plugin directory
- Generated hooks integrate seamlessly with HookManager

New Files:
- optimization_engine/pynastran_research_agent.py (600+ lines)
- optimization_engine/hook_generator.py (800+ lines)
- optimization_engine/inline_code_generator.py
- optimization_engine/plugins/post_calculation/
- tests/test_lifecycle_hook_integration.py
- docs/SESSION_SUMMARY_PHASE_3.md
- docs/SESSION_SUMMARY_PHASE_2_9.md
- docs/SESSION_SUMMARY_PHASE_2_8.md
- docs/HOOK_ARCHITECTURE.md

Modified Files:
- README.md - Added Phase 3 completion status
- optimization_engine/plugins/hooks.py - Added POST_CALCULATION hook

Test Results:
- Phase 3 research agent: PASSED
- Real OP2 extraction: PASSED (max_disp=0.362mm)
- Lifecycle hook integration: PASSED

Generated with Claude Code

Co-Authored-By: Claude <noreply@anthropic.com>
2025-11-16 16:33:48 -05:00

84 lines
2.0 KiB
Python

"""
Constraint Check Hook
Auto-generated by Atomizer Phase 2.9
Check if stress is below yield
Constraint: max_stress / yield_strength
Threshold: 1.0
"""
import sys
import json
from pathlib import Path
def check_yield_constraint(max_stress, yield_strength):
"""
Check constraint condition.
Args:
max_stress: float
yield_strength: float
Returns:
tuple: (satisfied: bool, value: float, violation: float)
"""
value = max_stress / yield_strength
satisfied = value <= 1.0
violation = max(0.0, value - 1.0)
return satisfied, value, violation
def main():
"""Main entry point for hook execution."""
if len(sys.argv) < 2:
print("Usage: python {} <input_file.json>".format(sys.argv[0]))
sys.exit(1)
input_file = Path(sys.argv[1])
# Read inputs
with open(input_file, 'r') as f:
inputs = json.load(f)
# Extract required inputs
max_stress = inputs.get("max_stress")
if max_stress is None:
print(f"Error: Required input 'max_stress' not found")
sys.exit(1)
yield_strength = inputs.get("yield_strength")
if yield_strength is None:
print(f"Error: Required input 'yield_strength' not found")
sys.exit(1)
# Check constraint
satisfied, value, violation = check_yield_constraint(max_stress, yield_strength)
# Write output
output_file = input_file.parent / "yield_constraint_check.json"
output = {
"constraint_name": "yield_constraint",
"satisfied": satisfied,
"value": value,
"threshold": 1.0,
"violation": violation,
"inputs_used": {"max_stress": max_stress, "yield_strength": yield_strength}
}
with open(output_file, 'w') as f:
json.dump(output, f, indent=2)
status = "SATISFIED" if satisfied else "VIOLATED"
print(f"Constraint {status}: {value:.6f} (threshold: 1.0)")
if not satisfied:
print(f"Violation: {violation:.6f}")
print(f"Result saved to: {output_file}")
return value
if __name__ == '__main__':
main()