shinka-backup / eval_agent /design_draft /RESULTS_DIR_FLOW.md
JustinTX's picture
Add files using upload-large-folder tool
3f6526a verified

ShinkaEvolve: results_dir ไผ ้€’ๆต็จ‹่ฏฆ่งฃ

๐ŸŽฏ ้—ฎ้ข˜

ๅฝ“่ฟ่กŒ ShinkaEvolve ๆ—ถ๏ผŒ่ฏ„ไผฐ่„šๆœฌ๏ผˆevaluate.py๏ผ‰ๆ˜ฏๅฆ‚ไฝ•็Ÿฅ้“่ฆๆŠŠ็ป“ๆžœไฟๅญ˜ๅˆฐๆŒ‡ๅฎš็š„ results_dir ็š„๏ผŸ

๐Ÿ“Š ๅฎŒๆ•ดๆ•ฐๆฎๆต็จ‹

โ”Œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”
โ”‚ ็ฌฌ 1 ๆญฅ: ็”จๆˆท้…็ฝฎ (run_circle_packing_*.py)                             โ”‚
โ”œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ค
โ”‚                                                                          โ”‚
โ”‚  evo_config = EvolutionConfig(                                           โ”‚
โ”‚      results_dir="examples/circle_packing/results/results_exp_20260129", โ”‚
โ”‚      ...                                                                 โ”‚
โ”‚  )                                                                       โ”‚
โ”‚                                                                          โ”‚
โ””โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ฌโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”˜
                             โ”‚
                             โ–ผ
โ”Œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”
โ”‚ ็ฌฌ 2 ๆญฅ: EvolutionRunner ๅˆๅง‹ๅŒ– (shinka/core/runner.py:90-108)          โ”‚
โ”œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ค
โ”‚                                                                          โ”‚
โ”‚  class EvolutionRunner:                                                  โ”‚
โ”‚      def __init__(self, evo_config, ...):                                โ”‚
โ”‚          if evo_config.results_dir is None:                              โ”‚
โ”‚              timestamp = datetime.now().strftime("%Y%m%d_%H%M%S")        โ”‚
โ”‚              self.results_dir = f"results_{timestamp}"                   โ”‚
โ”‚          else:                                                           โ”‚
โ”‚              self.results_dir = Path(evo_config.results_dir)  โ† ไฝฟ็”จ้…็ฝฎ  โ”‚
โ”‚                                                                          โ”‚
โ”‚          # ๅˆ›ๅปบ็›ฎๅฝ•                                                       โ”‚
โ”‚          Path(self.results_dir).mkdir(parents=True, exist_ok=True)       โ”‚
โ”‚                                                                          โ”‚
โ”‚  ็ป“ๆžœ: self.results_dir = "examples/.../results_exp_20260129"            โ”‚
โ”‚                                                                          โ”‚
โ””โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ฌโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”˜
                             โ”‚
                             โ–ผ
โ”Œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”
โ”‚ ็ฌฌ 3 ๆญฅ: ่ฟ่กŒๆฏไธ€ไปฃ (shinka/core/runner.py:461-496)                     โ”‚
โ”œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ค
โ”‚                                                                          โ”‚
โ”‚  def _run_generation_0(self):                                            โ”‚
โ”‚      # ๆž„ๅปบๅฝ“ๅ‰ไปฃ็š„็›ฎๅฝ•่ทฏๅพ„                                               โ”‚
โ”‚      initial_dir = f"{self.results_dir}/{FOLDER_PREFIX}_0"               โ”‚
โ”‚      # ๅณ: "examples/.../results_exp_20260129/gen_0"                     โ”‚
โ”‚                                                                          โ”‚
โ”‚      Path(initial_dir).mkdir(parents=True, exist_ok=True)                โ”‚
โ”‚      exec_fname = f"{initial_dir}/main.py"                               โ”‚
โ”‚                                                                          โ”‚
โ”‚      # ๆž„ๅปบ็ป“ๆžœๅญ็›ฎๅฝ•                                                     โ”‚
โ”‚      results_dir = f"{self.results_dir}/{FOLDER_PREFIX}_0/results"       โ”‚
โ”‚      # ๅณ: "examples/.../results_exp_20260129/gen_0/results"             โ”‚
โ”‚                                                                          โ”‚
โ”‚      Path(results_dir).mkdir(parents=True, exist_ok=True)                โ”‚
โ”‚                                                                          โ”‚
โ”‚      # ่ฟ่กŒ่ฏ„ไผฐ๏ผŒไผ ้€’ results_dir                                         โ”‚
โ”‚      results, rtime = self.scheduler.run(exec_fname, results_dir)  โ†ๅ…ณ้”ฎ โ”‚
โ”‚                                                                          โ”‚
โ””โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ฌโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”˜
                             โ”‚
                             โ–ผ
