๊ธฐ๋Šฅ ์ƒ์„ธ ๋ณด๊ณ 

์„ ํƒ์„ฑ โ€” in-loop ๊ฒŒ์ดํŠธ + ฮ”margin(home-advantage) ๊ธฐ๋Šฅ ๋ถ„์„

๋ถ„์„ ๋ฃจํŠธ: AgenticAI4SCIENCE_pyrosetta_track/repos/ai4sci-kaeri ๋Œ€์ƒ ํŒŒ์ผ: pyrosetta_flow/selectivity_loop.py, pyrosetta_flow/multiobjective.py, data/somatostatin_receptor/curated/native_selectivity_baseline.json ๋ชจ๋“  ์ˆ˜์น˜๋Š” ์†Œ์Šค/์ธก์ • ์ง๋… ์ธ์šฉ. ๋ฏธํ™•์ธ ํ•ญ๋ชฉ์€ "๋ฏธ๊ฒ€์ฆ"์œผ๋กœ ๋ช…์‹œ.


โ‘  ๋™์ž‘ ์›๋ฆฌ

1.1 selectivity_margin (์ ˆ๋Œ€ ์„ ํƒ์„ฑ)

ํ•œ ํ›„๋ณด์˜ SSTR2 ์ •๋ฐ€ํ™” ๋ณตํ•ฉ์ฒด๋ฅผ off-target ์ˆ˜์šฉ์ฒด 4์ข…์— ๋„ํ‚นํ•˜์—ฌ ๊ฒฐํ•ฉ ๊ฐ•๋„๋ฅผ ๋น„๊ตํ•œ๋‹ค.

  • off-target ์ˆ˜์šฉ์ฒด ์ •์˜: multiobjective.py:333-338 DEFAULT_OFFTARGET_RECEPTORS = SSTR1 / SSTR3 / SSTR4 / SSTR5 (curated ๋‹จ์ผ์ฒด์ธ PDB).
  • ๋™์ผ ํ”„๋กœํ† ์ฝœ: 2026-06-10๋ถ€ํ„ฐ on-target SSTR2๋„ off-target๊ณผ ๋™์ผํ•œ transplant + pre-relax ํ”„๋กœํ† ์ฝœ๋กœ ์žฌ์ธก์ •ํ•œ๋‹ค. ๊ทผ๊ฑฐ ์ฃผ์„ multiobjective.py:401-403: "SSTR2 ๋„ off-target ๊ณผ ๋™์ผ transplant+pre-relax ๋กœ ์žฌ์„œ margin ํŽธํ–ฅ ์ œ๊ฑฐ(์ด์ „ ์•„ํ‹ฐํŒฉํŠธ ์ˆ˜์ •)." ์ˆ˜์šฉ์ฒด dict์— SSTR2๋ฅผ ๋ช…์‹œ์ ์œผ๋กœ ์ถ”๊ฐ€ํ•˜๋Š” ์ฝ”๋“œ๋Š” multiobjective.py:405-407.
  • ๋ณ‘๋ ฌ ์‹คํ–‰: ThreadPoolExecutor(multiobjective.py:404, multiobjective.py:424-425), max_workers = min(6, ์ˆ˜์šฉ์ฒด ์ˆ˜). ์ฃผ์„์ƒ ์ˆœ์ฐจ ~25๋ถ„ โ†’ ๋ณ‘๋ ฌ ~6๋ถ„/ํ›„๋ณด(multiobjective.py:403). โ€ป ์‹ค์ธก ์‹œ๊ฐ„์€ ๋ณธ ๋ถ„์„์—์„œ ๋ฏธ๊ฒ€์ฆ(์ฃผ์„ ์ธ์šฉ).
  • margin ์ •์˜: multiobjective.py:434-435
  • worst = min(offtarget_ddg.values()) โ€” ๊ฐ€์žฅ ๊ฐ•ํ•œ(๊ฐ€์žฅ ๋‚ฎ์€ ddG) off-target.
  • margin = worst - baseline โ€” ์–‘์ˆ˜ = SSTR2์— ๋” ๊ฐ•ํ•˜๊ฒŒ ๊ฒฐํ•ฉ = ์„ ํƒ์ .
  • ์ฆ‰ margin = min(offtarget ddG) โˆ’ sstr2 ddG.
  • baseline ์„ ํƒ: ๋™์ผ ํ”„๋กœํ† ์ฝœ SSTR2 ๊ฐ’ ์šฐ์„ , ์‹คํŒจ ์‹œ ๋ฃจํ”„ ddG ํด๋ฐฑ(multiobjective.py:432-433).
  • fail-closed: NaN ๋„ํ‚น ๊ฒฐ๊ณผ๋Š” None ์ฒ˜๋ฆฌ(multiobjective.py:419), off-target์ด ํ•˜๋‚˜๋„ ์—†์œผ๋ฉด margin=None ๋ฐ˜ํ™˜(multiobjective.py:428-430).

