| name | migrate-module |
| description | Migrate Python modules from SDR_stochastic research code to vrp-toolkit architecture. Use when migrating files from the old codebase structure to the new three-layer architecture (Problem/Algorithm/Data layers), refactoring paper-specific code into generic implementations, or converting research notebooks into educational tutorials. |
Migrate Module
Automate the migration of research code modules from the SDR_stochastic project into the reusable vrp-toolkit architecture.
Migration Workflow
Step 1: Identify and Plan
Determine the module to migrate
- Check migration_map.md for file mappings
- Identify source file in
/SDR_stochastic/new version/ - Note the destination path and refactoring requirements
Read and analyze the source code
- Read the entire source file
- Identify dependencies and imports
- Note any paper-specific hardcoded values
- Understand the module's purpose and interface
Step 2: Refactor for Generalization
Extract hardcoded values
- Identify magic numbers, file paths, dataset names
- Convert to function parameters or config objects
- Common patterns: battery capacity, time windows, location names
Example transformation:
# Before def solve(): capacity = 100 # Hardcoded # After def solve(capacity: float = 100):Decouple architecture layers
- Separate problem definitions from algorithms
- Extract algorithm-specific code to appropriate layer
- Follow interfaces in architecture.md
Generalize data structures
- Replace paper-specific types with generic abstractions
- Ensure compatibility with
Instance,Solution,Solverinterfaces
Step 3: Implement in New Location
Create or update the destination file
- Place code in the correct layer (Problem/Algorithm/Data)
- Follow vrp-toolkit directory structure
- Use appropriate naming conventions (see architecture guide)
Add documentation
- Add docstrings to public functions/classes
- Use Google or NumPy docstring style
- Include parameters, return values, and examples
def solve_pdptw(instance: PDPTWInstance, config: ALNSConfig) -> Solution: """Solve PDPTW using ALNS algorithm. Args: instance: Problem instance to solve config: Algorithm configuration parameters Returns: Solution object containing routes and objective value """Update imports
- Change import paths to new package structure
- Use relative imports within vrp_toolkit
- Update any external dependencies
Step 4: Create Test Case
Create a simple test to verify functionality:
def test_basic_functionality():
"""Basic smoke test for migrated module"""
# Create minimal instance
instance = create_test_instance()
# Run migrated function
result = migrated_function(instance)
# Verify basic properties
assert result is not None
assert result.is_feasible()
Step 5: Verify Migration
Check imports resolve correctly
- Try importing the new module
- Verify no circular dependencies
Run the test case
- Ensure basic functionality works
- Compare behavior with original code if needed
Verify architectural compliance
- Check layer separation (no Problem code in Algorithm layer, etc.)
- Ensure following the Solver/Instance/Solution interfaces
Special Cases
Migrating Jupyter Notebooks
When migrating .ipynb files to tutorials:
Clean up for educational clarity
- Add markdown explanations between code cells
- Remove debugging/experimental code
- Structure: Problem → Setup → Solve → Visualize → Interpret
Ensure reproducibility
- Keep examples runnable in <30 seconds
- Use small test instances
- Include all necessary imports
Follow tutorial naming convention
- Format:
0X_descriptive_name.ipynb - Update README with tutorial description
- Format:
Merging Multiple Files
When multiple source files map to one destination (e.g., order_info.py + demands.py → generators.py):
- Identify common functionality
- Create unified interface
- Preserve all unique features from each source
- Organize as separate classes or functions within the same module
Key References
- File mappings: See migration_map.md
- Architecture patterns: See architecture.md
- Project guidelines: See
CLAUDE.mdin project root
Design Principles
- ✅ Minimal viable clarity over perfection
- ✅ Generalize from specific to reusable
- ✅ Decouple layers cleanly
- ❌ No over-engineering before 2+ use cases
- ❌ No documentation before code works