import type { GameRules } from '../types.ts' import type { PuctTranspositionTable } from '../bot/PuctTranspositionTable.ts' import type { PolicyValueEvaluator } from '../bot/PuctSearch.ts' export type PlayerColor = 0 | 1 export type Swap2Phase = 'swap2_phase0' | 'swap2_phase1' | 'swap2_phase2' | 'play' export type Swap2Phase1Decision = 'offer' | 'player1' | 'player2' export type Swap2ColorDecision = 'player1' | 'player2' export interface PolicyPlacement { x: number y: number probability: number } export interface PolicyTarget { placements: PolicyPlacement[] specialActions?: { choosePlayer1?: number choosePlayer2?: number offerTwo?: number } } export interface MctsTarget { phase: Swap2Phase moveNumber?: number actorBotId: string actorBotParams: Record player: PlayerColor actorSeat?: PlayerColor actorColor?: PlayerColor stoneColor?: PlayerColor playerToMove?: PlayerColor selectedMove?: { x: number; y: number } decision?: Swap2Phase1Decision | Swap2ColorDecision policyTarget: PolicyTarget mctsValue: number temperature: number } export interface DatasetMove { moveNumber: number x: number y: number player: PlayerColor botId: string botParams: Record } export interface DatasetOpeningStone { moveNumber: number x: number y: number player: PlayerColor placedByBotId: string placedByBotParams: Record } export interface SelfPlayDatasetRecord { schemaVersion: 1 id: string seed: number rules: GameRules & { boardSize: 15; swap2: true; noOverlines: true } bots: { openerBotId: string chooserBotId: string player1BotId: string player2BotId: string } opening: { phase1Decision: Swap2Phase1Decision phase1BotId: string phase1BotParams: Record phase2Decision: Swap2ColorDecision | null phase2BotId: string | null phase2BotParams: Record | null stones: DatasetOpeningStone[] } result: 'win' | 'draw' winner: PlayerColor | null moveCount: number moves: DatasetMove[] mctsOpening: MctsTarget[] mctsPlay: MctsTarget[] durationMs: number createdAt: string } export interface PredefinedOpeningStone { x: number y: number player: PlayerColor } export type PredefinedOpening = PredefinedOpeningStone[] export interface OpeningDatasetRecord { schemaVersion: 3 id: string seed: number opening: { id: string coordinateSystem: 'center-relative' stones: PredefinedOpeningStone[] } rules: GameRules & { boardSize: 15; swap2: false; noOverlines: true } bots: { player1BotId: string player2BotId: string } result: 'win' | 'draw' winner: PlayerColor | null moveCount: number moves: DatasetMove[] mctsPlay: MctsTarget[] durationMs: number createdAt: string } export type GeneratedDatasetRecord = SelfPlayDatasetRecord | OpeningDatasetRecord export interface GenerateDatasetOptions { games: number seed: number startIndex?: number puctTranspositionTable?: PuctTranspositionTable puctGeneration?: number modelEvaluator?: PolicyValueEvaluator outFile?: string openerBotId?: string chooserBotId?: string openings?: PredefinedOpening[] }