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 | ไฟๅญ่ฏไผฐ็ปๆๅฐๆๅฎ็ฎๅฝ |
๐ก ไธบไปไน่ฟๆ ท่ฎพ่ฎก๏ผ
ไผ็น
- ่งฃ่ฆ: ่ฏไผฐ่ๆฌไธ้่ฆ็ฅ้ ShinkaEvolve ็็ฎๅฝ็ปๆ
- ็ตๆดป: ๅฏไปฅ็ฌ็ซ่ฟ่ก่ฏไผฐ่ๆฌ่ฟ่กๆต่ฏ
- ๆ ๅๅ: ๆๆ่ฏไผฐ่ๆฌไฝฟ็จ็ธๅ็ๅๆฐๆฅๅฃ
- ๅฏ่ฟฝๆบฏ: ๆฏไธไปฃ้ฝๆ็ฌ็ซ็็ปๆ็ฎๅฝ
็คบไพ๏ผ็ฌ็ซ่ฟ่ก่ฏไผฐ่ๆฌ
# ๅฏไปฅๅฎๅ
จ็ฌ็ซไบ 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 ็ฅ้ไฟๅญไฝ็ฝฎ๏ผ
ๆดไธชๆต็จๆฏ๏ผ
- ็จๆทๅจ
EvolutionConfigไธญ่ฎพ็ฝฎresults_dir EvolutionRunner่ฏปๅ้ ็ฝฎๅนถๅๅปบ็ฎๅฝ็ปๆ- ๅฏนไบๆฏไธไปฃ๏ผๆๅปบ
{results_dir}/gen_X/results่ทฏๅพ JobSchedulerๅฐ่ฟไธช่ทฏๅพไฝไธบ--results_dirๅๆฐไผ ้็ป่ฏไผฐ่ๆฌ- ่ฏไผฐ่ๆฌ้่ฟ
argparse่งฃๆๅๆฐ run_shinka_evalๅsave_json_resultsไฝฟ็จ่ฟไธช่ทฏๅพไฟๅญ็ปๆ
่ฟๆฏไธไธชๆ ๅ็ๅฝไปค่กๅๆฐไผ ้ๆบๅถ๏ผ่ไธๆฏ็กฌ็ผ็ ๆ็ฏๅขๅ้ใ
ๅๅปบๆถ้ด: 2026-01-29
็ธๅ
ณๆไปถ:
shinka/core/runner.py- EvolutionRunner ๅ EvolutionConfigshinka/launch/scheduler.py- JobScheduler ๅฝไปคๆๅปบshinka/core/wrap_eval.py- run_shinka_eval ๅ็ปๆไฟๅญexamples/circle_packing/evaluate_with_auxiliary.py- ่ฏไผฐ่ๆฌ็คบไพ