โ”Œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”
โ”‚ ็ฌฌ 4 ๆญฅ: JobScheduler ๆž„ๅปบๅ‘ฝไปค (shinka/launch/scheduler.py:98-148)      โ”‚
โ”œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ค
โ”‚                                                                          โ”‚
โ”‚  def _build_command(self, exec_fname_t, results_dir_t):                  โ”‚
โ”‚      cmd = [                                                             โ”‚
โ”‚          "python",                                                       โ”‚
โ”‚          f"{self.config.eval_program_path}",  โ† ่ฏ„ไผฐ่„šๆœฌ่ทฏๅพ„             โ”‚
โ”‚          "--program_path",                                               โ”‚
โ”‚          f"{exec_fname_t}",                   โ† ่ขซ่ฏ„ไผฐ็š„็จ‹ๅบ             โ”‚
โ”‚          "--results_dir",                                                โ”‚
โ”‚          results_dir_t,                       โ† ็ป“ๆžœ็›ฎๅฝ•๏ผ              โ”‚
โ”‚      ]                                                                   โ”‚
โ”‚                                                                          โ”‚
โ”‚  ๅฎž้™…ๅ‘ฝไปค:                                                               โ”‚
โ”‚  python examples/circle_packing/evaluate_with_auxiliary.py \             โ”‚
โ”‚         --program_path examples/.../gen_0/main.py \                      โ”‚
โ”‚         --results_dir examples/.../gen_0/results                         โ”‚
โ”‚                                                                          โ”‚
โ””โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ฌโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”˜
                             โ”‚
                             โ–ผ
โ”Œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”
โ”‚ ็ฌฌ 5 ๆญฅ: ่ฏ„ไผฐ่„šๆœฌๆŽฅๆ”ถๅ‚ๆ•ฐ (evaluate_with_auxiliary.py:260-295)          โ”‚
โ”œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ค
โ”‚                                                                          โ”‚
โ”‚  if __name__ == "__main__":                                              โ”‚
โ”‚      parser = argparse.ArgumentParser(...)                               โ”‚
โ”‚      parser.add_argument(                                                โ”‚
โ”‚          "--program_path",                                               โ”‚
โ”‚          type=str,                                                       โ”‚
โ”‚          default="initial.py",                                           โ”‚
โ”‚      )                                                                   โ”‚
โ”‚      parser.add_argument(                                                โ”‚
โ”‚          "--results_dir",        โ† ๆŽฅๆ”ถๅ‘ฝไปค่กŒๅ‚ๆ•ฐ                        โ”‚
โ”‚          type=str,                                                       โ”‚
โ”‚          default="results",                                              โ”‚
โ”‚      )                                                                   โ”‚
โ”‚                                                                          โ”‚
โ”‚      args = parser.parse_args()                                          โ”‚
โ”‚                                                                          โ”‚
โ”‚      main(                                                               โ”‚
โ”‚          program_path=args.program_path,                                 โ”‚
โ”‚          results_dir=args.results_dir,  โ† ไผ ้€’็ป™ main ๅ‡ฝๆ•ฐ              โ”‚
โ”‚      )                                                                   โ”‚
โ”‚                                                                          โ”‚
โ””โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ฌโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”˜
                             โ”‚
                             โ–ผ
