@@ -13,13 +13,49 @@ import System.Log.Heavy.TH
13
13
14
14
import Core.Types
15
15
import Core.Board
16
+ import Core.Evaluator (win , loose )
16
17
import AI.AlphaBeta
17
18
import AI.AlphaBeta.Types
18
19
import AI.AlphaBeta.Cache
19
20
import AI.AlphaBeta.Persistent
20
21
import Formats.Types
21
22
import Formats.Pdn
22
23
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
+
23
59
doLearn :: (GameRules rules , Evaluator eval ) => rules -> eval -> AICacheHandle rules eval -> AlphaBetaParams -> GameRecord -> Checkers ()
24
60
doLearn rules eval var params gameRec = do
25
61
let startBoard = initBoardFromTags (SomeRules rules) (grTags gameRec)
@@ -79,7 +115,7 @@ learnPdn ai@(AlphaBeta params rules eval) path = do
79
115
forM_ (zip [1 .. ] pdn) $ \ (i, gameRec) -> do
80
116
-- liftIO $ print pdn
81
117
$ info " Processing game {}/{}..." (i :: Int , n )
82
- doLearn rules eval cache params gameRec
118
+ doLearn' rules eval cache params gameRec
83
119
-- saveAiCache rules params cache
84
120
return ()
85
121
0 commit comments