Load the database from disk Args: path: Path to load from
(self, path: str)
| 637 | logger.info(f"Saved database with {len(self.programs)} programs to {save_path}") |
| 638 | |
| 639 | def load(self, path: str) -> None: |
| 640 | """ |
| 641 | Load the database from disk |
| 642 | |
| 643 | Args: |
| 644 | path: Path to load from |
| 645 | """ |
| 646 | if not os.path.exists(path): |
| 647 | logger.warning(f"Database path {path} does not exist, skipping load") |
| 648 | return |
| 649 | |
| 650 | # Load metadata first |
| 651 | metadata_path = os.path.join(path, "metadata.json") |
| 652 | saved_islands = [] |
| 653 | if os.path.exists(metadata_path): |
| 654 | with open(metadata_path, "r") as f: |
| 655 | metadata = json.load(f) |
| 656 | |
| 657 | self.island_feature_maps = metadata.get( |
| 658 | "island_feature_maps", [{} for _ in range(self.config.num_islands)] |
| 659 | ) |
| 660 | saved_islands = metadata.get("islands", []) |
| 661 | self.archive = set(metadata.get("archive", [])) |
| 662 | self.best_program_id = metadata.get("best_program_id") |
| 663 | self.island_best_programs = metadata.get( |
| 664 | "island_best_programs", [None] * len(saved_islands) |
| 665 | ) |
| 666 | self.last_iteration = metadata.get("last_iteration", 0) |
| 667 | self.current_island = metadata.get("current_island", 0) |
| 668 | self.island_generations = metadata.get("island_generations", [0] * len(saved_islands)) |
| 669 | self.last_migration_generation = metadata.get("last_migration_generation", 0) |
| 670 | |
| 671 | # Load feature_stats for MAP-Elites grid stability |
| 672 | self.feature_stats = self._deserialize_feature_stats(metadata.get("feature_stats", {})) |
| 673 | |
| 674 | logger.info(f"Loaded database metadata with last_iteration={self.last_iteration}") |
| 675 | if self.feature_stats: |
| 676 | logger.info(f"Loaded feature_stats for {len(self.feature_stats)} dimensions") |
| 677 | |
| 678 | # Load programs |
| 679 | programs_dir = os.path.join(path, "programs") |
| 680 | if os.path.exists(programs_dir): |
| 681 | for program_file in os.listdir(programs_dir): |
| 682 | if program_file.endswith(".json"): |
| 683 | program_path = os.path.join(programs_dir, program_file) |
| 684 | try: |
| 685 | with open(program_path, "r") as f: |
| 686 | program_data = json.load(f) |
| 687 | |
| 688 | program = Program.from_dict(program_data) |
| 689 | self.programs[program.id] = program |
| 690 | except Exception as e: |
| 691 | logger.warning(f"Error loading program {program_file}: {str(e)}") |
| 692 | |
| 693 | # Reconstruct island assignments from metadata |
| 694 | self._reconstruct_islands(saved_islands) |
| 695 | |
| 696 | # Ensure island_generations list has correct length |