1.2 ฮ”margin = home-advantage ๋ณด์ •

์ ˆ๋Œ€ margin์€ ํŽธํ–ฅ๋˜์–ด ์žˆ๋‹ค. ํ›„๋ณด ๋ณตํ•ฉ์ฒด๊ฐ€ SSTR2 source ๊ตฌ์กฐ์—์„œ ์œ ๋ž˜ํ•˜๋ฏ€๋กœ native SST-14์กฐ์ฐจ ๋™์ผ ํ”„๋กœํ† ์ฝœ์—์„œ ์–‘(+)์˜ margin์„ ๋‚ธ๋‹ค(multiobjective.py:436-437). ๋”ฐ๋ผ์„œ native ๊ธฐ์ค€์„ ์„ ๋นผ์„œ ๋ณด์ •ํ•œ๋‹ค.

  • delta_margin = round(margin - nat_margin, 4) (multiobjective.py:438-439).
  • more_selective_than_native = (delta_margin is not None and delta_margin > 0) (multiobjective.py:448).
  • native ๊ธฐ์ค€์„  ๋กœ๋“œ: _native_selectivity_baseline() (multiobjective.py:343-358), native_selectivity_baseline.json์˜ margin ํ•„๋“œ๋ฅผ ์ฝ์–ด ์บ์‹œ.

native baseline ์‹ค์ธก (native_selectivity_baseline.json:1)

{"sstr2": -61.3475,
 "offtarget": {"SSTR1": -40.1563, "SSTR3": -39.0837, "SSTR4": -33.984, "SSTR5": -47.9815},
 "margin": 13.37}
  • min(offtarget) = SSTR5 = โˆ’47.9815 (๊ฐ€์žฅ ๊ฐ•ํ•œ off-target).
  • ๊ฒ€์‚ฐ: โˆ’47.9815 โˆ’ (โˆ’61.3475) = 13.366 โ‰ˆ 13.37 โ†’ ์ €์žฅ๋œ margin๊ณผ ์ผ์น˜(๊ฒ€์ฆ ์™„๋ฃŒ).
  • ์ฆ‰ native์˜ home-advantage๋Š” +13.37์ด๋ฉฐ, ฮ”margin > 0 ์ด๋ ค๋ฉด ํ›„๋ณด์˜ ์ ˆ๋Œ€ margin์ด 13.37์„ ๋„˜์–ด์•ผ ํ•œ๋‹ค.

1.3 ์กฐ๊ฑด๋ถ€ in-loop ๊ฒŒ์ดํŠธ (ddG ํ”„๋ก์‹œ)

