79 lines
2.2 KiB
Python
79 lines
2.2 KiB
Python
|
|
"""
|
||
|
|
Optimization-Level Logger Hook - Results
|
||
|
|
|
||
|
|
Appends trial results to the high-level optimization.log file.
|
||
|
|
|
||
|
|
Hook Point: post_extraction
|
||
|
|
"""
|
||
|
|
|
||
|
|
from pathlib import Path
|
||
|
|
from datetime import datetime
|
||
|
|
from typing import Dict, Any, Optional
|
||
|
|
import logging
|
||
|
|
|
||
|
|
logger = logging.getLogger(__name__)
|
||
|
|
|
||
|
|
|
||
|
|
def log_optimization_results(context: Dict[str, Any]) -> Optional[Dict[str, Any]]:
|
||
|
|
"""
|
||
|
|
Append trial results to the main optimization.log file.
|
||
|
|
|
||
|
|
This hook completes the trial entry in the high-level log with:
|
||
|
|
- Objective values
|
||
|
|
- Constraint evaluations
|
||
|
|
- Trial outcome (feasible/infeasible)
|
||
|
|
|
||
|
|
Args:
|
||
|
|
context: Hook context containing:
|
||
|
|
- trial_number: Current trial number
|
||
|
|
- extracted_results: Dict of all extracted objectives and constraints
|
||
|
|
- result_path: Path to result file
|
||
|
|
|
||
|
|
Returns:
|
||
|
|
None (logging only)
|
||
|
|
"""
|
||
|
|
trial_num = context.get('trial_number', '?')
|
||
|
|
extracted_results = context.get('extracted_results', {})
|
||
|
|
result_path = context.get('result_path', '')
|
||
|
|
|
||
|
|
# Get the output directory from context (passed by runner)
|
||
|
|
output_dir = Path(context.get('output_dir', 'optimization_results'))
|
||
|
|
log_file = output_dir / 'optimization.log'
|
||
|
|
|
||
|
|
if not log_file.exists():
|
||
|
|
logger.warning(f"Optimization log file not found: {log_file}")
|
||
|
|
return None
|
||
|
|
|
||
|
|
# Find the last line for this trial and append results
|
||
|
|
with open(log_file, 'a') as f:
|
||
|
|
timestamp = datetime.now().strftime('%H:%M:%S')
|
||
|
|
|
||
|
|
# Extract objective and constraint values
|
||
|
|
results_str = " | ".join([f"{name}={value:.3f}" for name, value in extracted_results.items()])
|
||
|
|
|
||
|
|
f.write(f"[{timestamp}] Trial {trial_num:3d} COMPLETE | {results_str}\n")
|
||
|
|
|
||
|
|
return None
|
||
|
|
|
||
|
|
|
||
|
|
def register_hooks(hook_manager):
|
||
|
|
"""
|
||
|
|
Register this plugin's hooks with the manager.
|
||
|
|
|
||
|
|
This function is called automatically when the plugin is loaded.
|
||
|
|
"""
|
||
|
|
hook_manager.register_hook(
|
||
|
|
hook_point='post_extraction',
|
||
|
|
function=log_optimization_results,
|
||
|
|
description='Append trial results to optimization.log',
|
||
|
|
name='optimization_logger_results',
|
||
|
|
priority=100
|
||
|
|
)
|
||
|
|
|
||
|
|
|
||
|
|
# Hook metadata
|
||
|
|
HOOK_NAME = "optimization_logger_results"
|
||
|
|
HOOK_POINT = "post_extraction"
|
||
|
|
ENABLED = True
|
||
|
|
PRIORITY = 100
|