import os import shutil from pathlib import Path def merge_distributed_data(): """ Merge split results from vps_results/pi_results and vps_bestweights/pi_bestweights into central 'results/' and 'bestweights/' directories for plotting and evaluation. """ base_dir = Path(".") # Define source and destination pairs # (Source Directory, Central Destination) mapping = [ (base_dir / "results" / "vps_results", base_dir / "results"), (base_dir / "results" / "pi_results", base_dir / "results"), (base_dir / "bestweights" / "vps_bestweights", base_dir / "bestweights"), (base_dir / "bestweights" / "pi_bestweights", base_dir / "bestweights"), ] print("Starting Distributed Results Merge...") for src_parent, dest_parent in mapping: if not src_parent.exists(): print(f"Skipping: Source directory {src_parent} does not exist.") continue print(f"📁 Scanning {src_parent} ...") # Each child in src_parent is a Session ID (e.g., 2026-04-06_16-40-02) for session_dir in src_parent.iterdir(): if not session_dir.is_dir(): continue session_id = session_dir.name dest_session_path = dest_parent / session_id print(f" Merging Session: {session_id}") # Recursive sync sync_directories(session_dir, dest_session_path) print("\n All sessions merged! You can now run 'make evaluate' or 'make plot-session'.") def sync_directories(src: Path, dest: Path): """Deeply merge src into dest without deleting existing files in dest.""" dest.mkdir(parents=True, exist_ok=True) for item in src.iterdir(): if item.is_dir(): sync_directories(item, dest / item.name) else: # Use copy2 to preserve metadata (timestamps) if possible shutil.copy2(item, dest / item.name) if __name__ == "__main__": merge_distributed_data()