off-target ๋„ํ‚น์€ ๋น„์‹ธ์„œ(ํ›„๋ณดร—5์ˆ˜์šฉ์ฒด) ๋งค iteration ์ „์ฒด ํ›„๋ณด์— ๋ชป ๋Œ๋ฆฐ๋‹ค (selectivity_loop.py:3-6). ํ•ด๊ฒฐ์ฑ…์€ ddG(๋ฃจํ”„ ๋‚ด ์‹ค์ธก, ๊ฐ•ํ•œ ์‹ ํ˜ธ)๋ฅผ ์œ ๋ง๋„ ํ”„๋ก์‹œ๋กœ ์‚ฌ์šฉํ•˜์—ฌ ๋„ํ‚น ๋Œ€์ƒ์„ ์ œํ•œํ•˜๋Š” ๊ฒƒ.

  • ๊ฒŒ์ดํŠธ ๋กœ์ง SelectivityLeaderboard.should_screen() (selectivity_loop.py:48-56): 1. ์ด๋ฏธ ๋„ํ‚นํ•œ ์„œ์—ด์ด๋ฉด skip (selectivity_loop.py:50-51). 2. ddG๊ฐ€ cutoff(โˆ’10.0)๋ณด๋‹ค ์•ฝํ•˜๋ฉด skip (selectivity_loop.py:52-53). 3. ๋ฆฌ๋”๋ณด๋“œ ๋ฏธ์ถฉ์›์ด๋ฉด ๋„ํ‚น (selectivity_loop.py:54-55). 4. ์ถฉ์› ์‹œ ๊ธฐ์กด top-K ์ตœ์•ฝ์ฒด๋ณด๋‹ค ddG๊ฐ€ ๊ฐ•ํ•˜๋ฉด ๋„ํ‚น (selectivity_loop.py:56, worst_ddg()=๊ฐ€์žฅ ๋†’์€ ddG, selectivity_loop.py:43-46).
  • ์ ๊ฒฉ ํ•„ํ„ฐ screen_iteration_candidates() (selectivity_loop.py:96-118): fail ์—†์Œ + clash โ‰ค clash_max + ์ดํ™ฉํ™”๊ฒฐํ•ฉ(Cys ์œ„์น˜) ๋ณด์กด(_disulfide_ok, selectivity_loop.py:99-100) + PDB ์กด์žฌ.
  • ๋„ํ‚น ์ƒํ•œ: iteration๋‹น max_screen_per_iter๊ฐœ(๊ธฐ๋ณธ 2, selectivity_loop.py:124), ddG ๊ฐ•ํ•œ ์ˆœ์œผ๋กœ ์ ์šฉ(selectivity_loop.py:121).
  • ๊ฒฐ๊ณผ ๊ธฐ๋ก: c.extra_scores์— selectivity_margin / delta_margin / offtarget_ddg / sstr2_ddg_sameprotocol ๊ธฐ๋ก(selectivity_loop.py:134-137).

1.4 epoch ๊ฐ„ ํ•™์Šต (warm-start)

๋ฌดํ•œ ๋ฐœ๊ตด ์—”์ง„์—์„œ run ๊ฐ„ ํ•™์Šต์€ ๊ธ€๋กœ๋ฒŒ ๋ฆฌ๋”๋ณด๋“œ๋กœ ์ด์–ด์ง„๋‹ค.

  • seed_from_global() (selectivity_loop.py:23-41): ๊ธ€๋กœ๋ฒŒ ๋ฆฌ๋”๋ณด๋“œ์—์„œ โ‘  screened_seqs(์—ญ๋Œ€ ๋„ํ‚น ์„œ์—ด) โ†’ ์žฌ๋„ํ‚น ํšŒํ”ผ, โ‘ก ์—ญ๋Œ€ top-K โ†’ in-loop ๊ฒŒ์ดํŠธ ๊ธฐ์ค€์„  ์ ์žฌ. ๊ฒฐ๊ณผ์ ์œผ๋กœ worst_ddg ์ž„๊ณ„๊ฐ€ ๋Œ์–ด์˜ฌ๋ ค์ ธ "์—ญ๋Œ€ best๋ณด๋‹ค ์œ ๋งํ•œ ํ›„๋ณด๋งŒ" ๋„ํ‚นํ•œ๋‹ค.
  • ํ˜ธ์ถœ ์œ„์น˜: runner.py:495-501(SelectivityLeaderboard ์ƒ์„ฑ + seed), runner.py:888-897(iteration๋งˆ๋‹ค screen_iteration_candidates ํ˜ธ์ถœ).

โ‘ก ์˜ํ–ฅ

