게시판바둑 on-policy 학습: 대국 로그를 KataGo 라벨로 바꾸기예제 소스

예제 소스

바둑 on-policy 학습: 대국 로그를 KataGo 라벨로 바꾸기 · 파일 169개

ranking.ts

export type MatchOutcome = "win" | "loss" | "draw";

export type PlayerStats = {
  client_id: string;
  rank_level: number;
  rank_label: string;
  rank_points: number;
  promotion_target: number;
  wins: number;
  losses: number;
  draws: number;
  total_games: number;
  created_at: string;
  updated_at: string;
};

export type RankProgress = {
  rankLevel: number;
  rankPoints: number;
  promoted: boolean;
  demoted: boolean;
};

/** 0=18급, 17=1급, 18=1단, 이후 단수 증가. */
export function rankLabel(rankLevel: number): string {
  const level = Math.max(0, Math.trunc(rankLevel));
  if (level <= 17) return `${18 - level}급`;
  return `${level - 17}단`;
}

export function promotionTarget(rankLevel: number): number {
  const level = Math.max(0, Math.trunc(rankLevel));
  if (level >= 18) return 15;
  const kyu = 18 - level;
  if (kyu >= 11) return 3;
  if (kyu >= 5) return 5;
  return 10;
}

export function applyRankOutcome(
  rankLevel: number,
  rankPoints: number,
  outcome: MatchOutcome,
): RankProgress {
  let level = Math.max(0, Math.trunc(rankLevel));
  let points = Math.trunc(rankPoints);
  if (outcome === "win") points += 1;
  else if (outcome === "loss") points -= 1;

  let promoted = false;
  let demoted = false;
  if (points >= promotionTarget(level)) {
    level += 1;
    points = 0;
    promoted = true;
  } else if (points <= -promotionTarget(level)) {
    if (level > 0) {
      level -= 1;
      demoted = true;
    }
    points = 0;
  }
  return { rankLevel: level, rankPoints: points, promoted, demoted };
}