โ”Œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”
โ”‚ ็ฌฌ 6 ๆญฅ: ่ฏ„ไผฐๆ‰ง่กŒๅ’Œ็ป“ๆžœไฟๅญ˜ (evaluate_with_auxiliary.py:161-256)        โ”‚
โ”œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ค
โ”‚                                                                          โ”‚
โ”‚  def main(program_path, results_dir, ...):                               โ”‚
โ”‚      # ็กฎไฟ็›ฎๅฝ•ๅญ˜ๅœจ                                                       โ”‚
โ”‚      os.makedirs(results_dir, exist_ok=True)                             โ”‚
โ”‚                                                                          โ”‚
โ”‚      # ่ฟ่กŒ่ฏ„ไผฐ                                                          โ”‚
โ”‚      metrics, correct, error = run_shinka_eval(                          โ”‚
โ”‚          program_path=program_path,                                      โ”‚
โ”‚          results_dir=results_dir,  โ† ไผ ้€’็ป™ๆ ธๅฟƒ่ฏ„ไผฐๅ‡ฝๆ•ฐ                  โ”‚
โ”‚          ...                                                             โ”‚
โ”‚      )                                                                   โ”‚
โ”‚                                                                          โ”‚
โ””โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ฌโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”˜
                             โ”‚
                             โ–ผ
โ”Œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”
โ”‚ ็ฌฌ 7 ๆญฅ: ๆ ธๅฟƒ่ฏ„ไผฐๅ‡ฝๆ•ฐไฟๅญ˜็ป“ๆžœ (shinka/core/wrap_eval.py:54-193)         โ”‚
โ”œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ค
โ”‚                                                                          โ”‚
โ”‚  def run_shinka_eval(program_path, results_dir, ...):                    โ”‚
โ”‚      # ... ่ฟ่กŒๅฎž้ชŒ ...                                                  โ”‚
โ”‚                                                                          โ”‚
โ”‚      # ไฟๅญ˜้ขๅค–ๆ•ฐๆฎ                                                       โ”‚
โ”‚      if "extra_data" in metrics:                                         โ”‚
โ”‚          os.makedirs(results_dir, exist_ok=True)                         โ”‚
โ”‚          extra_file = os.path.join(results_dir, "extra.pkl")             โ”‚
โ”‚          with open(extra_file, "wb") as f:                               โ”‚
โ”‚              pickle.dump(extra_data, f)                                  โ”‚
โ”‚                                                                          โ”‚
โ”‚      # ไฟๅญ˜ไธป่ฆ็ป“ๆžœ                                                       โ”‚
โ”‚      save_json_results(results_dir, metrics, correct, error)             โ”‚
โ”‚                                                                          โ”‚
โ”‚  def save_json_results(results_dir, metrics, correct, error):            โ”‚
โ”‚      os.makedirs(results_dir, exist_ok=True)                             โ”‚
โ”‚      metrics_file = os.path.join(results_dir, "metrics.json")            โ”‚
โ”‚      correct_file = os.path.join(results_dir, "correct.json")            โ”‚
โ”‚                                                                          โ”‚
โ”‚      # ไฟๅญ˜ๆ–‡ไปถ                                                          โ”‚
โ”‚      with open(metrics_file, "w") as f:                                  โ”‚
โ”‚          json.dump(metrics, f, indent=4)                                 โ”‚
โ”‚      with open(correct_file, "w") as f:                                  โ”‚
โ”‚          json.dump({"correct": correct, "error": error}, f, indent=4)    โ”‚
โ”‚                                                                          โ”‚
โ”‚  ็ป“ๆžœๆ–‡ไปถ:                                                               โ”‚
โ”‚  - examples/.../gen_0/results/metrics.json                               โ”‚
โ”‚  - examples/.../gen_0/results/correct.json                               โ”‚
โ”‚  - examples/.../gen_0/results/extra.pkl (ๅฆ‚ๆžœๆœ‰)                         โ”‚
โ”‚                                                                          โ”‚
โ””โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”˜

๐Ÿ” ๅ…ณ้”ฎไปฃ็ ไฝ็ฝฎ