2.1 ํ”„๋กœํ† ์ฝœ ํŽธํ–ฅ ์ˆ˜์ • (์ „/ํ›„)

  • ์ˆ˜์ • ์ „(~2026-06-09): SSTR2๋Š” ๋ฃจํ”„ ๋‚ด ddG(๋ณ„๋„ ํ”„๋กœํ† ์ฝœ), off-target์€ transplant+pre-relax. ํ”„๋กœํ† ์ฝœ์ด ๋‹ค๋ฅด๋ฉด margin์ด ํ”„๋กœํ† ์ฝœ ์ฐจ์ด๋ฅผ ์„ ํƒ์„ฑ์œผ๋กœ ์˜ค์ธํ•˜๋Š” ์•„ํ‹ฐํŒฉํŠธ๊ฐ€ ๋ฐœ์ƒ(multiobjective.py:402 ์ฃผ์„ "์ด์ „ ์•„ํ‹ฐํŒฉํŠธ ์ˆ˜์ •").
  • ์ˆ˜์ • ํ›„(2026-06-10): SSTR2๋„ ๋™์ผ transplant+pre-relax๋กœ ์žฌ์ธก์ • (multiobjective.py:401-407, 427, 433). margin์ด ํ”„๋กœํ† ์ฝœ ์ฐจ์ด๊ฐ€ ์•„๋‹Œ ์ˆœ์ˆ˜ ์ˆ˜์šฉ์ฒด ์นœํ™”๋„ ์ฐจ์ด๋ฅผ ๋ฐ˜์˜ํ•˜๊ฒŒ ๋จ.

2.2 home-advantage ๋ณด์ •์˜ ์˜๋ฏธ

source ๊ตฌ์กฐ ์œ ๋ž˜ ํŽธํ–ฅ(+13.37)์„ ๋นผ๋ฏ€๋กœ, ฮ”margin>0์€ "native SST-14๋ฅผ ์ดˆ๊ณผํ•˜๋Š” ์„ ํƒ์„ฑ"์ด๋ผ๋Š” ์ƒ๋Œ€์ ยท์ •์งํ•œ ์‹ ํ˜ธ๊ฐ€ ๋œ๋‹ค(multiobjective.py:436-437, selectivity_loop.py:7). ์ ˆ๋Œ€ margin๋งŒ ๋ณด๋ฉด ๊ฑฐ์˜ ๋ชจ๋“  ํ›„๋ณด๊ฐ€ ์–‘์ˆ˜๋ผ ๋ณ€๋ณ„๋ ฅ์ด ์—†๋‹ค.

2.3 ๋น„์šฉ/ํƒ์ƒ‰ ์˜ํ–ฅ

ddG ํ”„๋ก์‹œ ๊ฒŒ์ดํŠธ๋กœ ๋„ํ‚น ํ˜ธ์ถœ์„ top-K ์œ ๋ง ํ›„๋ณด๋กœ ์ œํ•œ โ†’ in-loop์—์„œ๋„ ์„ ํƒ์„ฑ์„ ์ธก์ • ๊ฐ€๋Šฅํ•˜๊ฒŒ ๋งŒ๋“  ํ•ต์‹ฌ ํŠธ๋ฆญ(selectivity_loop.py:3-6). ๊ฒŒ์ดํŠธ๊ฐ€ ์—†์œผ๋ฉด ๋งค iteration ํ›„๋ณดร—5์ˆ˜์šฉ์ฒด ๋„ํ‚น์ด ํ•„์š”ํ•ด ๋ฌดํ•œ ๋ฃจํ”„๊ฐ€ ์‚ฌ์‹ค์ƒ ๋ถˆ๊ฐ€๋Šฅ.


