Files
Atomizer/migrate_imports.py
Anto01 eabcc4c3ca refactor: Major reorganization of optimization_engine module structure
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>
2025-12-29 12:30:59 -05:00

209 lines
12 KiB
Python

#!/usr/bin/env python3
"""
optimization_engine Migration Script
=====================================
Automatically updates all imports across the codebase.
Usage:
python migrate_imports.py --dry-run # Preview changes
python migrate_imports.py --execute # Apply changes
"""
import os
import re
import sys
from pathlib import Path
from typing import Dict, List, Tuple
# Import mappings (old -> new) - using regex patterns
IMPORT_MAPPINGS = {
# =============================================================================
# CORE MODULE
# =============================================================================
r'from optimization_engine\.runner\b': 'from optimization_engine.core.runner',
r'from optimization_engine\.base_runner\b': 'from optimization_engine.core.base_runner',
r'from optimization_engine\.runner_with_neural\b': 'from optimization_engine.core.runner_with_neural',
r'from optimization_engine\.intelligent_optimizer\b': 'from optimization_engine.core.intelligent_optimizer',
r'from optimization_engine\.method_selector\b': 'from optimization_engine.core.method_selector',
r'from optimization_engine\.strategy_selector\b': 'from optimization_engine.core.strategy_selector',
r'from optimization_engine\.strategy_portfolio\b': 'from optimization_engine.core.strategy_portfolio',
r'from optimization_engine\.gradient_optimizer\b': 'from optimization_engine.core.gradient_optimizer',
r'import optimization_engine\.runner\b': 'import optimization_engine.core.runner',
r'import optimization_engine\.intelligent_optimizer\b': 'import optimization_engine.core.intelligent_optimizer',
# =============================================================================
# SURROGATES MODULE
# =============================================================================
r'from optimization_engine\.neural_surrogate\b': 'from optimization_engine.processors.surrogates.neural_surrogate',
r'from optimization_engine\.generic_surrogate\b': 'from optimization_engine.processors.surrogates.generic_surrogate',
r'from optimization_engine\.adaptive_surrogate\b': 'from optimization_engine.processors.surrogates.adaptive_surrogate',
r'from optimization_engine\.simple_mlp_surrogate\b': 'from optimization_engine.processors.surrogates.simple_mlp_surrogate',
r'from optimization_engine\.active_learning_surrogate\b': 'from optimization_engine.processors.surrogates.active_learning_surrogate',
r'from optimization_engine\.surrogate_tuner\b': 'from optimization_engine.processors.surrogates.surrogate_tuner',
r'from optimization_engine\.auto_trainer\b': 'from optimization_engine.processors.surrogates.auto_trainer',
r'from optimization_engine\.training_data_exporter\b': 'from optimization_engine.processors.surrogates.training_data_exporter',
# =============================================================================
# NX MODULE
# =============================================================================
r'from optimization_engine\.nx_solver\b': 'from optimization_engine.nx.solver',
r'from optimization_engine\.nx_updater\b': 'from optimization_engine.nx.updater',
r'from optimization_engine\.nx_session_manager\b': 'from optimization_engine.nx.session_manager',
r'from optimization_engine\.solve_simulation\b': 'from optimization_engine.nx.solve_simulation',
r'from optimization_engine\.solve_simulation_simple\b': 'from optimization_engine.nx.solve_simulation_simple',
r'from optimization_engine\.model_cleanup\b': 'from optimization_engine.nx.model_cleanup',
r'from optimization_engine\.export_expressions\b': 'from optimization_engine.nx.export_expressions',
r'from optimization_engine\.import_expressions\b': 'from optimization_engine.nx.import_expressions',
r'from optimization_engine\.mesh_converter\b': 'from optimization_engine.nx.mesh_converter',
r'import optimization_engine\.nx_solver\b': 'import optimization_engine.nx.solver',
r'import optimization_engine\.nx_updater\b': 'import optimization_engine.nx.updater',
# =============================================================================
# STUDY MODULE
# =============================================================================
r'from optimization_engine\.study_creator\b': 'from optimization_engine.study.creator',
r'from optimization_engine\.study_wizard\b': 'from optimization_engine.study.wizard',
r'from optimization_engine\.study_state\b': 'from optimization_engine.study.state',
r'from optimization_engine\.study_reset\b': 'from optimization_engine.study.reset',
r'from optimization_engine\.study_continuation\b': 'from optimization_engine.study.continuation',
r'from optimization_engine\.benchmarking_substudy\b': 'from optimization_engine.study.benchmarking',
r'from optimization_engine\.generate_history_from_trials\b': 'from optimization_engine.study.history_generator',
# =============================================================================
# REPORTING MODULE
# =============================================================================
r'from optimization_engine\.generate_report\b': 'from optimization_engine.reporting.report_generator',
r'from optimization_engine\.generate_report_markdown\b': 'from optimization_engine.reporting.markdown_report',
r'from optimization_engine\.comprehensive_results_analyzer\b': 'from optimization_engine.reporting.results_analyzer',
r'from optimization_engine\.visualizer\b': 'from optimization_engine.reporting.visualizer',
r'from optimization_engine\.landscape_analyzer\b': 'from optimization_engine.reporting.landscape_analyzer',
# =============================================================================
# CONFIG MODULE
# =============================================================================
r'from optimization_engine\.config_manager\b': 'from optimization_engine.config.manager',
r'from optimization_engine\.optimization_config_builder\b': 'from optimization_engine.config.builder',
r'from optimization_engine\.optimization_setup_wizard\b': 'from optimization_engine.config.setup_wizard',
r'from optimization_engine\.capability_matcher\b': 'from optimization_engine.config.capability_matcher',
r'from optimization_engine\.template_loader\b': 'from optimization_engine.config.template_loader',
# =============================================================================
# UTILS MODULE
# =============================================================================
r'from optimization_engine\.logger\b': 'from optimization_engine.utils.logger',
r'from optimization_engine\.auto_doc\b': 'from optimization_engine.utils.auto_doc',
r'from optimization_engine\.realtime_tracking\b': 'from optimization_engine.utils.realtime_tracking',
r'from optimization_engine\.codebase_analyzer\b': 'from optimization_engine.utils.codebase_analyzer',
r'from optimization_engine\.pruning_logger\b': 'from optimization_engine.utils.pruning_logger',
# =============================================================================
# FUTURE MODULE
# =============================================================================
r'from optimization_engine\.research_agent\b': 'from optimization_engine.future.research_agent',
r'from optimization_engine\.pynastran_research_agent\b': 'from optimization_engine.future.pynastran_research_agent',
r'from optimization_engine\.targeted_research_planner\b': 'from optimization_engine.future.targeted_research_planner',
r'from optimization_engine\.workflow_decomposer\b': 'from optimization_engine.future.workflow_decomposer',
r'from optimization_engine\.step_classifier\b': 'from optimization_engine.future.step_classifier',
r'from optimization_engine\.llm_optimization_runner\b': 'from optimization_engine.future.llm_optimization_runner',
r'from optimization_engine\.llm_workflow_analyzer\b': 'from optimization_engine.future.llm_workflow_analyzer',
# =============================================================================
# EXTRACTORS/VALIDATORS additions
# =============================================================================
r'from optimization_engine\.op2_extractor\b': 'from optimization_engine.extractors.op2_extractor',
r'from optimization_engine\.extractor_library\b': 'from optimization_engine.extractors.extractor_library',
r'from optimization_engine\.simulation_validator\b': 'from optimization_engine.validators.simulation_validator',
# =============================================================================
# PROCESSORS
# =============================================================================
r'from optimization_engine\.adaptive_characterization\b': 'from optimization_engine.processors.adaptive_characterization',
}
# Also need to handle utils submodule imports that moved
UTILS_MAPPINGS = {
r'from optimization_engine\.utils\.nx_session_manager\b': 'from optimization_engine.nx.session_manager',
}
# Combine all mappings
ALL_MAPPINGS = {**IMPORT_MAPPINGS, **UTILS_MAPPINGS}
def find_files(root: Path, extensions: List[str], exclude_dirs: List[str] = None) -> List[Path]:
"""Find all files with given extensions, excluding certain directories."""
if exclude_dirs is None:
exclude_dirs = ['optimization_engine_BACKUP', '.venv', 'node_modules', '__pycache__', '.git']
files = []
for ext in extensions:
for f in root.rglob(f'*{ext}'):
# Check if any excluded dir is in the path
if not any(excl in str(f) for excl in exclude_dirs):
files.append(f)
return files
def update_file(filepath: Path, mappings: Dict[str, str], dry_run: bool = True) -> Tuple[int, List[str]]:
"""Update imports in a single file."""
try:
content = filepath.read_text(encoding='utf-8', errors='ignore')
except Exception as e:
print(f" ERROR reading {filepath}: {e}")
return 0, []
changes = []
new_content = content
for pattern, replacement in mappings.items():
matches = re.findall(pattern, content)
if matches:
new_content = re.sub(pattern, replacement, new_content)
changes.append(f" {pattern} -> {replacement} ({len(matches)} occurrences)")
if changes and not dry_run:
filepath.write_text(new_content, encoding='utf-8')
return len(changes), changes
def main():
dry_run = '--dry-run' in sys.argv or '--execute' not in sys.argv
if dry_run:
print("=" * 60)
print("DRY RUN MODE - No files will be modified")
print("=" * 60)
else:
print("=" * 60)
print("EXECUTE MODE - Files will be modified!")
print("=" * 60)
confirm = input("Are you sure? (yes/no): ")
if confirm.lower() != 'yes':
print("Aborted.")
return
root = Path('.')
# Find all Python files
py_files = find_files(root, ['.py'])
print(f"\nFound {len(py_files)} Python files to check")
total_changes = 0
files_changed = 0
for filepath in sorted(py_files):
count, changes = update_file(filepath, ALL_MAPPINGS, dry_run)
if count > 0:
files_changed += 1
total_changes += count
print(f"\n{filepath} ({count} changes):")
for change in changes:
print(change)
print("\n" + "=" * 60)
print(f"SUMMARY: {total_changes} changes in {files_changed} files")
print("=" * 60)
if dry_run:
print("\nTo apply changes, run: python migrate_imports.py --execute")
if __name__ == '__main__':
main()