1. EvolutionConfig ๅฎšไน‰ (shinka/core/runner.py:38-64)

@dataclass
class EvolutionConfig:
    # ... ๅ…ถไป–้…็ฝฎ ...
    results_dir: Optional[str] = None  # ็ฌฌ59่กŒ๏ผšresults_dir ้…็ฝฎ้กน
    # ... ๅ…ถไป–้…็ฝฎ ...

2. EvolutionRunner ไฝฟ็”จ้…็ฝฎ (shinka/core/runner.py:104-108)

if evo_config.results_dir is None:
    timestamp = datetime.now().strftime("%Y%m%d_%H%M%S")
    self.results_dir = f"results_{timestamp}"
else:
    self.results_dir = Path(evo_config.results_dir)  # ไฝฟ็”จ็”จๆˆท้…็ฝฎ

3. ๆž„ๅปบๆฏไธ€ไปฃ็š„่ทฏๅพ„ (shinka/core/runner.py:461-496)

def _run_generation_0(self):
    initial_dir = f"{self.results_dir}/{FOLDER_PREFIX}_0"
    # ...
    results_dir = f"{self.results_dir}/{FOLDER_PREFIX}_0/results"
    Path(results_dir).mkdir(parents=True, exist_ok=True)
    
    # ่ฟ่กŒ่ฏ„ไผฐ
    results, rtime = self.scheduler.run(exec_fname, results_dir)

4. JobScheduler ๆž„ๅปบๅ‘ฝไปค (shinka/launch/scheduler.py:98-148)

def _build_command(self, exec_fname_t: str, results_dir_t: str) -> List[str]:
    cmd = [
        "python",
        f"{self.config.eval_program_path}",
        "--program_path",
        f"{exec_fname_t}",
        "--results_dir",
        results_dir_t,  # โ† results_dir ไฝœไธบๅ‘ฝไปค่กŒๅ‚ๆ•ฐ
    ]
    return cmd

5. ่ฏ„ไผฐ่„šๆœฌๆŽฅๆ”ถๅ‚ๆ•ฐ (evaluate_with_auxiliary.py:260-295)

if __name__ == "__main__":
    parser = argparse.ArgumentParser(...)
    parser.add_argument(
        "--program_path",
        type=str,
        default="initial.py",
    )
    parser.add_argument(
        "--results_dir",  # โ† ๆŽฅๆ”ถๅ‘ฝไปค่กŒๅ‚ๆ•ฐ
        type=str,
        default="results",
    )
    args = parser.parse_args()
    
    main(
        program_path=args.program_path,
        results_dir=args.results_dir,  # โ† ไผ ้€’็ป™ main
    )

6. ไฟๅญ˜็ป“ๆžœ (shinka/core/wrap_eval.py:33-51)

def save_json_results(
    results_dir: str,  # โ† ๆŽฅๆ”ถ results_dir
    metrics: Dict[str, Any],
    correct: bool,
    error: Optional[str] = None,
) -> None:
    os.makedirs(results_dir, exist_ok=True)
    metrics_file = os.path.join(results_dir, "metrics.json")
    correct_file = os.path.join(results_dir, "correct.json")
    
    with open(metrics_file, "w", encoding="utf-8") as f:
        json.dump(metrics, f, indent=4)
    
    with open(correct_file, "w", encoding="utf-8") as f:
        json.dump({"correct": correct, "error": error}, f, indent=4)

๐Ÿ“ ๅฎž้™…็›ฎๅฝ•็ป“ๆž„็คบไพ‹