โ‘ข ๊ด€๋ จ Action Item (2026-06-10 ์„ ํƒ์„ฑ GOAL)

  • ์ถœ์ฒ˜: _workspace/CONTINUOUS_DISCOVERY.md(์ง๋…). ํ•ต์‹ฌ ์ •์˜ ์ธ์šฉ:
  • "ฮ”margin = margin โˆ’ native_margin(+13.37) โ€” home-advantage ๋ณด์ •. >0 = native SST-14 ์ดˆ๊ณผ ์„ ํƒ์„ฑ."
  • "ํ†ต๊ณผ(passing) = ฮ”margin>0 & ฮ”Gโ‰คโˆ’15 & ๋…์„ฑโ‰คnative(hc50). ์˜ค๋Š˜ GOAL ์˜ ์—„๊ฒฉ ๊ธฐ์ค€."
  • ์ฆ‰ ๋ณธ ๊ธฐ๋Šฅ์€ 2026-06-10 "SSTR2 ์„ ํƒ์„ฑ" GOAL์˜ ํ•ต์‹ฌ ์ธก์ •์ถ•์ด๋ฉฐ, ๋ฌดํ•œ ๋ฐœ๊ตด ์—”์ง„(continuous.py)์˜ ์˜์† ํ•™์Šต ๋Œ€์ƒ์ด๋‹ค(global_selectivity_leaderboard.json).
  • ๋…์„ฑ ๊ฒŒ์ดํŠธ(hc50, home-advantage ๋Œ€์นญ)๋Š” multiobjective.py:165, 172, 212์—์„œ ฮ”margin๊ณผ ๋™์ผ ์ฒ ํ•™์œผ๋กœ ๊ตฌํ˜„๋จ(์ƒํ˜ธ ๋ณด์™„ ์ถ•).

โ‘ฃ ์™„์„ฑ๋„ (%) + ๊ทผ๊ฑฐ

์ธํ”„๋ผ ์™„์„ฑ๋„: ์•ฝ 90% - ๊ฒŒ์ดํŠธยทฮ”marginยท๋™์ผํ”„๋กœํ† ์ฝœยท๋ณ‘๋ ฌยทwarm-startยท์ดํ™ฉํ™” ๋ณด์กดยทfail-closed ์ „๋ถ€ ๊ตฌํ˜„๋˜๊ณ  runner์— ํ†ตํ•ฉ(runner.py:495-501, 888-897). ํšŒ๊ท€ ํ…Œ์ŠคํŠธ ์กด์žฌ (pyrosetta_flow/tests/test_continuous_discovery.py, seed/๊ฒŒ์ดํŠธ ์ผ€์ด์Šค). - ์‹ค์ œ ์šด์˜ ๋ฐ์ดํ„ฐ ์ถ•์ : n_screened_unique=539, n_ingested_total=564 (global_selectivity_leaderboard.json:5-6) โ†’ ํŒŒ์ดํ”„๋ผ์ธ์ด ์‹ค์ œ๋กœ ๋Œ€๋Ÿ‰ ๊ฐ€๋™๋จ.

๊ณผํ•™์  ๋ชฉํ‘œ(์ž„์ƒ๊ธ‰ ์„ ํƒ์„ฑ ์ž…์ฆ) ์™„์„ฑ๋„: ๋‚ฎ์Œ~์ค‘๊ฐ„ (์ •์„ฑ) - ฮ”margin์€ PyRosetta ๋„ํ‚น ์ ์ˆ˜ ์ฐจ์ด(in-silico proxy)์ผ ๋ฟ, in-vitro ์นœํ™”๋„/ ๊ธฐ๋Šฅ assay๋กœ ๊ฒ€์ฆ๋˜์ง€ ์•Š์Œ(multiobjective.py:13-17 ์ฃผ์„: "ddGยทselectivity_margin ์€ in-vitro ํ˜ˆ์ฒญ ์•ˆ์ •์„ฑ/ํˆฌ๊ณผ๋„ assay ๋กœ ๊ฒ€์ฆ๋˜์ง€ ์•Š์•˜๋‹ค"). - off-target ์ˆ˜์šฉ์ฒด PDB๋Š” SSTR2 ํ”„๋ ˆ์ž„์— 0.93~0.95 ์‚ฌ์ „์ •๋ ฌ๋œ curated ๊ตฌ์กฐ (multiobjective.py:330-332) โ†’ ๊ตฌ์กฐ ์ •๋ ฌ ํ’ˆ์งˆ์ด ์ ์ˆ˜ ์‹ ๋ขฐ๋„์˜ ์ƒํ•œ.

