Skip to content

Commit 0831213

Browse files
committed
Optional: save only end results as stats.
refs #6.
1 parent 6ec9f47 commit 0831213

File tree

2 files changed

+42
-1
lines changed

2 files changed

+42
-1
lines changed

src/Formats/Pdn.hs

+5
Original file line numberDiff line numberDiff line change
@@ -221,6 +221,11 @@ initBoardFromTags (SomeRules rules) tags =
221221
Nothing -> initBoard rules
222222
Just fen -> parseBoardRep rules $ fenToBoardRep fen
223223

224+
resultFromTags :: [Tag] -> Maybe GameResult
225+
resultFromTags [] = Nothing
226+
resultFromTags (Result result : _) = result
227+
resultFromTags (_ : rest) = resultFromTags rest
228+
224229
data InterpreterState = InterpreterState {
225230
isCurrentVariant :: Int
226231
, isLastVariant :: Int

src/Learn.hs

+37-1
Original file line numberDiff line numberDiff line change
@@ -13,13 +13,49 @@ import System.Log.Heavy.TH
1313

1414
import Core.Types
1515
import Core.Board
16+
import Core.Evaluator (win, loose)
1617
import AI.AlphaBeta
1718
import AI.AlphaBeta.Types
1819
import AI.AlphaBeta.Cache
1920
import AI.AlphaBeta.Persistent
2021
import Formats.Types
2122
import Formats.Pdn
2223

24+
doLearn' :: (GameRules rules, Evaluator eval) => rules -> eval -> AICacheHandle rules eval -> AlphaBetaParams -> GameRecord -> Checkers ()
25+
doLearn' rules eval var params gameRec = do
26+
let startBoard = initBoardFromTags (SomeRules rules) (grTags gameRec)
27+
let result = resultFromTags $ grTags gameRec
28+
$info "Initial board: {}; result: {}" (show startBoard, show result)
29+
forM_ (instructionsToMoves $ grMoves gameRec) $ \moves -> do
30+
let (endScore, allBoards) = go [] startBoard result moves
31+
$info "End score: {}" (Single endScore)
32+
runStorage var $ forM_ allBoards $ \board -> do
33+
let stats = Stats 1 endScore endScore endScore
34+
putStatsFile board stats
35+
where
36+
go boards lastBoard (Just result) [] = (resultToScore result, lastBoard : boards)
37+
go boards lastBoard Nothing [] =
38+
let score = evalBoard eval First First lastBoard
39+
in (score, lastBoard : boards)
40+
go boards board0 mbResult (moveRec : rest) =
41+
let board1 = case mrFirst moveRec of
42+
Nothing -> board0
43+
Just rec ->
44+
let move1 = parseMoveRec rules First board0 rec
45+
(board1, _, _) = applyMove rules First move1 board0
46+
in board1
47+
board2 = case mrSecond moveRec of
48+
Nothing -> board1
49+
Just rec ->
50+
let move2 = parseMoveRec rules Second board1 rec
51+
(board2, _, _) = applyMove rules Second move2 board1
52+
in board2
53+
in go (board1 : boards) board2 mbResult rest
54+
55+
resultToScore FirstWin = win
56+
resultToScore SecondWin = loose
57+
resultToScore Draw = 0
58+
2359
doLearn :: (GameRules rules, Evaluator eval) => rules -> eval -> AICacheHandle rules eval -> AlphaBetaParams -> GameRecord -> Checkers ()
2460
doLearn rules eval var params gameRec = do
2561
let startBoard = initBoardFromTags (SomeRules rules) (grTags gameRec)
@@ -79,7 +115,7 @@ learnPdn ai@(AlphaBeta params rules eval) path = do
79115
forM_ (zip [1.. ] pdn) $ \(i, gameRec) -> do
80116
-- liftIO $ print pdn
81117
$info "Processing game {}/{}..." (i :: Int, n)
82-
doLearn rules eval cache params gameRec
118+
doLearn' rules eval cache params gameRec
83119
-- saveAiCache rules params cache
84120
return ()
85121

0 commit comments

Comments
 (0)