examples/circle_packing/results/results_exp_20260129_150530/
โ”‚
โ”œโ”€โ”€ evolution_db_exp_20260129_150530.sqlite  โ† ๆ•ฐๆฎๅบ“
โ”œโ”€โ”€ evolution_run.log                         โ† ๆ—ฅๅฟ—
โ”œโ”€โ”€ experiment_config.yaml                    โ† ้…็ฝฎ
โ”‚
โ”œโ”€โ”€ gen_0/                                    โ† ็ฌฌ 0 ไปฃ
โ”‚   โ”œโ”€โ”€ main.py                               โ† ่ขซ่ฏ„ไผฐ็š„็จ‹ๅบ
โ”‚   โ””โ”€โ”€ results/                              โ† ่ฏ„ไผฐ็ป“ๆžœ็›ฎๅฝ•
โ”‚       โ”œโ”€โ”€ metrics.json                      โ† ๆ€ง่ƒฝๆŒ‡ๆ ‡
โ”‚       โ”œโ”€โ”€ correct.json                      โ† ๆญฃ็กฎๆ€งๆ ‡ๅฟ—
โ”‚       โ”œโ”€โ”€ extra.npz                         โ† ้ขๅค–ๆ•ฐๆฎ
โ”‚       โ”œโ”€โ”€ packing_viz.png                   โ† ๅฏ่ง†ๅŒ–
โ”‚       โ””โ”€โ”€ auxiliary_analysis.json           โ† ่พ…ๅŠฉๅˆ†ๆž
โ”‚
โ”œโ”€โ”€ gen_1/
โ”‚   โ”œโ”€โ”€ main.py
โ”‚   โ””โ”€โ”€ results/
โ”‚       โ”œโ”€โ”€ metrics.json
โ”‚       โ””โ”€โ”€ ...
โ”‚
โ”œโ”€โ”€ gen_2/
โ”‚   โ””โ”€โ”€ ...
โ”‚
โ””โ”€โ”€ best/                                     โ† ๆœ€ไฝณ็ป“ๆžœ๏ผˆ็ฌฆๅท้“พๆŽฅ๏ผ‰
    โ””โ”€โ”€ results/
        โ”œโ”€โ”€ metrics.json
        โ””โ”€โ”€ ...

๐Ÿ”ง ๅ…ณ้”ฎ่ฎพ่ฎก็‰น็‚น

1. ๅฑ‚ๆฌกๅŒ–็š„็›ฎๅฝ•็ป“ๆž„

{results_dir}/
    โ”œโ”€โ”€ gen_0/results/     โ† EvolutionRunner ๅˆ›ๅปบ
    โ”œโ”€โ”€ gen_1/results/     โ† EvolutionRunner ๅˆ›ๅปบ
    โ””โ”€โ”€ gen_2/results/     โ† EvolutionRunner ๅˆ›ๅปบ
         โ””โ”€โ”€ metrics.json  โ† ่ฏ„ไผฐ่„šๆœฌไฟๅญ˜

2. ๅ‚ๆ•ฐไผ ้€’้“พ

็”จๆˆท้…็ฝฎ โ†’ EvolutionConfig.results_dir
         โ†’ EvolutionRunner.results_dir
         โ†’ JobScheduler.run(results_dir)
         โ†’ ๅ‘ฝไปค่กŒๅ‚ๆ•ฐ --results_dir
         โ†’ argparse ่งฃๆž
         โ†’ main(results_dir)
         โ†’ save_json_results(results_dir)
         โ†’ ๆ–‡ไปถไฟๅญ˜

3. ่Œ่ดฃๅˆ†็ฆป

็ป„ไปถ ่Œ่ดฃ
EvolutionRunner ๅˆ›ๅปบ้กถๅฑ‚็›ฎๅฝ•ๅ’Œๆฏไปฃ็š„ๅญ็›ฎๅฝ•
JobScheduler ๆž„ๅปบๅ‘ฝไปคๅนถไผ ้€’ results_dir ๅ‚ๆ•ฐ
่ฏ„ไผฐ่„šๆœฌ ๆŽฅๆ”ถๅ‚ๆ•ฐๅนถๆ‰ง่กŒ่ฏ„ไผฐ
run_shinka_eval ไฟๅญ˜่ฏ„ไผฐ็ป“ๆžœๅˆฐๆŒ‡ๅฎš็›ฎๅฝ•

๐Ÿ’ก ไธบไป€ไนˆ่ฟ™ๆ ท่ฎพ่ฎก๏ผŸ