์ธํ”„๋ผ/๊ณผํ•™ ๊ตฌ๋ถ„ ๊ฒฐ๋ก : ์ธก์ •ยท๊ฒŒ์ดํŠธยทํ•™์Šต ํŒŒ์ดํ”„๋ผ์ธ์€ ์‚ฌ์‹ค์ƒ ์™„์„ฑ. "์„ ํƒ์„ฑ ํ›„๋ณด ๋ฐœ๊ฒฌ"์ด๋ผ๋Š” ๊ณผํ•™ ๋ชฉํ‘œ๋Š” in-silico ์‹ ํ˜ธ ์ˆ˜์ค€์—์„œ ์ง„ํ–‰ ์ค‘์ด๋ฉฐ ์‹คํ—˜ ๊ฒ€์ฆ์€ ๋ฏธ์ˆ˜ํ–‰(๋ฏธ๊ฒ€์ฆ).


โ‘ค ํ•™์ˆ  ๊ฐ€์น˜: ์ค‘์ƒ

  • ๊ทผ๊ฑฐ(๊ธ์ •): SSTR2 ํ‘œ์  ๋ฐฉ์‚ฌ์„ฑ์˜์•ฝํ’ˆ(์˜ˆ: DOTATATE ๊ณ„์—ด)์—์„œ SSTR1/3/4/5 ๋Œ€๋น„ ์„ ํƒ์„ฑ์€ off-target ํก์ˆ˜/๋ฐฉ์‚ฌ์„  ๋…์„ฑ๊ณผ ์ง๊ฒฐ๋˜๋Š” ์ž„์ƒ์  ํ•ต์‹ฌ ๋ณ€์ˆ˜๋‹ค. native ๋Œ€๋น„ home-advantage ๋ณด์ •์œผ๋กœ "์ ˆ๋Œ€ ์ ์ˆ˜ ํŽธํ–ฅ"์„ ์ œ๊ฑฐํ•˜๊ณ  ์ƒ๋Œ€ ์„ ํƒ์„ฑ๋งŒ ์ถ”์ถœํ•œ ๋ฐฉ๋ฒ•๋ก ์€ in-silico ์„ ํƒ์„ฑ ์Šคํฌ๋ฆฌ๋‹์—์„œ ์ •์ง์„ฑ์ด ๋†’์€ ์„ค๊ณ„๋‹ค.
  • ๊ทผ๊ฑฐ(ํ•œ๊ณ„๋กœ ์ธํ•œ ๊ฐ์ ): ฮ”margin์€ ๋„ํ‚น ์ ์ˆ˜ proxy์ด๋ฉฐ ์‹คํ—˜ ๊ฒ€์ฆ ๋ถ€์žฌ (multiobjective.py:13-17). off-target ๊ตฌ์กฐ ์ •๋ ฌยท๋‹จ์ผ์ฒด์ธ ์ถ”์ถœ ๊ฐ€์ •์ด ๊ฒฐ๊ณผ์— ์˜ํ–ฅ. ๋”ฐ๋ผ์„œ "์ƒ"์ด ์•„๋‹Œ "์ค‘์ƒ" โ€” ๋ฐฉ๋ฒ•๋ก ยท์—”์ง€๋‹ˆ์–ด๋ง์€ ๋ฐœํ‘œ ๊ฐ€์น˜ ์žˆ์œผ๋‚˜, ๊ฒฐ๊ณผ์˜ ์ƒ๋ฌผํ•™์  ์ฃผ์žฅ์€ wet-lab ๊ฒ€์ฆ ์ „์ œ ํ•˜์—๋งŒ ์„ฑ๋ฆฝ.

โ‘ฅ ์‚ฌ์šฉ๋ฒ•

ENV=~/miniforge3/envs/bio-tools/bin/python
cd AgenticAI4SCIENCE_pyrosetta_track/repos/ai4sci-kaeri

