fix(lotto): Phase 2 리뷰 반영 (engine_w 회차주 기준·누출제거·N+1제거·테스트 보강)
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
This commit is contained in:
@@ -113,10 +113,12 @@ def _db():
|
||||
return _db_mod
|
||||
|
||||
|
||||
def calibrate_winner(draw_no: int, sample_m: int = 2000) -> Dict[str, Any]:
|
||||
"""DB 진입점: 회차 1개 캘리브레이션 후 저장 (멱등)."""
|
||||
def calibrate_winner(draw_no: int, sample_m: int = 2000, draws=None) -> Dict[str, Any]:
|
||||
"""DB 진입점: 회차 1개 캘리브레이션 후 저장 (멱등).
|
||||
draws를 외부에서 전달하면 N+1 조회를 방지한다."""
|
||||
db = _db()
|
||||
draws = db.get_all_draw_numbers()
|
||||
if draws is None:
|
||||
draws = db.get_all_draw_numbers()
|
||||
row = db.get_draw(draw_no)
|
||||
if row is None:
|
||||
return {"ok": False, "reason": "no_draw"}
|
||||
@@ -142,7 +144,7 @@ def backfill_calibration(batch: int = 50, sample_m: int = 2000) -> Dict[str, Any
|
||||
todo.sort()
|
||||
n = 0
|
||||
for draw_no in todo[:batch]:
|
||||
r = calibrate_winner(draw_no, sample_m=sample_m)
|
||||
r = calibrate_winner(draw_no, sample_m=sample_m, draws=draws)
|
||||
if r.get("ok"):
|
||||
n += 1
|
||||
return {"calibrated": n, "remaining": max(0, len(todo) - batch)}
|
||||
@@ -177,16 +179,18 @@ def run_forward_purchase(draw_no: int, k: int = 5000, pool_n: int = 20000,
|
||||
hist=graded, best_match=graded["best_match"], avg_meta_score=avg_meta,
|
||||
)
|
||||
|
||||
# 1) engine_w — 그 주 trials(있으면) 아니면 current_base
|
||||
# 1) engine_w — 그 주 trials(있으면) 아니면 uniform fallback (leak-free)
|
||||
from datetime import date as _date
|
||||
from . import weight_evolver as we
|
||||
week_start = we.get_week_start()
|
||||
trials = db.get_weekly_trials(week_start) if hasattr(db, "get_weekly_trials") else []
|
||||
draw_date = _date.fromisoformat(row["drw_date"])
|
||||
week_start = we.get_week_start(draw_date)
|
||||
trials = db.get_weekly_trials(week_start)
|
||||
if trials:
|
||||
for t in trials:
|
||||
bought = purchase_tickets(pool, cache, t["weight"], k)
|
||||
_store("engine_w", f"w{t['day_of_week']}", t["weight"], t["id"], bought)
|
||||
else:
|
||||
base = db.get_current_base() or [0.2] * 5
|
||||
base = [0.2] * 5
|
||||
bought = purchase_tickets(pool, cache, base, k)
|
||||
_store("engine_w", "base", base, None, bought)
|
||||
|
||||
|
||||
Reference in New Issue
Block a user