ไผ˜็‚น

  1. ่งฃ่€ฆ: ่ฏ„ไผฐ่„šๆœฌไธ้œ€่ฆ็Ÿฅ้“ ShinkaEvolve ็š„็›ฎๅฝ•็ป“ๆž„
  2. ็ตๆดป: ๅฏไปฅ็‹ฌ็ซ‹่ฟ่กŒ่ฏ„ไผฐ่„šๆœฌ่ฟ›่กŒๆต‹่ฏ•
  3. ๆ ‡ๅ‡†ๅŒ–: ๆ‰€ๆœ‰่ฏ„ไผฐ่„šๆœฌไฝฟ็”จ็›ธๅŒ็š„ๅ‚ๆ•ฐๆŽฅๅฃ
  4. ๅฏ่ฟฝๆบฏ: ๆฏไธ€ไปฃ้ƒฝๆœ‰็‹ฌ็ซ‹็š„็ป“ๆžœ็›ฎๅฝ•

็คบไพ‹๏ผš็‹ฌ็ซ‹่ฟ่กŒ่ฏ„ไผฐ่„šๆœฌ

# ๅฏไปฅๅฎŒๅ…จ็‹ฌ็ซ‹ไบŽ ShinkaEvolve ่ฟ่กŒ่ฏ„ไผฐ
python examples/circle_packing/evaluate_with_auxiliary.py \
    --program_path my_solution.py \
    --results_dir my_custom_results/

# ็ป“ๆžœไผšไฟๅญ˜ๅœจ my_custom_results/ ่€Œไธๆ˜ฏ ShinkaEvolve ็š„็›ฎๅฝ•็ป“ๆž„ไธญ

๐ŸŽฏ ๆ€ป็ป“

่ฏ„ไผฐ่„šๆœฌ้€š่ฟ‡ๅ‘ฝไปค่กŒๅ‚ๆ•ฐ --results_dir ็Ÿฅ้“ไฟๅญ˜ไฝ็ฝฎ๏ผ

ๆ•ดไธชๆต็จ‹ๆ˜ฏ๏ผš

  1. ็”จๆˆทๅœจ EvolutionConfig ไธญ่ฎพ็ฝฎ results_dir
  2. EvolutionRunner ่ฏปๅ–้…็ฝฎๅนถๅˆ›ๅปบ็›ฎๅฝ•็ป“ๆž„
  3. ๅฏนไบŽๆฏไธ€ไปฃ๏ผŒๆž„ๅปบ {results_dir}/gen_X/results ่ทฏๅพ„
  4. JobScheduler ๅฐ†่ฟ™ไธช่ทฏๅพ„ไฝœไธบ --results_dir ๅ‚ๆ•ฐไผ ้€’็ป™่ฏ„ไผฐ่„šๆœฌ
  5. ่ฏ„ไผฐ่„šๆœฌ้€š่ฟ‡ argparse ่งฃๆžๅ‚ๆ•ฐ
  6. run_shinka_eval ๅ’Œ save_json_results ไฝฟ็”จ่ฟ™ไธช่ทฏๅพ„ไฟๅญ˜็ป“ๆžœ

่ฟ™ๆ˜ฏไธ€ไธชๆ ‡ๅ‡†็š„ๅ‘ฝไปค่กŒๅ‚ๆ•ฐไผ ้€’ๆœบๅˆถ๏ผŒ่€Œไธๆ˜ฏ็กฌ็ผ–็ ๆˆ–็Žฏๅขƒๅ˜้‡ใ€‚


ๅˆ›ๅปบๆ—ถ้—ด: 2026-01-29
็›ธๅ…ณๆ–‡ไปถ:

  • shinka/core/runner.py - EvolutionRunner ๅ’Œ EvolutionConfig
  • shinka/launch/scheduler.py - JobScheduler ๅ‘ฝไปคๆž„ๅปบ
  • shinka/core/wrap_eval.py - run_shinka_eval ๅ’Œ็ป“ๆžœไฟๅญ˜
  • examples/circle_packing/evaluate_with_auxiliary.py - ่ฏ„ไผฐ่„šๆœฌ็คบไพ‹