# ๋ฌดํ•œ ๋ฐœ๊ตด(์„ ํƒ์„ฑ ๊ฒŒ์ดํŠธ ํฌํ•จ, STOP ํŒŒ์ผ๋กœ ์ •์ง€)
$ENV scripts/run_continuous_discovery.py \
    --input data/somatostatin_receptor/SSTR2_SST14_complex_boltz_1.pdb \
    --n-candidates 8 --max-iterations 4 --top-k 5 --selectivity-max-per-iter 2

(์ถœ์ฒ˜: _workspace/CONTINUOUS_DISCOVERY.md ์‹คํ–‰ ์„น์…˜ ์ง๋…)

  • ์ •์ง€: touch _workspace/STOP_DISCOVERY (graceful), ์žฌ์‹œ์ž‘ ์ „ rm.
  • iteration๋‹น ๋„ํ‚น ๊ฐœ์ˆ˜ ์กฐ์ ˆ: --selectivity-max-per-iter(โ†’ max_screen_per_iter, selectivity_loop.py:124).
  • ๊ฒฐ๊ณผ ํ™•์ธ: runs/pyrosetta_flow/global_selectivity_leaderboard.json (best_delta_margin, entries์˜ delta_margin).
  • ํ”„๋กœ๊ทธ๋žจ ์ง์ ‘ ์‚ฌ์šฉ: from pyrosetta_flow.multiobjective import screen_selectivity โ†’ dict(selectivity_margin, delta_margin, more_selective_than_native, ...) ๋ฐ˜ํ™˜ (multiobjective.py:361, 440-450).

โ‘ฆ ํ•„์š” ์ด์œ 

  • SSTR2 ์„ ํƒ์„ฑ์€ ๋„ํ‚น ์ „์— ์•Œ ์ˆ˜ ์—†๊ณ  ์ธก์ •์ด ๋น„์‹ธ๋‹ค(selectivity_loop.py:3-6). ddG ํ”„๋ก์‹œ ๊ฒŒ์ดํŠธ๊ฐ€ ์—†์œผ๋ฉด ๋ฌดํ•œ ๋ฃจํ”„์—์„œ ์„ ํƒ์„ฑ์„ ์ „ํ˜€ ์ธก์ •ํ•  ์ˆ˜ ์—†๋‹ค.
  • ์ ˆ๋Œ€ margin์€ source-๊ตฌ์กฐ ํŽธํ–ฅ์œผ๋กœ ๋ณ€๋ณ„๋ ฅ์ด ์—†๋‹ค โ†’ home-advantage ๋ณด์ •(ฮ”margin)์ด ์—†์œผ๋ฉด "native ๋Œ€๋น„ ์‹ค์ œ ๊ฐœ์„ "์„ ๊ตฌ๋ถ„ํ•  ์ˆ˜ ์—†๋‹ค(multiobjective.py:436-437).
  • ๋™์ผ ํ”„๋กœํ† ์ฝœ ๋ณด์ •์ด ์—†์œผ๋ฉด ํ”„๋กœํ† ์ฝœ ์ฐจ์ด๋ฅผ ์„ ํƒ์„ฑ์œผ๋กœ ์˜ค์ธํ•œ๋‹ค(์ด์ „ ์•„ํ‹ฐํŒฉํŠธ, multiobjective.py:402).

๊ฒ€์ฆ ์ธ์šฉ ๋ชฉ๋ก

์ฃผ์žฅ ์ธ์šฉ
off-target 5์ข… ๋™์ผ ํ”„๋กœํ† ์ฝœ ๋„ํ‚น multiobjective.py:333-338, 401-410
margin = min(offtarget) โˆ’ sstr2 multiobjective.py:434-435
ฮ”margin = margin โˆ’ native_margin multiobjective.py:438-439
native baseline +13.37 (๊ฒ€์‚ฐ 13.366) native_selectivity_baseline.json:1
์กฐ๊ฑด๋ถ€ ddG ๊ฒŒ์ดํŠธ selectivity_loop.py:48-56
์ดํ™ฉํ™” ๋ณด์กด ํ•„ํ„ฐ selectivity_loop.py:99-100
iteration๋‹น ๋„ํ‚น ์ƒํ•œ(2) selectivity_loop.py:124
warm-start seed_from_global selectivity_loop.py:23-41
runner ํ†ตํ•ฉ runner.py:495-501, 888-897
์‹คํ—˜ ๊ฒ€์ฆ ๋ถ€์žฌ disclaimer multiobjective.py:13-17
GOAL ํ†ต๊ณผ ๊ธฐ์ค€ _workspace/CONTINUOUS_DISCOVERY.md

