@@ -16,47 +16,60 @@ import Core.Board
16
16
import AI.AlphaBeta
17
17
import AI.AlphaBeta.Types
18
18
import AI.AlphaBeta.Cache
19
+ import AI.AlphaBeta.Persistent
19
20
import Formats.Types
20
21
import Formats.Pdn
21
22
22
23
doLearn :: (GameRules rules , Evaluator eval ) => rules -> eval -> AICacheHandle rules eval -> AlphaBetaParams -> GameRecord -> Checkers ()
23
24
doLearn rules eval var params gameRec = do
24
- let board = initBoardFromTags (SomeRules rules) (grTags gameRec)
25
- $ info " Initial board: {}; tags: {}" (show board , show $ grTags gameRec)
25
+ let startBoard = initBoardFromTags (SomeRules rules) (grTags gameRec)
26
+ $ info " Initial board: {}; tags: {}" (show startBoard , show $ grTags gameRec)
26
27
forM_ (instructionsToMoves $ grMoves gameRec) $ \ moves -> do
27
- -- liftIO $ print moves
28
- go board [] moves
28
+ (endScore, allBoards) <- go (0 , [] ) startBoard [] moves
29
+ $ info " End score: {}" (Single endScore)
30
+ runStorage var $ forM_ allBoards $ \ board -> do
31
+ let stats = Stats 1 endScore endScore endScore
32
+ putStatsFile board stats
33
+
29
34
where
30
- go _ _ [] = return ()
31
- go board0 predicted (moveRec : rest) = do
32
- (board1, predict2) <- do
35
+ go (score, boards) lastBoard _ [] = return (score, lastBoard : boards )
36
+ go (score0, boards) board0 predicted (moveRec : rest) = do
37
+ (board1, predict2, score2 ) <- do
33
38
case mrFirst moveRec of
34
- Nothing -> return (board0, [] )
39
+ Nothing -> return (board0, [] , score0 )
35
40
Just rec -> do
36
41
let move1 = parseMoveRec rules First board0 rec
37
42
if move1 `elem` predicted
38
43
then Metrics. increment " learn.hit"
39
44
else Metrics. increment " learn.miss"
40
45
let (board1, _,_) = applyMove rules First move1 board0
41
- predict2 <- processMove rules eval var params Second move1 board1
42
- return (board1, predict2)
46
+ ( predict2, score2) <- processMove rules eval var params Second move1 board1
47
+ return (board1, predict2, score2 )
43
48
case mrSecond moveRec of
44
- Nothing -> return ()
49
+ Nothing -> return (score2, board0 : board1 : boards )
45
50
Just rec -> do
46
51
let move2 = parseMoveRec rules Second board1 rec
47
52
if move2 `elem` predict2
48
53
then Metrics. increment " learn.hit"
49
54
else Metrics. increment " learn.miss"
50
55
let (board2, _, _) = applyMove rules Second move2 board1
51
- predict1 <- processMove rules eval var params First move2 board2
52
- go board2 predict1 rest
56
+ ( predict1, score1) <- processMove rules eval var params First move2 board2
57
+ go (score1, board0 : board1 : boards) board2 predict1 rest
53
58
54
- processMove :: (GameRules rules , Evaluator eval ) => rules -> eval -> AICacheHandle rules eval -> AlphaBetaParams -> Side -> Move -> Board -> Checkers [Move ]
59
+ processMove :: (GameRules rules , Evaluator eval )
60
+ => rules
61
+ -> eval
62
+ -> AICacheHandle rules eval
63
+ -> AlphaBetaParams
64
+ -> Side
65
+ -> Move
66
+ -> Board
67
+ -> Checkers ([Move ], Score )
55
68
processMove rules eval var params side move board = do
56
69
let ai = AlphaBeta params rules eval
57
70
(moves, score) <- runAI ai var side board
58
71
$ info " Processed: side {}, move: {}, depth: {} => score {}; we think next best moves are: {}" (show side, show move, abDepth params, show score, show moves)
59
- return moves
72
+ return ( moves, score)
60
73
61
74
learnPdn :: (GameRules rules , Evaluator eval ) => AlphaBeta rules eval -> FilePath -> Checkers ()
62
75
learnPdn ai@ (AlphaBeta params rules eval) path = do
0 commit comments