ํ˜„์žฌ ๋ฆฌ๋”๋ณด๋“œ ์‹ค์ธก ์š”์•ฝ

์ถœ์ฒ˜: runs/pyrosetta_flow/global_selectivity_leaderboard.json ์ง๋… (2026-06-17 ๋ถ„์„ ์‹œ์ ).

  • best_delta_margin = +9.1021 (์„œ์—ด ARCGKFFWKTATSC, margin 22.4721, ddG โˆ’32.1162; ํŒŒ์ผ line 9-17).
  • ๋ฆฌ๋”๋ณด๋“œ capacity=50, entries 50๊ฑด ์ „๋ถ€ delta_margin > 0 (์ตœ์ € +0.3777, ์ตœ๊ณ  +9.1021). โ†’ ์ฆ‰ native(+13.37)๋ฅผ ์ดˆ๊ณผํ•˜๋Š” ์„ ํƒ์„ฑ ํ›„๋ณด๊ฐ€ top-50 ๋ฆฌ๋”๋ณด๋“œ์— 50๊ฑด ์ ์žฌ๋จ.
  • ๋ˆ„์  ํ†ต๊ณ„: n_screened_unique = 539 (์‹ค์ œ off-target ๋„ํ‚นํ•œ ๊ณ ์œ  ์„œ์—ด), n_ingested_total = 564 (line 5-6).

์ •์ง์„ฑ ์ฃผ์˜ (ํ”„๋กฌํ”„ํŠธ ์ˆ˜์น˜ ์ •์ •)

  • ํ”„๋กฌํ”„ํŠธ์˜ "ํ˜„์žฌ best ฮ”+0.077, native ์ดˆ๊ณผ ์†Œ์ˆ˜"๋Š” ํ˜„ ์ธก์ •๊ณผ ๋ถˆ์ผ์น˜ํ•œ๋‹ค. ์‹ค์ธก best๋Š” ฮ”+0.077์ด ์•„๋‹ˆ๋ผ ฮ”+9.1021์ด๋ฉฐ, top-50 ๋ฆฌ๋”๋ณด๋“œ entries๋Š” ์ „๋ถ€ ฮ”>0์ด๋‹ค. "+0.077"์€ 2026-06-10 ์ดˆ๊ธฐ ์Šค๋ƒ…์ƒท(๋‹น์‹œ 1๊ฑด๋งŒ native ์ดˆ๊ณผ) ๊ธฐ์ค€์œผ๋กœ ์ถ”์ •๋˜๋ฉฐ, ์ดํ›„ ๋ฌดํ•œ ๋ฐœ๊ตด(539 ์„œ์—ด ๋„ํ‚น)๋กœ ๋‹ค์ˆ˜ ํ›„๋ณด๊ฐ€ native๋ฅผ ์ดˆ๊ณผํ•œ ๊ฒƒ์œผ๋กœ ๋ณด์ธ๋‹ค.
  • ๋‹จ, ์œ„ ฮ”>0์€ PyRosetta ๋„ํ‚น ์ ์ˆ˜ proxy ๊ธฐ์ค€์ด๋ฉฐ wet-lab ๊ฒ€์ฆ์ด ์•„๋‹˜์„ ์žฌ์ฐจ ๋ช…์‹œ (multiobjective.py:13-17). "native ์ดˆ๊ณผ ์„ ํƒ์„ฑ"์€ in-silico ์‹ ํ˜ธ ํ•œ์ • ์ฃผ์žฅ์ด๋‹ค.